|
@@ -98,19 +98,9 @@ struct us_data {
|
|
struct scsi_cmd *srb; /* current srb */
|
|
struct scsi_cmd *srb; /* current srb */
|
|
trans_reset transport_reset; /* reset routine */
|
|
trans_reset transport_reset; /* reset routine */
|
|
trans_cmnd transport; /* transport routine */
|
|
trans_cmnd transport; /* transport routine */
|
|
|
|
+ unsigned short max_xfer_blk; /* maximum transfer blocks */
|
|
};
|
|
};
|
|
|
|
|
|
-#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.
|
|
|
|
- */
|
|
|
|
-#define USB_MAX_XFER_BLK 65535
|
|
|
|
-#else
|
|
|
|
-#define USB_MAX_XFER_BLK 20
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
#ifndef CONFIG_BLK
|
|
#ifndef CONFIG_BLK
|
|
static struct us_data usb_stor[USB_MAX_STOR_DEV];
|
|
static struct us_data usb_stor[USB_MAX_STOR_DEV];
|
|
#endif
|
|
#endif
|
|
@@ -949,6 +939,23 @@ do_retry:
|
|
return USB_STOR_TRANSPORT_FAILED;
|
|
return USB_STOR_TRANSPORT_FAILED;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void usb_stor_set_max_xfer_blk(struct us_data *us)
|
|
|
|
+{
|
|
|
|
+ unsigned short blk;
|
|
|
|
+
|
|
|
|
+#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.
|
|
|
|
+ */
|
|
|
|
+ blk = USHRT_MAX;
|
|
|
|
+#else
|
|
|
|
+ blk = 20;
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+ us->max_xfer_blk = blk;
|
|
|
|
+}
|
|
|
|
|
|
static int usb_inquiry(struct scsi_cmd *srb, struct us_data *ss)
|
|
static int usb_inquiry(struct scsi_cmd *srb, struct us_data *ss)
|
|
{
|
|
{
|
|
@@ -1150,12 +1157,12 @@ static unsigned long usb_stor_read(struct blk_desc *block_dev, lbaint_t 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;
|
|
- if (blks > USB_MAX_XFER_BLK)
|
|
|
|
- smallblks = USB_MAX_XFER_BLK;
|
|
|
|
|
|
+ if (blks > ss->max_xfer_blk)
|
|
|
|
+ smallblks = ss->max_xfer_blk;
|
|
else
|
|
else
|
|
smallblks = (unsigned short) blks;
|
|
smallblks = (unsigned short) blks;
|
|
retry_it:
|
|
retry_it:
|
|
- if (smallblks == USB_MAX_XFER_BLK)
|
|
|
|
|
|
+ if (smallblks == ss->max_xfer_blk)
|
|
usb_show_progress();
|
|
usb_show_progress();
|
|
srb->datalen = block_dev->blksz * smallblks;
|
|
srb->datalen = block_dev->blksz * smallblks;
|
|
srb->pdata = (unsigned char *)buf_addr;
|
|
srb->pdata = (unsigned char *)buf_addr;
|
|
@@ -1178,7 +1185,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 >= USB_MAX_XFER_BLK)
|
|
|
|
|
|
+ if (blkcnt >= ss->max_xfer_blk)
|
|
debug("\n");
|
|
debug("\n");
|
|
return blkcnt;
|
|
return blkcnt;
|
|
}
|
|
}
|
|
@@ -1236,12 +1243,12 @@ static unsigned long usb_stor_write(struct blk_desc *block_dev, lbaint_t blknr,
|
|
*/
|
|
*/
|
|
retry = 2;
|
|
retry = 2;
|
|
srb->pdata = (unsigned char *)buf_addr;
|
|
srb->pdata = (unsigned char *)buf_addr;
|
|
- if (blks > USB_MAX_XFER_BLK)
|
|
|
|
- smallblks = USB_MAX_XFER_BLK;
|
|
|
|
|
|
+ if (blks > ss->max_xfer_blk)
|
|
|
|
+ smallblks = ss->max_xfer_blk;
|
|
else
|
|
else
|
|
smallblks = (unsigned short) blks;
|
|
smallblks = (unsigned short) blks;
|
|
retry_it:
|
|
retry_it:
|
|
- if (smallblks == USB_MAX_XFER_BLK)
|
|
|
|
|
|
+ if (smallblks == ss->max_xfer_blk)
|
|
usb_show_progress();
|
|
usb_show_progress();
|
|
srb->datalen = block_dev->blksz * smallblks;
|
|
srb->datalen = block_dev->blksz * smallblks;
|
|
srb->pdata = (unsigned char *)buf_addr;
|
|
srb->pdata = (unsigned char *)buf_addr;
|
|
@@ -1263,7 +1270,7 @@ retry_it:
|
|
PRIxPTR "\n", start, smallblks, buf_addr);
|
|
PRIxPTR "\n", start, smallblks, buf_addr);
|
|
|
|
|
|
usb_disable_asynch(0); /* asynch transfer allowed */
|
|
usb_disable_asynch(0); /* asynch transfer allowed */
|
|
- if (blkcnt >= USB_MAX_XFER_BLK)
|
|
|
|
|
|
+ if (blkcnt >= ss->max_xfer_blk)
|
|
debug("\n");
|
|
debug("\n");
|
|
return blkcnt;
|
|
return blkcnt;
|
|
|
|
|
|
@@ -1384,6 +1391,10 @@ int usb_storage_probe(struct usb_device *dev, unsigned int ifnum,
|
|
ss->irqmaxp = usb_maxpacket(dev, ss->irqpipe);
|
|
ss->irqmaxp = usb_maxpacket(dev, ss->irqpipe);
|
|
dev->irq_handle = usb_stor_irq;
|
|
dev->irq_handle = usb_stor_irq;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ /* Set the maximum transfer size per host controller setting */
|
|
|
|
+ usb_stor_set_max_xfer_blk(ss);
|
|
|
|
+
|
|
dev->privptr = (void *)ss;
|
|
dev->privptr = (void *)ss;
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|