diff options
author | yongari <yongari@FreeBSD.org> | 2009-12-22 21:39:34 +0000 |
---|---|---|
committer | yongari <yongari@FreeBSD.org> | 2009-12-22 21:39:34 +0000 |
commit | f32eb4d51afc86d9fc1c108ec88cf6778bf50a17 (patch) | |
tree | b585d2d311a7d26df63a459f20c7fd93a1319c1f | |
parent | 8051f5835e12d1cba001269e9d65acfa61995b7e (diff) | |
download | FreeBSD-src-f32eb4d51afc86d9fc1c108ec88cf6778bf50a17.zip FreeBSD-src-f32eb4d51afc86d9fc1c108ec88cf6778bf50a17.tar.gz |
Prefer memory space register mapping over io space. If memory space
mapping fails fall back to old io space mapping.
While I'm here use PCIR_BAR macro.
-rw-r--r-- | sys/dev/ste/if_ste.c | 27 | ||||
-rw-r--r-- | sys/dev/ste/if_stereg.h | 2 |
2 files changed, 15 insertions, 14 deletions
diff --git a/sys/dev/ste/if_ste.c b/sys/dev/ste/if_ste.c index e8ff9ef..3faf0d0 100644 --- a/sys/dev/ste/if_ste.c +++ b/sys/dev/ste/if_ste.c @@ -74,8 +74,6 @@ __FBSDID("$FreeBSD$"); /* "device miibus" required. See GENERIC if you get errors here. */ #include "miibus_if.h" -#define STE_USEIOSPACE - MODULE_DEPEND(ste, pci, 1, 1, 1); MODULE_DEPEND(ste, ether, 1, 1, 1); MODULE_DEPEND(ste, miibus, 1, 1, 1); @@ -132,14 +130,6 @@ static void ste_txeof(struct ste_softc *); static void ste_wait(struct ste_softc *); static void ste_watchdog(struct ste_softc *); -#ifdef STE_USEIOSPACE -#define STE_RES SYS_RES_IOPORT -#define STE_RID STE_PCI_LOIO -#else -#define STE_RES SYS_RES_MEMORY -#define STE_RID STE_PCI_LOMEM -#endif - static device_method_t ste_methods[] = { /* Device interface */ DEVMETHOD(device_probe, ste_probe), @@ -965,9 +955,17 @@ ste_attach(device_t dev) */ pci_enable_busmaster(dev); - rid = STE_RID; - sc->ste_res = bus_alloc_resource_any(dev, STE_RES, &rid, RF_ACTIVE); - + /* 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) { + 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, + &sc->ste_res_id, RF_ACTIVE); + } if (sc->ste_res == NULL) { device_printf(dev, "couldn't map ports/memory\n"); error = ENXIO; @@ -1105,7 +1103,8 @@ ste_detach(device_t dev) if (sc->ste_irq) bus_release_resource(dev, SYS_RES_IRQ, 0, sc->ste_irq); if (sc->ste_res) - bus_release_resource(dev, STE_RES, STE_RID, sc->ste_res); + bus_release_resource(dev, sc->ste_res_type, sc->ste_res_id, + sc->ste_res); if (ifp) if_free(ifp); diff --git a/sys/dev/ste/if_stereg.h b/sys/dev/ste/if_stereg.h index f05e555..081b872 100644 --- a/sys/dev/ste/if_stereg.h +++ b/sys/dev/ste/if_stereg.h @@ -547,6 +547,8 @@ struct ste_softc { bus_space_tag_t ste_btag; bus_space_handle_t ste_bhandle; struct resource *ste_res; + int ste_res_id; + int ste_res_type; struct resource *ste_irq; void *ste_intrhand; struct ste_type *ste_info; |