Alan Stern wrote: > This certainly does look like the classic Genesys Logic usb-storage > problem. The workaround that was added to 2.6.9 has helped many people, > but apparently it's not adequate for your drive. > > You could try increasing the internal time delay. If you edit the > drivers/usb/storage/transport.c file in the kernel source and search for > GENESYS, on the next line you'll see > > udelay(100); > > You could change the 100 to 200; maybe it will help.
Yes, it helped. :)) The appended patch fixes this problem for me. As I am not sure if waiting for additional 100 µs causes a noticeable difference in regard of performance, I wrote a few lines to distinguish the chips by idProduct and bcdDevice. I am not happy with the "magic numbers", what's the best way to get rid of them? Thank you very much for your help! Dieter Weber
*** linux-2.6.9/drivers/usb/storage/transport.c 2004-10-28 14:54:51.000000000 +0200 --- 2.6.9-modified/drivers/usb/storage/transport.c 2004-11-04 19:44:30.000000000 +0100 *************** *** 984,992 **** /* Genesys Logic interface chips need a 100us delay between the * command phase and the data phase */ ! if (us->pusb_dev->descriptor.idVendor == USB_VENDOR_ID_GENESYS) udelay(100); ! if (transfer_length) { unsigned int pipe = srb->sc_data_direction == DMA_FROM_DEVICE ? us->recv_bulk_pipe : us->send_bulk_pipe; --- 984,997 ---- /* Genesys Logic interface chips need a 100us delay between the * command phase and the data phase */ ! if (us->pusb_dev->descriptor.idVendor == USB_VENDOR_ID_GENESYS) { udelay(100); ! /* At least one Genesys Logic interface chip needs ! * even more delay */ ! if ( (us->pusb_dev->descriptor.idProduct == 0x0702) ! && (us->pusb_dev->descriptor.bcdDevice == 0x0002) ) ! udelay(100); ! } if (transfer_length) { unsigned int pipe = srb->sc_data_direction == DMA_FROM_DEVICE ? us->recv_bulk_pipe : us->send_bulk_pipe;