stdio: Correct a build error with driver model
[oweals/u-boot.git] / common / cmd_scsi.c
index a0a62ebdca8e8d18e36ecfa7fac6aea6328d2df5..bc7d1b6c53007801eb24e298629040aa6c7ed2c5 100644 (file)
@@ -37,7 +37,7 @@
 #define SCSI_DEV_LIST {SCSI_VEND_ID, SCSI_DEV_ID}
 #endif
 
-#ifdef CONFIG_PCI
+#if defined(CONFIG_PCI) && !defined(CONFIG_SCSI_AHCI_PLAT)
 const struct pci_device_id scsi_device_list[] = { SCSI_DEV_LIST };
 #endif
 static ccb tempccb;    /* temporary scsi command buffer */
@@ -54,19 +54,21 @@ static block_dev_desc_t scsi_dev_desc[CONFIG_SYS_SCSI_MAX_DEVICE];
  *  forward declerations of some Setup Routines
  */
 void scsi_setup_test_unit_ready(ccb * pccb);
-void scsi_setup_read6(ccb * pccb, unsigned long start, unsigned short blocks);
-void scsi_setup_read_ext(ccb * pccb, unsigned long start, unsigned short blocks);
-static void scsi_setup_write_ext(ccb *pccb, unsigned long start,
-                         unsigned short blocks);
+void scsi_setup_read6(ccb * pccb, lbaint_t start, unsigned short blocks);
+void scsi_setup_read_ext(ccb * pccb, lbaint_t start, unsigned short blocks);
+void scsi_setup_read16(ccb * pccb, lbaint_t start, unsigned long blocks);
+
+static void scsi_setup_write_ext(ccb *pccb, lbaint_t start,
+                               unsigned short blocks);
 void scsi_setup_inquiry(ccb * pccb);
 void scsi_ident_cpy (unsigned char *dest, unsigned char *src, unsigned int len);
 
 
 static int scsi_read_capacity(ccb *pccb, lbaint_t *capacity,
                              unsigned long *blksz);
-static ulong scsi_read(int device, lbaint_t blknr, lbaint_t blkcnt,
-                      void *buffer);
-static ulong scsi_write(int device, lbaint_t blknr,
+static ulong scsi_read(block_dev_desc_t *block_dev, lbaint_t blknr,
+                      lbaint_t blkcnt, void *buffer);
+static ulong scsi_write(block_dev_desc_t *block_dev, lbaint_t blknr,
                        lbaint_t blkcnt, const void *buffer);
 
 
@@ -179,10 +181,10 @@ int scsi_get_disk_count(void)
        return scsi_max_devs;
 }
 
-#ifdef CONFIG_PCI
+#if defined(CONFIG_PCI) && !defined(CONFIG_SCSI_AHCI_PLAT)
 void scsi_init(void)
 {
-       int busdevfunc;
+       int busdevfunc = -1;
        int i;
        /*
         * Find a device from the list, this driver will support a single
@@ -190,9 +192,21 @@ void scsi_init(void)
         */
        for (i = 0; i < ARRAY_SIZE(scsi_device_list); i++) {
                /* get PCI Device ID */
+#ifdef CONFIG_DM_PCI
+               struct udevice *dev;
+               int ret;
+
+               ret = dm_pci_find_device(scsi_device_list[i].vendor,
+                                        scsi_device_list[i].device, 0, &dev);
+               if (!ret) {
+                       busdevfunc = dm_pci_get_bdf(dev);
+                       break;
+               }
+#else
                busdevfunc = pci_find_device(scsi_device_list[i].vendor,
                                             scsi_device_list[i].device,
                                             0);
+#endif
                if (busdevfunc != -1)
                        break;
        }
@@ -332,7 +346,8 @@ int do_scsi (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                                ulong n;
                                printf ("\nSCSI read: device %d block # %ld, count %ld ... ",
                                                scsi_curr_dev, blk, cnt);
-                               n = scsi_read(scsi_curr_dev, blk, cnt, (ulong *)addr);
+                               n = scsi_read(&scsi_dev_desc[scsi_curr_dev],
+                                             blk, cnt, (ulong *)addr);
                                printf ("%ld blocks read: %s\n",n,(n==cnt) ? "OK" : "ERROR");
                                return 0;
                        } else if (strcmp(argv[1], "write") == 0) {
@@ -343,8 +358,8 @@ int do_scsi (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                                printf("\nSCSI write: device %d block # %ld, "
                                       "count %ld ... ",
                                       scsi_curr_dev, blk, cnt);
-                               n = scsi_write(scsi_curr_dev, blk, cnt,
-                                              (ulong *)addr);
+                               n = scsi_write(&scsi_dev_desc[scsi_curr_dev],
+                                              blk, cnt, (ulong *)addr);
                                printf("%ld blocks written: %s\n", n,
                                       (n == cnt) ? "OK" : "ERROR");
                                return 0;
@@ -357,14 +372,17 @@ int do_scsi (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  * scsi_read
  */
 
-#define SCSI_MAX_READ_BLK 0xFFFF /* almost the maximum amount of the scsi_ext command.. */
+/* almost the maximum amount of the scsi_ext command.. */
+#define SCSI_MAX_READ_BLK 0xFFFF
+#define SCSI_LBA48_READ        0xFFFFFFF
 
-static ulong scsi_read(int device, lbaint_t blknr, lbaint_t blkcnt,
-                      void *buffer)
+static ulong scsi_read(block_dev_desc_t *block_dev, lbaint_t blknr,
+                      lbaint_t blkcnt, void *buffer)
 {
+       int device = block_dev->dev;
        lbaint_t start, blks;
        uintptr_t buf_addr;
-       unsigned short smallblks;
+       unsigned short smallblks = 0;
        ccb* pccb=(ccb *)&tempccb;
        device&=0xff;
        /* Setup  device
@@ -379,7 +397,17 @@ static ulong scsi_read(int device, lbaint_t blknr, lbaint_t blkcnt,
              device, start, blks, (unsigned long)buffer);
        do {
                pccb->pdata=(unsigned char *)buf_addr;
-               if(blks>SCSI_MAX_READ_BLK) {
+#ifdef CONFIG_SYS_64BIT_LBA
+               if (start > SCSI_LBA48_READ) {
+                       unsigned long blocks;
+                       blocks = min_t(lbaint_t, blks, SCSI_MAX_READ_BLK);
+                       pccb->datalen = scsi_dev_desc[device].blksz * blocks;
+                       scsi_setup_read16(pccb, start, blocks);
+                       start += blocks;
+                       blks -= blocks;
+               } else
+#endif
+               if (blks > SCSI_MAX_READ_BLK) {
                        pccb->datalen=scsi_dev_desc[device].blksz * SCSI_MAX_READ_BLK;
                        smallblks=SCSI_MAX_READ_BLK;
                        scsi_setup_read_ext(pccb,start,smallblks);
@@ -415,9 +443,10 @@ static ulong scsi_read(int device, lbaint_t blknr, lbaint_t blkcnt,
 /* Almost the maximum amount of the scsi_ext command.. */
 #define SCSI_MAX_WRITE_BLK 0xFFFF
 
-static ulong scsi_write(int device, lbaint_t blknr,
+static ulong scsi_write(block_dev_desc_t *block_dev, lbaint_t blknr,
                        lbaint_t blkcnt, const void *buffer)
 {
+       int device = block_dev->dev;
        lbaint_t start, blks;
        uintptr_t buf_addr;
        unsigned short smallblks;
@@ -579,7 +608,38 @@ void scsi_setup_test_unit_ready(ccb * pccb)
        pccb->msgout[0]=SCSI_IDENTIFY; /* NOT USED */
 }
 
-void scsi_setup_read_ext(ccb * pccb, unsigned long start, unsigned short blocks)
+#ifdef CONFIG_SYS_64BIT_LBA
+void scsi_setup_read16(ccb * pccb, lbaint_t start, unsigned long blocks)
+{
+       pccb->cmd[0] = SCSI_READ16;
+       pccb->cmd[1] = pccb->lun<<5;
+       pccb->cmd[2] = ((unsigned char) (start >> 56)) & 0xff;
+       pccb->cmd[3] = ((unsigned char) (start >> 48)) & 0xff;
+       pccb->cmd[4] = ((unsigned char) (start >> 40)) & 0xff;
+       pccb->cmd[5] = ((unsigned char) (start >> 32)) & 0xff;
+       pccb->cmd[6] = ((unsigned char) (start >> 24)) & 0xff;
+       pccb->cmd[7] = ((unsigned char) (start >> 16)) & 0xff;
+       pccb->cmd[8] = ((unsigned char) (start >> 8)) & 0xff;
+       pccb->cmd[9] = ((unsigned char) (start)) & 0xff;
+       pccb->cmd[10] = 0;
+       pccb->cmd[11] = ((unsigned char) (blocks >> 24)) & 0xff;
+       pccb->cmd[12] = ((unsigned char) (blocks >> 16)) & 0xff;
+       pccb->cmd[13] = ((unsigned char) (blocks >> 8)) & 0xff;
+       pccb->cmd[14] = (unsigned char) blocks & 0xff;
+       pccb->cmd[15] = 0;
+       pccb->cmdlen = 16;
+       pccb->msgout[0] = SCSI_IDENTIFY; /* NOT USED */
+       debug ("scsi_setup_read16: cmd: %02X %02X "
+              "startblk %02X%02X%02X%02X%02X%02X%02X%02X "
+              "blccnt %02X%02X%02X%02X\n",
+               pccb->cmd[0], pccb->cmd[1],
+               pccb->cmd[2], pccb->cmd[3], pccb->cmd[4], pccb->cmd[5],
+               pccb->cmd[6], pccb->cmd[7], pccb->cmd[8], pccb->cmd[9],
+               pccb->cmd[11], pccb->cmd[12], pccb->cmd[13], pccb->cmd[14]);
+}
+#endif
+
+void scsi_setup_read_ext(ccb * pccb, lbaint_t start, unsigned short blocks)
 {
        pccb->cmd[0]=SCSI_READ10;
        pccb->cmd[1]=pccb->lun<<5;
@@ -599,7 +659,7 @@ void scsi_setup_read_ext(ccb * pccb, unsigned long start, unsigned short blocks)
                pccb->cmd[7],pccb->cmd[8]);
 }
 
-void scsi_setup_write_ext(ccb *pccb, unsigned long start, unsigned short blocks)
+void scsi_setup_write_ext(ccb *pccb, lbaint_t start, unsigned short blocks)
 {
        pccb->cmd[0] = SCSI_WRITE10;
        pccb->cmd[1] = pccb->lun << 5;
@@ -620,7 +680,7 @@ void scsi_setup_write_ext(ccb *pccb, unsigned long start, unsigned short blocks)
              pccb->cmd[7], pccb->cmd[8]);
 }
 
-void scsi_setup_read6(ccb * pccb, unsigned long start, unsigned short blocks)
+void scsi_setup_read6(ccb * pccb, lbaint_t start, unsigned short blocks)
 {
        pccb->cmd[0]=SCSI_READ6;
        pccb->cmd[1]=pccb->lun<<5 | (((unsigned char)(start>>16))&0x1f);