|
@@ -938,31 +938,32 @@ do_retry:
|
|
|
static void usb_stor_set_max_xfer_blk(struct usb_device *udev,
|
|
|
struct us_data *us)
|
|
|
{
|
|
|
- unsigned short blk;
|
|
|
- size_t __maybe_unused size;
|
|
|
- int __maybe_unused ret;
|
|
|
-
|
|
|
-#if !CONFIG_IS_ENABLED(DM_USB)
|
|
|
-#ifdef CONFIG_USB_EHCI_HCD
|
|
|
/*
|
|
|
- * The U-Boot EHCI driver can handle any transfer length as long as
|
|
|
- * there is enough free heap space left, but the SCSI READ(10) and
|
|
|
- * WRITE(10) commands are limited to 65535 blocks.
|
|
|
+ * Limit the total size of a transfer to 120 KB.
|
|
|
+ *
|
|
|
+ * Some devices are known to choke with anything larger. It seems like
|
|
|
+ * the problem stems from the fact that original IDE controllers had
|
|
|
+ * only an 8-bit register to hold the number of sectors in one transfer
|
|
|
+ * and even those couldn't handle a full 256 sectors.
|
|
|
+ *
|
|
|
+ * Because we want to make sure we interoperate with as many devices as
|
|
|
+ * possible, we will maintain a 240 sector transfer size limit for USB
|
|
|
+ * Mass Storage devices.
|
|
|
+ *
|
|
|
+ * Tests show that other operating have similar limits with Microsoft
|
|
|
+ * Windows 7 limiting transfers to 128 sectors for both USB2 and USB3
|
|
|
+ * and Apple Mac OS X 10.11 limiting transfers to 256 sectors for USB2
|
|
|
+ * and 2048 for USB3 devices.
|
|
|
*/
|
|
|
- blk = USHRT_MAX;
|
|
|
-#else
|
|
|
- blk = 20;
|
|
|
-#endif
|
|
|
-#else
|
|
|
+ unsigned short blk = 240;
|
|
|
+
|
|
|
+#if CONFIG_IS_ENABLED(DM_USB)
|
|
|
+ size_t size;
|
|
|
+ int ret;
|
|
|
+
|
|
|
ret = usb_get_max_xfer_size(udev, (size_t *)&size);
|
|
|
- if (ret < 0) {
|
|
|
- /* unimplemented, let's use default 20 */
|
|
|
- blk = 20;
|
|
|
- } else {
|
|
|
- if (size > USHRT_MAX * 512)
|
|
|
- size = USHRT_MAX * 512;
|
|
|
+ if ((ret >= 0) && (size < blk * 512))
|
|
|
blk = size / 512;
|
|
|
- }
|
|
|
#endif
|
|
|
|
|
|
us->max_xfer_blk = blk;
|