On Wed, 15 Sep 2004 [EMAIL PROTECTED] wrote:

> This is a description of each file attached to this post:
> lspci.log             lspci output, to give information on the USB controllers
>                       that I use.
> uhci-*.log            Multiple copy of the content of /proc/driver/uhci/mycontroller.
>                       Each step is described bellow.
> usb-chief-traces.usb  USB Chief analyser (from CATC) traces.
>                       This log contains the USB traffic between the host and my 
> device
>                       while reproducing the problem.
>                       I can convert that file or provide you a viewer if you want.
>                       In this log, the packet #99806 is lost, the packet #123824 is
>                       received successfully (see bellow).

I don't have a viewer, but it doesn't matter.  The uhci-*.log files were 
enough to show where the error is.  As I suspected, it's a problem with 
the way data toggles are handled.

> This is probably more that you asked but I would like to be sure that
> you'll have
> enough information to reproduce/solve the problem.
> I have tested with an OHCI controller, everything looks working perfectly.
> See the
> lspci.log file, to get the reference of that controller.

Try using the patch below and tell me if it helps.

Alan Stern


===== drivers/usb/host/uhci-hcd.c 1.130 vs edited =====
--- 1.130/drivers/usb/host/uhci-hcd.c   2004-09-13 12:46:40 -04:00
+++ edited/drivers/usb/host/uhci-hcd.c  2004-09-15 12:14:06 -04:00
@@ -1477,7 +1477,7 @@
 {
        struct list_head *head, *tmp;
        struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
-       int prevactive = 1;
+       int prevactive = 0;
 
        uhci_dec_fsbr(uhci, urb);       /* Safe since it checks */
 
@@ -1485,14 +1485,20 @@
         * Now we need to find out what the last successful toggle was
         * so we can update the local data toggle for the next transfer
         *
-        * There's 3 way's the last successful completed TD is found:
+        * There are 2 ways the last successful completed TD is found:
         *
         * 1) The TD is NOT active and the actual length < expected length
         * 2) The TD is NOT active and it's the last TD in the chain
+        *
+        * and a third way the first uncompleted TD is found:
+        *
         * 3) The TD is active and the previous TD is NOT active
         *
         * Control and Isochronous ignore the toggle, so this is safe
         * for all types
+        *
+        * FIXME: The toggle fixups won't be 100% reliable until we
+        * change over to using a single queue for each endpoint.
         */
        head = &urbp->td_list;
        tmp = head->next;



-------------------------------------------------------
This SF.Net email is sponsored by: thawte's Crypto Challenge Vl
Crack the code and win a Sony DCRHC40 MiniDV Digital Handycam
Camcorder. More prizes in the weekly Lunch Hour Challenge.
Sign up NOW http://ad.doubleclick.net/clk;10740251;10262165;m
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to