Hi Ivan,
Can you revert all if_ure patches, and try this one instead.
--HPS
diff --git a/sys/dev/usb/controller/xhci.c b/sys/dev/usb/controller/xhci.c
index 045be9a40b99..09aefb02687d 100644
--- a/sys/dev/usb/controller/xhci.c
+++ b/sys/dev/usb/controller/xhci.c
@@ -2848,8 +2848,16 @@ xhci_transfer_insert(struct usb_xfer *xfer)
/* check if already inserted */
if (xfer->flags_int.bandwidth_reclaimed) {
- DPRINTFN(8, "Already in schedule\n");
- return (0);
+ DPRINTFN(8, "Already in schedule (ringin doorbell only)\n");
+
+ /*
+ * Apparently there may be a race with multi
+ * buffering, that the hardware doesn't see the new
+ * chain bit value and stops the endpoint
+ * execution. Fix this by ringing the doorbell after
+ * each and every job that has been completed.
+ */
+ goto ring_doorbell;
}
pepext = xhci_get_endpoint_ext(xfer->xroot->udev,
@@ -2966,6 +2974,7 @@ xhci_transfer_insert(struct usb_xfer *xfer)
xfer->flags_int.bandwidth_reclaimed = 1;
+ring_doorbell:
xhci_endpoint_doorbell(xfer);
return (0);