--- linux-2.6.25.9/drivers/usb/storage/transport.c.orig 2008-06-24 23:09:06.000000000 +0200 +++ linux-2.6.25.9/drivers/usb/storage/transport.c 2008-07-20 05:14:32.000000000 +0200 @@ -661,6 +661,21 @@ void usb_stor_invoke_transport(struct sc srb->result = SAM_STAT_GOOD; srb->sense_buffer[0] = 0x0; } + + /* JMicron JM20337 chipset bug workaround - BEGIN */ + if (us->pusb_dev->descriptor.idVendor == 0x152d && + us->pusb_dev->descriptor.idProduct == 0x2338 && + result == USB_STOR_TRANSPORT_FAILED && + /* Filemark 0, ignore EOM, ILI 0, no sense */ + (srb->sense_buffer[2] & 0xaf) == 0 && + /* No ASC or ASCQ */ + srb->sense_buffer[12] == 0 && + srb->sense_buffer[13] == 0) { + printk(KERN_WARNING "USB Storage - Working around the JMicron JM20337 chipset bug (idVendor=%04x, idProduct=%04x, NO_SENSE, ASC=0, ASCQ=0) - retrying the read operation\n", us->pusb_dev->descriptor.idVendor, us->pusb_dev->descriptor.idProduct); + srb->result = (DID_ERROR << 16) | (SUGGEST_RETRY << 24); + return; + } + /* JMicron JM20337 chipset bug workaround - END */ } /* Did we transfer less than the minimum amount required? */