Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 18 Feb 2002 13:16:44 -0800 (PST)
From:      Doug Ambrisko <ambrisko@ambrisko.com>
To:        freebsd-net@freebsd.org
Subject:   Adding support for Netgear GA621 (TBI interface)
Message-ID:  <200202182116.g1ILGij59734@ambrisko.com>

next in thread | raw e-mail | index | archive | help
I've been working on adding support for Netgears GA621 Gigabit Fiber card.
I basically have it working.  I'm still trying to refine the link
detection code.  I have been able to connect it to some other fiber card
via a cross-over cable and send packets back and forth.  I have some more
testing to do when I get a fiber switch that works (first one didn't
work and I'm waiting on a replacement).

Here are patches based on -stable.  I'd appreciate someone reviewing the
changes and let me know if I'm going about it in the wrong direction
or if it just needs minor changes.  It's definitely a work in progress
at the moment but appears to be functioning fairly well.   Some of the
ifmedia stuff I just stumbled through by looking at other drivers.

I will need someone to verify I didn't break the copper verison
since I only have a TBI (fiber) version.

Thanks,

Doug A.

Index: if_ngereg.h
===================================================================
RCS file: /cvs/src/sys/dev/nge/if_ngereg.h,v
retrieving revision 1.4.2.2
diff -c -r1.4.2.2 if_ngereg.h
*** if_ngereg.h	19 Sep 2001 23:14:28 -0000	1.4.2.2
--- if_ngereg.h	18 Feb 2002 21:12:15 -0000
***************
*** 128,133 ****
--- 128,134 ----
  #define NGE_CFG_PHYINTR_LNK	0x00080000
  #define NGE_CFG_PHYINTR_DUP	0x00100000
  #define NGE_CFG_MODE_1000	0x00400000
+ #define NGE_CFG_TBI_EN		0x01000000
  #define NGE_CFG_DUPLEX_STS	0x10000000
  #define NGE_CFG_SPEED_STS	0x60000000
  #define NGE_CFG_LINK_STS	0x80000000
***************
*** 420,426 ****
  /* TBI BMCR */
  #define NGE_TBIBMCR_RESTART_ANEG	0x00000200
  #define NGE_TBIBMCR_ENABLE_ANEG		0x00001000
! #define NGE_TBIBMCR_LOOPBACK		0x00004000
  
  /* TBI BMSR */
  #define NGE_TBIBMSR_ANEG_DONE	0x00000004
--- 421,427 ----
  /* TBI BMCR */
  #define NGE_TBIBMCR_RESTART_ANEG	0x00000200
  #define NGE_TBIBMCR_ENABLE_ANEG		0x00001000
! #define NGE_TBIBMCR_LOOPBACK		0x00004000 
  
  /* TBI BMSR */
  #define NGE_TBIBMSR_ANEG_DONE	0x00000004
***************
*** 429,434 ****
--- 430,437 ----
  /* TBI ANAR */
  #define NGE_TBIANAR_HDX		0x00000020
  #define NGE_TBIANAR_FDX		0x00000040
+ #define NGE_TBIANAR_PS1		0x00000080
+ #define NGE_TBIANAR_PS2		0x00000100
  #define NGE_TBIANAR_PCAP	0x00000180
  #define NGE_TBIANAR_REMFAULT	0x00003000
  #define NGE_TBIANAR_NEXTPAGE	0x00008000
***************
*** 436,441 ****
--- 439,446 ----
  /* TBI ANLPAR */
  #define NGE_TBIANLPAR_HDX	0x00000020
  #define NGE_TBIANLPAR_FDX	0x00000040
+ #define NGE_TBIANAR_PS1		0x00000080
+ #define NGE_TBIANAR_PS2		0x00000100
  #define NGE_TBIANLPAR_PCAP	0x00000180
  #define NGE_TBIANLPAR_REMFAULT	0x00003000
  #define NGE_TBIANLPAR_NEXTPAGE	0x00008000
***************
*** 656,661 ****
--- 661,668 ----
  	struct callout_handle	nge_stat_ch;
  	SLIST_HEAD(__nge_jfreehead, nge_jpool_entry)	nge_jfree_listhead;
  	SLIST_HEAD(__nge_jinusehead, nge_jpool_entry)	nge_jinuse_listhead;
+ 	u_int8_t		nge_tbi;
+ 	struct ifmedia		nge_ifmedia;
  };
  
  /*
Index: if_nge.c
===================================================================
RCS file: /cvs/src/sys/dev/nge/if_nge.c,v
retrieving revision 1.13.2.7
diff -c -r1.13.2.7 if_nge.c
*** if_nge.c	14 Dec 2001 19:44:38 -0000	1.13.2.7
--- if_nge.c	18 Feb 2002 21:12:15 -0000
***************
*** 620,645 ****
  	struct mii_data		*mii;
  
  	sc = device_get_softc(dev);
! 	mii = device_get_softc(sc->nge_miibus);
  
! 	if ((mii->mii_media_active & IFM_GMASK) == IFM_FDX) {
! 		NGE_SETBIT(sc, NGE_TX_CFG,
! 		    (NGE_TXCFG_IGN_HBEAT|NGE_TXCFG_IGN_CARR));
! 		NGE_SETBIT(sc, NGE_RX_CFG, NGE_RXCFG_RX_FDX);
  	} else {
! 		NGE_CLRBIT(sc, NGE_TX_CFG,
! 		    (NGE_TXCFG_IGN_HBEAT|NGE_TXCFG_IGN_CARR));
! 		NGE_CLRBIT(sc, NGE_RX_CFG, NGE_RXCFG_RX_FDX);
! 	}
  
! 	/* If we have a 1000Mbps link, set the mode_1000 bit. */
! 	if (IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_TX ||
! 	    IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_SX) {
! 		NGE_SETBIT(sc, NGE_CFG, NGE_CFG_MODE_1000);
! 	} else {
! 		NGE_CLRBIT(sc, NGE_CFG, NGE_CFG_MODE_1000);
! 	}
  
  	return;
  }
  
--- 620,674 ----
  	struct mii_data		*mii;
  
  	sc = device_get_softc(dev);
! 	if (sc->nge_tbi){ /* DJA check this */
! 	  
! 		/*
! 		 * BUG: Can't read Link status so assume FDX unless HDX is
! 		 * specified
! 		 */ 
! 		if (IFM_SUBTYPE(sc->nge_ifmedia.ifm_cur->ifm_media)
! 		    == IFM_AUTO) {
! 			if (CSR_READ_4(sc, NGE_TBI_ANLPAR) & NGE_TBIANAR_FDX) {
! 				NGE_SETBIT(sc, NGE_TX_CFG,
! 				    (NGE_TXCFG_IGN_HBEAT|NGE_TXCFG_IGN_CARR));
! 				NGE_SETBIT(sc, NGE_RX_CFG, NGE_RXCFG_RX_FDX);
! 			} else {
! 				NGE_CLRBIT(sc, NGE_TX_CFG,
! 				    (NGE_TXCFG_IGN_HBEAT|NGE_TXCFG_IGN_CARR));
! 				NGE_CLRBIT(sc, NGE_RX_CFG, NGE_RXCFG_RX_FDX);
! 			}
  
! 		} else if ((sc->nge_ifmedia.ifm_cur->ifm_media & IFM_GMASK) 
! 			!= IFM_FDX) {
! 			NGE_CLRBIT(sc, NGE_TX_CFG,
! 			    (NGE_TXCFG_IGN_HBEAT|NGE_TXCFG_IGN_CARR));
! 			NGE_CLRBIT(sc, NGE_RX_CFG, NGE_RXCFG_RX_FDX);
! 		} else {
! 			NGE_SETBIT(sc, NGE_TX_CFG,
! 			    (NGE_TXCFG_IGN_HBEAT|NGE_TXCFG_IGN_CARR));
! 			NGE_SETBIT(sc, NGE_RX_CFG, NGE_RXCFG_RX_FDX);
! 		}
  	} else {
! 		mii = device_get_softc(sc->nge_miibus);
  
! 		if ((mii->mii_media_active & IFM_GMASK) == IFM_FDX) {
! 			NGE_SETBIT(sc, NGE_TX_CFG,
! 			    (NGE_TXCFG_IGN_HBEAT|NGE_TXCFG_IGN_CARR));
! 			NGE_SETBIT(sc, NGE_RX_CFG, NGE_RXCFG_RX_FDX);
! 		} else {
! 			NGE_CLRBIT(sc, NGE_TX_CFG,
! 			    (NGE_TXCFG_IGN_HBEAT|NGE_TXCFG_IGN_CARR));
! 			NGE_CLRBIT(sc, NGE_RX_CFG, NGE_RXCFG_RX_FDX);
! 		}
  
+ 		/* If we have a 1000Mbps link, set the mode_1000 bit. */
+ 		if (IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_TX ||
+ 		    IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_SX) {
+ 			NGE_SETBIT(sc, NGE_CFG, NGE_CFG_MODE_1000);
+ 		} else {
+ 			NGE_CLRBIT(sc, NGE_CFG, NGE_CFG_MODE_1000);
+ 		}
+ 	}
  	return;
  }
  
***************
*** 794,799 ****
--- 823,829 ----
  	struct nge_softc	*sc;
  	struct ifnet		*ifp;
  	int			unit, error = 0, rid;
+ 	const char		*sep = "";
  
  	s = splimp();
  
***************
*** 953,966 ****
  	 * Do MII setup.
  	 */
  	if (mii_phy_probe(dev, &sc->nge_miibus,
! 	    nge_ifmedia_upd, nge_ifmedia_sts)) {
! 		printf("nge%d: MII without any PHY!\n", sc->nge_unit);
! 		nge_free_jumbo_mem(sc);
! 		bus_teardown_intr(dev, sc->nge_irq, sc->nge_intrhand);
! 		bus_release_resource(dev, SYS_RES_IRQ, 0, sc->nge_irq);
! 		bus_release_resource(dev, NGE_RES, NGE_RID, sc->nge_res);
! 		error = ENXIO;
! 		goto fail;
  	}
  
  	/*
--- 983,1030 ----
  	 * Do MII setup.
  	 */
  	if (mii_phy_probe(dev, &sc->nge_miibus,
! 			  nge_ifmedia_upd, nge_ifmedia_sts)) {
! 		if (CSR_READ_4(sc, NGE_CFG) & NGE_CFG_TBI_EN) {
! 			sc->nge_tbi = 1;
! 			device_printf(dev, "Using TBI\n");
! 			
! 			sc->nge_miibus = dev;
! 
! 			ifmedia_init(&sc->nge_ifmedia, 0, nge_ifmedia_upd, 
! 				nge_ifmedia_sts);
! #define	ADD(m, c)	ifmedia_add(&sc->nge_ifmedia, (m), (c), NULL)
! #define PRINT(s)	printf("%s%s", sep, s); sep = ", "
! 			ADD(IFM_MAKEWORD(IFM_ETHER, IFM_NONE, 0, 0), 0);
! 			device_printf(dev, " ");
! 			ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_SX, 0, 0), 0);
! 			PRINT("1000baseSX");
! 			ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_SX, IFM_FDX, 0),0);
! 			PRINT("1000baseSX-FDX");
! 			ADD(IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, 0), 0);
! 			PRINT("auto");
! 	    
! 			printf("\n");
! #undef ADD
! #undef PRINT
! 			ifmedia_set(&sc->nge_ifmedia, 
! 				IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, 0));
! 	    
! 			CSR_WRITE_4(sc, NGE_GPIO, CSR_READ_4(sc, NGE_GPIO)
! 				| NGE_GPIO_GP4_OUT 
! 				| NGE_GPIO_GP1_OUTENB | NGE_GPIO_GP2_OUTENB 
! 				| NGE_GPIO_GP3_OUTENB
! 				| NGE_GPIO_GP3_IN | NGE_GPIO_GP4_IN);
! 	    
! 		} else {
! 			printf("nge%d: MII without any PHY!\n", sc->nge_unit);
! 			nge_free_jumbo_mem(sc);
! 			bus_teardown_intr(dev, sc->nge_irq, sc->nge_intrhand);
! 			bus_release_resource(dev, SYS_RES_IRQ, 0, sc->nge_irq);
! 			bus_release_resource(dev, NGE_RES, NGE_RID, 
! 					 sc->nge_res);
! 			error = ENXIO;
! 			goto fail;
! 		}
  	}
  
  	/*
***************
*** 970,975 ****
--- 1034,1040 ----
  	callout_handle_init(&sc->nge_stat_ch);
  
  fail:
+ 
  	splx(s);
  	return(error);
  }
***************
*** 991,998 ****
  	ether_ifdetach(ifp, ETHER_BPF_SUPPORTED);
  
  	bus_generic_detach(dev);
! 	device_delete_child(dev, sc->nge_miibus);
! 
  	bus_teardown_intr(dev, sc->nge_irq, sc->nge_intrhand);
  	bus_release_resource(dev, SYS_RES_IRQ, 0, sc->nge_irq);
  	bus_release_resource(dev, NGE_RES, NGE_RID, sc->nge_res);
--- 1056,1064 ----
  	ether_ifdetach(ifp, ETHER_BPF_SUPPORTED);
  
  	bus_generic_detach(dev);
! 	if (!sc->nge_tbi){
! 		device_delete_child(dev, sc->nge_miibus);
! 	}
  	bus_teardown_intr(dev, sc->nge_irq, sc->nge_intrhand);
  	bus_release_resource(dev, SYS_RES_IRQ, 0, sc->nge_irq);
  	bus_release_resource(dev, NGE_RES, NGE_RID, sc->nge_res);
***************
*** 1330,1336 ****
  		cur_rx->nge_mbuf = NULL;
  		total_len = NGE_RXBYTES(cur_rx);
  		NGE_INC(i, NGE_RX_LIST_CNT);
- 
  		/*
  		 * If an error occurs, update stats, clear the
  		 * status word and leave the mbuf cluster in place:
--- 1396,1401 ----
***************
*** 1343,1349 ****
  			continue;
  		}
  
- 
  		/*
  		 * Ok. NatSemi really screwed up here. This is the
  		 * only gigE chip I know of with alignment constraints
--- 1408,1413 ----
***************
*** 1505,1527 ****
  	sc = xsc;
  	ifp = &sc->arpcom.ac_if;
  
! 	mii = device_get_softc(sc->nge_miibus);
! 	mii_tick(mii);
! 
! 	if (!sc->nge_link) {
! 		mii_pollstat(mii);
! 		if (mii->mii_media_status & IFM_ACTIVE &&
! 		    IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) {
! 			sc->nge_link++;
! 			if (IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_TX)
  				printf("nge%d: gigabit link up\n",
  				    sc->nge_unit);
! 			if (ifp->if_snd.ifq_head != NULL)
! 				nge_start(ifp);
! 		} else
! 			sc->nge_stat_ch = timeout(nge_tick, sc, hz);
! 	}
  
  
  	splx(s);
  
--- 1569,1606 ----
  	sc = xsc;
  	ifp = &sc->arpcom.ac_if;
  
! 	if (sc->nge_tbi){
! 		if (!sc->nge_link) {
! 			if (CSR_READ_4(sc, NGE_TBI_BMSR) 
! 			    & NGE_TBIBMSR_ANEG_DONE){
  				printf("nge%d: gigabit link up\n",
  				    sc->nge_unit);
! 				nge_miibus_statchg(sc->nge_miibus);
! 				sc->nge_link++;
! 				if (ifp->if_snd.ifq_head != NULL)
! 					nge_start(ifp);
! 			} else
! 				sc->nge_stat_ch = timeout(nge_tick, sc, hz);
! 		}
! 	} else {
! 		mii = device_get_softc(sc->nge_miibus);
! 		mii_tick(mii);
  
+ 		if (!sc->nge_link) {
+ 			mii_pollstat(mii);
+ 			if (mii->mii_media_status & IFM_ACTIVE &&
+ 			    IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) {
+ 				sc->nge_link++;
+ 				if (IFM_SUBTYPE(mii->mii_media_active) 
+ 				    == IFM_1000_TX)
+ 					printf("nge%d: gigabit link up\n",
+ 					    sc->nge_unit);
+ 				if (ifp->if_snd.ifq_head != NULL)
+ 					nge_start(ifp);
+ 			} else
+ 				sc->nge_stat_ch = timeout(nge_tick, sc, hz);
+ 		}
+ 	}
  
  	splx(s);
  
***************
*** 1547,1552 ****
--- 1626,1636 ----
  	/* Disable interrupts. */
  	CSR_WRITE_4(sc, NGE_IER, 0);
  
+ 	/* Data LED on for TBI mode */
+ 	if(sc->nge_tbi)
+ 		 CSR_WRITE_4(sc, NGE_GPIO, CSR_READ_4(sc, NGE_GPIO)
+ 			     | NGE_GPIO_GP3_OUT);
+ 
  	for (;;) {
  		/* Reading the ISR register clears all interrupts. */
  		status = CSR_READ_4(sc, NGE_ISR);
***************
*** 1588,1593 ****
--- 1672,1683 ----
  	if (ifp->if_snd.ifq_head != NULL)
  		nge_start(ifp);
  
+ 	/* Data LED off for TBI mode */
+ 
+ 	if(sc->nge_tbi)
+ 		CSR_WRITE_4(sc, NGE_GPIO, CSR_READ_4(sc, NGE_GPIO)
+ 			    & ~NGE_GPIO_GP3_OUT);
+ 
  	return;
  }
  
***************
*** 1738,1744 ****
  	 */
  	nge_stop(sc);
  
! 	mii = device_get_softc(sc->nge_miibus);
  
  	/* Set MAC address */
  	CSR_WRITE_4(sc, NGE_RXFILT_CTL, NGE_FILTADDR_PAR0);
--- 1828,1838 ----
  	 */
  	nge_stop(sc);
  
! 	if (sc->nge_tbi){
! 		mii = NULL;
! 	} else {
! 		mii = device_get_softc(sc->nge_miibus);
! 	}
  
  	/* Set MAC address */
  	CSR_WRITE_4(sc, NGE_RXFILT_CTL, NGE_FILTADDR_PAR0);
***************
*** 1836,1852 ****
  	 */
  	NGE_SETBIT(sc, NGE_VLAN_IP_TXCTL, NGE_VIPTXCTL_TAG_PER_PKT);
  
- 	/* Set full/half duplex mode. */
- 	if ((mii->mii_media_active & IFM_GMASK) == IFM_FDX) {
- 		NGE_SETBIT(sc, NGE_TX_CFG,
- 		    (NGE_TXCFG_IGN_HBEAT|NGE_TXCFG_IGN_CARR));
- 		NGE_SETBIT(sc, NGE_RX_CFG, NGE_RXCFG_RX_FDX);
- 	} else {
- 		NGE_CLRBIT(sc, NGE_TX_CFG,
- 		    (NGE_TXCFG_IGN_HBEAT|NGE_TXCFG_IGN_CARR));
- 		NGE_CLRBIT(sc, NGE_RX_CFG, NGE_RXCFG_RX_FDX);
- 	}
- 
  	/*
  	 * Enable the delivery of PHY interrupts based on
  	 * link/speed/duplex status changes. Also enable the
--- 1930,1935 ----
***************
*** 1895,1909 ****
  
  	sc = ifp->if_softc;
  
! 	mii = device_get_softc(sc->nge_miibus);
! 	sc->nge_link = 0;
! 	if (mii->mii_instance) {
! 		struct mii_softc	*miisc;
! 		for (miisc = LIST_FIRST(&mii->mii_phys); miisc != NULL;
! 		    miisc = LIST_NEXT(miisc, mii_list))
! 			mii_phy_reset(miisc);
  	}
- 	mii_mediachg(mii);
  
  	return(0);
  }
--- 1978,2022 ----
  
  	sc = ifp->if_softc;
  
! 	if (sc->nge_tbi){
! 		if (IFM_SUBTYPE(sc->nge_ifmedia.ifm_cur->ifm_media) 
! 		     == IFM_AUTO) {
! 			CSR_WRITE_4(sc, NGE_TBI_ANAR, 
! 				CSR_READ_4(sc, NGE_TBI_ANAR)
! 					| NGE_TBIANAR_HDX | NGE_TBIANAR_FDX);
! 			CSR_WRITE_4(sc, NGE_TBI_BMCR, NGE_TBIBMCR_ENABLE_ANEG
! 				| NGE_TBIBMCR_RESTART_ANEG);
! 			CSR_WRITE_4(sc, NGE_TBI_BMCR, NGE_TBIBMCR_ENABLE_ANEG);
! 		} else if ((sc->nge_ifmedia.ifm_cur->ifm_media 
! 			    & IFM_GMASK) == IFM_FDX) {
! 			NGE_SETBIT(sc, NGE_TX_CFG,
! 			    (NGE_TXCFG_IGN_HBEAT|NGE_TXCFG_IGN_CARR));
! 			NGE_SETBIT(sc, NGE_RX_CFG, NGE_RXCFG_RX_FDX);
! 
! 			CSR_WRITE_4(sc, NGE_TBI_ANAR, 0);
! 			CSR_WRITE_4(sc, NGE_TBI_BMCR, 0);
! 		} else {
! 			NGE_CLRBIT(sc, NGE_TX_CFG,
! 			    (NGE_TXCFG_IGN_HBEAT|NGE_TXCFG_IGN_CARR));
! 			NGE_CLRBIT(sc, NGE_RX_CFG, NGE_RXCFG_RX_FDX);
! 
! 			CSR_WRITE_4(sc, NGE_TBI_ANAR, 0);
! 			CSR_WRITE_4(sc, NGE_TBI_BMCR, 0);
! 		}
! 			
! 		CSR_WRITE_4(sc, NGE_GPIO, CSR_READ_4(sc, NGE_GPIO)
! 			    & ~NGE_GPIO_GP3_OUT);
! 	} else {
! 		mii = device_get_softc(sc->nge_miibus);
! 		sc->nge_link = 0;
! 		if (mii->mii_instance) {
! 			struct mii_softc	*miisc;
! 			for (miisc = LIST_FIRST(&mii->mii_phys); miisc != NULL;
! 			    miisc = LIST_NEXT(miisc, mii_list))
! 				mii_phy_reset(miisc);
! 		}
! 		mii_mediachg(mii);
  	}
  
  	return(0);
  }
***************
*** 1920,1929 ****
  
  	sc = ifp->if_softc;
  
! 	mii = device_get_softc(sc->nge_miibus);
! 	mii_pollstat(mii);
! 	ifmr->ifm_active = mii->mii_media_active;
! 	ifmr->ifm_status = mii->mii_media_status;
  
  	return;
  }
--- 2033,2082 ----
  
  	sc = ifp->if_softc;
  
! 	if (sc->nge_tbi){ /* DJA */
! 		ifmr->ifm_status = IFM_AVALID;
! 		ifmr->ifm_active = IFM_ETHER;
! 
! 		/*
! printf("NGE_TBI_BMCR   %x\n",CSR_READ_4(sc, NGE_TBI_BMCR));
! printf("NGE_TBI_BMSR   %x\n",CSR_READ_4(sc, NGE_TBI_BMSR));
! printf("NGE_TBI_ANAR   %x\n",CSR_READ_4(sc, NGE_TBI_ANAR));
! printf("NGE_TBI_ANLPAR %x\n",CSR_READ_4(sc, NGE_TBI_ANLPAR));
! printf("NGE_TBI_ANER   %x\n",CSR_READ_4(sc, NGE_TBI_ANER));
! printf("NGE_TBI_ESR    %x\n",CSR_READ_4(sc, NGE_TBI_ESR));
! 		*/
! 
! 		if (CSR_READ_4(sc, NGE_TBI_BMSR) & NGE_TBIBMSR_ANEG_DONE){
! 			ifmr->ifm_status |= IFM_ACTIVE;
! 		} 
! 		if (CSR_READ_4(sc, NGE_TBI_BMCR) & NGE_TBIBMCR_LOOPBACK)
! 			ifmr->ifm_active |= IFM_LOOP;
! 		if (!CSR_READ_4(sc, NGE_TBI_BMSR) & NGE_TBIBMSR_ANEG_DONE){
! 			ifmr->ifm_active |= IFM_NONE;
! 			ifmr->ifm_status = 0;
! 			return;
! 		} 
! 		ifmr->ifm_active |= IFM_1000_SX;
! 		if (IFM_SUBTYPE(sc->nge_ifmedia.ifm_cur->ifm_media) 
! 		    == IFM_AUTO)
! 		  ifmr->ifm_active |= IFM_AUTO;		  
! 		  if (CSR_READ_4(sc, NGE_TBI_ANLPAR) & NGE_TBIANAR_FDX){
! 			ifmr->ifm_active |= IFM_FDX;
! 		  }else if (CSR_READ_4(sc, NGE_TBI_ANLPAR) & NGE_TBIANAR_HDX){
! 			ifmr->ifm_active |= IFM_HDX;
! 		  }
! 		else if ((sc->nge_ifmedia.ifm_cur->ifm_media & IFM_GMASK) 
! 			== IFM_FDX)
! 			ifmr->ifm_active |= IFM_FDX;
! 		else
! 			ifmr->ifm_active |= IFM_HDX;
!  
! 	} else {
! 		mii = device_get_softc(sc->nge_miibus);
! 		mii_pollstat(mii);
! 		ifmr->ifm_active = mii->mii_media_active;
! 		ifmr->ifm_status = mii->mii_media_status;
! 	}
  
  	return;
  }
***************
*** 1995,2002 ****
  		break;
  	case SIOCGIFMEDIA:
  	case SIOCSIFMEDIA:
! 		mii = device_get_softc(sc->nge_miibus);
! 		error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, command);
  		break;
  	default:
  		error = EINVAL;
--- 2148,2161 ----
  		break;
  	case SIOCGIFMEDIA:
  	case SIOCSIFMEDIA:
! 		if (sc->nge_tbi){ /* DJA */
! 			error = ifmedia_ioctl(ifp, ifr, &sc->nge_ifmedia, 
! 					      command);
! 		} else{
! 			mii = device_get_softc(sc->nge_miibus);
! 			error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, 
! 					      command);
! 		}
  		break;
  	default:
  		error = EINVAL;
***************
*** 2044,2050 ****
  
  	ifp = &sc->arpcom.ac_if;
  	ifp->if_timer = 0;
! 	mii = device_get_softc(sc->nge_miibus);
  
  	untimeout(nge_tick, sc, sc->nge_stat_ch);
  	CSR_WRITE_4(sc, NGE_IER, 0);
--- 2203,2213 ----
  
  	ifp = &sc->arpcom.ac_if;
  	ifp->if_timer = 0;
! 	if (sc->nge_tbi){
! 		mii = NULL;
! 	} else {
! 		mii = device_get_softc(sc->nge_miibus);
! 	}
  
  	untimeout(nge_tick, sc, sc->nge_stat_ch);
  	CSR_WRITE_4(sc, NGE_IER, 0);
***************
*** 2061,2070 ****
  	 */
  	itmp = ifp->if_flags;
  	ifp->if_flags |= IFF_UP;
! 	ifm = mii->mii_media.ifm_cur;
  	mtmp = ifm->ifm_media;
  	ifm->ifm_media = IFM_ETHER|IFM_NONE;
! 	mii_mediachg(mii);
  	ifm->ifm_media = mtmp;
  	ifp->if_flags = itmp;
  
--- 2224,2240 ----
  	 */
  	itmp = ifp->if_flags;
  	ifp->if_flags |= IFF_UP;
! 
! 	if (sc->nge_tbi)
! 		ifm = sc->nge_ifmedia.ifm_cur;
! 	else
! 		ifm = mii->mii_media.ifm_cur;
! 	
  	mtmp = ifm->ifm_media;
  	ifm->ifm_media = IFM_ETHER|IFM_NONE;
! 	
! 	if (!sc->nge_tbi)
! 		mii_mediachg(mii);
  	ifm->ifm_media = mtmp;
  	ifp->if_flags = itmp;
  

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-net" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200202182116.g1ILGij59734>