Sample pseudo-code for the PCI drivers
The example in this section shows a sample pseudo-code for the PCI drivers.
dd_initialization:
determine bus type for device from configuration information
determine 64 vs. 32-bit capabilities from configuration information
di_info.di_bid = bid
di_info.di_flags = DMA_MASTER | flags (except DMA_MAXMIN_* flag);
di_info.di_bus_flags = 0;
di_info.di_channel = 0;
di_info.di_min_mapspace = min_mapspace;
di_info.di_des_mapspace = DMA_MAXMIN_* value;
di_info.di_max_mapspace = max_dma_space ;
call "rc = D_MAP_INIT_EXT(&di_info, sizeof(di_info), handle)"
if handle == DMA_FAIL OR rc != DMA_SUCC
could not configure
dd_start_io:
if single page or less transfer
call "result = D_MAP_PAGE(handle, baddr,busaddr, xmem)"
if result == DMA_NORES
no resources, leave request on device queue
else if result == DMA_NOACC
no access to page, fail request
else
program device for transfer using busaddr
else
create dio list of virtual addresses involved in transfer
call "result = D_MAP_LIST(handle, flags, minxfer, list, blist)"
if result == DMA_NORES
not enough resource, either initiate partial transfer
and leave remainder on queue or leave entire request
on the queue and call d_unmap_list to unmap the
partial transfer.
else if result == DMA_NOACC
use bytes_done to pinpoint failing buffer and
fail corresponding request adjust virtual list and
call d_map_list again
else if result == DMA_DIOFULL
ran out of space in blist. either initiate partial
transfer and leave remainder on queue or leave entire
request on the queue and call d_unmap_list to
unmap the partial transfer.
else
program device for scatter/gather transfer using blist
dd_finish_io:
if single page or less transfer
call "D_UNMAP_PAGE(handle, busaddr)"
else
call "D_UNMAP_LIST(handle, blist)"
dd_unconfigure:
call "D_MAP_CLEAR(handle)"