TRAN_START(9E) Driver Entry Points TRAN_START(9E)
NAME
tran_start - request to transport a SCSI command
SYNOPSIS
#include <sys/scsi/scsi.h>
int prefixtran_start(
struct scsi_address *ap,
struct scsi_pkt *pkt);
INTERFACE LEVEL
illumos architecture specific (illumos DDI).
PARAMETERS
pkt Pointer to the
scsi_pkt(9S) structure that is about to be
transferred.
ap Pointer to a
scsi_address(9S) structure.
DESCRIPTION
The
tran_start() vector in the
scsi_hba_tran(9S) structure must be
initialized during the
HBA driver's
attach(9E) to point to an
HBA entry point to be called when a target driver calls
scsi_transport(9F).
tran_start() must perform the necessary operations on the
HBA hardware to transport the
SCSI command in the
pkt structure to the
target/logical unit device specified in the
ap structure.
If the flag
FLAG_NOINTR is set in
pkt_flags in
pkt,
tran_start() should not return until the command has been completed. The command
completion callback
pkt_comp in
pkt must not be called for commands
with
FLAG_NOINTR set, since the return is made directly to the
function invoking
scsi_transport(9F).
When the flag
FLAG_NOINTR is not set,
tran_start() must queue the
command for execution on the hardware and return immediately. The
member
pkt_comp in
pkt indicates a callback routine to be called
upon command completion.
Refer to
scsi_pkt(9S) for other bits in
pkt_flags for which the
HBA driver may need to adjust how the command is managed.
If the
auto_rqsense capability has been set, and the status length
allocated in
tran_init_pkt(9E) is greater than or equal to
sizeof(struct scsi_arq_status), automatic request sense is enabled
for this
pkt. If the command terminates with a Check Condition, the
HBA driver must arrange for a Request Sense command to be transported
to that target/logical unit, and the members of the
scsi_arq_status structure pointed to by
pkt_scbp updated with the results of this
Request Sense command before the
HBA driver completes the command
pointed by
pkt.
The member
pkt_time in
pkt is the maximum number of seconds in
which the command should complete. Timeout starts when the command is
transmitted on the
SCSI bus. A
pkt_time of
0 means no timeout should
be performed.
For a command which has timed out, the
HBA driver must perform some
recovery operation to clear the command in the target, typically an
Abort message, or a Device or Bus Reset. The
pkt_reason member of
the timed out
pkt should be set to
CMD_TIMEOUT, and
pkt_statistics OR'ed with
STAT_TIMEOUT. If the
HBA driver can successfully recover
from the timeout,
pkt_statistics must also be
OR'ed with one of
STAT_ABORTED,
STAT_BUS_RESET, or
STAT_DEV_RESET, as appropriate.
This informs the target driver that timeout recovery has already been
successfully accomplished for the timed out command. The
pkt_comp completion callback, if not
NULL, must also be called at the
conclusion of the timeout recovery.
If the timeout recovery was accomplished with an Abort Tag message,
only the timed out packet is affected, and the packet must be
returned with
pkt_statistics OR'ed with
STAT_ABORTED and
STAT_TIMEOUT.
If the timeout recovery was accomplished with an Abort message, all
commands active in that target are affected. All corresponding
packets must be returned with
pkt_reason,
CMD_TIMEOUT, and
pkt_statistics OR'ed with
STAT_TIMEOUT and
STAT_ABORTED.
If the timeout recovery was accomplished with a Device Reset, all
packets corresponding to commands active in the target must be
returned in the transport layer for this target. Packets
corresponding to commands active in the target must be returned
returned with
pkt_reason set to
CMD_TIMEOUT, and
pkt_statistics OR'ed
with
STAT_DEV_RESET and
STAT_TIMEOUT. Currently inactive packets
queued for the device should be returned with
pkt_reason set to
CMD_RESET and
pkt_statistics OR'ed with
STAT_ABORTED.
If the timeout recovery was accomplished with a Bus Reset, all
packets corresponding to commands active in the target must be
returned in the transport layer. Packets corresponding to commands
active in the target must be returned with
pkt_reason set to
CMD_TIMEOUT and
pkt_statistics OR'ed with
STAT_TIMEOUT and
STAT_BUS_RESET. All queued packets for other targets on this bus must
be returned with
pkt_reason set to
CMD_RESET and
pkt_statistics OR'ed with
STAT_ABORTED.
Note that after either a Device Reset or a Bus Reset, the
HBA driver
must enforce a reset delay time of
'scsi-reset-delay' milliseconds,
during which time no commands should be sent to that device, or any
device on the bus, respectively.
tran_start() should initialize the following members in
pkt to
0.
Upon command completion, the
HBA driver should ensure that the values
in these members are updated to accurately reflect the states through
which the command transitioned while in the transport layer.
pkt_resid For commands with data transfer, this member must
be updated to indicate the residual of the data
transferred.
pkt_reason The reason for the command completion. This field
should be set to
CMD_CMPLT at the beginning of
tran_start(), then updated if the command ever
transitions to an abnormal termination state. To
avoid losing information, do not set
pkt_reason to
any other error state unless it still has its
original
CMD_CMPLT value.
pkt_statistics Bit field of transport-related statistics.
pkt_state Bit field with the major states through which a
SCSI command can transition. Note: The members
listed above, and
pkt_hba_private member, are the
only fields in the
scsi_pkt(9S) structure which
may be modified by the transport layer.
RETURN VALUES
tran_start() must return:
TRAN_ACCEPT The packet was accepted by the transport layer.
TRAN_BUSY The packet could not be accepted because there
was already a packet in progress for this
target/logical unit, the
HBA queue was full, or
the target device queue was full.
TRAN_BADPKT The
DMA count in the packet exceeded the
DMA engine's maximum
DMA size, or the packet could
not be accepted for other reasons.
TRAN_FATAL_ERROR A fatal error has occurred in the
HBA.CONTEXT
The
tran_start() function can be called from user or interrupt
context. This requirement comes from
scsi_transport().
SEE ALSO
attach(9E),
tran_init_pkt(9E),
scsi_hba_attach(9F),
scsi_transport(9F),
scsi_address(9S),
scsi_arq_status(9S),
scsi_hba_tran(9S),
scsi_pkt(9S) Writing Device Drivers April 9, 2016 TRAN_START(9E)