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>
