Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 1 Sep 2020 08:14:47 +0000 (UTC)
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r365029 - head/sys/dev/usb/controller
Message-ID:  <202009010814.0818EleU034004@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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 {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202009010814.0818EleU034004>