Sun Microsystems, Inc.
spacerspacer
spacer   www.sun.com docs.sun.com | | |  
spacer
black dot
   
A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P   Q   R   S   T   U   V   W   X   Y   Z
    
 
Kernel Functions for Driverspullupmsg(9F)


NAME

 pullupmsg - concatenate bytes in a message

SYNOPSIS

 
#include <sys/stream.h>
int pullupmsg(mblk_t *mp, ssize_t len);

INTERFACE LEVEL

 

Architecture independent level 1 (DDI/DKI).

PARAMETERS

 
mp
Pointer to the message whose blocks are to be concatenated. mblk_t is an instance of the msgb(9S) structure.
len
Number of bytes to concatenate.

DESCRIPTION

 

pullupmsg() tries to combine multiple data blocks into a single block. pullupmsg() concatenates and aligns the first len data bytes of the message pointed to by mp. If len equals -1, all data are concatenated. If len bytes of the same message type cannot be found, pullupmsg() fails and returns 0.

RETURN VALUES

 

On success, 1 is returned; on failure, 0 is returned.

CONTEXT

 

pullupmsg() can be called from user or interrupt context.

EXAMPLES

 Example 1. Using pullupmsg
 

This is a driver write srv(9E) (service) routine for a device that does not support scatter/gather DMA. For all M_DATA messages, the data will be transferred to the device with DMA. First, try to pull up the message into one message block with the pullupmsg() function (line 12). If successful, the transfer can be accomplished in one DMA job. Otherwise, it must be done one message block at a time (lines 19-22). After the data has been transferred to the device, free the message and continue processing messages on the queue.
 
 
 1 xxxwsrv(q)
 2    queue_t *q;
 3 {
 4	    mblk_t *mp;
 5	    mblk_t *tmp;
 6	    caddr_t dma_addr;
 7     ssize_t dma_len;
 8
 9	    while ((mp = getq(q)) != NULL) {
10	            switch (mp->b_datap->db_type) {
11             case M_DATA:
12	                   if (pullupmsg(mp, -1)) {
13                            dma_addr = vtop(mp->b_rptr);
14	                           dma_len = mp->b_wptr - mp->b_rptr;
15	                           xxx_do_dma(dma_addr, dma_len);
16	                           freemsg(mp);
17	                           break;
18	                   }
19	                   for (tmp = mp; tmp; tmp = tmp->b_cont) {
20                            dma_addr = vtop(tmp->b_rptr);
21                            dma_len = tmp->b_wptr - tmp->b_rptr;
22                            xxx_do_dma(dma_addr, dma_len);
23                    }
24	                   freemsg(mp);
25	                   break;
     	 . . .
26		        }
27	    }
28 }

SEE ALSO

 

srv(9E), allocb(9F), msgpullup(9F), msgb(9S)

Writing Device Drivers

STREAMS Programming Guide

NOTES

 

pullupmsg() is not included in the DKI and will be removed from the system in a future release. Device driver writers are strongly encouraged to use msgpullup(9F) instead of pullupmsg().


SunOS 5.9Go To TopLast Changed 11 Nov 1996

 
      
      
Copyright 2002 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms.