root/dev/pci/if_nge.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. nge_delay
  2. nge_eeprom_idle
  3. nge_eeprom_putbyte
  4. nge_eeprom_getword
  5. nge_read_eeprom
  6. nge_mii_sync
  7. nge_mii_send
  8. nge_mii_readreg
  9. nge_mii_writereg
  10. nge_miibus_readreg
  11. nge_miibus_writereg
  12. nge_miibus_statchg
  13. nge_setmulti
  14. nge_reset
  15. nge_probe
  16. nge_attach
  17. nge_list_tx_init
  18. nge_list_rx_init
  19. nge_newbuf
  20. nge_alloc_jumbo_mem
  21. nge_jalloc
  22. nge_jfree
  23. nge_rxeof
  24. nge_txeof
  25. nge_tick
  26. nge_intr
  27. nge_encap
  28. nge_start
  29. nge_init
  30. nge_ifmedia_mii_upd
  31. nge_ifmedia_mii_sts
  32. nge_ifmedia_tbi_upd
  33. nge_ifmedia_tbi_sts
  34. nge_ioctl
  35. nge_watchdog
  36. nge_stop
  37. nge_shutdown

    1 /*      $OpenBSD: if_nge.c,v 1.56 2006/10/25 02:37:50 brad Exp $        */
    2 /*
    3  * Copyright (c) 2001 Wind River Systems
    4  * Copyright (c) 1997, 1998, 1999, 2000, 2001
    5  *      Bill Paul <wpaul@bsdi.com>.  All rights reserved.
    6  *
    7  * Redistribution and use in source and binary forms, with or without
    8  * modification, are permitted provided that the following conditions
    9  * are met:
   10  * 1. Redistributions of source code must retain the above copyright
   11  *    notice, this list of conditions and the following disclaimer.
   12  * 2. Redistributions in binary form must reproduce the above copyright
   13  *    notice, this list of conditions and the following disclaimer in the
   14  *    documentation and/or other materials provided with the distribution.
   15  * 3. All advertising materials mentioning features or use of this software
   16  *    must display the following acknowledgement:
   17  *      This product includes software developed by Bill Paul.
   18  * 4. Neither the name of the author nor the names of any co-contributors
   19  *    may be used to endorse or promote products derived from this software
   20  *    without specific prior written permission.
   21  *
   22  * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
   23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   25  * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
   26  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   27  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   28  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   29  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   30  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   31  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
   32  * THE POSSIBILITY OF SUCH DAMAGE.
   33  *
   34  * $FreeBSD: if_nge.c,v 1.35 2002/08/08 18:33:28 ambrisko Exp $
   35  */
   36 
   37 /*
   38  * National Semiconductor DP83820/DP83821 gigabit ethernet driver
   39  * for FreeBSD. Datasheets are available from:
   40  *
   41  * http://www.national.com/ds/DP/DP83820.pdf
   42  * http://www.national.com/ds/DP/DP83821.pdf
   43  *
   44  * These chips are used on several low cost gigabit ethernet NICs
   45  * sold by D-Link, Addtron, SMC and Asante. Both parts are
   46  * virtually the same, except the 83820 is a 64-bit/32-bit part,
   47  * while the 83821 is 32-bit only.
   48  *
   49  * Many cards also use National gigE transceivers, such as the
   50  * DP83891, DP83861 and DP83862 gigPHYTER parts. The DP83861 datasheet
   51  * contains a full register description that applies to all of these
   52  * components:
   53  *
   54  * http://www.national.com/ds/DP/DP83861.pdf
   55  *
   56  * Written by Bill Paul <wpaul@bsdi.com>
   57  * BSDi Open Source Solutions
   58  */
   59 
   60 /*
   61  * The NatSemi DP83820 and 83821 controllers are enhanced versions
   62  * of the NatSemi MacPHYTER 10/100 devices. They support 10, 100
   63  * and 1000Mbps speeds with 1000baseX (ten bit interface), MII and GMII
   64  * ports. Other features include 8K TX FIFO and 32K RX FIFO, TCP/IP
   65  * hardware checksum offload (IPv4 only), VLAN tagging and filtering,
   66  * priority TX and RX queues, a 2048 bit multicast hash filter, 4 RX pattern
   67  * matching buffers, one perfect address filter buffer and interrupt
   68  * moderation. The 83820 supports both 64-bit and 32-bit addressing
   69  * and data transfers: the 64-bit support can be toggled on or off
   70  * via software. This affects the size of certain fields in the DMA
   71  * descriptors.
   72  *
   73  * There are two bugs/misfeatures in the 83820/83821 that I have
   74  * discovered so far:
   75  *
   76  * - Receive buffers must be aligned on 64-bit boundaries, which means
   77  *   you must resort to copying data in order to fix up the payload
   78  *   alignment.
   79  *
   80  * - In order to transmit jumbo frames larger than 8170 bytes, you have
   81  *   to turn off transmit checksum offloading, because the chip can't
   82  *   compute the checksum on an outgoing frame unless it fits entirely
   83  *   within the TX FIFO, which is only 8192 bytes in size. If you have
   84  *   TX checksum offload enabled and you transmit attempt to transmit a
   85  *   frame larger than 8170 bytes, the transmitter will wedge.
   86  *
   87  * To work around the latter problem, TX checksum offload is disabled
   88  * if the user selects an MTU larger than 8152 (8170 - 18).
   89  */
   90 
   91 #include "bpfilter.h"
   92 #include "vlan.h"
   93 
   94 #include <sys/param.h>
   95 #include <sys/systm.h>
   96 #include <sys/sockio.h>
   97 #include <sys/mbuf.h>
   98 #include <sys/malloc.h>
   99 #include <sys/kernel.h>
  100 #include <sys/device.h>
  101 #include <sys/socket.h>
  102 
  103 #include <net/if.h>
  104 #include <net/if_dl.h>
  105 #include <net/if_media.h>
  106 
  107 #ifdef INET
  108 #include <netinet/in.h>
  109 #include <netinet/in_systm.h>
  110 #include <netinet/in_var.h>
  111 #include <netinet/ip.h>
  112 #include <netinet/if_ether.h>
  113 #endif
  114 
  115 #if NVLAN > 0
  116 #include <net/if_types.h>
  117 #include <net/if_vlan_var.h>
  118 #endif
  119 
  120 #if NBPFILTER > 0
  121 #include <net/bpf.h>
  122 #endif
  123 
  124 #include <uvm/uvm_extern.h>              /* for vtophys */
  125 #define VTOPHYS(v)      vtophys((vaddr_t)(v))
  126 
  127 #include <dev/pci/pcireg.h>
  128 #include <dev/pci/pcivar.h>
  129 #include <dev/pci/pcidevs.h>
  130 
  131 #include <dev/mii/mii.h>
  132 #include <dev/mii/miivar.h>
  133 
  134 #define NGE_USEIOSPACE
  135 
  136 #include <dev/pci/if_ngereg.h>
  137 
  138 int nge_probe(struct device *, void *, void *);
  139 void nge_attach(struct device *, struct device *, void *);
  140 
  141 int nge_alloc_jumbo_mem(struct nge_softc *);
  142 void *nge_jalloc(struct nge_softc *);
  143 void nge_jfree(caddr_t, u_int, void *);
  144 
  145 int nge_newbuf(struct nge_softc *, struct nge_desc *,
  146                              struct mbuf *);
  147 int nge_encap(struct nge_softc *, struct mbuf *, u_int32_t *);
  148 void nge_rxeof(struct nge_softc *);
  149 void nge_txeof(struct nge_softc *);
  150 int nge_intr(void *);
  151 void nge_tick(void *);
  152 void nge_start(struct ifnet *);
  153 int nge_ioctl(struct ifnet *, u_long, caddr_t);
  154 void nge_init(void *);
  155 void nge_stop(struct nge_softc *);
  156 void nge_watchdog(struct ifnet *);
  157 void nge_shutdown(void *);
  158 int nge_ifmedia_mii_upd(struct ifnet *);
  159 void nge_ifmedia_mii_sts(struct ifnet *, struct ifmediareq *);
  160 int nge_ifmedia_tbi_upd(struct ifnet *);
  161 void nge_ifmedia_tbi_sts(struct ifnet *, struct ifmediareq *);
  162 
  163 void nge_delay(struct nge_softc *);
  164 void nge_eeprom_idle(struct nge_softc *);
  165 void nge_eeprom_putbyte(struct nge_softc *, int);
  166 void nge_eeprom_getword(struct nge_softc *, int, u_int16_t *);
  167 void nge_read_eeprom(struct nge_softc *, caddr_t, int, int, int);
  168 
  169 void nge_mii_sync(struct nge_softc *);
  170 void nge_mii_send(struct nge_softc *, u_int32_t, int);
  171 int nge_mii_readreg(struct nge_softc *, struct nge_mii_frame *);
  172 int nge_mii_writereg(struct nge_softc *, struct nge_mii_frame *);
  173 
  174 int nge_miibus_readreg(struct device *, int, int);
  175 void nge_miibus_writereg(struct device *, int, int, int);
  176 void nge_miibus_statchg(struct device *);
  177 
  178 void nge_setmulti(struct nge_softc *);
  179 void nge_reset(struct nge_softc *);
  180 int nge_list_rx_init(struct nge_softc *);
  181 int nge_list_tx_init(struct nge_softc *);
  182 
  183 #ifdef NGE_USEIOSPACE
  184 #define NGE_RES                 SYS_RES_IOPORT
  185 #define NGE_RID                 NGE_PCI_LOIO
  186 #else
  187 #define NGE_RES                 SYS_RES_MEMORY
  188 #define NGE_RID                 NGE_PCI_LOMEM
  189 #endif
  190 
  191 #ifdef NGE_DEBUG
  192 #define DPRINTF(x)      if (ngedebug) printf x
  193 #define DPRINTFN(n,x)   if (ngedebug >= (n)) printf x
  194 int     ngedebug = 0;
  195 #else
  196 #define DPRINTF(x)
  197 #define DPRINTFN(n,x)
  198 #endif
  199 
  200 #define NGE_SETBIT(sc, reg, x)                          \
  201         CSR_WRITE_4(sc, reg,                            \
  202                 CSR_READ_4(sc, reg) | (x))
  203 
  204 #define NGE_CLRBIT(sc, reg, x)                          \
  205         CSR_WRITE_4(sc, reg,                            \
  206                 CSR_READ_4(sc, reg) & ~(x))
  207 
  208 #define SIO_SET(x)                                      \
  209         CSR_WRITE_4(sc, NGE_MEAR, CSR_READ_4(sc, NGE_MEAR) | (x))
  210 
  211 #define SIO_CLR(x)                                      \
  212         CSR_WRITE_4(sc, NGE_MEAR, CSR_READ_4(sc, NGE_MEAR) & ~(x))
  213 
  214 void
  215 nge_delay(sc)
  216         struct nge_softc        *sc;
  217 {
  218         int                     idx;
  219 
  220         for (idx = (300 / 33) + 1; idx > 0; idx--)
  221                 CSR_READ_4(sc, NGE_CSR);
  222 }
  223 
  224 void
  225 nge_eeprom_idle(sc)
  226         struct nge_softc        *sc;
  227 {
  228         int             i;
  229 
  230         SIO_SET(NGE_MEAR_EE_CSEL);
  231         nge_delay(sc);
  232         SIO_SET(NGE_MEAR_EE_CLK);
  233         nge_delay(sc);
  234 
  235         for (i = 0; i < 25; i++) {
  236                 SIO_CLR(NGE_MEAR_EE_CLK);
  237                 nge_delay(sc);
  238                 SIO_SET(NGE_MEAR_EE_CLK);
  239                 nge_delay(sc);
  240         }
  241 
  242         SIO_CLR(NGE_MEAR_EE_CLK);
  243         nge_delay(sc);
  244         SIO_CLR(NGE_MEAR_EE_CSEL);
  245         nge_delay(sc);
  246         CSR_WRITE_4(sc, NGE_MEAR, 0x00000000);
  247 }
  248 
  249 /*
  250  * Send a read command and address to the EEPROM, check for ACK.
  251  */
  252 void
  253 nge_eeprom_putbyte(sc, addr)
  254         struct nge_softc        *sc;
  255         int                     addr;
  256 {
  257         int                     d, i;
  258 
  259         d = addr | NGE_EECMD_READ;
  260 
  261         /*
  262          * Feed in each bit and strobe the clock.
  263          */
  264         for (i = 0x400; i; i >>= 1) {
  265                 if (d & i) {
  266                         SIO_SET(NGE_MEAR_EE_DIN);
  267                 } else {
  268                         SIO_CLR(NGE_MEAR_EE_DIN);
  269                 }
  270                 nge_delay(sc);
  271                 SIO_SET(NGE_MEAR_EE_CLK);
  272                 nge_delay(sc);
  273                 SIO_CLR(NGE_MEAR_EE_CLK);
  274                 nge_delay(sc);
  275         }
  276 }
  277 
  278 /*
  279  * Read a word of data stored in the EEPROM at address 'addr.'
  280  */
  281 void
  282 nge_eeprom_getword(sc, addr, dest)
  283         struct nge_softc        *sc;
  284         int                     addr;
  285         u_int16_t               *dest;
  286 {
  287         int                     i;
  288         u_int16_t               word = 0;
  289 
  290         /* Force EEPROM to idle state. */
  291         nge_eeprom_idle(sc);
  292 
  293         /* Enter EEPROM access mode. */
  294         nge_delay(sc);
  295         SIO_CLR(NGE_MEAR_EE_CLK);
  296         nge_delay(sc);
  297         SIO_SET(NGE_MEAR_EE_CSEL);
  298         nge_delay(sc);
  299 
  300         /*
  301          * Send address of word we want to read.
  302          */
  303         nge_eeprom_putbyte(sc, addr);
  304 
  305         /*
  306          * Start reading bits from EEPROM.
  307          */
  308         for (i = 0x8000; i; i >>= 1) {
  309                 SIO_SET(NGE_MEAR_EE_CLK);
  310                 nge_delay(sc);
  311                 if (CSR_READ_4(sc, NGE_MEAR) & NGE_MEAR_EE_DOUT)
  312                         word |= i;
  313                 nge_delay(sc);
  314                 SIO_CLR(NGE_MEAR_EE_CLK);
  315                 nge_delay(sc);
  316         }
  317 
  318         /* Turn off EEPROM access mode. */
  319         nge_eeprom_idle(sc);
  320 
  321         *dest = word;
  322 }
  323 
  324 /*
  325  * Read a sequence of words from the EEPROM.
  326  */
  327 void
  328 nge_read_eeprom(sc, dest, off, cnt, swap)
  329         struct nge_softc        *sc;
  330         caddr_t                 dest;
  331         int                     off;
  332         int                     cnt;
  333         int                     swap;
  334 {
  335         int                     i;
  336         u_int16_t               word = 0, *ptr;
  337 
  338         for (i = 0; i < cnt; i++) {
  339                 nge_eeprom_getword(sc, off + i, &word);
  340                 ptr = (u_int16_t *)(dest + (i * 2));
  341                 if (swap)
  342                         *ptr = ntohs(word);
  343                 else
  344                         *ptr = word;
  345         }
  346 }
  347 
  348 /*
  349  * Sync the PHYs by setting data bit and strobing the clock 32 times.
  350  */
  351 void
  352 nge_mii_sync(sc)
  353         struct nge_softc                *sc;
  354 {
  355         int                     i;
  356 
  357         SIO_SET(NGE_MEAR_MII_DIR|NGE_MEAR_MII_DATA);
  358 
  359         for (i = 0; i < 32; i++) {
  360                 SIO_SET(NGE_MEAR_MII_CLK);
  361                 DELAY(1);
  362                 SIO_CLR(NGE_MEAR_MII_CLK);
  363                 DELAY(1);
  364         }
  365 }
  366 
  367 /*
  368  * Clock a series of bits through the MII.
  369  */
  370 void
  371 nge_mii_send(sc, bits, cnt)
  372         struct nge_softc                *sc;
  373         u_int32_t               bits;
  374         int                     cnt;
  375 {
  376         int                     i;
  377 
  378         SIO_CLR(NGE_MEAR_MII_CLK);
  379 
  380         for (i = (0x1 << (cnt - 1)); i; i >>= 1) {
  381                 if (bits & i) {
  382                         SIO_SET(NGE_MEAR_MII_DATA);
  383                 } else {
  384                         SIO_CLR(NGE_MEAR_MII_DATA);
  385                 }
  386                 DELAY(1);
  387                 SIO_CLR(NGE_MEAR_MII_CLK);
  388                 DELAY(1);
  389                 SIO_SET(NGE_MEAR_MII_CLK);
  390         }
  391 }
  392 
  393 /*
  394  * Read an PHY register through the MII.
  395  */
  396 int
  397 nge_mii_readreg(sc, frame)
  398         struct nge_softc                *sc;
  399         struct nge_mii_frame    *frame;
  400 {
  401         int                     i, ack, s;
  402 
  403         s = splnet();
  404 
  405         /*
  406          * Set up frame for RX.
  407          */
  408         frame->mii_stdelim = NGE_MII_STARTDELIM;
  409         frame->mii_opcode = NGE_MII_READOP;
  410         frame->mii_turnaround = 0;
  411         frame->mii_data = 0;
  412 
  413         CSR_WRITE_4(sc, NGE_MEAR, 0);
  414 
  415         /*
  416          * Turn on data xmit.
  417          */
  418         SIO_SET(NGE_MEAR_MII_DIR);
  419 
  420         nge_mii_sync(sc);
  421 
  422         /*
  423          * Send command/address info.
  424          */
  425         nge_mii_send(sc, frame->mii_stdelim, 2);
  426         nge_mii_send(sc, frame->mii_opcode, 2);
  427         nge_mii_send(sc, frame->mii_phyaddr, 5);
  428         nge_mii_send(sc, frame->mii_regaddr, 5);
  429 
  430         /* Idle bit */
  431         SIO_CLR((NGE_MEAR_MII_CLK|NGE_MEAR_MII_DATA));
  432         DELAY(1);
  433         SIO_SET(NGE_MEAR_MII_CLK);
  434         DELAY(1);
  435 
  436         /* Turn off xmit. */
  437         SIO_CLR(NGE_MEAR_MII_DIR);
  438         /* Check for ack */
  439         SIO_CLR(NGE_MEAR_MII_CLK);
  440         DELAY(1);
  441         ack = CSR_READ_4(sc, NGE_MEAR) & NGE_MEAR_MII_DATA;
  442         SIO_SET(NGE_MEAR_MII_CLK);
  443         DELAY(1);
  444 
  445         /*
  446          * Now try reading data bits. If the ack failed, we still
  447          * need to clock through 16 cycles to keep the PHY(s) in sync.
  448          */
  449         if (ack) {
  450                 for(i = 0; i < 16; i++) {
  451                         SIO_CLR(NGE_MEAR_MII_CLK);
  452                         DELAY(1);
  453                         SIO_SET(NGE_MEAR_MII_CLK);
  454                         DELAY(1);
  455                 }
  456                 goto fail;
  457         }
  458 
  459         for (i = 0x8000; i; i >>= 1) {
  460                 SIO_CLR(NGE_MEAR_MII_CLK);
  461                 DELAY(1);
  462                 if (!ack) {
  463                         if (CSR_READ_4(sc, NGE_MEAR) & NGE_MEAR_MII_DATA)
  464                                 frame->mii_data |= i;
  465                         DELAY(1);
  466                 }
  467                 SIO_SET(NGE_MEAR_MII_CLK);
  468                 DELAY(1);
  469         }
  470 
  471 fail:
  472 
  473         SIO_CLR(NGE_MEAR_MII_CLK);
  474         DELAY(1);
  475         SIO_SET(NGE_MEAR_MII_CLK);
  476         DELAY(1);
  477 
  478         splx(s);
  479 
  480         if (ack)
  481                 return(1);
  482         return(0);
  483 }
  484 
  485 /*
  486  * Write to a PHY register through the MII.
  487  */
  488 int
  489 nge_mii_writereg(sc, frame)
  490         struct nge_softc                *sc;
  491         struct nge_mii_frame    *frame;
  492 {
  493         int                     s;
  494 
  495         s = splnet();
  496         /*
  497          * Set up frame for TX.
  498          */
  499 
  500         frame->mii_stdelim = NGE_MII_STARTDELIM;
  501         frame->mii_opcode = NGE_MII_WRITEOP;
  502         frame->mii_turnaround = NGE_MII_TURNAROUND;
  503 
  504         /*
  505          * Turn on data output.
  506          */
  507         SIO_SET(NGE_MEAR_MII_DIR);
  508 
  509         nge_mii_sync(sc);
  510 
  511         nge_mii_send(sc, frame->mii_stdelim, 2);
  512         nge_mii_send(sc, frame->mii_opcode, 2);
  513         nge_mii_send(sc, frame->mii_phyaddr, 5);
  514         nge_mii_send(sc, frame->mii_regaddr, 5);
  515         nge_mii_send(sc, frame->mii_turnaround, 2);
  516         nge_mii_send(sc, frame->mii_data, 16);
  517 
  518         /* Idle bit. */
  519         SIO_SET(NGE_MEAR_MII_CLK);
  520         DELAY(1);
  521         SIO_CLR(NGE_MEAR_MII_CLK);
  522         DELAY(1);
  523 
  524         /*
  525          * Turn off xmit.
  526          */
  527         SIO_CLR(NGE_MEAR_MII_DIR);
  528 
  529         splx(s);
  530 
  531         return(0);
  532 }
  533 
  534 int
  535 nge_miibus_readreg(dev, phy, reg)
  536         struct device           *dev;
  537         int                     phy, reg;
  538 {
  539         struct nge_softc        *sc = (struct nge_softc *)dev;
  540         struct nge_mii_frame    frame;
  541 
  542         DPRINTFN(9, ("%s: nge_miibus_readreg\n", sc->sc_dv.dv_xname));
  543 
  544         bzero((char *)&frame, sizeof(frame));
  545 
  546         frame.mii_phyaddr = phy;
  547         frame.mii_regaddr = reg;
  548         nge_mii_readreg(sc, &frame);
  549 
  550         return(frame.mii_data);
  551 }
  552 
  553 void
  554 nge_miibus_writereg(dev, phy, reg, data)
  555         struct device           *dev;
  556         int                     phy, reg, data;
  557 {
  558         struct nge_softc        *sc = (struct nge_softc *)dev;
  559         struct nge_mii_frame    frame;
  560 
  561 
  562         DPRINTFN(9, ("%s: nge_miibus_writereg\n", sc->sc_dv.dv_xname));
  563 
  564         bzero((char *)&frame, sizeof(frame));
  565 
  566         frame.mii_phyaddr = phy;
  567         frame.mii_regaddr = reg;
  568         frame.mii_data = data;
  569         nge_mii_writereg(sc, &frame);
  570 }
  571 
  572 void
  573 nge_miibus_statchg(dev)
  574         struct device           *dev;
  575 {
  576         struct nge_softc        *sc = (struct nge_softc *)dev;
  577         struct mii_data         *mii = &sc->nge_mii;
  578         u_int32_t               txcfg, rxcfg;
  579 
  580         txcfg = CSR_READ_4(sc, NGE_TX_CFG);
  581         rxcfg = CSR_READ_4(sc, NGE_RX_CFG);
  582 
  583         DPRINTFN(4, ("%s: nge_miibus_statchg txcfg=%#x, rxcfg=%#x\n",
  584                      sc->sc_dv.dv_xname, txcfg, rxcfg));
  585 
  586         if ((mii->mii_media_active & IFM_GMASK) == IFM_FDX) {
  587                 txcfg |= (NGE_TXCFG_IGN_HBEAT|NGE_TXCFG_IGN_CARR);
  588                 rxcfg |= (NGE_RXCFG_RX_FDX);
  589         } else {
  590                 txcfg &= ~(NGE_TXCFG_IGN_HBEAT|NGE_TXCFG_IGN_CARR);
  591                 rxcfg &= ~(NGE_RXCFG_RX_FDX);
  592         }
  593 
  594         txcfg |= NGE_TXCFG_AUTOPAD;
  595         
  596         CSR_WRITE_4(sc, NGE_TX_CFG, txcfg);
  597         CSR_WRITE_4(sc, NGE_RX_CFG, rxcfg);
  598 
  599         /* If we have a 1000Mbps link, set the mode_1000 bit. */
  600         if (IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_T)
  601                 NGE_SETBIT(sc, NGE_CFG, NGE_CFG_MODE_1000);
  602         else
  603                 NGE_CLRBIT(sc, NGE_CFG, NGE_CFG_MODE_1000);
  604 }
  605 
  606 void
  607 nge_setmulti(sc)
  608         struct nge_softc        *sc;
  609 {
  610         struct arpcom           *ac = &sc->arpcom;
  611         struct ifnet            *ifp = &ac->ac_if;
  612         struct ether_multi      *enm;
  613         struct ether_multistep  step;
  614         u_int32_t               h = 0, i, filtsave;
  615         int                     bit, index;
  616 
  617 allmulti:
  618         if (ifp->if_flags & IFF_ALLMULTI || ifp->if_flags & IFF_PROMISC) {
  619                 NGE_CLRBIT(sc, NGE_RXFILT_CTL,
  620                     NGE_RXFILTCTL_MCHASH|NGE_RXFILTCTL_UCHASH);
  621                 NGE_SETBIT(sc, NGE_RXFILT_CTL, NGE_RXFILTCTL_ALLMULTI);
  622                 return;
  623         }
  624 
  625         /*
  626          * We have to explicitly enable the multicast hash table
  627          * on the NatSemi chip if we want to use it, which we do.
  628          * We also have to tell it that we don't want to use the
  629          * hash table for matching unicast addresses.
  630          */
  631         NGE_SETBIT(sc, NGE_RXFILT_CTL, NGE_RXFILTCTL_MCHASH);
  632         NGE_CLRBIT(sc, NGE_RXFILT_CTL,
  633             NGE_RXFILTCTL_ALLMULTI|NGE_RXFILTCTL_UCHASH);
  634 
  635         filtsave = CSR_READ_4(sc, NGE_RXFILT_CTL);
  636 
  637         /* first, zot all the existing hash bits */
  638         for (i = 0; i < NGE_MCAST_FILTER_LEN; i += 2) {
  639                 CSR_WRITE_4(sc, NGE_RXFILT_CTL, NGE_FILTADDR_MCAST_LO + i);
  640                 CSR_WRITE_4(sc, NGE_RXFILT_DATA, 0);
  641         }
  642 
  643         /*
  644          * From the 11 bits returned by the crc routine, the top 7
  645          * bits represent the 16-bit word in the mcast hash table
  646          * that needs to be updated, and the lower 4 bits represent
  647          * which bit within that byte needs to be set.
  648          */
  649         ETHER_FIRST_MULTI(step, ac, enm);
  650         while (enm != NULL) {
  651                 if (bcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
  652                         ifp->if_flags |= IFF_ALLMULTI;
  653                         goto allmulti;
  654                 }
  655                 h = (ether_crc32_be(enm->enm_addrlo, ETHER_ADDR_LEN) >> 21) &
  656                     0x00000FFF;
  657                 index = (h >> 4) & 0x7F;
  658                 bit = h & 0xF;
  659                 CSR_WRITE_4(sc, NGE_RXFILT_CTL,
  660                     NGE_FILTADDR_MCAST_LO + (index * 2));
  661                 NGE_SETBIT(sc, NGE_RXFILT_DATA, (1 << bit));
  662                 ETHER_NEXT_MULTI(step, enm);
  663         }
  664 
  665         CSR_WRITE_4(sc, NGE_RXFILT_CTL, filtsave);
  666 }
  667 
  668 void
  669 nge_reset(sc)
  670         struct nge_softc        *sc;
  671 {
  672         int                     i;
  673 
  674         NGE_SETBIT(sc, NGE_CSR, NGE_CSR_RESET);
  675 
  676         for (i = 0; i < NGE_TIMEOUT; i++) {
  677                 if (!(CSR_READ_4(sc, NGE_CSR) & NGE_CSR_RESET))
  678                         break;
  679         }
  680 
  681         if (i == NGE_TIMEOUT)
  682                 printf("%s: reset never completed\n", sc->sc_dv.dv_xname);
  683 
  684         /* Wait a little while for the chip to get its brains in order. */
  685         DELAY(1000);
  686 
  687         /*
  688          * If this is a NetSemi chip, make sure to clear
  689          * PME mode.
  690          */
  691         CSR_WRITE_4(sc, NGE_CLKRUN, NGE_CLKRUN_PMESTS);
  692         CSR_WRITE_4(sc, NGE_CLKRUN, 0);
  693 }
  694 
  695 /*
  696  * Probe for an NatSemi chip. Check the PCI vendor and device
  697  * IDs against our list and return a device name if we find a match.
  698  */
  699 int
  700 nge_probe(parent, match, aux)
  701         struct device *parent;
  702         void *match;
  703         void *aux;
  704 {
  705         struct pci_attach_args *pa = (struct pci_attach_args *)aux;
  706 
  707         if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_NS &&
  708             PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_NS_DP83820)
  709                 return (1);
  710 
  711         return (0);
  712 }
  713 
  714 /*
  715  * Attach the interface. Allocate softc structures, do ifmedia
  716  * setup and ethernet/BPF attach.
  717  */
  718 void
  719 nge_attach(parent, self, aux)
  720         struct device *parent, *self;
  721         void *aux;
  722 {
  723         struct nge_softc        *sc = (struct nge_softc *)self;
  724         struct pci_attach_args  *pa = aux;
  725         pci_chipset_tag_t       pc = pa->pa_pc;
  726         pci_intr_handle_t       ih;
  727         const char              *intrstr = NULL;
  728         bus_size_t              size;
  729         bus_dma_segment_t       seg;
  730         bus_dmamap_t            dmamap;
  731         int                     rseg;
  732         u_char                  eaddr[ETHER_ADDR_LEN];
  733         pcireg_t                command;
  734 #ifndef NGE_USEIOSPACE
  735         pcireg_t                memtype;
  736 #endif
  737         struct ifnet            *ifp;
  738         caddr_t                 kva;
  739 
  740         /*
  741          * Handle power management nonsense.
  742          */
  743         DPRINTFN(5, ("%s: preparing for conf read\n", sc->sc_dv.dv_xname));
  744         command = pci_conf_read(pc, pa->pa_tag, NGE_PCI_CAPID) & 0x000000FF;
  745         if (command == 0x01) {
  746                 command = pci_conf_read(pc, pa->pa_tag, NGE_PCI_PWRMGMTCTRL);
  747                 if (command & NGE_PSTATE_MASK) {
  748                         pcireg_t        iobase, membase, irq;
  749 
  750                         /* Save important PCI config data. */
  751                         iobase = pci_conf_read(pc, pa->pa_tag, NGE_PCI_LOIO);
  752                         membase = pci_conf_read(pc, pa->pa_tag, NGE_PCI_LOMEM);
  753                         irq = pci_conf_read(pc, pa->pa_tag, NGE_PCI_INTLINE);
  754 
  755                         /* Reset the power state. */
  756                         printf("%s: chip is in D%d power mode "
  757                                "-- setting to D0\n", sc->sc_dv.dv_xname,
  758                                command & NGE_PSTATE_MASK);
  759                         command &= 0xFFFFFFFC;
  760                         pci_conf_write(pc, pa->pa_tag,
  761                                        NGE_PCI_PWRMGMTCTRL, command);
  762 
  763                         /* Restore PCI config data. */
  764                         pci_conf_write(pc, pa->pa_tag, NGE_PCI_LOIO, iobase);
  765                         pci_conf_write(pc, pa->pa_tag, NGE_PCI_LOMEM, membase);
  766                         pci_conf_write(pc, pa->pa_tag, NGE_PCI_INTLINE, irq);
  767                 }
  768         }
  769 
  770         /*
  771          * Map control/status registers.
  772          */
  773         DPRINTFN(5, ("%s: map control/status regs\n", sc->sc_dv.dv_xname));
  774 
  775 #ifdef NGE_USEIOSPACE
  776         DPRINTFN(5, ("%s: pci_mapreg_map\n", sc->sc_dv.dv_xname));
  777         if (pci_mapreg_map(pa, NGE_PCI_LOIO, PCI_MAPREG_TYPE_IO, 0,
  778             &sc->nge_btag, &sc->nge_bhandle, NULL, &size, 0)) {
  779                 printf(": can't map i/o space\n");
  780                 return;
  781         }
  782 #else
  783         DPRINTFN(5, ("%s: pci_mapreg_map\n", sc->sc_dv.dv_xname));
  784         memtype = pci_mapreg_type(pc, pa->pa_tag, NGE_PCI_LOMEM);
  785         switch (memtype) {
  786         case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT:
  787         case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_64BIT:
  788                 if (pci_mapreg_map(pa, NGE_PCI_LOMEM,
  789                                    memtype, 0, &sc->nge_btag, &sc->nge_bhandle,
  790                                    NULL, &size, 0) == 0)
  791                         break;
  792         default:
  793                 printf(": can't map mem space\n");
  794                 return;
  795         }
  796 #endif
  797 
  798         /* Disable all interrupts */
  799         CSR_WRITE_4(sc, NGE_IER, 0);
  800 
  801         DPRINTFN(5, ("%s: pci_intr_map\n", sc->sc_dv.dv_xname));
  802         if (pci_intr_map(pa, &ih)) {
  803                 printf(": couldn't map interrupt\n");
  804                 goto fail_1;
  805         }
  806 
  807         DPRINTFN(5, ("%s: pci_intr_string\n", sc->sc_dv.dv_xname));
  808         intrstr = pci_intr_string(pc, ih);
  809         DPRINTFN(5, ("%s: pci_intr_establish\n", sc->sc_dv.dv_xname));
  810         sc->nge_intrhand = pci_intr_establish(pc, ih, IPL_NET, nge_intr, sc,
  811                                               sc->sc_dv.dv_xname);
  812         if (sc->nge_intrhand == NULL) {
  813                 printf(": couldn't establish interrupt");
  814                 if (intrstr != NULL)
  815                         printf(" at %s", intrstr);
  816                 printf("\n");
  817                 goto fail_1;
  818         }
  819         printf(": %s", intrstr);
  820 
  821         /* Reset the adapter. */
  822         DPRINTFN(5, ("%s: nge_reset\n", sc->sc_dv.dv_xname));
  823         nge_reset(sc);
  824 
  825         /*
  826          * Get station address from the EEPROM.
  827          */
  828         DPRINTFN(5, ("%s: nge_read_eeprom\n", sc->sc_dv.dv_xname));
  829         nge_read_eeprom(sc, (caddr_t)&eaddr[4], NGE_EE_NODEADDR, 1, 0);
  830         nge_read_eeprom(sc, (caddr_t)&eaddr[2], NGE_EE_NODEADDR + 1, 1, 0);
  831         nge_read_eeprom(sc, (caddr_t)&eaddr[0], NGE_EE_NODEADDR + 2, 1, 0);
  832 
  833         /*
  834          * A NatSemi chip was detected. Inform the world.
  835          */
  836         printf(", address %s\n", ether_sprintf(eaddr));
  837 
  838         bcopy(eaddr, (char *)&sc->arpcom.ac_enaddr, ETHER_ADDR_LEN);
  839 
  840         sc->sc_dmatag = pa->pa_dmat;
  841         DPRINTFN(5, ("%s: bus_dmamem_alloc\n", sc->sc_dv.dv_xname));
  842         if (bus_dmamem_alloc(sc->sc_dmatag, sizeof(struct nge_list_data),
  843                              PAGE_SIZE, 0, &seg, 1, &rseg, BUS_DMA_NOWAIT)) {
  844                 printf("%s: can't alloc rx buffers\n", sc->sc_dv.dv_xname);
  845                 goto fail_2;
  846         }
  847         DPRINTFN(5, ("%s: bus_dmamem_map\n", sc->sc_dv.dv_xname));
  848         if (bus_dmamem_map(sc->sc_dmatag, &seg, rseg,
  849                            sizeof(struct nge_list_data), &kva,
  850                            BUS_DMA_NOWAIT)) {
  851                 printf("%s: can't map dma buffers (%d bytes)\n",
  852                        sc->sc_dv.dv_xname, sizeof(struct nge_list_data));
  853                 goto fail_3;
  854         }
  855         DPRINTFN(5, ("%s: bus_dmamem_create\n", sc->sc_dv.dv_xname));
  856         if (bus_dmamap_create(sc->sc_dmatag, sizeof(struct nge_list_data), 1,
  857                               sizeof(struct nge_list_data), 0,
  858                               BUS_DMA_NOWAIT, &dmamap)) {
  859                 printf("%s: can't create dma map\n", sc->sc_dv.dv_xname);
  860                 goto fail_4;
  861         }
  862         DPRINTFN(5, ("%s: bus_dmamem_load\n", sc->sc_dv.dv_xname));
  863         if (bus_dmamap_load(sc->sc_dmatag, dmamap, kva,
  864                             sizeof(struct nge_list_data), NULL,
  865                             BUS_DMA_NOWAIT)) {
  866                 goto fail_5;
  867         }
  868 
  869         DPRINTFN(5, ("%s: bzero\n", sc->sc_dv.dv_xname));
  870         sc->nge_ldata = (struct nge_list_data *)kva;
  871         bzero(sc->nge_ldata, sizeof(struct nge_list_data));
  872 
  873         /* Try to allocate memory for jumbo buffers. */
  874         DPRINTFN(5, ("%s: nge_alloc_jumbo_mem\n", sc->sc_dv.dv_xname));
  875         if (nge_alloc_jumbo_mem(sc)) {
  876                 printf("%s: jumbo buffer allocation failed\n",
  877                        sc->sc_dv.dv_xname);
  878                 goto fail_5;
  879         }
  880 
  881         ifp = &sc->arpcom.ac_if;
  882         ifp->if_softc = sc;
  883         ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
  884         ifp->if_ioctl = nge_ioctl;
  885         ifp->if_start = nge_start;
  886         ifp->if_watchdog = nge_watchdog;
  887         ifp->if_baudrate = 1000000000;
  888         ifp->if_hardmtu = NGE_JUMBO_MTU;
  889         IFQ_SET_MAXLEN(&ifp->if_snd, NGE_TX_LIST_CNT - 1);
  890         IFQ_SET_READY(&ifp->if_snd);
  891         DPRINTFN(5, ("%s: bcopy\n", sc->sc_dv.dv_xname));
  892         bcopy(sc->sc_dv.dv_xname, ifp->if_xname, IFNAMSIZ);
  893 
  894         ifp->if_capabilities = IFCAP_VLAN_MTU;
  895 
  896 #ifdef NGE_VLAN
  897         ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING;
  898 #endif
  899 
  900         /*
  901          * Do MII setup.
  902          */
  903         DPRINTFN(5, ("%s: mii setup\n", sc->sc_dv.dv_xname));
  904         if (CSR_READ_4(sc, NGE_CFG) & NGE_CFG_TBI_EN) {
  905                 DPRINTFN(5, ("%s: TBI mode\n", sc->sc_dv.dv_xname));
  906                 sc->nge_tbi = 1;
  907 
  908                 ifmedia_init(&sc->nge_ifmedia, 0, nge_ifmedia_tbi_upd, 
  909                              nge_ifmedia_tbi_sts);
  910 
  911                 ifmedia_add(&sc->nge_ifmedia, IFM_ETHER|IFM_NONE, 0, NULL),
  912                 ifmedia_add(&sc->nge_ifmedia, IFM_ETHER|IFM_1000_SX, 0, NULL);
  913                 ifmedia_add(&sc->nge_ifmedia, IFM_ETHER|IFM_1000_SX|IFM_FDX,
  914                             0, NULL);
  915                 ifmedia_add(&sc->nge_ifmedia, IFM_ETHER|IFM_AUTO, 0, NULL);
  916 
  917                 ifmedia_set(&sc->nge_ifmedia, IFM_ETHER|IFM_AUTO);
  918             
  919                 CSR_WRITE_4(sc, NGE_GPIO, CSR_READ_4(sc, NGE_GPIO)
  920                             | NGE_GPIO_GP4_OUT 
  921                             | NGE_GPIO_GP1_OUTENB | NGE_GPIO_GP2_OUTENB 
  922                             | NGE_GPIO_GP3_OUTENB | NGE_GPIO_GP4_OUTENB
  923                             | NGE_GPIO_GP5_OUTENB);
  924 
  925                 NGE_SETBIT(sc, NGE_CFG, NGE_CFG_MODE_1000);
  926         } else {
  927                 sc->nge_mii.mii_ifp = ifp;
  928                 sc->nge_mii.mii_readreg = nge_miibus_readreg;
  929                 sc->nge_mii.mii_writereg = nge_miibus_writereg;
  930                 sc->nge_mii.mii_statchg = nge_miibus_statchg;
  931 
  932                 ifmedia_init(&sc->nge_mii.mii_media, 0, nge_ifmedia_mii_upd,
  933                              nge_ifmedia_mii_sts);
  934                 mii_attach(&sc->sc_dv, &sc->nge_mii, 0xffffffff, MII_PHY_ANY,
  935                            MII_OFFSET_ANY, 0);
  936                 
  937                 if (LIST_FIRST(&sc->nge_mii.mii_phys) == NULL) {
  938                         
  939                         printf("%s: no PHY found!\n", sc->sc_dv.dv_xname);
  940                         ifmedia_add(&sc->nge_mii.mii_media,
  941                                     IFM_ETHER|IFM_MANUAL, 0, NULL);
  942                         ifmedia_set(&sc->nge_mii.mii_media,
  943                                     IFM_ETHER|IFM_MANUAL);
  944                 }
  945                 else
  946                         ifmedia_set(&sc->nge_mii.mii_media,
  947                                     IFM_ETHER|IFM_AUTO);
  948         }
  949 
  950         /*
  951          * Call MI attach routine.
  952          */
  953         DPRINTFN(5, ("%s: if_attach\n", sc->sc_dv.dv_xname));
  954         if_attach(ifp);
  955         DPRINTFN(5, ("%s: ether_ifattach\n", sc->sc_dv.dv_xname));
  956         ether_ifattach(ifp);
  957         DPRINTFN(5, ("%s: timeout_set\n", sc->sc_dv.dv_xname));
  958         timeout_set(&sc->nge_timeout, nge_tick, sc);
  959         timeout_add(&sc->nge_timeout, hz);
  960         return;
  961 
  962 fail_5:
  963         bus_dmamap_destroy(sc->sc_dmatag, dmamap);
  964 
  965 fail_4:
  966         bus_dmamem_unmap(sc->sc_dmatag, kva,
  967             sizeof(struct nge_list_data));
  968 
  969 fail_3:
  970         bus_dmamem_free(sc->sc_dmatag, &seg, rseg);
  971 
  972 fail_2:
  973         pci_intr_disestablish(pc, sc->nge_intrhand);
  974 
  975 fail_1:
  976         bus_space_unmap(sc->nge_btag, sc->nge_bhandle, size);
  977 }
  978 
  979 /*
  980  * Initialize the transmit descriptors.
  981  */
  982 int
  983 nge_list_tx_init(sc)
  984         struct nge_softc        *sc;
  985 {
  986         struct nge_list_data    *ld;
  987         struct nge_ring_data    *cd;
  988         int                     i;
  989 
  990         cd = &sc->nge_cdata;
  991         ld = sc->nge_ldata;
  992 
  993         for (i = 0; i < NGE_TX_LIST_CNT; i++) {
  994                 if (i == (NGE_TX_LIST_CNT - 1)) {
  995                         ld->nge_tx_list[i].nge_nextdesc =
  996                             &ld->nge_tx_list[0];
  997                         ld->nge_tx_list[i].nge_next =
  998                             VTOPHYS(&ld->nge_tx_list[0]);
  999                 } else {
 1000                         ld->nge_tx_list[i].nge_nextdesc =
 1001                             &ld->nge_tx_list[i + 1];
 1002                         ld->nge_tx_list[i].nge_next =
 1003                             VTOPHYS(&ld->nge_tx_list[i + 1]);
 1004                 }
 1005                 ld->nge_tx_list[i].nge_mbuf = NULL;
 1006                 ld->nge_tx_list[i].nge_ptr = 0;
 1007                 ld->nge_tx_list[i].nge_ctl = 0;
 1008         }
 1009 
 1010         cd->nge_tx_prod = cd->nge_tx_cons = cd->nge_tx_cnt = 0;
 1011 
 1012         return(0);
 1013 }
 1014 
 1015 
 1016 /*
 1017  * Initialize the RX descriptors and allocate mbufs for them. Note that
 1018  * we arrange the descriptors in a closed ring, so that the last descriptor
 1019  * points back to the first.
 1020  */
 1021 int
 1022 nge_list_rx_init(sc)
 1023         struct nge_softc        *sc;
 1024 {
 1025         struct nge_list_data    *ld;
 1026         struct nge_ring_data    *cd;
 1027         int                     i;
 1028 
 1029         ld = sc->nge_ldata;
 1030         cd = &sc->nge_cdata;
 1031 
 1032         for (i = 0; i < NGE_RX_LIST_CNT; i++) {
 1033                 if (nge_newbuf(sc, &ld->nge_rx_list[i], NULL) == ENOBUFS)
 1034                         return(ENOBUFS);
 1035                 if (i == (NGE_RX_LIST_CNT - 1)) {
 1036                         ld->nge_rx_list[i].nge_nextdesc =
 1037                             &ld->nge_rx_list[0];
 1038                         ld->nge_rx_list[i].nge_next =
 1039                             VTOPHYS(&ld->nge_rx_list[0]);
 1040                 } else {
 1041                         ld->nge_rx_list[i].nge_nextdesc =
 1042                             &ld->nge_rx_list[i + 1];
 1043                         ld->nge_rx_list[i].nge_next =
 1044                             VTOPHYS(&ld->nge_rx_list[i + 1]);
 1045                 }
 1046         }
 1047 
 1048         cd->nge_rx_prod = 0;
 1049 
 1050         return(0);
 1051 }
 1052 
 1053 /*
 1054  * Initialize an RX descriptor and attach an MBUF cluster.
 1055  */
 1056 int
 1057 nge_newbuf(sc, c, m)
 1058         struct nge_softc        *sc;
 1059         struct nge_desc         *c;
 1060         struct mbuf             *m;
 1061 {
 1062         struct mbuf             *m_new = NULL;
 1063 
 1064         if (m == NULL) {
 1065                 caddr_t buf = NULL;
 1066 
 1067                 MGETHDR(m_new, M_DONTWAIT, MT_DATA);
 1068                 if (m_new == NULL)
 1069                         return (ENOBUFS);
 1070 
 1071                 /* Allocate the jumbo buffer */
 1072                 buf = nge_jalloc(sc);
 1073                 if (buf == NULL) {
 1074                         m_freem(m_new);
 1075                         return (ENOBUFS);
 1076                 }
 1077 
 1078                 /* Attach the buffer to the mbuf */
 1079                 m_new->m_len = m_new->m_pkthdr.len = NGE_MCLBYTES;
 1080                 MEXTADD(m_new, buf, NGE_MCLBYTES, 0, nge_jfree, sc);
 1081         } else {
 1082                 /*
 1083                  * We're re-using a previously allocated mbuf;
 1084                  * be sure to re-init pointers and lengths to
 1085                  * default values.
 1086                  */
 1087                 m_new = m;
 1088                 m_new->m_len = m_new->m_pkthdr.len = NGE_MCLBYTES;
 1089                 m_new->m_data = m_new->m_ext.ext_buf;
 1090         }
 1091 
 1092         m_adj(m_new, sizeof(u_int64_t));
 1093 
 1094         c->nge_mbuf = m_new;
 1095         c->nge_ptr = VTOPHYS(mtod(m_new, caddr_t));
 1096         DPRINTFN(7,("%s: c->nge_ptr=%#x\n", sc->sc_dv.dv_xname,
 1097                     c->nge_ptr));
 1098         c->nge_ctl = m_new->m_len;
 1099         c->nge_extsts = 0;
 1100 
 1101         return(0);
 1102 }
 1103 
 1104 int
 1105 nge_alloc_jumbo_mem(sc)
 1106         struct nge_softc        *sc;
 1107 {
 1108         caddr_t                 ptr, kva;
 1109         bus_dma_segment_t       seg;
 1110         bus_dmamap_t            dmamap;
 1111         int                     i, rseg, state, error;
 1112         struct nge_jpool_entry  *entry;
 1113 
 1114         state = error = 0;
 1115 
 1116         if (bus_dmamem_alloc(sc->sc_dmatag, NGE_JMEM, PAGE_SIZE, 0,
 1117                              &seg, 1, &rseg, BUS_DMA_NOWAIT)) {
 1118                 printf("%s: can't alloc rx buffers\n", sc->sc_dv.dv_xname);
 1119                 return (ENOBUFS);
 1120         }
 1121 
 1122         state = 1;
 1123         if (bus_dmamem_map(sc->sc_dmatag, &seg, rseg, NGE_JMEM, &kva,
 1124                            BUS_DMA_NOWAIT)) {
 1125                 printf("%s: can't map dma buffers (%d bytes)\n",
 1126                        sc->sc_dv.dv_xname, NGE_JMEM);
 1127                 error = ENOBUFS;
 1128                 goto out;
 1129         }
 1130 
 1131         state = 2;
 1132         if (bus_dmamap_create(sc->sc_dmatag, NGE_JMEM, 1,
 1133                               NGE_JMEM, 0, BUS_DMA_NOWAIT, &dmamap)) {
 1134                 printf("%s: can't create dma map\n", sc->sc_dv.dv_xname);
 1135                 error = ENOBUFS;
 1136                 goto out;
 1137         }
 1138 
 1139         state = 3;
 1140         if (bus_dmamap_load(sc->sc_dmatag, dmamap, kva, NGE_JMEM,
 1141                             NULL, BUS_DMA_NOWAIT)) {
 1142                 printf("%s: can't load dma map\n", sc->sc_dv.dv_xname);
 1143                 error = ENOBUFS;
 1144                 goto out;
 1145         }
 1146 
 1147         state = 4;
 1148         sc->nge_cdata.nge_jumbo_buf = (caddr_t)kva;
 1149         DPRINTFN(1,("%s: nge_jumbo_buf=%#x, NGE_MCLBYTES=%#x\n",
 1150                     sc->sc_dv.dv_xname , sc->nge_cdata.nge_jumbo_buf,
 1151                     NGE_MCLBYTES));
 1152 
 1153         LIST_INIT(&sc->nge_jfree_listhead);
 1154         LIST_INIT(&sc->nge_jinuse_listhead);
 1155 
 1156         /*
 1157          * Now divide it up into 9K pieces and save the addresses
 1158          * in an array. Note that we play an evil trick here by using
 1159          * the first few bytes in the buffer to hold the address
 1160          * of the softc structure for this interface. This is because
 1161          * nge_jfree() needs it, but it is called by the mbuf management
 1162          * code which will not pass it to us explicitly.
 1163          */
 1164         ptr = sc->nge_cdata.nge_jumbo_buf;
 1165         for (i = 0; i < NGE_JSLOTS; i++) {
 1166                 sc->nge_cdata.nge_jslots[i].nge_buf = ptr;
 1167                 sc->nge_cdata.nge_jslots[i].nge_inuse = 0;
 1168                 ptr += NGE_MCLBYTES;
 1169                 entry = malloc(sizeof(struct nge_jpool_entry),
 1170                                M_DEVBUF, M_NOWAIT);
 1171                 if (entry == NULL) {
 1172                         sc->nge_cdata.nge_jumbo_buf = NULL;
 1173                         printf("%s: no memory for jumbo buffer queue!\n",
 1174                                sc->sc_dv.dv_xname);
 1175                         error = ENOBUFS;
 1176                         goto out;
 1177                 }
 1178                 entry->slot = i;
 1179                 LIST_INSERT_HEAD(&sc->nge_jfree_listhead, entry,
 1180                                  jpool_entries);
 1181         }
 1182 out:
 1183         if (error != 0) {
 1184                 switch (state) {
 1185                 case 4:
 1186                         bus_dmamap_unload(sc->sc_dmatag, dmamap);
 1187                 case 3:
 1188                         bus_dmamap_destroy(sc->sc_dmatag, dmamap);
 1189                 case 2:
 1190                         bus_dmamem_unmap(sc->sc_dmatag, kva, NGE_JMEM);
 1191                 case 1:
 1192                         bus_dmamem_free(sc->sc_dmatag, &seg, rseg);
 1193                         break;
 1194                 default:
 1195                         break;
 1196                 }
 1197         }
 1198  
 1199         return (error);
 1200 }
 1201 
 1202 /*
 1203  * Allocate a jumbo buffer.
 1204  */
 1205 void *
 1206 nge_jalloc(sc)
 1207         struct nge_softc        *sc;
 1208 {
 1209         struct nge_jpool_entry   *entry;
 1210 
 1211         entry = LIST_FIRST(&sc->nge_jfree_listhead);
 1212 
 1213         if (entry == NULL)
 1214                 return (NULL);
 1215 
 1216         LIST_REMOVE(entry, jpool_entries);
 1217         LIST_INSERT_HEAD(&sc->nge_jinuse_listhead, entry, jpool_entries);
 1218         sc->nge_cdata.nge_jslots[entry->slot].nge_inuse = 1;
 1219         return(sc->nge_cdata.nge_jslots[entry->slot].nge_buf);
 1220 }
 1221 
 1222 /*
 1223  * Release a jumbo buffer.
 1224  */
 1225 void
 1226 nge_jfree(buf, size, arg)
 1227         caddr_t         buf;
 1228         u_int           size;
 1229         void            *arg;
 1230 {
 1231         struct nge_softc        *sc;
 1232         int                     i;
 1233         struct nge_jpool_entry *entry;
 1234 
 1235         /* Extract the softc struct pointer. */
 1236         sc = (struct nge_softc *)arg;
 1237 
 1238         if (sc == NULL)
 1239                 panic("nge_jfree: can't find softc pointer!");
 1240 
 1241         /* calculate the slot this buffer belongs to */
 1242 
 1243         i = ((vaddr_t)buf - (vaddr_t)sc->nge_cdata.nge_jumbo_buf)
 1244           / NGE_MCLBYTES;
 1245 
 1246         if ((i < 0) || (i >= NGE_JSLOTS))
 1247                 panic("nge_jfree: asked to free buffer that we don't manage!");
 1248         else if (sc->nge_cdata.nge_jslots[i].nge_inuse == 0)
 1249                 panic("nge_jfree: buffer already free!");
 1250         else {
 1251                 sc->nge_cdata.nge_jslots[i].nge_inuse--;
 1252                 if(sc->nge_cdata.nge_jslots[i].nge_inuse == 0) {
 1253                         entry = LIST_FIRST(&sc->nge_jinuse_listhead);
 1254                         if (entry == NULL)
 1255                                 panic("nge_jfree: buffer not in use!");
 1256                         entry->slot = i;
 1257                         LIST_REMOVE(entry, jpool_entries);
 1258                         LIST_INSERT_HEAD(&sc->nge_jfree_listhead,
 1259                                          entry, jpool_entries);
 1260                 }
 1261         }
 1262 }
 1263 
 1264 /*
 1265  * A frame has been uploaded: pass the resulting mbuf chain up to
 1266  * the higher level protocols.
 1267  */
 1268 void
 1269 nge_rxeof(sc)
 1270         struct nge_softc        *sc;
 1271 {
 1272         struct mbuf             *m;
 1273         struct ifnet            *ifp;
 1274         struct nge_desc         *cur_rx;
 1275         int                     i, total_len = 0;
 1276         u_int32_t               rxstat;
 1277 
 1278         ifp = &sc->arpcom.ac_if;
 1279         i = sc->nge_cdata.nge_rx_prod;
 1280 
 1281         while(NGE_OWNDESC(&sc->nge_ldata->nge_rx_list[i])) {
 1282                 struct mbuf             *m0 = NULL;
 1283                 u_int32_t               extsts;
 1284 
 1285                 cur_rx = &sc->nge_ldata->nge_rx_list[i];
 1286                 rxstat = cur_rx->nge_rxstat;
 1287                 extsts = cur_rx->nge_extsts;
 1288                 m = cur_rx->nge_mbuf;
 1289                 cur_rx->nge_mbuf = NULL;
 1290                 total_len = NGE_RXBYTES(cur_rx);
 1291                 NGE_INC(i, NGE_RX_LIST_CNT);
 1292 
 1293                 /*
 1294                  * If an error occurs, update stats, clear the
 1295                  * status word and leave the mbuf cluster in place:
 1296                  * it should simply get re-used next time this descriptor
 1297                  * comes up in the ring.
 1298                  */
 1299                 if (!(rxstat & NGE_CMDSTS_PKT_OK)) {
 1300                         ifp->if_ierrors++;
 1301                         nge_newbuf(sc, cur_rx, m);
 1302                         continue;
 1303                 }
 1304 
 1305                 /*
 1306                  * Ok. NatSemi really screwed up here. This is the
 1307                  * only gigE chip I know of with alignment constraints
 1308                  * on receive buffers. RX buffers must be 64-bit aligned.
 1309                  */
 1310 #ifndef __STRICT_ALIGNMENT
 1311                 /*
 1312                  * By popular demand, ignore the alignment problems
 1313                  * on the Intel x86 platform. The performance hit
 1314                  * incurred due to unaligned accesses is much smaller
 1315                  * than the hit produced by forcing buffer copies all
 1316                  * the time, especially with jumbo frames. We still
 1317                  * need to fix up the alignment everywhere else though.
 1318                  */
 1319                 if (nge_newbuf(sc, cur_rx, NULL) == ENOBUFS) {
 1320 #endif
 1321                         m0 = m_devget(mtod(m, char *), total_len,
 1322                             ETHER_ALIGN, ifp, NULL);
 1323                         nge_newbuf(sc, cur_rx, m);
 1324                         if (m0 == NULL) {
 1325                                 ifp->if_ierrors++;
 1326                                 continue;
 1327                         }
 1328                         m_adj(m0, ETHER_ALIGN);
 1329                         m = m0;
 1330 #ifndef __STRICT_ALIGNMENT
 1331                 } else {
 1332                         m->m_pkthdr.rcvif = ifp;
 1333                         m->m_pkthdr.len = m->m_len = total_len;
 1334                 }
 1335 #endif
 1336 
 1337                 ifp->if_ipackets++;
 1338 
 1339 #if NBPFILTER > 0
 1340                 /*
 1341                  * Handle BPF listeners. Let the BPF user see the packet.
 1342                  */
 1343                 if (ifp->if_bpf)
 1344                         bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_IN);
 1345 #endif
 1346 
 1347                 /* Do IP checksum checking. */
 1348                 if (extsts & NGE_RXEXTSTS_IPPKT) {
 1349                         if (!(extsts & NGE_RXEXTSTS_IPCSUMERR))
 1350                                 m->m_pkthdr.csum_flags |= M_IPV4_CSUM_IN_OK;
 1351                         if ((extsts & NGE_RXEXTSTS_TCPPKT) &&
 1352                             (!(extsts & NGE_RXEXTSTS_TCPCSUMERR)))
 1353                                 m->m_pkthdr.csum_flags |= M_TCP_CSUM_IN_OK;
 1354                         else if ((extsts & NGE_RXEXTSTS_UDPPKT) &&
 1355                                  (!(extsts & NGE_RXEXTSTS_UDPCSUMERR)))
 1356                                 m->m_pkthdr.csum_flags |= M_UDP_CSUM_IN_OK;
 1357                 }
 1358 
 1359                 ether_input_mbuf(ifp, m);
 1360         }
 1361 
 1362         sc->nge_cdata.nge_rx_prod = i;
 1363 }
 1364 
 1365 /*
 1366  * A frame was downloaded to the chip. It's safe for us to clean up
 1367  * the list buffers.
 1368  */
 1369 
 1370 void
 1371 nge_txeof(sc)
 1372         struct nge_softc        *sc;
 1373 {
 1374         struct nge_desc         *cur_tx;
 1375         struct ifnet            *ifp;
 1376         u_int32_t               idx;
 1377 
 1378         ifp = &sc->arpcom.ac_if;
 1379 
 1380         /*
 1381          * Go through our tx list and free mbufs for those
 1382          * frames that have been transmitted.
 1383          */
 1384         idx = sc->nge_cdata.nge_tx_cons;
 1385         while (idx != sc->nge_cdata.nge_tx_prod) {
 1386                 cur_tx = &sc->nge_ldata->nge_tx_list[idx];
 1387 
 1388                 if (NGE_OWNDESC(cur_tx))
 1389                         break;
 1390 
 1391                 if (cur_tx->nge_ctl & NGE_CMDSTS_MORE) {
 1392                         sc->nge_cdata.nge_tx_cnt--;
 1393                         NGE_INC(idx, NGE_TX_LIST_CNT);
 1394                         continue;
 1395                 }
 1396 
 1397                 if (!(cur_tx->nge_ctl & NGE_CMDSTS_PKT_OK)) {
 1398                         ifp->if_oerrors++;
 1399                         if (cur_tx->nge_txstat & NGE_TXSTAT_EXCESSCOLLS)
 1400                                 ifp->if_collisions++;
 1401                         if (cur_tx->nge_txstat & NGE_TXSTAT_OUTOFWINCOLL)
 1402                                 ifp->if_collisions++;
 1403                 }
 1404 
 1405                 ifp->if_collisions +=
 1406                     (cur_tx->nge_txstat & NGE_TXSTAT_COLLCNT) >> 16;
 1407 
 1408                 ifp->if_opackets++;
 1409                 if (cur_tx->nge_mbuf != NULL) {
 1410                         m_freem(cur_tx->nge_mbuf);
 1411                         cur_tx->nge_mbuf = NULL;
 1412                         ifp->if_flags &= ~IFF_OACTIVE;
 1413                 }
 1414 
 1415                 sc->nge_cdata.nge_tx_cnt--;
 1416                 NGE_INC(idx, NGE_TX_LIST_CNT);
 1417         }
 1418 
 1419         sc->nge_cdata.nge_tx_cons = idx;
 1420 
 1421         if (idx == sc->nge_cdata.nge_tx_prod)
 1422                 ifp->if_timer = 0;
 1423 }
 1424 
 1425 void
 1426 nge_tick(xsc)
 1427         void                    *xsc;
 1428 {
 1429         struct nge_softc        *sc = xsc;
 1430         struct mii_data         *mii = &sc->nge_mii;
 1431         struct ifnet            *ifp = &sc->arpcom.ac_if;
 1432         int                     s;
 1433 
 1434         s = splnet();
 1435 
 1436         DPRINTFN(10, ("%s: nge_tick: link=%d\n", sc->sc_dv.dv_xname,
 1437                       sc->nge_link));
 1438 
 1439         timeout_add(&sc->nge_timeout, hz);
 1440         if (sc->nge_link) {
 1441                 splx(s);
 1442                 return;
 1443         }
 1444 
 1445         if (sc->nge_tbi) {
 1446                 if (IFM_SUBTYPE(sc->nge_ifmedia.ifm_cur->ifm_media)
 1447                     == IFM_AUTO) {
 1448                         u_int32_t bmsr, anlpar, txcfg, rxcfg;
 1449 
 1450                         bmsr = CSR_READ_4(sc, NGE_TBI_BMSR);
 1451                         DPRINTFN(2, ("%s: nge_tick: bmsr=%#x\n",
 1452                                      sc->sc_dv.dv_xname, bmsr));
 1453 
 1454                         if (!(bmsr & NGE_TBIBMSR_ANEG_DONE)) {
 1455                                 CSR_WRITE_4(sc, NGE_TBI_BMCR, 0);
 1456 
 1457                                 splx(s);
 1458                                 return;
 1459                         }
 1460                                 
 1461                         anlpar = CSR_READ_4(sc, NGE_TBI_ANLPAR);
 1462                         txcfg = CSR_READ_4(sc, NGE_TX_CFG);
 1463                         rxcfg = CSR_READ_4(sc, NGE_RX_CFG);
 1464                         
 1465                         DPRINTFN(2, ("%s: nge_tick: anlpar=%#x, txcfg=%#x, "
 1466                                      "rxcfg=%#x\n", sc->sc_dv.dv_xname, anlpar,
 1467                                      txcfg, rxcfg));
 1468                         
 1469                         if (anlpar == 0 || anlpar & NGE_TBIANAR_FDX) {
 1470                                 txcfg |= (NGE_TXCFG_IGN_HBEAT|
 1471                                           NGE_TXCFG_IGN_CARR);
 1472                                 rxcfg |= NGE_RXCFG_RX_FDX;
 1473                         } else {
 1474                                 txcfg &= ~(NGE_TXCFG_IGN_HBEAT|
 1475                                            NGE_TXCFG_IGN_CARR);
 1476                                 rxcfg &= ~(NGE_RXCFG_RX_FDX);
 1477                         }
 1478                         txcfg |= NGE_TXCFG_AUTOPAD;
 1479                         CSR_WRITE_4(sc, NGE_TX_CFG, txcfg);
 1480                         CSR_WRITE_4(sc, NGE_RX_CFG, rxcfg);
 1481                 }
 1482 
 1483                 DPRINTF(("%s: gigabit link up\n", sc->sc_dv.dv_xname));
 1484                 sc->nge_link++;
 1485                 if (!IFQ_IS_EMPTY(&ifp->if_snd))
 1486                         nge_start(ifp);
 1487         } else {
 1488                 mii_tick(mii);
 1489                 if (mii->mii_media_status & IFM_ACTIVE &&
 1490                     IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) {
 1491                         sc->nge_link++;
 1492                         if (IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_T)
 1493                                 DPRINTF(("%s: gigabit link up\n",
 1494                                          sc->sc_dv.dv_xname));
 1495                         if (!IFQ_IS_EMPTY(&ifp->if_snd))
 1496                                 nge_start(ifp);
 1497                 }
 1498                 
 1499         }
 1500 
 1501         splx(s);
 1502 }
 1503 
 1504 int
 1505 nge_intr(arg)
 1506         void                    *arg;
 1507 {
 1508         struct nge_softc        *sc;
 1509         struct ifnet            *ifp;
 1510         u_int32_t               status;
 1511         int                     claimed = 0;
 1512 
 1513         sc = arg;
 1514         ifp = &sc->arpcom.ac_if;
 1515 
 1516         /* Supress unwanted interrupts */
 1517         if (!(ifp->if_flags & IFF_UP)) {
 1518                 nge_stop(sc);
 1519                 return (0);
 1520         }
 1521 
 1522         /* Disable interrupts. */
 1523         CSR_WRITE_4(sc, NGE_IER, 0);
 1524 
 1525         /* Data LED on for TBI mode */
 1526         if(sc->nge_tbi)
 1527                  CSR_WRITE_4(sc, NGE_GPIO, CSR_READ_4(sc, NGE_GPIO)
 1528                              | NGE_GPIO_GP3_OUT);
 1529 
 1530         for (;;) {
 1531                 /* Reading the ISR register clears all interrupts. */
 1532                 status = CSR_READ_4(sc, NGE_ISR);
 1533 
 1534                 if ((status & NGE_INTRS) == 0)
 1535                         break;
 1536 
 1537                 claimed = 1;
 1538 
 1539                 if ((status & NGE_ISR_TX_DESC_OK) ||
 1540                     (status & NGE_ISR_TX_ERR) ||
 1541                     (status & NGE_ISR_TX_OK) ||
 1542                     (status & NGE_ISR_TX_IDLE))
 1543                         nge_txeof(sc);
 1544 
 1545                 if ((status & NGE_ISR_RX_DESC_OK) ||
 1546                     (status & NGE_ISR_RX_ERR) ||
 1547                     (status & NGE_ISR_RX_OFLOW) ||
 1548                     (status & NGE_ISR_RX_FIFO_OFLOW) ||
 1549                     (status & NGE_ISR_RX_IDLE) ||
 1550                     (status & NGE_ISR_RX_OK))
 1551                         nge_rxeof(sc);
 1552 
 1553                 if ((status & NGE_ISR_RX_IDLE))
 1554                         NGE_SETBIT(sc, NGE_CSR, NGE_CSR_RX_ENABLE);
 1555 
 1556                 if (status & NGE_ISR_SYSERR) {
 1557                         nge_reset(sc);
 1558                         ifp->if_flags &= ~IFF_RUNNING;
 1559                         nge_init(sc);
 1560                 }
 1561 
 1562 #if 0
 1563                 /* 
 1564                  * XXX: nge_tick() is not ready to be called this way
 1565                  * it screws up the aneg timeout because mii_tick() is
 1566                  * only to be called once per second.
 1567                  */
 1568                 if (status & NGE_IMR_PHY_INTR) {
 1569                         sc->nge_link = 0;
 1570                         nge_tick(sc);
 1571                 }
 1572 #endif
 1573         }
 1574 
 1575         /* Re-enable interrupts. */
 1576         CSR_WRITE_4(sc, NGE_IER, 1);
 1577 
 1578         if (!IFQ_IS_EMPTY(&ifp->if_snd))
 1579                 nge_start(ifp);
 1580 
 1581         /* Data LED off for TBI mode */
 1582         if(sc->nge_tbi)
 1583                 CSR_WRITE_4(sc, NGE_GPIO, CSR_READ_4(sc, NGE_GPIO)
 1584                             & ~NGE_GPIO_GP3_OUT);
 1585 
 1586         return claimed;
 1587 }
 1588 
 1589 /*
 1590  * Encapsulate an mbuf chain in a descriptor by coupling the mbuf data
 1591  * pointers to the fragment pointers.
 1592  */
 1593 int
 1594 nge_encap(sc, m_head, txidx)
 1595         struct nge_softc        *sc;
 1596         struct mbuf             *m_head;
 1597         u_int32_t               *txidx;
 1598 {
 1599         struct nge_desc         *f = NULL;
 1600         struct mbuf             *m;
 1601         int                     frag, cur, cnt = 0;
 1602 #if NVLAN > 0
 1603         struct ifvlan           *ifv = NULL;
 1604 
 1605         if ((m_head->m_flags & (M_PROTO1|M_PKTHDR)) == (M_PROTO1|M_PKTHDR) &&
 1606             m_head->m_pkthdr.rcvif != NULL)
 1607                 ifv = m_head->m_pkthdr.rcvif->if_softc;
 1608 #endif
 1609 
 1610         /*
 1611          * Start packing the mbufs in this chain into
 1612          * the fragment pointers. Stop when we run out
 1613          * of fragments or hit the end of the mbuf chain.
 1614          */
 1615         m = m_head;
 1616         cur = frag = *txidx;
 1617 
 1618         for (m = m_head; m != NULL; m = m->m_next) {
 1619                 if (m->m_len != 0) {
 1620                         if ((NGE_TX_LIST_CNT -
 1621                             (sc->nge_cdata.nge_tx_cnt + cnt)) < 2)
 1622                                 return(ENOBUFS);
 1623                         f = &sc->nge_ldata->nge_tx_list[frag];
 1624                         f->nge_ctl = NGE_CMDSTS_MORE | m->m_len;
 1625                         f->nge_ptr = VTOPHYS(mtod(m, vaddr_t));
 1626                         DPRINTFN(7,("%s: f->nge_ptr=%#x\n",
 1627                                     sc->sc_dv.dv_xname, f->nge_ptr));
 1628                         if (cnt != 0)
 1629                                 f->nge_ctl |= NGE_CMDSTS_OWN;
 1630                         cur = frag;
 1631                         NGE_INC(frag, NGE_TX_LIST_CNT);
 1632                         cnt++;
 1633                 }
 1634         }
 1635 
 1636         if (m != NULL)
 1637                 return(ENOBUFS);
 1638 
 1639         sc->nge_ldata->nge_tx_list[*txidx].nge_extsts = 0;
 1640 
 1641 #if NVLAN > 0
 1642         if (ifv != NULL) {
 1643                 sc->nge_ldata->nge_tx_list[cur].nge_extsts |=
 1644                         (NGE_TXEXTSTS_VLANPKT|ifv->ifv_tag);
 1645         }
 1646 #endif
 1647 
 1648         sc->nge_ldata->nge_tx_list[cur].nge_mbuf = m_head;
 1649         sc->nge_ldata->nge_tx_list[cur].nge_ctl &= ~NGE_CMDSTS_MORE;
 1650         sc->nge_ldata->nge_tx_list[*txidx].nge_ctl |= NGE_CMDSTS_OWN;
 1651         sc->nge_cdata.nge_tx_cnt += cnt;
 1652         *txidx = frag;
 1653 
 1654         return(0);
 1655 }
 1656 
 1657 /*
 1658  * Main transmit routine. To avoid having to do mbuf copies, we put pointers
 1659  * to the mbuf data regions directly in the transmit lists. We also save a
 1660  * copy of the pointers since the transmit list fragment pointers are
 1661  * physical addresses.
 1662  */
 1663 
 1664 void
 1665 nge_start(ifp)
 1666         struct ifnet            *ifp;
 1667 {
 1668         struct nge_softc        *sc;
 1669         struct mbuf             *m_head = NULL;
 1670         u_int32_t               idx;
 1671         int                     pkts = 0;
 1672 
 1673         sc = ifp->if_softc;
 1674 
 1675         if (!sc->nge_link)
 1676                 return;
 1677 
 1678         idx = sc->nge_cdata.nge_tx_prod;
 1679 
 1680         if (ifp->if_flags & IFF_OACTIVE)
 1681                 return;
 1682 
 1683         while(sc->nge_ldata->nge_tx_list[idx].nge_mbuf == NULL) {
 1684                 IFQ_POLL(&ifp->if_snd, m_head);
 1685                 if (m_head == NULL)
 1686                         break;
 1687 
 1688                 if (nge_encap(sc, m_head, &idx)) {
 1689                         ifp->if_flags |= IFF_OACTIVE;
 1690                         break;
 1691                 }
 1692 
 1693                 /* now we are committed to transmit the packet */
 1694                 IFQ_DEQUEUE(&ifp->if_snd, m_head);
 1695                 pkts++;
 1696 
 1697 #if NBPFILTER > 0
 1698                 /*
 1699                  * If there's a BPF listener, bounce a copy of this frame
 1700                  * to him.
 1701                  */
 1702                 if (ifp->if_bpf)
 1703                         bpf_mtap(ifp->if_bpf, m_head, BPF_DIRECTION_OUT);
 1704 #endif
 1705         }
 1706         if (pkts == 0)
 1707                 return;
 1708 
 1709         /* Transmit */
 1710         sc->nge_cdata.nge_tx_prod = idx;
 1711         NGE_SETBIT(sc, NGE_CSR, NGE_CSR_TX_ENABLE);
 1712 
 1713         /*
 1714          * Set a timeout in case the chip goes out to lunch.
 1715          */
 1716         ifp->if_timer = 5;
 1717 }
 1718 
 1719 void
 1720 nge_init(xsc)
 1721         void                    *xsc;
 1722 {
 1723         struct nge_softc        *sc = xsc;
 1724         struct ifnet            *ifp = &sc->arpcom.ac_if;
 1725         struct mii_data         *mii;
 1726         u_int32_t               txcfg, rxcfg;
 1727         int                     s, media;
 1728 
 1729         if (ifp->if_flags & IFF_RUNNING)
 1730                 return;
 1731 
 1732         s = splnet();
 1733 
 1734         /*
 1735          * Cancel pending I/O and free all RX/TX buffers.
 1736          */
 1737         nge_stop(sc);
 1738 
 1739         mii = sc->nge_tbi ? NULL: &sc->nge_mii;
 1740 
 1741         /* Set MAC address */
 1742         CSR_WRITE_4(sc, NGE_RXFILT_CTL, NGE_FILTADDR_PAR0);
 1743         CSR_WRITE_4(sc, NGE_RXFILT_DATA,
 1744             ((u_int16_t *)sc->arpcom.ac_enaddr)[0]);
 1745         CSR_WRITE_4(sc, NGE_RXFILT_CTL, NGE_FILTADDR_PAR1);
 1746         CSR_WRITE_4(sc, NGE_RXFILT_DATA,
 1747             ((u_int16_t *)sc->arpcom.ac_enaddr)[1]);
 1748         CSR_WRITE_4(sc, NGE_RXFILT_CTL, NGE_FILTADDR_PAR2);
 1749         CSR_WRITE_4(sc, NGE_RXFILT_DATA,
 1750             ((u_int16_t *)sc->arpcom.ac_enaddr)[2]);
 1751 
 1752         /* Init circular RX list. */
 1753         if (nge_list_rx_init(sc) == ENOBUFS) {
 1754                 printf("%s: initialization failed: no "
 1755                         "memory for rx buffers\n", sc->sc_dv.dv_xname);
 1756                 nge_stop(sc);
 1757                 splx(s);
 1758                 return;
 1759         }
 1760 
 1761         /*
 1762          * Init tx descriptors.
 1763          */
 1764         nge_list_tx_init(sc);
 1765 
 1766         /*
 1767          * For the NatSemi chip, we have to explicitly enable the
 1768          * reception of ARP frames, as well as turn on the 'perfect
 1769          * match' filter where we store the station address, otherwise
 1770          * we won't receive unicasts meant for this host.
 1771          */
 1772         NGE_SETBIT(sc, NGE_RXFILT_CTL, NGE_RXFILTCTL_ARP);
 1773         NGE_SETBIT(sc, NGE_RXFILT_CTL, NGE_RXFILTCTL_PERFECT);
 1774 
 1775          /* If we want promiscuous mode, set the allframes bit. */
 1776         if (ifp->if_flags & IFF_PROMISC)
 1777                 NGE_SETBIT(sc, NGE_RXFILT_CTL, NGE_RXFILTCTL_ALLPHYS);
 1778         else
 1779                 NGE_CLRBIT(sc, NGE_RXFILT_CTL, NGE_RXFILTCTL_ALLPHYS);
 1780 
 1781         /*
 1782          * Set the capture broadcast bit to capture broadcast frames.
 1783          */
 1784         if (ifp->if_flags & IFF_BROADCAST)
 1785                 NGE_SETBIT(sc, NGE_RXFILT_CTL, NGE_RXFILTCTL_BROAD);
 1786         else
 1787                 NGE_CLRBIT(sc, NGE_RXFILT_CTL, NGE_RXFILTCTL_BROAD);
 1788 
 1789         /*
 1790          * Load the multicast filter.
 1791          */
 1792         nge_setmulti(sc);
 1793 
 1794         /* Turn the receive filter on */
 1795         NGE_SETBIT(sc, NGE_RXFILT_CTL, NGE_RXFILTCTL_ENABLE);
 1796 
 1797         /*
 1798          * Load the address of the RX and TX lists.
 1799          */
 1800         CSR_WRITE_4(sc, NGE_RX_LISTPTR,
 1801             VTOPHYS(&sc->nge_ldata->nge_rx_list[0]));
 1802         CSR_WRITE_4(sc, NGE_TX_LISTPTR,
 1803             VTOPHYS(&sc->nge_ldata->nge_tx_list[0]));
 1804 
 1805         /* Set RX configuration */
 1806         CSR_WRITE_4(sc, NGE_RX_CFG, NGE_RXCFG);
 1807 
 1808         /*
 1809          * Enable hardware checksum validation for all IPv4
 1810          * packets, do not reject packets with bad checksums.
 1811          */
 1812         CSR_WRITE_4(sc, NGE_VLAN_IP_RXCTL, NGE_VIPRXCTL_IPCSUM_ENB);
 1813 
 1814         /* Set TX configuration */
 1815         CSR_WRITE_4(sc, NGE_TX_CFG, NGE_TXCFG);
 1816 
 1817 #if NVLAN > 0
 1818         /*
 1819          * If VLAN support is enabled, tell the chip to insert
 1820          * VLAN tags on a per-packet basis as dictated by the
 1821          * code in the frame encapsulation routine.
 1822          */
 1823         if (ifp->if_capabilities & IFCAP_VLAN_HWTAGGING)
 1824                 NGE_SETBIT(sc, NGE_VLAN_IP_TXCTL, NGE_VIPTXCTL_TAG_PER_PKT);
 1825 #endif
 1826 
 1827         /* Set full/half duplex mode. */
 1828         if (sc->nge_tbi)
 1829                 media = sc->nge_ifmedia.ifm_cur->ifm_media;
 1830         else
 1831                 media = mii->mii_media_active;
 1832 
 1833         txcfg = CSR_READ_4(sc, NGE_TX_CFG);
 1834         rxcfg = CSR_READ_4(sc, NGE_RX_CFG);
 1835 
 1836         DPRINTFN(4, ("%s: nge_init txcfg=%#x, rxcfg=%#x\n",
 1837                      sc->sc_dv.dv_xname, txcfg, rxcfg));
 1838 
 1839         if ((media & IFM_GMASK) == IFM_FDX) {
 1840                 txcfg |= (NGE_TXCFG_IGN_HBEAT|NGE_TXCFG_IGN_CARR);
 1841                 rxcfg |= (NGE_RXCFG_RX_FDX);
 1842         } else {
 1843                 txcfg &= ~(NGE_TXCFG_IGN_HBEAT|NGE_TXCFG_IGN_CARR);
 1844                 rxcfg &= ~(NGE_RXCFG_RX_FDX);
 1845         }
 1846 
 1847         txcfg |= NGE_TXCFG_AUTOPAD;
 1848         
 1849         CSR_WRITE_4(sc, NGE_TX_CFG, txcfg);
 1850         CSR_WRITE_4(sc, NGE_RX_CFG, rxcfg);
 1851 
 1852         nge_tick(sc);
 1853 
 1854         /*
 1855          * Enable the delivery of PHY interrupts based on
 1856          * link/speed/duplex status changes and enable return
 1857          * of extended status information in the DMA descriptors,
 1858          * required for checksum offloading.
 1859          */
 1860         NGE_SETBIT(sc, NGE_CFG, NGE_CFG_PHYINTR_SPD|NGE_CFG_PHYINTR_LNK|
 1861                    NGE_CFG_PHYINTR_DUP|NGE_CFG_EXTSTS_ENB);
 1862 
 1863         DPRINTFN(1, ("%s: nge_init: config=%#x\n", sc->sc_dv.dv_xname,
 1864                      CSR_READ_4(sc, NGE_CFG)));
 1865 
 1866         /*
 1867          * Configure interrupt holdoff (moderation). We can
 1868          * have the chip delay interrupt delivery for a certain
 1869          * period. Units are in 100us, and the max setting
 1870          * is 25500us (0xFF x 100us). Default is a 100us holdoff.
 1871          */
 1872         CSR_WRITE_4(sc, NGE_IHR, 0x01);
 1873 
 1874         /*
 1875          * Enable interrupts.
 1876          */
 1877         CSR_WRITE_4(sc, NGE_IMR, NGE_INTRS);
 1878         CSR_WRITE_4(sc, NGE_IER, 1);
 1879 
 1880         /* Enable receiver and transmitter. */
 1881         NGE_CLRBIT(sc, NGE_CSR, NGE_CSR_TX_DISABLE|NGE_CSR_RX_DISABLE);
 1882         NGE_SETBIT(sc, NGE_CSR, NGE_CSR_RX_ENABLE);
 1883 
 1884         if (sc->nge_tbi)
 1885             nge_ifmedia_tbi_upd(ifp);
 1886         else
 1887             nge_ifmedia_mii_upd(ifp);
 1888 
 1889         ifp->if_flags |= IFF_RUNNING;
 1890         ifp->if_flags &= ~IFF_OACTIVE;
 1891 
 1892         splx(s);
 1893 }
 1894 
 1895 /*
 1896  * Set mii media options.
 1897  */
 1898 int
 1899 nge_ifmedia_mii_upd(ifp)
 1900         struct ifnet            *ifp;
 1901 {
 1902         struct nge_softc        *sc = ifp->if_softc;
 1903         struct mii_data         *mii = &sc->nge_mii;
 1904 
 1905         DPRINTFN(2, ("%s: nge_ifmedia_mii_upd\n", sc->sc_dv.dv_xname));
 1906 
 1907         sc->nge_link = 0;
 1908 
 1909         if (mii->mii_instance) {
 1910                 struct mii_softc *miisc;
 1911                 LIST_FOREACH(miisc, &mii->mii_phys, mii_list)
 1912                         mii_phy_reset(miisc);
 1913         }
 1914         mii_mediachg(mii);
 1915 
 1916         return(0);
 1917 }
 1918 
 1919 /*
 1920  * Report current mii media status.
 1921  */
 1922 void
 1923 nge_ifmedia_mii_sts(ifp, ifmr)
 1924         struct ifnet            *ifp;
 1925         struct ifmediareq       *ifmr;
 1926 {
 1927         struct nge_softc        *sc = ifp->if_softc;
 1928         struct mii_data *mii = &sc->nge_mii;
 1929 
 1930         DPRINTFN(2, ("%s: nge_ifmedia_mii_sts\n", sc->sc_dv.dv_xname));
 1931 
 1932         mii_pollstat(mii);
 1933         ifmr->ifm_active = mii->mii_media_active;
 1934         ifmr->ifm_status = mii->mii_media_status;
 1935 }
 1936 
 1937 /*
 1938  * Set mii media options.
 1939  */
 1940 int
 1941 nge_ifmedia_tbi_upd(ifp)
 1942         struct ifnet            *ifp;
 1943 {
 1944         struct nge_softc        *sc = ifp->if_softc;
 1945 
 1946         DPRINTFN(2, ("%s: nge_ifmedia_tbi_upd\n", sc->sc_dv.dv_xname));
 1947 
 1948         sc->nge_link = 0;
 1949 
 1950         if (IFM_SUBTYPE(sc->nge_ifmedia.ifm_cur->ifm_media) 
 1951             == IFM_AUTO) {
 1952                 u_int32_t anar, bmcr;
 1953                 anar = CSR_READ_4(sc, NGE_TBI_ANAR);
 1954                 anar |= (NGE_TBIANAR_HDX | NGE_TBIANAR_FDX);
 1955                 CSR_WRITE_4(sc, NGE_TBI_ANAR, anar);
 1956 
 1957                 bmcr = CSR_READ_4(sc, NGE_TBI_BMCR);
 1958                 bmcr |= (NGE_TBIBMCR_ENABLE_ANEG|NGE_TBIBMCR_RESTART_ANEG);
 1959                 CSR_WRITE_4(sc, NGE_TBI_BMCR, bmcr);
 1960 
 1961                 bmcr &= ~(NGE_TBIBMCR_RESTART_ANEG);
 1962                 CSR_WRITE_4(sc, NGE_TBI_BMCR, bmcr);
 1963         } else {
 1964                 u_int32_t txcfg, rxcfg;
 1965                 txcfg = CSR_READ_4(sc, NGE_TX_CFG);
 1966                 rxcfg = CSR_READ_4(sc, NGE_RX_CFG);
 1967 
 1968                 if ((sc->nge_ifmedia.ifm_cur->ifm_media & IFM_GMASK)
 1969                     == IFM_FDX) {
 1970                         txcfg |= NGE_TXCFG_IGN_HBEAT|NGE_TXCFG_IGN_CARR;
 1971                         rxcfg |= NGE_RXCFG_RX_FDX;
 1972                 } else {
 1973                         txcfg &= ~(NGE_TXCFG_IGN_HBEAT|NGE_TXCFG_IGN_CARR);
 1974                         rxcfg &= ~(NGE_RXCFG_RX_FDX);
 1975                 }
 1976 
 1977                 txcfg |= NGE_TXCFG_AUTOPAD;
 1978                 CSR_WRITE_4(sc, NGE_TX_CFG, txcfg);
 1979                 CSR_WRITE_4(sc, NGE_RX_CFG, rxcfg);
 1980         }
 1981         
 1982         NGE_CLRBIT(sc, NGE_GPIO, NGE_GPIO_GP3_OUT);
 1983 
 1984         return(0);
 1985 }
 1986 
 1987 /*
 1988  * Report current tbi media status.
 1989  */
 1990 void
 1991 nge_ifmedia_tbi_sts(ifp, ifmr)
 1992         struct ifnet            *ifp;
 1993         struct ifmediareq       *ifmr;
 1994 {
 1995         struct nge_softc        *sc = ifp->if_softc;
 1996         u_int32_t               bmcr;
 1997 
 1998         bmcr = CSR_READ_4(sc, NGE_TBI_BMCR);
 1999         
 2000         if (IFM_SUBTYPE(sc->nge_ifmedia.ifm_cur->ifm_media) == IFM_AUTO) {
 2001                 u_int32_t bmsr = CSR_READ_4(sc, NGE_TBI_BMSR);
 2002                 DPRINTFN(2, ("%s: nge_ifmedia_tbi_sts bmsr=%#x, bmcr=%#x\n",
 2003                              sc->sc_dv.dv_xname, bmsr, bmcr));
 2004         
 2005                 if (!(bmsr & NGE_TBIBMSR_ANEG_DONE)) {
 2006                         ifmr->ifm_active = IFM_ETHER|IFM_NONE;
 2007                         ifmr->ifm_status = IFM_AVALID;
 2008                         return;
 2009                 }
 2010         } else {
 2011                 DPRINTFN(2, ("%s: nge_ifmedia_tbi_sts bmcr=%#x\n",
 2012                              sc->sc_dv.dv_xname, bmcr));
 2013         }
 2014                 
 2015         ifmr->ifm_status = IFM_AVALID|IFM_ACTIVE;
 2016         ifmr->ifm_active = IFM_ETHER|IFM_1000_SX;
 2017         
 2018         if (bmcr & NGE_TBIBMCR_LOOPBACK)
 2019                 ifmr->ifm_active |= IFM_LOOP;
 2020         
 2021         if (IFM_SUBTYPE(sc->nge_ifmedia.ifm_cur->ifm_media) == IFM_AUTO) {
 2022                 u_int32_t anlpar = CSR_READ_4(sc, NGE_TBI_ANLPAR);
 2023                 DPRINTFN(2, ("%s: nge_ifmedia_tbi_sts anlpar=%#x\n",
 2024                              sc->sc_dv.dv_xname, anlpar));
 2025                 
 2026                 ifmr->ifm_active |= IFM_AUTO;
 2027                 if (anlpar & NGE_TBIANLPAR_FDX) {
 2028                         ifmr->ifm_active |= IFM_FDX;
 2029                 } else if (anlpar & NGE_TBIANLPAR_HDX) {
 2030                         ifmr->ifm_active |= IFM_HDX;
 2031                 } else
 2032                         ifmr->ifm_active |= IFM_FDX;
 2033                 
 2034         } else if ((sc->nge_ifmedia.ifm_cur->ifm_media & IFM_GMASK) == IFM_FDX)
 2035                 ifmr->ifm_active |= IFM_FDX;
 2036         else
 2037                 ifmr->ifm_active |= IFM_HDX;
 2038         
 2039 }
 2040 
 2041 int
 2042 nge_ioctl(ifp, command, data)
 2043         struct ifnet            *ifp;
 2044         u_long                  command;
 2045         caddr_t                 data;
 2046 {
 2047         struct nge_softc        *sc = ifp->if_softc;
 2048         struct ifreq            *ifr = (struct ifreq *) data;
 2049         struct ifaddr           *ifa = (struct ifaddr *)data;
 2050         struct mii_data         *mii;
 2051         int                     s, error = 0;
 2052 
 2053         s = splnet();
 2054 
 2055         if ((error = ether_ioctl(ifp, &sc->arpcom, command, data)) > 0) {
 2056                 splx(s);
 2057                 return (error);
 2058         }
 2059 
 2060         switch(command) {
 2061         case SIOCSIFMTU:
 2062                 if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > ifp->if_hardmtu)
 2063                         error = EINVAL;
 2064                 else if (ifp->if_mtu != ifr->ifr_mtu)
 2065                         ifp->if_mtu = ifr->ifr_mtu;
 2066                 break;
 2067         case SIOCSIFADDR:
 2068                 ifp->if_flags |= IFF_UP;
 2069                 switch (ifa->ifa_addr->sa_family) {
 2070 #ifdef INET
 2071                 case AF_INET:
 2072                         nge_init(sc);
 2073                         arp_ifinit(&sc->arpcom, ifa);
 2074                         break;
 2075 #endif /* INET */
 2076                 default:
 2077                         nge_init(sc);
 2078                         break;
 2079                 }
 2080                 break;
 2081         case SIOCSIFFLAGS:
 2082                 if (ifp->if_flags & IFF_UP) {
 2083                         if (ifp->if_flags & IFF_RUNNING &&
 2084                             ifp->if_flags & IFF_PROMISC &&
 2085                             !(sc->nge_if_flags & IFF_PROMISC)) {
 2086                                 NGE_SETBIT(sc, NGE_RXFILT_CTL,
 2087                                     NGE_RXFILTCTL_ALLPHYS|
 2088                                     NGE_RXFILTCTL_ALLMULTI);
 2089                         } else if (ifp->if_flags & IFF_RUNNING &&
 2090                             !(ifp->if_flags & IFF_PROMISC) &&
 2091                             sc->nge_if_flags & IFF_PROMISC) {
 2092                                 NGE_CLRBIT(sc, NGE_RXFILT_CTL,
 2093                                     NGE_RXFILTCTL_ALLPHYS);
 2094                                 if (!(ifp->if_flags & IFF_ALLMULTI))
 2095                                         NGE_CLRBIT(sc, NGE_RXFILT_CTL,
 2096                                             NGE_RXFILTCTL_ALLMULTI);
 2097                         } else {
 2098                                 ifp->if_flags &= ~IFF_RUNNING;
 2099                                 nge_init(sc);
 2100                         }
 2101                 } else {
 2102                         if (ifp->if_flags & IFF_RUNNING)
 2103                                 nge_stop(sc);
 2104                 }
 2105                 sc->nge_if_flags = ifp->if_flags;
 2106                 error = 0;
 2107                 break;
 2108         case SIOCADDMULTI:
 2109         case SIOCDELMULTI:
 2110                 error = (command == SIOCADDMULTI)
 2111                         ? ether_addmulti(ifr, &sc->arpcom)
 2112                         : ether_delmulti(ifr, &sc->arpcom);
 2113 
 2114                 if (error == ENETRESET) {
 2115                         if (ifp->if_flags & IFF_RUNNING)
 2116                                 nge_setmulti(sc);
 2117                         error = 0;
 2118                 }
 2119                 break;
 2120         case SIOCGIFMEDIA:
 2121         case SIOCSIFMEDIA:
 2122                 if (sc->nge_tbi) {
 2123                         error = ifmedia_ioctl(ifp, ifr, &sc->nge_ifmedia, 
 2124                                               command);
 2125                 } else {
 2126                         mii = &sc->nge_mii;
 2127                         error = ifmedia_ioctl(ifp, ifr, &mii->mii_media,
 2128                                               command);
 2129                 }
 2130                 break;
 2131         default:
 2132                 error = ENOTTY;
 2133                 break;
 2134         }
 2135 
 2136         splx(s);
 2137 
 2138         return(error);
 2139 }
 2140 
 2141 void
 2142 nge_watchdog(ifp)
 2143         struct ifnet            *ifp;
 2144 {
 2145         struct nge_softc        *sc;
 2146 
 2147         sc = ifp->if_softc;
 2148 
 2149         ifp->if_oerrors++;
 2150         printf("%s: watchdog timeout\n", sc->sc_dv.dv_xname);
 2151 
 2152         nge_stop(sc);
 2153         nge_reset(sc);
 2154         ifp->if_flags &= ~IFF_RUNNING;
 2155         nge_init(sc);
 2156 
 2157         if (!IFQ_IS_EMPTY(&ifp->if_snd))
 2158                 nge_start(ifp);
 2159 }
 2160 
 2161 /*
 2162  * Stop the adapter and free any mbufs allocated to the
 2163  * RX and TX lists.
 2164  */
 2165 void
 2166 nge_stop(sc)
 2167         struct nge_softc        *sc;
 2168 {
 2169         int                     i;
 2170         struct ifnet            *ifp;
 2171         struct mii_data         *mii;
 2172 
 2173         ifp = &sc->arpcom.ac_if;
 2174         ifp->if_timer = 0;
 2175         if (sc->nge_tbi) {
 2176                 mii = NULL;
 2177         } else {
 2178                 mii = &sc->nge_mii;
 2179         }
 2180 
 2181         timeout_del(&sc->nge_timeout);
 2182 
 2183         ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
 2184 
 2185         CSR_WRITE_4(sc, NGE_IER, 0);
 2186         CSR_WRITE_4(sc, NGE_IMR, 0);
 2187         NGE_SETBIT(sc, NGE_CSR, NGE_CSR_TX_DISABLE|NGE_CSR_RX_DISABLE);
 2188         DELAY(1000);
 2189         CSR_WRITE_4(sc, NGE_TX_LISTPTR, 0);
 2190         CSR_WRITE_4(sc, NGE_RX_LISTPTR, 0);
 2191 
 2192         if (!sc->nge_tbi)
 2193                 mii_down(mii);
 2194 
 2195         sc->nge_link = 0;
 2196 
 2197         /*
 2198          * Free data in the RX lists.
 2199          */
 2200         for (i = 0; i < NGE_RX_LIST_CNT; i++) {
 2201                 if (sc->nge_ldata->nge_rx_list[i].nge_mbuf != NULL) {
 2202                         m_freem(sc->nge_ldata->nge_rx_list[i].nge_mbuf);
 2203                         sc->nge_ldata->nge_rx_list[i].nge_mbuf = NULL;
 2204                 }
 2205         }
 2206         bzero((char *)&sc->nge_ldata->nge_rx_list,
 2207                 sizeof(sc->nge_ldata->nge_rx_list));
 2208 
 2209         /*
 2210          * Free the TX list buffers.
 2211          */
 2212         for (i = 0; i < NGE_TX_LIST_CNT; i++) {
 2213                 if (sc->nge_ldata->nge_tx_list[i].nge_mbuf != NULL) {
 2214                         m_freem(sc->nge_ldata->nge_tx_list[i].nge_mbuf);
 2215                         sc->nge_ldata->nge_tx_list[i].nge_mbuf = NULL;
 2216                 }
 2217         }
 2218 
 2219         bzero((char *)&sc->nge_ldata->nge_tx_list,
 2220                 sizeof(sc->nge_ldata->nge_tx_list));
 2221 }
 2222 
 2223 /*
 2224  * Stop all chip I/O so that the kernel's probe routines don't
 2225  * get confused by errant DMAs when rebooting.
 2226  */
 2227 void
 2228 nge_shutdown(xsc)
 2229         void *xsc;
 2230 {
 2231         struct nge_softc *sc = (struct nge_softc *)xsc;
 2232 
 2233         nge_reset(sc);
 2234         nge_stop(sc);
 2235 }
 2236 
 2237 struct cfattach nge_ca = {
 2238         sizeof(struct nge_softc), nge_probe, nge_attach
 2239 };
 2240 
 2241 struct cfdriver nge_cd = {
 2242         0, "nge", DV_IFNET
 2243 };

/* [<][>][^][v][top][bottom][index][help] */