aboutsummaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorPyun YongHyeon <yongari@FreeBSD.org>2010-08-09 01:47:09 +0000
committerPyun YongHyeon <yongari@FreeBSD.org>2010-08-09 01:47:09 +0000
commit497ffa52ef219f30000c422fccbe9113fc6882ee (patch)
tree13da83a9dfdc5e08326d52b2b44948d84cda803a /sys/dev
parenta55e71276340f42554310c621c4f4a533e5e3bb3 (diff)
downloadsrc-497ffa52ef219f30000c422fccbe9113fc6882ee.tar.gz
src-497ffa52ef219f30000c422fccbe9113fc6882ee.zip
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 MFC after: 5 days
Notes
Notes: svn path=/head/; revision=211089
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/ste/if_ste.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/sys/dev/ste/if_ste.c b/sys/dev/ste/if_ste.c
index 78c0290b70a0..e3297e6d5735 100644
--- a/sys/dev/ste/if_ste.c
+++ b/sys/dev/ste/if_ste.c
@@ -1059,7 +1059,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;
@@ -1081,12 +1081,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,