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