svn commit: r211358 - stable/7/sys/dev/ste

Pyun YongHyeon yongari at FreeBSD.org
Sun Aug 15 21:46:24 UTC 2010


Author: yongari
Date: Sun Aug 15 21:46:23 2010
New Revision: 211358
URL: http://svn.freebsd.org/changeset/base/211358

Log:
  MFC r211089:
    It seems some old Sundace(now IC Plus Corp.) controllers do not
    like memory mapped register access. Typical problem from the issue
    was MII access returned unreliable values. I'm not sure this comes
    from lack of register flushing in MII access after accessing
    STE_PHYCTL register though.
    To address the issue, read hints data that controls which type of
    memory mapping should be used in driver. ste(4) still prefers
    memory mapping to io mapping but honor hints entered by user except
    for controllers that have problems with memory mapping.
    The hint to use iomapping could be given by adding the following
    line to /boot/device.hints file.
  
    hint.ste.0.prefer_iomap="1"
  
    PR:	kern/149285

Modified:
  stable/7/sys/dev/ste/if_ste.c
Directory Properties:
  stable/7/sys/   (props changed)
  stable/7/sys/cddl/contrib/opensolaris/   (props changed)
  stable/7/sys/contrib/dev/acpica/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)

Modified: stable/7/sys/dev/ste/if_ste.c
==============================================================================
--- stable/7/sys/dev/ste/if_ste.c	Sun Aug 15 21:43:51 2010	(r211357)
+++ stable/7/sys/dev/ste/if_ste.c	Sun Aug 15 21:46:23 2010	(r211358)
@@ -1053,7 +1053,7 @@ ste_attach(device_t dev)
 	struct ste_softc *sc;
 	struct ifnet *ifp;
 	uint16_t eaddr[ETHER_ADDR_LEN / 2];
-	int error = 0, pmc, rid;
+	int error = 0, pmc, prefer_iomap, rid;
 
 	sc = device_get_softc(dev);
 	sc->ste_dev = dev;
@@ -1075,12 +1075,25 @@ ste_attach(device_t dev)
 	 */
 	pci_enable_busmaster(dev);
 
-	/* Prefer memory space register mapping over IO space. */
-	sc->ste_res_id = PCIR_BAR(1);
-	sc->ste_res_type = SYS_RES_MEMORY;
-	sc->ste_res = bus_alloc_resource_any(dev, sc->ste_res_type,
-	    &sc->ste_res_id, RF_ACTIVE);
-	if (sc->ste_res == NULL) {
+	/*
+	 * Prefer memory space register mapping over IO space but use
+	 * IO space for a device that is known to have issues on memory
+	 * mapping.
+	 */
+	prefer_iomap = 0;
+	if (pci_get_device(dev) == ST_DEVICEID_ST201_1)
+		prefer_iomap = 1;
+	else
+		resource_int_value(device_get_name(sc->ste_dev),
+		    device_get_unit(sc->ste_dev), "prefer_iomap",
+		    &prefer_iomap);
+	if (prefer_iomap == 0) {
+		sc->ste_res_id = PCIR_BAR(1);
+		sc->ste_res_type = SYS_RES_MEMORY;
+		sc->ste_res = bus_alloc_resource_any(dev, sc->ste_res_type,
+		    &sc->ste_res_id, RF_ACTIVE);
+	}
+	if (prefer_iomap || sc->ste_res == NULL) {
 		sc->ste_res_id = PCIR_BAR(0);
 		sc->ste_res_type = SYS_RES_IOPORT;
 		sc->ste_res = bus_alloc_resource_any(dev, sc->ste_res_type,


More information about the svn-src-all mailing list