From 68128138a56c1386196b981668492366fc5332b7 Mon Sep 17 00:00:00 2001 From: Hans Petter Selasky Date: Wed, 19 Aug 2020 11:50:12 +0000 Subject: [PATCH] Avoid evaluating the XHCI control endpoint context. The XHCI specification says that the XHCI controller should detect reception of the USB device descriptors, and automatically update the max packet size in the control endpoint context. Differential Revision: https://reviews.freebsd.org/D26104 Reviewed by: kp@ MFC after: 1 week Sponsored by: Mellanox Technologies --- sys/dev/usb/controller/xhci.c | 17 +++-------------- sys/dev/usb/controller/xhci.h | 1 - 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/sys/dev/usb/controller/xhci.c b/sys/dev/usb/controller/xhci.c index e96f910b2cb7..432c419c1f82 100644 --- a/sys/dev/usb/controller/xhci.c +++ b/sys/dev/usb/controller/xhci.c @@ -2398,8 +2398,6 @@ 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) { @@ -2929,17 +2927,6 @@ xhci_transfer_insert(struct usb_xfer *xfer) 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 */ if (pepext->trb_running == 0) { struct xhci_softc *sc = XHCI_BUS2SC(xfer->xroot->bus); @@ -3917,8 +3904,10 @@ xhci_configure_reset_endpoint(struct usb_xfer *xfer) if (!(sc->sc_hw.devs[index].ep_configured & mask)) { sc->sc_hw.devs[index].ep_configured |= mask; err = xhci_cmd_configure_ep(sc, buf_inp.physaddr, 0, index); - } else { + } else if (epno != 1) { err = xhci_cmd_evaluate_ctx(sc, buf_inp.physaddr, index); + } else { + err = 0; } if (err != 0) { diff --git a/sys/dev/usb/controller/xhci.h b/sys/dev/usb/controller/xhci.h index c0427e0cf11f..e2c3b887a338 100644 --- a/sys/dev/usb/controller/xhci.h +++ b/sys/dev/usb/controller/xhci.h @@ -393,7 +393,6 @@ struct xhci_endpoint_ext { uint8_t trb_halted; uint8_t trb_running; uint8_t trb_ep_mode; - uint8_t trb_ep_maxp; }; enum {