Opened 16 months ago
Closed 16 months ago
#18521 closed bug (fixed)
Usb_rndis stops working after a while
Reported by: | pulkomandy | Owned by: | pulkomandy |
---|---|---|---|
Priority: | normal | Milestone: | R1/beta5 |
Component: | Drivers/Network/usb_rndis | Version: | R1/beta4 |
Keywords: | Cc: | ||
Blocked By: | Blocking: | ||
Platform: | All |
Description
I get this error from xhci:
link descriptor for pipe: max transfers count exceeded
This seems a bit strange, if tqe driver works as I think; there should be only one read und only one write transfer happening at any time? Is there some case where the transfers are not properly finished?
Change History (5)
comment:1 by , 16 months ago
comment:2 by , 16 months ago
Probably we should change this error message to indicate what pipe/endpoint the maximum transfers count has been exceeded on, though.
comment:3 by , 16 months ago
I'm not sure what the upper layers of the stack do, but is it possible Write() is called multiple times concurrently?
comment:4 by , 16 months ago
I kept trying to debug this today and yes, it seems Write is called from multiple threads. The code is certainly not designed to handle that, but it is similar to other USB ethernet drivers, so I'm wondering how these other drivers manage to work.
I have tried to use send_message/receive_message instead of a semaphore, to allow handling the notifications to multiple threads cleanly. It solved the xhci error messages, but things still seem to lock up. I expected I could schedule multiple transfers in the USB stack and let it handle them and call the callbacks. Is that supposed to work? Or should I add some locking to make sure there is only one transfer "in flight" at a time?
comment:5 by , 16 months ago
Milestone: | Unscheduled → R1/beta5 |
---|---|
Resolution: | → fixed |
Status: | new → closed |
Fix merged in hrev57161.
If there are no other errors in the syslog preceding this one, then this is probably an issue with the usb_rndis driver. The error means that too many transfers are queued at once; so are you really sure only one is happening at a time?
At any rate, it should be possible to recover from this error using
cancel_queued_transfers
.