Hi, All:
Suppose that I wish to transfer something from a page which might be
mapped or not (highmem) in a client driver such as usb-storage.
The setup works like this
usb_stor_Bulk_transport
usb_stor_bulk_transfer_sg
usb_stor_bulk_transfer_sglist
usb_sg_init
Here things get interesting. If the controller does NOT want to use
DMA, the check (dev->dev.dma_mask != 0) fails and we do this:
if (dma) {
/* hc may use _only_ transfer_dma */
io->urbs [i]->transfer_dma = sg_dma_address (sg + i);
len = sg_dma_len (sg + i);
} else {
/* hc may use _only_ transfer_buffer */
io->urbs [i]->transfer_buffer =
page_address (sg [i].page) + sg [i].offset;
len = sg [i].length;
}
The page_address is NULL, and eventually, the controller driver
oopses while trying to do outsb().
It seems obvious to me that a kmap is missing somewhere, but where?
-- Pete
-------------------------------------------------------
This SF.Net email is sponsored by the new InstallShield X.
>From Windows to Linux, servers to mobile, InstallShield X is the one
installation-authoring solution that does it all. Learn more and
evaluate today! http://www.installshield.com/Dev2Dev/0504
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel