From: Greg KH To: Marcelo Tosatti Cc: linux-usb-devel@lists.sourceforge.net Subject: [PATCH 3 of 5] USB uhci driver bugfixes Hi, Here's a patch against 2.4.18-pre6 for the USB uhci host controller driver that ov511 driver that fixes two bugs with the data toggle bit that was causing reduced performance when using the 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 Sat Jan 26 19:56:08 2002 +++ b/drivers/usb/uhci.c Sat Jan 26 19:56:08 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),