speedtch usbatm.c,1.20,1.21 usbatm.h,1.13,1.14
Roman Kagan
rkagan at mail.ru
Wed Apr 27 01:09:30 EDT 2005
On Tue, Apr 26, 2005 at 11:50:45PM +0200, Duncan Sands wrote:
> if (unlikely(urb->status)) {
> /* throttle processing in case of an error */
> mod_timer(&channel->delay, jiffies + msecs_to_jiffies(THROTTLE_MSECS));
> if (urb->status == -EPIPE) /* this one may be cleaned up at times */
> schedule_work(&channel->clear_halt_work);
> }
>
> >From the doc for usb_clear_halt:
>
> * This is used to clear halt conditions for bulk and interrupt endpoints,
> * as reported by URB completion status. Endpoints that are halted are
> * sometimes referred to as being "stalled". Such endpoints are unable
> * to transmit or receive data until the halt status is cleared. Any URBs
> * queued for such an endpoint should normally be unlinked by the driver
> * before clearing the halt condition, as described in sections 5.7.5
> * and 5.8.5 of the USB 2.0 spec.
>
> However it looks like you don't unlink the other urbs, and even the
> current urb can be rescheduled if the usb_clear_halt takes more than
> THROTTLE_MSECS (5 milliseconds).
My vague perception was that it was hcd which was supposed to unlink all
pending urbs on the stalled endpoint queue. I'll check it out.
> It's not clear exactly what's meant
> by endpoint here - for the speedtch tx and rx are on the same endpoint,
> except that the in endpoint has the in bit set; does that count as the
> same endpoint?
I don't think so: the USB spec treats endpoints as uni-directional. The
enpoint numbers (0x0 - 0xf) can be the same for both directions and are
distinguished by the bit #7; in Linux this bit is usually adjusted
according to the context, but the endpoint data, including queues, are
completely separate.
Cheers,
Roman.
More information about the Usbatm
mailing list