On Friday 16 April 2004 20:42, you wrote: > On Fri, 16 Apr 2004, Simone Gotti wrote: > > Sorry, I've tried it but I've got the same behavior, I've looked at the > > output of /proc/driver/uhci/0000:00:10.0 but it's quite similar. It's > > attached. Let me know if you need any other tests. > > Ooh, yes, there's a serious mistake in there. The file you included looks > pretty much the same as before, but there are important differences. All > right, try this patch instead of the other one (actually this includes the > other one). > > Alan Stern > > > > ===== drivers/usb/host/uhci-hcd.c 1.101 vs edited ===== > --- 1.101/drivers/usb/host/uhci-hcd.c Fri Mar 26 10:19:10 2004 > +++ edited/drivers/usb/host/uhci-hcd.c Fri Apr 16 13:43:12 2004 > @@ -382,6 +382,7 @@ > static void uhci_remove_qh(struct uhci_hcd *uhci, struct uhci_qh *qh) > { > struct uhci_qh *pqh; > + __u32 newlink; > > if (!qh) > return; > @@ -390,8 +391,24 @@ > * Only go through the hoops if it's actually linked in > */ > if (!list_empty(&qh->list)) { > - pqh = list_entry(qh->list.prev, struct uhci_qh, list); > > + /* If our queue is nonempty, make the next URB the head */ > + if (!list_empty(&qh->urbp->queue_list)) { > + struct urb_priv *nurbp; > + > + nurbp = list_entry(qh->urbp->queue_list.next, > + struct urb_priv, queue_list); > + nurbp->queued = 0; > + list_add(&nurbp->qh->list, &qh->list); > + newlink = cpu_to_le32(nurbp->qh->dma_handle) | UHCI_PTR_QH; > + } else > + newlink = qh->link; > + > + /* Fix up the previous QH's queue to link to either > + * the new head of this queue or the start of the > + * next endpoint's queue. */ > + pqh = list_entry(qh->list.prev, struct uhci_qh, list); > + pqh->link = newlink; > if (pqh->urbp) { > struct list_head *head, *tmp; > > @@ -403,28 +420,19 @@ > > tmp = tmp->next; > > - turbp->qh->link = qh->link; > + turbp->qh->link = newlink; > } > } > - > - pqh->link = qh->link; > mb(); > + > /* Leave qh->link in case the HC is on the QH now, it will */ > /* continue the rest of the schedule */ > qh->element = UHCI_PTR_TERM; > > - /* If our queue is nonempty, make the next URB the head */ > - if (!list_empty(&qh->urbp->queue_list)) { > - struct urb_priv *nurbp; > - > - nurbp = list_entry(qh->urbp->queue_list.next, > - struct urb_priv, queue_list); > - nurbp->queued = 0; > - list_add_tail(&nurbp->qh->list, &qh->list); > - } > list_del_init(&qh->list); > } > > + list_del_init(&qh->urbp->queue_list); > qh->urbp = NULL; > > /* Check to see if the remove list is empty. Set the IOC bit */ > @@ -579,7 +587,7 @@ > pltd->link = UHCI_PTR_TERM; > } > > - list_del_init(&urbp->queue_list); > + /* urbp->queue_list is handled in uhci_remove_qh() */ > } > > static struct urb_priv *uhci_alloc_urb_priv(struct uhci_hcd *uhci, struct > urb *urb)
This look GOOD! With this patch my bluetooth device returned to work! Thanks again for your help! Bye! -- Simone Gotti <[EMAIL PROTECTED]> ------------------------------------------------------- This SF.Net email is sponsored by: IBM Linux Tutorials Free Linux tutorial presented by Daniel Robbins, President and CEO of GenToo technologies. Learn everything from fundamentals to system administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click _______________________________________________ [EMAIL PROTECTED] To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel