Writing Device Drivers

tran_dmafree(9E)

The tran_dmafree(9E) entry point is the HBA driver function that deallocates DMA resources allocated for a scsi_pkt(9S) structure. The tran_dmafree(9E) entry point is called when the target driver calls scsi_dmafree(9F).

tran_dmafree(9E) must free only DMA resources allocated for a scsi_pkt(9S) structure, not the scsi_pkt(9S) itself. Freeing the DMA resources implicitly performs a DMA synchronization.


Note -

The scsi_pkt(9S) will be freed in a separate request to tran_destroy_pkt(9E). Because tran_destroy_pkt(9E) must also free DMA resources, it is important that the HBA driver keep accurate note of whether scsi_pkt(9S) structures have DMA resources allocated.



Example 14-9 HBA Driver tran_dmafree(9E) Entry Point

static void
isp_scsi_dmafree(
	struct scsi_address	*ap,
	struct scsi_pkt				*pkt)
{
	struct isp_cmd 				*sp = (struct isp_cmd *)pkt->pkt_ha_private;

	if (sp->cmd_flags & CFLAG_DMAVALID) {
		   sp->cmd_flags &= ~CFLAG_DMAVALID;
	   	(void)ddi_dma_unbind_handle(sp->cmd_dmahandle);
	   	ddi_dma_free_handle(&sp->cmd_dmahandle);
	   	sp->cmd_dmahandle = NULL;
	}
}