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 [EMAIL PROTECTED] with "unsubscribe freebsd-net" in the body of the message