ChangeSet 1.1011, 2003/03/05 13:51:05-08:00, oliver@neukum.name

[PATCH] USB: work around for a firmware bug of some scanners

this makes Elite II scanners much more useable. It's against 2.4.
   - short command work around


 drivers/usb/hpusbscsi.c |   20 ++++++++++++++++++--
 drivers/usb/hpusbscsi.h |    1 +
 2 files changed, 19 insertions(+), 2 deletions(-)


diff -Nru a/drivers/usb/hpusbscsi.c b/drivers/usb/hpusbscsi.c
--- a/drivers/usb/hpusbscsi.c	Thu Mar  6 14:24:25 2003
+++ b/drivers/usb/hpusbscsi.c	Thu Mar  6 14:24:25 2003
@@ -127,6 +127,9 @@
 	init_waitqueue_head (&new->deathrow);
 	init_MUTEX(&new->lock);
 	INIT_LIST_HEAD (&new->lh);
+	
+	if (id->idVendor == 0x0686 && id->idProduct == 0x4004)
+		new->need_short_workaround = 1;
 
 
 
@@ -340,7 +343,7 @@
 {
 	struct hpusbscsi* hpusbscsi = (struct hpusbscsi*)(srb->host->hostdata[0]);
 	usb_urb_callback usb_callback;
-	int res;
+	int res, passed_length;
 
 	spin_unlock_irq(&io_request_lock);
 
@@ -359,6 +362,19 @@
 		callback(srb);
 		goto out;
 	}
+	
+	/* otto fix - the Scan Elite II has a 5 second
+	* delay anytime the srb->cmd_len=6
+	* This causes it to run very slowly unless we
+	* pad the command length to 10 */
+        
+	if (hpusbscsi -> need_short_workaround && srb->cmd_len < 10) {
+		memset(srb->cmnd + srb->cmd_len, 0, 10 - srb->cmd_len);
+		passed_length = 10;
+	} else {
+		passed_length = srb->cmd_len;
+	}
+        
 
 	/* Now we need to decide which callback to give to the urb we send the command with */
 
@@ -404,7 +420,7 @@
 		hpusbscsi->dev,
 		usb_sndbulkpipe(hpusbscsi->dev,hpusbscsi->ep_out),
 		srb->cmnd,
-		srb->cmd_len,
+		passed_length,
 		usb_callback,
 		hpusbscsi
 	);
diff -Nru a/drivers/usb/hpusbscsi.h b/drivers/usb/hpusbscsi.h
--- a/drivers/usb/hpusbscsi.h	Thu Mar  6 14:24:25 2003
+++ b/drivers/usb/hpusbscsi.h	Thu Mar  6 14:24:25 2003
@@ -20,6 +20,7 @@
         int ep_in;
         int ep_int;
         int interrupt_interval;
+	int need_short_workaround;
 
         struct Scsi_Host *host;
         Scsi_Host_Template ctempl;
