Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 6 Oct 2014 06:01:46 +0000 (UTC)
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r272589 - stable/10/sys/dev/usb/controller
Message-ID:  <201410060601.s9661kW2069785@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: hselasky
Date: Mon Oct  6 06:01:46 2014
New Revision: 272589
URL: https://svnweb.freebsd.org/changeset/base/272589

Log:
  MFC r272349, r272422 and r272479:
  - Fix XHCI driver for devices which have more than 15 physical root HUB
    ports. The current bitmap array was too small to hold more than 16
    bits and would at some point toggle the context size, which then would
    trigger an enumeration fault and cause a fallback to the EHCI
    companion controller, if any.
  - Make sure we always set the maximum number of valid contexts.
  - Set default cycle state in case of early interrupts.

Modified:
  stable/10/sys/dev/usb/controller/xhci.c
  stable/10/sys/dev/usb/controller/xhci.h
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/usb/controller/xhci.c
==============================================================================
--- stable/10/sys/dev/usb/controller/xhci.c	Mon Oct  6 06:00:50 2014	(r272588)
+++ stable/10/sys/dev/usb/controller/xhci.c	Mon Oct  6 06:01:46 2014	(r272589)
@@ -618,6 +618,10 @@ xhci_init(struct xhci_softc *sc, device_
 	sc->sc_bus.devices = sc->sc_devices;
 	sc->sc_bus.devices_max = XHCI_MAX_DEVICES;
 
+	/* set default cycle state in case of early interrupts */
+	sc->sc_event_ccs = 1;
+	sc->sc_command_ccs = 1;
+
 	/* setup command queue mutex and condition varible */
 	cv_init(&sc->sc_cmd_cv, "CMDQ");
 	sx_init(&sc->sc_cmd_sx, "CMDQ lock");
@@ -2271,14 +2275,17 @@ xhci_configure_mask(struct usb_device *u
 		/* adjust */
 		x--;
 
-		/* figure out maximum */
-		if (x > sc->sc_hw.devs[index].context_num) {
+		/* figure out the maximum number of contexts */
+		if (x > sc->sc_hw.devs[index].context_num)
 			sc->sc_hw.devs[index].context_num = x;
-			temp = xhci_ctx_get_le32(sc, &pinp->ctx_slot.dwSctx0);
-			temp &= ~XHCI_SCTX_0_CTX_NUM_SET(31);
-			temp |= XHCI_SCTX_0_CTX_NUM_SET(x + 1);
-			xhci_ctx_set_le32(sc, &pinp->ctx_slot.dwSctx0, temp);
-		}
+		else
+			x = sc->sc_hw.devs[index].context_num;
+
+		/* update number of contexts */
+		temp = xhci_ctx_get_le32(sc, &pinp->ctx_slot.dwSctx0);
+		temp &= ~XHCI_SCTX_0_CTX_NUM_SET(31);
+		temp |= XHCI_SCTX_0_CTX_NUM_SET(x + 1);
+		xhci_ctx_set_le32(sc, &pinp->ctx_slot.dwSctx0, temp);
 	}
 	return (0);
 }

Modified: stable/10/sys/dev/usb/controller/xhci.h
==============================================================================
--- stable/10/sys/dev/usb/controller/xhci.h	Mon Oct  6 06:00:50 2014	(r272588)
+++ stable/10/sys/dev/usb/controller/xhci.h	Mon Oct  6 06:01:46 2014	(r272589)
@@ -493,7 +493,8 @@ struct xhci_softc {
 	uint8_t			sc_noscratch;
 	/* root HUB device configuration */
 	uint8_t			sc_conf;
-	uint8_t			sc_hub_idata[2];
+	/* root HUB port event bitmap, max 256 ports */
+	uint8_t			sc_hub_idata[32];
 
 	/* size of context */
 	uint8_t			sc_ctx_is_64_byte;



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