svn commit: r214745 - in stable/8/sys/dev: pci usb/controller

Nathan Whitehorn nwhitehorn at FreeBSD.org
Wed Nov 3 15:31:37 UTC 2010


Author: nwhitehorn
Date: Wed Nov  3 15:31:37 2010
New Revision: 214745
URL: http://svn.freebsd.org/changeset/base/214745

Log:
  MFC r214349:
  The EHCI_CAPLENGTH and EHCI_HCIVERSION registers are actually sub-registers
  within the first 4 bytes of the EHCI memory space. For controllers that
  use big-endian MMIO, reading them with 1- and 2-byte reads would then
  return the wrong values. Instead, read the combined register with a
  4-byte read and mask out the interesting quantities.
  
  Requested by:	marius

Modified:
  stable/8/sys/dev/pci/pci.c
  stable/8/sys/dev/usb/controller/ehci.c
  stable/8/sys/dev/usb/controller/ehcireg.h
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)

Modified: stable/8/sys/dev/pci/pci.c
==============================================================================
--- stable/8/sys/dev/pci/pci.c	Wed Nov  3 15:31:10 2010	(r214744)
+++ stable/8/sys/dev/pci/pci.c	Wed Nov  3 15:31:37 2010	(r214745)
@@ -2729,7 +2729,7 @@ ehci_early_takeover(device_t self)
 				    "SMM does not respond\n");
 		}
 		/* Disable interrupts */
-		offs = bus_read_1(res, EHCI_CAPLENGTH);
+		offs = EHCI_CAPLENGTH(bus_read_4(res, EHCI_CAPLEN_HCIVERSION));
 		bus_write_4(res, offs + EHCI_USBINTR, 0);
 	}
 	bus_release_resource(self, SYS_RES_MEMORY, rid, res);

Modified: stable/8/sys/dev/usb/controller/ehci.c
==============================================================================
--- stable/8/sys/dev/usb/controller/ehci.c	Wed Nov  3 15:31:10 2010	(r214744)
+++ stable/8/sys/dev/usb/controller/ehci.c	Wed Nov  3 15:31:37 2010	(r214745)
@@ -268,9 +268,9 @@ ehci_init(ehci_softc_t *sc)
 	}
 #endif
 
-	sc->sc_offs = EREAD1(sc, EHCI_CAPLENGTH);
+	sc->sc_offs = EHCI_CAPLENGTH(EREAD4(sc, EHCI_CAPLEN_HCIVERSION));
 
-	version = EREAD2(sc, EHCI_HCIVERSION);
+	version = EHCI_HCIVERSION(EREAD4(sc, EHCI_CAPLEN_HCIVERSION));
 	device_printf(sc->sc_bus.bdev, "EHCI version %x.%x\n",
 	    version >> 8, version & 0xff);
 

Modified: stable/8/sys/dev/usb/controller/ehcireg.h
==============================================================================
--- stable/8/sys/dev/usb/controller/ehcireg.h	Wed Nov  3 15:31:10 2010	(r214744)
+++ stable/8/sys/dev/usb/controller/ehcireg.h	Wed Nov  3 15:31:37 2010	(r214745)
@@ -61,9 +61,13 @@
 #define	EHCI_LEGSUP_USBLEGCTLSTS	0x04
 
 /* EHCI capability registers */
-#define	EHCI_CAPLENGTH		0x00	/* RO Capability register length field */
-/* reserved			0x01 */
-#define	EHCI_HCIVERSION		0x02	/* RO Interface version number */
+#define	EHCI_CAPLEN_HCIVERSION	0x00	/* RO Capability register length
+					 * (least-significant byte) and 
+					 * interface version number (two
+					 * most significant)
+					 */
+#define EHCI_CAPLENGTH(x)	((x) & 0xff)
+#define EHCI_HCIVERSION(x)	(((x) >> 16) & 0xffff)
 #define	EHCI_HCSPARAMS		0x04	/* RO Structural parameters */
 #define	EHCI_HCS_DEBUGPORT(x)	(((x) >> 20) & 0xf)
 #define	EHCI_HCS_P_INDICATOR(x) ((x) & 0x10000)


More information about the svn-src-stable-8 mailing list