Author: nwhitehorn
Date: Mon Oct 25 15:51:43 2010
New Revision: 214349
URL: http://svn.freebsd.org/changeset/base/214349

Log:
  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.

Modified:
  head/sys/dev/pci/pci.c
  head/sys/dev/usb/controller/ehci.c
  head/sys/dev/usb/controller/ehcireg.h

Modified: head/sys/dev/pci/pci.c
==============================================================================
--- head/sys/dev/pci/pci.c      Mon Oct 25 15:41:12 2010        (r214348)
+++ head/sys/dev/pci/pci.c      Mon Oct 25 15:51:43 2010        (r214349)
@@ -2803,7 +2803,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: head/sys/dev/usb/controller/ehci.c
==============================================================================
--- head/sys/dev/usb/controller/ehci.c  Mon Oct 25 15:41:12 2010        
(r214348)
+++ head/sys/dev/usb/controller/ehci.c  Mon Oct 25 15:51:43 2010        
(r214349)
@@ -270,9 +270,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: head/sys/dev/usb/controller/ehcireg.h
==============================================================================
--- head/sys/dev/usb/controller/ehcireg.h       Mon Oct 25 15:41:12 2010        
(r214348)
+++ head/sys/dev/usb/controller/ehcireg.h       Mon Oct 25 15:51:43 2010        
(r214349)
@@ -54,9 +54,13 @@
 #define        EHCI_LEGSUP_USBLEGCTLSTS        0x04
 
 /* EHCI capability registers */
-#define        EHCI_CAPLENGTH          0x00    /* RO Capability register 
length field */
-#define        EHCI_RESERVED           0x01    /* Reserved register */
-#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)
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to