TRAN_SETUP_PKT(9E) Driver Entry Points TRAN_SETUP_PKT(9E)
NAME
tran_setup_pkt, tran_teardown_pkt, tran_pkt_constructor,
tran_pkt_destructor - SCSI HBA packet allocation and deallocation
SYNOPSIS
#include <sys/scsi/scsi.h>
int prefix_tran_setup_pkt(
struct scsi_pkt *pkt,
int (*callback) (
caddr_t),
caddr_t arg);
void prefix_tran_teardown_pkt(
struct scsi_pkt *pkt);
int prefix_tran_pkt_constructor(
struct scsi_pkt *pkt,
scsi_hba_tran_t *tranp,
int kmflags);
void prefix_tran_pkt_destructor(
struct scsi_pkt *pkt,
struct scsi_hba_tran_t *tranp);
INTERFACE LEVEL
illumos architecture specific (illumos DDI).
PARAMETERS
pkt Pointer to the
scsi_pkt(9S) structure.
flags Flags for associating DMA resources with the packet.
callback Pointer to either
NULL_FUNC or
SLEEP_FUNC.
arg Always
NULL.
kmflags Either
KM_SLEEP or
KM_NOSLEEP.
DESCRIPTION
The
tran_setup_pkt() and
tran_teardown_pkt() vectors in the
scsi_hba_tran(9S) structure are alternatives to the
tran_init_pkt() and
tran_destroy_pkt() entry points. They are initialized during the
HBA driver's
attach(9E) and they are used when a target driver calls
scsi_init_pkt(9F) and
scsi_destroy_pkt(9F).
tran_setup_pkt() The
tran_setup_pkt() vector is the entry point into the
HBA which is
used to initialize
HBA specific information in a
scsi_pkt structure
on behalf of a SCSI target driver. All fields documented in
scsi_pkt(9S) are initialized.
If the
HBA driver chose not to preallocate memory for
pkt_cdbp and/or
pkt_scbp, it must allocate the requested memory at this time and
point
pkt_cdbp and
pkt_scbp to the allocated memory.
An
HBA driver which provides a
tran_setup_pkt entry point inspects
the
pkt_numcookies and
pkt_cookies fields at
tran_start time to set
up the transfer. If
pkt_numcookies is zero, there are no
DMA resources associated with this packet. If
pkt_numcookies is not zero,
it indicates the number of
DMA cookies that
pkt_cookies points to.
The
pkt_tgtlen field contains the length of the packet private area
pointed to by
pkt_private, allocated on behalf of the SCSI target
driver.
The
pkt_scblen field contains the length of the SCSI status
completion block pointed to by
pkt_scbp. If the 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 should be disabled
for this pkt if the
HBA driver is capable of disabling
ARQ on a per-
packet basis.
The
pkt_cdblen field contains the length of the SCSI command
descriptor block.
The
callback argument indicates what the allocator routines should do
when resources are not available:
NULL_FUNC Do not wait for resources. Return
-1 when resources are
not available.
SLEEP_FUNC Wait indefinitely for resources.
tran_teardown_pkt() The
tran_teardown_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_setup_pkt().
tran_pkt_constructor() tran_pkt_destructor() When using
tran_pkt_setup() and
tran_pkt_teardown(),
tran_pkt_constructor() and
tran_pkt_destructor() are additional
optional entry points that perform the actions of a constructor and
destructor. The constructor is called after the following fields in
the
scsi_pkt structure have been initialized:
o
pkt_address o
pkt_ha_private o
pkt_cdbp o
pkt_private o
pkt_scbp o
pkt_cdblen o
pkt_tgtlen o
pkt_scblen Allocating and freeing a
DMA handle are examples of something that
could be done in the constructor and destructor. See
kmem_cache_create(9F) for additional restrictions on what actions can
be performed in a constructor and destructor.
HBA drivers that implement
tran_setup_pkt() must signal
scsi_pkt(9S) completion by calling
scsi_hba_pkt_comp(9F). Direct use of the
scsi_pkt pkt_comp field is not permitted and results in undefined
behavior.
RETURN VALUES
tran_setup_pkt() must return zero on success, and
-1 on failure.
SEE ALSO
attach(9E),
tran_sync_pkt(9E),
bioerror(9F),
ddi_dma_buf_bind_handle(9F),
kmem_cache_create(9F),
scsi_alloc_consistent_buf(9F),
scsi_destroy_pkt(9F),
scsi_hba_attach(9F),
scsi_hba_pkt_alloc(9F),
scsi_hba_pkt_comp(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 July 31, 2021 TRAN_SETUP_PKT(9E)