SCSI_PKT(9S)             Data Structures for Drivers            SCSI_PKT(9S)
NAME
     scsi_pkt - SCSI packet structure
SYNOPSIS
     #include <sys/scsi/scsi.h>INTERFACE LEVEL
     illumos DDI specific (illumos DDI).
DESCRIPTION
     A 
scsi_pkt structure defines the packet that is allocated by     
scsi_init_pkt(9F).  The target driver fills in some information and
     passes it to 
scsi_transport(9F) for execution on the target.  The host
     bus adapter (HBA) fills in other information as the command is
     processed.  When the command completes or can be taken no further, the
     completion function specified in the packet is called with a pointer to
     the packet as its argument.  From fields within the packet, the target
     driver can determine the success or failure of the command.
STRUCTURE MEMBERS
           opaque_t             pkt_ha_private;
           struct scsi_address  pkt_address;
           opaque_t             pkt_private;
           void                 (*pkt_comp)(struct scsi_pkt *);
           uint_t               pkt_flags;
           int                  pkt_time;
           uchar_t              *pkt_scbp;
           uchar_t              *pkt_cdbp;
           ssize_t              pkt_resid;
           uint_t               pkt_state;
           uint_t               pkt_statistics;
           uchar_t              pkt_reason;
           uint_t               pkt_cdblen;
           uint_t               pkt_scblen;
           uint_t               pkt_tgtlen;
           uint_t               pkt_numcookies;
           ddi_dma_cookie_t     *pkt_cookies;
           uint_t               pkt_dma_flags;
     These members are described here:     
pkt_ha_private             Opaque pointer that the HBA uses to reference a private data
             structure that transfers 
scsi_pkt requests.     
pkt_address             Initialized by 
scsi_init_pkt(9F), 
pkt_address records the
             intended route and the recipient of a request.     
pkt_private             Reserved for the use of the target driver, 
pkt_private is not
             changed by the HBA driver.     
pkt_comp             Specifies the command completion callback routine.  When the
             host adapter driver has gone as far as it can in transporting a
             command to a SCSI target, and the command has either run to
             completion or can go no further for some other reason, the host
             adapter driver calls the function pointed to by this field and
             passes a pointer to the packet as argument.  The callback
             routine itself is called from interrupt context and must not
             sleep or call any function that might sleep.     
pkt_flags             Provides additional information about how the target driver
             expects the command to be executed.  See 
pkt_flags Definitions.     
pkt_time             Set by the target driver to represent the maximum time allowed
             in seconds for this command to complete.  Timeout starts when
             the command is transmitted on the SCSI bus.  The 
pkt_time may
             be zero if no timeout is required.     
pkt_scbp             Points to either a struct 
scsi_status(9S) or, if 
auto-rqsense             is enabled and 
pkt_state includes STATE_ARQ_DONE, a struct             
scsi_arq_status(9S).  If 
scsi_status(9S) is returned, the SCSI
             status byte resulting from the requested command is available.
             If 
scsi_arq_status(9S) is returned, the sense information is
             also available.     
pkt_cdbp             Points to a kernel-addressable buffer with a length specified
             by a call to the proper resource allocation routine,             
scsi_init_pkt(9F).     
pkt_resid             Contains a residual count, either the number of data bytes that
             have not been transferred by 
scsi_transport(9F) or the number
             of data bytes for which DMA resources could not be allocated by             
scsi_init_pkt(9F).  In the latter case, partial DMA resources
             can be allocated only if 
scsi_init_pkt(9F) is called with the
             PKT_DMA_PARTIAL flag.     
pkt_state             Has bit positions that represent the six most important states
             that a SCSI command can go through.  See 
pkt_state Definitions.     
pkt_statistics             Maintains some transport-related statistics.  See             
pkt_statistics Definitions.     
pkt_reason             Contains a completion code that indicates why the 
pkt_comp             function was called.  See 
pkt_reason Definitions.     
pkt_cdblen             Length of buffer pointed to by 
pkt_cdbp.  Se             
tran_setup_pkt(9E).     
pkt_scblen             Length of buffer pointed to by 
pkt_scbp.  See             
tran_setup_pkt(9E).     
pkt_tgtlen             Length of buffer pointed to by 
pkt_private.  See             
tran_setup_pkt(9E).     
pkt_numcookies             Length of 
pkt_cookies array.  See 
tran_setup_pkt(9E).     
pkt_cookies             Array of DMA cookies.  See 
tran_setup_pkt(9E).     
pkt_dma_flags             DMA flags used, such as DDI_DMA_READ and DDI_DMA_WRITE.  See             
tran_setup_pkt(9E).
     The host adapter driver will update the 
pkt_resid, 
pkt_reason,     
pkt_state, and 
pkt_statistics fields.   
pkt_flags Definitions     The appropriate definitions for the structure member 
pkt_flags are:
     FLAG_NOINTR
             Run command with no command completion callback.  Command is
             complete upon return from 
scsi_transport(9F).
     FLAG_NODISCON
             Run command without disconnects.
     FLAG_NOPARITY
             Run command without parity checking.
     FLAG_HTAG
             Run command as the head-of-queue-tagged command.
     FLAG_OTAG
             Run command as an ordered-queue-tagged command.
     FLAG_STAG
             Run command as a simple-queue-tagged command.
     FLAG_SENSING
             Indicates a request sense command.
     FLAG_HEAD
             Place command at the head of the queue.
     FLAG_RENEGOTIATE_WIDE_SYNC
             Before transporting this command, the host adapter should
             initiate the renegotiation of wide mode and synchronous
             transfer speed.  Normally, the HBA driver manages negotiations
             but under certain conditions forcing a renegotiation is
             appropriate.  Renegotiation is recommended before `Request
             Sense' and `Inquiry' commands.  Refer to the SCSI 2 standard,
             sections 6.6.21 and 6.6.23.
             This flag should not be set for every packet as this will
             severely impact performance.   
pkt_reason Definitions     The appropriate definitions for the structure member 
pkt_reason are:
     CMD_CMPLT
             No transport errors; normal completion.
     CMD_INCOMPLETE
             Transport stopped with abnormal state.
     CMD_DMA_DERR
             DMA direction error.
     CMD_TRAN_ERR
             Unspecified transport error.
     CMD_RESET
             SCSI bus reset destroyed command.
     CMD_ABORTED
             Command transport aborted on request.
     CMD_TIMEOUT
             Command timed out.
     CMD_DATA_OVR
             Data overrun.
     CMD_CMD_OVR
             Command overrun.
     CMD_STS_OVR
             Status overrun.
     CMD_BADMSG
             Message not command complete.
     CMD_NOMSGOUT
             Target refused to go to message out phase.
     CMD_XID_FAIL
             Extended identify message rejected.
     CMD_IDE_FAIL
             "Initiator Detected Error" message rejected.
     CMD_ABORT_FAIL
             Abort message rejected.
     CMD_REJECT_FAIL
             Reject message rejected.
     CMD_NOP_FAIL
             "No Operation" message rejected.
     CMD_PER_FAIL
             "Message Parity Error" message rejected.
     CMD_BDR_FAIL
             "Bus Device Reset" message rejected.
     CMD_ID_FAIL
             Identify message rejected.
     CMD_UNX_BUS_FREE
             Unexpected bus free phase.
     CMD_TAG_REJECT
             Target rejected the tag message.
     CMD_DEV_GONE
             The device has been removed.   
pkt_state Definitions     The appropriate definitions for the structure member 
pkt_state are:
     STATE_GOT_BUS
             Bus arbitration succeeded.
     STATE_GOT_TARGET
             Target successfully selected.
     STATE_SENT_CMD
             Command successfully sent.
     STATE_XFERRED_DATA
             Data transfer took place.
     STATE_GOT_STATUS
             Status received.
     STATE_ARQ_DONE
             The command resulted in a check condition and the host adapter
             driver executed an automatic request sense command.
     STATE_XARQ_DONE
             The command requested in extra sense data using a PKT_XARQ flag
             got a check condition.  The host adapter driver was able to
             successfully request and return this.  The             
scsi_pkt.pkt_scbp->sts_rqpkt_resid returns the sense data
             residual based on the 
statuslen parameter of the             
scsi_init_pkt(9F) call.  The sense data begins at             
scsi_pkt.pkt_scbp->sts_sensedata.   
pkt_statistics Definitions     The definitions that are appropriate for the structure member     
pkt_statistics are:
     STAT_DISCON
             Device disconnect.
     STAT_SYNC
             Command did a synchronous data transfer.
     STAT_PERR
             SCSI parity error.
     STAT_BUS_RESET
             Bus reset.
     STAT_DEV_RESET
             Device reset.
     STAT_ABORTED
             Command was aborted.
     STAT_TIMEOUT
             Command timed out.
SEE ALSO
     tran_init_pkt(9E), 
tran_setup_pkt(9E), 
scsi_hba_pkt_comp(9F),     
scsi_init_pkt(9F), 
scsi_transport(9F), 
scsi_arq_status(9S),     
scsi_status(9S)     Writing Device Drivers.
NOTES
     HBA drivers should signal 
scsi_pkt completion by calling     
scsi_hba_pkt_comp(9F).  This is mandatory for HBA drivers that
     implement 
tran_setup_pkt(9E).  Failure to comply results in undefined
     behavior.
     Drivers must not make assumptions about the size of the 
scsi_pkt     structure.  In particular, this structure must not be directly inlined
     into other driver structures nor allocated except by one of the
     specialized allocation functions such as 
scsi_init_pkt(9F).
illumos                         June 21, 2022                        illumos