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

Reply via email to