usb_storage: Remove EHCI constraints

Now that the EHCI driver allocates its qTDs from the heap, the MSC driver is
only limited by the SCSI commands it uses.

Signed-off-by: Benoît Thébaudeau <benoit.thebaudeau@advansee.com>
Cc: Marek Vasut <marex@denx.de>
Cc: Ilya Yanok <ilya.yanok@cogentembedded.com>
Cc: Stefan Herbrechtsmeier <stefan@herbrechtsmeier.net>
This commit is contained in:
Benoît Thébaudeau 2012-08-10 18:23:25 +02:00 committed by Marek Vasut
parent cffcc50358
commit 4bee5c83ea

View file

@ -157,12 +157,13 @@ struct us_data {
#ifdef CONFIG_USB_EHCI #ifdef CONFIG_USB_EHCI
/* /*
* The U-Boot EHCI driver cannot handle more than 5 page aligned buffers * The U-Boot EHCI driver can handle any transfer length as long as there is
* of 4096 bytes in a transfer without running itself out of qt_buffers * enough free heap space left, but the SCSI READ(10) and WRITE(10) commands are
* limited to 65535 blocks.
*/ */
#define USB_MAX_XFER_BLK(start, blksz) (((4096 * 5) - (start % 4096)) / blksz) #define USB_MAX_XFER_BLK 65535
#else #else
#define USB_MAX_XFER_BLK(start, blksz) 20 #define USB_MAX_XFER_BLK 20
#endif #endif
static struct us_data usb_stor[USB_MAX_STOR_DEV]; static struct us_data usb_stor[USB_MAX_STOR_DEV];
@ -1050,7 +1051,7 @@ static void usb_bin_fixup(struct usb_device_descriptor descriptor,
unsigned long usb_stor_read(int device, unsigned long blknr, unsigned long usb_stor_read(int device, unsigned long blknr,
unsigned long blkcnt, void *buffer) unsigned long blkcnt, void *buffer)
{ {
unsigned long start, blks, buf_addr, max_xfer_blk; unsigned long start, blks, buf_addr;
unsigned short smallblks; unsigned short smallblks;
struct usb_device *dev; struct usb_device *dev;
struct us_data *ss; struct us_data *ss;
@ -1092,14 +1093,12 @@ unsigned long usb_stor_read(int device, unsigned long blknr,
/* XXX need some comment here */ /* XXX need some comment here */
retry = 2; retry = 2;
srb->pdata = (unsigned char *)buf_addr; srb->pdata = (unsigned char *)buf_addr;
max_xfer_blk = USB_MAX_XFER_BLK(buf_addr, if (blks > USB_MAX_XFER_BLK)
usb_dev_desc[device].blksz); smallblks = USB_MAX_XFER_BLK;
if (blks > max_xfer_blk)
smallblks = (unsigned short) max_xfer_blk;
else else
smallblks = (unsigned short) blks; smallblks = (unsigned short) blks;
retry_it: retry_it:
if (smallblks == max_xfer_blk) if (smallblks == USB_MAX_XFER_BLK)
usb_show_progress(); usb_show_progress();
srb->datalen = usb_dev_desc[device].blksz * smallblks; srb->datalen = usb_dev_desc[device].blksz * smallblks;
srb->pdata = (unsigned char *)buf_addr; srb->pdata = (unsigned char *)buf_addr;
@ -1120,7 +1119,7 @@ retry_it:
start, smallblks, buf_addr); start, smallblks, buf_addr);
usb_disable_asynch(0); /* asynch transfer allowed */ usb_disable_asynch(0); /* asynch transfer allowed */
if (blkcnt >= max_xfer_blk) if (blkcnt >= USB_MAX_XFER_BLK)
debug("\n"); debug("\n");
return blkcnt; return blkcnt;
} }
@ -1128,7 +1127,7 @@ retry_it:
unsigned long usb_stor_write(int device, unsigned long blknr, unsigned long usb_stor_write(int device, unsigned long blknr,
unsigned long blkcnt, const void *buffer) unsigned long blkcnt, const void *buffer)
{ {
unsigned long start, blks, buf_addr, max_xfer_blk; unsigned long start, blks, buf_addr;
unsigned short smallblks; unsigned short smallblks;
struct usb_device *dev; struct usb_device *dev;
struct us_data *ss; struct us_data *ss;
@ -1173,14 +1172,12 @@ unsigned long usb_stor_write(int device, unsigned long blknr,
*/ */
retry = 2; retry = 2;
srb->pdata = (unsigned char *)buf_addr; srb->pdata = (unsigned char *)buf_addr;
max_xfer_blk = USB_MAX_XFER_BLK(buf_addr, if (blks > USB_MAX_XFER_BLK)
usb_dev_desc[device].blksz); smallblks = USB_MAX_XFER_BLK;
if (blks > max_xfer_blk)
smallblks = (unsigned short) max_xfer_blk;
else else
smallblks = (unsigned short) blks; smallblks = (unsigned short) blks;
retry_it: retry_it:
if (smallblks == max_xfer_blk) if (smallblks == USB_MAX_XFER_BLK)
usb_show_progress(); usb_show_progress();
srb->datalen = usb_dev_desc[device].blksz * smallblks; srb->datalen = usb_dev_desc[device].blksz * smallblks;
srb->pdata = (unsigned char *)buf_addr; srb->pdata = (unsigned char *)buf_addr;
@ -1201,7 +1198,7 @@ retry_it:
start, smallblks, buf_addr); start, smallblks, buf_addr);
usb_disable_asynch(0); /* asynch transfer allowed */ usb_disable_asynch(0); /* asynch transfer allowed */
if (blkcnt >= max_xfer_blk) if (blkcnt >= USB_MAX_XFER_BLK)
debug("\n"); debug("\n");
return blkcnt; return blkcnt;