From owner-freebsd-bugs Tue Feb 20 13:40:19 2001 Delivered-To: freebsd-bugs@hub.freebsd.org Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by hub.freebsd.org (Postfix) with ESMTP id 58A3937B67D for ; Tue, 20 Feb 2001 13:40:06 -0800 (PST) (envelope-from gnats@FreeBSD.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.11.1/8.11.1) id f1KLe6t94098; Tue, 20 Feb 2001 13:40:06 -0800 (PST) (envelope-from gnats) Date: Tue, 20 Feb 2001 13:40:06 -0800 (PST) Message-Id: <200102202140.f1KLe6t94098@freefall.freebsd.org> To: freebsd-bugs@FreeBSD.org Cc: From: Matthew Jacob Subject: Re: i386/25236: Intel 82559 is not working behind a DEC/Intel 21152 Bridge Reply-To: Matthew Jacob Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org The following reply was made to PR i386/25236; it has been noted by GNATS. From: Matthew Jacob 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