> On Saturday 04 December 2004 11:51 am, Alan Stern wrote:

> > In fact, I suggested skipping the class-specific reset entirely and 
> > proceeding directly to the port reset, because that's what Windows does.

That worked for me, as in the attached patch.  It turned
out that the class-specific reset was succeeding (because
the "port reset only if class-specific failed" logic
never did a port reset!), but was effectively a NOP
(because nothing seemed to happen).  So this wasn't a
case of drive firmware (Maxtor) not responding any more...

I did notice two odd things with this patch though:

 - It deadlocked if I tried the "lock_for_reset" stuff,
   so I commented that out.

 - Multiple resets were needed; see the log below.
   The third reset happened about 35 seconds after
   the sequence started, and until that happened it
   seemed like absolutely nothing happened.

I think it might be a good idea to try out a cleaned-up
version of this patch more widely.

- Dave
--- 1.105/drivers/usb/storage/transport.c	2004-11-22 15:12:24 -08:00
+++ edited/drivers/usb/storage/transport.c	2004-12-07 09:50:54 -08:00
@@ -1124,11 +1131,28 @@
 	clear_bit(US_FLIDX_ABORTING, &us->flags);
 	scsi_unlock(us->host);
 
+	/* The class reset won't generally solve the problem, maybe
+	 * because Windows won't use it.  So try a hard reset first,
+	 * if it's safe; likely that'll work well.
+	 */
+	if (us->pusb_dev->actconfig->desc.bNumInterfaces == 1) {
+// lock_device_for_reset() seems to deadlock things...
+//		result = usb_lock_device_for_reset(us->pusb_dev, us->pusb_intf);
+//		if (result == 0) {
+			result = usb_reset_device(us->pusb_dev);
+			dev_warn(&us->pusb_intf->dev, "usb reset --> %d\n",
+				result);
+//			usb_unlock_device(us->pusb_dev);
+//		}
+	} else
+		result = -EINVAL;
+
 	/* A 20-second timeout may seem rather long, but a LaCie
 	 * StudioDrive USB2 device takes 16+ seconds to get going
 	 * following a powerup or USB attach event.
 	 */
-	result = usb_stor_control_msg(us, us->send_ctrl_pipe,
+	if (result < 0)
+		result = usb_stor_control_msg(us, us->send_ctrl_pipe,
 			request, requesttype, value, index, data, size,
 			20*HZ);
 	if (result < 0) {
--- 1.95/drivers/usb/storage/usb.c	2004-11-14 16:41:08 -08:00
+++ edited/drivers/usb/storage/usb.c	2004-12-07 08:07:51 -08:00
@@ -993,6 +998,11 @@
 	result = get_pipes(us);
 	if (result)
 		goto BadDevice;
+
+	dev_info(&intf->dev, "%s over %s\n",
+		us->protocol_name,
+		us->transport_name);
+
 
 	/* Acquire all the other resources and add the host */
 	result = usb_stor_acquire_resources(us);
        After about 1/2 hour continuous usb-storage I/O, the
        first error caused a reset.
        
        The "reset/N" means the Nth transport reset in that routine.

38:45 ehci_hcd 0000:00:08.3: devpath 6 ep2out 3strikes
38:45 usb_stor_invoke_transport reset/1
38:45 usb_stor_Bulk_reset reset
38:45 ehci_hcd 0000:00:08.3: GetStatus port 6 status 001803 POWER sig=j  CSC 
CONNECT
38:45 hub 1-0:1.0: port 6 not enabled, trying reset again...
38:46 ehci_hcd 0000:00:08.3: port 6 high speed
38:46 ehci_hcd 0000:00:08.3: GetStatus port 6 status 001005 POWER sig=se0  PE 
CONNECT
38:46 usb 1-6: reset high speed USB device using ehci_hcd and address 2
38:46 ehci_hcd 0000:00:08.3: port 6 high speed
38:46 ehci_hcd 0000:00:08.3: GetStatus port 6 status 001005 POWER sig=se0  PE 
CONNECT
38:46 usb-storage 1-6:1.0: usb reset --> 0

        Long delay here ...

39:22 usb_stor_invoke_transport reset/3
39:22 usb_stor_Bulk_reset reset
39:22 ehci_hcd 0000:00:08.3: port 6 high speed
39:22 ehci_hcd 0000:00:08.3: GetStatus port 6 status 001005 POWER sig=se0  PE 
CONNECT
39:22 usb 1-6: reset high speed USB device using ehci_hcd and address 2
39:22 ehci_hcd 0000:00:08.3: port 6 high speed
39:22 ehci_hcd 0000:00:08.3: GetStatus port 6 status 001005 POWER sig=se0  PE 
CONNECT
39:24 usb-storage 1-6:1.0: usb reset --> 0

        Then it went back and finished.

Reply via email to