tran_init_pkt(9E)




NAME

     tran_init_pkt, tran_destroy_pkt - SCSI HBA  packet  prepara-
     tion and deallocation


SYNOPSIS

     #include <sys/scsi/scsi.h>

      struct   scsi_pkt   *prefixtran_init_pkt(structscsi_address
     *ap,  struct  scsi_pkt *pkt, struct buf *bp, int cmdlen, int
     statuslen,  int   tgtlen,   int   flags,   int   (*callback,
     caddr_t),caddr_t arg);

     void prefixtran_destroy_pkt(struct scsi_address *ap,  struct
     scsi_pkt *pkt);


INTERFACE LEVEL

     Solaris architecture specific (Solaris DDI).


PARAMETERS

     ap    Pointer to a scsi_address(9S) structure.

     pkt   Pointer to a scsi_pkt(9S) structure  allocated  in  an
           earlier call, or NULL.

     bp    Pointer to a buf(9S) structure if DMA resources are to
           be allocated for the pkt, or NULL.

     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.

     tgtlen
           The length of  the  packet  private  area  within  the
           scsi_pkt  to be allocated on behalf of the SCSI target
           driver.

     flags Flags for creating the packet.

     callback
           Pointer to either NULL_FUNC or SLEEP_FUNC.

     arg   Always NULL.


DESCRIPTION

     The tran_init_pkt() and tran_destroy_pkt()  vectors  in  the
     scsi_hba_tran  structure  must be initialized during the HBA
     driver's attach(9E) to point  to  HBA  entry  points  to  be
     called  when  a  target  driver  calls scsi_init_pkt(9F) and
     scsi_destroy_pkt(9F).

  tran_init_pkt()
     tran_init_pkt() is the entry point into  the  HBA  which  is
     used  to  allocate  and  initialize  a scsi_pkt structure on
     behalf of a SCSI target driver. If  pkt  is  NULL,  the  HBA
     driver  must  use  scsi_hba_pkt_alloc(9F)  to allocate a new
     scsi_pkt structure.

     If bp is non-NULL, the HBA driver must allocate  appropriate
     DMA     resources     for     the    pkt,    for    example,
     throughddi_dma_buf_setup(9F) or ddi_dma_buf_bind_handle(9F).

     If the PKT_CONSISTENT bit is set in flags,  the  buffer  was
     allocated   by  scsi_alloc_consistent_buf(9F).  For  packets
     marked with PKT_CONSISTENT, the HBA driver must  synchronize
     any cached data transfers before calling the target driver's
     command completion callback.

     If the PKT_DMA_PARTIAL bit is set in flags, the  HBA  driver
     should  set  up  partial data transfers, such as setting the
     DDI_DMA_PARTIAL bit in the flags argument if interfaces such
     as  ddi_dma_buf_setup(9F) or ddi_dma_buf_bind_handle(9F) are
     used.

     If   only   partial    DMA    resources    are    available,
     tran_init_pkt()  must  return  in the pkt_resid field of pkt
     the number of bytes of DMA resources not allocated.

     If both  pkt and  bp are  non-NULL, if the   PKT_DMA_PARTIAL
     bit is set in  flags, and if DMA resources have already been
     allocated  for  the    pkt   with   a   previous   call   to
     tran_init_pkt()  that  returned  a non-zero pkt_resid field,
     this request is to move the DMA resources for the subsequent
     piece of the transfer.

     The contents of scsi_address(9S) pointed to by ap are copied
     into   the   pkt_address   field   of  the  scsi_pkt(9S)  by
     scsi_hba_pkt_alloc(9F).

     tgtlen is the length of  the  packet  private  area  in  the
     scsi_pkt  structure  to  be  allocated on behalf of the SCSI
     target driver.

     statuslen is the required length for the SCSI status comple-
     tion  block.  If the requested status length is greater than
     or  equal  to  sizeof(struct   scsi_arq_status)    and   the
     auto_rqsense  capability  has  been  set,  automatic request
     sense (ARS) is enabled for this packet. If the status length
     is   less  than  sizeof(struct  scsi_arq_status),  automatic
     request sense must be disabled for this pkt.

     If the HBA driver is not capable of disabling ARQ on a  per-
     packet  basis and tran_init_pkt() is called with a statuslen
     that  is  less  than   sizeof(struct  scsi_arq_status),  the
     driver's  tran_init_pkt  routine  should   allocate at least
     sizeof(struct scsi_arq_status). If an ARS  is  needed,  upon
     successful  ARS done by the HBA driver, the driver must copy
     the sense data over and set STAT_ARQ_DONE in pkt_state.

     cmdlen is the required length for the SCSI command  descrip-
     tor block.

     Note: tgtlen, statuslen, and cmdlen are used only  when  the
     HBA  driver allocates the scsi_pkt(9S), in other words, when
     pkt is NULL.

     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.

  tran_destroy_pkt()
     tran_destroy_pkt() is the entry point into the HBA that must
     free  all  of  the  resources  that  were  allocated  to the
     scsi_pkt(9S) structure during tran_init_pkt().


RETURN VALUES

     tran_init_pkt() must return  a  pointer  to  a  scsi_pkt(9S)
     structure on success, or NULL on failure.

     If pkt is NULL on entry,  and  tran_init_pkt()  allocated  a
     packet throughscsi_hba_pkt_alloc(9F) but was unable to allo-
     cate DMA resources, tran_init_pkt()  must  free  the  packet
     through scsi_hba_pkt_free(9F) before returning NULL.


SEE ALSO

     attach(9E),  tran_sync_pkt(9E),  biodone(9F),  bioerror(9F),
     ddi_dma_buf_bind_handle(9F),          ddi_dma_buf_setup(9F),
     scsi_alloc_consistent_buf(9F),         scsi_destroy_pkt(9F),
     scsi_hba_attach(9F),                 scsi_hba_pkt_alloc(9F),
     scsi_hba_pkt_free(9F),      scsi_init_pkt(9F),      buf(9S),
     scsi_address(9S), scsi_hba_tran(9S), scsi_pkt(9S)

     Writing Device Drivers


NOTES

     If a DMA allocation request  fails  with  DDI_DMA_NOMAPPING,
     indicate  the  error  by calling bioerror(9F) with bp and an
     error code of EFAULT.
     If a DMA allocation request fails with DDI_DMA_TOOBIG, indi-
     cate  the error by calling bioerror(9F) with bp and an error
     code of EINVAL.


Man(1) output converted with man2html