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

Reply via email to