Date: Tue, 20 Feb 2001 13:40:06 -0800 (PST) From: Matthew Jacob <mjacob@feral.com> To: freebsd-bugs@FreeBSD.org Subject: Re: i386/25236: Intel 82559 is not working behind a DEC/Intel 21152 Bridge Message-ID: <200102202140.f1KLe6t94098@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR i386/25236; it has been noted by GNATS.
From: Matthew Jacob <mjacob@feral.com>
To: cmjensen@dohnut.org
Cc: freebsd-gnats-submit@FreeBSD.ORG
Subject: Re: i386/25236: Intel 82559 is not working behind a DEC/Intel 21152
Bridge
Date: Tue, 20 Feb 2001 13:34:11 -0800 (PST)
>
> Try these patches from -current on if_fxp (they may not patch cleanly) and see
> if setting
>
> fxp_iomap=N
>
> either at the ok prompt for the boot loader (with the 'set' command) or in
> /boot/loader.conf (where N is the bitmap of fxp's you want to configure in I/O
> space) helps.
Argh:
Index: if_fxp.c
===================================================================
RCS file: /home/ncvs/src/sys/pci/if_fxp.c,v
retrieving revision 1.102
retrieving revision 1.103
diff -u -r1.102 -r1.103
--- if_fxp.c 2001/01/19 01:59:10 1.102
+++ if_fxp.c 2001/01/23 23:22:17 1.103
@@ -313,8 +313,8 @@
int error = 0;
struct fxp_softc *sc = device_get_softc(dev);
struct ifnet *ifp;
- u_long val;
- int rid;
+ u_int32_t val;
+ int rid, m1, m2, ebitmap;
mtx_init(&sc->sc_mtx, device_get_nameunit(dev), MTX_DEF | MTX_RECURSE);
callout_handle_init(&sc->stat_ch);
@@ -322,11 +322,13 @@
FXP_LOCK(sc);
/*
- * Enable bus mastering.
+ * Enable bus mastering. Enable memory space too, in case
+ * BIOS/Prom forgot about it.
*/
val = pci_read_config(dev, PCIR_COMMAND, 2);
val |= (PCIM_CMD_MEMEN|PCIM_CMD_BUSMASTEREN);
pci_write_config(dev, PCIR_COMMAND, val, 2);
+ val = pci_read_config(dev, PCIR_COMMAND, 2);
if (pci_get_powerstate(dev) != PCI_POWERSTATE_D0) {
u_int32_t iobase, membase, irq;
@@ -349,16 +351,44 @@
}
/*
- * Map control/status registers.
+ * Figure out which we should try first - memory mapping or i/o mapping?
+ * We default to memory mapping. Then we accept an override from the
+ * command line. Then we check to see which one is enabled.
*/
- rid = FXP_PCI_MMBA;
- sc->mem = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid,
- 0, ~0, 1, RF_ACTIVE);
+ m1 = PCIM_CMD_MEMEN;
+ m2 = PCIM_CMD_PORTEN;
+ ebitmap = 0;
+ if (getenv_int("fxp_iomap", &ebitmap)) {
+ if (ebitmap & (1 << device_get_unit(dev))) {
+ m1 = PCIM_CMD_PORTEN;
+ m2 = PCIM_CMD_MEMEN;
+ }
+ }
+
+ if (val & m1) {
+ sc->rtp =
+ (m1 == PCIM_CMD_MEMEN)? SYS_RES_MEMORY : SYS_RES_IOPORT;
+ sc->rgd = (m1 == PCIM_CMD_MEMEN)? FXP_PCI_MMBA : FXP_PCI_IOBA;
+ sc->mem = bus_alloc_resource(dev, sc->rtp, &sc->rgd,
+ 0, ~0, 1, RF_ACTIVE);
+ }
+ if (sc->mem == NULL && (val & m2)) {
+ sc->rtp =
+ (m2 == PCIM_CMD_MEMEN)? SYS_RES_MEMORY : SYS_RES_IOPORT;
+ sc->rgd = (m2 == PCIM_CMD_MEMEN)? FXP_PCI_MMBA : FXP_PCI_IOBA;
+ sc->mem = bus_alloc_resource(dev, sc->rtp, &sc->rgd,
+ 0, ~0, 1, RF_ACTIVE);
+ }
+
if (!sc->mem) {
- device_printf(dev, "could not map memory\n");
+ device_printf(dev, "could not map device registers\n");
error = ENXIO;
goto fail;
}
+ if (bootverbose) {
+ device_printf(dev, "using %s space register mapping\n",
+ sc->rtp == SYS_RES_MEMORY? "memory" : "I/O");
+ }
sc->sc_st = rman_get_bustag(sc->mem);
sc->sc_sh = rman_get_bushandle(sc->mem);
@@ -387,7 +417,7 @@
/* Failed! */
bus_teardown_intr(dev, sc->irq, sc->ih);
bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq);
- bus_release_resource(dev, SYS_RES_MEMORY, FXP_PCI_MMBA, sc->mem);
+ bus_release_resource(dev, sc->rtp, sc->rgd, sc->mem);
error = ENXIO;
goto fail;
}
@@ -451,7 +481,7 @@
*/
bus_teardown_intr(dev, sc->irq, sc->ih);
bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq);
- bus_release_resource(dev, SYS_RES_MEMORY, FXP_PCI_MMBA, sc->mem);
+ bus_release_resource(dev, sc->rtp, sc->rgd, sc->mem);
/*
* Free all the receive buffers.
Index: if_fxpvar.h
===================================================================
RCS file: /home/ncvs/src/sys/pci/if_fxpvar.h,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- if_fxpvar.h 2000/09/18 21:12:19 1.13
+++ if_fxpvar.h 2001/01/23 23:22:17 1.14
@@ -38,6 +38,8 @@
struct fxp_softc {
struct arpcom arpcom; /* per-interface network data */
struct resource *mem; /* resource descriptor for registers */
+ int rtp; /* register resource type */
+ int rgd; /* register descriptor in use */
struct resource *irq; /* resource descriptor for interrupt */
void *ih; /* interrupt handler cookie */
struct mtx sc_mtx;
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200102202140.f1KLe6t94098>
