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