diff options
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.c | 113 |
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) */ |