On Fri, 22 Mar 2002, Jean Tourrilhes wrote:

>       I was quickly scanning the BlueZ mail archive and found a few
> comments regarding the support of Zero Packet with uhci.c. Johannes,
> that is mostly for you ;-)
> 
[...]
>       Know that at least somebody else has reporduce my problem with
> a different harware and driver, I feel a bit better saying that there
> must be a bug in uhci.c.
[...]
> uhci.c: f000: host controller process error. something bad happened

Yep, getting this too, with 2.5.7 on i82371. I've tried with your recent
ir257_usb_disconnect_atomic patch applied and the box locked up really
serious after the above error - which might be some secondary irda-usb
issue. Anyway, for the HC processing error I'd like to point into the uhci
direction. The good news however is, I think I've identified the cause in
uhci's handling of USB_ZERO_PACKET. Patch below is the same I've just
sent to the bluetooth thread where the same issue was reported.

Jean, this solves the host controller processing error - but irda-usb is
still not happy with it, apparently a number of tx transfers are just
hanging and the dongle doesn't work. Despite it is working with usb-uhci,
I don't think this is another uhci issue - simply because I don't see this 
problem with uhci and my alternative usb-irda approach I'm currently
trying to create. But this one has still other fatal problems with both
uhci, so I think it's not (yet) ready to give it a try.

Martin

------------------------

--- linux-2.5.7/drivers/usb/uhci.c      Sun Mar 10 03:45:21 2002
+++ v2.5.7-md/drivers/usb/uhci.c        Sun Mar 24 23:20:35 2002
@@ -1270,14 +1270,21 @@
                        usb_pipeout(urb->pipe));
        } while (len > 0);
 
-       if (usb_pipeout(urb->pipe) && (urb->transfer_flags & USB_ZERO_PACKET) &&
-          urb->transfer_buffer_length) {
+       /* USB_ZERO_PACKET means adding a 0-length packet, if
+        * direction is OUT and the transfer_length was an
+        * exact multiple of maxsze, hence
+        * (len = transfer_length - N * maxsze) == 0
+        * however, if transfer_length==0, the zero packet
+        * was already prepared above.
+        */
+       if ((urb->transfer_flags&USB_ZERO_PACKET) && usb_pipeout(urb->pipe)
+           && len==0 && urb->transfer_buffer_length>0) {
                td = uhci_alloc_td(uhci, urb->dev);
                if (!td)
                        return -ENOMEM;
 
                uhci_add_td_to_urb(urb, td);
-               uhci_fill_td(td, status, destination | UHCI_NULL_DATA_SIZE |
+               uhci_fill_td(td, status, destination | (UHCI_NULL_DATA_SIZE<<21) |
                        (usb_gettoggle(urb->dev, usb_pipeendpoint(urb->pipe),
                         usb_pipeout(urb->pipe)) << TD_TOKEN_TOGGLE),
                        data);


_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to