summaryrefslogtreecommitdiffstats
path: root/uClinux-2.4.20-uc1/drivers/usb/storage/protocol.c
diff options
context:
space:
mode:
Diffstat (limited to 'uClinux-2.4.20-uc1/drivers/usb/storage/protocol.c')
-rw-r--r--uClinux-2.4.20-uc1/drivers/usb/storage/protocol.c113
1 files changed, 113 insertions, 0 deletions
diff --git a/uClinux-2.4.20-uc1/drivers/usb/storage/protocol.c b/uClinux-2.4.20-uc1/drivers/usb/storage/protocol.c
index ea93770..2b7b5f7 100644
--- a/uClinux-2.4.20-uc1/drivers/usb/storage/protocol.c
+++ b/uClinux-2.4.20-uc1/drivers/usb/storage/protocol.c
@@ -91,7 +91,11 @@ void usb_stor_qic157_command(Scsi_Cmnd *srb, struct us_data *us)
* a unsigned char cmnd[12], so we know we have storage available
*/
for (; srb->cmd_len<12; srb->cmd_len++)
+#ifndef CONFIG_BOARD_W90N745
srb->cmnd[srb->cmd_len] = 0;
+#else
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[srb->cmd_len] = 0;
+#endif
/* set command length to 12 bytes */
srb->cmd_len = 12;
@@ -118,7 +122,11 @@ void usb_stor_ATAPI_command(Scsi_Cmnd *srb, struct us_data *us)
/* Pad the ATAPI command with zeros */
for (; srb->cmd_len<12; srb->cmd_len++)
+#ifndef CONFIG_BOARD_W90N745
srb->cmnd[srb->cmd_len] = 0;
+#else
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[srb->cmd_len] = 0;
+#endif
/* set command length to 12 bytes */
srb->cmd_len = 12;
@@ -132,6 +140,7 @@ void usb_stor_ATAPI_command(Scsi_Cmnd *srb, struct us_data *us)
/* save the command so we can tell what it was */
old_cmnd = srb->cmnd[0];
+#ifndef CONFIG_BOARD_W90N745
srb->cmnd[11] = 0;
srb->cmnd[10] = 0;
srb->cmnd[9] = 0;
@@ -144,12 +153,27 @@ void usb_stor_ATAPI_command(Scsi_Cmnd *srb, struct us_data *us)
srb->cmnd[2] = srb->cmnd[2];
srb->cmnd[1] = srb->cmnd[1];
srb->cmnd[0] = srb->cmnd[0] | 0x40;
+#else
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[11] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[10] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[9] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[8] = srb->cmnd[4];
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[7] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[6] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[5] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[4] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[3] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[2] = srb->cmnd[2];
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[1] = srb->cmnd[1];
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[0] = srb->cmnd[0] | 0x40;
+#endif
break;
/* change READ_6/WRITE_6 to READ_10/WRITE_10, which
* are ATAPI commands */
case WRITE_6:
case READ_6:
+#ifndef CONFIG_BOARD_W90N745
srb->cmnd[11] = 0;
srb->cmnd[10] = 0;
srb->cmnd[9] = 0;
@@ -162,6 +186,20 @@ void usb_stor_ATAPI_command(Scsi_Cmnd *srb, struct us_data *us)
srb->cmnd[2] = 0;
srb->cmnd[1] = srb->cmnd[1] & 0xE0;
srb->cmnd[0] = srb->cmnd[0] | 0x20;
+#else
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[11] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[10] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[9] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[8] = srb->cmnd[4];
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[7] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[6] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[5] = srb->cmnd[3];
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[4] = srb->cmnd[2];
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[3] = srb->cmnd[1] & 0x1F;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[2] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[1] = srb->cmnd[1] & 0xE0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[0] = srb->cmnd[0] | 0x20;
+#endif
break;
} /* end switch on cmnd[0] */
@@ -202,7 +240,11 @@ void usb_stor_ufi_command(Scsi_Cmnd *srb, struct us_data *us)
/* for INQUIRY, UFI devices only ever return 36 bytes */
case INQUIRY:
+#ifndef CONFIG_BOARD_W90N745
srb->cmnd[4] = 36;
+#else
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[4] = 36;
+#endif
break;
/* change MODE_SENSE/MODE_SELECT from 6 to 10 byte commands */
@@ -211,12 +253,19 @@ void usb_stor_ufi_command(Scsi_Cmnd *srb, struct us_data *us)
/* save the command so we can tell what it was */
old_cmnd = srb->cmnd[0];
+#ifndef CONFIG_BOARD_W90N745
srb->cmnd[11] = 0;
srb->cmnd[10] = 0;
srb->cmnd[9] = 0;
+#else
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[11] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[10] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[9] = 0;
+#endif
/* if we're sending data, we send all. If getting data,
* get the minimum */
+#ifndef CONFIG_BOARD_W90N745
if (srb->cmnd[0] == MODE_SELECT)
srb->cmnd[8] = srb->cmnd[4];
else
@@ -230,6 +279,21 @@ void usb_stor_ufi_command(Scsi_Cmnd *srb, struct us_data *us)
srb->cmnd[2] = srb->cmnd[2];
srb->cmnd[1] = srb->cmnd[1];
srb->cmnd[0] = srb->cmnd[0] | 0x40;
+#else
+ if (srb->cmnd[0] == MODE_SELECT)
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[8] = srb->cmnd[4];
+ else
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[8] = 8;
+
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[7] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[6] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[5] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[4] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[3] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[2] = srb->cmnd[2];
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[1] = srb->cmnd[1];
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[0] = srb->cmnd[0] | 0x40;
+#endif
break;
/* again, for MODE_SENSE_10, we get the minimum (8) */
@@ -240,13 +304,18 @@ void usb_stor_ufi_command(Scsi_Cmnd *srb, struct us_data *us)
/* for REQUEST_SENSE, UFI devices only ever return 18 bytes */
case REQUEST_SENSE:
+#ifndef CONFIG_BOARD_W90N745
srb->cmnd[4] = 18;
+#else
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[4] = 18;
+#endif
break;
/* change READ_6/WRITE_6 to READ_10/WRITE_10, which
* are UFI commands */
case WRITE_6:
case READ_6:
+#ifndef CONFIG_BOARD_W90N745
srb->cmnd[11] = 0;
srb->cmnd[10] = 0;
srb->cmnd[9] = 0;
@@ -259,6 +328,20 @@ void usb_stor_ufi_command(Scsi_Cmnd *srb, struct us_data *us)
srb->cmnd[2] = 0;
srb->cmnd[1] = srb->cmnd[1] & 0xE0;
srb->cmnd[0] = srb->cmnd[0] | 0x20;
+#else
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[11] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[10] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[9] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[8] = srb->cmnd[4];
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[7] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[6] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[5] = srb->cmnd[3];
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[4] = srb->cmnd[2];
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[3] = srb->cmnd[1] & 0x1F;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[2] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[1] = srb->cmnd[1] & 0xE0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[0] = srb->cmnd[0] | 0x20;
+#endif
break;
} /* end switch on cmnd[0] */
@@ -297,6 +380,7 @@ void usb_stor_transparent_scsi_command(Scsi_Cmnd *srb, struct us_data *us)
case WRITE_6:
case READ_6:
srb->cmd_len = 12;
+#ifndef CONFIG_BOARD_W90N745
srb->cmnd[11] = 0;
srb->cmnd[10] = 0;
srb->cmnd[9] = 0;
@@ -309,12 +393,27 @@ void usb_stor_transparent_scsi_command(Scsi_Cmnd *srb, struct us_data *us)
srb->cmnd[2] = 0;
srb->cmnd[1] = srb->cmnd[1] & 0xE0;
srb->cmnd[0] = srb->cmnd[0] | 0x20;
+#else
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[11] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[10] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[9] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[8] = srb->cmnd[4];
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[7] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[6] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[5] = srb->cmnd[3];
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[4] = srb->cmnd[2];
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[3] = srb->cmnd[1] & 0x1F;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[2] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[1] = srb->cmnd[1] & 0xE0;
+ ((unsigned char *)((unsigned long)srb->cmnd |0x80000000))[0] = srb->cmnd[0] | 0x20;
+#endif
break;
/* convert MODE_SELECT data here */
case MODE_SENSE:
case MODE_SELECT:
srb->cmd_len = 12;
+#ifndef CONFIG_BOARD_W90N745
srb->cmnd[11] = 0;
srb->cmnd[10] = 0;
srb->cmnd[9] = 0;
@@ -327,6 +426,20 @@ void usb_stor_transparent_scsi_command(Scsi_Cmnd *srb, struct us_data *us)
srb->cmnd[2] = srb->cmnd[2];
srb->cmnd[1] = srb->cmnd[1];
srb->cmnd[0] = srb->cmnd[0] | 0x40;
+#else
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[11] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[10] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[9] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[8] = srb->cmnd[4];
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[7] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[6] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[5] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[4] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[3] = 0;
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[2] = srb->cmnd[2];
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[1] = srb->cmnd[1];
+ ((unsigned char *)((unsigned long)srb->cmnd | 0x80000000))[0] = srb->cmnd[0] | 0x40;
+#endif
break;
} /* switch (srb->cmnd[0]) */
} /* if (us->flags & US_FL_MODE_XLATE) */