Author: hselasky
Date: Tue Sep 1 08:14:46 2020
New Revision: 365029
URL: https://svnweb.freebsd.org/changeset/base/365029
Log:
Fully revert r364379.
The "Intel Sunrise Point-LP USB 3.0 controller" doesn't update the wMaxPacket
field in the control endpoint context automatically causing a BABBLE error
code
on the initial first USB device descriptor read, when the bMaxPacketSize is
not
8 bytes.
Reported by: wulf@
PR: 248784
MFC after: 1 week
Sponsored by: Mellanox Technologies
Modified:
head/sys/dev/usb/controller/xhci.c
head/sys/dev/usb/controller/xhci.h
Modified: head/sys/dev/usb/controller/xhci.c
==============================================================================
--- head/sys/dev/usb/controller/xhci.c Tue Sep 1 08:02:12 2020
(r365028)
+++ head/sys/dev/usb/controller/xhci.c Tue Sep 1 08:14:46 2020
(r365029)
@@ -2398,6 +2398,8 @@ xhci_configure_endpoint(struct usb_device *udev,
/* store endpoint mode */
pepext->trb_ep_mode = ep_mode;
+ /* store bMaxPacketSize for control endpoints */
+ pepext->trb_ep_maxp = edesc->wMaxPacketSize[0];
usb_pc_cpu_flush(pepext->page_cache);
if (ep_mode == USB_EP_MODE_STREAMS) {
@@ -2925,6 +2927,17 @@ xhci_transfer_insert(struct usb_xfer *xfer)
if (pepext->trb_used[id] >= trb_limit) {
DPRINTFN(8, "Too many TDs queued.\n");
return (USB_ERR_NOMEM);
+ }
+
+ /* check if bMaxPacketSize changed */
+ if (xfer->flags_int.control_xfr != 0 &&
+ pepext->trb_ep_maxp != xfer->endpoint->edesc->wMaxPacketSize[0]) {
+
+ DPRINTFN(8, "Reconfigure control endpoint\n");
+
+ /* force driver to reconfigure endpoint */
+ pepext->trb_halted = 1;
+ pepext->trb_running = 0;
}
/* check for stopped condition, after putting transfer on interrupt
queue */
Modified: head/sys/dev/usb/controller/xhci.h
==============================================================================
--- head/sys/dev/usb/controller/xhci.h Tue Sep 1 08:02:12 2020
(r365028)
+++ head/sys/dev/usb/controller/xhci.h Tue Sep 1 08:14:46 2020
(r365029)
@@ -393,6 +393,7 @@ struct xhci_endpoint_ext {
uint8_t trb_halted;
uint8_t trb_running;
uint8_t trb_ep_mode;
+ uint8_t trb_ep_maxp;
};
enum {
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"