Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 8 Mar 2020 13:24:34 +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: r358738 - in head/sys/dev/usb: . controller
Message-ID:  <202003081324.028DOY7k025075@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: hselasky
Date: Sun Mar  8 13:24:34 2020
New Revision: 358738
URL: https://svnweb.freebsd.org/changeset/base/358738

Log:
  Remove the power bit from the super speed root hub port status register
  because it clobbers the super speed link status when a device is in super
  speed mode. Currently the power bit is not needed for anything in the USB
  hub driver.
  
  This fixes USB warm reset for super speed devices.
  
  Tested by:	Shichun.Ma@dell.com
  MFC after:	3 days
  Sponsored by:	Mellanox Technologies

Modified:
  head/sys/dev/usb/controller/xhci.c
  head/sys/dev/usb/usb_hub.c

Modified: head/sys/dev/usb/controller/xhci.c
==============================================================================
--- head/sys/dev/usb/controller/xhci.c	Sun Mar  8 06:09:46 2020	(r358737)
+++ head/sys/dev/usb/controller/xhci.c	Sun Mar  8 13:24:34 2020	(r358738)
@@ -3591,13 +3591,10 @@ xhci_roothub_exec(struct usb_device *udev,
 			i |= UPS_OVERCURRENT_INDICATOR;
 		if (v & XHCI_PS_PR)
 			i |= UPS_RESET;
-		if (v & XHCI_PS_PP) {
-			/*
-			 * The USB 3.0 RH is using the
-			 * USB 2.0's power bit
-			 */
-			i |= UPS_PORT_POWER;
-		}
+#if 0
+		if (v & XHCI_PS_PP)
+			/* XXX undefined */
+#endif
 		USETW(sc->sc_hub_desc.ps.wPortStatus, i);
 
 		i = 0;

Modified: head/sys/dev/usb/usb_hub.c
==============================================================================
--- head/sys/dev/usb/usb_hub.c	Sun Mar  8 06:09:46 2020	(r358737)
+++ head/sys/dev/usb/usb_hub.c	Sun Mar  8 13:24:34 2020	(r358738)
@@ -660,7 +660,7 @@ repeat:
 		break;
 	case USB_SPEED_SUPER:
 		if (udev->parent_hub == NULL)
-			power_mask = UPS_PORT_POWER;
+			power_mask = 0;	/* XXX undefined */
 		else
 			power_mask = UPS_PORT_POWER_SS;
 		break;
@@ -668,7 +668,7 @@ repeat:
 		power_mask = 0;
 		break;
 	}
-	if (!(sc->sc_st.port_status & power_mask)) {
+	if ((sc->sc_st.port_status & power_mask) != power_mask) {
 		DPRINTF("WARNING: strange, connected port %d "
 		    "has no power\n", portno);
 	}



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