Dan Streetman wrote:
...
> diff -ur usb-2.5/drivers/usb/host/uhci-hcd.c linux/drivers/usb/host/uhci-hcd.c
> --- usb-2.5/drivers/usb/host/uhci-hcd.c Fri Oct 11 16:52:49 2002
> +++ linux/drivers/usb/host/uhci-hcd.c Fri Oct 11 16:59:53 2002
...
> @@ -545,9 +529,16 @@
> urbp->qh->link = eurbp->qh->link;
>
> mb(); /* Make sure we flush everything */
> +
> lltd->link = cpu_to_le32(urbp->qh->dma_handle) | UHCI_PTR_QH;
>
> + /* If the HC wrote lltd->link (which used to point to TERM) back into
>lurb->qh->element
> + * before we wrote lltd->link, fix lurb->qh->element
> + */
> + mb();
> + if (lurbp->qh->element == UHCI_PTR_TERM)
> + lurbp->qh->element = lltd->link;
> +
> list_add_tail(&urbp->queue_list, &furbp->queue_list);
>
> urbp->queued = 1;
You are still racing with hardware. Consider:
1. HC reads lltd->link (still ==TERM)
2. HCD sets lltd->link
3. HCD checks lurbp->qh->element (still !=TERM)
4. HCD does not set lurbp->qh->element
5. HC sets lurbp->qh->element to TERM (from step 1)
=> dropped transfer
or (unlikely, but not impossible)
1. HCD sets lltd->link
2. HC reads lltd->link
3. HC sets lurbp->qh->element
4. HC reads lurbp->qh->element
3. HC processes transfer
4. HC reads lltd->link->link (assumed ==TERM; second "->link" is, of
course, not correct C)
5. HC sets lurbp->qh->element
6. HCD checks lurbp->qh->element (==TERM)
7. HCD sets lltd->link
8. double transfer/toggle error
...
> @@ -623,6 +640,15 @@
> /* The next URB happens to be the beginning, so */
> /* we're the last, end the chain */
> pltd->link = UHCI_PTR_TERM;
> +
> + pqh = purbp->qh; /* set to previous QH in our endpoint's queue */
> +
> + /* If the HC wrote pltd->link (which used to point to our QH) back
>into pqh->element
> + * before we wrote pltd->link, fix pqh->element
> + */
> + mb();
> + if (pqh->element == (cpu_to_le32(urbp->qh->dma_handle) |
>UHCI_PTR_QH))
> + pqh->element = pltd->link;
> }
>
> list_del_init(&urbp->queue_list);
Same here, I guess.
Regards,
Stephan
-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel