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

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

1.1       nbrk        1: /*     $OpenBSD: if_xge.c,v 1.42 2007/05/28 23:39:07 ckuethe Exp $     */
                      2: /*     $NetBSD: if_xge.c,v 1.1 2005/09/09 10:30:27 ragge Exp $ */
                      3:
                      4: /*
                      5:  * Copyright (c) 2004, SUNET, Swedish University Computer Network.
                      6:  * All rights reserved.
                      7:  *
                      8:  * Written by Anders Magnusson for SUNET, Swedish University Computer Network.
                      9:  *
                     10:  * Redistribution and use in source and binary forms, with or without
                     11:  * modification, are permitted provided that the following conditions
                     12:  * are met:
                     13:  * 1. Redistributions of source code must retain the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer.
                     15:  * 2. Redistributions in binary form must reproduce the above copyright
                     16:  *    notice, this list of conditions and the following disclaimer in the
                     17:  *    documentation and/or other materials provided with the distribution.
                     18:  * 3. All advertising materials mentioning features or use of this software
                     19:  *    must display the following acknowledgement:
                     20:  *      This product includes software developed for the NetBSD Project by
                     21:  *      SUNET, Swedish University Computer Network.
                     22:  * 4. The name of SUNET may not be used to endorse or promote products
                     23:  *    derived from this software without specific prior written permission.
                     24:  *
                     25:  * THIS SOFTWARE IS PROVIDED BY SUNET ``AS IS'' AND
                     26:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
                     27:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
                     28:  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL SUNET
                     29:  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
                     30:  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
                     31:  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
                     32:  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
                     33:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
                     34:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     35:  * POSSIBILITY OF SUCH DAMAGE.
                     36:  */
                     37:
                     38: /*
                     39:  * Driver for the Neterion Xframe Ten Gigabit Ethernet controller.
                     40:  */
                     41:
                     42: #include "bpfilter.h"
                     43: #include "vlan.h"
                     44:
                     45: #include <sys/param.h>
                     46: #include <sys/systm.h>
                     47: #include <sys/sockio.h>
                     48: #include <sys/mbuf.h>
                     49: #include <sys/malloc.h>
                     50: #include <sys/kernel.h>
                     51: #include <sys/socket.h>
                     52: #include <sys/device.h>
                     53:
                     54: #include <net/if.h>
                     55: #include <net/if_dl.h>
                     56: #include <net/if_media.h>
                     57:
                     58: #ifdef INET
                     59: #include <netinet/in.h>
                     60: #include <netinet/in_systm.h>
                     61: #include <netinet/in_var.h>
                     62: #include <netinet/ip.h>
                     63: #include <netinet/if_ether.h>
                     64: #include <netinet/tcp.h>
                     65: #include <netinet/udp.h>
                     66: #endif
                     67:
                     68: #if NVLAN > 0
                     69: #include <net/if_types.h>
                     70: #include <net/if_vlan_var.h>
                     71: #endif
                     72:
                     73: #if NBPFILTER > 0
                     74: #include <net/bpf.h>
                     75: #endif
                     76:
                     77: #include <machine/bus.h>
                     78: #include <machine/intr.h>
                     79: #include <machine/endian.h>
                     80:
                     81: #include <dev/mii/mii.h>
                     82: #include <dev/mii/miivar.h>
                     83:
                     84: #include <dev/pci/pcivar.h>
                     85: #include <dev/pci/pcireg.h>
                     86: #include <dev/pci/pcidevs.h>
                     87:
                     88: #include <sys/lock.h>
                     89: #include <sys/proc.h>
                     90:
                     91: #include <dev/pci/if_xgereg.h>
                     92:
                     93: /* Xframe chipset revisions */
                     94: #define XGE_TYPE_XENA          1       /* Xframe */
                     95: #define XGE_TYPE_HERC          2       /* Xframe-II */
                     96:
                     97: #define XGE_PCISIZE_XENA       26
                     98: #define XGE_PCISIZE_HERC       64
                     99:
                    100: /*
                    101:  * Some tunable constants, tune with care!
                    102:  */
                    103: #define RX_MODE                RX_MODE_1  /* Receive mode (buffer usage, see below) */
                    104: #define NRXDESCS       1016       /* # of receive descriptors (requested) */
                    105: #define NTXDESCS       2048       /* Number of transmit descriptors */
                    106: #define NTXFRAGS       100        /* Max fragments per packet */
                    107:
                    108: /*
                    109:  * Receive buffer modes; 1, 3 or 5 buffers.
                    110:  */
                    111: #define RX_MODE_1 1
                    112: #define RX_MODE_3 3
                    113: #define RX_MODE_5 5
                    114:
                    115: /*
                    116:  * Use clever macros to avoid a bunch of #ifdef's.
                    117:  */
                    118: #define XCONCAT3(x,y,z) x ## y ## z
                    119: #define CONCAT3(x,y,z) XCONCAT3(x,y,z)
                    120: #define NDESC_BUFMODE CONCAT3(NDESC_,RX_MODE,BUFMODE)
                    121: #define rxd_4k CONCAT3(rxd,RX_MODE,_4k)
                    122: /* XXX */
                    123: #if 0
                    124: #define rxdesc ___CONCAT(rxd,RX_MODE)
                    125: #endif
                    126: #define rxdesc rxd1
                    127:
                    128: #define NEXTTX(x)      (((x)+1) % NTXDESCS)
                    129: #define NRXFRAGS       RX_MODE /* hardware imposed frags */
                    130: #define NRXPAGES       ((NRXDESCS/NDESC_BUFMODE)+1)
                    131: #define NRXREAL                (NRXPAGES*NDESC_BUFMODE)
                    132: #define RXMAPSZ                (NRXPAGES*PAGE_SIZE)
                    133:
                    134: /*
                    135:  * Magic to fix a bug when the MAC address cannot be read correctly.
                    136:  * This came from the Linux driver.
                    137:  */
                    138: static uint64_t fix_mac[] = {
                    139:        0x0060000000000000ULL, 0x0060600000000000ULL,
                    140:        0x0040600000000000ULL, 0x0000600000000000ULL,
                    141:        0x0020600000000000ULL, 0x0060600000000000ULL,
                    142:        0x0020600000000000ULL, 0x0060600000000000ULL,
                    143:        0x0020600000000000ULL, 0x0060600000000000ULL,
                    144:        0x0020600000000000ULL, 0x0060600000000000ULL,
                    145:        0x0020600000000000ULL, 0x0060600000000000ULL,
                    146:        0x0020600000000000ULL, 0x0060600000000000ULL,
                    147:        0x0020600000000000ULL, 0x0060600000000000ULL,
                    148:        0x0020600000000000ULL, 0x0060600000000000ULL,
                    149:        0x0020600000000000ULL, 0x0060600000000000ULL,
                    150:        0x0020600000000000ULL, 0x0060600000000000ULL,
                    151:        0x0020600000000000ULL, 0x0000600000000000ULL,
                    152:        0x0040600000000000ULL, 0x0060600000000000ULL,
                    153: };
                    154:
                    155: /*
                    156:  * Constants to be programmed into Hercules's registers, to configure
                    157:  * the XGXS transciever.
                    158:  */
                    159: #define END_SIGN 0x0
                    160: static uint64_t herc_dtx_cfg[] = {
                    161:        0x8000051536750000ULL, 0x80000515367500E0ULL,
                    162:        0x8000051536750004ULL, 0x80000515367500E4ULL,
                    163:
                    164:        0x80010515003F0000ULL, 0x80010515003F00E0ULL,
                    165:        0x80010515003F0004ULL, 0x80010515003F00E4ULL,
                    166:
                    167:        0x801205150D440000ULL, 0x801205150D4400E0ULL,
                    168:        0x801205150D440004ULL, 0x801205150D4400E4ULL,
                    169:
                    170:        0x80020515F2100000ULL, 0x80020515F21000E0ULL,
                    171:        0x80020515F2100004ULL, 0x80020515F21000E4ULL,
                    172:
                    173:        END_SIGN
                    174: };
                    175:
                    176: struct xge_softc {
                    177:        struct device           sc_dev;
                    178:        struct arpcom           sc_arpcom;
                    179:        struct ifmedia          xena_media;
                    180:
                    181:        void                    *sc_ih;
                    182:        void                    *sc_shutdownhook;
                    183:
                    184:        bus_dma_tag_t           sc_dmat;
                    185:        bus_space_tag_t         sc_st;
                    186:        bus_space_handle_t      sc_sh;
                    187:        bus_space_tag_t         sc_txt;
                    188:        bus_space_handle_t      sc_txh;
                    189:
                    190:        pcireg_t                sc_pciregs[16];
                    191:
                    192:        int                     xge_type; /* chip type */
                    193:        int                     xge_if_flags;
                    194:
                    195:        /* Transmit structures */
                    196:        struct txd              *sc_txd[NTXDESCS]; /* transmit frags array */
                    197:        bus_addr_t              sc_txdp[NTXDESCS]; /* dva of transmit frags */
                    198:        bus_dmamap_t            sc_txm[NTXDESCS]; /* transmit frags map */
                    199:        struct mbuf             *sc_txb[NTXDESCS]; /* transmit mbuf pointer */
                    200:        int                     sc_nexttx, sc_lasttx;
                    201:        bus_dmamap_t            sc_txmap; /* transmit descriptor map */
                    202:
                    203:        /* Receive data */
                    204:        bus_dmamap_t            sc_rxmap; /* receive descriptor map */
                    205:        struct rxd_4k           *sc_rxd_4k[NRXPAGES]; /* receive desc pages */
                    206:        bus_dmamap_t            sc_rxm[NRXREAL]; /* receive buffer map */
                    207:        struct mbuf             *sc_rxb[NRXREAL]; /* mbufs on rx descriptors */
                    208:        int                     sc_nextrx; /* next descriptor to check */
                    209: };
                    210:
                    211: #ifdef XGE_DEBUG
                    212: #define DPRINTF(x)     do { if (xgedebug) printf x ; } while (0)
                    213: #define DPRINTFN(n,x)  do { if (xgedebug >= (n)) printf x ; } while (0)
                    214: int    xgedebug = 0;
                    215: #else
                    216: #define DPRINTF(x)
                    217: #define DPRINTFN(n,x)
                    218: #endif
                    219:
                    220: int xge_match(struct device *, void *, void *);
                    221: void xge_attach(struct device *, struct device *, void *);
                    222: int xge_alloc_txmem(struct xge_softc *);
                    223: int xge_alloc_rxmem(struct xge_softc *);
                    224: void xge_start(struct ifnet *);
                    225: void xge_stop(struct ifnet *, int);
                    226: void xge_shutdown(void *);
                    227: int xge_add_rxbuf(struct xge_softc *, int);
                    228: void xge_setmulti(struct xge_softc *);
                    229: void xge_setpromisc(struct xge_softc *);
                    230: int xge_setup_xgxs_xena(struct xge_softc *);
                    231: int xge_setup_xgxs_herc(struct xge_softc *);
                    232: int xge_ioctl(struct ifnet *, u_long, caddr_t);
                    233: int xge_init(struct ifnet *);
                    234: void xge_ifmedia_status(struct ifnet *, struct ifmediareq *);
                    235: int xge_xgmii_mediachange(struct ifnet *);
                    236: void xge_enable(struct xge_softc *);
                    237: int xge_intr(void  *);
                    238:
                    239: /*
                    240:  * Helpers to address registers.
                    241:  */
                    242: #define PIF_WCSR(csr, val)     pif_wcsr(sc, csr, val)
                    243: #define PIF_RCSR(csr)          pif_rcsr(sc, csr)
                    244: #define TXP_WCSR(csr, val)     txp_wcsr(sc, csr, val)
                    245: #define PIF_WKEY(csr, val)     pif_wkey(sc, csr, val)
                    246:
                    247: static inline void
                    248: pif_wcsr(struct xge_softc *sc, bus_size_t csr, uint64_t val)
                    249: {
                    250:        uint32_t lval, hval;
                    251:
                    252:        lval = val&0xffffffff;
                    253:        hval = val>>32;
                    254:
                    255:        bus_space_write_4(sc->sc_st, sc->sc_sh, csr, lval);
                    256:        bus_space_write_4(sc->sc_st, sc->sc_sh, csr+4, hval);
                    257: }
                    258:
                    259: static inline uint64_t
                    260: pif_rcsr(struct xge_softc *sc, bus_size_t csr)
                    261: {
                    262:        uint64_t val, val2;
                    263:
                    264:        val = bus_space_read_4(sc->sc_st, sc->sc_sh, csr);
                    265:        val2 = bus_space_read_4(sc->sc_st, sc->sc_sh, csr+4);
                    266:        val |= (val2 << 32);
                    267:        return (val);
                    268: }
                    269:
                    270: static inline void
                    271: txp_wcsr(struct xge_softc *sc, bus_size_t csr, uint64_t val)
                    272: {
                    273:        uint32_t lval, hval;
                    274:
                    275:        lval = val&0xffffffff;
                    276:        hval = val>>32;
                    277:
                    278:        bus_space_write_4(sc->sc_txt, sc->sc_txh, csr, lval);
                    279:        bus_space_write_4(sc->sc_txt, sc->sc_txh, csr+4, hval);
                    280: }
                    281:
                    282:
                    283: static inline void
                    284: pif_wkey(struct xge_softc *sc, bus_size_t csr, uint64_t val)
                    285: {
                    286:        uint32_t lval, hval;
                    287:
                    288:        lval = val&0xffffffff;
                    289:        hval = val>>32;
                    290:
                    291:        if (sc->xge_type == XGE_TYPE_XENA)
                    292:                PIF_WCSR(RMAC_CFG_KEY, RMAC_KEY_VALUE);
                    293:
                    294:        bus_space_write_4(sc->sc_st, sc->sc_sh, csr, lval);
                    295:
                    296:        if (sc->xge_type == XGE_TYPE_XENA)
                    297:                PIF_WCSR(RMAC_CFG_KEY, RMAC_KEY_VALUE);
                    298:
                    299:        bus_space_write_4(sc->sc_st, sc->sc_sh, csr+4, hval);
                    300: }
                    301:
                    302: struct cfattach xge_ca = {
                    303:        sizeof(struct xge_softc), xge_match, xge_attach
                    304: };
                    305:
                    306: struct cfdriver xge_cd = {
                    307:        0, "xge", DV_IFNET
                    308: };
                    309:
                    310: #define XNAME sc->sc_dev.dv_xname
                    311:
                    312: #define XGE_RXSYNC(desc, what) \
                    313:        bus_dmamap_sync(sc->sc_dmat, sc->sc_rxmap, \
                    314:        (desc/NDESC_BUFMODE) * XGE_PAGE + sizeof(struct rxdesc) * \
                    315:        (desc%NDESC_BUFMODE), sizeof(struct rxdesc), what)
                    316: #define XGE_RXD(desc)  &sc->sc_rxd_4k[desc/NDESC_BUFMODE]-> \
                    317:        r4_rxd[desc%NDESC_BUFMODE]
                    318:
                    319: /*
                    320:  * Non-tunable constants.
                    321:  */
                    322: #define XGE_MAX_FRAMELEN       9622
                    323: #define XGE_MAX_MTU            (XGE_MAX_FRAMELEN - ETHER_HDR_LEN - \
                    324:                                 ETHER_CRC_LEN - ETHER_VLAN_ENCAP_LEN)
                    325:
                    326: const struct pci_matchid xge_devices[] = {
                    327:        { PCI_VENDOR_NETERION, PCI_PRODUCT_NETERION_XFRAME },
                    328:        { PCI_VENDOR_NETERION, PCI_PRODUCT_NETERION_XFRAME_2 }
                    329: };
                    330:
                    331: int
                    332: xge_match(struct device *parent, void *match, void *aux)
                    333: {
                    334:        return (pci_matchbyid((struct pci_attach_args *)aux, xge_devices,
                    335:            sizeof(xge_devices)/sizeof(xge_devices[0])));
                    336: }
                    337:
                    338: void
                    339: xge_attach(struct device *parent, struct device *self, void *aux)
                    340: {
                    341:        struct pci_attach_args *pa = aux;
                    342:        struct xge_softc *sc;
                    343:        struct ifnet *ifp;
                    344:        pcireg_t memtype;
                    345:        pci_intr_handle_t ih;
                    346:        const char *intrstr = NULL;
                    347:        pci_chipset_tag_t pc = pa->pa_pc;
                    348:        uint8_t enaddr[ETHER_ADDR_LEN];
                    349:        uint64_t val;
                    350:        int i;
                    351:
                    352:        sc = (struct xge_softc *)self;
                    353:
                    354:        sc->sc_dmat = pa->pa_dmat;
                    355:
                    356:        if (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_NETERION_XFRAME)
                    357:                sc->xge_type = XGE_TYPE_XENA;
                    358:        else
                    359:                sc->xge_type = XGE_TYPE_HERC;
                    360:
                    361:        /* Get BAR0 address */
                    362:        memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, XGE_PIF_BAR);
                    363:        if (pci_mapreg_map(pa, XGE_PIF_BAR, memtype, 0,
                    364:            &sc->sc_st, &sc->sc_sh, 0, 0, 0)) {
                    365:                printf(": unable to map PIF BAR registers\n");
                    366:                return;
                    367:        }
                    368:
                    369:        memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, XGE_TXP_BAR);
                    370:        if (pci_mapreg_map(pa, XGE_TXP_BAR, memtype, 0,
                    371:            &sc->sc_txt, &sc->sc_txh, 0, 0, 0)) {
                    372:                printf(": unable to map TXP BAR registers\n");
                    373:                return;
                    374:        }
                    375:
                    376:        if (sc->xge_type == XGE_TYPE_XENA) {
                    377:                /* Save PCI config space */
                    378:                for (i = 0; i < XGE_PCISIZE_XENA; i += 4)
                    379:                        sc->sc_pciregs[i/4] = pci_conf_read(pa->pa_pc, pa->pa_tag, i);
                    380:        }
                    381:
                    382: #if BYTE_ORDER == LITTLE_ENDIAN
                    383:        val = (uint64_t)0xFFFFFFFFFFFFFFFFULL;
                    384:        val &= ~(TxF_R_SE|RxF_W_SE);
                    385:        PIF_WCSR(SWAPPER_CTRL, val);
                    386:        PIF_WCSR(SWAPPER_CTRL, val);
                    387: #endif
                    388:
                    389:        if ((val = PIF_RCSR(PIF_RD_SWAPPER_Fb)) != SWAPPER_MAGIC) {
                    390:                printf(": failed configuring endian, %llx != %llx!\n",
                    391:                    (unsigned long long)val, SWAPPER_MAGIC);
                    392:                return;
                    393:        }
                    394:
                    395:        /*
                    396:         * Fix for all "FFs" MAC address problems observed on
                    397:         * Alpha platforms. Not needed for Herc.
                    398:         */
                    399:        if (sc->xge_type == XGE_TYPE_XENA) {
                    400:                /*
                    401:                 * The MAC addr may be all FF's, which is not good.
                    402:                 * Resolve it by writing some magics to GPIO_CONTROL and
                    403:                 * force a chip reset to read in the serial eeprom again.
                    404:                 */
                    405:                for (i = 0; i < sizeof(fix_mac)/sizeof(fix_mac[0]); i++) {
                    406:                        PIF_WCSR(GPIO_CONTROL, fix_mac[i]);
                    407:                        PIF_RCSR(GPIO_CONTROL);
                    408:                }
                    409:
                    410:                /*
                    411:                 * Reset the chip and restore the PCI registers.
                    412:                 */
                    413:                PIF_WCSR(SW_RESET, 0xa5a5a50000000000ULL);
                    414:                DELAY(500000);
                    415:                for (i = 0; i < XGE_PCISIZE_XENA; i += 4)
                    416:                        pci_conf_write(pa->pa_pc, pa->pa_tag, i, sc->sc_pciregs[i/4]);
                    417:
                    418:                /*
                    419:                 * Restore the byte order registers.
                    420:                 */
                    421: #if BYTE_ORDER == LITTLE_ENDIAN
                    422:                val = (uint64_t)0xFFFFFFFFFFFFFFFFULL;
                    423:                val &= ~(TxF_R_SE|RxF_W_SE);
                    424:                PIF_WCSR(SWAPPER_CTRL, val);
                    425:                PIF_WCSR(SWAPPER_CTRL, val);
                    426: #endif
                    427:
                    428:                if ((val = PIF_RCSR(PIF_RD_SWAPPER_Fb)) != SWAPPER_MAGIC) {
                    429:                        printf(": failed configuring endian2, %llx != %llx!\n",
                    430:                            (unsigned long long)val, SWAPPER_MAGIC);
                    431:                        return;
                    432:                }
                    433:        }
                    434:
                    435:        /*
                    436:         * XGXS initialization.
                    437:         */
                    438:
                    439:        /*
                    440:         * For Herc, bring EOI out of reset before XGXS.
                    441:         */
                    442:        if (sc->xge_type == XGE_TYPE_HERC) {
                    443:                val = PIF_RCSR(SW_RESET);
                    444:                val &= 0xffff00ffffffffffULL;
                    445:                PIF_WCSR(SW_RESET,val);
                    446:                delay(1000*1000);       /* wait for 1 sec */
                    447:        }
                    448:
                    449:        /* 29, Bring adapter out of reset */
                    450:        val = PIF_RCSR(SW_RESET);
                    451:        val &= 0xffffff00ffffffffULL;
                    452:        PIF_WCSR(SW_RESET, val);
                    453:        DELAY(500000);
                    454:
                    455:        /* Ensure that it's safe to access registers by checking
                    456:         * RIC_RUNNING bit is reset. Check is valid only for XframeII.
                    457:         */
                    458:        if (sc->xge_type == XGE_TYPE_HERC){
                    459:                for (i = 0; i < 50; i++) {
                    460:                        val = PIF_RCSR(ADAPTER_STATUS);
                    461:                        if (!(val & RIC_RUNNING))
                    462:                                break;
                    463:                        delay(20*1000);
                    464:                }
                    465:
                    466:                if (i == 50) {
                    467:                        printf(": not safe to access registers\n");
                    468:                        return;
                    469:                }
                    470:        }
                    471:
                    472:        /* 30, configure XGXS transceiver */
                    473:        if (sc->xge_type == XGE_TYPE_XENA)
                    474:                xge_setup_xgxs_xena(sc);
                    475:        else if(sc->xge_type == XGE_TYPE_HERC)
                    476:                xge_setup_xgxs_herc(sc);
                    477:
                    478:        /* 33, program MAC address (not needed here) */
                    479:        /* Get ethernet address */
                    480:        PIF_WCSR(RMAC_ADDR_CMD_MEM,
                    481:            RMAC_ADDR_CMD_MEM_STR|RMAC_ADDR_CMD_MEM_OFF(0));
                    482:        while (PIF_RCSR(RMAC_ADDR_CMD_MEM) & RMAC_ADDR_CMD_MEM_STR)
                    483:                ;
                    484:        val = PIF_RCSR(RMAC_ADDR_DATA0_MEM);
                    485:        for (i = 0; i < ETHER_ADDR_LEN; i++)
                    486:                enaddr[i] = (uint8_t)(val >> (56 - (8*i)));
                    487:
                    488:        /*
                    489:         * Get memory for transmit descriptor lists.
                    490:         */
                    491:        if (xge_alloc_txmem(sc)) {
                    492:                printf(": failed allocating txmem.\n");
                    493:                return;
                    494:        }
                    495:
                    496:        /* 9 and 10 - set FIFO number/prio */
                    497:        PIF_WCSR(TX_FIFO_P0, TX_FIFO_LEN0(NTXDESCS));
                    498:        PIF_WCSR(TX_FIFO_P1, 0ULL);
                    499:        PIF_WCSR(TX_FIFO_P2, 0ULL);
                    500:        PIF_WCSR(TX_FIFO_P3, 0ULL);
                    501:
                    502:        /* 11, XXX set round-robin prio? */
                    503:
                    504:        /* 12, enable transmit FIFO */
                    505:        val = PIF_RCSR(TX_FIFO_P0);
                    506:        val |= TX_FIFO_ENABLE;
                    507:        PIF_WCSR(TX_FIFO_P0, val);
                    508:
                    509:        /* 13, disable some error checks */
                    510:        PIF_WCSR(TX_PA_CFG,
                    511:            TX_PA_CFG_IFR|TX_PA_CFG_ISO|TX_PA_CFG_ILC|TX_PA_CFG_ILE);
                    512:
                    513:        /* Create transmit DMA maps */
                    514:        for (i = 0; i < NTXDESCS; i++) {
                    515:                if (bus_dmamap_create(sc->sc_dmat, XGE_MAX_FRAMELEN,
                    516:                    NTXFRAGS, MCLBYTES, 0, BUS_DMA_NOWAIT, &sc->sc_txm[i])) {
                    517:                        printf(": cannot create TX DMA maps\n");
                    518:                        return;
                    519:                }
                    520:        }
                    521:
                    522:        sc->sc_lasttx = NTXDESCS-1;
                    523:
                    524:        /*
                    525:         * RxDMA initialization.
                    526:         * Only use one out of 8 possible receive queues.
                    527:         */
                    528:        /* allocate rx descriptor memory */
                    529:        if (xge_alloc_rxmem(sc)) {
                    530:                printf(": failed allocating rxmem\n");
                    531:                return;
                    532:        }
                    533:
                    534:        /* Create receive buffer DMA maps */
                    535:        for (i = 0; i < NRXREAL; i++) {
                    536:                if (bus_dmamap_create(sc->sc_dmat, XGE_MAX_FRAMELEN,
                    537:                    NRXFRAGS, MCLBYTES, 0, BUS_DMA_NOWAIT, &sc->sc_rxm[i])) {
                    538:                        printf(": cannot create RX DMA maps\n");
                    539:                        return;
                    540:                }
                    541:        }
                    542:
                    543:        /* allocate mbufs to receive descriptors */
                    544:        for (i = 0; i < NRXREAL; i++)
                    545:                if (xge_add_rxbuf(sc, i))
                    546:                        panic("out of mbufs too early");
                    547:
                    548:        /* 14, setup receive ring priority */
                    549:        PIF_WCSR(RX_QUEUE_PRIORITY, 0ULL); /* only use one ring */
                    550:
                    551:        /* 15, setup receive ring round-robin calendar */
                    552:        PIF_WCSR(RX_W_ROUND_ROBIN_0, 0ULL); /* only use one ring */
                    553:        PIF_WCSR(RX_W_ROUND_ROBIN_1, 0ULL);
                    554:        PIF_WCSR(RX_W_ROUND_ROBIN_2, 0ULL);
                    555:        PIF_WCSR(RX_W_ROUND_ROBIN_3, 0ULL);
                    556:        PIF_WCSR(RX_W_ROUND_ROBIN_4, 0ULL);
                    557:
                    558:        /* 16, write receive ring start address */
                    559:        PIF_WCSR(PRC_RXD0_0, (uint64_t)sc->sc_rxmap->dm_segs[0].ds_addr);
                    560:        /* PRC_RXD0_[1-7] are not used */
                    561:
                    562:        /* 17, Setup alarm registers */
                    563:        PIF_WCSR(PRC_ALARM_ACTION, 0ULL); /* Default everything to retry */
                    564:
                    565:        /* 18, init receive ring controller */
                    566: #if RX_MODE == RX_MODE_1
                    567:        val = RING_MODE_1;
                    568: #elif RX_MODE == RX_MODE_3
                    569:        val = RING_MODE_3;
                    570: #else /* RX_MODE == RX_MODE_5 */
                    571:        val = RING_MODE_5;
                    572: #endif
                    573:        PIF_WCSR(PRC_CTRL_0, RC_IN_SVC|val);
                    574:        /* leave 1-7 disabled */
                    575:        /* XXXX snoop configuration? */
                    576:
                    577:        /* 19, set chip memory assigned to the queue */
                    578:        if (sc->xge_type == XGE_TYPE_XENA) {
                    579:                /* all 64M to queue 0 */
                    580:                PIF_WCSR(RX_QUEUE_CFG, MC_QUEUE(0, 64));
                    581:        } else {
                    582:                /* all 32M to queue 0 */
                    583:                PIF_WCSR(RX_QUEUE_CFG, MC_QUEUE(0, 32));
                    584:        }
                    585:
                    586:        /* 20, setup RLDRAM parameters */
                    587:        /* do not touch it for now */
                    588:
                    589:        /* 21, setup pause frame thresholds */
                    590:        /* so not touch the defaults */
                    591:        /* XXX - must 0xff be written as stated in the manual? */
                    592:
                    593:        /* 22, configure RED */
                    594:        /* we do not want to drop packets, so ignore */
                    595:
                    596:        /* 23, initiate RLDRAM */
                    597:        val = PIF_RCSR(MC_RLDRAM_MRS);
                    598:        val |= MC_QUEUE_SIZE_ENABLE|MC_RLDRAM_MRS_ENABLE;
                    599:        PIF_WCSR(MC_RLDRAM_MRS, val);
                    600:        DELAY(1000);
                    601:
                    602:        /*
                    603:         * Setup interrupt policies.
                    604:         */
                    605:        /* 40, Transmit interrupts */
                    606:        PIF_WCSR(TTI_DATA1_MEM, TX_TIMER_VAL(0x1ff) | TX_TIMER_AC |
                    607:            TX_URNG_A(5) | TX_URNG_B(20) | TX_URNG_C(48));
                    608:        PIF_WCSR(TTI_DATA2_MEM,
                    609:            TX_UFC_A(25) | TX_UFC_B(64) | TX_UFC_C(128) | TX_UFC_D(512));
                    610:        PIF_WCSR(TTI_COMMAND_MEM, TTI_CMD_MEM_WE | TTI_CMD_MEM_STROBE);
                    611:        while (PIF_RCSR(TTI_COMMAND_MEM) & TTI_CMD_MEM_STROBE)
                    612:                ;
                    613:
                    614:        /* 41, Receive interrupts */
                    615:        PIF_WCSR(RTI_DATA1_MEM, RX_TIMER_VAL(0x800) | RX_TIMER_AC |
                    616:            RX_URNG_A(5) | RX_URNG_B(20) | RX_URNG_C(50));
                    617:        PIF_WCSR(RTI_DATA2_MEM,
                    618:            RX_UFC_A(64) | RX_UFC_B(128) | RX_UFC_C(256) | RX_UFC_D(512));
                    619:        PIF_WCSR(RTI_COMMAND_MEM, RTI_CMD_MEM_WE | RTI_CMD_MEM_STROBE);
                    620:        while (PIF_RCSR(RTI_COMMAND_MEM) & RTI_CMD_MEM_STROBE)
                    621:                ;
                    622:
                    623:        /*
                    624:         * Setup media stuff.
                    625:         */
                    626:        ifmedia_init(&sc->xena_media, IFM_IMASK, xge_xgmii_mediachange,
                    627:            xge_ifmedia_status);
                    628:        ifmedia_add(&sc->xena_media, IFM_ETHER|IFM_10G_SR, 0, NULL);
                    629:        ifmedia_set(&sc->xena_media, IFM_ETHER|IFM_10G_SR);
                    630:
                    631:        ifp = &sc->sc_arpcom.ac_if;
                    632:        strlcpy(ifp->if_xname, XNAME, IFNAMSIZ);
                    633:        memcpy(sc->sc_arpcom.ac_enaddr, enaddr, ETHER_ADDR_LEN);
                    634:        ifp->if_baudrate = 1000000000;
                    635:        ifp->if_softc = sc;
                    636:        ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
                    637:        ifp->if_ioctl = xge_ioctl;
                    638:        ifp->if_start = xge_start;
                    639: #ifdef XGE_JUMBO
                    640:        ifp->if_hardmtu = XGE_MAX_MTU;
                    641: #endif
                    642:        IFQ_SET_MAXLEN(&ifp->if_snd, NTXDESCS - 1);
                    643:        IFQ_SET_READY(&ifp->if_snd);
                    644:
                    645:        ifp->if_capabilities = IFCAP_VLAN_MTU | IFCAP_CSUM_IPv4 |
                    646:                               IFCAP_CSUM_TCPv4 | IFCAP_CSUM_UDPv4;
                    647:
                    648: #if NVLAN > 0
                    649:        ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING;
                    650: #endif
                    651:
                    652:        /*
                    653:         * Attach the interface.
                    654:         */
                    655:        if_attach(ifp);
                    656:        ether_ifattach(ifp);
                    657:
                    658:        sc->sc_shutdownhook = shutdownhook_establish(xge_shutdown, sc);
                    659:
                    660:        /*
                    661:         * Setup interrupt vector before initializing.
                    662:         */
                    663:        if (pci_intr_map(pa, &ih)) {
                    664:                printf(": unable to map interrupt\n");
                    665:                return;
                    666:        }
                    667:        intrstr = pci_intr_string(pc, ih);
                    668:        if ((sc->sc_ih =
                    669:            pci_intr_establish(pc, ih, IPL_NET, xge_intr, sc, XNAME)) == NULL) {
                    670:                printf(": unable to establish interrupt at %s\n",
                    671:                    intrstr ? intrstr : "<unknown>");
                    672:                return;
                    673:            }
                    674:        printf(": %s, address %s\n", intrstr, ether_sprintf(enaddr));
                    675: }
                    676:
                    677: void
                    678: xge_ifmedia_status(struct ifnet *ifp, struct ifmediareq *ifmr)
                    679: {
                    680:        struct xge_softc *sc = ifp->if_softc;
                    681:        uint64_t reg;
                    682:
                    683:        ifmr->ifm_status = IFM_AVALID;
                    684:        ifmr->ifm_active = IFM_ETHER|IFM_10G_SR;
                    685:
                    686:        reg = PIF_RCSR(ADAPTER_STATUS);
                    687:        if ((reg & (RMAC_REMOTE_FAULT|RMAC_LOCAL_FAULT)) == 0)
                    688:                ifmr->ifm_status |= IFM_ACTIVE;
                    689: }
                    690:
                    691: int
                    692: xge_xgmii_mediachange(struct ifnet *ifp)
                    693: {
                    694:        return (0);
                    695: }
                    696:
                    697: void
                    698: xge_enable(struct xge_softc *sc)
                    699: {
                    700:        uint64_t val;
                    701:
                    702:        /* 2, enable adapter */
                    703:        val = PIF_RCSR(ADAPTER_CONTROL);
                    704:        val |= ADAPTER_EN;
                    705:        PIF_WCSR(ADAPTER_CONTROL, val);
                    706:
                    707:        /* 3, light the card enable led */
                    708:        val = PIF_RCSR(ADAPTER_CONTROL);
                    709:        val |= LED_ON;
                    710:        PIF_WCSR(ADAPTER_CONTROL, val);
                    711: #ifdef XGE_DEBUG
                    712:        printf("%s: link up\n", XNAME);
                    713: #endif
                    714: }
                    715:
                    716: int
                    717: xge_init(struct ifnet *ifp)
                    718: {
                    719:        struct xge_softc *sc = ifp->if_softc;
                    720:        uint64_t val;
                    721:        int s;
                    722:
                    723:        s = splnet();
                    724:
                    725:        /*
                    726:         * Cancel any pending I/O
                    727:         */
                    728:        xge_stop(ifp, 0);
                    729:
                    730:        /* 31+32, setup MAC config */
                    731:        PIF_WKEY(MAC_CFG, TMAC_EN|RMAC_EN|TMAC_APPEND_PAD|RMAC_STRIP_FCS|
                    732:            RMAC_BCAST_EN|RMAC_DISCARD_PFRM);
                    733:
                    734:        DELAY(1000);
                    735:
                    736:        /* 54, ensure that the adapter is 'quiescent' */
                    737:        val = PIF_RCSR(ADAPTER_STATUS);
                    738:        if ((val & QUIESCENT) != QUIESCENT) {
                    739: #if 0
                    740:                char buf[200];
                    741: #endif
                    742:                printf("%s: adapter not quiescent, aborting\n", XNAME);
                    743:                val = (val & QUIESCENT) ^ QUIESCENT;
                    744: #if 0
                    745:                bitmask_snprintf(val, QUIESCENT_BMSK, buf, sizeof buf);
                    746:                printf("%s: ADAPTER_STATUS missing bits %s\n", XNAME, buf);
                    747: #endif
                    748:                splx(s);
                    749:                return (1);
                    750:        }
                    751:
                    752:        /* disable VLAN tag stripping */
                    753:        val = PIF_RCSR(RX_PA_CFG);
                    754:        val &= ~STRIP_VLAN_TAG;
                    755:        PIF_WCSR(RX_PA_CFG, val);
                    756:
                    757:        /* set MRU */
                    758: #ifdef XGE_JUMBO
                    759:        PIF_WCSR(RMAC_MAX_PYLD_LEN, RMAC_PYLD_LEN(XGE_MAX_FRAMELEN));
                    760: #else
                    761:        PIF_WCSR(RMAC_MAX_PYLD_LEN, RMAC_PYLD_LEN(ETHER_MAX_LEN + ETHER_VLAN_ENCAP_LEN));
                    762: #endif
                    763:
                    764:        /* 56, enable the transmit laser */
                    765:        val = PIF_RCSR(ADAPTER_CONTROL);
                    766:        val |= EOI_TX_ON;
                    767:        PIF_WCSR(ADAPTER_CONTROL, val);
                    768:
                    769:        xge_enable(sc);
                    770:
                    771:        /*
                    772:         * Enable all interrupts
                    773:         */
                    774:        PIF_WCSR(TX_TRAFFIC_MASK, 0);
                    775:        PIF_WCSR(RX_TRAFFIC_MASK, 0);
                    776:        PIF_WCSR(GENERAL_INT_MASK, 0);
                    777:        PIF_WCSR(TXPIC_INT_MASK, 0);
                    778:        PIF_WCSR(RXPIC_INT_MASK, 0);
                    779:
                    780:        PIF_WCSR(MAC_INT_MASK, MAC_TMAC_INT); /* only from RMAC */
                    781:        PIF_WCSR(MAC_RMAC_ERR_MASK, ~RMAC_LINK_STATE_CHANGE_INT);
                    782:
                    783:        xge_setpromisc(sc);
                    784:
                    785:        xge_setmulti(sc);
                    786:
                    787:        /* Done... */
                    788:        ifp->if_flags |= IFF_RUNNING;
                    789:        ifp->if_flags &= ~IFF_OACTIVE;
                    790:
                    791:        splx(s);
                    792:
                    793:        return (0);
                    794: }
                    795:
                    796: void
                    797: xge_stop(struct ifnet *ifp, int disable)
                    798: {
                    799:        struct xge_softc *sc = ifp->if_softc;
                    800:        uint64_t val;
                    801:
                    802:        ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
                    803:
                    804:        val = PIF_RCSR(ADAPTER_CONTROL);
                    805:        val &= ~ADAPTER_EN;
                    806:        PIF_WCSR(ADAPTER_CONTROL, val);
                    807:
                    808:        while ((PIF_RCSR(ADAPTER_STATUS) & QUIESCENT) != QUIESCENT)
                    809:                ;
                    810: }
                    811:
                    812: void
                    813: xge_shutdown(void *pv)
                    814: {
                    815:        struct xge_softc *sc = (struct xge_softc *)pv;
                    816:        struct ifnet *ifp = &sc->sc_arpcom.ac_if;
                    817:
                    818:        xge_stop(ifp, 1);
                    819: }
                    820:
                    821: int
                    822: xge_intr(void *pv)
                    823: {
                    824:        struct xge_softc *sc = pv;
                    825:        struct txd *txd;
                    826:        struct ifnet *ifp = &sc->sc_arpcom.ac_if;
                    827:        bus_dmamap_t dmp;
                    828:        uint64_t val;
                    829:        int i, lasttx, plen;
                    830:
                    831:        val = PIF_RCSR(GENERAL_INT_STATUS);
                    832:        if (val == 0)
                    833:                return (0); /* no interrupt here */
                    834:
                    835:        PIF_WCSR(GENERAL_INT_STATUS, val);
                    836:
                    837:        if ((val = PIF_RCSR(MAC_RMAC_ERR_REG)) & RMAC_LINK_STATE_CHANGE_INT) {
                    838:                /* Wait for quiescence */
                    839: #ifdef XGE_DEBUG
                    840:                printf("%s: link down\n", XNAME);
                    841: #endif
                    842:                while ((PIF_RCSR(ADAPTER_STATUS) & QUIESCENT) != QUIESCENT)
                    843:                        ;
                    844:                PIF_WCSR(MAC_RMAC_ERR_REG, RMAC_LINK_STATE_CHANGE_INT);
                    845:
                    846:                val = PIF_RCSR(ADAPTER_STATUS);
                    847:                if ((val & (RMAC_REMOTE_FAULT|RMAC_LOCAL_FAULT)) == 0)
                    848:                        xge_enable(sc); /* Only if link restored */
                    849:        }
                    850:
                    851:        if ((val = PIF_RCSR(TX_TRAFFIC_INT)))
                    852:                PIF_WCSR(TX_TRAFFIC_INT, val); /* clear interrupt bits */
                    853:        /*
                    854:         * Collect sent packets.
                    855:         */
                    856:        lasttx = sc->sc_lasttx;
                    857:        while ((i = NEXTTX(sc->sc_lasttx)) != sc->sc_nexttx) {
                    858:                txd = sc->sc_txd[i];
                    859:                dmp = sc->sc_txm[i];
                    860:
                    861:                bus_dmamap_sync(sc->sc_dmat, dmp, 0,
                    862:                    dmp->dm_mapsize,
                    863:                    BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
                    864:
                    865:                if (txd->txd_control1 & TXD_CTL1_OWN) {
                    866:                        bus_dmamap_sync(sc->sc_dmat, dmp, 0,
                    867:                            dmp->dm_mapsize, BUS_DMASYNC_PREREAD);
                    868:                        break;
                    869:                }
                    870:                bus_dmamap_unload(sc->sc_dmat, dmp);
                    871:                m_freem(sc->sc_txb[i]);
                    872:                ifp->if_opackets++;
                    873:                sc->sc_lasttx = i;
                    874:        }
                    875:
                    876:        if (sc->sc_lasttx != lasttx)
                    877:                ifp->if_flags &= ~IFF_OACTIVE;
                    878:
                    879:        /* Try to get more packets on the wire */
                    880:        xge_start(ifp);
                    881:
                    882:        /* clear interrupt bits */
                    883:        if ((val = PIF_RCSR(RX_TRAFFIC_INT)))
                    884:                PIF_WCSR(RX_TRAFFIC_INT, val);
                    885:
                    886:        for (;;) {
                    887:                struct rxdesc *rxd;
                    888:                struct mbuf *m;
                    889:
                    890:                XGE_RXSYNC(sc->sc_nextrx,
                    891:                    BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
                    892:
                    893:                rxd = XGE_RXD(sc->sc_nextrx);
                    894:                if (rxd->rxd_control1 & RXD_CTL1_OWN) {
                    895:                        XGE_RXSYNC(sc->sc_nextrx, BUS_DMASYNC_PREREAD);
                    896:                        break;
                    897:                }
                    898:
                    899:                /* got a packet */
                    900:                m = sc->sc_rxb[sc->sc_nextrx];
                    901: #if RX_MODE == RX_MODE_1
                    902:                plen = m->m_len = RXD_CTL2_BUF0SIZ(rxd->rxd_control2);
                    903: #elif RX_MODE == RX_MODE_3
                    904: #error Fix rxmodes in xge_intr
                    905: #elif RX_MODE == RX_MODE_5
                    906:                plen = m->m_len = RXD_CTL2_BUF0SIZ(rxd->rxd_control2);
                    907:                plen += m->m_next->m_len = RXD_CTL2_BUF1SIZ(rxd->rxd_control2);
                    908:                plen += m->m_next->m_next->m_len =
                    909:                    RXD_CTL2_BUF2SIZ(rxd->rxd_control2);
                    910:                plen += m->m_next->m_next->m_next->m_len =
                    911:                    RXD_CTL3_BUF3SIZ(rxd->rxd_control3);
                    912:                plen += m->m_next->m_next->m_next->m_next->m_len =
                    913:                    RXD_CTL3_BUF4SIZ(rxd->rxd_control3);
                    914: #endif
                    915:                m->m_pkthdr.rcvif = ifp;
                    916:                m->m_pkthdr.len = plen;
                    917:
                    918:                val = rxd->rxd_control1;
                    919:
                    920:                if (xge_add_rxbuf(sc, sc->sc_nextrx)) {
                    921:                        /* Failed, recycle this mbuf */
                    922: #if RX_MODE == RX_MODE_1
                    923:                        rxd->rxd_control2 = RXD_MKCTL2(MCLBYTES, 0, 0);
                    924:                        rxd->rxd_control1 = RXD_CTL1_OWN;
                    925: #elif RX_MODE == RX_MODE_3
                    926: #elif RX_MODE == RX_MODE_5
                    927: #endif
                    928:                        XGE_RXSYNC(sc->sc_nextrx,
                    929:                            BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
                    930:                        ifp->if_ierrors++;
                    931:                        break;
                    932:                }
                    933:
                    934:                ifp->if_ipackets++;
                    935:
                    936:                if (RXD_CTL1_PROTOS(val) & RXD_CTL1_P_IPv4)
                    937:                        m->m_pkthdr.csum_flags |= M_IPV4_CSUM_IN_OK;
                    938:                if (RXD_CTL1_PROTOS(val) & RXD_CTL1_P_TCP)
                    939:                        m->m_pkthdr.csum_flags |= M_TCP_CSUM_IN_OK;
                    940:                if (RXD_CTL1_PROTOS(val) & RXD_CTL1_P_UDP)
                    941:                        m->m_pkthdr.csum_flags |= M_UDP_CSUM_IN_OK;
                    942:
                    943: #if NBPFILTER > 0
                    944:                if (ifp->if_bpf)
                    945:                        bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_IN);
                    946: #endif /* NBPFILTER > 0 */
                    947:
                    948:                ether_input_mbuf(ifp, m);
                    949:
                    950:                if (++sc->sc_nextrx == NRXREAL)
                    951:                        sc->sc_nextrx = 0;
                    952:        }
                    953:
                    954:        return (1);
                    955: }
                    956:
                    957: int
                    958: xge_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
                    959: {
                    960:        struct xge_softc *sc = ifp->if_softc;
                    961:        struct ifreq *ifr = (struct ifreq *) data;
                    962:        struct ifaddr *ifa = (struct ifaddr *)data;
                    963:        int s, error = 0;
                    964:
                    965:        s = splnet();
                    966:
                    967:        if ((error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data)) > 0) {
                    968:                splx(s);
                    969:                return (error);
                    970:        }
                    971:
                    972:        switch (cmd) {
                    973:        case SIOCSIFADDR:
                    974:                ifp->if_flags |= IFF_UP;
                    975:                if (!(ifp->if_flags & IFF_RUNNING))
                    976:                        xge_init(ifp);
                    977: #ifdef INET
                    978:                if (ifa->ifa_addr->sa_family == AF_INET)
                    979:                        arp_ifinit(&sc->sc_arpcom, ifa);
                    980: #endif /* INET */
                    981:                break;
                    982:        case SIOCSIFMTU:
                    983:                if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > ifp->if_hardmtu)
                    984:                        error = EINVAL;
                    985:                else if (ifp->if_mtu != ifr->ifr_mtu)
                    986:                        ifp->if_mtu = ifr->ifr_mtu;
                    987:                break;
                    988:        case SIOCSIFFLAGS:
                    989:                if (ifp->if_flags & IFF_UP) {
                    990:                        if (ifp->if_flags & IFF_RUNNING &&
                    991:                            (ifp->if_flags ^ sc->xge_if_flags) &
                    992:                             IFF_PROMISC) {
                    993:                                xge_setpromisc(sc);
                    994:                        } else {
                    995:                                if (!(ifp->if_flags & IFF_RUNNING))
                    996:                                        xge_init(ifp);
                    997:                        }
                    998:                 } else {
                    999:                        if (ifp->if_flags & IFF_RUNNING)
                   1000:                                xge_stop(ifp, 1);
                   1001:                }
                   1002:                sc->xge_if_flags = ifp->if_flags;
                   1003:                break;
                   1004:        case SIOCADDMULTI:
                   1005:        case SIOCDELMULTI:
                   1006:                error = (cmd == SIOCADDMULTI)
                   1007:                        ? ether_addmulti(ifr, &sc->sc_arpcom)
                   1008:                        : ether_delmulti(ifr, &sc->sc_arpcom);
                   1009:
                   1010:                 if (error == ENETRESET) {
                   1011:                         if (ifp->if_flags & IFF_RUNNING)
                   1012:                                xge_setmulti(sc);
                   1013:                        error = 0;
                   1014:                }
                   1015:                break;
                   1016:        case SIOCGIFMEDIA:
                   1017:        case SIOCSIFMEDIA:
                   1018:                error = ifmedia_ioctl(ifp, ifr, &sc->xena_media, cmd);
                   1019:                break;
                   1020:        default:
                   1021:                error = ENOTTY;
                   1022:        }
                   1023:
                   1024:        splx(s);
                   1025:
                   1026:        return (error);
                   1027: }
                   1028:
                   1029: void
                   1030: xge_setmulti(struct xge_softc *sc)
                   1031: {
                   1032:        struct ifnet *ifp = &sc->sc_arpcom.ac_if;
                   1033:        struct arpcom *ac = &sc->sc_arpcom;
                   1034:        struct ether_multi *enm;
                   1035:        struct ether_multistep step;
                   1036:        int i, numaddr = 1; /* first slot used for card unicast address */
                   1037:        uint64_t val;
                   1038:
                   1039:        ETHER_FIRST_MULTI(step, ac, enm);
                   1040:        while (enm != NULL) {
                   1041:                if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
                   1042:                        /* Skip ranges */
                   1043:                        goto allmulti;
                   1044:                }
                   1045:                if (numaddr == MAX_MCAST_ADDR)
                   1046:                        goto allmulti;
                   1047:                for (val = 0, i = 0; i < ETHER_ADDR_LEN; i++) {
                   1048:                        val <<= 8;
                   1049:                        val |= enm->enm_addrlo[i];
                   1050:                }
                   1051:                PIF_WCSR(RMAC_ADDR_DATA0_MEM, val << 16);
                   1052:                PIF_WCSR(RMAC_ADDR_DATA1_MEM, 0xFFFFFFFFFFFFFFFFULL);
                   1053:                PIF_WCSR(RMAC_ADDR_CMD_MEM, RMAC_ADDR_CMD_MEM_WE|
                   1054:                    RMAC_ADDR_CMD_MEM_STR|RMAC_ADDR_CMD_MEM_OFF(numaddr));
                   1055:                while (PIF_RCSR(RMAC_ADDR_CMD_MEM) & RMAC_ADDR_CMD_MEM_STR)
                   1056:                        ;
                   1057:                numaddr++;
                   1058:                ETHER_NEXT_MULTI(step, enm);
                   1059:        }
                   1060:        /* set the remaining entries to the broadcast address */
                   1061:        for (i = numaddr; i < MAX_MCAST_ADDR; i++) {
                   1062:                PIF_WCSR(RMAC_ADDR_DATA0_MEM, 0xffffffffffff0000ULL);
                   1063:                PIF_WCSR(RMAC_ADDR_DATA1_MEM, 0xFFFFFFFFFFFFFFFFULL);
                   1064:                PIF_WCSR(RMAC_ADDR_CMD_MEM, RMAC_ADDR_CMD_MEM_WE|
                   1065:                    RMAC_ADDR_CMD_MEM_STR|RMAC_ADDR_CMD_MEM_OFF(i));
                   1066:                while (PIF_RCSR(RMAC_ADDR_CMD_MEM) & RMAC_ADDR_CMD_MEM_STR)
                   1067:                        ;
                   1068:        }
                   1069:        ifp->if_flags &= ~IFF_ALLMULTI;
                   1070:        return;
                   1071:
                   1072: allmulti:
                   1073:        /* Just receive everything with the multicast bit set */
                   1074:        ifp->if_flags |= IFF_ALLMULTI;
                   1075:        PIF_WCSR(RMAC_ADDR_DATA0_MEM, 0x8000000000000000ULL);
                   1076:        PIF_WCSR(RMAC_ADDR_DATA1_MEM, 0xF000000000000000ULL);
                   1077:        PIF_WCSR(RMAC_ADDR_CMD_MEM, RMAC_ADDR_CMD_MEM_WE|
                   1078:            RMAC_ADDR_CMD_MEM_STR|RMAC_ADDR_CMD_MEM_OFF(1));
                   1079:        while (PIF_RCSR(RMAC_ADDR_CMD_MEM) & RMAC_ADDR_CMD_MEM_STR)
                   1080:                ;
                   1081: }
                   1082:
                   1083: void
                   1084: xge_setpromisc(struct xge_softc *sc)
                   1085: {
                   1086:        struct ifnet *ifp = &sc->sc_arpcom.ac_if;
                   1087:        uint64_t val;
                   1088:
                   1089:        val = PIF_RCSR(MAC_CFG);
                   1090:
                   1091:        if (ifp->if_flags & IFF_PROMISC)
                   1092:                val |= RMAC_PROM_EN;
                   1093:        else
                   1094:                val &= ~RMAC_PROM_EN;
                   1095:
                   1096:        PIF_WCSR(MAC_CFG, val);
                   1097: }
                   1098:
                   1099: void
                   1100: xge_start(struct ifnet *ifp)
                   1101: {
                   1102:        struct xge_softc *sc = ifp->if_softc;
                   1103:        struct txd *txd = NULL; /* XXX - gcc */
                   1104:        bus_dmamap_t dmp;
                   1105:        struct  mbuf *m;
                   1106:        uint64_t par, lcr;
                   1107:        int nexttx = 0, ntxd, error, i;
                   1108: #if NVLAN > 0
                   1109:        struct ifvlan *ifv = NULL;
                   1110: #endif
                   1111:
                   1112:        if ((ifp->if_flags & (IFF_RUNNING|IFF_OACTIVE)) != IFF_RUNNING)
                   1113:                return;
                   1114:
                   1115:        par = lcr = 0;
                   1116:        for (;;) {
                   1117:                IFQ_POLL(&ifp->if_snd, m);
                   1118:                if (m == NULL)
                   1119:                        break;  /* out of packets */
                   1120:
                   1121:                if (sc->sc_nexttx == sc->sc_lasttx)
                   1122:                        break;  /* No more space */
                   1123:
                   1124:                nexttx = sc->sc_nexttx;
                   1125:                dmp = sc->sc_txm[nexttx];
                   1126:
                   1127:                if ((error = bus_dmamap_load_mbuf(sc->sc_dmat, dmp, m,
                   1128:                    BUS_DMA_WRITE|BUS_DMA_NOWAIT)) != 0) {
                   1129:                        printf("%s: bus_dmamap_load_mbuf error %d\n",
                   1130:                            XNAME, error);
                   1131:                        break;
                   1132:                }
                   1133:                IFQ_DEQUEUE(&ifp->if_snd, m);
                   1134:
                   1135:                bus_dmamap_sync(sc->sc_dmat, dmp, 0, dmp->dm_mapsize,
                   1136:                    BUS_DMASYNC_PREWRITE);
                   1137:
                   1138:                txd = sc->sc_txd[nexttx];
                   1139:                sc->sc_txb[nexttx] = m;
                   1140:                for (i = 0; i < dmp->dm_nsegs; i++) {
                   1141:                        if (dmp->dm_segs[i].ds_len == 0)
                   1142:                                continue;
                   1143:                        txd->txd_control1 = dmp->dm_segs[i].ds_len;
                   1144:                        txd->txd_control2 = 0;
                   1145:                        txd->txd_bufaddr = dmp->dm_segs[i].ds_addr;
                   1146:                        txd++;
                   1147:                }
                   1148:                ntxd = txd - sc->sc_txd[nexttx] - 1;
                   1149:                txd = sc->sc_txd[nexttx];
                   1150:                txd->txd_control1 |= TXD_CTL1_OWN|TXD_CTL1_GCF;
                   1151:                txd->txd_control2 = TXD_CTL2_UTIL;
                   1152:
                   1153: #if NVLAN > 0
                   1154:                if ((m->m_flags & (M_PROTO1|M_PKTHDR)) == (M_PROTO1|M_PKTHDR) &&
                   1155:                    m->m_pkthdr.rcvif != NULL) {
                   1156:                        ifv = m->m_pkthdr.rcvif->if_softc;
                   1157:
                   1158:                        txd->txd_control2 |= TXD_CTL2_VLANE;
                   1159:                        txd->txd_control2 |= TXD_CTL2_VLANT(ifv->ifv_tag);
                   1160:                }
                   1161: #endif
                   1162:
                   1163:                if (m->m_pkthdr.csum_flags & M_IPV4_CSUM_OUT)
                   1164:                        txd->txd_control2 |= TXD_CTL2_CIPv4;
                   1165:                if (m->m_pkthdr.csum_flags & M_TCPV4_CSUM_OUT)
                   1166:                        txd->txd_control2 |= TXD_CTL2_CTCP;
                   1167:                if (m->m_pkthdr.csum_flags & M_UDPV4_CSUM_OUT)
                   1168:                        txd->txd_control2 |= TXD_CTL2_CUDP;
                   1169:
                   1170:                txd[ntxd].txd_control1 |= TXD_CTL1_GCL;
                   1171:
                   1172:                bus_dmamap_sync(sc->sc_dmat, dmp, 0, dmp->dm_mapsize,
                   1173:                    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
                   1174:
                   1175:                par = sc->sc_txdp[nexttx];
                   1176:                lcr = TXDL_NUMTXD(ntxd) | TXDL_LGC_FIRST | TXDL_LGC_LAST;
                   1177:                TXP_WCSR(TXDL_PAR, par);
                   1178:                TXP_WCSR(TXDL_LCR, lcr);
                   1179:
                   1180: #if NBPFILTER > 0
                   1181:                if (ifp->if_bpf)
                   1182:                        bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_OUT);
                   1183: #endif /* NBPFILTER > 0 */
                   1184:
                   1185:                sc->sc_nexttx = NEXTTX(nexttx);
                   1186:        }
                   1187: }
                   1188:
                   1189: /*
                   1190:  * Allocate DMA memory for transmit descriptor fragments.
                   1191:  * Only one map is used for all descriptors.
                   1192:  */
                   1193: int
                   1194: xge_alloc_txmem(struct xge_softc *sc)
                   1195: {
                   1196:        struct txd *txp;
                   1197:        bus_dma_segment_t seg;
                   1198:        bus_addr_t txdp;
                   1199:        caddr_t kva;
                   1200:        int i, rseg, state;
                   1201:
                   1202: #define TXMAPSZ (NTXDESCS*NTXFRAGS*sizeof(struct txd))
                   1203:        state = 0;
                   1204:        if (bus_dmamem_alloc(sc->sc_dmat, TXMAPSZ, PAGE_SIZE, 0,
                   1205:            &seg, 1, &rseg, BUS_DMA_NOWAIT))
                   1206:                goto err;
                   1207:        state++;
                   1208:        if (bus_dmamem_map(sc->sc_dmat, &seg, rseg, TXMAPSZ, &kva,
                   1209:            BUS_DMA_NOWAIT))
                   1210:                goto err;
                   1211:
                   1212:        state++;
                   1213:        if (bus_dmamap_create(sc->sc_dmat, TXMAPSZ, 1, TXMAPSZ, 0,
                   1214:            BUS_DMA_NOWAIT, &sc->sc_txmap))
                   1215:                goto err;
                   1216:        state++;
                   1217:        if (bus_dmamap_load(sc->sc_dmat, sc->sc_txmap,
                   1218:            kva, TXMAPSZ, NULL, BUS_DMA_NOWAIT))
                   1219:                goto err;
                   1220:
                   1221:        /* setup transmit array pointers */
                   1222:        txp = (struct txd *)kva;
                   1223:        txdp = seg.ds_addr;
                   1224:        for (txp = (struct txd *)kva, i = 0; i < NTXDESCS; i++) {
                   1225:                sc->sc_txd[i] = txp;
                   1226:                sc->sc_txdp[i] = txdp;
                   1227:                txp += NTXFRAGS;
                   1228:                txdp += (NTXFRAGS * sizeof(struct txd));
                   1229:        }
                   1230:
                   1231:        return (0);
                   1232:
                   1233: err:
                   1234:        if (state > 2)
                   1235:                bus_dmamap_destroy(sc->sc_dmat, sc->sc_txmap);
                   1236:        if (state > 1)
                   1237:                bus_dmamem_unmap(sc->sc_dmat, kva, TXMAPSZ);
                   1238:        if (state > 0)
                   1239:                bus_dmamem_free(sc->sc_dmat, &seg, rseg);
                   1240:        return (ENOBUFS);
                   1241: }
                   1242:
                   1243: /*
                   1244:  * Allocate DMA memory for receive descriptor,
                   1245:  * only one map is used for all descriptors.
                   1246:  * link receive descriptor pages together.
                   1247:  */
                   1248: int
                   1249: xge_alloc_rxmem(struct xge_softc *sc)
                   1250: {
                   1251:        struct rxd_4k *rxpp;
                   1252:        bus_dma_segment_t seg;
                   1253:        caddr_t kva;
                   1254:        int i, rseg, state;
                   1255:
                   1256:        /* sanity check */
                   1257:        if (sizeof(struct rxd_4k) != XGE_PAGE) {
                   1258:                printf("bad compiler struct alignment, %d != %d\n",
                   1259:                    (int)sizeof(struct rxd_4k), XGE_PAGE);
                   1260:                return (EINVAL);
                   1261:        }
                   1262:
                   1263:        state = 0;
                   1264:        if (bus_dmamem_alloc(sc->sc_dmat, RXMAPSZ, PAGE_SIZE, 0,
                   1265:            &seg, 1, &rseg, BUS_DMA_NOWAIT))
                   1266:                goto err;
                   1267:        state++;
                   1268:        if (bus_dmamem_map(sc->sc_dmat, &seg, rseg, RXMAPSZ, &kva,
                   1269:            BUS_DMA_NOWAIT))
                   1270:                goto err;
                   1271:
                   1272:        state++;
                   1273:        if (bus_dmamap_create(sc->sc_dmat, RXMAPSZ, 1, RXMAPSZ, 0,
                   1274:            BUS_DMA_NOWAIT, &sc->sc_rxmap))
                   1275:                goto err;
                   1276:        state++;
                   1277:        if (bus_dmamap_load(sc->sc_dmat, sc->sc_rxmap,
                   1278:            kva, RXMAPSZ, NULL, BUS_DMA_NOWAIT))
                   1279:                goto err;
                   1280:
                   1281:        /* setup receive page link pointers */
                   1282:        for (rxpp = (struct rxd_4k *)kva, i = 0; i < NRXPAGES; i++, rxpp++) {
                   1283:                sc->sc_rxd_4k[i] = rxpp;
                   1284:                rxpp->r4_next = (uint64_t)sc->sc_rxmap->dm_segs[0].ds_addr +
                   1285:                    (i*sizeof(struct rxd_4k)) + sizeof(struct rxd_4k);
                   1286:        }
                   1287:        sc->sc_rxd_4k[NRXPAGES-1]->r4_next =
                   1288:            (uint64_t)sc->sc_rxmap->dm_segs[0].ds_addr;
                   1289:
                   1290:        return (0);
                   1291:
                   1292: err:
                   1293:        if (state > 2)
                   1294:                bus_dmamap_destroy(sc->sc_dmat, sc->sc_rxmap);
                   1295:        if (state > 1)
                   1296:                bus_dmamem_unmap(sc->sc_dmat, kva, RXMAPSZ);
                   1297:        if (state > 0)
                   1298:                bus_dmamem_free(sc->sc_dmat, &seg, rseg);
                   1299:        return (ENOBUFS);
                   1300: }
                   1301:
                   1302:
                   1303: /*
                   1304:  * Add a new mbuf chain to descriptor id.
                   1305:  */
                   1306: int
                   1307: xge_add_rxbuf(struct xge_softc *sc, int id)
                   1308: {
                   1309:        struct rxdesc *rxd;
                   1310:        struct mbuf *m[5];
                   1311:        int page, desc, error;
                   1312: #if RX_MODE == RX_MODE_5
                   1313:        int i;
                   1314: #endif
                   1315:
                   1316:        page = id/NDESC_BUFMODE;
                   1317:        desc = id%NDESC_BUFMODE;
                   1318:
                   1319:        rxd = &sc->sc_rxd_4k[page]->r4_rxd[desc];
                   1320:
                   1321:        /*
                   1322:         * Allocate mbufs.
                   1323:         * Currently five mbufs and two clusters are used,
                   1324:         * the hardware will put (ethernet, ip, tcp/udp) headers in
                   1325:         * their own buffer and the clusters are only used for data.
                   1326:         */
                   1327: #if RX_MODE == RX_MODE_1
                   1328:        MGETHDR(m[0], M_DONTWAIT, MT_DATA);
                   1329:        if (m[0] == NULL)
                   1330:                return (ENOBUFS);
                   1331:        MCLGET(m[0], M_DONTWAIT);
                   1332:        if ((m[0]->m_flags & M_EXT) == 0) {
                   1333:                m_freem(m[0]);
                   1334:                return (ENOBUFS);
                   1335:        }
                   1336:        m[0]->m_len = m[0]->m_pkthdr.len = m[0]->m_ext.ext_size;
                   1337: #elif RX_MODE == RX_MODE_3
                   1338: #error missing rxmode 3.
                   1339: #elif RX_MODE == RX_MODE_5
                   1340:        MGETHDR(m[0], M_DONTWAIT, MT_DATA);
                   1341:        for (i = 1; i < 5; i++) {
                   1342:                MGET(m[i], M_DONTWAIT, MT_DATA);
                   1343:        }
                   1344:        if (m[3])
                   1345:                MCLGET(m[3], M_DONTWAIT);
                   1346:        if (m[4])
                   1347:                MCLGET(m[4], M_DONTWAIT);
                   1348:        if (!m[0] || !m[1] || !m[2] || !m[3] || !m[4] ||
                   1349:            ((m[3]->m_flags & M_EXT) == 0) || ((m[4]->m_flags & M_EXT) == 0)) {
                   1350:                /* Out of something */
                   1351:                for (i = 0; i < 5; i++)
                   1352:                        if (m[i] != NULL)
                   1353:                                m_free(m[i]);
                   1354:                return (ENOBUFS);
                   1355:        }
                   1356:        /* Link'em together */
                   1357:        m[0]->m_next = m[1];
                   1358:        m[1]->m_next = m[2];
                   1359:        m[2]->m_next = m[3];
                   1360:        m[3]->m_next = m[4];
                   1361: #else
                   1362: #error bad mode RX_MODE
                   1363: #endif
                   1364:
                   1365:        if (sc->sc_rxb[id])
                   1366:                bus_dmamap_unload(sc->sc_dmat, sc->sc_rxm[id]);
                   1367:        sc->sc_rxb[id] = m[0];
                   1368:
                   1369:        error = bus_dmamap_load_mbuf(sc->sc_dmat, sc->sc_rxm[id], m[0],
                   1370:            BUS_DMA_READ|BUS_DMA_NOWAIT);
                   1371:        if (error)
                   1372:                return (error);
                   1373:        bus_dmamap_sync(sc->sc_dmat, sc->sc_rxm[id], 0,
                   1374:            sc->sc_rxm[id]->dm_mapsize, BUS_DMASYNC_PREREAD);
                   1375:
                   1376: #if RX_MODE == RX_MODE_1
                   1377:        rxd->rxd_control2 = RXD_MKCTL2(m[0]->m_len, 0, 0);
                   1378:        rxd->rxd_buf0 = (uint64_t)sc->sc_rxm[id]->dm_segs[0].ds_addr;
                   1379:        rxd->rxd_control1 = RXD_CTL1_OWN;
                   1380: #elif RX_MODE == RX_MODE_3
                   1381: #elif RX_MODE == RX_MODE_5
                   1382:        rxd->rxd_control3 = RXD_MKCTL3(0, m[3]->m_len, m[4]->m_len);
                   1383:        rxd->rxd_control2 = RXD_MKCTL2(m[0]->m_len, m[1]->m_len, m[2]->m_len);
                   1384:        rxd->rxd_buf0 = (uint64_t)sc->sc_rxm[id]->dm_segs[0].ds_addr;
                   1385:        rxd->rxd_buf1 = (uint64_t)sc->sc_rxm[id]->dm_segs[1].ds_addr;
                   1386:        rxd->rxd_buf2 = (uint64_t)sc->sc_rxm[id]->dm_segs[2].ds_addr;
                   1387:        rxd->rxd_buf3 = (uint64_t)sc->sc_rxm[id]->dm_segs[3].ds_addr;
                   1388:        rxd->rxd_buf4 = (uint64_t)sc->sc_rxm[id]->dm_segs[4].ds_addr;
                   1389:        rxd->rxd_control1 = RXD_CTL1_OWN;
                   1390: #endif
                   1391:
                   1392:        XGE_RXSYNC(id, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
                   1393:        return (0);
                   1394: }
                   1395:
                   1396: /*
                   1397:  * This magic comes from the FreeBSD driver.
                   1398:  */
                   1399: int
                   1400: xge_setup_xgxs_xena(struct xge_softc *sc)
                   1401: {
                   1402:        /* The magic numbers are described in the users guide */
                   1403:
                   1404:        /* Writing to MDIO 0x8000 (Global Config 0) */
                   1405:        PIF_WCSR(DTX_CONTROL, 0x8000051500000000ULL); DELAY(50);
                   1406:        PIF_WCSR(DTX_CONTROL, 0x80000515000000E0ULL); DELAY(50);
                   1407:        PIF_WCSR(DTX_CONTROL, 0x80000515D93500E4ULL); DELAY(50);
                   1408:
                   1409:        /* Writing to MDIO 0x8000 (Global Config 1) */
                   1410:        PIF_WCSR(DTX_CONTROL, 0x8001051500000000ULL); DELAY(50);
                   1411:        PIF_WCSR(DTX_CONTROL, 0x80010515000000e0ULL); DELAY(50);
                   1412:        PIF_WCSR(DTX_CONTROL, 0x80010515001e00e4ULL); DELAY(50);
                   1413:
                   1414:        /* Reset the Gigablaze */
                   1415:        PIF_WCSR(DTX_CONTROL, 0x8002051500000000ULL); DELAY(50);
                   1416:        PIF_WCSR(DTX_CONTROL, 0x80020515000000E0ULL); DELAY(50);
                   1417:        PIF_WCSR(DTX_CONTROL, 0x80020515F21000E4ULL); DELAY(50);
                   1418:
                   1419:        /* read the pole settings */
                   1420:        PIF_WCSR(DTX_CONTROL, 0x8000051500000000ULL); DELAY(50);
                   1421:        PIF_WCSR(DTX_CONTROL, 0x80000515000000e0ULL); DELAY(50);
                   1422:        PIF_WCSR(DTX_CONTROL, 0x80000515000000ecULL); DELAY(50);
                   1423:
                   1424:        PIF_WCSR(DTX_CONTROL, 0x8001051500000000ULL); DELAY(50);
                   1425:        PIF_WCSR(DTX_CONTROL, 0x80010515000000e0ULL); DELAY(50);
                   1426:        PIF_WCSR(DTX_CONTROL, 0x80010515000000ecULL); DELAY(50);
                   1427:
                   1428:        PIF_WCSR(DTX_CONTROL, 0x8002051500000000ULL); DELAY(50);
                   1429:        PIF_WCSR(DTX_CONTROL, 0x80020515000000e0ULL); DELAY(50);
                   1430:        PIF_WCSR(DTX_CONTROL, 0x80020515000000ecULL); DELAY(50);
                   1431:
                   1432:        /* Workaround for TX Lane XAUI initialization error.
                   1433:           Read Xpak PHY register 24 for XAUI lane status */
                   1434:        PIF_WCSR(DTX_CONTROL, 0x0018040000000000ULL); DELAY(50);
                   1435:        PIF_WCSR(DTX_CONTROL, 0x00180400000000e0ULL); DELAY(50);
                   1436:        PIF_WCSR(DTX_CONTROL, 0x00180400000000ecULL); DELAY(50);
                   1437:
                   1438:        /*
                   1439:         * Reading the MDIO control with value 0x1804001c0F001c
                   1440:         * means the TxLanes were already in sync
                   1441:         * Reading the MDIO control with value 0x1804000c0x001c
                   1442:         * means some TxLanes are not in sync where x is a 4-bit
                   1443:         * value representing each lanes
                   1444:         */
                   1445: #if 0
                   1446:        val = PIF_RCSR(MDIO_CONTROL);
                   1447:        if (val != 0x1804001c0F001cULL) {
                   1448:                printf("%s: MDIO_CONTROL: %llx != %llx\n",
                   1449:                    XNAME, val, 0x1804001c0F001cULL);
                   1450:                return (1);
                   1451:        }
                   1452: #endif
                   1453:
                   1454:        /* Set and remove the DTE XS INTLoopBackN */
                   1455:        PIF_WCSR(DTX_CONTROL, 0x0000051500000000ULL); DELAY(50);
                   1456:        PIF_WCSR(DTX_CONTROL, 0x00000515604000e0ULL); DELAY(50);
                   1457:        PIF_WCSR(DTX_CONTROL, 0x00000515604000e4ULL); DELAY(50);
                   1458:        PIF_WCSR(DTX_CONTROL, 0x00000515204000e4ULL); DELAY(50);
                   1459:        PIF_WCSR(DTX_CONTROL, 0x00000515204000ecULL); DELAY(50);
                   1460:
                   1461: #if 0
                   1462:        /* Reading the DTX control register Should be 0x5152040001c */
                   1463:        val = PIF_RCSR(DTX_CONTROL);
                   1464:        if (val != 0x5152040001cULL) {
                   1465:                printf("%s: DTX_CONTROL: %llx != %llx\n",
                   1466:                    XNAME, val, 0x5152040001cULL);
                   1467:                return (1);
                   1468:        }
                   1469: #endif
                   1470:
                   1471:        PIF_WCSR(MDIO_CONTROL, 0x0018040000000000ULL); DELAY(50);
                   1472:        PIF_WCSR(MDIO_CONTROL, 0x00180400000000e0ULL); DELAY(50);
                   1473:        PIF_WCSR(MDIO_CONTROL, 0x00180400000000ecULL); DELAY(50);
                   1474:
                   1475: #if 0
                   1476:        /* Reading the MIOD control should be 0x1804001c0f001c */
                   1477:        val = PIF_RCSR(MDIO_CONTROL);
                   1478:        if (val != 0x1804001c0f001cULL) {
                   1479:                printf("%s: MDIO_CONTROL2: %llx != %llx\n",
                   1480:                    XNAME, val, 0x1804001c0f001cULL);
                   1481:                return (1);
                   1482:        }
                   1483: #endif
                   1484:        return (0);
                   1485: }
                   1486:
                   1487: int
                   1488: xge_setup_xgxs_herc(struct xge_softc *sc)
                   1489: {
                   1490:        int dtx_cnt = 0;
                   1491:
                   1492:        while (herc_dtx_cfg[dtx_cnt] != END_SIGN) {
                   1493:                PIF_WCSR(DTX_CONTROL, herc_dtx_cfg[dtx_cnt]);
                   1494:                DELAY(100);
                   1495:                dtx_cnt++;
                   1496:        }
                   1497:
                   1498:        return (0);
                   1499: }

CVSweb