Re: PROBLEM: usb not working with 2.4.8-ac8

Pete Zaitcev (zaitcev@redhat.com)
Tue, 21 Aug 2001 20:04:26 -0400


> 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/