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