Skip site navigation (1)Skip section navigation (2)
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>