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

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

1.1       nbrk        1: /*     $OpenBSD: if_ti.c,v 1.84 2006/11/20 22:49:32 brad Exp $ */
                      2:
                      3: /*
                      4:  * Copyright (c) 1997, 1998, 1999
                      5:  *     Bill Paul <wpaul@ctr.columbia.edu>.  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: src/sys/pci/if_ti.c,v 1.25 2000/01/18 00:26:29 wpaul Exp $
                     35:  */
                     36:
                     37: /*
                     38:  * Alteon Networks Tigon PCI gigabit ethernet driver for FreeBSD.
                     39:  * Manuals, sample driver and firmware source kits are available
                     40:  * from http://www.alteon.com/support/openkits.
                     41:  *
                     42:  * Written by Bill Paul <wpaul@ctr.columbia.edu>
                     43:  * Electrical Engineering Department
                     44:  * Columbia University, New York City
                     45:  */
                     46:
                     47: /*
                     48:  * The Alteon Networks Tigon chip contains an embedded R4000 CPU,
                     49:  * gigabit MAC, dual DMA channels and a PCI interface unit. NICs
                     50:  * using the Tigon may have anywhere from 512K to 2MB of SRAM. The
                     51:  * Tigon supports hardware IP, TCP and UCP checksumming, multicast
                     52:  * filtering and jumbo (9014 byte) frames. The hardware is largely
                     53:  * controlled by firmware, which must be loaded into the NIC during
                     54:  * initialization.
                     55:  *
                     56:  * The Tigon 2 contains 2 R4000 CPUs and requires a newer firmware
                     57:  * revision, which supports new features such as extended commands,
                     58:  * extended jumbo receive ring desciptors and a mini receive ring.
                     59:  *
                     60:  * Alteon Networks is to be commended for releasing such a vast amount
                     61:  * of development material for the Tigon NIC without requiring an NDA
                     62:  * (although they really should have done it a long time ago). With
                     63:  * any luck, the other vendors will finally wise up and follow Alteon's
                     64:  * stellar example.
                     65:  *
                     66:  * The firmware for the Tigon 1 and 2 NICs is compiled directly into
                     67:  * this driver by #including it as a C header file. This bloats the
                     68:  * driver somewhat, but it's the easiest method considering that the
                     69:  * driver code and firmware code need to be kept in sync. The source
                     70:  * for the firmware is not provided with the FreeBSD distribution since
                     71:  * compiling it requires a GNU toolchain targeted for mips-sgi-irix5.3.
                     72:  *
                     73:  * The following people deserve special thanks:
                     74:  * - Terry Murphy of 3Com, for providing a 3c985 Tigon 1 board
                     75:  *   for testing
                     76:  * - Raymond Lee of Netgear, for providing a pair of Netgear
                     77:  *   GA620 Tigon 2 boards for testing
                     78:  * - Ulf Zimmermann, for bringing the GA260 to my attention and
                     79:  *   convincing me to write this driver.
                     80:  * - Andrew Gallatin for providing FreeBSD/Alpha support.
                     81:  */
                     82:
                     83: #include "bpfilter.h"
                     84: #include "vlan.h"
                     85:
                     86: #include <sys/param.h>
                     87: #include <sys/systm.h>
                     88: #include <sys/sockio.h>
                     89: #include <sys/mbuf.h>
                     90: #include <sys/malloc.h>
                     91: #include <sys/kernel.h>
                     92: #include <sys/socket.h>
                     93: #include <sys/device.h>
                     94: #include <sys/queue.h>
                     95:
                     96: #include <net/if.h>
                     97: #include <net/if_dl.h>
                     98: #include <net/if_types.h>
                     99:
                    100: #ifdef INET
                    101: #include <netinet/in.h>
                    102: #include <netinet/in_systm.h>
                    103: #include <netinet/in_var.h>
                    104: #include <netinet/ip.h>
                    105: #include <netinet/if_ether.h>
                    106: #endif
                    107:
                    108: #include <net/if_media.h>
                    109:
                    110: #if NBPFILTER > 0
                    111: #include <net/bpf.h>
                    112: #endif
                    113:
                    114: #if NVLAN > 0
                    115: #include <net/if_types.h>
                    116: #include <net/if_vlan_var.h>
                    117: #endif
                    118:
                    119: #include <dev/pci/pcireg.h>
                    120: #include <dev/pci/pcivar.h>
                    121: #include <dev/pci/pcidevs.h>
                    122:
                    123: #include <dev/pci/if_tireg.h>
                    124: #include <dev/pci/if_tivar.h>
                    125:
                    126: int ti_probe(struct device *, void *, void *);
                    127: void ti_attach(struct device *, struct device *, void *);
                    128:
                    129: struct cfattach ti_ca = {
                    130:        sizeof(struct ti_softc), ti_probe, ti_attach
                    131: };
                    132:
                    133: struct cfdriver ti_cd = {
                    134:        0, "ti", DV_IFNET
                    135: };
                    136:
                    137: void ti_txeof_tigon1(struct ti_softc *);
                    138: void ti_txeof_tigon2(struct ti_softc *);
                    139: void ti_rxeof(struct ti_softc *);
                    140:
                    141: void ti_stats_update(struct ti_softc *);
                    142: int ti_encap_tigon1(struct ti_softc *, struct mbuf *, u_int32_t *);
                    143: int ti_encap_tigon2(struct ti_softc *, struct mbuf *, u_int32_t *);
                    144:
                    145: int ti_intr(void *);
                    146: void ti_start(struct ifnet *);
                    147: int ti_ioctl(struct ifnet *, u_long, caddr_t);
                    148: void ti_init(void *);
                    149: void ti_init2(struct ti_softc *);
                    150: void ti_stop(struct ti_softc *);
                    151: void ti_watchdog(struct ifnet *);
                    152: void ti_shutdown(void *);
                    153: int ti_ifmedia_upd(struct ifnet *);
                    154: void ti_ifmedia_sts(struct ifnet *, struct ifmediareq *);
                    155:
                    156: u_int32_t ti_eeprom_putbyte(struct ti_softc *, int);
                    157: u_int8_t ti_eeprom_getbyte(struct ti_softc *, int, u_int8_t *);
                    158: int ti_read_eeprom(struct ti_softc *, caddr_t, int, int);
                    159:
                    160: void ti_add_mcast(struct ti_softc *, struct ether_addr *);
                    161: void ti_del_mcast(struct ti_softc *, struct ether_addr *);
                    162: void ti_setmulti(struct ti_softc *);
                    163:
                    164: void ti_mem_read(struct ti_softc *, u_int32_t, u_int32_t, void *);
                    165: void ti_mem_write(struct ti_softc *, u_int32_t, u_int32_t, const void*);
                    166: void ti_mem_set(struct ti_softc *, u_int32_t, u_int32_t);
                    167: void ti_loadfw(struct ti_softc *);
                    168: void ti_cmd(struct ti_softc *, struct ti_cmd_desc *);
                    169: void ti_cmd_ext(struct ti_softc *, struct ti_cmd_desc *,
                    170:     caddr_t, int);
                    171: void ti_handle_events(struct ti_softc *);
                    172: int ti_alloc_jumbo_mem(struct ti_softc *);
                    173: void *ti_jalloc(struct ti_softc *);
                    174: void ti_jfree(caddr_t, u_int, void *);
                    175: int ti_newbuf_std(struct ti_softc *, int, struct mbuf *, bus_dmamap_t);
                    176: int ti_newbuf_mini(struct ti_softc *, int, struct mbuf *, bus_dmamap_t);
                    177: int ti_newbuf_jumbo(struct ti_softc *, int, struct mbuf *);
                    178: int ti_init_rx_ring_std(struct ti_softc *);
                    179: void ti_free_rx_ring_std(struct ti_softc *);
                    180: int ti_init_rx_ring_jumbo(struct ti_softc *);
                    181: void ti_free_rx_ring_jumbo(struct ti_softc *);
                    182: int ti_init_rx_ring_mini(struct ti_softc *);
                    183: void ti_free_rx_ring_mini(struct ti_softc *);
                    184: void ti_free_tx_ring(struct ti_softc *);
                    185: int ti_init_tx_ring(struct ti_softc *);
                    186:
                    187: int ti_64bitslot_war(struct ti_softc *);
                    188: int ti_chipinit(struct ti_softc *);
                    189: int ti_gibinit(struct ti_softc *);
                    190:
                    191: const struct pci_matchid ti_devices[] = {
                    192:        { PCI_VENDOR_NETGEAR, PCI_PRODUCT_NETGEAR_GA620 },
                    193:        { PCI_VENDOR_NETGEAR, PCI_PRODUCT_NETGEAR_GA620T },
                    194:        { PCI_VENDOR_ALTEON, PCI_PRODUCT_ALTEON_ACENIC },
                    195:        { PCI_VENDOR_ALTEON, PCI_PRODUCT_ALTEON_ACENICT },
                    196:        { PCI_VENDOR_3COM, PCI_PRODUCT_3COM_3C985 },
                    197:        { PCI_VENDOR_SGI, PCI_PRODUCT_SGI_TIGON },
                    198:        { PCI_VENDOR_DEC, PCI_PRODUCT_DEC_PN9000SX }
                    199: };
                    200:
                    201: /*
                    202:  * Send an instruction or address to the EEPROM, check for ACK.
                    203:  */
                    204: u_int32_t
                    205: ti_eeprom_putbyte(struct ti_softc *sc, int byte)
                    206: {
                    207:        int             i, ack = 0;
                    208:
                    209:        /*
                    210:         * Make sure we're in TX mode.
                    211:         */
                    212:        TI_SETBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_TXEN);
                    213:
                    214:        /*
                    215:         * Feed in each bit and strobe the clock.
                    216:         */
                    217:        for (i = 0x80; i; i >>= 1) {
                    218:                if (byte & i)
                    219:                        TI_SETBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_DOUT);
                    220:                else
                    221:                        TI_CLRBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_DOUT);
                    222:                DELAY(1);
                    223:                TI_SETBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_CLK);
                    224:                DELAY(1);
                    225:                TI_CLRBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_CLK);
                    226:        }
                    227:
                    228:        /*
                    229:         * Turn off TX mode.
                    230:         */
                    231:        TI_CLRBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_TXEN);
                    232:
                    233:        /*
                    234:         * Check for ack.
                    235:         */
                    236:        TI_SETBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_CLK);
                    237:        ack = CSR_READ_4(sc, TI_MISC_LOCAL_CTL) & TI_MLC_EE_DIN;
                    238:        TI_CLRBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_CLK);
                    239:
                    240:        return (ack);
                    241: }
                    242:
                    243: /*
                    244:  * Read a byte of data stored in the EEPROM at address 'addr.'
                    245:  * We have to send two address bytes since the EEPROM can hold
                    246:  * more than 256 bytes of data.
                    247:  */
                    248: u_int8_t
                    249: ti_eeprom_getbyte(struct ti_softc *sc, int addr, u_int8_t *dest)
                    250: {
                    251:        int             i;
                    252:        u_int8_t                byte = 0;
                    253:
                    254:        EEPROM_START;
                    255:
                    256:        /*
                    257:         * Send write control code to EEPROM.
                    258:         */
                    259:        if (ti_eeprom_putbyte(sc, EEPROM_CTL_WRITE)) {
                    260:                printf("%s: failed to send write command, status: %x\n",
                    261:                    sc->sc_dv.dv_xname, CSR_READ_4(sc, TI_MISC_LOCAL_CTL));
                    262:                return (1);
                    263:        }
                    264:
                    265:        /*
                    266:         * Send first byte of address of byte we want to read.
                    267:         */
                    268:        if (ti_eeprom_putbyte(sc, (addr >> 8) & 0xFF)) {
                    269:                printf("%s: failed to send address, status: %x\n",
                    270:                    sc->sc_dv.dv_xname, CSR_READ_4(sc, TI_MISC_LOCAL_CTL));
                    271:                return (1);
                    272:        }
                    273:        /*
                    274:         * Send second byte address of byte we want to read.
                    275:         */
                    276:        if (ti_eeprom_putbyte(sc, addr & 0xFF)) {
                    277:                printf("%s: failed to send address, status: %x\n",
                    278:                    sc->sc_dv.dv_xname, CSR_READ_4(sc, TI_MISC_LOCAL_CTL));
                    279:                return (1);
                    280:        }
                    281:
                    282:        EEPROM_STOP;
                    283:        EEPROM_START;
                    284:        /*
                    285:         * Send read control code to EEPROM.
                    286:         */
                    287:        if (ti_eeprom_putbyte(sc, EEPROM_CTL_READ)) {
                    288:                printf("%s: failed to send read command, status: %x\n",
                    289:                    sc->sc_dv.dv_xname, CSR_READ_4(sc, TI_MISC_LOCAL_CTL));
                    290:                return (1);
                    291:        }
                    292:
                    293:        /*
                    294:         * Start reading bits from EEPROM.
                    295:         */
                    296:        TI_CLRBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_TXEN);
                    297:        for (i = 0x80; i; i >>= 1) {
                    298:                TI_SETBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_CLK);
                    299:                DELAY(1);
                    300:                if (CSR_READ_4(sc, TI_MISC_LOCAL_CTL) & TI_MLC_EE_DIN)
                    301:                        byte |= i;
                    302:                TI_CLRBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_CLK);
                    303:                DELAY(1);
                    304:        }
                    305:
                    306:        EEPROM_STOP;
                    307:
                    308:        /*
                    309:         * No ACK generated for read, so just return byte.
                    310:         */
                    311:
                    312:        *dest = byte;
                    313:
                    314:        return (0);
                    315: }
                    316:
                    317: /*
                    318:  * Read a sequence of bytes from the EEPROM.
                    319:  */
                    320: int
                    321: ti_read_eeprom(struct ti_softc *sc, caddr_t dest, int off, int cnt)
                    322: {
                    323:        int                     err = 0, i;
                    324:        u_int8_t                byte = 0;
                    325:
                    326:        for (i = 0; i < cnt; i++) {
                    327:                err = ti_eeprom_getbyte(sc, off + i, &byte);
                    328:                if (err)
                    329:                        break;
                    330:                *(dest + i) = byte;
                    331:        }
                    332:
                    333:        return (err ? 1 : 0);
                    334: }
                    335:
                    336: /*
                    337:  * NIC memory read function.
                    338:  * Can be used to copy data from NIC local memory.
                    339:  */
                    340: void
                    341: ti_mem_read(struct ti_softc *sc, u_int32_t addr, u_int32_t len, void *buf)
                    342: {
                    343:        int                     segptr, segsize, cnt;
                    344:        caddr_t                 ptr;
                    345:
                    346:        segptr = addr;
                    347:        cnt = len;
                    348:        ptr = buf;
                    349:
                    350:        while(cnt) {
                    351:                if (cnt < TI_WINLEN)
                    352:                        segsize = cnt;
                    353:                else
                    354:                        segsize = TI_WINLEN - (segptr % TI_WINLEN);
                    355:                CSR_WRITE_4(sc, TI_WINBASE, (segptr & ~(TI_WINLEN - 1)));
                    356:                bus_space_read_region_4(sc->ti_btag, sc->ti_bhandle,
                    357:                    TI_WINDOW + (segptr & (TI_WINLEN - 1)), (u_int32_t *)ptr,
                    358:                    segsize / 4);
                    359:                ptr += segsize;
                    360:                segptr += segsize;
                    361:                cnt -= segsize;
                    362:        }
                    363: }
                    364:
                    365: /*
                    366:  * NIC memory write function.
                    367:  * Can be used to copy data into  NIC local memory.
                    368:  */
                    369: void
                    370: ti_mem_write(struct ti_softc *sc, u_int32_t addr, u_int32_t len,
                    371:     const void *buf)
                    372: {
                    373:        int                     segptr, segsize, cnt;
                    374:        const char              *ptr;
                    375:
                    376:        segptr = addr;
                    377:        cnt = len;
                    378:        ptr = buf;
                    379:
                    380:        while(cnt) {
                    381:                if (cnt < TI_WINLEN)
                    382:                        segsize = cnt;
                    383:                else
                    384:                        segsize = TI_WINLEN - (segptr % TI_WINLEN);
                    385:                CSR_WRITE_4(sc, TI_WINBASE, (segptr & ~(TI_WINLEN - 1)));
                    386:                bus_space_write_region_4(sc->ti_btag, sc->ti_bhandle,
                    387:                    TI_WINDOW + (segptr & (TI_WINLEN - 1)), (u_int32_t *)ptr,
                    388:                    segsize / 4);
                    389:                ptr += segsize;
                    390:                segptr += segsize;
                    391:                cnt -= segsize;
                    392:        }
                    393: }
                    394:
                    395: /*
                    396:  * NIC memory write function.
                    397:  * Can be used to clear a section of NIC local memory.
                    398:  */
                    399: void
                    400: ti_mem_set(struct ti_softc *sc, u_int32_t addr, u_int32_t len)
                    401: {
                    402:        int                     segptr, segsize, cnt;
                    403:
                    404:        segptr = addr;
                    405:        cnt = len;
                    406:
                    407:        while(cnt) {
                    408:                if (cnt < TI_WINLEN)
                    409:                        segsize = cnt;
                    410:                else
                    411:                        segsize = TI_WINLEN - (segptr % TI_WINLEN);
                    412:                CSR_WRITE_4(sc, TI_WINBASE, (segptr & ~(TI_WINLEN - 1)));
                    413:                bus_space_set_region_4(sc->ti_btag, sc->ti_bhandle,
                    414:                    TI_WINDOW + (segptr & (TI_WINLEN - 1)), 0, segsize / 4);
                    415:                segptr += segsize;
                    416:                cnt -= segsize;
                    417:        }
                    418: }
                    419:
                    420: /*
                    421:  * Load firmware image into the NIC. Check that the firmware revision
                    422:  * is acceptable and see if we want the firmware for the Tigon 1 or
                    423:  * Tigon 2.
                    424:  */
                    425: void
                    426: ti_loadfw(struct ti_softc *sc)
                    427: {
                    428:        struct tigon_firmware *tf;
                    429:        u_char *buf = NULL;
                    430:        size_t buflen;
                    431:        char *name;
                    432:        int error;
                    433:
                    434:        switch(sc->ti_hwrev) {
                    435:        case TI_HWREV_TIGON:
                    436:                name = "tigon1";
                    437:                break;
                    438:        case TI_HWREV_TIGON_II:
                    439:                name = "tigon2";
                    440:                break;
                    441:        default:
                    442:                printf("%s: can't load firmware: unknown hardware rev\n",
                    443:                    sc->sc_dv.dv_xname);
                    444:                return;
                    445:        }
                    446:
                    447:        error = loadfirmware(name, &buf, &buflen);
                    448:        if (error)
                    449:                return;
                    450:        tf = (struct tigon_firmware *)buf;
                    451:        if (tf->FwReleaseMajor != TI_FIRMWARE_MAJOR ||
                    452:            tf->FwReleaseMinor != TI_FIRMWARE_MINOR ||
                    453:            tf->FwReleaseFix != TI_FIRMWARE_FIX) {
                    454:                printf("%s: firmware revision mismatch; want "
                    455:                    "%d.%d.%d, got %d.%d.%d\n", sc->sc_dv.dv_xname,
                    456:                    TI_FIRMWARE_MAJOR, TI_FIRMWARE_MINOR,
                    457:                    TI_FIRMWARE_FIX, tf->FwReleaseMajor,
                    458:                    tf->FwReleaseMinor, tf->FwReleaseFix);
                    459:                free(buf, M_DEVBUF);
                    460:                return;
                    461:        }
                    462:        ti_mem_write(sc, tf->FwTextAddr, tf->FwTextLen,
                    463:            (caddr_t)&tf->data[tf->FwTextOffset]);
                    464:        ti_mem_write(sc, tf->FwRodataAddr, tf->FwRodataLen,
                    465:            (caddr_t)&tf->data[tf->FwRodataOffset]);
                    466:        ti_mem_write(sc, tf->FwDataAddr, tf->FwDataLen,
                    467:            (caddr_t)&tf->data[tf->FwDataOffset]);
                    468:        ti_mem_set(sc, tf->FwBssAddr, tf->FwBssLen);
                    469:        ti_mem_set(sc, tf->FwSbssAddr, tf->FwSbssLen);
                    470:        CSR_WRITE_4(sc, TI_CPU_PROGRAM_COUNTER, tf->FwStartAddr);
                    471:        free(buf, M_DEVBUF);
                    472: }
                    473:
                    474: /*
                    475:  * Send the NIC a command via the command ring.
                    476:  */
                    477: void
                    478: ti_cmd(struct ti_softc *sc, struct ti_cmd_desc *cmd)
                    479: {
                    480:        u_int32_t               index;
                    481:
                    482:        index = sc->ti_cmd_saved_prodidx;
                    483:        CSR_WRITE_4(sc, TI_GCR_CMDRING + (index * 4), *(u_int32_t *)(cmd));
                    484:        TI_INC(index, TI_CMD_RING_CNT);
                    485:        CSR_WRITE_4(sc, TI_MB_CMDPROD_IDX, index);
                    486:        sc->ti_cmd_saved_prodidx = index;
                    487: }
                    488:
                    489: /*
                    490:  * Send the NIC an extended command. The 'len' parameter specifies the
                    491:  * number of command slots to include after the initial command.
                    492:  */
                    493: void
                    494: ti_cmd_ext(struct ti_softc *sc, struct ti_cmd_desc *cmd, caddr_t arg,
                    495:     int len)
                    496: {
                    497:        u_int32_t               index;
                    498:        int             i;
                    499:
                    500:        index = sc->ti_cmd_saved_prodidx;
                    501:        CSR_WRITE_4(sc, TI_GCR_CMDRING + (index * 4), *(u_int32_t *)(cmd));
                    502:        TI_INC(index, TI_CMD_RING_CNT);
                    503:        for (i = 0; i < len; i++) {
                    504:                CSR_WRITE_4(sc, TI_GCR_CMDRING + (index * 4),
                    505:                    *(u_int32_t *)(&arg[i * 4]));
                    506:                TI_INC(index, TI_CMD_RING_CNT);
                    507:        }
                    508:        CSR_WRITE_4(sc, TI_MB_CMDPROD_IDX, index);
                    509:        sc->ti_cmd_saved_prodidx = index;
                    510: }
                    511:
                    512: /*
                    513:  * Handle events that have triggered interrupts.
                    514:  */
                    515: void
                    516: ti_handle_events(struct ti_softc *sc)
                    517: {
                    518:        struct ti_event_desc    *e;
                    519:
                    520:        if (sc->ti_rdata->ti_event_ring == NULL)
                    521:                return;
                    522:
                    523:        while (sc->ti_ev_saved_considx != sc->ti_ev_prodidx.ti_idx) {
                    524:                e = &sc->ti_rdata->ti_event_ring[sc->ti_ev_saved_considx];
                    525:                switch (TI_EVENT_EVENT(e)) {
                    526:                case TI_EV_LINKSTAT_CHANGED:
                    527:                        sc->ti_linkstat = TI_EVENT_CODE(e);
                    528:                        break;
                    529:                case TI_EV_ERROR:
                    530:                        if (TI_EVENT_CODE(e) == TI_EV_CODE_ERR_INVAL_CMD)
                    531:                                printf("%s: invalid command\n",
                    532:                                    sc->sc_dv.dv_xname);
                    533:                        else if (TI_EVENT_CODE(e) == TI_EV_CODE_ERR_UNIMP_CMD)
                    534:                                printf("%s: unknown command\n",
                    535:                                    sc->sc_dv.dv_xname);
                    536:                        else if (TI_EVENT_CODE(e) == TI_EV_CODE_ERR_BADCFG)
                    537:                                printf("%s: bad config data\n",
                    538:                                    sc->sc_dv.dv_xname);
                    539:                        break;
                    540:                case TI_EV_FIRMWARE_UP:
                    541:                        ti_init2(sc);
                    542:                        break;
                    543:                case TI_EV_STATS_UPDATED:
                    544:                        ti_stats_update(sc);
                    545:                        break;
                    546:                case TI_EV_RESET_JUMBO_RING:
                    547:                case TI_EV_MCAST_UPDATED:
                    548:                        /* Who cares. */
                    549:                        break;
                    550:                default:
                    551:                        printf("%s: unknown event: %d\n", sc->sc_dv.dv_xname,
                    552:                               TI_EVENT_EVENT(e));
                    553:                        break;
                    554:                }
                    555:                /* Advance the consumer index. */
                    556:                TI_INC(sc->ti_ev_saved_considx, TI_EVENT_RING_CNT);
                    557:                CSR_WRITE_4(sc, TI_GCR_EVENTCONS_IDX, sc->ti_ev_saved_considx);
                    558:        }
                    559: }
                    560:
                    561: /*
                    562:  * Memory management for the jumbo receive ring is a pain in the
                    563:  * butt. We need to allocate at least 9018 bytes of space per frame,
                    564:  * _and_ it has to be contiguous (unless you use the extended
                    565:  * jumbo descriptor format). Using malloc() all the time won't
                    566:  * work: malloc() allocates memory in powers of two, which means we
                    567:  * would end up wasting a considerable amount of space by allocating
                    568:  * 9K chunks. We don't have a jumbo mbuf cluster pool. Thus, we have
                    569:  * to do our own memory management.
                    570:  *
                    571:  * The driver needs to allocate a contiguous chunk of memory at boot
                    572:  * time. We then chop this up ourselves into 9K pieces and use them
                    573:  * as external mbuf storage.
                    574:  *
                    575:  * One issue here is how much memory to allocate. The jumbo ring has
                    576:  * 256 slots in it, but at 9K per slot than can consume over 2MB of
                    577:  * RAM. This is a bit much, especially considering we also need
                    578:  * RAM for the standard ring and mini ring (on the Tigon 2). To
                    579:  * save space, we only actually allocate enough memory for 64 slots
                    580:  * by default, which works out to between 500 and 600K. This can
                    581:  * be tuned by changing a #define in if_tireg.h.
                    582:  */
                    583:
                    584: int
                    585: ti_alloc_jumbo_mem(struct ti_softc *sc)
                    586: {
                    587:        caddr_t ptr, kva;
                    588:        bus_dma_segment_t seg;
                    589:        int i, rseg, state, error;
                    590:        struct ti_jpool_entry *entry;
                    591:
                    592:        state = error = 0;
                    593:
                    594:        /* Grab a big chunk o' storage. */
                    595:        if (bus_dmamem_alloc(sc->sc_dmatag, TI_JMEM, PAGE_SIZE, 0,
                    596:            &seg, 1, &rseg, BUS_DMA_NOWAIT)) {
                    597:                printf("%s: can't alloc rx buffers\n", sc->sc_dv.dv_xname);
                    598:                return (ENOBUFS);
                    599:        }
                    600:
                    601:        state = 1;
                    602:        if (bus_dmamem_map(sc->sc_dmatag, &seg, rseg, TI_JMEM, &kva,
                    603:            BUS_DMA_NOWAIT)) {
                    604:                printf("%s: can't map dma buffers (%d bytes)\n",
                    605:                    sc->sc_dv.dv_xname, TI_JMEM);
                    606:                error = ENOBUFS;
                    607:                goto out;
                    608:        }
                    609:
                    610:        state = 2;
                    611:        if (bus_dmamap_create(sc->sc_dmatag, TI_JMEM, 1, TI_JMEM, 0,
                    612:            BUS_DMA_NOWAIT, &sc->ti_cdata.ti_rx_jumbo_map)) {
                    613:                printf("%s: can't create dma map\n", sc->sc_dv.dv_xname);
                    614:                error = ENOBUFS;
                    615:                goto out;
                    616:        }
                    617:
                    618:        state = 3;
                    619:        if (bus_dmamap_load(sc->sc_dmatag, sc->ti_cdata.ti_rx_jumbo_map, kva,
                    620:            TI_JMEM, NULL, BUS_DMA_NOWAIT)) {
                    621:                printf("%s: can't load dma map\n", sc->sc_dv.dv_xname);
                    622:                error = ENOBUFS;
                    623:                goto out;
                    624:        }
                    625:
                    626:        state = 4;
                    627:        sc->ti_cdata.ti_jumbo_buf = (caddr_t)kva;
                    628:
                    629:        SLIST_INIT(&sc->ti_jfree_listhead);
                    630:        SLIST_INIT(&sc->ti_jinuse_listhead);
                    631:
                    632:        /*
                    633:         * Now divide it up into 9K pieces and save the addresses
                    634:         * in an array.
                    635:         */
                    636:        ptr = sc->ti_cdata.ti_jumbo_buf;
                    637:        for (i = 0; i < TI_JSLOTS; i++) {
                    638:                sc->ti_cdata.ti_jslots[i].ti_buf = ptr;
                    639:                sc->ti_cdata.ti_jslots[i].ti_inuse = 0;
                    640:                ptr += TI_JLEN;
                    641:                entry = malloc(sizeof(struct ti_jpool_entry),
                    642:                               M_DEVBUF, M_NOWAIT);
                    643:                if (entry == NULL) {
                    644:                        sc->ti_cdata.ti_jumbo_buf = NULL;
                    645:                        printf("%s: no memory for jumbo buffer queue\n",
                    646:                            sc->sc_dv.dv_xname);
                    647:                        error = ENOBUFS;
                    648:                        goto out;
                    649:                }
                    650:                entry->slot = i;
                    651:                SLIST_INSERT_HEAD(&sc->ti_jfree_listhead, entry, jpool_entries);
                    652:        }
                    653: out:
                    654:        if (error != 0) {
                    655:                switch (state) {
                    656:                case 4:
                    657:                        bus_dmamap_unload(sc->sc_dmatag,
                    658:                            sc->ti_cdata.ti_rx_jumbo_map);
                    659:                case 3:
                    660:                        bus_dmamap_destroy(sc->sc_dmatag,
                    661:                            sc->ti_cdata.ti_rx_jumbo_map);
                    662:                case 2:
                    663:                        bus_dmamem_unmap(sc->sc_dmatag, kva, TI_JMEM);
                    664:                case 1:
                    665:                        bus_dmamem_free(sc->sc_dmatag, &seg, rseg);
                    666:                        break;
                    667:                default:
                    668:                        break;
                    669:                }
                    670:        }
                    671:
                    672:        return (error);
                    673: }
                    674:
                    675: /*
                    676:  * Allocate a jumbo buffer.
                    677:  */
                    678: void *
                    679: ti_jalloc(struct ti_softc *sc)
                    680: {
                    681:        struct ti_jpool_entry   *entry;
                    682:
                    683:        entry = SLIST_FIRST(&sc->ti_jfree_listhead);
                    684:
                    685:        if (entry == NULL)
                    686:                return (NULL);
                    687:
                    688:        SLIST_REMOVE_HEAD(&sc->ti_jfree_listhead, jpool_entries);
                    689:        SLIST_INSERT_HEAD(&sc->ti_jinuse_listhead, entry, jpool_entries);
                    690:        sc->ti_cdata.ti_jslots[entry->slot].ti_inuse = 1;
                    691:        return (sc->ti_cdata.ti_jslots[entry->slot].ti_buf);
                    692: }
                    693:
                    694: /*
                    695:  * Release a jumbo buffer.
                    696:  */
                    697: void
                    698: ti_jfree(caddr_t buf, u_int size, void *arg)
                    699: {
                    700:        struct ti_softc         *sc;
                    701:        int                     i;
                    702:        struct ti_jpool_entry   *entry;
                    703:
                    704:        /* Extract the softc struct pointer. */
                    705:        sc = (struct ti_softc *)arg;
                    706:
                    707:        if (sc == NULL)
                    708:                panic("ti_jfree: can't find softc pointer!");
                    709:
                    710:        /* calculate the slot this buffer belongs to */
                    711:        i = ((vaddr_t)buf - (vaddr_t)sc->ti_cdata.ti_jumbo_buf) / TI_JLEN;
                    712:
                    713:        if ((i < 0) || (i >= TI_JSLOTS))
                    714:                panic("ti_jfree: asked to free buffer that we don't manage!");
                    715:        else if (sc->ti_cdata.ti_jslots[i].ti_inuse == 0)
                    716:                panic("ti_jfree: buffer already free!");
                    717:
                    718:        sc->ti_cdata.ti_jslots[i].ti_inuse--;
                    719:        if(sc->ti_cdata.ti_jslots[i].ti_inuse == 0) {
                    720:                entry = SLIST_FIRST(&sc->ti_jinuse_listhead);
                    721:                if (entry == NULL)
                    722:                        panic("ti_jfree: buffer not in use!");
                    723:                entry->slot = i;
                    724:                SLIST_REMOVE_HEAD(&sc->ti_jinuse_listhead, jpool_entries);
                    725:                SLIST_INSERT_HEAD(&sc->ti_jfree_listhead,
                    726:                                  entry, jpool_entries);
                    727:        }
                    728: }
                    729:
                    730: /*
                    731:  * Intialize a standard receive ring descriptor.
                    732:  */
                    733: int
                    734: ti_newbuf_std(struct ti_softc *sc, int i, struct mbuf *m,
                    735:     bus_dmamap_t dmamap)
                    736: {
                    737:        struct mbuf             *m_new = NULL;
                    738:        struct ti_rx_desc       *r;
                    739:
                    740:        if (dmamap == NULL) {
                    741:                /* if (m) panic() */
                    742:
                    743:                if (bus_dmamap_create(sc->sc_dmatag, MCLBYTES, 1, MCLBYTES,
                    744:                                      0, BUS_DMA_NOWAIT, &dmamap)) {
                    745:                        printf("%s: can't create recv map\n",
                    746:                               sc->sc_dv.dv_xname);
                    747:                        return (ENOMEM);
                    748:                }
                    749:        } else if (m == NULL)
                    750:                bus_dmamap_unload(sc->sc_dmatag, dmamap);
                    751:
                    752:        sc->ti_cdata.ti_rx_std_map[i] = dmamap;
                    753:
                    754:        if (m == NULL) {
                    755:                MGETHDR(m_new, M_DONTWAIT, MT_DATA);
                    756:                if (m_new == NULL)
                    757:                        return (ENOBUFS);
                    758:
                    759:                MCLGET(m_new, M_DONTWAIT);
                    760:                if (!(m_new->m_flags & M_EXT)) {
                    761:                        m_freem(m_new);
                    762:                        return (ENOBUFS);
                    763:                }
                    764:                m_new->m_len = m_new->m_pkthdr.len = MCLBYTES;
                    765:
                    766:                m_adj(m_new, ETHER_ALIGN);
                    767:
                    768:                if (bus_dmamap_load_mbuf(sc->sc_dmatag, dmamap, m_new,
                    769:                                         BUS_DMA_NOWAIT))
                    770:                        return (ENOBUFS);
                    771:
                    772:        } else {
                    773:                /*
                    774:                 * We're re-using a previously allocated mbuf;
                    775:                 * be sure to re-init pointers and lengths to
                    776:                 * default values.
                    777:                 */
                    778:                m_new = m;
                    779:                m_new->m_len = m_new->m_pkthdr.len = MCLBYTES;
                    780:                m_new->m_data = m_new->m_ext.ext_buf;
                    781:                m_adj(m_new, ETHER_ALIGN);
                    782:        }
                    783:
                    784:        sc->ti_cdata.ti_rx_std_chain[i] = m_new;
                    785:        r = &sc->ti_rdata->ti_rx_std_ring[i];
                    786:        TI_HOSTADDR(r->ti_addr) = dmamap->dm_segs[0].ds_addr;
                    787:        r->ti_type = TI_BDTYPE_RECV_BD;
                    788:        r->ti_flags = TI_BDFLAG_IP_CKSUM;
                    789:        r->ti_len = dmamap->dm_segs[0].ds_len;
                    790:        r->ti_idx = i;
                    791:
                    792:        if ((dmamap->dm_segs[0].ds_addr & ~(MCLBYTES - 1)) !=
                    793:            ((dmamap->dm_segs[0].ds_addr + dmamap->dm_segs[0].ds_len - 1) &
                    794:             ~(MCLBYTES - 1)))
                    795:            panic("%s: overwritten!!!", sc->sc_dv.dv_xname);
                    796:
                    797:        return (0);
                    798: }
                    799:
                    800: /*
                    801:  * Intialize a mini receive ring descriptor. This only applies to
                    802:  * the Tigon 2.
                    803:  */
                    804: int
                    805: ti_newbuf_mini(struct ti_softc *sc, int i, struct mbuf *m,
                    806:     bus_dmamap_t dmamap)
                    807: {
                    808:        struct mbuf             *m_new = NULL;
                    809:        struct ti_rx_desc       *r;
                    810:
                    811:        if (dmamap == NULL) {
                    812:                /* if (m) panic() */
                    813:
                    814:                if (bus_dmamap_create(sc->sc_dmatag, MHLEN, 1, MHLEN,
                    815:                                      0, BUS_DMA_NOWAIT, &dmamap)) {
                    816:                        printf("%s: can't create recv map\n",
                    817:                               sc->sc_dv.dv_xname);
                    818:                        return (ENOMEM);
                    819:                }
                    820:        } else if (m == NULL)
                    821:                bus_dmamap_unload(sc->sc_dmatag, dmamap);
                    822:
                    823:        sc->ti_cdata.ti_rx_mini_map[i] = dmamap;
                    824:
                    825:        if (m == NULL) {
                    826:                MGETHDR(m_new, M_DONTWAIT, MT_DATA);
                    827:                if (m_new == NULL)
                    828:                        return (ENOBUFS);
                    829:                m_new->m_len = m_new->m_pkthdr.len = MHLEN;
                    830:                m_adj(m_new, ETHER_ALIGN);
                    831:
                    832:                if (bus_dmamap_load_mbuf(sc->sc_dmatag, dmamap, m_new,
                    833:                                         BUS_DMA_NOWAIT))
                    834:                return (ENOBUFS);
                    835:
                    836:        } else {
                    837:                /*
                    838:                 * We're re-using a previously allocated mbuf;
                    839:                 * be sure to re-init pointers and lengths to
                    840:                 * default values.
                    841:                 */
                    842:                m_new = m;
                    843:                m_new->m_data = m_new->m_pktdat;
                    844:                m_new->m_len = m_new->m_pkthdr.len = MHLEN;
                    845:        }
                    846:
                    847:        r = &sc->ti_rdata->ti_rx_mini_ring[i];
                    848:        sc->ti_cdata.ti_rx_mini_chain[i] = m_new;
                    849:        TI_HOSTADDR(r->ti_addr) = dmamap->dm_segs[0].ds_addr;
                    850:        r->ti_type = TI_BDTYPE_RECV_BD;
                    851:        r->ti_flags = TI_BDFLAG_MINI_RING | TI_BDFLAG_IP_CKSUM;
                    852:        r->ti_len = dmamap->dm_segs[0].ds_len;
                    853:        r->ti_idx = i;
                    854:
                    855:        return (0);
                    856: }
                    857:
                    858: /*
                    859:  * Initialize a jumbo receive ring descriptor. This allocates
                    860:  * a jumbo buffer from the pool managed internally by the driver.
                    861:  */
                    862: int
                    863: ti_newbuf_jumbo(struct ti_softc *sc, int i, struct mbuf *m)
                    864: {
                    865:        struct mbuf             *m_new = NULL;
                    866:        struct ti_rx_desc       *r;
                    867:
                    868:        if (m == NULL) {
                    869:                caddr_t                 buf = NULL;
                    870:
                    871:                /* Allocate the mbuf. */
                    872:                MGETHDR(m_new, M_DONTWAIT, MT_DATA);
                    873:                if (m_new == NULL)
                    874:                        return (ENOBUFS);
                    875:
                    876:                /* Allocate the jumbo buffer */
                    877:                buf = ti_jalloc(sc);
                    878:                if (buf == NULL) {
                    879:                        m_freem(m_new);
                    880:                        return (ENOBUFS);
                    881:                }
                    882:
                    883:                /* Attach the buffer to the mbuf. */
                    884:                m_new->m_len = m_new->m_pkthdr.len = TI_JUMBO_FRAMELEN;
                    885:                MEXTADD(m_new, buf, TI_JUMBO_FRAMELEN, 0, ti_jfree, sc);
                    886:        } else {
                    887:                /*
                    888:                 * We're re-using a previously allocated mbuf;
                    889:                 * be sure to re-init pointers and lengths to
                    890:                 * default values.
                    891:                 */
                    892:                m_new = m;
                    893:                m_new->m_data = m_new->m_ext.ext_buf;
                    894:                m_new->m_ext.ext_size = TI_JUMBO_FRAMELEN;
                    895:        }
                    896:
                    897:        m_adj(m_new, ETHER_ALIGN);
                    898:        /* Set up the descriptor. */
                    899:        r = &sc->ti_rdata->ti_rx_jumbo_ring[i];
                    900:        sc->ti_cdata.ti_rx_jumbo_chain[i] = m_new;
                    901:        TI_HOSTADDR(r->ti_addr) = TI_JUMBO_DMA_ADDR(sc, m_new);
                    902:        r->ti_type = TI_BDTYPE_RECV_JUMBO_BD;
                    903:        r->ti_flags = TI_BDFLAG_JUMBO_RING | TI_BDFLAG_IP_CKSUM;
                    904:        r->ti_len = m_new->m_len;
                    905:        r->ti_idx = i;
                    906:
                    907:        return (0);
                    908: }
                    909:
                    910: /*
                    911:  * The standard receive ring has 512 entries in it. At 2K per mbuf cluster,
                    912:  * that's 1MB of memory, which is a lot. For now, we fill only the first
                    913:  * 256 ring entries and hope that our CPU is fast enough to keep up with
                    914:  * the NIC.
                    915:  */
                    916: int
                    917: ti_init_rx_ring_std(struct ti_softc *sc)
                    918: {
                    919:        int             i;
                    920:        struct ti_cmd_desc      cmd;
                    921:
                    922:        for (i = 0; i < TI_SSLOTS; i++) {
                    923:                if (ti_newbuf_std(sc, i, NULL, 0) == ENOBUFS)
                    924:                        return (ENOBUFS);
                    925:        }
                    926:
                    927:        TI_UPDATE_STDPROD(sc, i - 1);
                    928:        sc->ti_std = i - 1;
                    929:
                    930:        return (0);
                    931: }
                    932:
                    933: void
                    934: ti_free_rx_ring_std(struct ti_softc *sc)
                    935: {
                    936:        int             i;
                    937:
                    938:        for (i = 0; i < TI_STD_RX_RING_CNT; i++) {
                    939:                if (sc->ti_cdata.ti_rx_std_chain[i] != NULL) {
                    940:                        m_freem(sc->ti_cdata.ti_rx_std_chain[i]);
                    941:                        sc->ti_cdata.ti_rx_std_chain[i] = NULL;
                    942:                        bus_dmamap_destroy(sc->sc_dmatag,
                    943:                                           sc->ti_cdata.ti_rx_std_map[i]);
                    944:                        sc->ti_cdata.ti_rx_std_map[i] = 0;
                    945:                }
                    946:                bzero((char *)&sc->ti_rdata->ti_rx_std_ring[i],
                    947:                    sizeof(struct ti_rx_desc));
                    948:        }
                    949: }
                    950:
                    951: int
                    952: ti_init_rx_ring_jumbo(struct ti_softc *sc)
                    953: {
                    954:        int             i;
                    955:        struct ti_cmd_desc      cmd;
                    956:
                    957:        for (i = 0; i < TI_JUMBO_RX_RING_CNT; i++) {
                    958:                if (ti_newbuf_jumbo(sc, i, NULL) == ENOBUFS)
                    959:                        return (ENOBUFS);
                    960:        };
                    961:
                    962:        TI_UPDATE_JUMBOPROD(sc, i - 1);
                    963:        sc->ti_jumbo = i - 1;
                    964:
                    965:        return (0);
                    966: }
                    967:
                    968: void
                    969: ti_free_rx_ring_jumbo(struct ti_softc *sc)
                    970: {
                    971:        int             i;
                    972:
                    973:        for (i = 0; i < TI_JUMBO_RX_RING_CNT; i++) {
                    974:                if (sc->ti_cdata.ti_rx_jumbo_chain[i] != NULL) {
                    975:                        m_freem(sc->ti_cdata.ti_rx_jumbo_chain[i]);
                    976:                        sc->ti_cdata.ti_rx_jumbo_chain[i] = NULL;
                    977:                }
                    978:                bzero((char *)&sc->ti_rdata->ti_rx_jumbo_ring[i],
                    979:                    sizeof(struct ti_rx_desc));
                    980:        }
                    981: }
                    982:
                    983: int
                    984: ti_init_rx_ring_mini(struct ti_softc *sc)
                    985: {
                    986:        int             i;
                    987:
                    988:        for (i = 0; i < TI_MSLOTS; i++) {
                    989:                if (ti_newbuf_mini(sc, i, NULL, 0) == ENOBUFS)
                    990:                        return (ENOBUFS);
                    991:        };
                    992:
                    993:        TI_UPDATE_MINIPROD(sc, i - 1);
                    994:        sc->ti_mini = i - 1;
                    995:
                    996:        return (0);
                    997: }
                    998:
                    999: void
                   1000: ti_free_rx_ring_mini(struct ti_softc *sc)
                   1001: {
                   1002:        int             i;
                   1003:
                   1004:        for (i = 0; i < TI_MINI_RX_RING_CNT; i++) {
                   1005:                if (sc->ti_cdata.ti_rx_mini_chain[i] != NULL) {
                   1006:                        m_freem(sc->ti_cdata.ti_rx_mini_chain[i]);
                   1007:                        sc->ti_cdata.ti_rx_mini_chain[i] = NULL;
                   1008:                        bus_dmamap_destroy(sc->sc_dmatag,
                   1009:                                           sc->ti_cdata.ti_rx_mini_map[i]);
                   1010:                        sc->ti_cdata.ti_rx_mini_map[i] = 0;
                   1011:                }
                   1012:                bzero((char *)&sc->ti_rdata->ti_rx_mini_ring[i],
                   1013:                    sizeof(struct ti_rx_desc));
                   1014:        }
                   1015: }
                   1016:
                   1017: void
                   1018: ti_free_tx_ring(struct ti_softc *sc)
                   1019: {
                   1020:        int             i;
                   1021:        struct ti_txmap_entry *entry;
                   1022:
                   1023:        if (sc->ti_rdata->ti_tx_ring == NULL)
                   1024:                return;
                   1025:
                   1026:        for (i = 0; i < TI_TX_RING_CNT; i++) {
                   1027:                if (sc->ti_cdata.ti_tx_chain[i] != NULL) {
                   1028:                        m_freem(sc->ti_cdata.ti_tx_chain[i]);
                   1029:                        sc->ti_cdata.ti_tx_chain[i] = NULL;
                   1030:                        SLIST_INSERT_HEAD(&sc->ti_tx_map_listhead,
                   1031:                                            sc->ti_cdata.ti_tx_map[i], link);
                   1032:                        sc->ti_cdata.ti_tx_map[i] = 0;
                   1033:                }
                   1034:                bzero((char *)&sc->ti_rdata->ti_tx_ring[i],
                   1035:                    sizeof(struct ti_tx_desc));
                   1036:        }
                   1037:
                   1038:        while ((entry = SLIST_FIRST(&sc->ti_tx_map_listhead))) {
                   1039:                SLIST_REMOVE_HEAD(&sc->ti_tx_map_listhead, link);
                   1040:                bus_dmamap_destroy(sc->sc_dmatag, entry->dmamap);
                   1041:                free(entry, M_DEVBUF);
                   1042:        }
                   1043: }
                   1044:
                   1045: int
                   1046: ti_init_tx_ring(struct ti_softc *sc)
                   1047: {
                   1048:        int i;
                   1049:        bus_dmamap_t dmamap;
                   1050:        struct ti_txmap_entry *entry;
                   1051:
                   1052:        sc->ti_txcnt = 0;
                   1053:        sc->ti_tx_saved_considx = 0;
                   1054:        sc->ti_tx_saved_prodidx = 0;
                   1055:        CSR_WRITE_4(sc, TI_MB_SENDPROD_IDX, 0);
                   1056:
                   1057:        SLIST_INIT(&sc->ti_tx_map_listhead);
                   1058:        for (i = 0; i < TI_TX_RING_CNT; i++) {
                   1059:                if (bus_dmamap_create(sc->sc_dmatag, TI_JUMBO_FRAMELEN,
                   1060:                    TI_NTXSEG, MCLBYTES, 0, BUS_DMA_NOWAIT, &dmamap))
                   1061:                        return (ENOBUFS);
                   1062:
                   1063:                entry = malloc(sizeof(*entry), M_DEVBUF, M_NOWAIT);
                   1064:                if (!entry) {
                   1065:                        bus_dmamap_destroy(sc->sc_dmatag, dmamap);
                   1066:                        return (ENOBUFS);
                   1067:                }
                   1068:                entry->dmamap = dmamap;
                   1069:                SLIST_INSERT_HEAD(&sc->ti_tx_map_listhead, entry, link);
                   1070:        }
                   1071:
                   1072:        return (0);
                   1073: }
                   1074:
                   1075: /*
                   1076:  * The Tigon 2 firmware has a new way to add/delete multicast addresses,
                   1077:  * but we have to support the old way too so that Tigon 1 cards will
                   1078:  * work.
                   1079:  */
                   1080: void
                   1081: ti_add_mcast(struct ti_softc *sc, struct ether_addr *addr)
                   1082: {
                   1083:        struct ti_cmd_desc      cmd;
                   1084:        u_int16_t               *m;
                   1085:        u_int32_t               ext[2] = {0, 0};
                   1086:
                   1087:        m = (u_int16_t *)&addr->ether_addr_octet[0];
                   1088:
                   1089:        switch(sc->ti_hwrev) {
                   1090:        case TI_HWREV_TIGON:
                   1091:                CSR_WRITE_4(sc, TI_GCR_MAR0, htons(m[0]));
                   1092:                CSR_WRITE_4(sc, TI_GCR_MAR1, (htons(m[1]) << 16) | htons(m[2]));
                   1093:                TI_DO_CMD(TI_CMD_ADD_MCAST_ADDR, 0, 0);
                   1094:                break;
                   1095:        case TI_HWREV_TIGON_II:
                   1096:                ext[0] = htons(m[0]);
                   1097:                ext[1] = (htons(m[1]) << 16) | htons(m[2]);
                   1098:                TI_DO_CMD_EXT(TI_CMD_EXT_ADD_MCAST, 0, 0, (caddr_t)&ext, 2);
                   1099:                break;
                   1100:        default:
                   1101:                printf("%s: unknown hwrev\n", sc->sc_dv.dv_xname);
                   1102:                break;
                   1103:        }
                   1104: }
                   1105:
                   1106: void
                   1107: ti_del_mcast(struct ti_softc *sc, struct ether_addr *addr)
                   1108: {
                   1109:        struct ti_cmd_desc      cmd;
                   1110:        u_int16_t               *m;
                   1111:        u_int32_t               ext[2] = {0, 0};
                   1112:
                   1113:        m = (u_int16_t *)&addr->ether_addr_octet[0];
                   1114:
                   1115:        switch(sc->ti_hwrev) {
                   1116:        case TI_HWREV_TIGON:
                   1117:                CSR_WRITE_4(sc, TI_GCR_MAR0, htons(m[0]));
                   1118:                CSR_WRITE_4(sc, TI_GCR_MAR1, (htons(m[1]) << 16) | htons(m[2]));
                   1119:                TI_DO_CMD(TI_CMD_DEL_MCAST_ADDR, 0, 0);
                   1120:                break;
                   1121:        case TI_HWREV_TIGON_II:
                   1122:                ext[0] = htons(m[0]);
                   1123:                ext[1] = (htons(m[1]) << 16) | htons(m[2]);
                   1124:                TI_DO_CMD_EXT(TI_CMD_EXT_DEL_MCAST, 0, 0, (caddr_t)&ext, 2);
                   1125:                break;
                   1126:        default:
                   1127:                printf("%s: unknown hwrev\n", sc->sc_dv.dv_xname);
                   1128:                break;
                   1129:        }
                   1130: }
                   1131:
                   1132: /*
                   1133:  * Configure the Tigon's multicast address filter.
                   1134:  *
                   1135:  * The actual multicast table management is a bit of a pain, thanks to
                   1136:  * slight brain damage on the part of both Alteon and us. With our
                   1137:  * multicast code, we are only alerted when the multicast address table
                   1138:  * changes and at that point we only have the current list of addresses:
                   1139:  * we only know the current state, not the previous state, so we don't
                   1140:  * actually know what addresses were removed or added. The firmware has
                   1141:  * state, but we can't get our grubby mits on it, and there is no 'delete
                   1142:  * all multicast addresses' command. Hence, we have to maintain our own
                   1143:  * state so we know what addresses have been programmed into the NIC at
                   1144:  * any given time.
                   1145:  */
                   1146: void
                   1147: ti_setmulti(struct ti_softc *sc)
                   1148: {
                   1149:        struct ifnet            *ifp;
                   1150:        struct arpcom           *ac = &sc->arpcom;
                   1151:        struct ether_multi      *enm;
                   1152:        struct ether_multistep  step;
                   1153:        struct ti_cmd_desc      cmd;
                   1154:        struct ti_mc_entry      *mc;
                   1155:        u_int32_t               intrs;
                   1156:
                   1157:        ifp = &sc->arpcom.ac_if;
                   1158:
                   1159: allmulti:
                   1160:        if (ifp->if_flags & IFF_ALLMULTI) {
                   1161:                TI_DO_CMD(TI_CMD_SET_ALLMULTI, TI_CMD_CODE_ALLMULTI_ENB, 0);
                   1162:                return;
                   1163:        } else {
                   1164:                TI_DO_CMD(TI_CMD_SET_ALLMULTI, TI_CMD_CODE_ALLMULTI_DIS, 0);
                   1165:        }
                   1166:
                   1167:        /* Disable interrupts. */
                   1168:        intrs = CSR_READ_4(sc, TI_MB_HOSTINTR);
                   1169:        CSR_WRITE_4(sc, TI_MB_HOSTINTR, 1);
                   1170:
                   1171:        /* First, zot all the existing filters. */
                   1172:        while (SLIST_FIRST(&sc->ti_mc_listhead) != NULL) {
                   1173:                mc = SLIST_FIRST(&sc->ti_mc_listhead);
                   1174:                ti_del_mcast(sc, &mc->mc_addr);
                   1175:                SLIST_REMOVE_HEAD(&sc->ti_mc_listhead, mc_entries);
                   1176:                free(mc, M_DEVBUF);
                   1177:        }
                   1178:
                   1179:        /* Now program new ones. */
                   1180:        ETHER_FIRST_MULTI(step, ac, enm);
                   1181:        while (enm != NULL) {
                   1182:                if (bcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
                   1183:                        /* Re-enable interrupts. */
                   1184:                        CSR_WRITE_4(sc, TI_MB_HOSTINTR, intrs);
                   1185:
                   1186:                        ifp->if_flags |= IFF_ALLMULTI;
                   1187:                        goto allmulti;
                   1188:                }
                   1189:                mc = malloc(sizeof(struct ti_mc_entry), M_DEVBUF, M_NOWAIT);
                   1190:                if (mc == NULL)
                   1191:                        panic("ti_setmulti");
                   1192:                bcopy(enm->enm_addrlo, (char *)&mc->mc_addr, ETHER_ADDR_LEN);
                   1193:                SLIST_INSERT_HEAD(&sc->ti_mc_listhead, mc, mc_entries);
                   1194:                ti_add_mcast(sc, &mc->mc_addr);
                   1195:                ETHER_NEXT_MULTI(step, enm);
                   1196:        }
                   1197:
                   1198:        /* Re-enable interrupts. */
                   1199:        CSR_WRITE_4(sc, TI_MB_HOSTINTR, intrs);
                   1200: }
                   1201:
                   1202: /*
                   1203:  * Check to see if the BIOS has configured us for a 64 bit slot when
                   1204:  * we aren't actually in one. If we detect this condition, we can work
                   1205:  * around it on the Tigon 2 by setting a bit in the PCI state register,
                   1206:  * but for the Tigon 1 we must give up and abort the interface attach.
                   1207:  */
                   1208: int
                   1209: ti_64bitslot_war(struct ti_softc *sc)
                   1210: {
                   1211:        if (!(CSR_READ_4(sc, TI_PCI_STATE) & TI_PCISTATE_32BIT_BUS)) {
                   1212:                CSR_WRITE_4(sc, 0x600, 0);
                   1213:                CSR_WRITE_4(sc, 0x604, 0);
                   1214:                CSR_WRITE_4(sc, 0x600, 0x5555AAAA);
                   1215:                if (CSR_READ_4(sc, 0x604) == 0x5555AAAA) {
                   1216:                        if (sc->ti_hwrev == TI_HWREV_TIGON)
                   1217:                                return (EINVAL);
                   1218:                        else {
                   1219:                                TI_SETBIT(sc, TI_PCI_STATE,
                   1220:                                    TI_PCISTATE_32BIT_BUS);
                   1221:                                return (0);
                   1222:                        }
                   1223:                }
                   1224:        }
                   1225:
                   1226:        return (0);
                   1227: }
                   1228:
                   1229: /*
                   1230:  * Do endian, PCI and DMA initialization. Also check the on-board ROM
                   1231:  * self-test results.
                   1232:  */
                   1233: int
                   1234: ti_chipinit(struct ti_softc *sc)
                   1235: {
                   1236:        u_int32_t               cacheline;
                   1237:        u_int32_t               pci_writemax = 0;
                   1238:        u_int32_t               chip_rev;
                   1239:
                   1240:        /* Initialize link to down state. */
                   1241:        sc->ti_linkstat = TI_EV_CODE_LINK_DOWN;
                   1242:
                   1243:        /* Set endianness before we access any non-PCI registers. */
                   1244:        CSR_WRITE_4(sc, TI_MISC_HOST_CTL,
                   1245:            TI_MHC_LITTLEENDIAN_INIT | (TI_MHC_LITTLEENDIAN_INIT << 24));
                   1246:
                   1247:        /* Check the ROM failed bit to see if self-tests passed. */
                   1248:        if (CSR_READ_4(sc, TI_CPU_STATE) & TI_CPUSTATE_ROMFAIL) {
                   1249:                printf("%s: board self-diagnostics failed!\n",
                   1250:                    sc->sc_dv.dv_xname);
                   1251:                return (ENODEV);
                   1252:        }
                   1253:
                   1254:        /* Halt the CPU. */
                   1255:        TI_SETBIT(sc, TI_CPU_STATE, TI_CPUSTATE_HALT);
                   1256:
                   1257:        /* Figure out the hardware revision. */
                   1258:        chip_rev = CSR_READ_4(sc, TI_MISC_HOST_CTL) & TI_MHC_CHIP_REV_MASK;
                   1259:        switch(chip_rev) {
                   1260:        case TI_REV_TIGON_I:
                   1261:                sc->ti_hwrev = TI_HWREV_TIGON;
                   1262:                break;
                   1263:        case TI_REV_TIGON_II:
                   1264:                sc->ti_hwrev = TI_HWREV_TIGON_II;
                   1265:                break;
                   1266:        default:
                   1267:                printf("\n");
                   1268:                printf("%s: unsupported chip revision: %x\n",
                   1269:                    chip_rev, sc->sc_dv.dv_xname);
                   1270:                return (ENODEV);
                   1271:        }
                   1272:
                   1273:        /* Do special setup for Tigon 2. */
                   1274:        if (sc->ti_hwrev == TI_HWREV_TIGON_II) {
                   1275:                TI_SETBIT(sc, TI_CPU_CTL_B, TI_CPUSTATE_HALT);
                   1276:                TI_SETBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_SRAM_BANK_512K);
                   1277:                TI_SETBIT(sc, TI_MISC_CONF, TI_MCR_SRAM_SYNCHRONOUS);
                   1278:        }
                   1279:
                   1280:        /* Set up the PCI state register. */
                   1281:        CSR_WRITE_4(sc, TI_PCI_STATE, TI_PCI_READ_CMD|TI_PCI_WRITE_CMD);
                   1282:        if (sc->ti_hwrev == TI_HWREV_TIGON_II)
                   1283:                TI_SETBIT(sc, TI_PCI_STATE, TI_PCISTATE_USE_MEM_RD_MULT);
                   1284:
                   1285:        /* Clear the read/write max DMA parameters. */
                   1286:        TI_CLRBIT(sc, TI_PCI_STATE, (TI_PCISTATE_WRITE_MAXDMA|
                   1287:            TI_PCISTATE_READ_MAXDMA));
                   1288:
                   1289:        /* Get cache line size. */
                   1290:        cacheline = CSR_READ_4(sc, TI_PCI_BIST) & 0xFF;
                   1291:
                   1292:        /*
                   1293:         * If the system has set enabled the PCI memory write
                   1294:         * and invalidate command in the command register, set
                   1295:         * the write max parameter accordingly. This is necessary
                   1296:         * to use MWI with the Tigon 2.
                   1297:         */
                   1298:        if (CSR_READ_4(sc, TI_PCI_CMDSTAT) & PCI_COMMAND_INVALIDATE_ENABLE) {
                   1299:                switch(cacheline) {
                   1300:                case 1:
                   1301:                case 4:
                   1302:                case 8:
                   1303:                case 16:
                   1304:                case 32:
                   1305:                case 64:
                   1306:                        break;
                   1307:                default:
                   1308:                /* Disable PCI memory write and invalidate. */
                   1309:                        CSR_WRITE_4(sc, TI_PCI_CMDSTAT, CSR_READ_4(sc,
                   1310:                            TI_PCI_CMDSTAT) & ~PCI_COMMAND_INVALIDATE_ENABLE);
                   1311:                        break;
                   1312:                }
                   1313:        }
                   1314:
                   1315: #ifdef __brokenalpha__
                   1316:        /*
                   1317:         * From the Alteon sample driver:
                   1318:         * Must insure that we do not cross an 8K (bytes) boundary
                   1319:         * for DMA reads.  Our highest limit is 1K bytes.  This is a
                   1320:         * restriction on some ALPHA platforms with early revision
                   1321:         * 21174 PCI chipsets, such as the AlphaPC 164lx
                   1322:         */
                   1323:        TI_SETBIT(sc, TI_PCI_STATE, pci_writemax|TI_PCI_READMAX_1024);
                   1324: #else
                   1325:        TI_SETBIT(sc, TI_PCI_STATE, pci_writemax);
                   1326: #endif
                   1327:
                   1328:        /* This sets the min dma param all the way up (0xff). */
                   1329:        TI_SETBIT(sc, TI_PCI_STATE, TI_PCISTATE_MINDMA);
                   1330:
                   1331:        /* Configure DMA variables. */
                   1332:        CSR_WRITE_4(sc, TI_GCR_OPMODE, TI_DMA_SWAP_OPTIONS |
                   1333:            TI_OPMODE_WARN_ENB | TI_OPMODE_FATAL_ENB |
                   1334:            TI_OPMODE_DONT_FRAG_JUMBO);
                   1335:
                   1336:        /* Recommended settings from Tigon manual. */
                   1337:        CSR_WRITE_4(sc, TI_GCR_DMA_WRITECFG, TI_DMA_STATE_THRESH_8W);
                   1338:        CSR_WRITE_4(sc, TI_GCR_DMA_READCFG, TI_DMA_STATE_THRESH_8W);
                   1339:
                   1340:        if (ti_64bitslot_war(sc)) {
                   1341:                printf("%s: bios thinks we're in a 64 bit slot, "
                   1342:                    "but we aren't", sc->sc_dv.dv_xname);
                   1343:                return (EINVAL);
                   1344:        }
                   1345:
                   1346:        return (0);
                   1347: }
                   1348:
                   1349: /*
                   1350:  * Initialize the general information block and firmware, and
                   1351:  * start the CPU(s) running.
                   1352:  */
                   1353: int
                   1354: ti_gibinit(struct ti_softc *sc)
                   1355: {
                   1356:        struct ti_rcb           *rcb;
                   1357:        int                     i;
                   1358:        struct ifnet            *ifp;
                   1359:
                   1360:        ifp = &sc->arpcom.ac_if;
                   1361:
                   1362:        /* Disable interrupts for now. */
                   1363:        CSR_WRITE_4(sc, TI_MB_HOSTINTR, 1);
                   1364:
                   1365:        /*
                   1366:         * Tell the chip where to find the general information block.
                   1367:         * While this struct could go into >4GB memory, we allocate it in a
                   1368:         * single slab with the other descriptors, and those don't seem to
                   1369:         * support being located in a 64-bit region.
                   1370:         */
                   1371:        CSR_WRITE_4(sc, TI_GCR_GENINFO_HI, 0);
                   1372:        CSR_WRITE_4(sc, TI_GCR_GENINFO_LO,
                   1373:                    TI_RING_DMA_ADDR(sc, ti_info) & 0xffffffff);
                   1374:
                   1375:        /* Load the firmware into SRAM. */
                   1376:        ti_loadfw(sc);
                   1377:
                   1378:        /* Set up the contents of the general info and ring control blocks. */
                   1379:
                   1380:        /* Set up the event ring and producer pointer. */
                   1381:        rcb = &sc->ti_rdata->ti_info.ti_ev_rcb;
                   1382:
                   1383:        TI_HOSTADDR(rcb->ti_hostaddr) = TI_RING_DMA_ADDR(sc, ti_event_ring);
                   1384:        rcb->ti_flags = 0;
                   1385:        TI_HOSTADDR(sc->ti_rdata->ti_info.ti_ev_prodidx_ptr) =
                   1386:                TI_RING_DMA_ADDR(sc, ti_ev_prodidx_r);
                   1387:        sc->ti_ev_prodidx.ti_idx = 0;
                   1388:        CSR_WRITE_4(sc, TI_GCR_EVENTCONS_IDX, 0);
                   1389:        sc->ti_ev_saved_considx = 0;
                   1390:
                   1391:        /* Set up the command ring and producer mailbox. */
                   1392:        rcb = &sc->ti_rdata->ti_info.ti_cmd_rcb;
                   1393:
                   1394:        TI_HOSTADDR(rcb->ti_hostaddr) = TI_GCR_NIC_ADDR(TI_GCR_CMDRING);
                   1395:        rcb->ti_flags = 0;
                   1396:        rcb->ti_max_len = 0;
                   1397:        for (i = 0; i < TI_CMD_RING_CNT; i++) {
                   1398:                CSR_WRITE_4(sc, TI_GCR_CMDRING + (i * 4), 0);
                   1399:        }
                   1400:        CSR_WRITE_4(sc, TI_GCR_CMDCONS_IDX, 0);
                   1401:        CSR_WRITE_4(sc, TI_MB_CMDPROD_IDX, 0);
                   1402:        sc->ti_cmd_saved_prodidx = 0;
                   1403:
                   1404:        /*
                   1405:         * Assign the address of the stats refresh buffer.
                   1406:         * We re-use the current stats buffer for this to
                   1407:         * conserve memory.
                   1408:         */
                   1409:        TI_HOSTADDR(sc->ti_rdata->ti_info.ti_refresh_stats_ptr) =
                   1410:                TI_RING_DMA_ADDR(sc, ti_info.ti_stats);
                   1411:
                   1412:        /* Set up the standard receive ring. */
                   1413:        rcb = &sc->ti_rdata->ti_info.ti_std_rx_rcb;
                   1414:        TI_HOSTADDR(rcb->ti_hostaddr) =
                   1415:                TI_RING_DMA_ADDR(sc, ti_rx_std_ring);
                   1416:        rcb->ti_max_len = ETHER_MAX_LEN;
                   1417:        rcb->ti_flags = 0;
                   1418:        rcb->ti_flags |= TI_RCB_FLAG_IP_CKSUM | TI_RCB_FLAG_NO_PHDR_CKSUM;
                   1419:
                   1420:        /* Set up the jumbo receive ring. */
                   1421:        rcb = &sc->ti_rdata->ti_info.ti_jumbo_rx_rcb;
                   1422:        TI_HOSTADDR(rcb->ti_hostaddr) = TI_RING_DMA_ADDR(sc, ti_rx_jumbo_ring);
                   1423:        rcb->ti_max_len = TI_JUMBO_FRAMELEN;
                   1424:        rcb->ti_flags = 0;
                   1425:        rcb->ti_flags |= TI_RCB_FLAG_IP_CKSUM | TI_RCB_FLAG_NO_PHDR_CKSUM;
                   1426:
                   1427:        /*
                   1428:         * Set up the mini ring. Only activated on the
                   1429:         * Tigon 2 but the slot in the config block is
                   1430:         * still there on the Tigon 1.
                   1431:         */
                   1432:        rcb = &sc->ti_rdata->ti_info.ti_mini_rx_rcb;
                   1433:        TI_HOSTADDR(rcb->ti_hostaddr) = TI_RING_DMA_ADDR(sc, ti_rx_mini_ring);
                   1434:        rcb->ti_max_len = MHLEN - ETHER_ALIGN;
                   1435:        if (sc->ti_hwrev == TI_HWREV_TIGON)
                   1436:                rcb->ti_flags = TI_RCB_FLAG_RING_DISABLED;
                   1437:        else
                   1438:                rcb->ti_flags = 0;
                   1439:        rcb->ti_flags |= TI_RCB_FLAG_IP_CKSUM | TI_RCB_FLAG_NO_PHDR_CKSUM;
                   1440:
                   1441:        /*
                   1442:         * Set up the receive return ring.
                   1443:         */
                   1444:        rcb = &sc->ti_rdata->ti_info.ti_return_rcb;
                   1445:        TI_HOSTADDR(rcb->ti_hostaddr) = TI_RING_DMA_ADDR(sc,ti_rx_return_ring);
                   1446:        rcb->ti_flags = 0;
                   1447:        rcb->ti_max_len = TI_RETURN_RING_CNT;
                   1448:        TI_HOSTADDR(sc->ti_rdata->ti_info.ti_return_prodidx_ptr) =
                   1449:            TI_RING_DMA_ADDR(sc, ti_return_prodidx_r);
                   1450:
                   1451:        /*
                   1452:         * Set up the tx ring. Note: for the Tigon 2, we have the option
                   1453:         * of putting the transmit ring in the host's address space and
                   1454:         * letting the chip DMA it instead of leaving the ring in the NIC's
                   1455:         * memory and accessing it through the shared memory region. We
                   1456:         * do this for the Tigon 2, but it doesn't work on the Tigon 1,
                   1457:         * so we have to revert to the shared memory scheme if we detect
                   1458:         * a Tigon 1 chip.
                   1459:         */
                   1460:        CSR_WRITE_4(sc, TI_WINBASE, TI_TX_RING_BASE);
                   1461:        bzero((char *)sc->ti_rdata->ti_tx_ring,
                   1462:            TI_TX_RING_CNT * sizeof(struct ti_tx_desc));
                   1463:        rcb = &sc->ti_rdata->ti_info.ti_tx_rcb;
                   1464:        if (sc->ti_hwrev == TI_HWREV_TIGON)
                   1465:                rcb->ti_flags = 0;
                   1466:        else
                   1467:                rcb->ti_flags = TI_RCB_FLAG_HOST_RING;
                   1468:        rcb->ti_flags |= TI_RCB_FLAG_IP_CKSUM | TI_RCB_FLAG_NO_PHDR_CKSUM;
                   1469: #if NVLAN > 0
                   1470:        if (ifp->if_capabilities & IFCAP_VLAN_HWTAGGING)
                   1471:                rcb->ti_flags |= TI_RCB_FLAG_VLAN_ASSIST;
                   1472: #endif
                   1473:        rcb->ti_max_len = TI_TX_RING_CNT;
                   1474:        if (sc->ti_hwrev == TI_HWREV_TIGON)
                   1475:                TI_HOSTADDR(rcb->ti_hostaddr) = TI_TX_RING_BASE;
                   1476:        else
                   1477:                TI_HOSTADDR(rcb->ti_hostaddr) =
                   1478:                        TI_RING_DMA_ADDR(sc, ti_tx_ring);
                   1479:        TI_HOSTADDR(sc->ti_rdata->ti_info.ti_tx_considx_ptr) =
                   1480:                TI_RING_DMA_ADDR(sc, ti_tx_considx_r);
                   1481:
                   1482:        TI_RING_DMASYNC(sc, ti_info, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
                   1483:
                   1484:        /* Set up tuneables */
                   1485:        CSR_WRITE_4(sc, TI_GCR_RX_COAL_TICKS, (sc->ti_rx_coal_ticks / 10));
                   1486:        CSR_WRITE_4(sc, TI_GCR_TX_COAL_TICKS, sc->ti_tx_coal_ticks);
                   1487:        CSR_WRITE_4(sc, TI_GCR_STAT_TICKS, sc->ti_stat_ticks);
                   1488:        CSR_WRITE_4(sc, TI_GCR_RX_MAX_COAL_BD, sc->ti_rx_max_coal_bds);
                   1489:        CSR_WRITE_4(sc, TI_GCR_TX_MAX_COAL_BD, sc->ti_tx_max_coal_bds);
                   1490:        CSR_WRITE_4(sc, TI_GCR_TX_BUFFER_RATIO, sc->ti_tx_buf_ratio);
                   1491:
                   1492:        /* Turn interrupts on. */
                   1493:        CSR_WRITE_4(sc, TI_GCR_MASK_INTRS, 0);
                   1494:        CSR_WRITE_4(sc, TI_MB_HOSTINTR, 0);
                   1495:
                   1496:        /* Start CPU. */
                   1497:        TI_CLRBIT(sc, TI_CPU_STATE, (TI_CPUSTATE_HALT|TI_CPUSTATE_STEP));
                   1498:
                   1499:        return (0);
                   1500: }
                   1501:
                   1502: /*
                   1503:  * Probe for a Tigon chip. Check the PCI vendor and device IDs
                   1504:  * against our list and return its name if we find a match.
                   1505:  */
                   1506: int
                   1507: ti_probe(struct device *parent, void *match, void *aux)
                   1508: {
                   1509:        return (pci_matchbyid((struct pci_attach_args *)aux, ti_devices,
                   1510:            sizeof(ti_devices)/sizeof(ti_devices[0])));
                   1511: }
                   1512:
                   1513: void
                   1514: ti_attach(struct device *parent, struct device *self, void *aux)
                   1515: {
                   1516:        struct ti_softc *sc = (struct ti_softc *)self;
                   1517:        struct pci_attach_args *pa = aux;
                   1518:        pci_chipset_tag_t pc = pa->pa_pc;
                   1519:        pci_intr_handle_t ih;
                   1520:        const char *intrstr = NULL;
                   1521:        bus_size_t size;
                   1522:        bus_dma_segment_t seg;
                   1523:        int rseg;
                   1524:        struct ifnet *ifp;
                   1525:        caddr_t kva;
                   1526:
                   1527:        /*
                   1528:         * Map control/status registers.
                   1529:         */
                   1530:
                   1531:        if (pci_mapreg_map(pa, TI_PCI_LOMEM,
                   1532:            PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT, 0,
                   1533:            &sc->ti_btag, &sc->ti_bhandle, NULL, &size, 0)) {
                   1534:                printf(": can't map mem space\n");
                   1535:                return;
                   1536:        }
                   1537:
                   1538:        if (pci_intr_map(pa, &ih)) {
                   1539:                printf(": couldn't map interrupt\n");
                   1540:                goto fail_1;
                   1541:        }
                   1542:        intrstr = pci_intr_string(pc, ih);
                   1543:        sc->ti_intrhand = pci_intr_establish(pc, ih, IPL_NET, ti_intr, sc,
                   1544:            self->dv_xname);
                   1545:        if (sc->ti_intrhand == NULL) {
                   1546:                printf(": couldn't establish interrupt");
                   1547:                if (intrstr != NULL)
                   1548:                        printf(" at %s", intrstr);
                   1549:                printf("\n");
                   1550:                goto fail_1;
                   1551:        }
                   1552:
                   1553:        if (ti_chipinit(sc)) {
                   1554:                printf("%s: chip initialization failed\n", sc->sc_dv.dv_xname);
                   1555:                goto fail_2;
                   1556:        }
                   1557:
                   1558:        /* Zero out the NIC's on-board SRAM. */
                   1559:        ti_mem_set(sc, 0x2000, 0x100000 - 0x2000);
                   1560:
                   1561:        /* Init again -- zeroing memory may have clobbered some registers. */
                   1562:        if (ti_chipinit(sc)) {
                   1563:                printf("%s: chip initialization failed\n", sc->sc_dv.dv_xname);
                   1564:                goto fail_2;
                   1565:        }
                   1566:
                   1567:        /*
                   1568:         * Get station address from the EEPROM. Note: the manual states
                   1569:         * that the MAC address is at offset 0x8c, however the data is
                   1570:         * stored as two longwords (since that's how it's loaded into
                   1571:         * the NIC). This means the MAC address is actually preceded
                   1572:         * by two zero bytes. We need to skip over those.
                   1573:         */
                   1574:        if (ti_read_eeprom(sc, (caddr_t)&sc->arpcom.ac_enaddr,
                   1575:                                TI_EE_MAC_OFFSET + 2, ETHER_ADDR_LEN)) {
                   1576:                printf("%s: failed to read station address\n",
                   1577:                    sc->sc_dv.dv_xname);
                   1578:                free(sc, M_DEVBUF);
                   1579:                goto fail_2;
                   1580:        }
                   1581:
                   1582:        /*
                   1583:         * A Tigon chip was detected. Inform the world.
                   1584:         */
                   1585:        printf(": %s, address %s\n", intrstr,
                   1586:             ether_sprintf(sc->arpcom.ac_enaddr));
                   1587:
                   1588:        /* Allocate the general information block and ring buffers. */
                   1589:        sc->sc_dmatag = pa->pa_dmat;
                   1590:        if (bus_dmamem_alloc(sc->sc_dmatag, sizeof(struct ti_ring_data),
                   1591:            PAGE_SIZE, 0, &seg, 1, &rseg, BUS_DMA_NOWAIT)) {
                   1592:                printf("%s: can't alloc rx buffers\n", sc->sc_dv.dv_xname);
                   1593:                goto fail_2;
                   1594:        }
                   1595:        if (bus_dmamem_map(sc->sc_dmatag, &seg, rseg,
                   1596:            sizeof(struct ti_ring_data), &kva, BUS_DMA_NOWAIT)) {
                   1597:                printf("%s: can't map dma buffers (%d bytes)\n",
                   1598:                       sc->sc_dv.dv_xname, sizeof(struct ti_ring_data));
                   1599:                goto fail_3;
                   1600:        }
                   1601:        if (bus_dmamap_create(sc->sc_dmatag, sizeof(struct ti_ring_data), 1,
                   1602:            sizeof(struct ti_ring_data), 0, BUS_DMA_NOWAIT,
                   1603:            &sc->ti_ring_map)) {
                   1604:                printf("%s: can't create dma map\n", sc->sc_dv.dv_xname);
                   1605:                goto fail_4;
                   1606:        }
                   1607:        if (bus_dmamap_load(sc->sc_dmatag, sc->ti_ring_map, kva,
                   1608:            sizeof(struct ti_ring_data), NULL, BUS_DMA_NOWAIT)) {
                   1609:                goto fail_5;
                   1610:        }
                   1611:        sc->ti_rdata = (struct ti_ring_data *)kva;
                   1612:        bzero(sc->ti_rdata, sizeof(struct ti_ring_data));
                   1613:
                   1614:        /* Try to allocate memory for jumbo buffers. */
                   1615:        if (ti_alloc_jumbo_mem(sc)) {
                   1616:                printf("%s: jumbo buffer allocation failed\n",
                   1617:                    sc->sc_dv.dv_xname);
                   1618:                goto fail_5;
                   1619:        }
                   1620:
                   1621:        /*
                   1622:         * We really need a better way to tell a 1000baseTX card
                   1623:         * from a 1000baseSX one, since in theory there could be
                   1624:         * OEMed 1000baseTX cards from lame vendors who aren't
                   1625:         * clever enough to change the PCI ID. For the moment
                   1626:         * though, the AceNIC is the only copper card available.
                   1627:         */
                   1628:        if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_ALTEON &&
                   1629:            PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_ALTEON_ACENICT)
                   1630:                sc->ti_copper = 1;
                   1631:        /* Ok, it's not the only copper card available */
                   1632:        if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_NETGEAR &&
                   1633:            PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_NETGEAR_GA620T)
                   1634:                sc->ti_copper = 1;
                   1635:
                   1636:        /* Set default tuneable values. */
                   1637:        sc->ti_stat_ticks = 2 * TI_TICKS_PER_SEC;
                   1638:        sc->ti_rx_coal_ticks = TI_TICKS_PER_SEC / 5000;
                   1639:        sc->ti_tx_coal_ticks = TI_TICKS_PER_SEC / 500;
                   1640:        sc->ti_rx_max_coal_bds = 64;
                   1641:        sc->ti_tx_max_coal_bds = 128;
                   1642:        sc->ti_tx_buf_ratio = 21;
                   1643:
                   1644:        /* Set up ifnet structure */
                   1645:        ifp = &sc->arpcom.ac_if;
                   1646:        ifp->if_softc = sc;
                   1647:        ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
                   1648:        ifp->if_ioctl = ti_ioctl;
                   1649:        ifp->if_start = ti_start;
                   1650:        ifp->if_watchdog = ti_watchdog;
                   1651:        ifp->if_hardmtu = TI_JUMBO_FRAMELEN - ETHER_HDR_LEN;
                   1652:        IFQ_SET_MAXLEN(&ifp->if_snd, TI_TX_RING_CNT - 1);
                   1653:        IFQ_SET_READY(&ifp->if_snd);
                   1654:        bcopy(sc->sc_dv.dv_xname, ifp->if_xname, IFNAMSIZ);
                   1655:
                   1656:        ifp->if_capabilities = IFCAP_VLAN_MTU;
                   1657:
                   1658: #if NVLAN > 0
                   1659:        ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING;
                   1660: #endif
                   1661:
                   1662:        /* Set up ifmedia support. */
                   1663:        ifmedia_init(&sc->ifmedia, IFM_IMASK, ti_ifmedia_upd, ti_ifmedia_sts);
                   1664:        if (sc->ti_copper) {
                   1665:                /*
                   1666:                 * Copper cards allow manual 10/100 mode selection,
                   1667:                 * but not manual 1000baseTX mode selection. Why?
                   1668:                 * Because currently there's no way to specify the
                   1669:                 * master/slave setting through the firmware interface,
                   1670:                 * so Alteon decided to just bag it and handle it
                   1671:                 * via autonegotiation.
                   1672:                 */
                   1673:                ifmedia_add(&sc->ifmedia, IFM_ETHER|IFM_10_T, 0, NULL);
                   1674:                ifmedia_add(&sc->ifmedia,
                   1675:                    IFM_ETHER|IFM_10_T|IFM_FDX, 0, NULL);
                   1676:                ifmedia_add(&sc->ifmedia, IFM_ETHER|IFM_100_TX, 0, NULL);
                   1677:                ifmedia_add(&sc->ifmedia,
                   1678:                    IFM_ETHER|IFM_100_TX|IFM_FDX, 0, NULL);
                   1679:                ifmedia_add(&sc->ifmedia, IFM_ETHER|IFM_1000_T, 0, NULL);
                   1680:                ifmedia_add(&sc->ifmedia,
                   1681:                    IFM_ETHER|IFM_1000_T|IFM_FDX, 0, NULL);
                   1682:        } else {
                   1683:                /* Fiber cards don't support 10/100 modes. */
                   1684:                ifmedia_add(&sc->ifmedia, IFM_ETHER|IFM_1000_SX, 0, NULL);
                   1685:                ifmedia_add(&sc->ifmedia,
                   1686:                    IFM_ETHER|IFM_1000_SX|IFM_FDX, 0, NULL);
                   1687:        }
                   1688:        ifmedia_add(&sc->ifmedia, IFM_ETHER|IFM_AUTO, 0, NULL);
                   1689:        ifmedia_set(&sc->ifmedia, IFM_ETHER|IFM_AUTO);
                   1690:
                   1691:        /*
                   1692:         * Call MI attach routines.
                   1693:         */
                   1694:        if_attach(ifp);
                   1695:        ether_ifattach(ifp);
                   1696:
                   1697:        shutdownhook_establish(ti_shutdown, sc);
                   1698:        return;
                   1699:
                   1700: fail_5:
                   1701:        bus_dmamap_destroy(sc->sc_dmatag, sc->ti_ring_map);
                   1702:
                   1703: fail_4:
                   1704:        bus_dmamem_unmap(sc->sc_dmatag, kva,
                   1705:            sizeof(struct ti_ring_data));
                   1706:
                   1707: fail_3:
                   1708:        bus_dmamem_free(sc->sc_dmatag, &seg, rseg);
                   1709:
                   1710: fail_2:
                   1711:        pci_intr_disestablish(pc, sc->ti_intrhand);
                   1712:
                   1713: fail_1:
                   1714:        bus_space_unmap(sc->ti_btag, sc->ti_bhandle, size);
                   1715: }
                   1716:
                   1717: /*
                   1718:  * Frame reception handling. This is called if there's a frame
                   1719:  * on the receive return list.
                   1720:  *
                   1721:  * Note: we have to be able to handle three possibilities here:
                   1722:  * 1) the frame is from the mini receive ring (can only happen)
                   1723:  *    on Tigon 2 boards)
                   1724:  * 2) the frame is from the jumbo receive ring
                   1725:  * 3) the frame is from the standard receive ring
                   1726:  */
                   1727:
                   1728: void
                   1729: ti_rxeof(struct ti_softc *sc)
                   1730: {
                   1731:        struct ifnet            *ifp;
                   1732:        struct ti_cmd_desc      cmd;
                   1733:
                   1734:        ifp = &sc->arpcom.ac_if;
                   1735:
                   1736:        while(sc->ti_rx_saved_considx != sc->ti_return_prodidx.ti_idx) {
                   1737:                struct ti_rx_desc       *cur_rx;
                   1738:                u_int32_t               rxidx;
                   1739:                struct mbuf             *m = NULL;
                   1740:                int                     sumflags = 0;
                   1741:                bus_dmamap_t            dmamap;
                   1742:
                   1743:                cur_rx =
                   1744:                    &sc->ti_rdata->ti_rx_return_ring[sc->ti_rx_saved_considx];
                   1745:                rxidx = cur_rx->ti_idx;
                   1746:                TI_INC(sc->ti_rx_saved_considx, TI_RETURN_RING_CNT);
                   1747:
                   1748:                if (cur_rx->ti_flags & TI_BDFLAG_JUMBO_RING) {
                   1749:                        TI_INC(sc->ti_jumbo, TI_JUMBO_RX_RING_CNT);
                   1750:                        m = sc->ti_cdata.ti_rx_jumbo_chain[rxidx];
                   1751:                        sc->ti_cdata.ti_rx_jumbo_chain[rxidx] = NULL;
                   1752:                        if (cur_rx->ti_flags & TI_BDFLAG_ERROR) {
                   1753:                                ifp->if_ierrors++;
                   1754:                                ti_newbuf_jumbo(sc, sc->ti_jumbo, m);
                   1755:                                continue;
                   1756:                        }
                   1757:                        if (ti_newbuf_jumbo(sc, sc->ti_jumbo, NULL)
                   1758:                            == ENOBUFS) {
                   1759:                                struct mbuf             *m0;
                   1760:                                m0 = m_devget(mtod(m, char *) - ETHER_ALIGN,
                   1761:                                    cur_rx->ti_len + ETHER_ALIGN, 0, ifp, NULL);
                   1762:                                ti_newbuf_jumbo(sc, sc->ti_jumbo, m);
                   1763:                                if (m0 == NULL) {
                   1764:                                        ifp->if_ierrors++;
                   1765:                                        continue;
                   1766:                                }
                   1767:                                m_adj(m0, ETHER_ALIGN);
                   1768:                                m = m0;
                   1769:                        }
                   1770:                } else if (cur_rx->ti_flags & TI_BDFLAG_MINI_RING) {
                   1771:                        TI_INC(sc->ti_mini, TI_MINI_RX_RING_CNT);
                   1772:                        m = sc->ti_cdata.ti_rx_mini_chain[rxidx];
                   1773:                        sc->ti_cdata.ti_rx_mini_chain[rxidx] = NULL;
                   1774:                        dmamap = sc->ti_cdata.ti_rx_mini_map[rxidx];
                   1775:                        sc->ti_cdata.ti_rx_mini_map[rxidx] = 0;
                   1776:                        if (cur_rx->ti_flags & TI_BDFLAG_ERROR) {
                   1777:                                ifp->if_ierrors++;
                   1778:                                ti_newbuf_mini(sc, sc->ti_mini, m, dmamap);
                   1779:                                continue;
                   1780:                        }
                   1781:                        if (ti_newbuf_mini(sc, sc->ti_mini, NULL, dmamap)
                   1782:                            == ENOBUFS) {
                   1783:                                ifp->if_ierrors++;
                   1784:                                ti_newbuf_mini(sc, sc->ti_mini, m, dmamap);
                   1785:                                continue;
                   1786:                        }
                   1787:                } else {
                   1788:                        TI_INC(sc->ti_std, TI_STD_RX_RING_CNT);
                   1789:                        m = sc->ti_cdata.ti_rx_std_chain[rxidx];
                   1790:                        sc->ti_cdata.ti_rx_std_chain[rxidx] = NULL;
                   1791:                        dmamap = sc->ti_cdata.ti_rx_std_map[rxidx];
                   1792:                        sc->ti_cdata.ti_rx_std_map[rxidx] = 0;
                   1793:                        if (cur_rx->ti_flags & TI_BDFLAG_ERROR) {
                   1794:                                ifp->if_ierrors++;
                   1795:                                ti_newbuf_std(sc, sc->ti_std, m, dmamap);
                   1796:                                continue;
                   1797:                        }
                   1798:                        if (ti_newbuf_std(sc, sc->ti_std, NULL, dmamap)
                   1799:                            == ENOBUFS) {
                   1800:                                ifp->if_ierrors++;
                   1801:                                ti_newbuf_std(sc, sc->ti_std, m, dmamap);
                   1802:                                continue;
                   1803:                        }
                   1804:                }
                   1805:
                   1806:                if (m == NULL)
                   1807:                        panic("%s: couldn't get mbuf", sc->sc_dv.dv_xname);
                   1808:
                   1809:                m->m_pkthdr.len = m->m_len = cur_rx->ti_len;
                   1810:                ifp->if_ipackets++;
                   1811:                m->m_pkthdr.rcvif = ifp;
                   1812:
                   1813: #if NBPFILTER > 0
                   1814:                /*
                   1815:                 * Handle BPF listeners. Let the BPF user see the packet.
                   1816:                 */
                   1817:                if (ifp->if_bpf)
                   1818:                        bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_IN);
                   1819: #endif
                   1820:
                   1821:                if ((cur_rx->ti_ip_cksum ^ 0xffff) == 0)
                   1822:                        sumflags |= M_IPV4_CSUM_IN_OK;
                   1823:                m->m_pkthdr.csum_flags = sumflags;
                   1824:                sumflags = 0;
                   1825:
                   1826:                ether_input_mbuf(ifp, m);
                   1827:        }
                   1828:
                   1829:        /* Only necessary on the Tigon 1. */
                   1830:        if (sc->ti_hwrev == TI_HWREV_TIGON)
                   1831:                CSR_WRITE_4(sc, TI_GCR_RXRETURNCONS_IDX,
                   1832:                    sc->ti_rx_saved_considx);
                   1833:
                   1834:        TI_UPDATE_STDPROD(sc, sc->ti_std);
                   1835:        TI_UPDATE_MINIPROD(sc, sc->ti_mini);
                   1836:        TI_UPDATE_JUMBOPROD(sc, sc->ti_jumbo);
                   1837: }
                   1838:
                   1839: void
                   1840: ti_txeof_tigon1(struct ti_softc *sc)
                   1841: {
                   1842:        struct ifnet            *ifp;
                   1843:        struct ti_txmap_entry   *entry;
                   1844:        int                     active = 1;
                   1845:
                   1846:        ifp = &sc->arpcom.ac_if;
                   1847:
                   1848:        /*
                   1849:         * Go through our tx ring and free mbufs for those
                   1850:         * frames that have been sent.
                   1851:         */
                   1852:        while (sc->ti_tx_saved_considx != sc->ti_tx_considx.ti_idx) {
                   1853:                u_int32_t               idx = 0;
                   1854:                struct ti_tx_desc       txdesc;
                   1855:
                   1856:                idx = sc->ti_tx_saved_considx;
                   1857:                ti_mem_read(sc, TI_TX_RING_BASE + idx * sizeof(txdesc),
                   1858:                            sizeof(txdesc), (caddr_t)&txdesc);
                   1859:
                   1860:                if (txdesc.ti_flags & TI_BDFLAG_END)
                   1861:                        ifp->if_opackets++;
                   1862:
                   1863:                if (sc->ti_cdata.ti_tx_chain[idx] != NULL) {
                   1864:                        m_freem(sc->ti_cdata.ti_tx_chain[idx]);
                   1865:                        sc->ti_cdata.ti_tx_chain[idx] = NULL;
                   1866:
                   1867:                        entry = sc->ti_cdata.ti_tx_map[idx];
                   1868:                        bus_dmamap_sync(sc->sc_dmatag, entry->dmamap, 0,
                   1869:                            entry->dmamap->dm_mapsize, BUS_DMASYNC_POSTWRITE);
                   1870:
                   1871:                        bus_dmamap_unload(sc->sc_dmatag, entry->dmamap);
                   1872:                        SLIST_INSERT_HEAD(&sc->ti_tx_map_listhead, entry,
                   1873:                            link);
                   1874:                        sc->ti_cdata.ti_tx_map[idx] = NULL;
                   1875:
                   1876:                }
                   1877:                sc->ti_txcnt--;
                   1878:                TI_INC(sc->ti_tx_saved_considx, TI_TX_RING_CNT);
                   1879:                ifp->if_timer = 0;
                   1880:
                   1881:                active = 0;
                   1882:        }
                   1883:
                   1884:        if (!active)
                   1885:                ifp->if_flags &= ~IFF_OACTIVE;
                   1886: }
                   1887:
                   1888: void
                   1889: ti_txeof_tigon2(struct ti_softc *sc)
                   1890: {
                   1891:        struct ti_tx_desc       *cur_tx = NULL;
                   1892:        struct ifnet            *ifp;
                   1893:        struct ti_txmap_entry   *entry;
                   1894:
                   1895:        ifp = &sc->arpcom.ac_if;
                   1896:
                   1897:        /*
                   1898:         * Go through our tx ring and free mbufs for those
                   1899:         * frames that have been sent.
                   1900:         */
                   1901:        while (sc->ti_tx_saved_considx != sc->ti_tx_considx.ti_idx) {
                   1902:                u_int32_t               idx = 0;
                   1903:
                   1904:                idx = sc->ti_tx_saved_considx;
                   1905:                cur_tx = &sc->ti_rdata->ti_tx_ring[idx];
                   1906:
                   1907:                if (cur_tx->ti_flags & TI_BDFLAG_END)
                   1908:                        ifp->if_opackets++;
                   1909:                if (sc->ti_cdata.ti_tx_chain[idx] != NULL) {
                   1910:                        m_freem(sc->ti_cdata.ti_tx_chain[idx]);
                   1911:                        sc->ti_cdata.ti_tx_chain[idx] = NULL;
                   1912:
                   1913:                        entry = sc->ti_cdata.ti_tx_map[idx];
                   1914:                        bus_dmamap_sync(sc->sc_dmatag, entry->dmamap, 0,
                   1915:                            entry->dmamap->dm_mapsize, BUS_DMASYNC_POSTWRITE);
                   1916:
                   1917:                        bus_dmamap_unload(sc->sc_dmatag, entry->dmamap);
                   1918:                        SLIST_INSERT_HEAD(&sc->ti_tx_map_listhead, entry,
                   1919:                            link);
                   1920:                        sc->ti_cdata.ti_tx_map[idx] = NULL;
                   1921:
                   1922:                }
                   1923:                sc->ti_txcnt--;
                   1924:                TI_INC(sc->ti_tx_saved_considx, TI_TX_RING_CNT);
                   1925:                ifp->if_timer = 0;
                   1926:        }
                   1927:
                   1928:        if (cur_tx != NULL)
                   1929:                ifp->if_flags &= ~IFF_OACTIVE;
                   1930: }
                   1931:
                   1932: int
                   1933: ti_intr(void *xsc)
                   1934: {
                   1935:        struct ti_softc         *sc;
                   1936:        struct ifnet            *ifp;
                   1937:
                   1938:        sc = xsc;
                   1939:        ifp = &sc->arpcom.ac_if;
                   1940:
                   1941:        /* XXX checking this register is expensive. */
                   1942:        /* Make sure this is really our interrupt. */
                   1943:        if (!(CSR_READ_4(sc, TI_MISC_HOST_CTL) & TI_MHC_INTSTATE))
                   1944:                return (0);
                   1945:
                   1946:        /* Ack interrupt and stop others from occurring. */
                   1947:        CSR_WRITE_4(sc, TI_MB_HOSTINTR, 1);
                   1948:
                   1949:        if (ifp->if_flags & IFF_RUNNING) {
                   1950:                /* Check RX return ring producer/consumer */
                   1951:                ti_rxeof(sc);
                   1952:
                   1953:                /* Check TX ring producer/consumer */
                   1954:                if (sc->ti_hwrev == TI_HWREV_TIGON)
                   1955:                        ti_txeof_tigon1(sc);
                   1956:                else
                   1957:                        ti_txeof_tigon2(sc);
                   1958:        }
                   1959:
                   1960:        ti_handle_events(sc);
                   1961:
                   1962:        /* Re-enable interrupts. */
                   1963:        CSR_WRITE_4(sc, TI_MB_HOSTINTR, 0);
                   1964:
                   1965:        if (ifp->if_flags & IFF_RUNNING && !IFQ_IS_EMPTY(&ifp->if_snd))
                   1966:                ti_start(ifp);
                   1967:
                   1968:        return (1);
                   1969: }
                   1970:
                   1971: void
                   1972: ti_stats_update(struct ti_softc *sc)
                   1973: {
                   1974:        struct ifnet            *ifp;
                   1975:        struct ti_stats         *stats = &sc->ti_rdata->ti_info.ti_stats;
                   1976:
                   1977:        ifp = &sc->arpcom.ac_if;
                   1978:
                   1979:        TI_RING_DMASYNC(sc, ti_info.ti_stats, BUS_DMASYNC_POSTREAD);
                   1980:
                   1981:        ifp->if_collisions += stats->dot3StatsSingleCollisionFrames +
                   1982:                stats->dot3StatsMultipleCollisionFrames +
                   1983:                stats->dot3StatsExcessiveCollisions +
                   1984:                stats->dot3StatsLateCollisions -
                   1985:                ifp->if_collisions;
                   1986:
                   1987:        TI_RING_DMASYNC(sc, ti_info.ti_stats, BUS_DMASYNC_PREREAD);
                   1988: }
                   1989:
                   1990: /*
                   1991:  * Encapsulate an mbuf chain in the tx ring by coupling the mbuf data
                   1992:  * pointers to descriptors.
                   1993:  */
                   1994: int
                   1995: ti_encap_tigon1(struct ti_softc *sc, struct mbuf *m_head, u_int32_t *txidx)
                   1996: {
                   1997:        u_int32_t               frag, cur, cnt = 0;
                   1998:        struct ti_txmap_entry   *entry;
                   1999:        bus_dmamap_t            txmap;
                   2000:        struct ti_tx_desc       txdesc;
                   2001:        int                     i = 0;
                   2002: #if NVLAN > 0
                   2003:        struct ifvlan           *ifv = NULL;
                   2004:
                   2005:        if ((m_head->m_flags & (M_PROTO1|M_PKTHDR)) == (M_PROTO1|M_PKTHDR) &&
                   2006:            m_head->m_pkthdr.rcvif != NULL)
                   2007:                ifv = m_head->m_pkthdr.rcvif->if_softc;
                   2008: #endif
                   2009:
                   2010:        entry = SLIST_FIRST(&sc->ti_tx_map_listhead);
                   2011:        if (entry == NULL)
                   2012:                return (ENOBUFS);
                   2013:        txmap = entry->dmamap;
                   2014:
                   2015:        cur = frag = *txidx;
                   2016:
                   2017:        /*
                   2018:         * Start packing the mbufs in this chain into
                   2019:         * the fragment pointers. Stop when we run out
                   2020:         * of fragments or hit the end of the mbuf chain.
                   2021:         */
                   2022:        if (bus_dmamap_load_mbuf(sc->sc_dmatag, txmap, m_head,
                   2023:            BUS_DMA_NOWAIT))
                   2024:                return (ENOBUFS);
                   2025:
                   2026:        for (i = 0; i < txmap->dm_nsegs; i++) {
                   2027:                if (sc->ti_cdata.ti_tx_chain[frag] != NULL)
                   2028:                        break;
                   2029:
                   2030:                memset(&txdesc, 0, sizeof(txdesc));
                   2031:
                   2032:                TI_HOSTADDR(txdesc.ti_addr) = txmap->dm_segs[i].ds_addr;
                   2033:                txdesc.ti_len = txmap->dm_segs[i].ds_len & 0xffff;
                   2034:
                   2035:                txdesc.ti_flags = 0;
                   2036: #if NVLAN > 0
                   2037:                if (ifv != NULL) {
                   2038:                        txdesc.ti_flags |= TI_BDFLAG_VLAN_TAG;
                   2039:                        txdesc.ti_vlan_tag = ifv->ifv_tag;
                   2040:                }
                   2041: #endif
                   2042:
                   2043:                ti_mem_write(sc, TI_TX_RING_BASE + frag * sizeof(txdesc),
                   2044:                             sizeof(txdesc), (caddr_t)&txdesc);
                   2045:
                   2046:                /*
                   2047:                 * Sanity check: avoid coming within 16 descriptors
                   2048:                 * of the end of the ring.
                   2049:                 */
                   2050:                if ((TI_TX_RING_CNT - (sc->ti_txcnt + cnt)) < 16)
                   2051:                        return (ENOBUFS);
                   2052:                cur = frag;
                   2053:                TI_INC(frag, TI_TX_RING_CNT);
                   2054:                cnt++;
                   2055:        }
                   2056:
                   2057:        if (frag == sc->ti_tx_saved_considx)
                   2058:                return (ENOBUFS);
                   2059:
                   2060:        txdesc.ti_flags |= TI_BDFLAG_END;
                   2061:        ti_mem_write(sc, TI_TX_RING_BASE + cur * sizeof(txdesc),
                   2062:                     sizeof(txdesc), (caddr_t)&txdesc);
                   2063:
                   2064:        bus_dmamap_sync(sc->sc_dmatag, txmap, 0, txmap->dm_mapsize,
                   2065:            BUS_DMASYNC_PREWRITE);
                   2066:
                   2067:        sc->ti_cdata.ti_tx_chain[cur] = m_head;
                   2068:        SLIST_REMOVE_HEAD(&sc->ti_tx_map_listhead, link);
                   2069:        sc->ti_cdata.ti_tx_map[cur] = entry;
                   2070:        sc->ti_txcnt += cnt;
                   2071:
                   2072:        *txidx = frag;
                   2073:
                   2074:        return (0);
                   2075: }
                   2076:
                   2077: /*
                   2078:  * Encapsulate an mbuf chain in the tx ring by coupling the mbuf data
                   2079:  * pointers to descriptors.
                   2080:  */
                   2081: int
                   2082: ti_encap_tigon2(struct ti_softc *sc, struct mbuf *m_head, u_int32_t *txidx)
                   2083: {
                   2084:        struct ti_tx_desc       *f = NULL;
                   2085:        u_int32_t               frag, cur, cnt = 0;
                   2086:        struct ti_txmap_entry   *entry;
                   2087:        bus_dmamap_t            txmap;
                   2088:        int                     i = 0;
                   2089: #if NVLAN > 0
                   2090:        struct ifvlan           *ifv = NULL;
                   2091:
                   2092:        if ((m_head->m_flags & (M_PROTO1|M_PKTHDR)) == (M_PROTO1|M_PKTHDR) &&
                   2093:            m_head->m_pkthdr.rcvif != NULL)
                   2094:                ifv = m_head->m_pkthdr.rcvif->if_softc;
                   2095: #endif
                   2096:
                   2097:        entry = SLIST_FIRST(&sc->ti_tx_map_listhead);
                   2098:        if (entry == NULL)
                   2099:                return (ENOBUFS);
                   2100:        txmap = entry->dmamap;
                   2101:
                   2102:        cur = frag = *txidx;
                   2103:
                   2104:        /*
                   2105:         * Start packing the mbufs in this chain into
                   2106:         * the fragment pointers. Stop when we run out
                   2107:         * of fragments or hit the end of the mbuf chain.
                   2108:         */
                   2109:        if (bus_dmamap_load_mbuf(sc->sc_dmatag, txmap, m_head,
                   2110:            BUS_DMA_NOWAIT))
                   2111:                return (ENOBUFS);
                   2112:
                   2113:        for (i = 0; i < txmap->dm_nsegs; i++) {
                   2114:                f = &sc->ti_rdata->ti_tx_ring[frag];
                   2115:
                   2116:                if (sc->ti_cdata.ti_tx_chain[frag] != NULL)
                   2117:                        break;
                   2118:
                   2119:                TI_HOSTADDR(f->ti_addr) = txmap->dm_segs[i].ds_addr;
                   2120:                f->ti_len = txmap->dm_segs[i].ds_len & 0xffff;
                   2121:                f->ti_flags = 0;
                   2122: #if NVLAN > 0
                   2123:                if (ifv != NULL) {
                   2124:                        f->ti_flags |= TI_BDFLAG_VLAN_TAG;
                   2125:                        f->ti_vlan_tag = ifv->ifv_tag;
                   2126:                } else {
                   2127:                        f->ti_vlan_tag = 0;
                   2128:                }
                   2129: #endif
                   2130:                /*
                   2131:                 * Sanity check: avoid coming within 16 descriptors
                   2132:                 * of the end of the ring.
                   2133:                 */
                   2134:                if ((TI_TX_RING_CNT - (sc->ti_txcnt + cnt)) < 16)
                   2135:                        return(ENOBUFS);
                   2136:                cur = frag;
                   2137:                TI_INC(frag, TI_TX_RING_CNT);
                   2138:                cnt++;
                   2139:        }
                   2140:
                   2141:        if (frag == sc->ti_tx_saved_considx)
                   2142:                return(ENOBUFS);
                   2143:
                   2144:        sc->ti_rdata->ti_tx_ring[cur].ti_flags |= TI_BDFLAG_END;
                   2145:
                   2146:        bus_dmamap_sync(sc->sc_dmatag, txmap, 0, txmap->dm_mapsize,
                   2147:            BUS_DMASYNC_PREWRITE);
                   2148:
                   2149:        TI_RING_DMASYNC(sc, ti_tx_ring[cur], BUS_DMASYNC_POSTREAD);
                   2150:
                   2151:        sc->ti_cdata.ti_tx_chain[cur] = m_head;
                   2152:        SLIST_REMOVE_HEAD(&sc->ti_tx_map_listhead, link);
                   2153:        sc->ti_cdata.ti_tx_map[cur] = entry;
                   2154:        sc->ti_txcnt += cnt;
                   2155:
                   2156:        *txidx = frag;
                   2157:
                   2158:        return (0);
                   2159: }
                   2160:
                   2161: /*
                   2162:  * Main transmit routine. To avoid having to do mbuf copies, we put pointers
                   2163:  * to the mbuf data regions directly in the transmit descriptors.
                   2164:  */
                   2165: void
                   2166: ti_start(struct ifnet *ifp)
                   2167: {
                   2168:        struct ti_softc         *sc;
                   2169:        struct mbuf             *m_head = NULL;
                   2170:        u_int32_t               prodidx;
                   2171:        int                     pkts = 0, error;
                   2172:
                   2173:        sc = ifp->if_softc;
                   2174:
                   2175:        prodidx = sc->ti_tx_saved_prodidx;
                   2176:
                   2177:        while(sc->ti_cdata.ti_tx_chain[prodidx] == NULL) {
                   2178:                IFQ_POLL(&ifp->if_snd, m_head);
                   2179:                if (m_head == NULL)
                   2180:                        break;
                   2181:
                   2182:                /*
                   2183:                 * Pack the data into the transmit ring. If we
                   2184:                 * don't have room, set the OACTIVE flag and wait
                   2185:                 * for the NIC to drain the ring.
                   2186:                 */
                   2187:                if (sc->ti_hwrev == TI_HWREV_TIGON)
                   2188:                        error = ti_encap_tigon1(sc, m_head, &prodidx);
                   2189:                else
                   2190:                        error = ti_encap_tigon2(sc, m_head, &prodidx);
                   2191:
                   2192:                if (error) {
                   2193:                        ifp->if_flags |= IFF_OACTIVE;
                   2194:                        break;
                   2195:                }
                   2196:
                   2197:                /* now we are committed to transmit the packet */
                   2198:                IFQ_DEQUEUE(&ifp->if_snd, m_head);
                   2199:                pkts++;
                   2200:
                   2201:                /*
                   2202:                 * If there's a BPF listener, bounce a copy of this frame
                   2203:                 * to him.
                   2204:                 */
                   2205: #if NBPFILTER > 0
                   2206:                if (ifp->if_bpf)
                   2207:                        bpf_mtap(ifp->if_bpf, m_head, BPF_DIRECTION_OUT);
                   2208: #endif
                   2209:        }
                   2210:        if (pkts == 0)
                   2211:                return;
                   2212:
                   2213:        /* Transmit */
                   2214:        sc->ti_tx_saved_prodidx = prodidx;
                   2215:        CSR_WRITE_4(sc, TI_MB_SENDPROD_IDX, prodidx);
                   2216:
                   2217:        /*
                   2218:         * Set a timeout in case the chip goes out to lunch.
                   2219:         */
                   2220:        ifp->if_timer = 5;
                   2221: }
                   2222:
                   2223: void
                   2224: ti_init(void *xsc)
                   2225: {
                   2226:        struct ti_softc         *sc = xsc;
                   2227:         int                    s;
                   2228:
                   2229:        s = splnet();
                   2230:
                   2231:        /* Cancel pending I/O and flush buffers. */
                   2232:        ti_stop(sc);
                   2233:
                   2234:        /* Init the gen info block, ring control blocks and firmware. */
                   2235:        if (ti_gibinit(sc)) {
                   2236:                printf("%s: initialization failure\n", sc->sc_dv.dv_xname);
                   2237:                splx(s);
                   2238:                return;
                   2239:        }
                   2240:
                   2241:        splx(s);
                   2242: }
                   2243:
                   2244: void
                   2245: ti_init2(struct ti_softc *sc)
                   2246: {
                   2247:        struct ti_cmd_desc      cmd;
                   2248:        struct ifnet            *ifp;
                   2249:        u_int16_t               *m;
                   2250:        struct ifmedia          *ifm;
                   2251:        int                     tmp;
                   2252:
                   2253:        ifp = &sc->arpcom.ac_if;
                   2254:
                   2255:        /* Specify MTU and interface index. */
                   2256:        CSR_WRITE_4(sc, TI_GCR_IFINDEX, sc->sc_dv.dv_unit);
                   2257:        CSR_WRITE_4(sc, TI_GCR_IFMTU,
                   2258:                TI_JUMBO_FRAMELEN + ETHER_VLAN_ENCAP_LEN);
                   2259:        TI_DO_CMD(TI_CMD_UPDATE_GENCOM, 0, 0);
                   2260:
                   2261:        /* Load our MAC address. */
                   2262:        m = (u_int16_t *)&sc->arpcom.ac_enaddr[0];
                   2263:        CSR_WRITE_4(sc, TI_GCR_PAR0, htons(m[0]));
                   2264:        CSR_WRITE_4(sc, TI_GCR_PAR1, (htons(m[1]) << 16) | htons(m[2]));
                   2265:        TI_DO_CMD(TI_CMD_SET_MAC_ADDR, 0, 0);
                   2266:
                   2267:        /* Enable or disable promiscuous mode as needed. */
                   2268:        if (ifp->if_flags & IFF_PROMISC) {
                   2269:                TI_DO_CMD(TI_CMD_SET_PROMISC_MODE, TI_CMD_CODE_PROMISC_ENB, 0);
                   2270:        } else {
                   2271:                TI_DO_CMD(TI_CMD_SET_PROMISC_MODE, TI_CMD_CODE_PROMISC_DIS, 0);
                   2272:        }
                   2273:
                   2274:        /* Program multicast filter. */
                   2275:        ti_setmulti(sc);
                   2276:
                   2277:        /*
                   2278:         * If this is a Tigon 1, we should tell the
                   2279:         * firmware to use software packet filtering.
                   2280:         */
                   2281:        if (sc->ti_hwrev == TI_HWREV_TIGON) {
                   2282:                TI_DO_CMD(TI_CMD_FDR_FILTERING, TI_CMD_CODE_FILT_ENB, 0);
                   2283:        }
                   2284:
                   2285:        /* Init RX ring. */
                   2286:        if (ti_init_rx_ring_std(sc) == ENOBUFS)
                   2287:                panic("not enough mbufs for rx ring");
                   2288:
                   2289:        /* Init jumbo RX ring. */
                   2290:        ti_init_rx_ring_jumbo(sc);
                   2291:
                   2292:        /*
                   2293:         * If this is a Tigon 2, we can also configure the
                   2294:         * mini ring.
                   2295:         */
                   2296:        if (sc->ti_hwrev == TI_HWREV_TIGON_II)
                   2297:                ti_init_rx_ring_mini(sc);
                   2298:
                   2299:        CSR_WRITE_4(sc, TI_GCR_RXRETURNCONS_IDX, 0);
                   2300:        sc->ti_rx_saved_considx = 0;
                   2301:
                   2302:        /* Init TX ring. */
                   2303:        ti_init_tx_ring(sc);
                   2304:
                   2305:        /* Tell firmware we're alive. */
                   2306:        TI_DO_CMD(TI_CMD_HOST_STATE, TI_CMD_CODE_STACK_UP, 0);
                   2307:
                   2308:        /* Enable host interrupts. */
                   2309:        CSR_WRITE_4(sc, TI_MB_HOSTINTR, 0);
                   2310:
                   2311:        ifp->if_flags |= IFF_RUNNING;
                   2312:        ifp->if_flags &= ~IFF_OACTIVE;
                   2313:
                   2314:        /*
                   2315:         * Make sure to set media properly. We have to do this
                   2316:         * here since we have to issue commands in order to set
                   2317:         * the link negotiation and we can't issue commands until
                   2318:         * the firmware is running.
                   2319:         */
                   2320:        ifm = &sc->ifmedia;
                   2321:        tmp = ifm->ifm_media;
                   2322:        ifm->ifm_media = ifm->ifm_cur->ifm_media;
                   2323:        ti_ifmedia_upd(ifp);
                   2324:        ifm->ifm_media = tmp;
                   2325: }
                   2326:
                   2327: /*
                   2328:  * Set media options.
                   2329:  */
                   2330: int
                   2331: ti_ifmedia_upd(struct ifnet *ifp)
                   2332: {
                   2333:        struct ti_softc         *sc;
                   2334:        struct ifmedia          *ifm;
                   2335:        struct ti_cmd_desc      cmd;
                   2336:
                   2337:        sc = ifp->if_softc;
                   2338:        ifm = &sc->ifmedia;
                   2339:
                   2340:        if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
                   2341:                return(EINVAL);
                   2342:
                   2343:        switch(IFM_SUBTYPE(ifm->ifm_media)) {
                   2344:        case IFM_AUTO:
                   2345:                CSR_WRITE_4(sc, TI_GCR_GLINK, TI_GLNK_PREF|TI_GLNK_1000MB|
                   2346:                    TI_GLNK_FULL_DUPLEX|TI_GLNK_RX_FLOWCTL_Y|
                   2347:                    TI_GLNK_AUTONEGENB|TI_GLNK_ENB);
                   2348:                CSR_WRITE_4(sc, TI_GCR_LINK, TI_LNK_100MB|TI_LNK_10MB|
                   2349:                    TI_LNK_FULL_DUPLEX|TI_LNK_HALF_DUPLEX|
                   2350:                    TI_LNK_AUTONEGENB|TI_LNK_ENB);
                   2351:                TI_DO_CMD(TI_CMD_LINK_NEGOTIATION,
                   2352:                    TI_CMD_CODE_NEGOTIATE_BOTH, 0);
                   2353:                break;
                   2354:        case IFM_1000_SX:
                   2355:        case IFM_1000_T:
                   2356:                CSR_WRITE_4(sc, TI_GCR_GLINK, TI_GLNK_PREF|TI_GLNK_1000MB|
                   2357:                    TI_GLNK_RX_FLOWCTL_Y|TI_GLNK_ENB);
                   2358:                CSR_WRITE_4(sc, TI_GCR_LINK, 0);
                   2359:                if ((ifm->ifm_media & IFM_GMASK) == IFM_FDX) {
                   2360:                        TI_SETBIT(sc, TI_GCR_GLINK, TI_GLNK_FULL_DUPLEX);
                   2361:                }
                   2362:                TI_DO_CMD(TI_CMD_LINK_NEGOTIATION,
                   2363:                    TI_CMD_CODE_NEGOTIATE_GIGABIT, 0);
                   2364:                break;
                   2365:        case IFM_100_FX:
                   2366:        case IFM_10_FL:
                   2367:        case IFM_100_TX:
                   2368:        case IFM_10_T:
                   2369:                CSR_WRITE_4(sc, TI_GCR_GLINK, 0);
                   2370:                CSR_WRITE_4(sc, TI_GCR_LINK, TI_LNK_ENB|TI_LNK_PREF);
                   2371:                if (IFM_SUBTYPE(ifm->ifm_media) == IFM_100_FX ||
                   2372:                    IFM_SUBTYPE(ifm->ifm_media) == IFM_100_TX) {
                   2373:                        TI_SETBIT(sc, TI_GCR_LINK, TI_LNK_100MB);
                   2374:                } else {
                   2375:                        TI_SETBIT(sc, TI_GCR_LINK, TI_LNK_10MB);
                   2376:                }
                   2377:                if ((ifm->ifm_media & IFM_GMASK) == IFM_FDX) {
                   2378:                        TI_SETBIT(sc, TI_GCR_LINK, TI_LNK_FULL_DUPLEX);
                   2379:                } else {
                   2380:                        TI_SETBIT(sc, TI_GCR_LINK, TI_LNK_HALF_DUPLEX);
                   2381:                }
                   2382:                TI_DO_CMD(TI_CMD_LINK_NEGOTIATION,
                   2383:                    TI_CMD_CODE_NEGOTIATE_10_100, 0);
                   2384:                break;
                   2385:        }
                   2386:
                   2387:        return (0);
                   2388: }
                   2389:
                   2390: /*
                   2391:  * Report current media status.
                   2392:  */
                   2393: void
                   2394: ti_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
                   2395: {
                   2396:        struct ti_softc         *sc;
                   2397:        u_int32_t               media = 0;
                   2398:
                   2399:        sc = ifp->if_softc;
                   2400:
                   2401:        ifmr->ifm_status = IFM_AVALID;
                   2402:        ifmr->ifm_active = IFM_ETHER;
                   2403:
                   2404:        if (sc->ti_linkstat == TI_EV_CODE_LINK_DOWN) {
                   2405:                ifmr->ifm_active |= IFM_NONE;
                   2406:                return;
                   2407:        }
                   2408:
                   2409:        ifmr->ifm_status |= IFM_ACTIVE;
                   2410:
                   2411:        if (sc->ti_linkstat == TI_EV_CODE_GIG_LINK_UP) {
                   2412:                media = CSR_READ_4(sc, TI_GCR_GLINK_STAT);
                   2413:                if (sc->ti_copper)
                   2414:                        ifmr->ifm_active |= IFM_1000_T;
                   2415:                else
                   2416:                        ifmr->ifm_active |= IFM_1000_SX;
                   2417:                if (media & TI_GLNK_FULL_DUPLEX)
                   2418:                        ifmr->ifm_active |= IFM_FDX;
                   2419:                else
                   2420:                        ifmr->ifm_active |= IFM_HDX;
                   2421:        } else if (sc->ti_linkstat == TI_EV_CODE_LINK_UP) {
                   2422:                media = CSR_READ_4(sc, TI_GCR_LINK_STAT);
                   2423:                if (sc->ti_copper) {
                   2424:                        if (media & TI_LNK_100MB)
                   2425:                                ifmr->ifm_active |= IFM_100_TX;
                   2426:                        if (media & TI_LNK_10MB)
                   2427:                                ifmr->ifm_active |= IFM_10_T;
                   2428:                } else {
                   2429:                        if (media & TI_LNK_100MB)
                   2430:                                ifmr->ifm_active |= IFM_100_FX;
                   2431:                        if (media & TI_LNK_10MB)
                   2432:                                ifmr->ifm_active |= IFM_10_FL;
                   2433:                }
                   2434:                if (media & TI_LNK_FULL_DUPLEX)
                   2435:                        ifmr->ifm_active |= IFM_FDX;
                   2436:                if (media & TI_LNK_HALF_DUPLEX)
                   2437:                        ifmr->ifm_active |= IFM_HDX;
                   2438:        }
                   2439: }
                   2440:
                   2441: int
                   2442: ti_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
                   2443: {
                   2444:        struct ti_softc         *sc = ifp->if_softc;
                   2445:        struct ifreq            *ifr = (struct ifreq *)data;
                   2446:        struct ifaddr           *ifa = (struct ifaddr *)data;
                   2447:        int                     s, error = 0;
                   2448:        struct ti_cmd_desc      cmd;
                   2449:
                   2450:        s = splnet();
                   2451:
                   2452:        if ((error = ether_ioctl(ifp, &sc->arpcom, command, data)) > 0) {
                   2453:                splx(s);
                   2454:                return (error);
                   2455:        }
                   2456:
                   2457:        switch(command) {
                   2458:        case SIOCSIFADDR:
                   2459:                ifp->if_flags |= IFF_UP;
                   2460:                if ((ifp->if_flags & IFF_RUNNING) == 0)
                   2461:                        ti_init(sc);
                   2462: #ifdef INET
                   2463:                if (ifa->ifa_addr->sa_family == AF_INET)
                   2464:                        arp_ifinit(&sc->arpcom, ifa);
                   2465: #endif /* INET */
                   2466:                break;
                   2467:        case SIOCSIFMTU:
                   2468:                if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > ifp->if_hardmtu)
                   2469:                        error = EINVAL;
                   2470:                else if (ifp->if_mtu != ifr->ifr_mtu)
                   2471:                        ifp->if_mtu = ifr->ifr_mtu;
                   2472:                break;
                   2473:        case SIOCSIFFLAGS:
                   2474:                if (ifp->if_flags & IFF_UP) {
                   2475:                        /*
                   2476:                         * If only the state of the PROMISC flag changed,
                   2477:                         * then just use the 'set promisc mode' command
                   2478:                         * instead of reinitializing the entire NIC. Doing
                   2479:                         * a full re-init means reloading the firmware and
                   2480:                         * waiting for it to start up, which may take a
                   2481:                         * second or two.
                   2482:                         */
                   2483:                        if (ifp->if_flags & IFF_RUNNING &&
                   2484:                            ifp->if_flags & IFF_PROMISC &&
                   2485:                            !(sc->ti_if_flags & IFF_PROMISC)) {
                   2486:                                TI_DO_CMD(TI_CMD_SET_PROMISC_MODE,
                   2487:                                    TI_CMD_CODE_PROMISC_ENB, 0);
                   2488:                        } else if (ifp->if_flags & IFF_RUNNING &&
                   2489:                            !(ifp->if_flags & IFF_PROMISC) &&
                   2490:                            sc->ti_if_flags & IFF_PROMISC) {
                   2491:                                TI_DO_CMD(TI_CMD_SET_PROMISC_MODE,
                   2492:                                    TI_CMD_CODE_PROMISC_DIS, 0);
                   2493:                        } else {
                   2494:                                if ((ifp->if_flags & IFF_RUNNING) == 0)
                   2495:                                        ti_init(sc);
                   2496:                        }
                   2497:                } else {
                   2498:                        if (ifp->if_flags & IFF_RUNNING)
                   2499:                                ti_stop(sc);
                   2500:                }
                   2501:                sc->ti_if_flags = ifp->if_flags;
                   2502:                break;
                   2503:        case SIOCADDMULTI:
                   2504:        case SIOCDELMULTI:
                   2505:                error = (command == SIOCADDMULTI) ?
                   2506:                    ether_addmulti(ifr, &sc->arpcom) :
                   2507:                    ether_delmulti(ifr, &sc->arpcom);
                   2508:
                   2509:                if (error == ENETRESET) {
                   2510:                        if (ifp->if_flags & IFF_RUNNING)
                   2511:                                ti_setmulti(sc);
                   2512:                        error = 0;
                   2513:                }
                   2514:                break;
                   2515:        case SIOCSIFMEDIA:
                   2516:        case SIOCGIFMEDIA:
                   2517:                error = ifmedia_ioctl(ifp, ifr, &sc->ifmedia, command);
                   2518:                break;
                   2519:        default:
                   2520:                error = ENOTTY;
                   2521:                break;
                   2522:        }
                   2523:
                   2524:        splx(s);
                   2525:        return (error);
                   2526: }
                   2527:
                   2528: void
                   2529: ti_watchdog(struct ifnet *ifp)
                   2530: {
                   2531:        struct ti_softc         *sc;
                   2532:
                   2533:        sc = ifp->if_softc;
                   2534:
                   2535:        printf("%s: watchdog timeout -- resetting\n", sc->sc_dv.dv_xname);
                   2536:        ti_stop(sc);
                   2537:        ti_init(sc);
                   2538:
                   2539:        ifp->if_oerrors++;
                   2540: }
                   2541:
                   2542: /*
                   2543:  * Stop the adapter and free any mbufs allocated to the
                   2544:  * RX and TX lists.
                   2545:  */
                   2546: void
                   2547: ti_stop(struct ti_softc *sc)
                   2548: {
                   2549:        struct ifnet            *ifp;
                   2550:        struct ti_cmd_desc      cmd;
                   2551:
                   2552:        ifp = &sc->arpcom.ac_if;
                   2553:
                   2554:        ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
                   2555:
                   2556:        /* Disable host interrupts. */
                   2557:        CSR_WRITE_4(sc, TI_MB_HOSTINTR, 1);
                   2558:        /*
                   2559:         * Tell firmware we're shutting down.
                   2560:         */
                   2561:        TI_DO_CMD(TI_CMD_HOST_STATE, TI_CMD_CODE_STACK_DOWN, 0);
                   2562:
                   2563:        /* Halt and reinitialize. */
                   2564:        ti_chipinit(sc);
                   2565:        ti_mem_set(sc, 0x2000, 0x100000 - 0x2000);
                   2566:        ti_chipinit(sc);
                   2567:
                   2568:        /* Free the RX lists. */
                   2569:        ti_free_rx_ring_std(sc);
                   2570:
                   2571:        /* Free jumbo RX list. */
                   2572:        ti_free_rx_ring_jumbo(sc);
                   2573:
                   2574:        /* Free mini RX list. */
                   2575:        ti_free_rx_ring_mini(sc);
                   2576:
                   2577:        /* Free TX buffers. */
                   2578:        ti_free_tx_ring(sc);
                   2579:
                   2580:        sc->ti_ev_prodidx.ti_idx = 0;
                   2581:        sc->ti_return_prodidx.ti_idx = 0;
                   2582:        sc->ti_tx_considx.ti_idx = 0;
                   2583:        sc->ti_tx_saved_considx = TI_TXCONS_UNSET;
                   2584: }
                   2585:
                   2586: /*
                   2587:  * Stop all chip I/O so that the kernel's probe routines don't
                   2588:  * get confused by errant DMAs when rebooting.
                   2589:  */
                   2590: void
                   2591: ti_shutdown(void *xsc)
                   2592: {
                   2593:        struct ti_softc         *sc;
                   2594:
                   2595:        sc = xsc;
                   2596:
                   2597:        ti_chipinit(sc);
                   2598: }

CVSweb