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;