summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryongari <yongari@FreeBSD.org>2009-12-22 21:39:34 +0000
committeryongari <yongari@FreeBSD.org>2009-12-22 21:39:34 +0000
commitf32eb4d51afc86d9fc1c108ec88cf6778bf50a17 (patch)
treeb585d2d311a7d26df63a459f20c7fd93a1319c1f
parent8051f5835e12d1cba001269e9d65acfa61995b7e (diff)
downloadFreeBSD-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.c27
-rw-r--r--sys/dev/ste/if_stereg.h2
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;
OpenPOWER on IntegriCloud