From: Greg KH To: torvalds@transmeta.com Cc: linux-usb-devel@lists.sourceforge.net Subject: [PATCH 3 of 6] USB uhci driver bugfix Hi, Here's a patch against 2.5.3-pre2 that adds the uhci USB driver that fixes two data toggle bugs that were causing reduced performance with this driver. This patch was done by Johannes Erdfelt. thanks, greg k-h diff -Nru a/drivers/usb/uhci.c b/drivers/usb/uhci.c --- a/drivers/usb/uhci.c Mon Jan 21 10:48:39 2002 +++ b/drivers/usb/uhci.c Mon Jan 21 10:48:39 2002 @@ -520,7 +520,8 @@ lltd = list_entry(lurbp->td_list.prev, struct uhci_td, list); - uhci_fixup_toggle(urb, uhci_toggle(lltd->info) ^ 1); + usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), usb_pipeout(urb->pipe), + uhci_fixup_toggle(urb, uhci_toggle(lltd->info) ^ 1)); /* All qh's in the queue need to link to the next queue */ urbp->qh->link = eurbp->qh->link; @@ -556,6 +557,7 @@ /* Fix up the toggle for the next URB's */ if (!urbp->queued) + /* We set the toggle when we unlink */ toggle = usb_gettoggle(urb->dev, usb_pipeendpoint(urb->pipe), usb_pipeout(urb->pipe)); else { /* If we're in the middle of the queue, grab the toggle */ @@ -1683,8 +1685,8 @@ /* Control and Isochronous ignore the toggle, so this */ /* is safe for all types */ - if (!(td->status & TD_CTRL_ACTIVE) && - (uhci_actual_length(td->status) < uhci_expected_length(td->info) || + if ((!(td->status & TD_CTRL_ACTIVE) && + (uhci_actual_length(td->status) < uhci_expected_length(td->info)) || tmp == head)) { usb_settoggle(urb->dev, uhci_endpoint(td->info), uhci_packetout(td->info),