|
@@ -72,7 +72,6 @@ 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_read_capacity(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,
|
|
@@ -81,6 +80,8 @@ 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, ulong blknr, lbaint_t blkcnt, void *buffer);
|
|
|
static ulong scsi_write(int device, ulong blknr,
|
|
|
lbaint_t blkcnt, const void *buffer);
|
|
@@ -93,7 +94,8 @@ static ulong scsi_write(int device, ulong blknr,
|
|
|
void scsi_scan(int mode)
|
|
|
{
|
|
|
unsigned char i,perq,modi,lun;
|
|
|
- unsigned long capacity,blksz;
|
|
|
+ lbaint_t capacity;
|
|
|
+ unsigned long blksz;
|
|
|
ccb* pccb=(ccb *)&tempccb;
|
|
|
|
|
|
if(mode==1) {
|
|
@@ -158,16 +160,10 @@ void scsi_scan(int mode)
|
|
|
scsi_print_error(pccb);
|
|
|
continue;
|
|
|
}
|
|
|
- pccb->datalen=8;
|
|
|
- scsi_setup_read_capacity(pccb);
|
|
|
- if(scsi_exec(pccb)!=TRUE) {
|
|
|
+ if (scsi_read_capacity(pccb, &capacity, &blksz)) {
|
|
|
scsi_print_error(pccb);
|
|
|
continue;
|
|
|
}
|
|
|
- capacity=((unsigned long)tempbuff[0]<<24)|((unsigned long)tempbuff[1]<<16)|
|
|
|
- ((unsigned long)tempbuff[2]<<8)|((unsigned long)tempbuff[3]);
|
|
|
- blksz=((unsigned long)tempbuff[4]<<24)|((unsigned long)tempbuff[5]<<16)|
|
|
|
- ((unsigned long)tempbuff[6]<<8)|((unsigned long)tempbuff[7]);
|
|
|
scsi_dev_desc[scsi_max_devs].lba=capacity;
|
|
|
scsi_dev_desc[scsi_max_devs].blksz=blksz;
|
|
|
scsi_dev_desc[scsi_max_devs].type=perq;
|
|
@@ -514,6 +510,67 @@ void scsi_trim_trail (unsigned char *str, unsigned int len)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+int scsi_read_capacity(ccb *pccb, lbaint_t *capacity, unsigned long *blksz)
|
|
|
+{
|
|
|
+ *capacity = 0;
|
|
|
+
|
|
|
+ memset(pccb->cmd, 0, sizeof(pccb->cmd));
|
|
|
+ pccb->cmd[0] = SCSI_RD_CAPAC10;
|
|
|
+ pccb->cmd[1] = pccb->lun << 5;
|
|
|
+ pccb->cmdlen = 10;
|
|
|
+ pccb->msgout[0] = SCSI_IDENTIFY; /* NOT USED */
|
|
|
+
|
|
|
+ pccb->datalen = 8;
|
|
|
+ if (scsi_exec(pccb) != TRUE)
|
|
|
+ return 1;
|
|
|
+
|
|
|
+ *capacity = ((lbaint_t)pccb->pdata[0] << 24) |
|
|
|
+ ((lbaint_t)pccb->pdata[1] << 16) |
|
|
|
+ ((lbaint_t)pccb->pdata[2] << 8) |
|
|
|
+ ((lbaint_t)pccb->pdata[3]);
|
|
|
+
|
|
|
+ if (*capacity != 0xffffffff) {
|
|
|
+ /* Read capacity (10) was sufficient for this drive. */
|
|
|
+ *blksz = ((unsigned long)pccb->pdata[4] << 24) |
|
|
|
+ ((unsigned long)pccb->pdata[5] << 16) |
|
|
|
+ ((unsigned long)pccb->pdata[6] << 8) |
|
|
|
+ ((unsigned long)pccb->pdata[7]);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Read capacity (10) was insufficient. Use read capacity (16). */
|
|
|
+
|
|
|
+ memset(pccb->cmd, 0, sizeof(pccb->cmd));
|
|
|
+ pccb->cmd[0] = SCSI_RD_CAPAC16;
|
|
|
+ pccb->cmd[1] = 0x10;
|
|
|
+ pccb->cmdlen = 16;
|
|
|
+ pccb->msgout[0] = SCSI_IDENTIFY; /* NOT USED */
|
|
|
+
|
|
|
+ pccb->datalen = 16;
|
|
|
+ if (scsi_exec(pccb) != TRUE)
|
|
|
+ return 1;
|
|
|
+
|
|
|
+ *capacity = ((uint64_t)pccb->pdata[0] << 56) |
|
|
|
+ ((uint64_t)pccb->pdata[1] << 48) |
|
|
|
+ ((uint64_t)pccb->pdata[2] << 40) |
|
|
|
+ ((uint64_t)pccb->pdata[3] << 32) |
|
|
|
+ ((uint64_t)pccb->pdata[4] << 24) |
|
|
|
+ ((uint64_t)pccb->pdata[5] << 16) |
|
|
|
+ ((uint64_t)pccb->pdata[6] << 8) |
|
|
|
+ ((uint64_t)pccb->pdata[7]);
|
|
|
+
|
|
|
+ *blksz = ((uint64_t)pccb->pdata[8] << 56) |
|
|
|
+ ((uint64_t)pccb->pdata[9] << 48) |
|
|
|
+ ((uint64_t)pccb->pdata[10] << 40) |
|
|
|
+ ((uint64_t)pccb->pdata[11] << 32) |
|
|
|
+ ((uint64_t)pccb->pdata[12] << 24) |
|
|
|
+ ((uint64_t)pccb->pdata[13] << 16) |
|
|
|
+ ((uint64_t)pccb->pdata[14] << 8) |
|
|
|
+ ((uint64_t)pccb->pdata[15]);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
/************************************************************************************
|
|
|
* Some setup (fill-in) routines
|
|
@@ -530,23 +587,6 @@ void scsi_setup_test_unit_ready(ccb * pccb)
|
|
|
pccb->msgout[0]=SCSI_IDENTIFY; /* NOT USED */
|
|
|
}
|
|
|
|
|
|
-void scsi_setup_read_capacity(ccb * pccb)
|
|
|
-{
|
|
|
- pccb->cmd[0]=SCSI_RD_CAPAC;
|
|
|
- pccb->cmd[1]=pccb->lun<<5;
|
|
|
- pccb->cmd[2]=0;
|
|
|
- pccb->cmd[3]=0;
|
|
|
- pccb->cmd[4]=0;
|
|
|
- pccb->cmd[5]=0;
|
|
|
- pccb->cmd[6]=0;
|
|
|
- pccb->cmd[7]=0;
|
|
|
- pccb->cmd[8]=0;
|
|
|
- pccb->cmd[9]=0;
|
|
|
- pccb->cmdlen=10;
|
|
|
- pccb->msgout[0]=SCSI_IDENTIFY; /* NOT USED */
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
void scsi_setup_read_ext(ccb * pccb, unsigned long start, unsigned short blocks)
|
|
|
{
|
|
|
pccb->cmd[0]=SCSI_READ10;
|