This fixes a problem that I've not run into and is difficult to trigger,
but definately a bug. We locked urb->lock, when we meant u->lock. It also
cleans up the code a little to make it easier to understand and removes
an obsolete comment.
Greg, please apply to 2.4 and 2.5.
JE
--- linux-2.4.19-pre6.orig/drivers/usb/uhci.c Sun Apr 7 16:27:23 2002
+++ linux-2.4.19-pre6/drivers/usb/uhci.c Sun Apr 7 16:28:23 2002
@@ -1837,10 +1837,6 @@
uhci_dec_fsbr(uhci, urb);
- /* There is a race with updating IOC in here, but it's not worth */
- /* trying to fix since this is merely an optimization. The only */
- /* time we'd lose is if the status of the packet got updated */
- /* and we'd be turning on FSBR next frame anyway, so it's a wash */
urbp->fsbr_timeout = 1;
head = &urbp->td_list;
@@ -2004,23 +2000,23 @@
tmp = head->next;
while (tmp != head) {
struct urb *u = list_entry(tmp, struct urb, urb_list);
- struct urb_priv *urbp = (struct urb_priv *)u->hcpriv;
+ struct urb_priv *up = (struct urb_priv *)u->hcpriv;
tmp = tmp->next;
- spin_lock(&urb->lock);
+ spin_lock(&u->lock);
/* Check if the FSBR timed out */
- if (urbp->fsbr && !urbp->fsbr_timeout && time_after_eq(jiffies,
urbp->fsbrtime + IDLE_TIMEOUT))
+ if (up->fsbr && !up->fsbr_timeout && time_after_eq(jiffies,
+up->fsbrtime + IDLE_TIMEOUT))
uhci_fsbr_timeout(uhci, u);
/* Check if the URB timed out */
- if (u->timeout && time_after_eq(jiffies, urbp->inserttime +
u->timeout)) {
+ if (u->timeout && time_after_eq(jiffies, up->inserttime + u->timeout))
+{
list_del(&u->urb_list);
list_add_tail(&u->urb_list, &list);
}
- spin_unlock(&urb->lock);
+ spin_unlock(&u->lock);
}
spin_unlock_irqrestore(&uhci->urb_list_lock, flags);
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel