Merge branch 'master' of git://git.denx.de/u-boot-spi
[oweals/u-boot.git] / common / usb_storage.c
index 957ccdb29730eafa9ad5aed456f82b555d47fbc4..8c889bb1a64856060196b87daf23e3365c2a0260 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * Most of this source has been derived from the Linux USB
  * project:
@@ -17,8 +18,6 @@
  *
  * BBB support based on /sys/dev/usb/umass.c from
  * FreeBSD.
- *
- * SPDX-License-Identifier:    GPL-2.0+
  */
 
 /* Note:
@@ -37,7 +36,6 @@
 #include <command.h>
 #include <dm.h>
 #include <errno.h>
-#include <inttypes.h>
 #include <mapmem.h>
 #include <memalign.h>
 #include <asm/byteorder.h>
@@ -68,7 +66,7 @@ static __u32 CBWTag;
 
 static int usb_max_devs; /* number of highest available usb device */
 
-#ifndef CONFIG_BLK
+#if !CONFIG_IS_ENABLED(BLK)
 static struct blk_desc usb_dev_desc[USB_MAX_STOR_DEV];
 #endif
 
@@ -101,7 +99,7 @@ struct us_data {
        unsigned short  max_xfer_blk;           /* maximum transfer blocks */
 };
 
-#ifndef CONFIG_BLK
+#if !CONFIG_IS_ENABLED(BLK)
 static struct us_data usb_stor[USB_MAX_STOR_DEV];
 #endif
 
@@ -113,7 +111,7 @@ int usb_stor_get_info(struct usb_device *dev, struct us_data *us,
                      struct blk_desc *dev_desc);
 int usb_storage_probe(struct usb_device *dev, unsigned int ifnum,
                      struct us_data *ss);
-#ifdef CONFIG_BLK
+#if CONFIG_IS_ENABLED(BLK)
 static unsigned long usb_stor_read(struct udevice *dev, lbaint_t blknr,
                                   lbaint_t blkcnt, void *buffer);
 static unsigned long usb_stor_write(struct udevice *dev, lbaint_t blknr,
@@ -138,7 +136,7 @@ static void usb_show_progress(void)
 int usb_stor_info(void)
 {
        int count = 0;
-#ifdef CONFIG_BLK
+#if CONFIG_IS_ENABLED(BLK)
        struct udevice *dev;
 
        for (blk_first_device(IF_TYPE_USB, &dev);
@@ -188,7 +186,7 @@ static int usb_stor_probe_device(struct usb_device *udev)
 {
        int lun, max_lun;
 
-#ifdef CONFIG_BLK
+#if CONFIG_IS_ENABLED(BLK)
        struct us_data *data;
        int ret;
 #else
@@ -199,7 +197,7 @@ static int usb_stor_probe_device(struct usb_device *udev)
 #endif
 
        debug("\n\nProbing for storage\n");
-#ifdef CONFIG_BLK
+#if CONFIG_IS_ENABLED(BLK)
        /*
         * We store the us_data in the mass storage device's platdata. It
         * is shared by all LUNs (block devices) attached to this mass storage
@@ -228,9 +226,7 @@ static int usb_stor_probe_device(struct usb_device *udev)
                blkdev->lun = lun;
 
                ret = usb_stor_get_info(udev, data, blkdev);
-               if (ret == 1)
-                       ret = blk_prepare_device(dev);
-               if (!ret) {
+               if (ret == 1) {
                        usb_max_devs++;
                        debug("%s: Found device %p\n", __func__, udev);
                } else {
@@ -303,7 +299,7 @@ int usb_stor_scan(int mode)
        if (mode == 1)
                printf("       scanning usb for storage devices... ");
 
-#ifndef CONFIG_DM_USB
+#if !CONFIG_IS_ENABLED(DM_USB)
        unsigned char i;
 
        usb_disable_asynch(1); /* asynch transfer not allowed */
@@ -939,10 +935,14 @@ do_retry:
        return USB_STOR_TRANSPORT_FAILED;
 }
 
-static void usb_stor_set_max_xfer_blk(struct us_data *us)
+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
@@ -953,6 +953,17 @@ static void usb_stor_set_max_xfer_blk(struct us_data *us)
 #else
        blk = 20;
 #endif
+#else
+       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;
+               blk = size / 512;
+       }
+#endif
 
        us->max_xfer_blk = blk;
 }
@@ -1108,7 +1119,7 @@ static void usb_bin_fixup(struct usb_device_descriptor descriptor,
 }
 #endif /* CONFIG_USB_BIN_FIXUP */
 
-#ifdef CONFIG_BLK
+#if CONFIG_IS_ENABLED(BLK)
 static unsigned long usb_stor_read(struct udevice *dev, lbaint_t blknr,
                                   lbaint_t blkcnt, void *buffer)
 #else
@@ -1123,14 +1134,14 @@ static unsigned long usb_stor_read(struct blk_desc *block_dev, lbaint_t blknr,
        struct us_data *ss;
        int retry;
        struct scsi_cmd *srb = &usb_ccb;
-#ifdef CONFIG_BLK
+#if CONFIG_IS_ENABLED(BLK)
        struct blk_desc *block_dev;
 #endif
 
        if (blkcnt == 0)
                return 0;
        /* Setup  device */
-#ifdef CONFIG_BLK
+#if CONFIG_IS_ENABLED(BLK)
        block_dev = dev_get_uclass_platdata(dev);
        udev = dev_get_parent_priv(dev_get_parent(dev));
        debug("\nusb_read: udev %d\n", block_dev->devnum);
@@ -1150,8 +1161,8 @@ static unsigned long usb_stor_read(struct blk_desc *block_dev, lbaint_t blknr,
        start = blknr;
        blks = blkcnt;
 
-       debug("\nusb_read: dev %d startblk " LBAF ", blccnt " LBAF " buffer %"
-             PRIxPTR "\n", block_dev->devnum, start, blks, buf_addr);
+       debug("\nusb_read: dev %d startblk " LBAF ", blccnt " LBAF " buffer %lx\n",
+             block_dev->devnum, start, blks, buf_addr);
 
        do {
                /* XXX need some comment here */
@@ -1180,8 +1191,7 @@ retry_it:
        } while (blks != 0);
        ss->flags &= ~USB_READY;
 
-       debug("usb_read: end startblk " LBAF
-             ", blccnt %x buffer %" PRIxPTR "\n",
+       debug("usb_read: end startblk " LBAF ", blccnt %x buffer %lx\n",
              start, smallblks, buf_addr);
 
        usb_disable_asynch(0); /* asynch transfer allowed */
@@ -1190,7 +1200,7 @@ retry_it:
        return blkcnt;
 }
 
-#ifdef CONFIG_BLK
+#if CONFIG_IS_ENABLED(BLK)
 static unsigned long usb_stor_write(struct udevice *dev, lbaint_t blknr,
                                    lbaint_t blkcnt, const void *buffer)
 #else
@@ -1205,7 +1215,7 @@ static unsigned long usb_stor_write(struct blk_desc *block_dev, lbaint_t blknr,
        struct us_data *ss;
        int retry;
        struct scsi_cmd *srb = &usb_ccb;
-#ifdef CONFIG_BLK
+#if CONFIG_IS_ENABLED(BLK)
        struct blk_desc *block_dev;
 #endif
 
@@ -1213,7 +1223,7 @@ static unsigned long usb_stor_write(struct blk_desc *block_dev, lbaint_t blknr,
                return 0;
 
        /* Setup  device */
-#ifdef CONFIG_BLK
+#if CONFIG_IS_ENABLED(BLK)
        block_dev = dev_get_uclass_platdata(dev);
        udev = dev_get_parent_priv(dev_get_parent(dev));
        debug("\nusb_read: udev %d\n", block_dev->devnum);
@@ -1234,8 +1244,8 @@ static unsigned long usb_stor_write(struct blk_desc *block_dev, lbaint_t blknr,
        start = blknr;
        blks = blkcnt;
 
-       debug("\nusb_write: dev %d startblk " LBAF ", blccnt " LBAF " buffer %"
-             PRIxPTR "\n", block_dev->devnum, start, blks, buf_addr);
+       debug("\nusb_write: dev %d startblk " LBAF ", blccnt " LBAF " buffer %lx\n",
+             block_dev->devnum, start, blks, buf_addr);
 
        do {
                /* If write fails retry for max retry count else
@@ -1266,8 +1276,8 @@ retry_it:
        } while (blks != 0);
        ss->flags &= ~USB_READY;
 
-       debug("usb_write: end startblk " LBAF ", blccnt %x buffer %"
-             PRIxPTR "\n", start, smallblks, buf_addr);
+       debug("usb_write: end startblk " LBAF ", blccnt %x buffer %lx\n",
+             start, smallblks, buf_addr);
 
        usb_disable_asynch(0); /* asynch transfer allowed */
        if (blkcnt >= ss->max_xfer_blk)
@@ -1393,7 +1403,7 @@ int usb_storage_probe(struct usb_device *dev, unsigned int ifnum,
        }
 
        /* Set the maximum transfer size per host controller setting */
-       usb_stor_set_max_xfer_blk(ss);
+       usb_stor_set_max_xfer_blk(dev, ss);
 
        dev->privptr = (void *)ss;
        return 1;
@@ -1485,7 +1495,7 @@ int usb_stor_get_info(struct usb_device *dev, struct us_data *ss,
        return 1;
 }
 
-#ifdef CONFIG_DM_USB
+#if CONFIG_IS_ENABLED(DM_USB)
 
 static int usb_mass_storage_probe(struct udevice *dev)
 {
@@ -1509,7 +1519,7 @@ U_BOOT_DRIVER(usb_mass_storage) = {
        .id     = UCLASS_MASS_STORAGE,
        .of_match = usb_mass_storage_ids,
        .probe = usb_mass_storage_probe,
-#ifdef CONFIG_BLK
+#if CONFIG_IS_ENABLED(BLK)
        .platdata_auto_alloc_size       = sizeof(struct us_data),
 #endif
 };
@@ -1530,7 +1540,7 @@ static const struct usb_device_id mass_storage_id_table[] = {
 U_BOOT_USB_DEVICE(usb_mass_storage, mass_storage_id_table);
 #endif
 
-#ifdef CONFIG_BLK
+#if CONFIG_IS_ENABLED(BLK)
 static const struct blk_ops usb_storage_ops = {
        .read   = usb_stor_read,
        .write  = usb_stor_write,