Re: PROBLEM: usb not working with 2.4.8-ac8

From: Pete Zaitcev (zaitcev@redhat.com)
Date: Tue Aug 21 2001 - 19:04:26 EST


> Looks like the change int he usb_start_wait_urb code is a problem.

Yes, something was not right with my change.
I am trying to coax people into testing this (on top of -ac8):

--- linux-2.4.8-ac8/drivers/usb/usb.c Tue Aug 21 14:39:55 2001
+++ linux-2.4.8-ac8-niph/drivers/usb/usb.c Tue Aug 21 16:02:01 2001
@@ -1080,10 +1080,17 @@
         current->state = TASK_RUNNING;
         remove_wait_queue(&awd.wqh, &wait);
 
- if (!timeout) {
- printk("usb_control/bulk_msg: timeout\n");
- usb_unlink_urb(urb); // remove urb safely
- status = -ETIMEDOUT;
+ if (!awd.done) {
+ if (urb->status != -EINPROGRESS) { /* No callback?!! */
+ printk(KERN_ERR "usb: raced timeout, "
+ "pipe 0x%x status %d time left %d\n",
+ urb->pipe, urb->status, timeout);
+ status = urb->status;
+ } else {
+ printk("usb_control/bulk_msg: timeout\n");
+ usb_unlink_urb(urb); // remove urb safely
+ status = -ETIMEDOUT;
+ }
         } else
                 status = urb->status;
 

> I suspect either you need to add wmb() and rmb() to stop misoptimisations
> on done (along with making it (!timeout && !awd.done)

Arjan said so too - I'll add them later just in case.
About (!timeout && !awd.done) - it's not going to be enough,
I think. I suspect that callback is not delivered at all
in some circumstances, or something really screwy like that.

> there is a signal related problem - if so making it set the state
> to TASK_UNINTERRUPTIBLE might cure it

I tried that first and it worked, but someone disagreed. Dunno...

-- Pete
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Thu Aug 23 2001 - 21:00:46 EST