]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - common/cmd_scsi.c
CPCI4052: Remove CONFIG_SYS_LONGHELP
[karo-tx-uboot.git] / common / cmd_scsi.c
index b3f7687aee6a2c87bd802539d7cdb96d9a4c0847..aaca3e8a2abe0fe2c3d0ad860a7816aec6bf7db2 100644 (file)
@@ -10,6 +10,7 @@
  */
 #include <common.h>
 #include <command.h>
+#include <inttypes.h>
 #include <asm/processor.h>
 #include <scsi.h>
 #include <image.h>
@@ -36,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 */
@@ -53,10 +54,12 @@ 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);
 
@@ -178,7 +181,7 @@ 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;
@@ -216,8 +219,10 @@ void scsi_init(void)
                       (busdevfunc >> 8) & 0x7);
        }
 #endif
+       bootstage_start(BOOTSTAGE_ID_ACCUM_SCSI, "ahci");
        scsi_low_level_init(busdevfunc);
        scsi_scan(1);
+       bootstage_accum(BOOTSTAGE_ID_ACCUM_SCSI);
 }
 #endif
 
@@ -354,7 +359,9 @@ 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)
@@ -376,7 +383,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);
@@ -391,7 +408,7 @@ static ulong scsi_read(int device, lbaint_t blknr, lbaint_t blkcnt,
                        blks=0;
                }
                debug("scsi_read_ext: startblk " LBAF
-                     ", blccnt %x buffer %lx\n",
+                     ", blccnt %x buffer %" PRIXPTR "\n",
                      start, smallblks, buf_addr);
                if (scsi_exec(pccb) != true) {
                        scsi_print_error(pccb);
@@ -401,7 +418,7 @@ static ulong scsi_read(int device, lbaint_t blknr, lbaint_t blkcnt,
                buf_addr+=pccb->datalen;
        } while(blks!=0);
        debug("scsi_read_ext: end startblk " LBAF
-             ", blccnt %x buffer %lx\n", start, smallblks, buf_addr);
+             ", blccnt %x buffer %" PRIXPTR "\n", start, smallblks, buf_addr);
        return(blkcnt);
 }
 
@@ -445,7 +462,7 @@ static ulong scsi_write(int device, lbaint_t blknr,
                        start += blks;
                        blks = 0;
                }
-               debug("%s: startblk " LBAF ", blccnt %x buffer %lx\n",
+               debug("%s: startblk " LBAF ", blccnt %x buffer %" PRIXPTR "\n",
                      __func__, start, smallblks, buf_addr);
                if (scsi_exec(pccb) != true) {
                        scsi_print_error(pccb);
@@ -454,7 +471,7 @@ static ulong scsi_write(int device, lbaint_t blknr,
                }
                buf_addr += pccb->datalen;
        } while (blks != 0);
-       debug("%s: end startblk " LBAF ", blccnt %x buffer %lx\n",
+       debug("%s: end startblk " LBAF ", blccnt %x buffer %" PRIXPTR "\n",
              __func__, start, smallblks, buf_addr);
        return blkcnt;
 }
@@ -576,7 +593,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;
@@ -596,7 +644,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;
@@ -617,7 +665,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);