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;

Reply via email to