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)"