]> Git Repo - J-u-boot.git/blobdiff - common/usb_storage.c
common: Remove <common.h> and add needed includes
[J-u-boot.git] / common / usb_storage.c
index c9e2d7343ce2d81e3676da8e69330f64c395b612..a79ed2e23a441d6df3759349b040ee20a9212a90 100644 (file)
@@ -32,8 +32,8 @@
  */
 
 
-#include <common.h>
 #include <blk.h>
+#include <bootdev.h>
 #include <command.h>
 #include <dm.h>
 #include <errno.h>
@@ -101,6 +101,7 @@ struct us_data {
        trans_reset     transport_reset;        /* reset routine */
        trans_cmnd      transport;              /* transport routine */
        unsigned short  max_xfer_blk;           /* maximum transfer blocks */
+       bool            cmd12;                  /* use 12-byte commands (RBC/UFI) */
 };
 
 #if !CONFIG_IS_ENABLED(BLK)
@@ -143,7 +144,7 @@ int usb_stor_info(void)
 #if CONFIG_IS_ENABLED(BLK)
        struct udevice *dev;
 
-       for (blk_first_device(IF_TYPE_USB, &dev);
+       for (blk_first_device(UCLASS_USB, &dev);
             dev;
             blk_next_device(&dev)) {
                struct blk_desc *desc = dev_get_uclass_plat(dev);
@@ -218,8 +219,8 @@ static int usb_stor_probe_device(struct usb_device *udev)
 
                snprintf(str, sizeof(str), "lun%d", lun);
                ret = blk_create_devicef(udev->dev, "usb_storage_blk", str,
-                                        IF_TYPE_USB, usb_max_devs, 512, 0,
-                                        &dev);
+                                        UCLASS_USB, usb_max_devs,
+                                        DEFAULT_BLKSZ, 0, &dev);
                if (ret) {
                        debug("Cannot bind driver\n");
                        return ret;
@@ -238,6 +239,21 @@ static int usb_stor_probe_device(struct usb_device *udev)
                        ret = device_unbind(dev);
                        if (ret)
                                return ret;
+                       continue;
+               }
+
+               ret = blk_probe_or_unbind(dev);
+               if (ret)
+                       return ret;
+
+               ret = bootdev_setup_for_sibling_blk(dev, "usb_bootdev");
+               if (ret) {
+                       int ret2;
+
+                       ret2 = device_unbind(dev);
+                       if (ret2)
+                               return log_msg_ret("bootdev", ret2);
+                       return log_msg_ret("bootdev", ret);
                }
        }
 #else
@@ -264,7 +280,7 @@ static int usb_stor_probe_device(struct usb_device *udev)
 
                blkdev = &usb_dev_desc[usb_max_devs];
                memset(blkdev, '\0', sizeof(struct blk_desc));
-               blkdev->if_type = IF_TYPE_USB;
+               blkdev->uclass_id = UCLASS_USB;
                blkdev->devnum = usb_max_devs;
                blkdev->part_type = PART_TYPE_UNKNOWN;
                blkdev->target = 0xff;
@@ -343,7 +359,7 @@ static void usb_show_srb(struct scsi_cmd *pccb)
 {
        int i;
        printf("SRB: len %d datalen 0x%lX\n ", pccb->cmdlen, pccb->datalen);
-       for (i = 0; i < 12; i++)
+       for (i = 0; i < pccb->cmdlen; i++)
                printf("%02X ", pccb->cmd[i]);
        printf("\n");
 }
@@ -882,7 +898,7 @@ do_retry:
        psrb->cmd[4] = 18;
        psrb->datalen = 18;
        psrb->pdata = &srb->sense_buf[0];
-       psrb->cmdlen = 12;
+       psrb->cmdlen = us->cmd12 ? 12 : 6;
        /* issue the command */
        result = usb_stor_CB_comdat(psrb, us);
        debug("auto request returned %d\n", result);
@@ -983,7 +999,7 @@ static int usb_inquiry(struct scsi_cmd *srb, struct us_data *ss)
                srb->cmd[1] = srb->lun << 5;
                srb->cmd[4] = 36;
                srb->datalen = 36;
-               srb->cmdlen = 12;
+               srb->cmdlen = ss->cmd12 ? 12 : 6;
                i = ss->transport(srb, ss);
                debug("inquiry returns %d\n", i);
                if (i == 0)
@@ -1008,7 +1024,7 @@ static int usb_request_sense(struct scsi_cmd *srb, struct us_data *ss)
        srb->cmd[4] = 18;
        srb->datalen = 18;
        srb->pdata = &srb->sense_buf[0];
-       srb->cmdlen = 12;
+       srb->cmdlen = ss->cmd12 ? 12 : 6;
        ss->transport(srb, ss);
        debug("Request Sense returned %02X %02X %02X\n",
              srb->sense_buf[2], srb->sense_buf[12],
@@ -1026,7 +1042,7 @@ static int usb_test_unit_ready(struct scsi_cmd *srb, struct us_data *ss)
                srb->cmd[0] = SCSI_TST_U_RDY;
                srb->cmd[1] = srb->lun << 5;
                srb->datalen = 0;
-               srb->cmdlen = 12;
+               srb->cmdlen = ss->cmd12 ? 12 : 6;
                if (ss->transport(srb, ss) == USB_STOR_TRANSPORT_GOOD) {
                        ss->flags |= USB_READY;
                        return 0;
@@ -1058,7 +1074,7 @@ static int usb_read_capacity(struct scsi_cmd *srb, struct us_data *ss)
                srb->cmd[0] = SCSI_RD_CAPAC;
                srb->cmd[1] = srb->lun << 5;
                srb->datalen = 8;
-               srb->cmdlen = 12;
+               srb->cmdlen = ss->cmd12 ? 12 : 10;
                if (ss->transport(srb, ss) == USB_STOR_TRANSPORT_GOOD)
                        return 0;
        } while (retry--);
@@ -1078,7 +1094,7 @@ static int usb_read_10(struct scsi_cmd *srb, struct us_data *ss,
        srb->cmd[5] = ((unsigned char) (start)) & 0xff;
        srb->cmd[7] = ((unsigned char) (blocks >> 8)) & 0xff;
        srb->cmd[8] = (unsigned char) blocks & 0xff;
-       srb->cmdlen = 12;
+       srb->cmdlen = ss->cmd12 ? 12 : 10;
        debug("read10: start %lx blocks %x\n", start, blocks);
        return ss->transport(srb, ss);
 }
@@ -1095,7 +1111,7 @@ static int usb_write_10(struct scsi_cmd *srb, struct us_data *ss,
        srb->cmd[5] = ((unsigned char) (start)) & 0xff;
        srb->cmd[7] = ((unsigned char) (blocks >> 8)) & 0xff;
        srb->cmd[8] = (unsigned char) blocks & 0xff;
-       srb->cmdlen = 12;
+       srb->cmdlen = ss->cmd12 ? 12 : 10;
        debug("write10: start %lx blocks %x\n", start, blocks);
        return ss->transport(srb, ss);
 }
@@ -1401,6 +1417,11 @@ int usb_storage_probe(struct usb_device *dev, unsigned int ifnum,
                printf("Sorry, protocol %d not yet supported.\n", ss->subclass);
                return 0;
        }
+
+       /* UFI uses 12-byte commands (like RBC, unlike SCSI) */
+       if (ss->subclass == US_SC_UFI)
+               ss->cmd12 = true;
+
        if (ss->ep_int) {
                /* we had found an interrupt endpoint, prepare irq pipe
                 * set up the IRQ pipe and handler
@@ -1562,8 +1583,8 @@ U_BOOT_DRIVER(usb_storage_blk) = {
 };
 #else
 U_BOOT_LEGACY_BLK(usb) = {
-       .if_typename    = "usb",
-       .if_type        = IF_TYPE_USB,
+       .uclass_idname  = "usb",
+       .uclass_id      = UCLASS_USB,
        .max_devs       = USB_MAX_STOR_DEV,
        .desc           = usb_dev_desc,
 };
This page took 0.040709 seconds and 4 git commands to generate.