DMA 転送の完了後、通常は割り込みルーチンで、ドライバは ddi_dma_unbind_handle(9F) を呼び出して、DMA リソースを解放できます。
Synchronizing Memory Objectsで説明しているように、 ddi_dma_unbind_handle(9F) が ddi_dma_sync (9F) を呼び出すことで、明示的に同期を行う必要がなくなります。ddi_dma_unbind_handle(9F) の呼び出し後、DMA リソースは無効になり、それ以上そのリソースを参照しても結果は保証されません。次の例は、ddi_dma_unbind_handle(9F) の使用方法を示しています。
使用例 9-5 DMA リソースの解放static uint_t xxintr(caddr_t arg) { struct xxstate *xsp = (struct xxstate *)arg; uint8_t status; volatile uint8_t temp; mutex_enter(&xsp->mu); /* read status */ status = ddi_get8(xsp->access_hdl, &xsp->regp->csr); if (!(status & INTERRUPTING)) { mutex_exit(&xsp->mu); return (DDI_INTR_UNCLAIMED); } ddi_put8(xsp->access_hdl, &xsp->regp->csr, CLEAR_INTERRUPT); /* for store buffers */ temp = ddi_get8(xsp->access_hdl, &xsp->regp->csr); ddi_dma_unbind_handle(xsp->handle); /* Check for errors. */ xsp->busy = 0; mutex_exit(&xsp->mu); if ( /* pending transfers */ ) { (void) xxstart((caddr_t)xsp); } return (DDI_INTR_CLAIMED); }
DMA リソースが解放されます。次の転送で別のオブジェクトが使用される場合、DMA リソースを再割り当てする必要があります。ただし、同じオブジェクトが常に使用される場合、リソースの割り当ては一度で構いません。途中の ddi_dma_sync (9F) の呼び出しが残っているかぎり、リソースの再利用が可能です。