Issue with file transfers to a mass storage device on SMP system
Shilimkar, Santosh
santosh.shilimkar at ti.com
Tue Jul 27 06:19:29 EDT 2010
> -----Original Message-----
> From: Russell King - ARM Linux [mailto:linux at arm.linux.org.uk]
> Sent: Tuesday, July 27, 2010 3:31 PM
> To: Shilimkar, Santosh
> Cc: Mankad, Maulik Ojas; linux-usb at vger.kernel.org; linux-
> omap at vger.kernel.org; linux-arm-kernel at lists.infradead.org
> Subject: Re: Issue with file transfers to a mass storage device on SMP
> system
>
> 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?
That's correct.
The last issue was otherway round where we were doing map/unmpap on PIO buffer.
This issue is because "CDB[16]", is not cleaned up before merging it into CBW.
Regards,
Santosh
More information about the linux-arm-kernel
mailing list