[BACK]Return to if_nge.c CVS log [TXT][DIR] Up to [local] / sys / dev / pci

Annotation of sys/dev/pci/if_nge.c, Revision 1.1.1.1

1.1       nbrk        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: };

CVSweb