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) の呼び出しが残っているかぎり、リソースの再利用が可能です。