SCSI_PKT(9S) Data Structures for Drivers SCSI_PKT(9S)

scsi_pkt
SCSI packet structure

#include <sys/scsi/scsi.h>

illumos DDI specific (illumos DDI).

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.

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.

The appropriate definitions for the structure member pkt_flags are:
Run command with no command completion callback. Command is complete upon return from scsi_transport(9F).
Run command without disconnects.
Run command without parity checking.
Run command as the head-of-queue-tagged command.
Run command as an ordered-queue-tagged command.
Run command as a simple-queue-tagged command.
Indicates a request sense command.
Place command at the head of the queue.
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.

The appropriate definitions for the structure member pkt_reason are:
No transport errors; normal completion.
Transport stopped with abnormal state.
DMA direction error.
Unspecified transport error.
SCSI bus reset destroyed command.
Command transport aborted on request.
Command timed out.
Data overrun.
Command overrun.
Status overrun.
Message not command complete.
Target refused to go to message out phase.
Extended identify message rejected.
"Initiator Detected Error" message rejected.
Abort message rejected.
Reject message rejected.
"No Operation" message rejected.
"Message Parity Error" message rejected.
"Bus Device Reset" message rejected.
Identify message rejected.
Unexpected bus free phase.
Target rejected the tag message.
The device has been removed.

The appropriate definitions for the structure member pkt_state are:
Bus arbitration succeeded.
Target successfully selected.
Command successfully sent.
Data transfer took place.
Status received.
The command resulted in a check condition and the host adapter driver executed an automatic request sense command.
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.

The definitions that are appropriate for the structure member pkt_statistics are:
Device disconnect.
Command did a synchronous data transfer.
SCSI parity error.
Bus reset.
Device reset.
Command was aborted.
Command timed out.

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.

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).

June 21, 2022 OmniOS