ChangeSet 1.1079.1.3, 2003/07/14 09:48:18-07:00, [EMAIL PROTECTED]
[PATCH] USB: Implement US_FL_FIX_CAPACITY for 2.4
On Wed, 9 Jul 2003, Greg KH wrote:
> After applying all three patches here (as49, as50, as51) I get the
> following build error:
>
> In file included from usb.c:190:
> unusual_devs.h:562: `US_FL_FIX_CAPACITY' undeclared here (not in a function)
> unusual_devs.h:562: initializer element is not constant
> unusual_devs.h:562: (near initialization for `us_unusual_dev_list[72].flags')
>
> Care to send me a patch to fix this up?
This should fix everything. It defines the new flag and adds the
corresponding implementation.
drivers/usb/storage/protocol.c | 54 ++++++++++++++++++++++++++++++++++-------
drivers/usb/storage/usb.h | 1
2 files changed, 47 insertions(+), 8 deletions(-)
diff -Nru a/drivers/usb/storage/protocol.c b/drivers/usb/storage/protocol.c
--- a/drivers/usb/storage/protocol.c Mon Jul 14 10:04:02 2003
+++ b/drivers/usb/storage/protocol.c Mon Jul 14 10:04:02 2003
@@ -54,6 +54,22 @@
* Helper routines
***********************************************************************/
+static void *
+find_data_location(Scsi_Cmnd *srb) {
+ if (srb->use_sg) {
+ /*
+ * This piece of code only works if the first page is
+ * big enough to hold more than 3 bytes -- which is
+ * _very_ likely.
+ */
+ struct scatterlist *sg;
+
+ sg = (struct scatterlist *) srb->request_buffer;
+ return (void *) sg[0].address;
+ } else
+ return (void *) srb->request_buffer;
+}
+
/* Fix-up the return data from an INQUIRY command to show
* ANSI SCSI rev 2 so we don't confuse the SCSI layers above us
*/
@@ -67,19 +83,37 @@
US_DEBUGP("Fixing INQUIRY data to show SCSI rev 2\n");
- /* find the location of the data */
- if (srb->use_sg) {
- struct scatterlist *sg;
-
- sg = (struct scatterlist *) srb->request_buffer;
- data_ptr = (unsigned char *) sg[0].address;
- } else
- data_ptr = (unsigned char *)srb->request_buffer;
+ data_ptr = find_data_location(srb);
/* Change the SCSI revision number */
data_ptr[2] = (data_ptr[2] & ~7) | 2;
}
+/*
+ * Fix-up the return data from a READ CAPACITY command. My Feiya reader
+ * returns a value that is 1 too large.
+ */
+static void fix_read_capacity(Scsi_Cmnd *srb)
+{
+ unsigned char *dp;
+ unsigned long capacity;
+
+ /* verify that it's a READ CAPACITY command */
+ if (srb->cmnd[0] != READ_CAPACITY)
+ return;
+
+ dp = find_data_location(srb);
+
+ capacity = (dp[0]<<24) + (dp[1]<<16) + (dp[2]<<8) + (dp[3]);
+ US_DEBUGP("US: Fixing capacity: from %ld to %ld\n",
+ capacity+1, capacity);
+ capacity--;
+ dp[0] = (capacity >> 24);
+ dp[1] = (capacity >> 16);
+ dp[2] = (capacity >> 8);
+ dp[3] = (capacity);
+}
+
/***********************************************************************
* Protocol routines
***********************************************************************/
@@ -345,6 +379,10 @@
/* fix the INQUIRY data if necessary */
fix_inquiry_data(srb);
+
+ /* Fix the READ CAPACITY result if necessary */
+ if (us->flags & US_FL_FIX_CAPACITY)
+ fix_read_capacity(srb);
}
}
diff -Nru a/drivers/usb/storage/usb.h b/drivers/usb/storage/usb.h
--- a/drivers/usb/storage/usb.h Mon Jul 14 10:04:02 2003
+++ b/drivers/usb/storage/usb.h Mon Jul 14 10:04:02 2003
@@ -102,6 +102,7 @@
#define US_FL_IGNORE_SER 0x00000010 /* Ignore the serial number given */
#define US_FL_SCM_MULT_TARG 0x00000020 /* supports multiple targets */
#define US_FL_FIX_INQUIRY 0x00000040 /* INQUIRY response needs fixing */
+#define US_FL_FIX_CAPACITY 0x00000080 /* READ CAPACITY response too big */
#define USB_STOR_STRING_LEN 32
-------------------------------------------------------
This SF.Net email sponsored by: Parasoft
Error proof Web apps, automate testing & more.
Download & eval WebKing and get a free book.
www.parasoft.com/bulletproofapps1
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel