This patch removes the (often troublesome) usb_stor_transfer_length() function. Greg, please apply.
We've finally gotten all the command initiators to send the correct values
in the srb->request_bufflen field, so this is no longer needed.
There are probably some sanity checks that can also be removed now, but
that's for a later patch.
Matt
# This is a BitKeeper generated patch for the following project:
# Project Name: greg k-h's linux 2.5 USB kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
# ChangeSet 1.662 -> 1.663
# drivers/usb/storage/transport.h 1.21 -> 1.22
# drivers/usb/storage/transport.c 1.74 -> 1.75
# drivers/usb/storage/freecom.c 1.24 -> 1.25
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 03/01/05 [EMAIL PROTECTED] 1.663
# Remove the usb_stor_transfer_length() function. We've now cleaned up
# all the callers so that the request_bufflen is the right value.
# --------------------------------------------
#
diff -Nru a/drivers/usb/storage/freecom.c b/drivers/usb/storage/freecom.c
--- a/drivers/usb/storage/freecom.c Sun Jan 5 17:20:38 2003
+++ b/drivers/usb/storage/freecom.c Sun Jan 5 17:20:38 2003
@@ -285,7 +285,7 @@
* and such will hang. */
US_DEBUGP("Device indicates that it has %d bytes available\n",
le16_to_cpu (fst->Count));
- US_DEBUGP("SCSI requested %d\n", usb_stor_transfer_length(srb));
+ US_DEBUGP("SCSI requested %d\n", srb->request_bufflen);
/* Find the length we desire to read. */
switch (srb->cmnd[0]) {
@@ -296,7 +296,7 @@
length = fst->Count;
break;
default:
- length = usb_stor_transfer_length (srb);
+ length = srb->request_bufflen;
}
/* verify that this amount is legal */
diff -Nru a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c
--- a/drivers/usb/storage/transport.c Sun Jan 5 17:20:38 2003
+++ b/drivers/usb/storage/transport.c Sun Jan 5 17:20:38 2003
@@ -56,307 +56,6 @@
#include <linux/slab.h>
/***********************************************************************
- * Helper routines
- ***********************************************************************/
-
-/* Calculate the length of the data transfer (not the command) for any
- * given SCSI command
- */
-unsigned int usb_stor_transfer_length(Scsi_Cmnd *srb)
-{
- int i;
- int doDefault = 0;
- unsigned int len = 0;
- unsigned int total = 0;
- struct scatterlist *sg;
-
- /* This table tells us:
- X = command not supported
- L = return length in cmnd[4] (8 bits).
- M = return length in cmnd[8] (8 bits).
- G = return length in cmnd[3] and cmnd[4] (16 bits)
- H = return length in cmnd[7] and cmnd[8] (16 bits)
- I = return length in cmnd[8] and cmnd[9] (16 bits)
- C = return length in cmnd[2] to cmnd[5] (32 bits)
- D = return length in cmnd[6] to cmnd[9] (32 bits)
- B = return length in blocksize so we use buff_len
- R = return length in cmnd[2] to cmnd[4] (24 bits)
- S = return length in cmnd[3] to cmnd[5] (24 bits)
- T = return length in cmnd[6] to cmnd[8] (24 bits)
- U = return length in cmnd[7] to cmnd[9] (24 bits)
- 0-9 = fixed return length
- V = 20 bytes
- W = 24 bytes
- Z = return length is mode dependant or not in command, use buff_len
- */
-
- static char *lengths =
-
- /* 0123456789ABCDEF 0123456789ABCDEF */
-
- "00XLZ6XZBXBBXXXB" "00LBBLG0R0L0GG0X" /* 00-1F */
- "XXXXT8XXB4B0BBBB" "ZZZ0B00HCSSZTBHH" /* 20-3F */
- "M0HHB0X000H0HH0X" "XHH0HHXX0TH0H0XX" /* 40-5F */
- "XXXXXXXXXXXXXXXX" "XXXXXXXXXXXXXXXX" /* 60-7F */
- "XXXXXXXXXXXXXXXX" "XXXXXXXXXXXXXXXX" /* 80-9F */
- "X0XXX00XB0BXBXBB" "ZZZ0XUIDU000XHBX" /* A0-BF */
- "XXXXXXXXXXXXXXXX" "XXXXXXXXXXXXXXXX" /* C0-DF */
- "XDXXXXXXXXXXXXXX" "XXW00HXXXXXXXXXX"; /* E0-FF */
-
- /* Commands checked in table:
-
- CHANGE_DEFINITION 40
- COMPARE 39
- COPY 18
- COPY_AND_VERIFY 3a
- ERASE 19
- ERASE_10 2c
- ERASE_12 ac
- EXCHANGE_MEDIUM a6
- FORMAT_UNIT 04
- GET_DATA_BUFFER_STATUS 34
- GET_MESSAGE_10 28
- GET_MESSAGE_12 a8
- GET_WINDOW 25 !!! Has more data than READ_CAPACITY, need to fix table
- INITIALIZE_ELEMENT_STATUS 07 !!! REASSIGN_BLOCKS luckily uses buff_len
- INQUIRY 12
- LOAD_UNLOAD 1b
- LOCATE 2b
- LOCK_UNLOCK_CACHE 36
- LOG_SELECT 4c
- LOG_SENSE 4d
- MEDIUM_SCAN 38 !!! This was M
- MODE_SELECT6 15
- MODE_SELECT_10 55
- MODE_SENSE_6 1a
- MODE_SENSE_10 5a
- MOVE_MEDIUM a5
- OBJECT_POSITION 31 !!! Same as SEARCH_DATA_EQUAL
- PAUSE_RESUME 4b
- PLAY_AUDIO_10 45
- PLAY_AUDIO_12 a5
- PLAY_AUDIO_MSF 47
- PLAY_AUDIO_TRACK_INDEX 48
- PLAY_AUDIO_TRACK_RELATIVE_10 49
- PLAY_AUDIO_TRACK_RELATIVE_12 a9
- POSITION_TO_ELEMENT 2b
- PRE-FETCH 34
- PREVENT_ALLOW_MEDIUM_REMOVAL 1e
- PRINT 0a !!! Same as WRITE_6 but is always in bytes
- READ_6 08
- READ_10 28
- READ_12 a8
- READ_BLOCK_LIMITS 05
- READ_BUFFER 3c
- READ_CAPACITY 25
- READ_CDROM_CAPACITY 25
- READ_DEFECT_DATA 37
- READ_DEFECT_DATA_12 b7
- READ_ELEMENT_STATUS b8 !!! Think this is in bytes
- READ_GENERATION 29 !!! Could also be M?
- READ_HEADER 44 !!! This was L
- READ_LONG 3e
- READ_POSITION 34 !!! This should be V but conflicts with PRE-FETCH
- READ_REVERSE 0f
- READ_SUB-CHANNEL 42 !!! Is this in bytes?
- READ_TOC 43 !!! Is this in bytes?
- READ_UPDATED_BLOCK 2d
- REASSIGN_BLOCKS 07
- RECEIVE 08 !!! Same as READ_6 probably in bytes though
- RECEIVE_DIAGNOSTIC_RESULTS 1c
- RECOVER_BUFFERED_DATA 14 !!! For PRINTERs this is bytes
- RELEASE_UNIT 17
- REQUEST_SENSE 03
- REQUEST_VOLUME_ELEMENT_ADDRESS b5 !!! Think this is in bytes
- RESERVE_UNIT 16
- REWIND 01
- REZERO_UNIT 01
- SCAN 1b !!! Conflicts with various commands, should be L
- SEARCH_DATA_EQUAL 31
- SEARCH_DATA_EQUAL_12 b1
- SEARCH_DATA_LOW 30
- SEARCH_DATA_LOW_12 b0
- SEARCH_DATA_HIGH 32
- SEARCH_DATA_HIGH_12 b2
- SEEK_6 0b !!! Conflicts with SLEW_AND_PRINT
- SEEK_10 2b
- SEND 0a !!! Same as WRITE_6, probably in bytes though
- SEND 2a !!! Similar to WRITE_10 but for scanners
- SEND_DIAGNOSTIC 1d
- SEND_MESSAGE_6 0a !!! Same as WRITE_6 - is in bytes
- SEND_MESSAGE_10 2a !!! Same as WRITE_10 - is in bytes
- SEND_MESSAGE_12 aa !!! Same as WRITE_12 - is in bytes
- SEND_OPC 54
- SEND_VOLUME_TAG b6 !!! Think this is in bytes
- SET_LIMITS 33
- SET_LIMITS_12 b3
- SET_WINDOW 24
- SLEW_AND_PRINT 0b !!! Conflicts with SEEK_6
- SPACE 11
- START_STOP_UNIT 1b
- STOP_PRINT 1b
- SYNCHRONIZE_BUFFER 10
- SYNCHRONIZE_CACHE 35
- TEST_UNIT_READY 00
- UPDATE_BLOCK 3d
- VERIFY 13
- VERIFY 2f
- VERIFY_12 af
- WRITE_6 0a
- WRITE_10 2a
- WRITE_12 aa
- WRITE_AND_VERIFY 2e
- WRITE_AND_VERIFY_12 ae
- WRITE_BUFFER 3b
- WRITE_FILEMARKS 10
- WRITE_LONG 3f
- WRITE_SAME 41
- */
-
- if (srb->sc_data_direction == SCSI_DATA_WRITE) {
- doDefault = 1;
- }
- else
- switch (lengths[srb->cmnd[0]]) {
- case 'L':
- len = srb->cmnd[4];
- break;
-
- case 'M':
- len = srb->cmnd[8];
- break;
-
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- len = lengths[srb->cmnd[0]]-'0';
- break;
-
- case 'G':
- len = (((unsigned int)srb->cmnd[3])<<8) |
- srb->cmnd[4];
- break;
-
- case 'H':
- len = (((unsigned int)srb->cmnd[7])<<8) |
- srb->cmnd[8];
- break;
-
- case 'I':
- len = (((unsigned int)srb->cmnd[8])<<8) |
- srb->cmnd[9];
- break;
-
- case 'R':
- len = (((unsigned int)srb->cmnd[2])<<16) |
- (((unsigned int)srb->cmnd[3])<<8) |
- srb->cmnd[4];
- break;
-
- case 'S':
- len = (((unsigned int)srb->cmnd[3])<<16) |
- (((unsigned int)srb->cmnd[4])<<8) |
- srb->cmnd[5];
- break;
-
- case 'T':
- len = (((unsigned int)srb->cmnd[6])<<16) |
- (((unsigned int)srb->cmnd[7])<<8) |
- srb->cmnd[8];
- break;
-
- case 'U':
- len = (((unsigned int)srb->cmnd[7])<<16) |
- (((unsigned int)srb->cmnd[8])<<8) |
- srb->cmnd[9];
- break;
-
- case 'C':
- len = (((unsigned int)srb->cmnd[2])<<24) |
- (((unsigned int)srb->cmnd[3])<<16) |
- (((unsigned int)srb->cmnd[4])<<8) |
- srb->cmnd[5];
- break;
-
- case 'D':
- len = (((unsigned int)srb->cmnd[6])<<24) |
- (((unsigned int)srb->cmnd[7])<<16) |
- (((unsigned int)srb->cmnd[8])<<8) |
- srb->cmnd[9];
- break;
-
- case 'V':
- len = 20;
- break;
-
- case 'W':
- len = 24;
- break;
-
- case 'B':
- /* Use buffer size due to different block sizes */
- doDefault = 1;
- break;
-
- case 'X':
- US_DEBUGP("Error: UNSUPPORTED COMMAND %02X\n",
- srb->cmnd[0]);
- doDefault = 1;
- break;
-
- case 'Z':
- /* Use buffer size due to mode dependence */
- doDefault = 1;
- break;
-
- default:
- US_DEBUGP("Error: COMMAND %02X out of range or table
inconsistent (%c).\n",
- srb->cmnd[0], lengths[srb->cmnd[0]] );
- doDefault = 1;
- }
-
- if ( doDefault == 1 ) {
- /* Are we going to scatter gather? */
- if (srb->use_sg) {
- /* Add up the sizes of all the sg segments */
- sg = (struct scatterlist *) srb->request_buffer;
- for (i = 0; i < srb->use_sg; i++)
- total += sg[i].length;
- len = total;
-
- /* Double-check to see if the advertised buffer
- * length less than the actual buffer length --
- * in other words, we should tend towards the
- * conservative side for data transfers.
- */
- if (len > srb->request_bufflen)
- len = srb->request_bufflen;
- }
- else
- /* Just return the length of the buffer */
- len = srb->request_bufflen;
- }
-
- /* According to the linux-scsi people, any command sent which
- * violates this invariant is a bug. In the hopes of removing
- * all the complex logic above, let's find them and eliminate them.
- */
- if (len != srb->request_bufflen) {
- printk(KERN_ERR "USB len=%d, request_bufflen=%d\n", len,
srb->request_bufflen);
- dump_stack();
- }
-
- return len;
-}
-
-/***********************************************************************
* Data transfer routines
***********************************************************************/
@@ -1031,7 +730,7 @@
int usb_stor_CBI_transport(Scsi_Cmnd *srb, struct us_data *us)
{
- unsigned int transfer_length = usb_stor_transfer_length(srb);
+ unsigned int transfer_length = srb->request_bufflen;
int result;
/* COMMAND STAGE */
@@ -1115,7 +814,7 @@
*/
int usb_stor_CB_transport(Scsi_Cmnd *srb, struct us_data *us)
{
- unsigned int transfer_length = usb_stor_transfer_length(srb);
+ unsigned int transfer_length = srb->request_bufflen;
int result;
/* COMMAND STAGE */
@@ -1186,7 +885,7 @@
{
struct bulk_cb_wrap bcb;
struct bulk_cs_wrap bcs;
- unsigned int transfer_length = usb_stor_transfer_length(srb);
+ unsigned int transfer_length = srb->request_bufflen;
int result;
/* set up the command wrapper */
diff -Nru a/drivers/usb/storage/transport.h b/drivers/usb/storage/transport.h
--- a/drivers/usb/storage/transport.h Sun Jan 5 17:20:38 2003
+++ b/drivers/usb/storage/transport.h Sun Jan 5 17:20:38 2003
@@ -154,7 +154,6 @@
extern int usb_stor_Bulk_max_lun(struct us_data*);
extern int usb_stor_Bulk_reset(struct us_data*);
-extern unsigned int usb_stor_transfer_length(Scsi_Cmnd*);
extern void usb_stor_invoke_transport(Scsi_Cmnd*, struct us_data*);
extern void usb_stor_abort_transport(struct us_data*);
--
Matthew Dharm Home: [EMAIL PROTECTED]
Maintainer, Linux USB Mass Storage Driver
Type "format c:" That should fix everything.
-- Greg
User Friendly, 12/18/1997
msg10382/pgp00000.pgp
Description: PGP signature
