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

Annotation of sys/dev/ic/fxp.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: fxp.c,v 1.87 2007/06/06 09:43:44 henning Exp $        */
                      2: /*     $NetBSD: if_fxp.c,v 1.2 1997/06/05 02:01:55 thorpej Exp $       */
                      3:
                      4: /*
                      5:  * Copyright (c) 1995, David Greenman
                      6:  * All rights reserved.
                      7:  *
                      8:  * Modifications to support NetBSD:
                      9:  * Copyright (c) 1997 Jason R. Thorpe.  All rights reserved.
                     10:  *
                     11:  * Redistribution and use in source and binary forms, with or without
                     12:  * modification, are permitted provided that the following conditions
                     13:  * are met:
                     14:  * 1. Redistributions of source code must retain the above copyright
                     15:  *    notice unmodified, this list of conditions, and the following
                     16:  *    disclaimer.
                     17:  * 2. Redistributions in binary form must reproduce the above copyright
                     18:  *    notice, this list of conditions and the following disclaimer in the
                     19:  *    documentation and/or other materials provided with the distribution.
                     20:  *
                     21:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
                     22:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     23:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     24:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
                     25:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     26:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     27:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     28:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     29:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     30:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     31:  * SUCH DAMAGE.
                     32:  *
                     33:  *     Id: if_fxp.c,v 1.55 1998/08/04 08:53:12 dg Exp
                     34:  */
                     35:
                     36: /*
                     37:  * Intel EtherExpress Pro/100B PCI Fast Ethernet driver
                     38:  */
                     39:
                     40: #include "bpfilter.h"
                     41:
                     42: #include <sys/param.h>
                     43: #include <sys/systm.h>
                     44: #include <sys/mbuf.h>
                     45: #include <sys/malloc.h>
                     46: #include <sys/kernel.h>
                     47: #include <sys/socket.h>
                     48: #include <sys/syslog.h>
                     49: #include <sys/timeout.h>
                     50:
                     51: #include <net/if.h>
                     52: #include <net/if_dl.h>
                     53: #include <net/if_media.h>
                     54: #include <net/if_types.h>
                     55:
                     56: #ifdef INET
                     57: #include <netinet/in.h>
                     58: #include <netinet/in_systm.h>
                     59: #include <netinet/in_var.h>
                     60: #include <netinet/ip.h>
                     61: #endif
                     62:
                     63: #if NBPFILTER > 0
                     64: #include <net/bpf.h>
                     65: #endif
                     66:
                     67: #include <sys/ioctl.h>
                     68: #include <sys/errno.h>
                     69: #include <sys/device.h>
                     70:
                     71: #include <netinet/if_ether.h>
                     72:
                     73: #include <machine/cpu.h>
                     74: #include <machine/bus.h>
                     75: #include <machine/intr.h>
                     76:
                     77: #include <dev/mii/miivar.h>
                     78:
                     79: #include <dev/ic/fxpreg.h>
                     80: #include <dev/ic/fxpvar.h>
                     81:
                     82: /*
                     83:  * NOTE!  On the Alpha, we have an alignment constraint.  The
                     84:  * card DMAs the packet immediately following the RFA.  However,
                     85:  * the first thing in the packet is a 14-byte Ethernet header.
                     86:  * This means that the packet is misaligned.  To compensate,
                     87:  * we actually offset the RFA 2 bytes into the cluster.  This
                     88:  * aligns the packet after the Ethernet header at a 32-bit
                     89:  * boundary.  HOWEVER!  This means that the RFA is misaligned!
                     90:  */
                     91: #define        RFA_ALIGNMENT_FUDGE     (2 + sizeof(bus_dmamap_t *))
                     92:
                     93: /*
                     94:  * Inline function to copy a 16-bit aligned 32-bit quantity.
                     95:  */
                     96: static __inline void fxp_lwcopy(volatile u_int32_t *,
                     97:        volatile u_int32_t *);
                     98:
                     99: static __inline void
                    100: fxp_lwcopy(volatile u_int32_t *src, volatile u_int32_t *dst)
                    101: {
                    102:        volatile u_int16_t *a = (u_int16_t *)src;
                    103:        volatile u_int16_t *b = (u_int16_t *)dst;
                    104:
                    105:        b[0] = a[0];
                    106:        b[1] = a[1];
                    107: }
                    108:
                    109: /*
                    110:  * Template for default configuration parameters.
                    111:  * See struct fxp_cb_config for the bit definitions.
                    112:  * Note, cb_command is filled in later.
                    113:  */
                    114: static u_char fxp_cb_config_template[] = {
                    115:        0x0, 0x0,               /* cb_status */
                    116:        0x0, 0x0,               /* cb_command */
                    117:        0xff, 0xff, 0xff, 0xff, /* link_addr */
                    118:        0x16,   /*  0 Byte count. */
                    119:        0x08,   /*  1 Fifo limit */
                    120:        0x00,   /*  2 Adaptive ifs */
                    121:        0x00,   /*  3 ctrl0 */
                    122:        0x00,   /*  4 rx_dma_bytecount */
                    123:        0x80,   /*  5 tx_dma_bytecount */
                    124:        0xb2,   /*  6 ctrl 1*/
                    125:        0x03,   /*  7 ctrl 2*/
                    126:        0x01,   /*  8 mediatype */
                    127:        0x00,   /*  9 void2 */
                    128:        0x26,   /* 10 ctrl3 */
                    129:        0x00,   /* 11 linear priority */
                    130:        0x60,   /* 12 interfrm_spacing */
                    131:        0x00,   /* 13 void31 */
                    132:        0xf2,   /* 14 void32 */
                    133:        0x48,   /* 15 promiscuous */
                    134:        0x00,   /* 16 void41 */
                    135:        0x40,   /* 17 void42 */
                    136:        0xf3,   /* 18 stripping */
                    137:        0x00,   /* 19 fdx_pin */
                    138:        0x3f,   /* 20 multi_ia */
                    139:        0x05    /* 21 mc_all */
                    140: };
                    141:
                    142: void fxp_eeprom_shiftin(struct fxp_softc *, int, int);
                    143: void fxp_eeprom_putword(struct fxp_softc *, int, u_int16_t);
                    144: void fxp_write_eeprom(struct fxp_softc *, u_short *, int, int);
                    145: int fxp_mediachange(struct ifnet *);
                    146: void fxp_mediastatus(struct ifnet *, struct ifmediareq *);
                    147: void fxp_scb_wait(struct fxp_softc *);
                    148: void fxp_start(struct ifnet *);
                    149: int fxp_ioctl(struct ifnet *, u_long, caddr_t);
                    150: void fxp_init(void *);
                    151: void fxp_load_ucode(struct fxp_softc *);
                    152: void fxp_stop(struct fxp_softc *, int);
                    153: void fxp_watchdog(struct ifnet *);
                    154: int fxp_add_rfabuf(struct fxp_softc *, struct mbuf *);
                    155: int fxp_mdi_read(struct device *, int, int);
                    156: void fxp_mdi_write(struct device *, int, int, int);
                    157: void fxp_autosize_eeprom(struct fxp_softc *);
                    158: void fxp_statchg(struct device *);
                    159: void fxp_read_eeprom(struct fxp_softc *, u_int16_t *,
                    160:                                    int, int);
                    161: void fxp_stats_update(void *);
                    162: void fxp_mc_setup(struct fxp_softc *, int);
                    163: void fxp_scb_cmd(struct fxp_softc *, u_int8_t);
                    164:
                    165: /*
                    166:  * Set initial transmit threshold at 64 (512 bytes). This is
                    167:  * increased by 64 (512 bytes) at a time, to maximum of 192
                    168:  * (1536 bytes), if an underrun occurs.
                    169:  */
                    170: static int tx_threshold = 64;
                    171:
                    172: /*
                    173:  * Interrupts coalescing code params
                    174:  */
                    175: int fxp_int_delay = FXP_INT_DELAY;
                    176: int fxp_bundle_max = FXP_BUNDLE_MAX;
                    177: int fxp_min_size_mask = FXP_MIN_SIZE_MASK;
                    178:
                    179: /*
                    180:  * TxCB list index mask. This is used to do list wrap-around.
                    181:  */
                    182: #define FXP_TXCB_MASK  (FXP_NTXCB - 1)
                    183:
                    184: /*
                    185:  * Maximum number of seconds that the receiver can be idle before we
                    186:  * assume it's dead and attempt to reset it by reprogramming the
                    187:  * multicast filter. This is part of a work-around for a bug in the
                    188:  * NIC. See fxp_stats_update().
                    189:  */
                    190: #define FXP_MAX_RX_IDLE        15
                    191:
                    192: /*
                    193:  * Wait for the previous command to be accepted (but not necessarily
                    194:  * completed).
                    195:  */
                    196: void
                    197: fxp_scb_wait(struct fxp_softc *sc)
                    198: {
                    199:        int i = 10000;
                    200:
                    201:        while (CSR_READ_1(sc, FXP_CSR_SCB_COMMAND) && --i)
                    202:                DELAY(2);
                    203:        if (i == 0)
                    204:                printf("%s: warning: SCB timed out\n", sc->sc_dev.dv_xname);
                    205: }
                    206:
                    207: void
                    208: fxp_eeprom_shiftin(struct fxp_softc *sc, int data, int length)
                    209: {
                    210:        u_int16_t reg;
                    211:        int x;
                    212:
                    213:        /*
                    214:         * Shift in data.
                    215:         */
                    216:        for (x = 1 << (length - 1); x; x >>= 1) {
                    217:                if (data & x)
                    218:                        reg = FXP_EEPROM_EECS | FXP_EEPROM_EEDI;
                    219:                else
                    220:                        reg = FXP_EEPROM_EECS;
                    221:                CSR_WRITE_2(sc, FXP_CSR_EEPROMCONTROL, reg);
                    222:                DELAY(1);
                    223:                CSR_WRITE_2(sc, FXP_CSR_EEPROMCONTROL, reg | FXP_EEPROM_EESK);
                    224:                DELAY(1);
                    225:                CSR_WRITE_2(sc, FXP_CSR_EEPROMCONTROL, reg);
                    226:                DELAY(1);
                    227:        }
                    228: }
                    229:
                    230: void
                    231: fxp_eeprom_putword(struct fxp_softc *sc, int offset, u_int16_t data)
                    232: {
                    233:        int i;
                    234:
                    235:        /*
                    236:         * Erase/write enable.
                    237:         */
                    238:        CSR_WRITE_2(sc, FXP_CSR_EEPROMCONTROL, FXP_EEPROM_EECS);
                    239:        fxp_eeprom_shiftin(sc, 0x4, 3);
                    240:        fxp_eeprom_shiftin(sc, 0x03 << (sc->eeprom_size - 2), sc->eeprom_size);
                    241:        CSR_WRITE_2(sc, FXP_CSR_EEPROMCONTROL, 0);
                    242:        DELAY(1);
                    243:        /*
                    244:         * Shift in write opcode, address, data.
                    245:         */
                    246:        CSR_WRITE_2(sc, FXP_CSR_EEPROMCONTROL, FXP_EEPROM_EECS);
                    247:        fxp_eeprom_shiftin(sc, FXP_EEPROM_OPC_WRITE, 3);
                    248:        fxp_eeprom_shiftin(sc, offset, sc->eeprom_size);
                    249:        fxp_eeprom_shiftin(sc, data, 16);
                    250:        CSR_WRITE_2(sc, FXP_CSR_EEPROMCONTROL, 0);
                    251:        DELAY(1);
                    252:        /*
                    253:         * Wait for EEPROM to finish up.
                    254:         */
                    255:        CSR_WRITE_2(sc, FXP_CSR_EEPROMCONTROL, FXP_EEPROM_EECS);
                    256:        DELAY(1);
                    257:        for (i = 0; i < 1000; i++) {
                    258:                if (CSR_READ_2(sc, FXP_CSR_EEPROMCONTROL) & FXP_EEPROM_EEDO)
                    259:                        break;
                    260:                DELAY(50);
                    261:        }
                    262:        CSR_WRITE_2(sc, FXP_CSR_EEPROMCONTROL, 0);
                    263:        DELAY(1);
                    264:        /*
                    265:         * Erase/write disable.
                    266:         */
                    267:        CSR_WRITE_2(sc, FXP_CSR_EEPROMCONTROL, FXP_EEPROM_EECS);
                    268:        fxp_eeprom_shiftin(sc, 0x4, 3);
                    269:        fxp_eeprom_shiftin(sc, 0, sc->eeprom_size);
                    270:        CSR_WRITE_2(sc, FXP_CSR_EEPROMCONTROL, 0);
                    271:        DELAY(1);
                    272: }
                    273:
                    274: void
                    275: fxp_write_eeprom(struct fxp_softc *sc, u_short *data, int offset, int words)
                    276: {
                    277:        int i;
                    278:
                    279:        for (i = 0; i < words; i++)
                    280:                fxp_eeprom_putword(sc, offset + i, data[i]);
                    281: }
                    282:
                    283: /*************************************************************
                    284:  * Operating system-specific autoconfiguration glue
                    285:  *************************************************************/
                    286:
                    287: void   fxp_shutdown(void *);
                    288: void   fxp_power(int, void *);
                    289:
                    290: struct cfdriver fxp_cd = {
                    291:        NULL, "fxp", DV_IFNET
                    292: };
                    293:
                    294: /*
                    295:  * Device shutdown routine. Called at system shutdown after sync. The
                    296:  * main purpose of this routine is to shut off receiver DMA so that
                    297:  * kernel memory doesn't get clobbered during warmboot.
                    298:  */
                    299: void
                    300: fxp_shutdown(void *sc)
                    301: {
                    302:        fxp_stop((struct fxp_softc *) sc, 0);
                    303: }
                    304:
                    305: /*
                    306:  * Power handler routine. Called when the system is transitioning
                    307:  * into/out of power save modes.  As with fxp_shutdown, the main
                    308:  * purpose of this routine is to shut off receiver DMA so it doesn't
                    309:  * clobber kernel memory at the wrong time.
                    310:  */
                    311: void
                    312: fxp_power(int why, void *arg)
                    313: {
                    314:        struct fxp_softc *sc = arg;
                    315:        struct ifnet *ifp;
                    316:        int s;
                    317:
                    318:        s = splnet();
                    319:        if (why != PWR_RESUME)
                    320:                fxp_stop(sc, 0);
                    321:        else {
                    322:                ifp = &sc->sc_arpcom.ac_if;
                    323:                if (ifp->if_flags & IFF_UP)
                    324:                        fxp_init(sc);
                    325:        }
                    326:        splx(s);
                    327: }
                    328:
                    329: /*************************************************************
                    330:  * End of operating system-specific autoconfiguration glue
                    331:  *************************************************************/
                    332:
                    333: /*
                    334:  * Do generic parts of attach.
                    335:  */
                    336: int
                    337: fxp_attach(struct fxp_softc *sc, const char *intrstr)
                    338: {
                    339:        struct ifnet *ifp;
                    340:        struct mbuf *m;
                    341:        bus_dmamap_t rxmap;
                    342:        u_int16_t data;
                    343:        u_int8_t enaddr[6];
                    344:        int i, err;
                    345:
                    346:        /*
                    347:         * Reset to a stable state.
                    348:         */
                    349:        CSR_WRITE_4(sc, FXP_CSR_PORT, FXP_PORT_SOFTWARE_RESET);
                    350:        DELAY(10);
                    351:
                    352:        if (bus_dmamem_alloc(sc->sc_dmat, sizeof(struct fxp_ctrl),
                    353:            PAGE_SIZE, 0, &sc->sc_cb_seg, 1, &sc->sc_cb_nseg, BUS_DMA_NOWAIT))
                    354:                goto fail;
                    355:        if (bus_dmamem_map(sc->sc_dmat, &sc->sc_cb_seg, sc->sc_cb_nseg,
                    356:            sizeof(struct fxp_ctrl), (caddr_t *)&sc->sc_ctrl,
                    357:            BUS_DMA_NOWAIT)) {
                    358:                bus_dmamem_free(sc->sc_dmat, &sc->sc_cb_seg, sc->sc_cb_nseg);
                    359:                goto fail;
                    360:        }
                    361:        if (bus_dmamap_create(sc->sc_dmat, sizeof(struct fxp_ctrl),
                    362:            1, sizeof(struct fxp_ctrl), 0, BUS_DMA_NOWAIT,
                    363:            &sc->tx_cb_map)) {
                    364:                bus_dmamem_unmap(sc->sc_dmat, (caddr_t)sc->sc_ctrl,
                    365:                    sizeof(struct fxp_ctrl));
                    366:                bus_dmamem_free(sc->sc_dmat, &sc->sc_cb_seg, sc->sc_cb_nseg);
                    367:                goto fail;
                    368:        }
                    369:        if (bus_dmamap_load(sc->sc_dmat, sc->tx_cb_map, (caddr_t)sc->sc_ctrl,
                    370:            sizeof(struct fxp_ctrl), NULL, BUS_DMA_NOWAIT)) {
                    371:                bus_dmamap_destroy(sc->sc_dmat, sc->tx_cb_map);
                    372:                bus_dmamem_unmap(sc->sc_dmat, (caddr_t)sc->sc_ctrl,
                    373:                    sizeof(struct fxp_ctrl));
                    374:                bus_dmamem_free(sc->sc_dmat, &sc->sc_cb_seg, sc->sc_cb_nseg);
                    375:                goto fail;
                    376:        }
                    377:
                    378:        for (i = 0; i < FXP_NTXCB; i++) {
                    379:                if ((err = bus_dmamap_create(sc->sc_dmat, MCLBYTES,
                    380:                    FXP_NTXSEG, MCLBYTES, 0, 0, &sc->txs[i].tx_map)) != 0) {
                    381:                        printf("%s: unable to create tx dma map %d, error %d\n",
                    382:                            sc->sc_dev.dv_xname, i, err);
                    383:                        goto fail;
                    384:                }
                    385:                sc->txs[i].tx_mbuf = NULL;
                    386:                sc->txs[i].tx_cb = sc->sc_ctrl->tx_cb + i;
                    387:                sc->txs[i].tx_off = offsetof(struct fxp_ctrl, tx_cb[i]);
                    388:                sc->txs[i].tx_next = &sc->txs[(i + 1) & FXP_TXCB_MASK];
                    389:        }
                    390:        bzero(sc->sc_ctrl, sizeof(struct fxp_ctrl));
                    391:
                    392:        /*
                    393:         * Pre-allocate some receive buffers.
                    394:         */
                    395:        sc->sc_rxfree = 0;
                    396:        for (i = 0; i < FXP_NRFABUFS_MIN; i++) {
                    397:                if ((err = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1,
                    398:                    MCLBYTES, 0, 0, &sc->sc_rxmaps[i])) != 0) {
                    399:                        printf("%s: unable to create rx dma map %d, error %d\n",
                    400:                            sc->sc_dev.dv_xname, i, err);
                    401:                        goto fail;
                    402:                }
                    403:                sc->rx_bufs++;
                    404:        }
                    405:        for (i = 0; i < FXP_NRFABUFS_MIN; i++)
                    406:                if (fxp_add_rfabuf(sc, NULL) != 0)
                    407:                        goto fail;
                    408:
                    409:        /*
                    410:         * Find out how large of an SEEPROM we have.
                    411:         */
                    412:        fxp_autosize_eeprom(sc);
                    413:
                    414:        /*
                    415:         * Get info about the primary PHY
                    416:         */
                    417:        fxp_read_eeprom(sc, (u_int16_t *)&data, 6, 1);
                    418:        sc->phy_primary_addr = data & 0xff;
                    419:        sc->phy_primary_device = (data >> 8) & 0x3f;
                    420:        sc->phy_10Mbps_only = data >> 15;
                    421:
                    422:        /*
                    423:         * Only 82558 and newer cards can do this.
                    424:         */
                    425:        if (sc->sc_revision >= FXP_REV_82558_A4) {
                    426:                sc->sc_int_delay = fxp_int_delay;
                    427:                sc->sc_bundle_max = fxp_bundle_max;
                    428:                sc->sc_min_size_mask = fxp_min_size_mask;
                    429:        }
                    430:        /*
                    431:         * Read MAC address.
                    432:         */
                    433:        fxp_read_eeprom(sc, (u_int16_t *)enaddr, 0, 3);
                    434:
                    435:        ifp = &sc->sc_arpcom.ac_if;
                    436:        bcopy(enaddr, sc->sc_arpcom.ac_enaddr, ETHER_ADDR_LEN);
                    437:        bcopy(sc->sc_dev.dv_xname, ifp->if_xname, IFNAMSIZ);
                    438:        ifp->if_softc = sc;
                    439:        ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
                    440:        ifp->if_ioctl = fxp_ioctl;
                    441:        ifp->if_start = fxp_start;
                    442:        ifp->if_watchdog = fxp_watchdog;
                    443:        IFQ_SET_MAXLEN(&ifp->if_snd, FXP_NTXCB - 1);
                    444:        IFQ_SET_READY(&ifp->if_snd);
                    445:
                    446:        ifp->if_capabilities = IFCAP_VLAN_MTU;
                    447:
                    448:        printf(": %s, address %s\n", intrstr,
                    449:            ether_sprintf(sc->sc_arpcom.ac_enaddr));
                    450:
                    451:        if (sc->sc_flags & FXPF_DISABLE_STANDBY) {
                    452:                fxp_read_eeprom(sc, &data, 10, 1);
                    453:                if (data & 0x02) {                      /* STB enable */
                    454:                        u_int16_t cksum;
                    455:                        int i;
                    456:
                    457:                        printf("%s: Disabling dynamic standby mode in EEPROM",
                    458:                            sc->sc_dev.dv_xname);
                    459:                        data &= ~0x02;
                    460:                        fxp_write_eeprom(sc, &data, 10, 1);
                    461:                        printf(", New ID 0x%x", data);
                    462:                        cksum = 0;
                    463:                        for (i = 0; i < (1 << sc->eeprom_size) - 1; i++) {
                    464:                                fxp_read_eeprom(sc, &data, i, 1);
                    465:                                cksum += data;
                    466:                        }
                    467:                        i = (1 << sc->eeprom_size) - 1;
                    468:                        cksum = 0xBABA - cksum;
                    469:                        fxp_read_eeprom(sc, &data, i, 1);
                    470:                        fxp_write_eeprom(sc, &cksum, i, 1);
                    471:                        printf(", cksum @ 0x%x: 0x%x -> 0x%x\n",
                    472:                            i, data, cksum);
                    473:                }
                    474:        }
                    475:
                    476:        /* Receiver lock-up workaround detection. */
                    477:        fxp_read_eeprom(sc, &data, 3, 1);
                    478:        if ((data & 0x03) != 0x03)
                    479:                sc->sc_flags |= FXPF_RECV_WORKAROUND;
                    480:
                    481:        /*
                    482:         * Initialize our media structures and probe the MII.
                    483:         */
                    484:        sc->sc_mii.mii_ifp = ifp;
                    485:        sc->sc_mii.mii_readreg = fxp_mdi_read;
                    486:        sc->sc_mii.mii_writereg = fxp_mdi_write;
                    487:        sc->sc_mii.mii_statchg = fxp_statchg;
                    488:        ifmedia_init(&sc->sc_mii.mii_media, 0, fxp_mediachange,
                    489:            fxp_mediastatus);
                    490:        mii_attach(&sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
                    491:            MII_OFFSET_ANY, MIIF_NOISOLATE);
                    492:        /* If no phy found, just use auto mode */
                    493:        if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) {
                    494:                ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER|IFM_MANUAL,
                    495:                    0, NULL);
                    496:                printf("%s: no phy found, using manual mode\n",
                    497:                    sc->sc_dev.dv_xname);
                    498:        }
                    499:
                    500:        if (ifmedia_match(&sc->sc_mii.mii_media, IFM_ETHER|IFM_MANUAL, 0))
                    501:                ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_MANUAL);
                    502:        else if (ifmedia_match(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO, 0))
                    503:                ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO);
                    504:        else
                    505:                ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_10_T);
                    506:
                    507:        /*
                    508:         * Attach the interface.
                    509:         */
                    510:        if_attach(ifp);
                    511:        ether_ifattach(ifp);
                    512:
                    513:        /*
                    514:         * Add shutdown hook so that DMA is disabled prior to reboot. Not
                    515:         * doing so could allow DMA to corrupt kernel memory during the
                    516:         * reboot before the driver initializes.
                    517:         */
                    518:        sc->sc_sdhook = shutdownhook_establish(fxp_shutdown, sc);
                    519:
                    520:        /*
                    521:         * Add suspend hook, for similiar reasons..
                    522:         */
                    523:        sc->sc_powerhook = powerhook_establish(fxp_power, sc);
                    524:
                    525:        /*
                    526:         * Initialize timeout for statistics update.
                    527:         */
                    528:        timeout_set(&sc->stats_update_to, fxp_stats_update, sc);
                    529:
                    530:        return (0);
                    531:
                    532:  fail:
                    533:        printf("%s: Failed to malloc memory\n", sc->sc_dev.dv_xname);
                    534:        if (sc->tx_cb_map != NULL) {
                    535:                bus_dmamap_unload(sc->sc_dmat, sc->tx_cb_map);
                    536:                bus_dmamap_destroy(sc->sc_dmat, sc->tx_cb_map);
                    537:                bus_dmamem_unmap(sc->sc_dmat, (caddr_t)sc->sc_ctrl,
                    538:                    sizeof(struct fxp_cb_tx) * FXP_NTXCB);
                    539:                bus_dmamem_free(sc->sc_dmat, &sc->sc_cb_seg, sc->sc_cb_nseg);
                    540:        }
                    541:        m = sc->rfa_headm;
                    542:        while (m != NULL) {
                    543:                rxmap = *((bus_dmamap_t *)m->m_ext.ext_buf);
                    544:                bus_dmamap_unload(sc->sc_dmat, rxmap);
                    545:                FXP_RXMAP_PUT(sc, rxmap);
                    546:                m = m_free(m);
                    547:        }
                    548:        return (ENOMEM);
                    549: }
                    550:
                    551: /*
                    552:  * From NetBSD:
                    553:  *
                    554:  * Figure out EEPROM size.
                    555:  *
                    556:  * 559's can have either 64-word or 256-word EEPROMs, the 558
                    557:  * datasheet only talks about 64-word EEPROMs, and the 557 datasheet
                    558:  * talks about the existence of 16 to 256 word EEPROMs.
                    559:  *
                    560:  * The only known sizes are 64 and 256, where the 256 version is used
                    561:  * by CardBus cards to store CIS information.
                    562:  *
                    563:  * The address is shifted in msb-to-lsb, and after the last
                    564:  * address-bit the EEPROM is supposed to output a `dummy zero' bit,
                    565:  * after which follows the actual data. We try to detect this zero, by
                    566:  * probing the data-out bit in the EEPROM control register just after
                    567:  * having shifted in a bit. If the bit is zero, we assume we've
                    568:  * shifted enough address bits. The data-out should be tri-state,
                    569:  * before this, which should translate to a logical one.
                    570:  *
                    571:  * Other ways to do this would be to try to read a register with known
                    572:  * contents with a varying number of address bits, but no such
                    573:  * register seem to be available. The high bits of register 10 are 01
                    574:  * on the 558 and 559, but apparently not on the 557.
                    575:  *
                    576:  * The Linux driver computes a checksum on the EEPROM data, but the
                    577:  * value of this checksum is not very well documented.
                    578:  */
                    579: void
                    580: fxp_autosize_eeprom(struct fxp_softc *sc)
                    581: {
                    582:        u_int16_t reg;
                    583:        int x;
                    584:
                    585:        CSR_WRITE_2(sc, FXP_CSR_EEPROMCONTROL, FXP_EEPROM_EECS);
                    586:        /*
                    587:         * Shift in read opcode.
                    588:         */
                    589:        for (x = 3; x > 0; x--) {
                    590:                if (FXP_EEPROM_OPC_READ & (1 << (x - 1))) {
                    591:                        reg = FXP_EEPROM_EECS | FXP_EEPROM_EEDI;
                    592:                } else {
                    593:                        reg = FXP_EEPROM_EECS;
                    594:                }
                    595:                CSR_WRITE_2(sc, FXP_CSR_EEPROMCONTROL, reg);
                    596:                CSR_WRITE_2(sc, FXP_CSR_EEPROMCONTROL,
                    597:                    reg | FXP_EEPROM_EESK);
                    598:                DELAY(4);
                    599:                CSR_WRITE_2(sc, FXP_CSR_EEPROMCONTROL, reg);
                    600:                DELAY(4);
                    601:        }
                    602:        /*
                    603:         * Shift in address.
                    604:         * Wait for the dummy zero following a correct address shift.
                    605:         */
                    606:        for (x = 1; x <= 8; x++) {
                    607:                CSR_WRITE_2(sc, FXP_CSR_EEPROMCONTROL, FXP_EEPROM_EECS);
                    608:                CSR_WRITE_2(sc, FXP_CSR_EEPROMCONTROL,
                    609:                        FXP_EEPROM_EECS | FXP_EEPROM_EESK);
                    610:                DELAY(4);
                    611:                if ((CSR_READ_2(sc, FXP_CSR_EEPROMCONTROL) & FXP_EEPROM_EEDO) == 0)
                    612:                        break;
                    613:                CSR_WRITE_2(sc, FXP_CSR_EEPROMCONTROL, FXP_EEPROM_EECS);
                    614:                DELAY(4);
                    615:        }
                    616:        CSR_WRITE_2(sc, FXP_CSR_EEPROMCONTROL, 0);
                    617:        DELAY(4);
                    618:        sc->eeprom_size = x;
                    619: }
                    620:
                    621: /*
                    622:  * Read from the serial EEPROM. Basically, you manually shift in
                    623:  * the read opcode (one bit at a time) and then shift in the address,
                    624:  * and then you shift out the data (all of this one bit at a time).
                    625:  * The word size is 16 bits, so you have to provide the address for
                    626:  * every 16 bits of data.
                    627:  */
                    628: void
                    629: fxp_read_eeprom(struct fxp_softc *sc, u_short *data, int offset,
                    630:     int words)
                    631: {
                    632:        u_int16_t reg;
                    633:        int i, x;
                    634:
                    635:        for (i = 0; i < words; i++) {
                    636:                CSR_WRITE_2(sc, FXP_CSR_EEPROMCONTROL, FXP_EEPROM_EECS);
                    637:                /*
                    638:                 * Shift in read opcode.
                    639:                 */
                    640:                for (x = 3; x > 0; x--) {
                    641:                        if (FXP_EEPROM_OPC_READ & (1 << (x - 1))) {
                    642:                                reg = FXP_EEPROM_EECS | FXP_EEPROM_EEDI;
                    643:                        } else {
                    644:                                reg = FXP_EEPROM_EECS;
                    645:                        }
                    646:                        CSR_WRITE_2(sc, FXP_CSR_EEPROMCONTROL, reg);
                    647:                        CSR_WRITE_2(sc, FXP_CSR_EEPROMCONTROL,
                    648:                            reg | FXP_EEPROM_EESK);
                    649:                        DELAY(4);
                    650:                        CSR_WRITE_2(sc, FXP_CSR_EEPROMCONTROL, reg);
                    651:                        DELAY(4);
                    652:                }
                    653:                /*
                    654:                 * Shift in address.
                    655:                 */
                    656:                for (x = sc->eeprom_size; x > 0; x--) {
                    657:                        if ((i + offset) & (1 << (x - 1))) {
                    658:                                reg = FXP_EEPROM_EECS | FXP_EEPROM_EEDI;
                    659:                        } else {
                    660:                                reg = FXP_EEPROM_EECS;
                    661:                        }
                    662:                        CSR_WRITE_2(sc, FXP_CSR_EEPROMCONTROL, reg);
                    663:                        CSR_WRITE_2(sc, FXP_CSR_EEPROMCONTROL,
                    664:                            reg | FXP_EEPROM_EESK);
                    665:                        DELAY(4);
                    666:                        CSR_WRITE_2(sc, FXP_CSR_EEPROMCONTROL, reg);
                    667:                        DELAY(4);
                    668:                }
                    669:                reg = FXP_EEPROM_EECS;
                    670:                data[i] = 0;
                    671:                /*
                    672:                 * Shift out data.
                    673:                 */
                    674:                for (x = 16; x > 0; x--) {
                    675:                        CSR_WRITE_2(sc, FXP_CSR_EEPROMCONTROL,
                    676:                            reg | FXP_EEPROM_EESK);
                    677:                        DELAY(4);
                    678:                        if (CSR_READ_2(sc, FXP_CSR_EEPROMCONTROL) &
                    679:                            FXP_EEPROM_EEDO)
                    680:                                data[i] |= (1 << (x - 1));
                    681:                        CSR_WRITE_2(sc, FXP_CSR_EEPROMCONTROL, reg);
                    682:                        DELAY(4);
                    683:                }
                    684:                data[i] = letoh16(data[i]);
                    685:                CSR_WRITE_2(sc, FXP_CSR_EEPROMCONTROL, 0);
                    686:                DELAY(4);
                    687:        }
                    688: }
                    689:
                    690: /*
                    691:  * Start packet transmission on the interface.
                    692:  */
                    693: void
                    694: fxp_start(struct ifnet *ifp)
                    695: {
                    696:        struct fxp_softc *sc = ifp->if_softc;
                    697:        struct fxp_txsw *txs = sc->sc_cbt_prod;
                    698:        struct fxp_cb_tx *txc;
                    699:        struct mbuf *m0, *m = NULL;
                    700:        int cnt = sc->sc_cbt_cnt, seg;
                    701:
                    702:        if ((ifp->if_flags & (IFF_OACTIVE | IFF_RUNNING)) != IFF_RUNNING)
                    703:                return;
                    704:
                    705:        while (1) {
                    706:                if (cnt >= (FXP_NTXCB - 2)) {
                    707:                        ifp->if_flags |= IFF_OACTIVE;
                    708:                        break;
                    709:                }
                    710:
                    711:                txs = txs->tx_next;
                    712:
                    713:                IFQ_POLL(&ifp->if_snd, m0);
                    714:                if (m0 == NULL)
                    715:                        break;
                    716:
                    717:                if (bus_dmamap_load_mbuf(sc->sc_dmat, txs->tx_map,
                    718:                    m0, BUS_DMA_NOWAIT) != 0) {
                    719:                        MGETHDR(m, M_DONTWAIT, MT_DATA);
                    720:                        if (m == NULL)
                    721:                                break;
                    722:                        if (m0->m_pkthdr.len > MHLEN) {
                    723:                                MCLGET(m, M_DONTWAIT);
                    724:                                if (!(m->m_flags & M_EXT)) {
                    725:                                        m_freem(m);
                    726:                                        break;
                    727:                                }
                    728:                        }
                    729:                        m_copydata(m0, 0, m0->m_pkthdr.len, mtod(m, caddr_t));
                    730:                        m->m_pkthdr.len = m->m_len = m0->m_pkthdr.len;
                    731:                        if (bus_dmamap_load_mbuf(sc->sc_dmat, txs->tx_map,
                    732:                            m, BUS_DMA_NOWAIT) != 0) {
                    733:                                m_freem(m);
                    734:                                break;
                    735:                        }
                    736:                }
                    737:
                    738:                IFQ_DEQUEUE(&ifp->if_snd, m0);
                    739:                if (m != NULL) {
                    740:                        m_freem(m0);
                    741:                        m0 = m;
                    742:                        m = NULL;
                    743:                }
                    744:
                    745:                txs->tx_mbuf = m0;
                    746:
                    747: #if NBPFILTER > 0
                    748:                if (ifp->if_bpf)
                    749:                        bpf_mtap(ifp->if_bpf, m0, BPF_DIRECTION_OUT);
                    750: #endif
                    751:
                    752:                FXP_MBUF_SYNC(sc, txs->tx_map, BUS_DMASYNC_PREWRITE);
                    753:
                    754:                txc = txs->tx_cb;
                    755:                txc->tbd_number = txs->tx_map->dm_nsegs;
                    756:                txc->cb_status = 0;
                    757:                txc->cb_command = htole16(FXP_CB_COMMAND_XMIT | FXP_CB_COMMAND_SF);
                    758:                txc->tx_threshold = tx_threshold;
                    759:                for (seg = 0; seg < txs->tx_map->dm_nsegs; seg++) {
                    760:                        txc->tbd[seg].tb_addr =
                    761:                            htole32(txs->tx_map->dm_segs[seg].ds_addr);
                    762:                        txc->tbd[seg].tb_size =
                    763:                            htole32(txs->tx_map->dm_segs[seg].ds_len);
                    764:                }
                    765:                FXP_TXCB_SYNC(sc, txs,
                    766:                    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
                    767:
                    768:                ++cnt;
                    769:                sc->sc_cbt_prod = txs;
                    770:        }
                    771:
                    772:        if (cnt != sc->sc_cbt_cnt) {
                    773:                /* We enqueued at least one. */
                    774:                ifp->if_timer = 5;
                    775:
                    776:                txs = sc->sc_cbt_prod;
                    777:                txs = txs->tx_next;
                    778:                sc->sc_cbt_prod = txs;
                    779:                txs->tx_cb->cb_command =
                    780:                    htole16(FXP_CB_COMMAND_I | FXP_CB_COMMAND_NOP | FXP_CB_COMMAND_S);
                    781:                FXP_TXCB_SYNC(sc, txs,
                    782:                    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
                    783:
                    784:                FXP_TXCB_SYNC(sc, sc->sc_cbt_prev,
                    785:                    BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
                    786:                sc->sc_cbt_prev->tx_cb->cb_command &=
                    787:                    htole16(~(FXP_CB_COMMAND_S | FXP_CB_COMMAND_I));
                    788:                FXP_TXCB_SYNC(sc, sc->sc_cbt_prev,
                    789:                    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
                    790:
                    791:                sc->sc_cbt_prev = txs;
                    792:
                    793:                fxp_scb_wait(sc);
                    794:                fxp_scb_cmd(sc, FXP_SCB_COMMAND_CU_RESUME);
                    795:
                    796:                sc->sc_cbt_cnt = cnt + 1;
                    797:        }
                    798: }
                    799:
                    800: /*
                    801:  * Process interface interrupts.
                    802:  */
                    803: int
                    804: fxp_intr(void *arg)
                    805: {
                    806:        struct fxp_softc *sc = arg;
                    807:        struct ifnet *ifp = &sc->sc_arpcom.ac_if;
                    808:        u_int8_t statack;
                    809:        bus_dmamap_t rxmap;
                    810:        int claimed = 0;
                    811:        int rnr = 0;
                    812:
                    813:        /*
                    814:         * If the interface isn't running, don't try to
                    815:         * service the interrupt.. just ack it and bail.
                    816:         */
                    817:        if ((ifp->if_flags & IFF_RUNNING) == 0) {
                    818:                statack = CSR_READ_1(sc, FXP_CSR_SCB_STATACK);
                    819:                if (statack) {
                    820:                        claimed = 1;
                    821:                        CSR_WRITE_1(sc, FXP_CSR_SCB_STATACK, statack);
                    822:                }
                    823:                return claimed;
                    824:        }
                    825:
                    826:        while ((statack = CSR_READ_1(sc, FXP_CSR_SCB_STATACK)) != 0) {
                    827:                claimed = 1;
                    828:                rnr = (statack & (FXP_SCB_STATACK_RNR |
                    829:                                  FXP_SCB_STATACK_SWI)) ? 1 : 0;
                    830:                /*
                    831:                 * First ACK all the interrupts in this pass.
                    832:                 */
                    833:                CSR_WRITE_1(sc, FXP_CSR_SCB_STATACK, statack);
                    834:
                    835:                /*
                    836:                 * Free any finished transmit mbuf chains.
                    837:                 */
                    838:                if (statack & (FXP_SCB_STATACK_CXTNO|FXP_SCB_STATACK_CNA)) {
                    839:                        int txcnt = sc->sc_cbt_cnt;
                    840:                        struct fxp_txsw *txs = sc->sc_cbt_cons;
                    841:
                    842:                        FXP_TXCB_SYNC(sc, txs,
                    843:                            BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
                    844:
                    845:                        while ((txcnt > 0) &&
                    846:                           ((txs->tx_cb->cb_status & htole16(FXP_CB_STATUS_C)) ||
                    847:                           (txs->tx_cb->cb_command & htole16(FXP_CB_COMMAND_NOP)))) {
                    848:                                if (txs->tx_mbuf != NULL) {
                    849:                                        FXP_MBUF_SYNC(sc, txs->tx_map,
                    850:                                            BUS_DMASYNC_POSTWRITE);
                    851:                                        bus_dmamap_unload(sc->sc_dmat,
                    852:                                            txs->tx_map);
                    853:                                        m_freem(txs->tx_mbuf);
                    854:                                        txs->tx_mbuf = NULL;
                    855:                                }
                    856:                                --txcnt;
                    857:                                txs = txs->tx_next;
                    858:                                FXP_TXCB_SYNC(sc, txs,
                    859:                                    BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
                    860:                        }
                    861:                        sc->sc_cbt_cons = txs;
                    862:                        sc->sc_cbt_cnt = txcnt;
                    863:                        ifp->if_timer = 0;
                    864:                        ifp->if_flags &= ~IFF_OACTIVE;
                    865:
                    866:                        if (!IFQ_IS_EMPTY(&ifp->if_snd)) {
                    867:                                /*
                    868:                                 * Try to start more packets transmitting.
                    869:                                 */
                    870:                                fxp_start(ifp);
                    871:                        }
                    872:                }
                    873:                /*
                    874:                 * Process receiver interrupts. If a Receive Unit
                    875:                 * not ready (RNR) condition exists, get whatever
                    876:                 * packets we can and re-start the receiver.
                    877:                 */
                    878:                if (statack & (FXP_SCB_STATACK_FR | FXP_SCB_STATACK_RNR |
                    879:                               FXP_SCB_STATACK_SWI)) {
                    880:                        struct mbuf *m;
                    881:                        u_int8_t *rfap;
                    882: rcvloop:
                    883:                        m = sc->rfa_headm;
                    884:                        rfap = m->m_ext.ext_buf + RFA_ALIGNMENT_FUDGE;
                    885:                        rxmap = *((bus_dmamap_t *)m->m_ext.ext_buf);
                    886:                        bus_dmamap_sync(sc->sc_dmat, rxmap,
                    887:                            0, MCLBYTES, BUS_DMASYNC_POSTREAD |
                    888:                            BUS_DMASYNC_POSTWRITE);
                    889:
                    890:                        if (*(u_int16_t *)(rfap +
                    891:                            offsetof(struct fxp_rfa, rfa_status)) &
                    892:                            htole16(FXP_RFA_STATUS_C)) {
                    893:                                if (*(u_int16_t *)(rfap +
                    894:                                    offsetof(struct fxp_rfa, rfa_status)) &
                    895:                                    htole16(FXP_RFA_STATUS_RNR))
                    896:                                        rnr = 1;
                    897:
                    898:                                /*
                    899:                                 * Remove first packet from the chain.
                    900:                                 */
                    901:                                sc->rfa_headm = m->m_next;
                    902:                                m->m_next = NULL;
                    903:
                    904:                                /*
                    905:                                 * Add a new buffer to the receive chain.
                    906:                                 * If this fails, the old buffer is recycled
                    907:                                 * instead.
                    908:                                 */
                    909:                                if (fxp_add_rfabuf(sc, m) == 0) {
                    910:                                        u_int16_t total_len;
                    911:
                    912:                                        total_len = htole16(*(u_int16_t *)(rfap +
                    913:                                            offsetof(struct fxp_rfa,
                    914:                                            actual_size))) &
                    915:                                            (MCLBYTES - 1);
                    916:                                        if (total_len <
                    917:                                            sizeof(struct ether_header)) {
                    918:                                                m_freem(m);
                    919:                                                goto rcvloop;
                    920:                                        }
                    921:                                        if (*(u_int16_t *)(rfap +
                    922:                                            offsetof(struct fxp_rfa,
                    923:                                            rfa_status)) &
                    924:                                            htole16(FXP_RFA_STATUS_CRC)) {
                    925:                                                m_freem(m);
                    926:                                                goto rcvloop;
                    927:                                        }
                    928:
                    929:                                        m->m_pkthdr.rcvif = ifp;
                    930:                                        m->m_pkthdr.len = m->m_len =
                    931:                                            total_len;
                    932: #if NBPFILTER > 0
                    933:                                        if (ifp->if_bpf)
                    934:                                                bpf_mtap(ifp->if_bpf, m,
                    935:                                                    BPF_DIRECTION_IN);
                    936: #endif /* NBPFILTER > 0 */
                    937:                                        ether_input_mbuf(ifp, m);
                    938:                                }
                    939:                                goto rcvloop;
                    940:                        }
                    941:                }
                    942:                if (rnr) {
                    943:                        rxmap = *((bus_dmamap_t *)
                    944:                            sc->rfa_headm->m_ext.ext_buf);
                    945:                        fxp_scb_wait(sc);
                    946:                        CSR_WRITE_4(sc, FXP_CSR_SCB_GENERAL,
                    947:                                    rxmap->dm_segs[0].ds_addr +
                    948:                                    RFA_ALIGNMENT_FUDGE);
                    949:                        fxp_scb_cmd(sc, FXP_SCB_COMMAND_RU_START);
                    950:
                    951:                }
                    952:        }
                    953:        return (claimed);
                    954: }
                    955:
                    956: /*
                    957:  * Update packet in/out/collision statistics. The i82557 doesn't
                    958:  * allow you to access these counters without doing a fairly
                    959:  * expensive DMA to get _all_ of the statistics it maintains, so
                    960:  * we do this operation here only once per second. The statistics
                    961:  * counters in the kernel are updated from the previous dump-stats
                    962:  * DMA and then a new dump-stats DMA is started. The on-chip
                    963:  * counters are zeroed when the DMA completes. If we can't start
                    964:  * the DMA immediately, we don't wait - we just prepare to read
                    965:  * them again next time.
                    966:  */
                    967: void
                    968: fxp_stats_update(void *arg)
                    969: {
                    970:        struct fxp_softc *sc = arg;
                    971:        struct ifnet *ifp = &sc->sc_arpcom.ac_if;
                    972:        struct fxp_stats *sp = &sc->sc_ctrl->stats;
                    973:        int s;
                    974:
                    975:        FXP_STATS_SYNC(sc, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
                    976:        ifp->if_opackets += letoh32(sp->tx_good);
                    977:        ifp->if_collisions += letoh32(sp->tx_total_collisions);
                    978:        if (sp->rx_good) {
                    979:                ifp->if_ipackets += letoh32(sp->rx_good);
                    980:                sc->rx_idle_secs = 0;
                    981:        } else if (sc->sc_flags & FXPF_RECV_WORKAROUND)
                    982:                sc->rx_idle_secs++;
                    983:        ifp->if_ierrors +=
                    984:            letoh32(sp->rx_crc_errors) +
                    985:            letoh32(sp->rx_alignment_errors) +
                    986:            letoh32(sp->rx_rnr_errors) +
                    987:            letoh32(sp->rx_overrun_errors);
                    988:        /*
                    989:         * If any transmit underruns occurred, bump up the transmit
                    990:         * threshold by another 512 bytes (64 * 8).
                    991:         */
                    992:        if (sp->tx_underruns) {
                    993:                ifp->if_oerrors += letoh32(sp->tx_underruns);
                    994:                if (tx_threshold < 192)
                    995:                        tx_threshold += 64;
                    996:        }
                    997:        s = splnet();
                    998:        /*
                    999:         * If we haven't received any packets in FXP_MAX_RX_IDLE seconds,
                   1000:         * then assume the receiver has locked up and attempt to clear
                   1001:         * the condition by reprogramming the multicast filter. This is
                   1002:         * a work-around for a bug in the 82557 where the receiver locks
                   1003:         * up if it gets certain types of garbage in the synchronization
                   1004:         * bits prior to the packet header. This bug is supposed to only
                   1005:         * occur in 10Mbps mode, but has been seen to occur in 100Mbps
                   1006:         * mode as well (perhaps due to a 10/100 speed transition).
                   1007:         */
                   1008:        if (sc->rx_idle_secs > FXP_MAX_RX_IDLE) {
                   1009:                sc->rx_idle_secs = 0;
                   1010:                fxp_init(sc);
                   1011:                splx(s);
                   1012:                return;
                   1013:        }
                   1014:        /*
                   1015:         * If there is no pending command, start another stats
                   1016:         * dump. Otherwise punt for now.
                   1017:         */
                   1018:        FXP_STATS_SYNC(sc, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
                   1019:        if (CSR_READ_1(sc, FXP_CSR_SCB_COMMAND) == 0) {
                   1020:                /*
                   1021:                 * Start another stats dump.
                   1022:                 */
                   1023:                fxp_scb_cmd(sc, FXP_SCB_COMMAND_CU_DUMPRESET);
                   1024:        } else {
                   1025:                /*
                   1026:                 * A previous command is still waiting to be accepted.
                   1027:                 * Just zero our copy of the stats and wait for the
                   1028:                 * next timer event to update them.
                   1029:                 */
                   1030:                sp->tx_good = 0;
                   1031:                sp->tx_underruns = 0;
                   1032:                sp->tx_total_collisions = 0;
                   1033:
                   1034:                sp->rx_good = 0;
                   1035:                sp->rx_crc_errors = 0;
                   1036:                sp->rx_alignment_errors = 0;
                   1037:                sp->rx_rnr_errors = 0;
                   1038:                sp->rx_overrun_errors = 0;
                   1039:        }
                   1040:
                   1041:        /* Tick the MII clock. */
                   1042:        mii_tick(&sc->sc_mii);
                   1043:
                   1044:        splx(s);
                   1045:        /*
                   1046:         * Schedule another timeout one second from now.
                   1047:         */
                   1048:        timeout_add(&sc->stats_update_to, hz);
                   1049: }
                   1050:
                   1051: /*
                   1052:  * Stop the interface. Cancels the statistics updater and resets
                   1053:  * the interface.
                   1054:  */
                   1055: void
                   1056: fxp_stop(struct fxp_softc *sc, int drain)
                   1057: {
                   1058:        struct ifnet *ifp = &sc->sc_arpcom.ac_if;
                   1059:        int i;
                   1060:
                   1061:        /*
                   1062:         * Turn down interface (done early to avoid bad interactions
                   1063:         * between panics, shutdown hooks, and the watchdog timer)
                   1064:         */
                   1065:        ifp->if_timer = 0;
                   1066:        ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
                   1067:
                   1068:        /*
                   1069:         * Cancel stats updater.
                   1070:         */
                   1071:        timeout_del(&sc->stats_update_to);
                   1072:        mii_down(&sc->sc_mii);
                   1073:
                   1074:        /*
                   1075:         * Issue software reset.
                   1076:         */
                   1077:        CSR_WRITE_4(sc, FXP_CSR_PORT, FXP_PORT_SELECTIVE_RESET);
                   1078:        DELAY(10);
                   1079:
                   1080:        /*
                   1081:         * Release any xmit buffers.
                   1082:         */
                   1083:        for (i = 0; i < FXP_NTXCB; i++) {
                   1084:                if (sc->txs[i].tx_mbuf != NULL) {
                   1085:                        bus_dmamap_unload(sc->sc_dmat, sc->txs[i].tx_map);
                   1086:                        m_freem(sc->txs[i].tx_mbuf);
                   1087:                        sc->txs[i].tx_mbuf = NULL;
                   1088:                }
                   1089:        }
                   1090:        sc->sc_cbt_cnt = 0;
                   1091:
                   1092:        if (drain) {
                   1093:                bus_dmamap_t rxmap;
                   1094:                struct mbuf *m;
                   1095:
                   1096:                /*
                   1097:                 * Free all the receive buffers then reallocate/reinitialize
                   1098:                 */
                   1099:                m = sc->rfa_headm;
                   1100:                while (m != NULL) {
                   1101:                        rxmap = *((bus_dmamap_t *)m->m_ext.ext_buf);
                   1102:                        bus_dmamap_unload(sc->sc_dmat, rxmap);
                   1103:                        FXP_RXMAP_PUT(sc, rxmap);
                   1104:                        m = m_free(m);
                   1105:                        sc->rx_bufs--;
                   1106:                }
                   1107:                sc->rfa_headm = NULL;
                   1108:                sc->rfa_tailm = NULL;
                   1109:                for (i = 0; i < FXP_NRFABUFS_MIN; i++) {
                   1110:                        if (fxp_add_rfabuf(sc, NULL) != 0) {
                   1111:                                /*
                   1112:                                 * This "can't happen" - we're at splnet()
                   1113:                                 * and we just freed all the buffers we need
                   1114:                                 * above.
                   1115:                                 */
                   1116:                                panic("fxp_stop: no buffers!");
                   1117:                        }
                   1118:                        sc->rx_bufs++;
                   1119:                }
                   1120:        }
                   1121: }
                   1122:
                   1123: /*
                   1124:  * Watchdog/transmission transmit timeout handler. Called when a
                   1125:  * transmission is started on the interface, but no interrupt is
                   1126:  * received before the timeout. This usually indicates that the
                   1127:  * card has wedged for some reason.
                   1128:  */
                   1129: void
                   1130: fxp_watchdog(struct ifnet *ifp)
                   1131: {
                   1132:        struct fxp_softc *sc = ifp->if_softc;
                   1133:
                   1134:        log(LOG_ERR, "%s: device timeout\n", sc->sc_dev.dv_xname);
                   1135:        ifp->if_oerrors++;
                   1136:
                   1137:        fxp_init(sc);
                   1138: }
                   1139:
                   1140: /*
                   1141:  * Submit a command to the i82557.
                   1142:  */
                   1143: void
                   1144: fxp_scb_cmd(struct fxp_softc *sc, u_int8_t cmd)
                   1145: {
                   1146:        CSR_WRITE_1(sc, FXP_CSR_SCB_COMMAND, cmd);
                   1147: }
                   1148:
                   1149: void
                   1150: fxp_init(void *xsc)
                   1151: {
                   1152:        struct fxp_softc *sc = xsc;
                   1153:        struct ifnet *ifp = &sc->sc_arpcom.ac_if;
                   1154:        struct fxp_cb_config *cbp;
                   1155:        struct fxp_cb_ias *cb_ias;
                   1156:        struct fxp_cb_tx *txp;
                   1157:        bus_dmamap_t rxmap;
                   1158:        int i, prm, save_bf, lrxen, allm, s, bufs;
                   1159:
                   1160:        s = splnet();
                   1161:
                   1162:        /*
                   1163:         * Cancel any pending I/O
                   1164:         */
                   1165:        fxp_stop(sc, 0);
                   1166:
                   1167:        /*
                   1168:         * Initialize base of CBL and RFA memory. Loading with zero
                   1169:         * sets it up for regular linear addressing.
                   1170:         */
                   1171:        fxp_scb_wait(sc);
                   1172:        CSR_WRITE_4(sc, FXP_CSR_SCB_GENERAL, 0);
                   1173:        fxp_scb_cmd(sc, FXP_SCB_COMMAND_CU_BASE);
                   1174:
                   1175:        fxp_scb_wait(sc);
                   1176:        CSR_WRITE_4(sc, FXP_CSR_SCB_GENERAL, 0);
                   1177:        fxp_scb_cmd(sc, FXP_SCB_COMMAND_RU_BASE);
                   1178:
                   1179: #ifndef SMALL_KERNEL
                   1180:        fxp_load_ucode(sc);
                   1181: #endif
                   1182:        /* Once through to set flags */
                   1183:        fxp_mc_setup(sc, 0);
                   1184:
                   1185:         /*
                   1186:         * In order to support receiving 802.1Q VLAN frames, we have to
                   1187:         * enable "save bad frames", since they are 4 bytes larger than
                   1188:         * the normal Ethernet maximum frame length. On i82558 and later,
                   1189:         * we have a better mechanism for this.
                   1190:         */
                   1191:        save_bf = 0;
                   1192:        lrxen = 0;
                   1193:
                   1194:        if (sc->sc_revision >= FXP_REV_82558_A4)
                   1195:                lrxen = 1;
                   1196:        else
                   1197:                save_bf = 1;
                   1198:
                   1199:        /*
                   1200:         * Initialize base of dump-stats buffer.
                   1201:         */
                   1202:        fxp_scb_wait(sc);
                   1203:        CSR_WRITE_4(sc, FXP_CSR_SCB_GENERAL,
                   1204:            sc->tx_cb_map->dm_segs->ds_addr +
                   1205:            offsetof(struct fxp_ctrl, stats));
                   1206:        fxp_scb_cmd(sc, FXP_SCB_COMMAND_CU_DUMP_ADR);
                   1207:
                   1208:        cbp = &sc->sc_ctrl->u.cfg;
                   1209:        /*
                   1210:         * This bcopy is kind of disgusting, but there are a bunch of must be
                   1211:         * zero and must be one bits in this structure and this is the easiest
                   1212:         * way to initialize them all to proper values.
                   1213:         */
                   1214:        bcopy(fxp_cb_config_template, (void *)&cbp->cb_status,
                   1215:                sizeof(fxp_cb_config_template));
                   1216:
                   1217:        prm = (ifp->if_flags & IFF_PROMISC) ? 1 : 0;
                   1218:        allm = (ifp->if_flags & IFF_ALLMULTI) ? 1 : 0;
                   1219:
                   1220: #if 0
                   1221:        cbp->cb_status =        0;
                   1222:        cbp->cb_command =       FXP_CB_COMMAND_CONFIG | FXP_CB_COMMAND_EL;
                   1223:        cbp->link_addr =        0xffffffff;     /* (no) next command */
                   1224:        cbp->byte_count =       22;             /* (22) bytes to config */
                   1225:        cbp->rx_fifo_limit =    8;      /* rx fifo threshold (32 bytes) */
                   1226:        cbp->tx_fifo_limit =    0;      /* tx fifo threshold (0 bytes) */
                   1227:        cbp->adaptive_ifs =     0;      /* (no) adaptive interframe spacing */
                   1228:        cbp->rx_dma_bytecount = 0;      /* (no) rx DMA max */
                   1229:        cbp->tx_dma_bytecount = 0;      /* (no) tx DMA max */
                   1230:        cbp->dma_bce =          0;      /* (disable) dma max counters */
                   1231:        cbp->late_scb =         0;      /* (don't) defer SCB update */
                   1232:        cbp->tno_int =          0;      /* (disable) tx not okay interrupt */
                   1233:        cbp->ci_int =           1;      /* interrupt on CU idle */
                   1234:        cbp->save_bf =          save_bf ? 1 : prm; /* save bad frames */
                   1235:        cbp->disc_short_rx =    !prm;   /* discard short packets */
                   1236:        cbp->underrun_retry =   1;      /* retry mode (1) on DMA underrun */
                   1237:        cbp->mediatype =        !sc->phy_10Mbps_only; /* interface mode */
                   1238:        cbp->nsai =             1;      /* (don't) disable source addr insert */
                   1239:        cbp->preamble_length =  2;      /* (7 byte) preamble */
                   1240:        cbp->loopback =         0;      /* (don't) loopback */
                   1241:        cbp->linear_priority =  0;      /* (normal CSMA/CD operation) */
                   1242:        cbp->linear_pri_mode =  0;      /* (wait after xmit only) */
                   1243:        cbp->interfrm_spacing = 6;      /* (96 bits of) interframe spacing */
                   1244:        cbp->promiscuous =      prm;    /* promiscuous mode */
                   1245:        cbp->bcast_disable =    0;      /* (don't) disable broadcasts */
                   1246:        cbp->crscdt =           0;      /* (CRS only) */
                   1247:        cbp->stripping =        !prm;   /* truncate rx packet to byte count */
                   1248:        cbp->padding =          1;      /* (do) pad short tx packets */
                   1249:        cbp->rcv_crc_xfer =     0;      /* (don't) xfer CRC to host */
                   1250:        cbp->long_rx =          lrxen;  /* (enable) long packets */
                   1251:        cbp->force_fdx =        0;      /* (don't) force full duplex */
                   1252:        cbp->fdx_pin_en =       1;      /* (enable) FDX# pin */
                   1253:        cbp->multi_ia =         0;      /* (don't) accept multiple IAs */
                   1254:        cbp->mc_all =           allm;
                   1255: #else
                   1256:        cbp->cb_command = htole16(FXP_CB_COMMAND_CONFIG | FXP_CB_COMMAND_EL);
                   1257:        if (allm)
                   1258:                cbp->mc_all |= 0x08;            /* accept all multicasts */
                   1259:        else
                   1260:                cbp->mc_all &= ~0x08;           /* reject all multicasts */
                   1261:
                   1262:        if (prm) {
                   1263:                cbp->promiscuous |= 1;          /* promiscuous mode */
                   1264:                cbp->ctrl2 &= ~0x01;            /* save short packets */
                   1265:                cbp->stripping &= ~0x01;        /* don't truncate rx packets */
                   1266:        } else {
                   1267:                cbp->promiscuous &= ~1;         /* no promiscuous mode */
                   1268:                cbp->ctrl2 |= 0x01;             /* discard short packets */
                   1269:                cbp->stripping |= 0x01;         /* truncate rx packets */
                   1270:        }
                   1271:
                   1272:        if (prm || save_bf)
                   1273:                cbp->ctrl1 |= 0x80;             /* save bad frames */
                   1274:        else
                   1275:                cbp->ctrl1 &= ~0x80;            /* discard bad frames */
                   1276:
                   1277:        if (sc->sc_flags & FXPF_MWI_ENABLE)
                   1278:                cbp->ctrl0 |= 0x01;             /* enable PCI MWI command */
                   1279:
                   1280:        if(!sc->phy_10Mbps_only)                        /* interface mode */
                   1281:                cbp->mediatype |= 0x01;
                   1282:        else
                   1283:                cbp->mediatype &= ~0x01;
                   1284:
                   1285:        if(lrxen)                       /* long packets */
                   1286:                cbp->stripping |= 0x08;
                   1287:        else
                   1288:                cbp->stripping &= ~0x08;
                   1289:
                   1290:        cbp->tx_dma_bytecount = 0; /* (no) tx DMA max, dma_dce = 0 ??? */
                   1291:        cbp->ctrl1 |= 0x08;     /* ci_int = 1 */
                   1292:        cbp->ctrl3 |= 0x08;     /* nsai */
                   1293:        cbp->fifo_limit = 0x08; /* tx and rx fifo limit */
                   1294:        cbp->fdx_pin |= 0x80;   /* Enable full duplex setting by pin */
                   1295: #endif
                   1296:
                   1297:        /*
                   1298:         * Start the config command/DMA.
                   1299:         */
                   1300:        fxp_scb_wait(sc);
                   1301:        FXP_CFG_SYNC(sc, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
                   1302:        CSR_WRITE_4(sc, FXP_CSR_SCB_GENERAL, sc->tx_cb_map->dm_segs->ds_addr +
                   1303:            offsetof(struct fxp_ctrl, u.cfg));
                   1304:        fxp_scb_cmd(sc, FXP_SCB_COMMAND_CU_START);
                   1305:        /* ...and wait for it to complete. */
                   1306:        do {
                   1307:                DELAY(1);
                   1308:                FXP_CFG_SYNC(sc, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
                   1309:        } while ((cbp->cb_status & htole16(FXP_CB_STATUS_C)) == 0);
                   1310:
                   1311:        /*
                   1312:         * Now initialize the station address.
                   1313:         */
                   1314:        cb_ias = &sc->sc_ctrl->u.ias;
                   1315:        cb_ias->cb_status = htole16(0);
                   1316:        cb_ias->cb_command = htole16(FXP_CB_COMMAND_IAS | FXP_CB_COMMAND_EL);
                   1317:        cb_ias->link_addr = htole32(0xffffffff);
                   1318:        bcopy(sc->sc_arpcom.ac_enaddr, (void *)cb_ias->macaddr,
                   1319:            sizeof(sc->sc_arpcom.ac_enaddr));
                   1320:
                   1321:        /*
                   1322:         * Start the IAS (Individual Address Setup) command/DMA.
                   1323:         */
                   1324:        fxp_scb_wait(sc);
                   1325:        FXP_IAS_SYNC(sc, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
                   1326:        CSR_WRITE_4(sc, FXP_CSR_SCB_GENERAL, sc->tx_cb_map->dm_segs->ds_addr +
                   1327:            offsetof(struct fxp_ctrl, u.ias));
                   1328:        fxp_scb_cmd(sc, FXP_SCB_COMMAND_CU_START);
                   1329:        /* ...and wait for it to complete. */
                   1330:        do {
                   1331:                DELAY(1);
                   1332:                FXP_IAS_SYNC(sc, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
                   1333:        } while (!(cb_ias->cb_status & htole16(FXP_CB_STATUS_C)));
                   1334:
                   1335:        /* Again, this time really upload the multicast addresses */
                   1336:        fxp_mc_setup(sc, 1);
                   1337:
                   1338:        /*
                   1339:         * Initialize transmit control block (TxCB) list.
                   1340:         */
                   1341:        bzero(sc->sc_ctrl->tx_cb, sizeof(struct fxp_cb_tx) * FXP_NTXCB);
                   1342:        txp = sc->sc_ctrl->tx_cb;
                   1343:        for (i = 0; i < FXP_NTXCB; i++) {
                   1344:                txp[i].cb_command = htole16(FXP_CB_COMMAND_NOP);
                   1345:                txp[i].link_addr = htole32(sc->tx_cb_map->dm_segs->ds_addr +
                   1346:                    offsetof(struct fxp_ctrl, tx_cb[(i + 1) & FXP_TXCB_MASK]));
                   1347:                txp[i].tbd_array_addr =htole32(sc->tx_cb_map->dm_segs->ds_addr +
                   1348:                    offsetof(struct fxp_ctrl, tx_cb[i].tbd[0]));
                   1349:        }
                   1350:        /*
                   1351:         * Set the suspend flag on the first TxCB and start the control
                   1352:         * unit. It will execute the NOP and then suspend.
                   1353:         */
                   1354:        sc->sc_cbt_prev = sc->sc_cbt_prod = sc->sc_cbt_cons = sc->txs;
                   1355:        sc->sc_cbt_cnt = 1;
                   1356:        sc->sc_ctrl->tx_cb[0].cb_command = htole16(FXP_CB_COMMAND_NOP |
                   1357:            FXP_CB_COMMAND_S | FXP_CB_COMMAND_I);
                   1358:        bus_dmamap_sync(sc->sc_dmat, sc->tx_cb_map, 0,
                   1359:            sc->tx_cb_map->dm_mapsize,
                   1360:            BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
                   1361:
                   1362:        fxp_scb_wait(sc);
                   1363:        CSR_WRITE_4(sc, FXP_CSR_SCB_GENERAL, sc->tx_cb_map->dm_segs->ds_addr +
                   1364:            offsetof(struct fxp_ctrl, tx_cb[0]));
                   1365:        fxp_scb_cmd(sc, FXP_SCB_COMMAND_CU_START);
                   1366:
                   1367:        /*
                   1368:         * Initialize receiver buffer area - RFA.
                   1369:         */
                   1370:        if (ifp->if_flags & IFF_UP)
                   1371:                bufs = FXP_NRFABUFS_MAX;
                   1372:        else
                   1373:                bufs = FXP_NRFABUFS_MIN;
                   1374:        if (sc->rx_bufs > bufs) {
                   1375:                while (sc->rfa_headm != NULL && sc->rx_bufs-- > bufs) {
                   1376:                        rxmap = *((bus_dmamap_t *)sc->rfa_headm->m_ext.ext_buf);
                   1377:                        bus_dmamap_unload(sc->sc_dmat, rxmap);
                   1378:                        FXP_RXMAP_PUT(sc, rxmap);
                   1379:                        sc->rfa_headm = m_free(sc->rfa_headm);
                   1380:                }
                   1381:        } else if (sc->rx_bufs < bufs) {
                   1382:                int err, tmp_rx_bufs = sc->rx_bufs;
                   1383:                for (i = sc->rx_bufs; i < bufs; i++) {
                   1384:                        if ((err = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1,
                   1385:                            MCLBYTES, 0, 0, &sc->sc_rxmaps[i])) != 0) {
                   1386:                                printf("%s: unable to create rx dma map %d, "
                   1387:                                  "error %d\n", sc->sc_dev.dv_xname, i, err);
                   1388:                                break;
                   1389:                        }
                   1390:                        sc->rx_bufs++;
                   1391:                }
                   1392:                for (i = tmp_rx_bufs; i < sc->rx_bufs; i++)
                   1393:                        if (fxp_add_rfabuf(sc, NULL) != 0)
                   1394:                                break;
                   1395:        }
                   1396:        fxp_scb_wait(sc);
                   1397:
                   1398:        /*
                   1399:         * Set current media.
                   1400:         */
                   1401:        mii_mediachg(&sc->sc_mii);
                   1402:
                   1403:        ifp->if_flags |= IFF_RUNNING;
                   1404:        ifp->if_flags &= ~IFF_OACTIVE;
                   1405:
                   1406:        /*
                   1407:         * Request a software generated interrupt that will be used to
                   1408:         * (re)start the RU processing.  If we direct the chip to start
                   1409:         * receiving from the start of queue now, instead of letting the
                   1410:         * interrupt handler first process all received packets, we run
                   1411:         * the risk of having it overwrite mbuf clusters while they are
                   1412:         * being processed or after they have been returned to the pool.
                   1413:         */
                   1414:        CSR_WRITE_1(sc, FXP_CSR_SCB_INTRCNTL, FXP_SCB_INTRCNTL_REQUEST_SWI);
                   1415:        splx(s);
                   1416:
                   1417:        /*
                   1418:         * Start stats updater.
                   1419:         */
                   1420:        timeout_add(&sc->stats_update_to, hz);
                   1421: }
                   1422:
                   1423: /*
                   1424:  * Change media according to request.
                   1425:  */
                   1426: int
                   1427: fxp_mediachange(struct ifnet *ifp)
                   1428: {
                   1429:        struct fxp_softc *sc = ifp->if_softc;
                   1430:        struct mii_data *mii = &sc->sc_mii;
                   1431:
                   1432:        if (mii->mii_instance) {
                   1433:                struct mii_softc *miisc;
                   1434:                LIST_FOREACH(miisc, &mii->mii_phys, mii_list)
                   1435:                        mii_phy_reset(miisc);
                   1436:        }
                   1437:        mii_mediachg(&sc->sc_mii);
                   1438:        return (0);
                   1439: }
                   1440:
                   1441: /*
                   1442:  * Notify the world which media we're using.
                   1443:  */
                   1444: void
                   1445: fxp_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
                   1446: {
                   1447:        struct fxp_softc *sc = ifp->if_softc;
                   1448:
                   1449:        mii_pollstat(&sc->sc_mii);
                   1450:        ifmr->ifm_status = sc->sc_mii.mii_media_status;
                   1451:        ifmr->ifm_active = sc->sc_mii.mii_media_active;
                   1452: }
                   1453:
                   1454: /*
                   1455:  * Add a buffer to the end of the RFA buffer list.
                   1456:  * Return 0 if successful, 1 for failure. A failure results in
                   1457:  * adding the 'oldm' (if non-NULL) on to the end of the list -
                   1458:  * tossing out its old contents and recycling it.
                   1459:  * The RFA struct is stuck at the beginning of mbuf cluster and the
                   1460:  * data pointer is fixed up to point just past it.
                   1461:  */
                   1462: int
                   1463: fxp_add_rfabuf(struct fxp_softc *sc, struct mbuf *oldm)
                   1464: {
                   1465:        u_int32_t v;
                   1466:        struct mbuf *m;
                   1467:        u_int8_t *rfap;
                   1468:        bus_dmamap_t rxmap = NULL;
                   1469:
                   1470:        MGETHDR(m, M_DONTWAIT, MT_DATA);
                   1471:        if (m != NULL) {
                   1472:                MCLGET(m, M_DONTWAIT);
                   1473:                if ((m->m_flags & M_EXT) == 0) {
                   1474:                        m_freem(m);
                   1475:                        if (oldm == NULL)
                   1476:                                return 1;
                   1477:                        m = oldm;
                   1478:                        m->m_data = m->m_ext.ext_buf;
                   1479:                }
                   1480:                if (oldm == NULL) {
                   1481:                        rxmap = FXP_RXMAP_GET(sc);
                   1482:                        *((bus_dmamap_t *)m->m_ext.ext_buf) = rxmap;
                   1483:                        bus_dmamap_load(sc->sc_dmat, rxmap,
                   1484:                            m->m_ext.ext_buf, m->m_ext.ext_size, NULL,
                   1485:                            BUS_DMA_NOWAIT);
                   1486:                } else if (oldm == m)
                   1487:                        rxmap = *((bus_dmamap_t *)oldm->m_ext.ext_buf);
                   1488:                else {
                   1489:                        rxmap = *((bus_dmamap_t *)oldm->m_ext.ext_buf);
                   1490:                        bus_dmamap_unload(sc->sc_dmat, rxmap);
                   1491:                        bus_dmamap_load(sc->sc_dmat, rxmap,
                   1492:                            m->m_ext.ext_buf, m->m_ext.ext_size, NULL,
                   1493:                            BUS_DMA_NOWAIT);
                   1494:                        *mtod(m, bus_dmamap_t *) = rxmap;
                   1495:                }
                   1496:        } else {
                   1497:                if (oldm == NULL)
                   1498:                        return 1;
                   1499:                m = oldm;
                   1500:                m->m_data = m->m_ext.ext_buf;
                   1501:                rxmap = *mtod(m, bus_dmamap_t *);
                   1502:        }
                   1503:
                   1504:        /*
                   1505:         * Move the data pointer up so that the incoming data packet
                   1506:         * will be 32-bit aligned.
                   1507:         */
                   1508:        m->m_data += RFA_ALIGNMENT_FUDGE;
                   1509:
                   1510:        /*
                   1511:         * Get a pointer to the base of the mbuf cluster and move
                   1512:         * data start past it.
                   1513:         */
                   1514:        rfap = m->m_data;
                   1515:        m->m_data += sizeof(struct fxp_rfa);
                   1516:        *(u_int16_t *)(rfap + offsetof(struct fxp_rfa, size)) =
                   1517:            htole16(MCLBYTES - sizeof(struct fxp_rfa) - RFA_ALIGNMENT_FUDGE);
                   1518:
                   1519:        /*
                   1520:         * Initialize the rest of the RFA.  Note that since the RFA
                   1521:         * is misaligned, we cannot store values directly.  Instead,
                   1522:         * we use an optimized, inline copy.
                   1523:         */
                   1524:        *(u_int16_t *)(rfap + offsetof(struct fxp_rfa, rfa_status)) = 0;
                   1525:        *(u_int16_t *)(rfap + offsetof(struct fxp_rfa, rfa_control)) =
                   1526:            htole16(FXP_RFA_CONTROL_EL);
                   1527:        *(u_int16_t *)(rfap + offsetof(struct fxp_rfa, actual_size)) = 0;
                   1528:
                   1529:        v = -1;
                   1530:        fxp_lwcopy(&v,
                   1531:            (u_int32_t *)(rfap + offsetof(struct fxp_rfa, link_addr)));
                   1532:        fxp_lwcopy(&v,
                   1533:            (u_int32_t *)(rfap + offsetof(struct fxp_rfa, rbd_addr)));
                   1534:
                   1535:        bus_dmamap_sync(sc->sc_dmat, rxmap, 0, MCLBYTES,
                   1536:            BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
                   1537:
                   1538:        /*
                   1539:         * If there are other buffers already on the list, attach this
                   1540:         * one to the end by fixing up the tail to point to this one.
                   1541:         */
                   1542:        if (sc->rfa_headm != NULL) {
                   1543:                sc->rfa_tailm->m_next = m;
                   1544:                v = htole32(rxmap->dm_segs[0].ds_addr + RFA_ALIGNMENT_FUDGE);
                   1545:                rfap = sc->rfa_tailm->m_ext.ext_buf + RFA_ALIGNMENT_FUDGE;
                   1546:                fxp_lwcopy(&v,
                   1547:                    (u_int32_t *)(rfap + offsetof(struct fxp_rfa, link_addr)));
                   1548:                *(u_int16_t *)(rfap + offsetof(struct fxp_rfa, rfa_control)) &=
                   1549:                    htole16((u_int16_t)~FXP_RFA_CONTROL_EL);
                   1550:                /* XXX we only need to sync the control struct */
                   1551:                bus_dmamap_sync(sc->sc_dmat,
                   1552:                    *((bus_dmamap_t *)sc->rfa_tailm->m_ext.ext_buf), 0,
                   1553:                        MCLBYTES, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
                   1554:        } else
                   1555:                sc->rfa_headm = m;
                   1556:
                   1557:        sc->rfa_tailm = m;
                   1558:
                   1559:        return (m == oldm);
                   1560: }
                   1561:
                   1562: int
                   1563: fxp_mdi_read(struct device *self, int phy, int reg)
                   1564: {
                   1565:        struct fxp_softc *sc = (struct fxp_softc *)self;
                   1566:        int count = 10000;
                   1567:        int value;
                   1568:
                   1569:        CSR_WRITE_4(sc, FXP_CSR_MDICONTROL,
                   1570:            (FXP_MDI_READ << 26) | (reg << 16) | (phy << 21));
                   1571:
                   1572:        while (((value = CSR_READ_4(sc, FXP_CSR_MDICONTROL)) & 0x10000000) == 0
                   1573:            && count--)
                   1574:                DELAY(10);
                   1575:
                   1576:        if (count <= 0)
                   1577:                printf("%s: fxp_mdi_read: timed out\n", sc->sc_dev.dv_xname);
                   1578:
                   1579:        return (value & 0xffff);
                   1580: }
                   1581:
                   1582: void
                   1583: fxp_statchg(struct device *self)
                   1584: {
                   1585:        /* Nothing to do. */
                   1586: }
                   1587:
                   1588: void
                   1589: fxp_mdi_write(struct device *self, int phy, int reg, int value)
                   1590: {
                   1591:        struct fxp_softc *sc = (struct fxp_softc *)self;
                   1592:        int count = 10000;
                   1593:
                   1594:        CSR_WRITE_4(sc, FXP_CSR_MDICONTROL,
                   1595:            (FXP_MDI_WRITE << 26) | (reg << 16) | (phy << 21) |
                   1596:            (value & 0xffff));
                   1597:
                   1598:        while((CSR_READ_4(sc, FXP_CSR_MDICONTROL) & 0x10000000) == 0 &&
                   1599:            count--)
                   1600:                DELAY(10);
                   1601:
                   1602:        if (count <= 0)
                   1603:                printf("%s: fxp_mdi_write: timed out\n", sc->sc_dev.dv_xname);
                   1604: }
                   1605:
                   1606: int
                   1607: fxp_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
                   1608: {
                   1609:        struct fxp_softc *sc = ifp->if_softc;
                   1610:        struct ifreq *ifr = (struct ifreq *)data;
                   1611:        struct ifaddr *ifa = (struct ifaddr *)data;
                   1612:        int s, error = 0;
                   1613:
                   1614:        s = splnet();
                   1615:
                   1616:        if ((error = ether_ioctl(ifp, &sc->sc_arpcom, command, data)) > 0) {
                   1617:                splx(s);
                   1618:                return (error);
                   1619:        }
                   1620:
                   1621:        switch (command) {
                   1622:        case SIOCSIFADDR:
                   1623:                ifp->if_flags |= IFF_UP;
                   1624:                if (!(ifp->if_flags & IFF_RUNNING))
                   1625:                        fxp_init(sc);
                   1626: #ifdef INET
                   1627:                if (ifa->ifa_addr->sa_family == AF_INET)
                   1628:                        arp_ifinit(&sc->sc_arpcom, ifa);
                   1629: #endif
                   1630:                break;
                   1631:
                   1632:        case SIOCSIFMTU:
                   1633:                if (ifr->ifr_mtu > ETHERMTU || ifr->ifr_mtu < ETHERMIN)
                   1634:                        error = EINVAL;
                   1635:                else if (ifp->if_mtu != ifr->ifr_mtu)
                   1636:                        ifp->if_mtu = ifr->ifr_mtu;
                   1637:                break;
                   1638:
                   1639:        case SIOCSIFFLAGS:
                   1640:                /*
                   1641:                 * If interface is marked up and not running, then start it.
                   1642:                 * If it is marked down and running, stop it.
                   1643:                 * XXX If it's up then re-initialize it. This is so flags
                   1644:                 * such as IFF_PROMISC are handled.
                   1645:                 */
                   1646:                if (ifp->if_flags & IFF_UP)
                   1647:                        fxp_init(sc);
                   1648:                else if (ifp->if_flags & IFF_RUNNING)
                   1649:                        fxp_stop(sc, 1);
                   1650:                break;
                   1651:
                   1652:        case SIOCADDMULTI:
                   1653:        case SIOCDELMULTI:
                   1654:                error = (command == SIOCADDMULTI) ?
                   1655:                    ether_addmulti(ifr, &sc->sc_arpcom) :
                   1656:                    ether_delmulti(ifr, &sc->sc_arpcom);
                   1657:                if (error == ENETRESET) {
                   1658:                        /*
                   1659:                         * Multicast list has changed; set the hardware
                   1660:                         * filter accordingly.
                   1661:                         */
                   1662:                        if (ifp->if_flags & IFF_RUNNING)
                   1663:                                fxp_init(sc);
                   1664:                        error = 0;
                   1665:                }
                   1666:                break;
                   1667:
                   1668:        case SIOCSIFMEDIA:
                   1669:        case SIOCGIFMEDIA:
                   1670:                error = ifmedia_ioctl(ifp, ifr, &sc->sc_mii.mii_media, command);
                   1671:                break;
                   1672:
                   1673:        default:
                   1674:                error = EINVAL;
                   1675:        }
                   1676:        splx(s);
                   1677:        return (error);
                   1678: }
                   1679:
                   1680: /*
                   1681:  * Program the multicast filter.
                   1682:  *
                   1683:  * We have an artificial restriction that the multicast setup command
                   1684:  * must be the first command in the chain, so we take steps to ensure
                   1685:  * this. By requiring this, it allows us to keep up the performance of
                   1686:  * the pre-initialized command ring (esp. link pointers) by not actually
                   1687:  * inserting the mcsetup command in the ring - i.e. its link pointer
                   1688:  * points to the TxCB ring, but the mcsetup descriptor itself is not part
                   1689:  * of it. We then can do 'CU_START' on the mcsetup descriptor and have it
                   1690:  * lead into the regular TxCB ring when it completes.
                   1691:  *
                   1692:  * This function must be called at splnet.
                   1693:  */
                   1694: void
                   1695: fxp_mc_setup(struct fxp_softc *sc, int doit)
                   1696: {
                   1697:        struct fxp_cb_mcs *mcsp = &sc->sc_ctrl->u.mcs;
                   1698:        struct ifnet *ifp = &sc->sc_arpcom.ac_if;
                   1699:        struct ether_multistep step;
                   1700:        struct ether_multi *enm;
                   1701:        int nmcasts;
                   1702:
                   1703:        /*
                   1704:         * Initialize multicast setup descriptor.
                   1705:         */
                   1706:        mcsp->cb_status = htole16(0);
                   1707:        mcsp->cb_command = htole16(FXP_CB_COMMAND_MCAS | FXP_CB_COMMAND_EL);
                   1708:        mcsp->link_addr = htole32(-1);
                   1709:
                   1710:        nmcasts = 0;
                   1711:        if (!(ifp->if_flags & IFF_ALLMULTI)) {
                   1712:                ETHER_FIRST_MULTI(step, &sc->sc_arpcom, enm);
                   1713:                while (enm != NULL) {
                   1714:                        if (nmcasts >= MAXMCADDR) {
                   1715:                                ifp->if_flags |= IFF_ALLMULTI;
                   1716:                                nmcasts = 0;
                   1717:                                break;
                   1718:                        }
                   1719:
                   1720:                        /* Punt on ranges. */
                   1721:                        if (bcmp(enm->enm_addrlo, enm->enm_addrhi,
                   1722:                            sizeof(enm->enm_addrlo)) != 0) {
                   1723:                                ifp->if_flags |= IFF_ALLMULTI;
                   1724:                                nmcasts = 0;
                   1725:                                break;
                   1726:                        }
                   1727:                        bcopy(enm->enm_addrlo,
                   1728:                            (void *)&mcsp->mc_addr[nmcasts][0], ETHER_ADDR_LEN);
                   1729:                        nmcasts++;
                   1730:                        ETHER_NEXT_MULTI(step, enm);
                   1731:                }
                   1732:        }
                   1733:        if (doit == 0)
                   1734:                return;
                   1735:        mcsp->mc_cnt = htole16(nmcasts * ETHER_ADDR_LEN);
                   1736:
                   1737:        /*
                   1738:         * Wait until command unit is not active. This should never
                   1739:         * be the case when nothing is queued, but make sure anyway.
                   1740:         */
                   1741:        while ((CSR_READ_1(sc, FXP_CSR_SCB_RUSCUS) >> 6) != FXP_SCB_CUS_IDLE);
                   1742:
                   1743:        /*
                   1744:         * Start the multicast setup command.
                   1745:         */
                   1746:        fxp_scb_wait(sc);
                   1747:        FXP_MCS_SYNC(sc, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
                   1748:        CSR_WRITE_4(sc, FXP_CSR_SCB_GENERAL, sc->tx_cb_map->dm_segs->ds_addr +
                   1749:            offsetof(struct fxp_ctrl, u.mcs));
                   1750:        fxp_scb_cmd(sc, FXP_SCB_COMMAND_CU_START);
                   1751:
                   1752:        do {
                   1753:                DELAY(1);
                   1754:                FXP_MCS_SYNC(sc, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
                   1755:        } while (!(mcsp->cb_status & htole16(FXP_CB_STATUS_C)));
                   1756: }
                   1757:
                   1758: #ifndef SMALL_KERNEL
                   1759: #include <dev/microcode/fxp/rcvbundl.h>
                   1760: struct ucode {
                   1761:        u_int16_t       revision;
                   1762:        u_int16_t       int_delay_offset;
                   1763:        u_int16_t       bundle_max_offset;
                   1764:        u_int16_t       min_size_mask_offset;
                   1765:        const char      *uname;
                   1766: } const ucode_table[] = {
                   1767:        { FXP_REV_82558_A4, D101_CPUSAVER_DWORD,
                   1768:          0, 0,
                   1769:          "fxp-d101a" },
                   1770:
                   1771:        { FXP_REV_82558_B0, D101_CPUSAVER_DWORD,
                   1772:          0, 0,
                   1773:          "fxp-d101b0" },
                   1774:
                   1775:        { FXP_REV_82559_A0, D101M_CPUSAVER_DWORD,
                   1776:          D101M_CPUSAVER_BUNDLE_MAX_DWORD, D101M_CPUSAVER_MIN_SIZE_DWORD,
                   1777:          "fxp-d101ma" },
                   1778:
                   1779:        { FXP_REV_82559S_A, D101S_CPUSAVER_DWORD,
                   1780:          D101S_CPUSAVER_BUNDLE_MAX_DWORD, D101S_CPUSAVER_MIN_SIZE_DWORD,
                   1781:          "fxp-d101s" },
                   1782:
                   1783:        { FXP_REV_82550, D102_B_CPUSAVER_DWORD,
                   1784:          D102_B_CPUSAVER_BUNDLE_MAX_DWORD, D102_B_CPUSAVER_MIN_SIZE_DWORD,
                   1785:          "fxp-d102" },
                   1786:
                   1787:        { FXP_REV_82550_C, D102_C_CPUSAVER_DWORD,
                   1788:          D102_C_CPUSAVER_BUNDLE_MAX_DWORD, D102_C_CPUSAVER_MIN_SIZE_DWORD,
                   1789:          "fxp-d102c" },
                   1790:
                   1791:        { FXP_REV_82551_F, D102_E_CPUSAVER_DWORD,
                   1792:          D102_E_CPUSAVER_BUNDLE_MAX_DWORD, D102_E_CPUSAVER_MIN_SIZE_DWORD,
                   1793:          "fxp-d102e" },
                   1794:
                   1795:        { FXP_REV_82551_10, D102_E_CPUSAVER_DWORD,
                   1796:          D102_E_CPUSAVER_BUNDLE_MAX_DWORD, D102_E_CPUSAVER_MIN_SIZE_DWORD,
                   1797:          "fxp-d102e" },
                   1798:
                   1799:        { 0, 0,
                   1800:          0, 0,
                   1801:          NULL }
                   1802: };
                   1803:
                   1804: void
                   1805: fxp_load_ucode(struct fxp_softc *sc)
                   1806: {
                   1807:        const struct ucode *uc;
                   1808:        struct fxp_cb_ucode *cbp = &sc->sc_ctrl->u.code;
                   1809:        int i, error;
                   1810:        u_int32_t *ucode_buf;
                   1811:        size_t ucode_len;
                   1812:
                   1813:        if (sc->sc_flags & FXPF_UCODE)
                   1814:                return;
                   1815:
                   1816:        for (uc = ucode_table; uc->revision != 0; uc++)
                   1817:                if (sc->sc_revision == uc->revision)
                   1818:                        break;
                   1819:        if (uc->revision == NULL)
                   1820:                return; /* no ucode for this chip is found */
                   1821:
                   1822:        error = loadfirmware(uc->uname, (u_char **)&ucode_buf, &ucode_len);
                   1823:        if (error) {
                   1824:                printf("%s: failed loadfirmware of file %s: errno %d\n",
                   1825:                    sc->sc_dev.dv_xname, uc->uname, error);
                   1826:                sc->sc_flags |= FXPF_UCODE;
                   1827:                return;
                   1828:        }
                   1829:
                   1830:        cbp->cb_status = 0;
                   1831:        cbp->cb_command = htole16(FXP_CB_COMMAND_UCODE|FXP_CB_COMMAND_EL);
                   1832:        cbp->link_addr = 0xffffffff;    /* (no) next command */
                   1833:        for (i = 0; i < (ucode_len / sizeof(u_int32_t)); i++)
                   1834:                cbp->ucode[i] = ucode_buf[i];
                   1835:
                   1836:        if (uc->int_delay_offset)
                   1837:                *((u_int16_t *)&cbp->ucode[uc->int_delay_offset]) =
                   1838:                        htole16(sc->sc_int_delay + sc->sc_int_delay / 2);
                   1839:
                   1840:        if (uc->bundle_max_offset)
                   1841:                *((u_int16_t *)&cbp->ucode[uc->bundle_max_offset]) =
                   1842:                        htole16(sc->sc_bundle_max);
                   1843:
                   1844:        if (uc->min_size_mask_offset)
                   1845:                *((u_int16_t *)&cbp->ucode[uc->min_size_mask_offset]) =
                   1846:                        htole16(sc->sc_min_size_mask);
                   1847:
                   1848:        FXP_UCODE_SYNC(sc, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
                   1849:
                   1850:        /*
                   1851:         * Download the ucode to the chip.
                   1852:         */
                   1853:        fxp_scb_wait(sc);
                   1854:        CSR_WRITE_4(sc, FXP_CSR_SCB_GENERAL, sc->tx_cb_map->dm_segs->ds_addr
                   1855:              + offsetof(struct fxp_ctrl, u.code));
                   1856:        fxp_scb_cmd(sc, FXP_SCB_COMMAND_CU_START);
                   1857:
                   1858:        /* ...and wait for it to complete. */
                   1859:        i = 10000;
                   1860:        do {
                   1861:                DELAY(2);
                   1862:                FXP_UCODE_SYNC(sc, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
                   1863:        } while (((cbp->cb_status & htole16(FXP_CB_STATUS_C)) == 0) && --i);
                   1864:        if (i == 0) {
                   1865:                printf("%s: timeout loading microcode\n", sc->sc_dev.dv_xname);
                   1866:                free(ucode_buf, M_DEVBUF);
                   1867:                return;
                   1868:        }
                   1869:
                   1870: #ifdef DEBUG
                   1871:        printf("%s: microcode loaded, int_delay: %d usec",
                   1872:            sc->sc_dev.dv_xname, sc->sc_int_delay);
                   1873:
                   1874:        if (uc->bundle_max_offset)
                   1875:                printf(", bundle_max %d\n", sc->sc_bundle_max);
                   1876:        else
                   1877:                printf("\n");
                   1878: #endif
                   1879:
                   1880:        free(ucode_buf, M_DEVBUF);
                   1881:        sc->sc_flags |= FXPF_UCODE;
                   1882: }
                   1883: #endif /* SMALL_KERNEL */

CVSweb