scsi_init_pkt(9f) 맨 페이지 - 윈디하나의 솔라나라

개요

섹션
맨 페이지 이름
검색(S)

scsi_init_pkt(9f)

scsi_init_pkt(9F)              Kernel Functions              scsi_init_pkt(9F)

NAME
       scsi_init_pkt - prepare a complete SCSI packet

SYNOPSIS
       #include <sys/scsi/scsi.h>

       struct scsi_pkt *scsi_init_pkt(struct scsi_address *ap,
            struct scsi_pkt *pktp, struct buf *bp, int cmdlen, int statuslen,
            int privatelen, int flags, int (*callback)(caddr_t), caddr_t arg);

INTERFACE LEVEL
       Solaris DDI specific (Solaris DDI).

PARAMETERS
       ap

           Pointer to a scsi_address(9S) structure.


       pktp

           A pointer to a scsi_pkt(9S) structure.


       bp

           Pointer to a buf(9S) structure.


       cmdlen

           The  required length for the SCSI command descriptor block (CDB) in
           bytes.


       statuslen

           The required length for the SCSI status completion block  (SCB)  in
           bytes. Valid values are:

           0

               No status back.


           1

               Return SCSI status byte.


           sizeof(struct scsi_arq_status)

               Return  status information in a scsi_arq_status structure. This
               will include up to SENSE_LENGTH bytes of sense data. Please re‐
               fer to scsi_arq_status(9S) for more information.

               For extra sense length packets (PKT_XARQ  flag  asserted),  set
               statuslen  to  be  a  greater  number  like, (N + sizeof(struct
               scsi_arq_status)) where N is the number of extra  bytes  beyond
               the   default   SENSE_LENGTH.   For   example,   N=1   requests
               SENSE_LENGTH + 1 bytes of sense.



       privatelen

           The required length for the pkt_private area.


       flags

           Flags modifier.


       callback

           A pointer to a callback function, NULL_FUNC, or SLEEP_FUNC.


       arg

           The callback function argument.


DESCRIPTION
       Target drivers use scsi_init_pkt() to request the  transport  layer  to
       allocate  and initialize a packet for a SCSI command which possibly in‐
       cludes a data transfer. If pktp is NULL, a new  scsi_pkt(9S)  is  allo‐
       cated using the HBA driver's packet allocator. The bp is a pointer to a
       buf(9S)  structure.  If bp is non-NULL and contains a valid byte count,
       the buf(9S) structure is also set up for DMA  transfer  using  the  HBA
       driver DMA resources allocator. When bp is allocated by scsi_alloc_con‐
       sistent_buf(9F),  the PKT_CONSISTENT bit must be set in the flags argu‐
       ment to ensure proper operation. If privatelen is non-zero  then  addi‐
       tional space is allocated for the pkt_private area of the scsi_pkt(9S).
       On  return  pkt_private  points  to  this  additional  space. Otherwise
       pkt_private is a pointer that is typically used to store the bp  during
       execution of the command. In this case pkt_private is NULL on return.


       The flags argument is a set of bit flags. Possible bits include:

       PKT_CONSISTENT

           This  must  be  set  if the DMA buffer was allocated using scsi_al‐
           loc_consistent_buf(9F). In this case, the HBA driver will guarantee
           that the data transfer is properly synchronized  before  performing
           the target driver's command completion callback.


       PKT_DMA_PARTIAL

           This  may be set if the driver can accept a partial DMA mapping. If
           set,  scsi_init_pkt()  will  allocate  DMA   resources   with   the
           DDI_DMA_PARTIAL   bit   set   in   the  dmar_flag  element  of  the
           ddi_dma_req(9S) structure. The pkt_resid field of the  scsi_pkt(9S)
           structure  may  be  returned with a non-zero value, which indicates
           the number of bytes for which scsi_init_pkt() was unable  to  allo‐
           cate   DMA   resources.   In   this  case,  a  subsequent  call  to
           scsi_init_pkt() may be made for the same pktp and bp to adjust  the
           DMA  resources  to  the next portion of the transfer. This sequence
           should be repeated until the pkt_resid field  is  returned  with  a
           zero  value, which indicates that with transport of this final por‐
           tion the entire original request will have been satisfied.


       PKT_XARQ

           Setting this flag requests that the HBA return extra sense data for
           this scsi_pkt(9S). The default auto request sense mechanism returns
           up to SENSE_LENGTH bytes. More than  SENSE_LENGTH  bytes  of  sense
           data  can  be  requested  by setting this flag and setting the sta‐
           tuslen  correctly.  Set  the  statuslen  to  be  the  sizeof(struct
           scsi_arq_status)  plus  the  number  of  sense  bytes needed beyond
           SENSE_LENGTH. For example, set statuslen to be (SENSE_LENGTH  +  5)
           for extra 5 bytes of sense.



       When  calling  scsi_init_pkt() to move already-allocated DMA resources,
       the cmdlen, statuslen, and privatelen fields are ignored.


       The last argument arg is supplied to the callback function when  it  is
       invoked.


       callback indicates what the allocator routines should do when resources
       are not available:

       NULL_FUNC       Do not wait for resources. Return a NULL pointer.


       SLEEP_FUNC      Wait indefinitely for resources.


       Other Values    callback  points to a function which is called when re‐
                       sources may have become available. callback must return
                       either 0 (indicating that it attempted to allocate  re‐
                       sources but again failed to do so), in which case it is
                       put back on a list to be called again later, or 1 indi‐
                       cating  either success in allocating resources or indi‐
                       cating that it no longer cares for a retry.



       When allocating DMA resources,  scsi_init_pkt()  returns  the  scsi_pkt
       field  pkt_resid  as  the number of residual bytes for which the system
       was unable to allocate DMA resources. A pkt_resid of 0 means  that  all
       necessary DMA resources were allocated.

RETURN VALUES
       The  scsi_init_pkt()  function  returns  NULL  if the packet or DMA re‐
       sources could not be allocated. Otherwise, it returns a pointer  to  an
       initialized scsi_pkt(9S). If pktp was not NULL the return value will be
       pktp on successful initialization of the packet.

CONTEXT
       If  callback  is  SLEEP_FUNC, then this routine can be called only from
       user or kernel context. Otherwise, it can be called from  user,  inter‐
       rupt,  or  kernel  context. The callback function may not block or call
       routines that block.

EXAMPLES
       Example 1 Allocating a Packet Without DMA Resources Attached



       To allocate a packet without DMA resources attached, use:


         pkt = scsi_init_pkt(&devp->sd_address, NULL, NULL, CDB_GROUP1,
                 1, sizeof (struct my_pkt_private *), 0,
                 sd_runout, sd_unit);


       Example 2 Allocating a Packet With DMA Resources Attached



       To allocate a packet with DMA resources attached use:


         pkt = scsi_init_pkt(&devp->sd_address, NULL, bp, CDB_GROUP1,
                 sizeof(struct scsi_arq_status), 0, 0, NULL_FUNC, NULL);


       Example 3 Attaching DMA Resources to a Preallocated Packet



       To attach DMA resources to a preallocated packet, use:


         pkt = scsi_init_pkt(&devp->sd_address, old_pkt, bp, 0,
                 0, 0, 0, sd_runout, (caddr_t) sd_unit);


       Example 4 Allocating a Packet with Consistent DMA Resources Attached



       Since the packet is already allocated, the cmdlen, statuslen  and  pri‐
       vatelen  are  0. To allocate a packet with consistent DMA resources at‐
       tached, use:


         bp = scsi_alloc_consistent_buf(&devp->sd_address, NULL,
                     SENSE_LENGTH, B_READ, SLEEP_FUNC, NULL);
              pkt = scsi_init_pkt(&devp->sd_address, NULL, bp, CDB_GROUP0,
                 sizeof(struct scsi_arq_status), sizeof (struct my_pkt_private *),
                 PKT_CONSISTENT, SLEEP_FUNC, NULL);


       Example 5 Allocating a Packet with Partial DMA Resources Attached



       To allocate a packet with partial DMA resources attached, use:


         my_pkt = scsi_init_pkt(&devp->sd_address, NULL, bp, CDB_GROUP0,
                   1, sizeof (struct buf *), PKT_DMA_PARTIAL,
                   SLEEP_FUNC, NULL);


SEE ALSO
       scsi_alloc_consistent_buf(9F),  scsi_destroy_pkt(9F),  scsi_dmaget(9F),
       scsi_pktalloc(9F),    buf(9S),    ddi_dma_req(9S),    scsi_address(9S),
       scsi_pkt(9S)


       Writing Device Drivers in Oracle Solaris 11.4

NOTES
       If a DMA allocation request fails with DDI_DMA_NOMAPPING,  the  B_ERROR
       flag will be set in bp, and the b_error field will be set to EFAULT.


       If a DMA allocation request fails with DDI_DMA_TOOBIG, the B_ERROR flag
       will be set in bp, and the b_error field will be set to EINVAL.

Oracle Solaris 11.4               23 Jun 2020                scsi_init_pkt(9F)
맨 페이지 내용의 저작권은 맨 페이지 작성자에게 있습니다.
RSS ATOM XHTML 5 CSS3