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)

tribblix@gmail.com :: GitHub :: Privacy