root/dev/pci/if_vr.c

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

DEFINITIONS

This source file includes following definitions.
  1. vr_mii_sync
  2. vr_mii_send
  3. vr_mii_readreg
  4. vr_mii_writereg
  5. vr_miibus_readreg
  6. vr_miibus_writereg
  7. vr_miibus_statchg
  8. vr_setmulti
  9. vr_setcfg
  10. vr_reset
  11. vr_probe
  12. vr_attach
  13. vr_list_tx_init
  14. vr_list_rx_init
  15. vr_rxeof
  16. vr_rxeoc
  17. vr_txeof
  18. vr_tick
  19. vr_intr
  20. vr_encap
  21. vr_start
  22. vr_init
  23. vr_ifmedia_upd
  24. vr_ifmedia_sts
  25. vr_ioctl
  26. vr_watchdog
  27. vr_stop
  28. vr_shutdown

    1 /*      $OpenBSD: if_vr.c,v 1.67 2006/11/03 23:45:26 brad Exp $ */
    2 
    3 /*
    4  * Copyright (c) 1997, 1998
    5  *      Bill Paul <wpaul@ctr.columbia.edu>.  All rights reserved.
    6  *
    7  * Redistribution and use in source and binary forms, with or without
    8  * modification, are permitted provided that the following conditions
    9  * are met:
   10  * 1. Redistributions of source code must retain the above copyright
   11  *    notice, this list of conditions and the following disclaimer.
   12  * 2. Redistributions in binary form must reproduce the above copyright
   13  *    notice, this list of conditions and the following disclaimer in the
   14  *    documentation and/or other materials provided with the distribution.
   15  * 3. All advertising materials mentioning features or use of this software
   16  *    must display the following acknowledgement:
   17  *      This product includes software developed by Bill Paul.
   18  * 4. Neither the name of the author nor the names of any co-contributors
   19  *    may be used to endorse or promote products derived from this software
   20  *    without specific prior written permission.
   21  *
   22  * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
   23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   25  * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
   26  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   27  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   28  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   29  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   30  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   31  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
   32  * THE POSSIBILITY OF SUCH DAMAGE.
   33  *
   34  * $FreeBSD: src/sys/pci/if_vr.c,v 1.73 2003/08/22 07:13:22 imp Exp $
   35  */
   36 
   37 /*
   38  * VIA Rhine fast ethernet PCI NIC driver
   39  *
   40  * Supports various network adapters based on the VIA Rhine
   41  * and Rhine II PCI controllers, including the D-Link DFE530TX.
   42  * Datasheets are available at http://www.via.com.tw.
   43  *
   44  * Written by Bill Paul <wpaul@ctr.columbia.edu>
   45  * Electrical Engineering Department
   46  * Columbia University, New York City
   47  */
   48 
   49 /*
   50  * The VIA Rhine controllers are similar in some respects to the
   51  * the DEC tulip chips, except less complicated. The controller
   52  * uses an MII bus and an external physical layer interface. The
   53  * receiver has a one entry perfect filter and a 64-bit hash table
   54  * multicast filter. Transmit and receive descriptors are similar
   55  * to the tulip.
   56  *
   57  * The Rhine has a serious flaw in its transmit DMA mechanism:
   58  * transmit buffers must be longword aligned. Unfortunately,
   59  * FreeBSD doesn't guarantee that mbufs will be filled in starting
   60  * at longword boundaries, so we have to do a buffer copy before
   61  * transmission.
   62  */
   63 
   64 #include "bpfilter.h"
   65 
   66 #include <sys/param.h>
   67 #include <sys/systm.h>
   68 #include <sys/sockio.h>
   69 #include <sys/mbuf.h>
   70 #include <sys/malloc.h>
   71 #include <sys/kernel.h>
   72 #include <sys/timeout.h>
   73 #include <sys/socket.h>
   74 
   75 #include <net/if.h>
   76 #include <sys/device.h>
   77 #ifdef INET
   78 #include <netinet/in.h>
   79 #include <netinet/in_systm.h>
   80 #include <netinet/in_var.h>
   81 #include <netinet/ip.h>
   82 #include <netinet/if_ether.h>
   83 #endif  /* INET */
   84 #include <net/if_dl.h>
   85 #include <net/if_media.h>
   86 
   87 #if NBPFILTER > 0
   88 #include <net/bpf.h>
   89 #endif
   90 
   91 #include <machine/bus.h>
   92 
   93 #include <dev/mii/mii.h>
   94 #include <dev/mii/miivar.h>
   95 
   96 #include <dev/pci/pcireg.h>
   97 #include <dev/pci/pcivar.h>
   98 #include <dev/pci/pcidevs.h>
   99 
  100 #define VR_USEIOSPACE
  101 #undef VR_USESWSHIFT
  102 
  103 #include <dev/pci/if_vrreg.h>
  104 
  105 int vr_probe(struct device *, void *, void *);
  106 void vr_attach(struct device *, struct device *, void *);
  107 
  108 struct cfattach vr_ca = {
  109         sizeof(struct vr_softc), vr_probe, vr_attach
  110 };
  111 struct cfdriver vr_cd = {
  112         0, "vr", DV_IFNET
  113 };
  114 
  115 int vr_encap(struct vr_softc *, struct vr_chain *, struct mbuf *);
  116 void vr_rxeof(struct vr_softc *);
  117 void vr_rxeoc(struct vr_softc *);
  118 void vr_txeof(struct vr_softc *);
  119 void vr_tick(void *);
  120 int vr_intr(void *);
  121 void vr_start(struct ifnet *);
  122 int vr_ioctl(struct ifnet *, u_long, caddr_t);
  123 void vr_init(void *);
  124 void vr_stop(struct vr_softc *);
  125 void vr_watchdog(struct ifnet *);
  126 void vr_shutdown(void *);
  127 int vr_ifmedia_upd(struct ifnet *);
  128 void vr_ifmedia_sts(struct ifnet *, struct ifmediareq *);
  129 
  130 void vr_mii_sync(struct vr_softc *);
  131 void vr_mii_send(struct vr_softc *, u_int32_t, int);
  132 int vr_mii_readreg(struct vr_softc *, struct vr_mii_frame *);
  133 int vr_mii_writereg(struct vr_softc *, struct vr_mii_frame *);
  134 int vr_miibus_readreg(struct device *, int, int);
  135 void vr_miibus_writereg(struct device *, int, int, int);
  136 void vr_miibus_statchg(struct device *);
  137 
  138 void vr_setcfg(struct vr_softc *, int);
  139 void vr_setmulti(struct vr_softc *);
  140 void vr_reset(struct vr_softc *);
  141 int vr_list_rx_init(struct vr_softc *);
  142 int vr_list_tx_init(struct vr_softc *);
  143 
  144 const struct pci_matchid vr_devices[] = {
  145         { PCI_VENDOR_VIATECH, PCI_PRODUCT_VIATECH_RHINE },
  146         { PCI_VENDOR_VIATECH, PCI_PRODUCT_VIATECH_RHINEII },
  147         { PCI_VENDOR_VIATECH, PCI_PRODUCT_VIATECH_RHINEII_2 },
  148         { PCI_VENDOR_VIATECH, PCI_PRODUCT_VIATECH_VT6105 },
  149         { PCI_VENDOR_VIATECH, PCI_PRODUCT_VIATECH_VT6105M },
  150         { PCI_VENDOR_DELTA, PCI_PRODUCT_DELTA_RHINEII },
  151         { PCI_VENDOR_ADDTRON, PCI_PRODUCT_ADDTRON_RHINEII }
  152 };
  153 
  154 #define VR_SETBIT(sc, reg, x)                           \
  155         CSR_WRITE_1(sc, reg,                            \
  156                 CSR_READ_1(sc, reg) | (x))
  157 
  158 #define VR_CLRBIT(sc, reg, x)                           \
  159         CSR_WRITE_1(sc, reg,                            \
  160                 CSR_READ_1(sc, reg) & ~(x))
  161 
  162 #define VR_SETBIT16(sc, reg, x)                         \
  163         CSR_WRITE_2(sc, reg,                            \
  164                 CSR_READ_2(sc, reg) | (x))
  165 
  166 #define VR_CLRBIT16(sc, reg, x)                         \
  167         CSR_WRITE_2(sc, reg,                            \
  168                 CSR_READ_2(sc, reg) & ~(x))
  169 
  170 #define VR_SETBIT32(sc, reg, x)                         \
  171         CSR_WRITE_4(sc, reg,                            \
  172                 CSR_READ_4(sc, reg) | (x))
  173 
  174 #define VR_CLRBIT32(sc, reg, x)                         \
  175         CSR_WRITE_4(sc, reg,                            \
  176                 CSR_READ_4(sc, reg) & ~(x))
  177 
  178 #define SIO_SET(x)                                      \
  179         CSR_WRITE_1(sc, VR_MIICMD,                      \
  180                 CSR_READ_1(sc, VR_MIICMD) | (x))
  181 
  182 #define SIO_CLR(x)                                      \
  183         CSR_WRITE_1(sc, VR_MIICMD,                      \
  184                 CSR_READ_1(sc, VR_MIICMD) & ~(x))
  185 
  186 #ifdef VR_USESWSHIFT
  187 /*
  188  * Sync the PHYs by setting data bit and strobing the clock 32 times.
  189  */
  190 void
  191 vr_mii_sync(struct vr_softc *sc)
  192 {
  193         int                     i;
  194 
  195         SIO_SET(VR_MIICMD_DIR|VR_MIICMD_DATAIN);
  196 
  197         for (i = 0; i < 32; i++) {
  198                 SIO_SET(VR_MIICMD_CLK);
  199                 DELAY(1);
  200                 SIO_CLR(VR_MIICMD_CLK);
  201                 DELAY(1);
  202         }
  203 }
  204 
  205 /*
  206  * Clock a series of bits through the MII.
  207  */
  208 void
  209 vr_mii_send(struct vr_softc *sc, u_int32_t bits, int cnt)
  210 {
  211         int                     i;
  212 
  213         SIO_CLR(VR_MIICMD_CLK);
  214 
  215         for (i = (0x1 << (cnt - 1)); i; i >>= 1) {
  216                 if (bits & i) {
  217                         SIO_SET(VR_MIICMD_DATAIN);
  218                 } else {
  219                         SIO_CLR(VR_MIICMD_DATAIN);
  220                 }
  221                 DELAY(1);
  222                 SIO_CLR(VR_MIICMD_CLK);
  223                 DELAY(1);
  224                 SIO_SET(VR_MIICMD_CLK);
  225         }
  226 }
  227 #endif
  228 
  229 /*
  230  * Read an PHY register through the MII.
  231  */
  232 int
  233 vr_mii_readreg(struct vr_softc *sc, struct vr_mii_frame *frame)
  234 #ifdef VR_USESWSHIFT
  235 {
  236         int                     i, ack, s;
  237 
  238         s = splnet();
  239 
  240         /*
  241          * Set up frame for RX.
  242          */
  243         frame->mii_stdelim = VR_MII_STARTDELIM;
  244         frame->mii_opcode = VR_MII_READOP;
  245         frame->mii_turnaround = 0;
  246         frame->mii_data = 0;
  247         
  248         CSR_WRITE_1(sc, VR_MIICMD, 0);
  249         VR_SETBIT(sc, VR_MIICMD, VR_MIICMD_DIRECTPGM);
  250 
  251         /*
  252          * Turn on data xmit.
  253          */
  254         SIO_SET(VR_MIICMD_DIR);
  255 
  256         vr_mii_sync(sc);
  257 
  258         /*
  259          * Send command/address info.
  260          */
  261         vr_mii_send(sc, frame->mii_stdelim, 2);
  262         vr_mii_send(sc, frame->mii_opcode, 2);
  263         vr_mii_send(sc, frame->mii_phyaddr, 5);
  264         vr_mii_send(sc, frame->mii_regaddr, 5);
  265 
  266         /* Idle bit */
  267         SIO_CLR((VR_MIICMD_CLK|VR_MIICMD_DATAIN));
  268         DELAY(1);
  269         SIO_SET(VR_MIICMD_CLK);
  270         DELAY(1);
  271 
  272         /* Turn off xmit. */
  273         SIO_CLR(VR_MIICMD_DIR);
  274 
  275         /* Check for ack */
  276         SIO_CLR(VR_MIICMD_CLK);
  277         DELAY(1);
  278         ack = CSR_READ_4(sc, VR_MIICMD) & VR_MIICMD_DATAOUT;
  279         SIO_SET(VR_MIICMD_CLK);
  280         DELAY(1);
  281 
  282         /*
  283          * Now try reading data bits. If the ack failed, we still
  284          * need to clock through 16 cycles to keep the PHY(s) in sync.
  285          */
  286         if (ack) {
  287                 for(i = 0; i < 16; i++) {
  288                         SIO_CLR(VR_MIICMD_CLK);
  289                         DELAY(1);
  290                         SIO_SET(VR_MIICMD_CLK);
  291                         DELAY(1);
  292                 }
  293                 goto fail;
  294         }
  295 
  296         for (i = 0x8000; i; i >>= 1) {
  297                 SIO_CLR(VR_MIICMD_CLK);
  298                 DELAY(1);
  299                 if (!ack) {
  300                         if (CSR_READ_4(sc, VR_MIICMD) & VR_MIICMD_DATAOUT)
  301                                 frame->mii_data |= i;
  302                         DELAY(1);
  303                 }
  304                 SIO_SET(VR_MIICMD_CLK);
  305                 DELAY(1);
  306         }
  307 
  308 fail:
  309 
  310         SIO_CLR(VR_MIICMD_CLK);
  311         DELAY(1);
  312         SIO_SET(VR_MIICMD_CLK);
  313         DELAY(1);
  314 
  315         splx(s);
  316 
  317         if (ack)
  318                 return(1);
  319         return(0);
  320 }
  321 #else  
  322 {
  323         int                     s, i;
  324 
  325         s = splnet();
  326 
  327         /* Set the PHY-address */
  328         CSR_WRITE_1(sc, VR_PHYADDR, (CSR_READ_1(sc, VR_PHYADDR)& 0xe0)|
  329             frame->mii_phyaddr);
  330 
  331         /* Set the register-address */
  332         CSR_WRITE_1(sc, VR_MIIADDR, frame->mii_regaddr);
  333         VR_SETBIT(sc, VR_MIICMD, VR_MIICMD_READ_ENB);
  334 
  335         for (i = 0; i < 10000; i++) {
  336                 if ((CSR_READ_1(sc, VR_MIICMD) & VR_MIICMD_READ_ENB) == 0)
  337                         break;
  338                 DELAY(1);
  339         }
  340 
  341         frame->mii_data = CSR_READ_2(sc, VR_MIIDATA);
  342 
  343         splx(s);
  344 
  345         return(0);
  346 }      
  347 #endif         
  348 
  349 
  350 /*
  351  * Write to a PHY register through the MII.
  352  */
  353 int
  354 vr_mii_writereg(struct vr_softc *sc, struct vr_mii_frame *frame)
  355 #ifdef VR_USESWSHIFT
  356 {
  357         int                     s;
  358 
  359         s = splnet();
  360 
  361         CSR_WRITE_1(sc, VR_MIICMD, 0);
  362         VR_SETBIT(sc, VR_MIICMD, VR_MIICMD_DIRECTPGM);
  363 
  364         /*
  365          * Set up frame for TX.
  366          */
  367 
  368         frame->mii_stdelim = VR_MII_STARTDELIM;
  369         frame->mii_opcode = VR_MII_WRITEOP;
  370         frame->mii_turnaround = VR_MII_TURNAROUND;
  371         
  372         /*
  373          * Turn on data output.
  374          */
  375         SIO_SET(VR_MIICMD_DIR);
  376 
  377         vr_mii_sync(sc);
  378 
  379         vr_mii_send(sc, frame->mii_stdelim, 2);
  380         vr_mii_send(sc, frame->mii_opcode, 2);
  381         vr_mii_send(sc, frame->mii_phyaddr, 5);
  382         vr_mii_send(sc, frame->mii_regaddr, 5);
  383         vr_mii_send(sc, frame->mii_turnaround, 2);
  384         vr_mii_send(sc, frame->mii_data, 16);
  385 
  386         /* Idle bit. */
  387         SIO_SET(VR_MIICMD_CLK);
  388         DELAY(1);
  389         SIO_CLR(VR_MIICMD_CLK);
  390         DELAY(1);
  391 
  392         /*
  393          * Turn off xmit.
  394          */
  395         SIO_CLR(VR_MIICMD_DIR);
  396 
  397         splx(s);
  398 
  399         return(0);
  400 }
  401 #else  
  402 {      
  403         int                     s, i;
  404 
  405         s = splnet();
  406 
  407         /* Set the PHY-address */
  408         CSR_WRITE_1(sc, VR_PHYADDR, (CSR_READ_1(sc, VR_PHYADDR)& 0xe0)|
  409             frame->mii_phyaddr);
  410 
  411         /* Set the register-address and data to write */
  412         CSR_WRITE_1(sc, VR_MIIADDR, frame->mii_regaddr);
  413         CSR_WRITE_2(sc, VR_MIIDATA, frame->mii_data);
  414 
  415         VR_SETBIT(sc, VR_MIICMD, VR_MIICMD_WRITE_ENB);
  416 
  417         for (i = 0; i < 10000; i++) {
  418                 if ((CSR_READ_1(sc, VR_MIICMD) & VR_MIICMD_WRITE_ENB) == 0)
  419                         break;
  420                 DELAY(1); 
  421         }
  422 
  423         splx(s);
  424 
  425         return(0);
  426 }
  427 #endif                 
  428 
  429 int
  430 vr_miibus_readreg(struct device *dev, int phy, int reg)
  431 {
  432         struct vr_softc *sc = (struct vr_softc *)dev;
  433         struct vr_mii_frame frame;
  434 
  435         switch (sc->vr_revid) {
  436         case REV_ID_VT6102_APOLLO:
  437         case REV_ID_VT6103:
  438                 if (phy != 1)
  439                         return 0;
  440         default:
  441                 break;
  442         }
  443 
  444         bzero((char *)&frame, sizeof(frame));
  445 
  446         frame.mii_phyaddr = phy;
  447         frame.mii_regaddr = reg;
  448         vr_mii_readreg(sc, &frame);
  449 
  450         return(frame.mii_data);
  451 }
  452 
  453 void
  454 vr_miibus_writereg(struct device *dev, int phy, int reg, int data)
  455 {
  456         struct vr_softc *sc = (struct vr_softc *)dev;
  457         struct vr_mii_frame frame;
  458 
  459         switch (sc->vr_revid) {
  460         case REV_ID_VT6102_APOLLO:
  461         case REV_ID_VT6103:
  462                 if (phy != 1)
  463                         return;
  464         default:
  465                 break;
  466         }
  467 
  468         bzero((char *)&frame, sizeof(frame));
  469 
  470         frame.mii_phyaddr = phy;
  471         frame.mii_regaddr = reg;
  472         frame.mii_data = data;
  473 
  474         vr_mii_writereg(sc, &frame);
  475 }
  476 
  477 void
  478 vr_miibus_statchg(struct device *dev)
  479 {
  480         struct vr_softc *sc = (struct vr_softc *)dev;
  481 
  482         vr_setcfg(sc, sc->sc_mii.mii_media_active);
  483 }
  484 
  485 /*
  486  * Program the 64-bit multicast hash filter.
  487  */
  488 void
  489 vr_setmulti(struct vr_softc *sc)
  490 {
  491         struct ifnet            *ifp;
  492         int                     h = 0;
  493         u_int32_t               hashes[2] = { 0, 0 };
  494         struct arpcom *ac = &sc->arpcom;
  495         struct ether_multi *enm;
  496         struct ether_multistep step;
  497         u_int8_t                rxfilt;
  498         int                     mcnt = 0;
  499 
  500         ifp = &sc->arpcom.ac_if;
  501 
  502         rxfilt = CSR_READ_1(sc, VR_RXCFG);
  503 
  504         if (ifp->if_flags & IFF_ALLMULTI || ifp->if_flags & IFF_PROMISC) {
  505 allmulti:
  506                 rxfilt |= VR_RXCFG_RX_MULTI;
  507                 CSR_WRITE_1(sc, VR_RXCFG, rxfilt);
  508                 CSR_WRITE_4(sc, VR_MAR0, 0xFFFFFFFF);
  509                 CSR_WRITE_4(sc, VR_MAR1, 0xFFFFFFFF);
  510                 return;
  511         }
  512 
  513         /* first, zot all the existing hash bits */
  514         CSR_WRITE_4(sc, VR_MAR0, 0);
  515         CSR_WRITE_4(sc, VR_MAR1, 0);
  516 
  517         /* now program new ones */
  518         ETHER_FIRST_MULTI(step, ac, enm);
  519         while (enm != NULL) {
  520                 if (bcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
  521                         ifp->if_flags |= IFF_ALLMULTI;
  522                         goto allmulti;
  523                 }
  524                 h = ether_crc32_be(enm->enm_addrlo, ETHER_ADDR_LEN) >> 26;
  525                 if (h < 32)
  526                         hashes[0] |= (1 << h);
  527                 else
  528                         hashes[1] |= (1 << (h - 32));
  529                 mcnt++;
  530 
  531                 ETHER_NEXT_MULTI(step, enm);
  532         }
  533 
  534         if (mcnt)
  535                 rxfilt |= VR_RXCFG_RX_MULTI;
  536         else
  537                 rxfilt &= ~VR_RXCFG_RX_MULTI;
  538 
  539         CSR_WRITE_4(sc, VR_MAR0, hashes[0]);
  540         CSR_WRITE_4(sc, VR_MAR1, hashes[1]);
  541         CSR_WRITE_1(sc, VR_RXCFG, rxfilt);
  542 }
  543 
  544 /*
  545  * In order to fiddle with the
  546  * 'full-duplex' and '100Mbps' bits in the netconfig register, we
  547  * first have to put the transmit and/or receive logic in the idle state.
  548  */
  549 void
  550 vr_setcfg(struct vr_softc *sc, int media)
  551 {
  552         int restart = 0;
  553 
  554         if (CSR_READ_2(sc, VR_COMMAND) & (VR_CMD_TX_ON|VR_CMD_RX_ON)) {
  555                 restart = 1;
  556                 VR_CLRBIT16(sc, VR_COMMAND, (VR_CMD_TX_ON|VR_CMD_RX_ON));
  557         }
  558 
  559         if ((media & IFM_GMASK) == IFM_FDX)
  560                 VR_SETBIT16(sc, VR_COMMAND, VR_CMD_FULLDUPLEX);
  561         else
  562                 VR_CLRBIT16(sc, VR_COMMAND, VR_CMD_FULLDUPLEX);
  563 
  564         if (restart)
  565                 VR_SETBIT16(sc, VR_COMMAND, VR_CMD_TX_ON|VR_CMD_RX_ON);
  566 }
  567 
  568 void
  569 vr_reset(struct vr_softc *sc)
  570 {
  571         int                     i;
  572 
  573         VR_SETBIT16(sc, VR_COMMAND, VR_CMD_RESET);
  574 
  575         for (i = 0; i < VR_TIMEOUT; i++) {
  576                 DELAY(10);
  577                 if (!(CSR_READ_2(sc, VR_COMMAND) & VR_CMD_RESET))
  578                         break;
  579         }
  580         if (i == VR_TIMEOUT) {
  581                 if (sc->vr_revid < REV_ID_VT3065_A)
  582                         printf("%s: reset never completed!\n",
  583                             sc->sc_dev.dv_xname);
  584                 else {
  585 #ifdef VR_DEBUG
  586                         /* Use newer force reset command */
  587                         printf("%s: Using force reset command.\n",
  588                             sc->sc_dev.dv_xname);
  589 #endif
  590                         VR_SETBIT(sc, VR_MISC_CR1, VR_MISCCR1_FORSRST);
  591                 }
  592         }       
  593 
  594         /* Wait a little while for the chip to get its brains in order. */
  595         DELAY(1000);
  596 }
  597 
  598 /*
  599  * Probe for a VIA Rhine chip.
  600  */
  601 int
  602 vr_probe(struct device *parent, void *match, void *aux)
  603 {
  604         return (pci_matchbyid((struct pci_attach_args *)aux, vr_devices,
  605             sizeof(vr_devices)/sizeof(vr_devices[0])));
  606 }
  607 
  608 /*
  609  * Attach the interface. Allocate softc structures, do ifmedia
  610  * setup and ethernet/BPF attach.
  611  */
  612 void
  613 vr_attach(struct device *parent, struct device *self, void *aux)
  614 {
  615         int                     i;
  616         pcireg_t                command;
  617         struct vr_softc         *sc = (struct vr_softc *)self;
  618         struct pci_attach_args  *pa = aux;
  619         pci_chipset_tag_t       pc = pa->pa_pc;
  620         pci_intr_handle_t       ih;
  621         const char              *intrstr = NULL;
  622         struct ifnet            *ifp = &sc->arpcom.ac_if;
  623         bus_size_t              size;
  624         int rseg;
  625         caddr_t kva;
  626 
  627         /*
  628          * Handle power management nonsense.
  629          */
  630         command = pci_conf_read(pa->pa_pc, pa->pa_tag,
  631             VR_PCI_CAPID) & 0x000000ff;
  632         if (command == 0x01) {
  633                 command = pci_conf_read(pa->pa_pc, pa->pa_tag,
  634                     VR_PCI_PWRMGMTCTRL);
  635                 if (command & VR_PSTATE_MASK) {
  636                         pcireg_t        iobase, membase, irq;
  637 
  638                         /* Save important PCI config data. */
  639                         iobase = pci_conf_read(pa->pa_pc, pa->pa_tag,
  640                                                 VR_PCI_LOIO);
  641                         membase = pci_conf_read(pa->pa_pc, pa->pa_tag,
  642                                                 VR_PCI_LOMEM);
  643                         irq = pci_conf_read(pa->pa_pc, pa->pa_tag,
  644                                                 VR_PCI_INTLINE);
  645 
  646                         /* Reset the power state. */
  647                         command &= 0xFFFFFFFC;
  648                         pci_conf_write(pa->pa_pc, pa->pa_tag,
  649                                                 VR_PCI_PWRMGMTCTRL, command);
  650 
  651                         /* Restore PCI config data. */
  652                         pci_conf_write(pa->pa_pc, pa->pa_tag,
  653                                                 VR_PCI_LOIO, iobase);
  654                         pci_conf_write(pa->pa_pc, pa->pa_tag,
  655                                                 VR_PCI_LOMEM, membase);
  656                         pci_conf_write(pa->pa_pc, pa->pa_tag,
  657                                                 VR_PCI_INTLINE, irq);
  658                 }
  659         }
  660 
  661         /*
  662          * Map control/status registers.
  663          */
  664 
  665 #ifdef VR_USEIOSPACE
  666         if (pci_mapreg_map(pa, VR_PCI_LOIO, PCI_MAPREG_TYPE_IO, 0,
  667             &sc->vr_btag, &sc->vr_bhandle, NULL, &size, 0)) {
  668                 printf(": failed to map i/o space\n");
  669                 return;
  670         }
  671 #else
  672         if (pci_mapreg_map(pa, VR_PCI_LOMEM, PCI_MAPREG_TYPE_MEM, 0,
  673             &sc->vr_btag, &sc->vr_bhandle, NULL, &size, 0)) {
  674                 printf(": failed to map memory space\n");
  675                 return;
  676         }
  677 #endif
  678 
  679         /* Allocate interrupt */
  680         if (pci_intr_map(pa, &ih)) {
  681                 printf(": couldn't map interrupt\n");
  682                 goto fail_1;
  683         }
  684         intrstr = pci_intr_string(pc, ih);
  685         sc->sc_ih = pci_intr_establish(pc, ih, IPL_NET, vr_intr, sc,
  686                                        self->dv_xname);
  687         if (sc->sc_ih == NULL) {
  688                 printf(": could not establish interrupt");
  689                 if (intrstr != NULL)
  690                         printf(" at %s", intrstr);
  691                 printf("\n");
  692                 goto fail_1;
  693         }
  694         printf(": %s", intrstr);
  695 
  696         sc->vr_revid = PCI_REVISION(pa->pa_class);
  697 
  698         /*
  699          * Windows may put the chip in suspend mode when it
  700          * shuts down. Be sure to kick it in the head to wake it
  701          * up again.
  702          */
  703         VR_CLRBIT(sc, VR_STICKHW, (VR_STICKHW_DS0|VR_STICKHW_DS1));
  704 
  705         /* Reset the adapter. */
  706         vr_reset(sc);
  707 
  708         /*
  709          * Turn on bit2 (MIION) in PCI configuration register 0x53 during
  710          * initialization and disable AUTOPOLL.
  711          */
  712         pci_conf_write(pa->pa_pc, pa->pa_tag, VR_PCI_MODE,
  713             pci_conf_read(pa->pa_pc, pa->pa_tag, VR_PCI_MODE) |
  714             (VR_MODE3_MIION << 24));
  715         VR_CLRBIT(sc, VR_MIICMD, VR_MIICMD_AUTOPOLL);
  716 
  717         /*
  718          * Get station address. The way the Rhine chips work,
  719          * you're not allowed to directly access the EEPROM once
  720          * they've been programmed a special way. Consequently,
  721          * we need to read the node address from the PAR0 and PAR1
  722          * registers.
  723          */
  724         VR_SETBIT(sc, VR_EECSR, VR_EECSR_LOAD);
  725         DELAY(1000);
  726         for (i = 0; i < ETHER_ADDR_LEN; i++)
  727                 sc->arpcom.ac_enaddr[i] = CSR_READ_1(sc, VR_PAR0 + i);
  728 
  729         /*
  730          * A Rhine chip was detected. Inform the world.
  731          */
  732         printf(", address %s\n", ether_sprintf(sc->arpcom.ac_enaddr));
  733 
  734         sc->sc_dmat = pa->pa_dmat;
  735         if (bus_dmamem_alloc(sc->sc_dmat, sizeof(struct vr_list_data),
  736             PAGE_SIZE, 0, &sc->sc_listseg, 1, &rseg, BUS_DMA_NOWAIT)) {
  737                 printf(": can't alloc list\n");
  738                 goto fail_2;
  739         }
  740         if (bus_dmamem_map(sc->sc_dmat, &sc->sc_listseg, rseg,
  741             sizeof(struct vr_list_data), &kva, BUS_DMA_NOWAIT)) {
  742                 printf(": can't map dma buffers (%d bytes)\n",
  743                     sizeof(struct vr_list_data));
  744                 goto fail_3;
  745         }
  746         if (bus_dmamap_create(sc->sc_dmat, sizeof(struct vr_list_data), 1,
  747             sizeof(struct vr_list_data), 0, BUS_DMA_NOWAIT, &sc->sc_listmap)) {
  748                 printf(": can't create dma map\n");
  749                 goto fail_4;
  750         }
  751         if (bus_dmamap_load(sc->sc_dmat, sc->sc_listmap, kva,
  752             sizeof(struct vr_list_data), NULL, BUS_DMA_NOWAIT)) {
  753                 printf(": can't load dma map\n");
  754                 goto fail_5;
  755         }
  756         sc->vr_ldata = (struct vr_list_data *)kva;
  757         bzero(sc->vr_ldata, sizeof(struct vr_list_data));
  758 
  759         ifp = &sc->arpcom.ac_if;
  760         ifp->if_softc = sc;
  761         ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
  762         ifp->if_ioctl = vr_ioctl;
  763         ifp->if_start = vr_start;
  764         ifp->if_watchdog = vr_watchdog;
  765         ifp->if_baudrate = 10000000;
  766         IFQ_SET_READY(&ifp->if_snd);
  767         bcopy(sc->sc_dev.dv_xname, ifp->if_xname, IFNAMSIZ);
  768 
  769         /*
  770          * Do MII setup.
  771          */
  772         sc->sc_mii.mii_ifp = ifp;
  773         sc->sc_mii.mii_readreg = vr_miibus_readreg;
  774         sc->sc_mii.mii_writereg = vr_miibus_writereg;
  775         sc->sc_mii.mii_statchg = vr_miibus_statchg;
  776         ifmedia_init(&sc->sc_mii.mii_media, 0, vr_ifmedia_upd, vr_ifmedia_sts);
  777         mii_attach(self, &sc->sc_mii, 0xffffffff, MII_PHY_ANY, MII_OFFSET_ANY,
  778             0);
  779         if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) {
  780                 ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE, 0, NULL);
  781                 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_NONE);
  782         } else
  783                 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO);
  784         timeout_set(&sc->sc_to, vr_tick, sc);
  785 
  786         /*
  787          * Call MI attach routines.
  788          */
  789         if_attach(ifp);
  790         ether_ifattach(ifp);
  791 
  792         shutdownhook_establish(vr_shutdown, sc);
  793         return;
  794 
  795 fail_5:
  796         bus_dmamap_destroy(sc->sc_dmat, sc->sc_listmap);
  797 
  798 fail_4:
  799         bus_dmamem_unmap(sc->sc_dmat, kva, sizeof(struct vr_list_data));
  800 
  801 fail_3:
  802         bus_dmamem_free(sc->sc_dmat, &sc->sc_listseg, rseg);
  803 
  804 fail_2:
  805         pci_intr_disestablish(pc, sc->sc_ih);
  806 
  807 fail_1:
  808         bus_space_unmap(sc->vr_btag, sc->vr_bhandle, size);
  809 }
  810 
  811 /*
  812  * Initialize the transmit descriptors.
  813  */
  814 int
  815 vr_list_tx_init(struct vr_softc *sc)
  816 {
  817         struct vr_chain_data    *cd;
  818         struct vr_list_data     *ld;
  819         int                     i;
  820 
  821         cd = &sc->vr_cdata;
  822         ld = sc->vr_ldata;
  823         for (i = 0; i < VR_TX_LIST_CNT; i++) {
  824                 cd->vr_tx_chain[i].vr_ptr = &ld->vr_tx_list[i];
  825                 cd->vr_tx_chain[i].vr_paddr =
  826                     sc->sc_listmap->dm_segs[0].ds_addr +
  827                     offsetof(struct vr_list_data, vr_tx_list[i]);
  828 
  829                 if (bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1,
  830                     MCLBYTES, 0, BUS_DMA_NOWAIT, &cd->vr_tx_chain[i].vr_map))
  831                         return (ENOBUFS);
  832 
  833                 if (i == (VR_TX_LIST_CNT - 1))
  834                         cd->vr_tx_chain[i].vr_nextdesc = 
  835                                 &cd->vr_tx_chain[0];
  836                 else
  837                         cd->vr_tx_chain[i].vr_nextdesc =
  838                                 &cd->vr_tx_chain[i + 1];
  839         }
  840 
  841         cd->vr_tx_cons = cd->vr_tx_prod = &cd->vr_tx_chain[0];
  842 
  843         return (0);
  844 }
  845 
  846 
  847 /*
  848  * Initialize the RX descriptors and allocate mbufs for them. Note that
  849  * we arrange the descriptors in a closed ring, so that the last descriptor
  850  * points back to the first.
  851  */
  852 int
  853 vr_list_rx_init(struct vr_softc *sc)
  854 {
  855         struct vr_chain_data    *cd;
  856         struct vr_list_data     *ld;
  857         int                     i;
  858         struct vr_desc          *d;
  859 
  860         cd = &sc->vr_cdata;
  861         ld = sc->vr_ldata;
  862 
  863         for (i = 0; i < VR_RX_LIST_CNT; i++) {
  864                 d = (struct vr_desc *)&ld->vr_rx_list[i];
  865                 cd->vr_rx_chain[i].vr_ptr = d;
  866                 cd->vr_rx_chain[i].vr_paddr =
  867                     sc->sc_listmap->dm_segs[0].ds_addr +
  868                     offsetof(struct vr_list_data, vr_rx_list[i]);
  869                 cd->vr_rx_chain[i].vr_buf =
  870                     (u_int8_t *)malloc(MCLBYTES, M_DEVBUF, M_NOWAIT);
  871                 if (cd->vr_rx_chain[i].vr_buf == NULL)
  872                         return (ENOBUFS);
  873 
  874                 if (bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1, MCLBYTES, 
  875                     0, BUS_DMA_NOWAIT | BUS_DMA_READ,
  876                     &cd->vr_rx_chain[i].vr_map))
  877                         return (ENOBUFS);
  878 
  879                 if (bus_dmamap_load(sc->sc_dmat, cd->vr_rx_chain[i].vr_map,
  880                     cd->vr_rx_chain[i].vr_buf, MCLBYTES, NULL, BUS_DMA_NOWAIT))
  881                         return (ENOBUFS);
  882                 bus_dmamap_sync(sc->sc_dmat, cd->vr_rx_chain[i].vr_map,
  883                     0, cd->vr_rx_chain[i].vr_map->dm_mapsize,
  884                     BUS_DMASYNC_PREREAD);
  885 
  886                 d->vr_status = htole32(VR_RXSTAT);
  887                 d->vr_data =
  888                     htole32(cd->vr_rx_chain[i].vr_map->dm_segs[0].ds_addr +
  889                     sizeof(u_int64_t));
  890                 d->vr_ctl = htole32(VR_RXCTL | VR_RXLEN);
  891 
  892                 if (i == (VR_RX_LIST_CNT - 1)) {
  893                         cd->vr_rx_chain[i].vr_nextdesc =
  894                             &cd->vr_rx_chain[0];
  895                         ld->vr_rx_list[i].vr_next =
  896                             htole32(sc->sc_listmap->dm_segs[0].ds_addr +
  897                             offsetof(struct vr_list_data, vr_rx_list[0]));
  898                 } else {
  899                         cd->vr_rx_chain[i].vr_nextdesc =
  900                             &cd->vr_rx_chain[i + 1];
  901                         ld->vr_rx_list[i].vr_next =
  902                             htole32(sc->sc_listmap->dm_segs[0].ds_addr +
  903                             offsetof(struct vr_list_data, vr_rx_list[i + 1]));
  904                 }
  905         }
  906 
  907         cd->vr_rx_head = &cd->vr_rx_chain[0];
  908 
  909         bus_dmamap_sync(sc->sc_dmat, sc->sc_listmap, 0,
  910             sc->sc_listmap->dm_mapsize,
  911             BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
  912 
  913         return(0);
  914 }
  915 
  916 /*
  917  * A frame has been uploaded: pass the resulting mbuf chain up to
  918  * the higher level protocols.
  919  */
  920 void
  921 vr_rxeof(struct vr_softc *sc)
  922 {
  923         struct mbuf             *m0;
  924         struct ifnet            *ifp;
  925         struct vr_chain_onefrag *cur_rx;
  926         int                     total_len = 0;
  927         u_int32_t               rxstat;
  928 
  929         ifp = &sc->arpcom.ac_if;
  930 
  931         for (;;) {
  932 
  933                 bus_dmamap_sync(sc->sc_dmat, sc->sc_listmap,
  934                     0, sc->sc_listmap->dm_mapsize,
  935                     BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
  936                 rxstat = letoh32(sc->vr_cdata.vr_rx_head->vr_ptr->vr_status);
  937                 if (rxstat & VR_RXSTAT_OWN)
  938                         break;
  939 
  940                 m0 = NULL;
  941                 cur_rx = sc->vr_cdata.vr_rx_head;
  942                 sc->vr_cdata.vr_rx_head = cur_rx->vr_nextdesc;
  943 
  944                 /*
  945                  * If an error occurs, update stats, clear the
  946                  * status word and leave the mbuf cluster in place:
  947                  * it should simply get re-used next time this descriptor
  948                  * comes up in the ring.
  949                  */
  950                 if (rxstat & VR_RXSTAT_RXERR) {
  951                         ifp->if_ierrors++;
  952 #ifdef VR_DEBUG
  953                         printf("%s: rx error (%02x):",
  954                             sc->sc_dev.dv_xname, rxstat & 0x000000ff);
  955                         if (rxstat & VR_RXSTAT_CRCERR)
  956                                 printf(" crc error");
  957                         if (rxstat & VR_RXSTAT_FRAMEALIGNERR)
  958                                 printf(" frame alignment error");
  959                         if (rxstat & VR_RXSTAT_FIFOOFLOW)
  960                                 printf(" FIFO overflow");
  961                         if (rxstat & VR_RXSTAT_GIANT)
  962                                 printf(" received giant packet");
  963                         if (rxstat & VR_RXSTAT_RUNT)
  964                                 printf(" received runt packet");
  965                         if (rxstat & VR_RXSTAT_BUSERR)
  966                                 printf(" system bus error");
  967                         if (rxstat & VR_RXSTAT_BUFFERR)
  968                                 printf(" rx buffer error");
  969                         printf("\n");
  970 #endif
  971 
  972                         /* Reinitialize descriptor */
  973                         cur_rx->vr_ptr->vr_status = htole32(VR_RXSTAT);
  974                         cur_rx->vr_ptr->vr_data =
  975                             htole32(cur_rx->vr_map->dm_segs[0].ds_addr +
  976                             sizeof(u_int64_t));
  977                         cur_rx->vr_ptr->vr_ctl = htole32(VR_RXCTL | VR_RXLEN);
  978                         bus_dmamap_sync(sc->sc_dmat, sc->sc_listmap,
  979                             0, sc->sc_listmap->dm_mapsize,
  980                             BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
  981                         continue;
  982                 }
  983 
  984                 /* No errors; receive the packet. */    
  985                 total_len = VR_RXBYTES(letoh32(cur_rx->vr_ptr->vr_status));
  986 
  987                 /*
  988                  * XXX The VIA Rhine chip includes the CRC with every
  989                  * received frame, and there's no way to turn this
  990                  * behavior off (at least, I can't find anything in
  991                  * the manual that explains how to do it) so we have
  992                  * to trim off the CRC manually.
  993                  */
  994                 total_len -= ETHER_CRC_LEN;
  995 
  996                 bus_dmamap_sync(sc->sc_dmat, cur_rx->vr_map, 0,
  997                     cur_rx->vr_map->dm_mapsize,
  998                     BUS_DMASYNC_POSTREAD);
  999                 m0 = m_devget(cur_rx->vr_buf + sizeof(u_int64_t) - ETHER_ALIGN,
 1000                     total_len + ETHER_ALIGN, 0, ifp, NULL);
 1001                 bus_dmamap_sync(sc->sc_dmat, cur_rx->vr_map, 0,
 1002                     cur_rx->vr_map->dm_mapsize,
 1003                     BUS_DMASYNC_PREREAD);
 1004 
 1005                 /* Reinitialize descriptor */
 1006                 cur_rx->vr_ptr->vr_status = htole32(VR_RXSTAT);
 1007                 cur_rx->vr_ptr->vr_data =
 1008                     htole32(cur_rx->vr_map->dm_segs[0].ds_addr +
 1009                     sizeof(u_int64_t));
 1010                 cur_rx->vr_ptr->vr_ctl = htole32(VR_RXCTL | VR_RXLEN);
 1011                 bus_dmamap_sync(sc->sc_dmat, sc->sc_listmap, 0,
 1012                     sc->sc_listmap->dm_mapsize,
 1013                     BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
 1014 
 1015                 if (m0 == NULL) {
 1016                         ifp->if_ierrors++;
 1017                         continue;
 1018                 }
 1019                 m_adj(m0, ETHER_ALIGN);
 1020 
 1021                 ifp->if_ipackets++;
 1022 
 1023 #if NBPFILTER > 0
 1024                 /*
 1025                  * Handle BPF listeners. Let the BPF user see the packet.
 1026                  */
 1027                 if (ifp->if_bpf)
 1028                         bpf_mtap(ifp->if_bpf, m0, BPF_DIRECTION_IN);
 1029 #endif
 1030                 /* pass it on. */
 1031                 ether_input_mbuf(ifp, m0);
 1032         }
 1033 
 1034         bus_dmamap_sync(sc->sc_dmat, sc->sc_listmap,
 1035             0, sc->sc_listmap->dm_mapsize,
 1036             BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 1037 }
 1038 
 1039 void
 1040 vr_rxeoc(struct vr_softc *sc)
 1041 {
 1042         struct ifnet            *ifp;
 1043         int                     i;
 1044 
 1045         ifp = &sc->arpcom.ac_if;
 1046 
 1047         ifp->if_ierrors++;      
 1048 
 1049         VR_CLRBIT16(sc, VR_COMMAND, VR_CMD_RX_ON);      
 1050         DELAY(10000);  
 1051 
 1052         for (i = 0x400; 
 1053             i && (CSR_READ_2(sc, VR_COMMAND) & VR_CMD_RX_ON);
 1054             i--)  
 1055                 ;       /* Wait for receiver to stop */
 1056 
 1057         if (!i) {       
 1058                 printf("%s: rx shutdown error!\n", sc->sc_dev.dv_xname);
 1059                 sc->vr_flags |= VR_F_RESTART;
 1060                 return; 
 1061         }
 1062 
 1063         vr_rxeof(sc);
 1064 
 1065         CSR_WRITE_4(sc, VR_RXADDR, sc->vr_cdata.vr_rx_head->vr_paddr);
 1066         VR_SETBIT16(sc, VR_COMMAND, VR_CMD_RX_ON);
 1067         VR_SETBIT16(sc, VR_COMMAND, VR_CMD_RX_GO);
 1068 }
 1069 
 1070 /*
 1071  * A frame was downloaded to the chip. It's safe for us to clean up
 1072  * the list buffers.
 1073  */
 1074 
 1075 void
 1076 vr_txeof(struct vr_softc *sc)
 1077 {
 1078         struct vr_chain         *cur_tx;
 1079         struct ifnet            *ifp;
 1080 
 1081         ifp = &sc->arpcom.ac_if;
 1082 
 1083         /*
 1084          * Go through our tx list and free mbufs for those
 1085          * frames that have been transmitted.
 1086          */
 1087         cur_tx = sc->vr_cdata.vr_tx_cons;
 1088         while(cur_tx->vr_mbuf != NULL) {
 1089                 u_int32_t               txstat;
 1090                 int                     i;
 1091 
 1092                 txstat = letoh32(cur_tx->vr_ptr->vr_status);
 1093 
 1094                 if ((txstat & VR_TXSTAT_ABRT) ||
 1095                     (txstat & VR_TXSTAT_UDF)) {
 1096                         for (i = 0x400;
 1097                             i && (CSR_READ_2(sc, VR_COMMAND) & VR_CMD_TX_ON);
 1098                             i--)
 1099                                 ;       /* Wait for chip to shutdown */
 1100                         if (!i) {
 1101                                 printf("%s: tx shutdown timeout\n",
 1102                                     sc->sc_dev.dv_xname);
 1103                                 sc->vr_flags |= VR_F_RESTART;
 1104                                 break;
 1105                         }
 1106                         VR_TXOWN(cur_tx) = htole32(VR_TXSTAT_OWN);
 1107                         CSR_WRITE_4(sc, VR_TXADDR, cur_tx->vr_paddr);
 1108                         break;
 1109                 }
 1110 
 1111                 if (txstat & VR_TXSTAT_OWN)
 1112                         break;
 1113 
 1114                 if (txstat & VR_TXSTAT_ERRSUM) {
 1115                         ifp->if_oerrors++;
 1116                         if (txstat & VR_TXSTAT_DEFER)
 1117                                 ifp->if_collisions++;
 1118                         if (txstat & VR_TXSTAT_LATECOLL)
 1119                                 ifp->if_collisions++;
 1120                 }
 1121 
 1122                 ifp->if_collisions +=(txstat & VR_TXSTAT_COLLCNT) >> 3;
 1123 
 1124                 ifp->if_opackets++;
 1125                 if (cur_tx->vr_map != NULL && cur_tx->vr_map->dm_nsegs > 0)
 1126                         bus_dmamap_unload(sc->sc_dmat, cur_tx->vr_map);
 1127 
 1128                 m_freem(cur_tx->vr_mbuf);
 1129                 cur_tx->vr_mbuf = NULL;
 1130                 ifp->if_flags &= ~IFF_OACTIVE;
 1131 
 1132                 cur_tx = cur_tx->vr_nextdesc;
 1133         }
 1134 
 1135         sc->vr_cdata.vr_tx_cons = cur_tx;
 1136         if (cur_tx->vr_mbuf == NULL)
 1137                 ifp->if_timer = 0;
 1138 }
 1139 
 1140 void
 1141 vr_tick(void *xsc)
 1142 {
 1143         struct vr_softc *sc = xsc;
 1144         int s;
 1145 
 1146         s = splnet();
 1147         if (sc->vr_flags & VR_F_RESTART) {
 1148                 printf("%s: restarting\n", sc->sc_dev.dv_xname);
 1149                 vr_stop(sc);
 1150                 vr_reset(sc);   
 1151                 vr_init(sc);
 1152                 sc->vr_flags &= ~VR_F_RESTART;
 1153         }           
 1154 
 1155         mii_tick(&sc->sc_mii);
 1156         timeout_add(&sc->sc_to, hz);
 1157         splx(s);
 1158 }
 1159 
 1160 int
 1161 vr_intr(void *arg)
 1162 {
 1163         struct vr_softc         *sc;
 1164         struct ifnet            *ifp;
 1165         u_int16_t               status;
 1166         int claimed = 0;
 1167 
 1168         sc = arg;
 1169         ifp = &sc->arpcom.ac_if;
 1170 
 1171         /* Supress unwanted interrupts. */
 1172         if (!(ifp->if_flags & IFF_UP)) {
 1173                 vr_stop(sc);
 1174                 return 0;
 1175         }
 1176 
 1177         /* Disable interrupts. */
 1178         CSR_WRITE_2(sc, VR_IMR, 0x0000);
 1179 
 1180         for (;;) {
 1181 
 1182                 status = CSR_READ_2(sc, VR_ISR);
 1183                 if (status)
 1184                         CSR_WRITE_2(sc, VR_ISR, status);
 1185 
 1186                 if ((status & VR_INTRS) == 0)
 1187                         break;
 1188 
 1189                 claimed = 1;
 1190 
 1191                 if (status & VR_ISR_RX_OK)
 1192                         vr_rxeof(sc);
 1193 
 1194                 if (status & VR_ISR_RX_DROPPED) {
 1195 #ifdef VR_DEBUG
 1196                         printf("%s: rx packet lost\n", sc->sc_dev.dv_xname);
 1197 #endif
 1198                         ifp->if_ierrors++;
 1199                 }       
 1200 
 1201                 if ((status & VR_ISR_RX_ERR) || (status & VR_ISR_RX_NOBUF) ||
 1202                     (status & VR_ISR_RX_OFLOW)) {
 1203 #ifdef VR_DEBUG
 1204                         printf("%s: receive error (%04x)",
 1205                             sc->sc_dev.dv_xname, status);
 1206                         if (status & VR_ISR_RX_NOBUF)
 1207                                 printf(" no buffers");
 1208                         if (status & VR_ISR_RX_OFLOW)
 1209                                 printf(" overflow");
 1210                         printf("\n");
 1211 #endif
 1212                         vr_rxeoc(sc);
 1213                 }
 1214 
 1215                 if ((status & VR_ISR_BUSERR) || (status & VR_ISR_TX_UNDERRUN)) {
 1216 #ifdef VR_DEBUG
 1217                         if (status & VR_ISR_BUSERR)
 1218                                 printf("%s: PCI bus error\n",
 1219                                     sc->sc_dev.dv_xname);
 1220                         if (status & VR_ISR_TX_UNDERRUN)
 1221                                 printf("%s: transmit underrun\n",
 1222                                     sc->sc_dev.dv_xname);
 1223 #endif
 1224                         vr_reset(sc);
 1225                         vr_init(sc);
 1226                         break;
 1227                 }
 1228 
 1229                 if ((status & VR_ISR_TX_OK) || (status & VR_ISR_TX_ABRT) ||
 1230                     (status & VR_ISR_TX_ABRT2) || (status & VR_ISR_UDFI)) {
 1231                         vr_txeof(sc);
 1232                         if ((status & VR_ISR_UDFI) ||
 1233                             (status & VR_ISR_TX_ABRT2) ||
 1234                             (status & VR_ISR_TX_ABRT)) {
 1235 #ifdef VR_DEBUG
 1236                                 if (status & (VR_ISR_TX_ABRT | VR_ISR_TX_ABRT2))
 1237                                         printf("%s: transmit aborted\n",
 1238                                             sc->sc_dev.dv_xname);
 1239                                 if (status & VR_ISR_UDFI)
 1240                                         printf("%s: transmit underflow\n",
 1241                                             sc->sc_dev.dv_xname);
 1242 #endif
 1243                                 ifp->if_oerrors++;
 1244                                 if (sc->vr_cdata.vr_tx_cons->vr_mbuf != NULL) {
 1245                                         VR_SETBIT16(sc, VR_COMMAND,
 1246                                             VR_CMD_TX_ON);
 1247                                         VR_SETBIT16(sc, VR_COMMAND,
 1248                                             VR_CMD_TX_GO); 
 1249                                 }
 1250                         }
 1251                 }
 1252         }
 1253 
 1254         /* Re-enable interrupts. */
 1255         CSR_WRITE_2(sc, VR_IMR, VR_INTRS);
 1256 
 1257         if (!IFQ_IS_EMPTY(&ifp->if_snd))
 1258                 vr_start(ifp);
 1259 
 1260         return (claimed);
 1261 }
 1262 
 1263 /*
 1264  * Encapsulate an mbuf chain in a descriptor by coupling the mbuf data
 1265  * pointers to the fragment pointers.
 1266  */
 1267 int
 1268 vr_encap(struct vr_softc *sc, struct vr_chain *c, struct mbuf *m_head)
 1269 {
 1270         struct vr_desc          *f = NULL;
 1271         struct mbuf             *m_new = NULL;
 1272 
 1273         MGETHDR(m_new, M_DONTWAIT, MT_DATA);
 1274         if (m_new == NULL)
 1275                 return (1);
 1276         if (m_head->m_pkthdr.len > MHLEN) {
 1277                 MCLGET(m_new, M_DONTWAIT);
 1278                 if (!(m_new->m_flags & M_EXT)) {
 1279                         m_freem(m_new);
 1280                         return (1);
 1281                 }
 1282         }
 1283         m_copydata(m_head, 0, m_head->m_pkthdr.len, mtod(m_new, caddr_t));
 1284         m_new->m_pkthdr.len = m_new->m_len = m_head->m_pkthdr.len;
 1285 
 1286         /*
 1287          * The Rhine chip doesn't auto-pad, so we have to make
 1288          * sure to pad short frames out to the minimum frame length
 1289          * ourselves.
 1290          */
 1291         if (m_new->m_len < VR_MIN_FRAMELEN) {
 1292                 /* data field should be padded with octets of zero */
 1293                 bzero(&m_new->m_data[m_new->m_len],
 1294                     VR_MIN_FRAMELEN-m_new->m_len);
 1295                 m_new->m_pkthdr.len += VR_MIN_FRAMELEN - m_new->m_len;
 1296                 m_new->m_len = m_new->m_pkthdr.len;
 1297         }
 1298 
 1299         if (bus_dmamap_load_mbuf(sc->sc_dmat, c->vr_map, m_new,
 1300             BUS_DMA_NOWAIT | BUS_DMA_WRITE)) {
 1301                 m_freem(m_new);
 1302                 return (1);
 1303         }
 1304         bus_dmamap_sync(sc->sc_dmat, c->vr_map, 0, c->vr_map->dm_mapsize,
 1305             BUS_DMASYNC_PREWRITE);
 1306 
 1307         m_freem(m_head);
 1308 
 1309         c->vr_mbuf = m_new;
 1310 
 1311         f = c->vr_ptr;
 1312         f->vr_data = htole32(c->vr_map->dm_segs[0].ds_addr);
 1313         f->vr_ctl = htole32(c->vr_map->dm_mapsize);
 1314         f->vr_ctl |= htole32(VR_TXCTL_TLINK|VR_TXCTL_FIRSTFRAG);
 1315         f->vr_status = htole32(0);
 1316 
 1317         f->vr_ctl |= htole32(VR_TXCTL_LASTFRAG|VR_TXCTL_FINT);
 1318         f->vr_next = htole32(c->vr_nextdesc->vr_paddr);
 1319 
 1320         return (0);
 1321 }
 1322 
 1323 /*
 1324  * Main transmit routine. To avoid having to do mbuf copies, we put pointers
 1325  * to the mbuf data regions directly in the transmit lists. We also save a
 1326  * copy of the pointers since the transmit list fragment pointers are
 1327  * physical addresses.
 1328  */
 1329 
 1330 void
 1331 vr_start(struct ifnet *ifp)
 1332 {
 1333         struct vr_softc         *sc;
 1334         struct mbuf             *m_head;
 1335         struct vr_chain         *cur_tx;
 1336 
 1337         if (ifp->if_flags & IFF_OACTIVE)
 1338                 return;
 1339 
 1340         sc = ifp->if_softc;
 1341 
 1342         cur_tx = sc->vr_cdata.vr_tx_prod;
 1343         while (cur_tx->vr_mbuf == NULL) {
 1344                 IFQ_DEQUEUE(&ifp->if_snd, m_head);
 1345                 if (m_head == NULL)
 1346                         break;
 1347 
 1348                 /* Pack the data into the descriptor. */
 1349                 if (vr_encap(sc, cur_tx, m_head)) {
 1350                         /* Rollback, send what we were able to encap. */
 1351                         if (ALTQ_IS_ENABLED(&ifp->if_snd))
 1352                                 m_freem(m_head);
 1353                         else
 1354                                 IF_PREPEND(&ifp->if_snd, m_head);
 1355                         break;
 1356                 }
 1357 
 1358                 VR_TXOWN(cur_tx) = htole32(VR_TXSTAT_OWN);
 1359 
 1360 #if NBPFILTER > 0
 1361                 /*
 1362                  * If there's a BPF listener, bounce a copy of this frame
 1363                  * to him.
 1364                  */
 1365                 if (ifp->if_bpf)
 1366                         bpf_mtap(ifp->if_bpf, cur_tx->vr_mbuf,
 1367                         BPF_DIRECTION_OUT);
 1368 #endif
 1369                 cur_tx = cur_tx->vr_nextdesc;
 1370         }
 1371         if (cur_tx != sc->vr_cdata.vr_tx_prod || cur_tx->vr_mbuf != NULL) {
 1372                 sc->vr_cdata.vr_tx_prod = cur_tx;
 1373 
 1374                 bus_dmamap_sync(sc->sc_dmat, sc->sc_listmap, 0,
 1375                     sc->sc_listmap->dm_mapsize,
 1376                     BUS_DMASYNC_PREWRITE|BUS_DMASYNC_PREREAD);
 1377 
 1378                 /* Tell the chip to start transmitting. */
 1379                 VR_SETBIT16(sc, VR_COMMAND, /*VR_CMD_TX_ON|*/VR_CMD_TX_GO);
 1380 
 1381                 /* Set a timeout in case the chip goes out to lunch. */
 1382                 ifp->if_timer = 5;
 1383 
 1384                 if (cur_tx->vr_mbuf != NULL)
 1385                         ifp->if_flags |= IFF_OACTIVE;
 1386         }
 1387 }
 1388 
 1389 void
 1390 vr_init(void *xsc)
 1391 {
 1392         struct vr_softc         *sc = xsc;
 1393         struct ifnet            *ifp = &sc->arpcom.ac_if;
 1394         struct mii_data         *mii = &sc->sc_mii;
 1395         int                     s, i;
 1396 
 1397         s = splnet();
 1398 
 1399         /*
 1400          * Cancel pending I/O and free all RX/TX buffers.
 1401          */
 1402         vr_stop(sc);
 1403         vr_reset(sc);
 1404 
 1405         /*
 1406          * Set our station address.
 1407          */
 1408         for (i = 0; i < ETHER_ADDR_LEN; i++)
 1409                 CSR_WRITE_1(sc, VR_PAR0 + i, sc->arpcom.ac_enaddr[i]);
 1410 
 1411         /* Set DMA size */
 1412         VR_CLRBIT(sc, VR_BCR0, VR_BCR0_DMA_LENGTH);
 1413         VR_SETBIT(sc, VR_BCR0, VR_BCR0_DMA_STORENFWD);
 1414 
 1415         /*
 1416          * BCR0 and BCR1 can override the RXCFG and TXCFG registers,
 1417          * so we must set both.
 1418          */
 1419         VR_CLRBIT(sc, VR_BCR0, VR_BCR0_RX_THRESH);
 1420         VR_SETBIT(sc, VR_BCR0, VR_BCR0_RXTHRESH128BYTES);
 1421 
 1422         VR_CLRBIT(sc, VR_BCR1, VR_BCR1_TX_THRESH);
 1423         VR_SETBIT(sc, VR_BCR1, VR_BCR1_TXTHRESHSTORENFWD);
 1424 
 1425         VR_CLRBIT(sc, VR_RXCFG, VR_RXCFG_RX_THRESH);
 1426         VR_SETBIT(sc, VR_RXCFG, VR_RXTHRESH_128BYTES);
 1427 
 1428         VR_CLRBIT(sc, VR_TXCFG, VR_TXCFG_TX_THRESH);
 1429         VR_SETBIT(sc, VR_TXCFG, VR_TXTHRESH_STORENFWD);
 1430 
 1431         /* Init circular RX list. */
 1432         if (vr_list_rx_init(sc) == ENOBUFS) {
 1433                 printf("%s: initialization failed: no memory for rx buffers\n",
 1434                     sc->sc_dev.dv_xname);
 1435                 vr_stop(sc);
 1436                 splx(s);
 1437                 return;
 1438         }
 1439 
 1440         /*
 1441          * Init tx descriptors.
 1442          */
 1443         if (vr_list_tx_init(sc) == ENOBUFS) {
 1444                 printf("%s: initialization failed: no memory for tx buffers\n",
 1445                     sc->sc_dev.dv_xname);
 1446                 vr_stop(sc);
 1447                 splx(s);
 1448                 return;
 1449         }
 1450 
 1451         /* If we want promiscuous mode, set the allframes bit. */
 1452         if (ifp->if_flags & IFF_PROMISC)
 1453                 VR_SETBIT(sc, VR_RXCFG, VR_RXCFG_RX_PROMISC);
 1454         else
 1455                 VR_CLRBIT(sc, VR_RXCFG, VR_RXCFG_RX_PROMISC);
 1456 
 1457         /* Set capture broadcast bit to capture broadcast frames. */
 1458         if (ifp->if_flags & IFF_BROADCAST)
 1459                 VR_SETBIT(sc, VR_RXCFG, VR_RXCFG_RX_BROAD);
 1460         else
 1461                 VR_CLRBIT(sc, VR_RXCFG, VR_RXCFG_RX_BROAD);
 1462 
 1463         /*
 1464          * Program the multicast filter, if necessary.
 1465          */
 1466         vr_setmulti(sc);
 1467 
 1468         /*
 1469          * Load the address of the RX list.
 1470          */
 1471         CSR_WRITE_4(sc, VR_RXADDR, sc->vr_cdata.vr_rx_head->vr_paddr);
 1472 
 1473         /* Enable receiver and transmitter. */
 1474         CSR_WRITE_2(sc, VR_COMMAND, VR_CMD_TX_NOPOLL|VR_CMD_START|
 1475                                     VR_CMD_TX_ON|VR_CMD_RX_ON|
 1476                                     VR_CMD_RX_GO);
 1477 
 1478         CSR_WRITE_4(sc, VR_TXADDR, sc->sc_listmap->dm_segs[0].ds_addr +
 1479             offsetof(struct vr_list_data, vr_tx_list[0]));
 1480 
 1481         /*
 1482          * Enable interrupts.
 1483          */
 1484         CSR_WRITE_2(sc, VR_ISR, 0xFFFF);
 1485         CSR_WRITE_2(sc, VR_IMR, VR_INTRS);
 1486 
 1487         /* Restore state of BMCR */
 1488         mii_mediachg(mii);
 1489 
 1490         ifp->if_flags |= IFF_RUNNING;
 1491         ifp->if_flags &= ~IFF_OACTIVE;
 1492 
 1493         if (!timeout_pending(&sc->sc_to))
 1494                 timeout_add(&sc->sc_to, hz);
 1495 
 1496         splx(s);
 1497 }
 1498 
 1499 /*
 1500  * Set media options.
 1501  */
 1502 int
 1503 vr_ifmedia_upd(struct ifnet *ifp)
 1504 {
 1505         struct vr_softc         *sc = ifp->if_softc;
 1506 
 1507         if (ifp->if_flags & IFF_UP)
 1508                 vr_init(sc);
 1509 
 1510         return (0);
 1511 }
 1512 
 1513 /*
 1514  * Report current media status.
 1515  */
 1516 void
 1517 vr_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
 1518 {
 1519         struct vr_softc         *sc = ifp->if_softc;
 1520         struct mii_data         *mii = &sc->sc_mii;
 1521 
 1522         mii_pollstat(mii);
 1523         ifmr->ifm_active = mii->mii_media_active;
 1524         ifmr->ifm_status = mii->mii_media_status;
 1525 }
 1526 
 1527 int
 1528 vr_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
 1529 {
 1530         struct vr_softc         *sc = ifp->if_softc;
 1531         struct ifreq            *ifr = (struct ifreq *) data;
 1532         int                     s, error = 0;
 1533         struct ifaddr *ifa = (struct ifaddr *)data;
 1534 
 1535         s = splnet();
 1536 
 1537         if ((error = ether_ioctl(ifp, &sc->arpcom, command, data)) > 0) {
 1538                 splx(s);
 1539                 return error;
 1540         }
 1541 
 1542         switch(command) {
 1543         case SIOCSIFADDR:
 1544                 ifp->if_flags |= IFF_UP;
 1545                 if (!(ifp->if_flags & IFF_RUNNING))
 1546                         vr_init(sc);
 1547 #ifdef INET
 1548                 if (ifa->ifa_addr->sa_family == AF_INET)
 1549                         arp_ifinit(&sc->arpcom, ifa);
 1550 #endif
 1551                 break;
 1552         case SIOCSIFFLAGS:
 1553                 if (ifp->if_flags & IFF_UP) {
 1554                         if (ifp->if_flags & IFF_RUNNING &&
 1555                             ifp->if_flags & IFF_PROMISC &&
 1556                             !(sc->sc_if_flags & IFF_PROMISC)) {
 1557                                 VR_SETBIT(sc, VR_RXCFG,
 1558                                     VR_RXCFG_RX_PROMISC);
 1559                                 vr_setmulti(sc);
 1560                         } else if (ifp->if_flags & IFF_RUNNING &&
 1561                             !(ifp->if_flags & IFF_PROMISC) &&
 1562                             sc->sc_if_flags & IFF_PROMISC) {
 1563                                 VR_CLRBIT(sc, VR_RXCFG,
 1564                                     VR_RXCFG_RX_PROMISC);
 1565                                 vr_setmulti(sc);
 1566                         } else if (ifp->if_flags & IFF_RUNNING &&
 1567                             (ifp->if_flags ^ sc->sc_if_flags) & IFF_ALLMULTI) {
 1568                                 vr_setmulti(sc);
 1569                         } else {
 1570                                 if (!(ifp->if_flags & IFF_RUNNING))
 1571                                         vr_init(sc);
 1572                         }
 1573                 } else {
 1574                         if (ifp->if_flags & IFF_RUNNING)
 1575                                 vr_stop(sc);
 1576                 }
 1577                 sc->sc_if_flags = ifp->if_flags;
 1578                 break;
 1579         case SIOCADDMULTI:
 1580         case SIOCDELMULTI:
 1581                 error = (command == SIOCADDMULTI) ?
 1582                     ether_addmulti(ifr, &sc->arpcom) :
 1583                     ether_delmulti(ifr, &sc->arpcom);
 1584 
 1585                 if (error == ENETRESET) {
 1586                         /*
 1587                          * Multicast list has changed; set the hardware
 1588                          * filter accordingly.
 1589                          */
 1590                         if (ifp->if_flags & IFF_RUNNING)
 1591                                 vr_setmulti(sc);
 1592                         error = 0;
 1593                 }
 1594                 break;
 1595         case SIOCGIFMEDIA:
 1596         case SIOCSIFMEDIA:
 1597                 error = ifmedia_ioctl(ifp, ifr, &sc->sc_mii.mii_media, command);
 1598                 break;
 1599         default:
 1600                 error = ENOTTY;
 1601                 break;
 1602         }
 1603 
 1604         splx(s);
 1605 
 1606         return(error);
 1607 }
 1608 
 1609 void
 1610 vr_watchdog(struct ifnet *ifp)
 1611 {
 1612         struct vr_softc         *sc;
 1613 
 1614         sc = ifp->if_softc;
 1615 
 1616         ifp->if_oerrors++;
 1617         printf("%s: watchdog timeout\n", sc->sc_dev.dv_xname);
 1618 
 1619         vr_stop(sc);
 1620         vr_reset(sc);
 1621         vr_init(sc);
 1622 
 1623         if (!IFQ_IS_EMPTY(&ifp->if_snd))
 1624                 vr_start(ifp);
 1625 }
 1626 
 1627 /*
 1628  * Stop the adapter and free any mbufs allocated to the
 1629  * RX and TX lists.
 1630  */
 1631 void
 1632 vr_stop(struct vr_softc *sc)
 1633 {
 1634         int             i;
 1635         struct ifnet    *ifp;
 1636         bus_dmamap_t    map;
 1637 
 1638         ifp = &sc->arpcom.ac_if;
 1639         ifp->if_timer = 0;
 1640 
 1641         if (timeout_pending(&sc->sc_to))
 1642                 timeout_del(&sc->sc_to);
 1643 
 1644         ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
 1645 
 1646         VR_SETBIT16(sc, VR_COMMAND, VR_CMD_STOP);
 1647         VR_CLRBIT16(sc, VR_COMMAND, (VR_CMD_RX_ON|VR_CMD_TX_ON));
 1648         CSR_WRITE_2(sc, VR_IMR, 0x0000);
 1649         CSR_WRITE_4(sc, VR_TXADDR, 0x00000000);
 1650         CSR_WRITE_4(sc, VR_RXADDR, 0x00000000);
 1651 
 1652         /*
 1653          * Free data in the RX lists.
 1654          */
 1655         for (i = 0; i < VR_RX_LIST_CNT; i++) {
 1656 
 1657                 if (sc->vr_cdata.vr_rx_chain[i].vr_buf != NULL) {
 1658                         free(sc->vr_cdata.vr_rx_chain[i].vr_buf, M_DEVBUF);
 1659                         sc->vr_cdata.vr_rx_chain[i].vr_buf = NULL;
 1660                 }
 1661 
 1662                 map = sc->vr_cdata.vr_rx_chain[i].vr_map;
 1663                 if (map != NULL) {
 1664                         if (map->dm_nsegs > 0)
 1665                                 bus_dmamap_unload(sc->sc_dmat, map);
 1666                         bus_dmamap_destroy(sc->sc_dmat, map);
 1667                         sc->vr_cdata.vr_rx_chain[i].vr_map = NULL;
 1668                 }
 1669         }
 1670         bzero((char *)&sc->vr_ldata->vr_rx_list,
 1671                 sizeof(sc->vr_ldata->vr_rx_list));
 1672 
 1673         /*
 1674          * Free the TX list buffers.
 1675          */
 1676         for (i = 0; i < VR_TX_LIST_CNT; i++) {
 1677                 bus_dmamap_t map;
 1678 
 1679                 if (sc->vr_cdata.vr_tx_chain[i].vr_mbuf != NULL) {
 1680                         m_freem(sc->vr_cdata.vr_tx_chain[i].vr_mbuf);
 1681                         sc->vr_cdata.vr_tx_chain[i].vr_mbuf = NULL;
 1682                 }
 1683                 map = sc->vr_cdata.vr_tx_chain[i].vr_map;
 1684                 if (map != NULL) {
 1685                         if (map->dm_nsegs > 0)
 1686                                 bus_dmamap_unload(sc->sc_dmat, map);
 1687                         bus_dmamap_destroy(sc->sc_dmat, map);
 1688                         sc->vr_cdata.vr_tx_chain[i].vr_map = NULL;
 1689                 }
 1690         }
 1691 
 1692         bzero((char *)&sc->vr_ldata->vr_tx_list,
 1693                 sizeof(sc->vr_ldata->vr_tx_list));
 1694 }
 1695 
 1696 /*
 1697  * Stop all chip I/O so that the kernel's probe routines don't
 1698  * get confused by errant DMAs when rebooting.
 1699  */
 1700 void
 1701 vr_shutdown(void *arg)
 1702 {
 1703         struct vr_softc         *sc = (struct vr_softc *)arg;
 1704 
 1705         vr_stop(sc);
 1706 }

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