struct scsi_pkt *scsi_dmaget(struct scsi_pkt *pkt, opaque_t dmatoken, int (*callback)(void));
void scsi_dmafree(struct scsi_pkt *pkt);
Solaris DDI specific (Solaris DDI).
scsi_dmaget() allocates DMA resources for an already allocated SCSI packet. pkt is a pointer to the previously allocated SCSI packet (see scsi_pktalloc(9F) ).
dmatoken is a pointer to an implementation dependent object which defines the length, direction, and address of the data transfer associated with this SCSI packet (command). The dmatoken must be a pointer to a buf(9S) structure. If dmatoken is NULL , no resources are allocated.
callback indicates what scsi_dmaget() should do when resources are not available:
- NULL_FUNC
- Do not wait for resources. Return a NULL pointer.
- SLEEP_FUNC
- Wait indefinitely for resources.
- Other Values
- callback points to a function which is called when resources may have become available. callback must return either 0 (indicating that it attempted to allocate resouces but failed to do so again), in which case it is put back on a list to be called again later, or 1 indicating either success in allocating resources or indicating that it no longer cares for a retry.
scsi_dmafree() frees the DMA resources associated with the SCSI packet. The packet itself remains allocated.
scsi_dmaget() returns a pointer to a scsi_pkt on success. It returns NULL if resources are not available.
If callback is SLEEP_FUNC , then this routine may only be called from user-level code. Otherwise, it may be called from either user or interrupt level. The callback function may not block or call routines that block.
scsi_dmafree() can
be called from user or interrupt context.