Issue with file transfers to a mass storage device on SMP system

Russell King - ARM Linux linux at arm.linux.org.uk
Tue Jul 27 06:01:21 EDT 2010


On Tue, Jul 27, 2010 at 03:08:54PM +0530, Shilimkar, Santosh wrote:
> As discussed, the main reason is the cache maintenance isn't done on
>  "bcb->CDB"  buffers and hence the data remains in CPU write buffer
> instead of the physical memory on which DMA operates. 

struct bulk_cb_wrap {
        __le32  Signature;              /* contains 'USBC' */
        __u32   Tag;                    /* unique per command id */
        __le32  DataTransferLength;     /* size of data */
        __u8    Flags;                  /* direction in bit 0 */
        __u8    Lun;                    /* LUN normally 0 */
        __u8    Length;                 /* of of the CDB */
        __u8    CDB[16];                /* max command */
};

So, CDB is contained within bcb...bcb+sizeof(*bcb).

The bcb is passed to usb_stor_bulk_transfer_buf:

        result = usb_stor_bulk_transfer_buf(us, us->send_bulk_pipe,
                                bcb, cbwlen, NULL);

which fills it into a URB:

        usb_fill_bulk_urb(us->current_urb, us->pusb_dev, pipe, buf, length,
                      usb_stor_blocking_completion, NULL);

This sets the URB buffer pointers:

        urb->transfer_buffer = transfer_buffer;
        urb->transfer_buffer_length = buffer_length;

And this buffer should be dma-mapped and dma-unmapped as appropriate.

Wasn't there an issue with the DMA mapping being used with a PIO USB
host recently?  Is that the problem here?



More information about the linux-arm-kernel mailing list