The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/sf/if_sf.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * SPDX-License-Identifier: BSD-4-Clause
    3  *
    4  * Copyright (c) 1997, 1998, 1999
    5  *      Bill Paul <wpaul@ctr.columbia.edu>.  All rights reserved.
    6  *
    7  * Redistribution and use in source and binary forms, with or without
    8  * modification, are permitted provided that the following conditions
    9  * are met:
   10  * 1. Redistributions of source code must retain the above copyright
   11  *    notice, this list of conditions and the following disclaimer.
   12  * 2. Redistributions in binary form must reproduce the above copyright
   13  *    notice, this list of conditions and the following disclaimer in the
   14  *    documentation and/or other materials provided with the distribution.
   15  * 3. All advertising materials mentioning features or use of this software
   16  *    must display the following acknowledgement:
   17  *      This product includes software developed by Bill Paul.
   18  * 4. Neither the name of the author nor the names of any co-contributors
   19  *    may be used to endorse or promote products derived from this software
   20  *    without specific prior written permission.
   21  *
   22  * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
   23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   25  * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
   26  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   27  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   28  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   29  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   30  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   31  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
   32  * THE POSSIBILITY OF SUCH DAMAGE.
   33  */
   34 
   35 #include <sys/cdefs.h>
   36 __FBSDID("$FreeBSD$");
   37 
   38 /*
   39  * Adaptec AIC-6915 "Starfire" PCI fast ethernet driver for FreeBSD.
   40  * Programming manual is available from:
   41  * http://download.adaptec.com/pdfs/user_guides/aic6915_pg.pdf.
   42  *
   43  * Written by Bill Paul <wpaul@ctr.columbia.edu>
   44  * Department of Electical Engineering
   45  * Columbia University, New York City
   46  */
   47 /*
   48  * The Adaptec AIC-6915 "Starfire" is a 64-bit 10/100 PCI ethernet
   49  * controller designed with flexibility and reducing CPU load in mind.
   50  * The Starfire offers high and low priority buffer queues, a
   51  * producer/consumer index mechanism and several different buffer
   52  * queue and completion queue descriptor types. Any one of a number
   53  * of different driver designs can be used, depending on system and
   54  * OS requirements. This driver makes use of type2 transmit frame
   55  * descriptors to take full advantage of fragmented packets buffers
   56  * and two RX buffer queues prioritized on size (one queue for small
   57  * frames that will fit into a single mbuf, another with full size
   58  * mbuf clusters for everything else). The producer/consumer indexes
   59  * and completion queues are also used.
   60  *
   61  * One downside to the Starfire has to do with alignment: buffer
   62  * queues must be aligned on 256-byte boundaries, and receive buffers
   63  * must be aligned on longword boundaries. The receive buffer alignment
   64  * causes problems on the strict alignment architecture, where the
   65  * packet payload should be longword aligned. There is no simple way
   66  * around this.
   67  *
   68  * For receive filtering, the Starfire offers 16 perfect filter slots
   69  * and a 512-bit hash table.
   70  *
   71  * The Starfire has no internal transceiver, relying instead on an
   72  * external MII-based transceiver. Accessing registers on external
   73  * PHYs is done through a special register map rather than with the
   74  * usual bitbang MDIO method.
   75  *
   76  * Acesssing the registers on the Starfire is a little tricky. The
   77  * Starfire has a 512K internal register space. When programmed for
   78  * PCI memory mapped mode, the entire register space can be accessed
   79  * directly. However in I/O space mode, only 256 bytes are directly
   80  * mapped into PCI I/O space. The other registers can be accessed
   81  * indirectly using the SF_INDIRECTIO_ADDR and SF_INDIRECTIO_DATA
   82  * registers inside the 256-byte I/O window.
   83  */
   84 
   85 #ifdef HAVE_KERNEL_OPTION_HEADERS
   86 #include "opt_device_polling.h"
   87 #endif
   88 
   89 #include <sys/param.h>
   90 #include <sys/systm.h>
   91 #include <sys/bus.h>
   92 #include <sys/endian.h>
   93 #include <sys/kernel.h>
   94 #include <sys/malloc.h>
   95 #include <sys/mbuf.h>
   96 #include <sys/rman.h>
   97 #include <sys/module.h>
   98 #include <sys/socket.h>
   99 #include <sys/sockio.h>
  100 #include <sys/sysctl.h>
  101 
  102 #include <net/bpf.h>
  103 #include <net/if.h>
  104 #include <net/if_var.h>
  105 #include <net/if_arp.h>
  106 #include <net/ethernet.h>
  107 #include <net/if_dl.h>
  108 #include <net/if_media.h>
  109 #include <net/if_types.h>
  110 #include <net/if_vlan_var.h>
  111 
  112 #include <dev/mii/mii.h>
  113 #include <dev/mii/miivar.h>
  114 
  115 #include <dev/pci/pcireg.h>
  116 #include <dev/pci/pcivar.h>
  117 
  118 #include <machine/bus.h>
  119 
  120 #include <dev/sf/if_sfreg.h>
  121 #include <dev/sf/starfire_rx.h>
  122 #include <dev/sf/starfire_tx.h>
  123 
  124 /* "device miibus" required.  See GENERIC if you get errors here. */
  125 #include "miibus_if.h"
  126 
  127 MODULE_DEPEND(sf, pci, 1, 1, 1);
  128 MODULE_DEPEND(sf, ether, 1, 1, 1);
  129 MODULE_DEPEND(sf, miibus, 1, 1, 1);
  130 
  131 #undef  SF_GFP_DEBUG
  132 #define SF_CSUM_FEATURES        (CSUM_TCP | CSUM_UDP)
  133 /* Define this to activate partial TCP/UDP checksum offload. */
  134 #undef  SF_PARTIAL_CSUM_SUPPORT
  135 
  136 static struct sf_type sf_devs[] = {
  137         { AD_VENDORID, AD_DEVICEID_STARFIRE, "Adaptec AIC-6915 10/100BaseTX",
  138             AD_SUBSYSID_62011_REV0, "Adaptec ANA-62011 (rev 0) 10/100BaseTX" },
  139         { AD_VENDORID, AD_DEVICEID_STARFIRE, "Adaptec AIC-6915 10/100BaseTX",
  140             AD_SUBSYSID_62011_REV1, "Adaptec ANA-62011 (rev 1) 10/100BaseTX" },
  141         { AD_VENDORID, AD_DEVICEID_STARFIRE, "Adaptec AIC-6915 10/100BaseTX",
  142             AD_SUBSYSID_62022, "Adaptec ANA-62022 10/100BaseTX" },
  143         { AD_VENDORID, AD_DEVICEID_STARFIRE, "Adaptec AIC-6915 10/100BaseTX",
  144             AD_SUBSYSID_62044_REV0, "Adaptec ANA-62044 (rev 0) 10/100BaseTX" },
  145         { AD_VENDORID, AD_DEVICEID_STARFIRE, "Adaptec AIC-6915 10/100BaseTX",
  146             AD_SUBSYSID_62044_REV1, "Adaptec ANA-62044 (rev 1) 10/100BaseTX" },
  147         { AD_VENDORID, AD_DEVICEID_STARFIRE, "Adaptec AIC-6915 10/100BaseTX",
  148             AD_SUBSYSID_62020, "Adaptec ANA-62020 10/100BaseFX" },
  149         { AD_VENDORID, AD_DEVICEID_STARFIRE, "Adaptec AIC-6915 10/100BaseTX",
  150             AD_SUBSYSID_69011, "Adaptec ANA-69011 10/100BaseTX" },
  151 };
  152 
  153 static int sf_probe(device_t);
  154 static int sf_attach(device_t);
  155 static int sf_detach(device_t);
  156 static int sf_shutdown(device_t);
  157 static int sf_suspend(device_t);
  158 static int sf_resume(device_t);
  159 static void sf_intr(void *);
  160 static void sf_tick(void *);
  161 static void sf_stats_update(struct sf_softc *);
  162 #ifndef __NO_STRICT_ALIGNMENT
  163 static __inline void sf_fixup_rx(struct mbuf *);
  164 #endif
  165 static int sf_rxeof(struct sf_softc *);
  166 static void sf_txeof(struct sf_softc *);
  167 static int sf_encap(struct sf_softc *, struct mbuf **);
  168 static void sf_start(struct ifnet *);
  169 static void sf_start_locked(struct ifnet *);
  170 static int sf_ioctl(struct ifnet *, u_long, caddr_t);
  171 static void sf_download_fw(struct sf_softc *);
  172 static void sf_init(void *);
  173 static void sf_init_locked(struct sf_softc *);
  174 static void sf_stop(struct sf_softc *);
  175 static void sf_watchdog(struct sf_softc *);
  176 static int sf_ifmedia_upd(struct ifnet *);
  177 static int sf_ifmedia_upd_locked(struct ifnet *);
  178 static void sf_ifmedia_sts(struct ifnet *, struct ifmediareq *);
  179 static void sf_reset(struct sf_softc *);
  180 static int sf_dma_alloc(struct sf_softc *);
  181 static void sf_dma_free(struct sf_softc *);
  182 static int sf_init_rx_ring(struct sf_softc *);
  183 static void sf_init_tx_ring(struct sf_softc *);
  184 static int sf_newbuf(struct sf_softc *, int);
  185 static void sf_rxfilter(struct sf_softc *);
  186 static int sf_setperf(struct sf_softc *, int, uint8_t *);
  187 static int sf_sethash(struct sf_softc *, caddr_t, int);
  188 #ifdef notdef
  189 static int sf_setvlan(struct sf_softc *, int, uint32_t);
  190 #endif
  191 
  192 static uint8_t sf_read_eeprom(struct sf_softc *, int);
  193 
  194 static int sf_miibus_readreg(device_t, int, int);
  195 static int sf_miibus_writereg(device_t, int, int, int);
  196 static void sf_miibus_statchg(device_t);
  197 #ifdef DEVICE_POLLING
  198 static int sf_poll(struct ifnet *ifp, enum poll_cmd cmd, int count);
  199 #endif
  200 
  201 static uint32_t csr_read_4(struct sf_softc *, int);
  202 static void csr_write_4(struct sf_softc *, int, uint32_t);
  203 static void sf_txthresh_adjust(struct sf_softc *);
  204 static int sf_sysctl_stats(SYSCTL_HANDLER_ARGS);
  205 static int sysctl_int_range(SYSCTL_HANDLER_ARGS, int, int);
  206 static int sysctl_hw_sf_int_mod(SYSCTL_HANDLER_ARGS);
  207 
  208 static device_method_t sf_methods[] = {
  209         /* Device interface */
  210         DEVMETHOD(device_probe,         sf_probe),
  211         DEVMETHOD(device_attach,        sf_attach),
  212         DEVMETHOD(device_detach,        sf_detach),
  213         DEVMETHOD(device_shutdown,      sf_shutdown),
  214         DEVMETHOD(device_suspend,       sf_suspend),
  215         DEVMETHOD(device_resume,        sf_resume),
  216 
  217         /* MII interface */
  218         DEVMETHOD(miibus_readreg,       sf_miibus_readreg),
  219         DEVMETHOD(miibus_writereg,      sf_miibus_writereg),
  220         DEVMETHOD(miibus_statchg,       sf_miibus_statchg),
  221 
  222         DEVMETHOD_END
  223 };
  224 
  225 static driver_t sf_driver = {
  226         "sf",
  227         sf_methods,
  228         sizeof(struct sf_softc),
  229 };
  230 
  231 static devclass_t sf_devclass;
  232 
  233 DRIVER_MODULE(sf, pci, sf_driver, sf_devclass, 0, 0);
  234 DRIVER_MODULE(miibus, sf, miibus_driver, miibus_devclass, 0, 0);
  235 
  236 #define SF_SETBIT(sc, reg, x)   \
  237         csr_write_4(sc, reg, csr_read_4(sc, reg) | (x))
  238 
  239 #define SF_CLRBIT(sc, reg, x)                           \
  240         csr_write_4(sc, reg, csr_read_4(sc, reg) & ~(x))
  241 
  242 static uint32_t
  243 csr_read_4(struct sf_softc *sc, int reg)
  244 {
  245         uint32_t                val;
  246 
  247         if (sc->sf_restype == SYS_RES_MEMORY)
  248                 val = CSR_READ_4(sc, (reg + SF_RMAP_INTREG_BASE));
  249         else {
  250                 CSR_WRITE_4(sc, SF_INDIRECTIO_ADDR, reg + SF_RMAP_INTREG_BASE);
  251                 val = CSR_READ_4(sc, SF_INDIRECTIO_DATA);
  252         }
  253 
  254         return (val);
  255 }
  256 
  257 static uint8_t
  258 sf_read_eeprom(struct sf_softc *sc, int reg)
  259 {
  260         uint8_t         val;
  261 
  262         val = (csr_read_4(sc, SF_EEADDR_BASE +
  263             (reg & 0xFFFFFFFC)) >> (8 * (reg & 3))) & 0xFF;
  264 
  265         return (val);
  266 }
  267 
  268 static void
  269 csr_write_4(struct sf_softc *sc, int reg, uint32_t val)
  270 {
  271 
  272         if (sc->sf_restype == SYS_RES_MEMORY)
  273                 CSR_WRITE_4(sc, (reg + SF_RMAP_INTREG_BASE), val);
  274         else {
  275                 CSR_WRITE_4(sc, SF_INDIRECTIO_ADDR, reg + SF_RMAP_INTREG_BASE);
  276                 CSR_WRITE_4(sc, SF_INDIRECTIO_DATA, val);
  277         }
  278 }
  279 
  280 /*
  281  * Copy the address 'mac' into the perfect RX filter entry at
  282  * offset 'idx.' The perfect filter only has 16 entries so do
  283  * some sanity tests.
  284  */
  285 static int
  286 sf_setperf(struct sf_softc *sc, int idx, uint8_t *mac)
  287 {
  288 
  289         if (idx < 0 || idx > SF_RXFILT_PERFECT_CNT)
  290                 return (EINVAL);
  291 
  292         if (mac == NULL)
  293                 return (EINVAL);
  294 
  295         csr_write_4(sc, SF_RXFILT_PERFECT_BASE +
  296             (idx * SF_RXFILT_PERFECT_SKIP) + 0, mac[5] | (mac[4] << 8));
  297         csr_write_4(sc, SF_RXFILT_PERFECT_BASE +
  298             (idx * SF_RXFILT_PERFECT_SKIP) + 4, mac[3] | (mac[2] << 8));
  299         csr_write_4(sc, SF_RXFILT_PERFECT_BASE +
  300             (idx * SF_RXFILT_PERFECT_SKIP) + 8, mac[1] | (mac[0] << 8));
  301 
  302         return (0);
  303 }
  304 
  305 /*
  306  * Set the bit in the 512-bit hash table that corresponds to the
  307  * specified mac address 'mac.' If 'prio' is nonzero, update the
  308  * priority hash table instead of the filter hash table.
  309  */
  310 static int
  311 sf_sethash(struct sf_softc *sc, caddr_t mac, int prio)
  312 {
  313         uint32_t                h;
  314 
  315         if (mac == NULL)
  316                 return (EINVAL);
  317 
  318         h = ether_crc32_be(mac, ETHER_ADDR_LEN) >> 23;
  319 
  320         if (prio) {
  321                 SF_SETBIT(sc, SF_RXFILT_HASH_BASE + SF_RXFILT_HASH_PRIOOFF +
  322                     (SF_RXFILT_HASH_SKIP * (h >> 4)), (1 << (h & 0xF)));
  323         } else {
  324                 SF_SETBIT(sc, SF_RXFILT_HASH_BASE + SF_RXFILT_HASH_ADDROFF +
  325                     (SF_RXFILT_HASH_SKIP * (h >> 4)), (1 << (h & 0xF)));
  326         }
  327 
  328         return (0);
  329 }
  330 
  331 #ifdef notdef
  332 /*
  333  * Set a VLAN tag in the receive filter.
  334  */
  335 static int
  336 sf_setvlan(struct sf_softc *sc, int idx, uint32_t vlan)
  337 {
  338 
  339         if (idx < 0 || idx >> SF_RXFILT_HASH_CNT)
  340                 return (EINVAL);
  341 
  342         csr_write_4(sc, SF_RXFILT_HASH_BASE +
  343             (idx * SF_RXFILT_HASH_SKIP) + SF_RXFILT_HASH_VLANOFF, vlan);
  344 
  345         return (0);
  346 }
  347 #endif
  348 
  349 static int
  350 sf_miibus_readreg(device_t dev, int phy, int reg)
  351 {
  352         struct sf_softc         *sc;
  353         int                     i;
  354         uint32_t                val = 0;
  355 
  356         sc = device_get_softc(dev);
  357 
  358         for (i = 0; i < SF_TIMEOUT; i++) {
  359                 val = csr_read_4(sc, SF_PHY_REG(phy, reg));
  360                 if ((val & SF_MII_DATAVALID) != 0)
  361                         break;
  362         }
  363 
  364         if (i == SF_TIMEOUT)
  365                 return (0);
  366 
  367         val &= SF_MII_DATAPORT;
  368         if (val == 0xffff)
  369                 return (0);
  370 
  371         return (val);
  372 }
  373 
  374 static int
  375 sf_miibus_writereg(device_t dev, int phy, int reg, int val)
  376 {
  377         struct sf_softc         *sc;
  378         int                     i;
  379         int                     busy;
  380 
  381         sc = device_get_softc(dev);
  382 
  383         csr_write_4(sc, SF_PHY_REG(phy, reg), val);
  384 
  385         for (i = 0; i < SF_TIMEOUT; i++) {
  386                 busy = csr_read_4(sc, SF_PHY_REG(phy, reg));
  387                 if ((busy & SF_MII_BUSY) == 0)
  388                         break;
  389         }
  390 
  391         return (0);
  392 }
  393 
  394 static void
  395 sf_miibus_statchg(device_t dev)
  396 {
  397         struct sf_softc         *sc;
  398         struct mii_data         *mii;
  399         struct ifnet            *ifp;
  400         uint32_t                val;
  401 
  402         sc = device_get_softc(dev);
  403         mii = device_get_softc(sc->sf_miibus);
  404         ifp = sc->sf_ifp;
  405         if (mii == NULL || ifp == NULL ||
  406             (ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
  407                 return;
  408 
  409         sc->sf_link = 0;
  410         if ((mii->mii_media_status & (IFM_ACTIVE | IFM_AVALID)) ==
  411             (IFM_ACTIVE | IFM_AVALID)) {
  412                 switch (IFM_SUBTYPE(mii->mii_media_active)) {
  413                 case IFM_10_T:
  414                 case IFM_100_TX:
  415                 case IFM_100_FX:
  416                         sc->sf_link = 1;
  417                         break;
  418                 }
  419         }
  420         if (sc->sf_link == 0)
  421                 return;
  422 
  423         val = csr_read_4(sc, SF_MACCFG_1);
  424         val &= ~SF_MACCFG1_FULLDUPLEX;
  425         val &= ~(SF_MACCFG1_RX_FLOWENB | SF_MACCFG1_TX_FLOWENB);
  426         if ((IFM_OPTIONS(mii->mii_media_active) & IFM_FDX) != 0) {
  427                 val |= SF_MACCFG1_FULLDUPLEX;
  428                 csr_write_4(sc, SF_BKTOBKIPG, SF_IPGT_FDX);
  429 #ifdef notyet
  430                 /* Configure flow-control bits. */
  431                 if ((IFM_OPTIONS(sc->sc_mii->mii_media_active) &
  432                     IFM_ETH_RXPAUSE) != 0)
  433                         val |= SF_MACCFG1_RX_FLOWENB;
  434                 if ((IFM_OPTIONS(sc->sc_mii->mii_media_active) &
  435                     IFM_ETH_TXPAUSE) != 0)
  436                         val |= SF_MACCFG1_TX_FLOWENB;
  437 #endif
  438         } else
  439                 csr_write_4(sc, SF_BKTOBKIPG, SF_IPGT_HDX);
  440 
  441         /* Make sure to reset MAC to take changes effect. */
  442         csr_write_4(sc, SF_MACCFG_1, val | SF_MACCFG1_SOFTRESET);
  443         DELAY(1000);
  444         csr_write_4(sc, SF_MACCFG_1, val);
  445 
  446         val = csr_read_4(sc, SF_TIMER_CTL);
  447         if (IFM_SUBTYPE(mii->mii_media_active) == IFM_100_TX)
  448                 val |= SF_TIMER_TIMES_TEN;
  449         else
  450                 val &= ~SF_TIMER_TIMES_TEN;
  451         csr_write_4(sc, SF_TIMER_CTL, val);
  452 }
  453 
  454 static void
  455 sf_rxfilter(struct sf_softc *sc)
  456 {
  457         struct ifnet            *ifp;
  458         int                     i;
  459         struct ifmultiaddr      *ifma;
  460         uint8_t                 dummy[ETHER_ADDR_LEN] = { 0, 0, 0, 0, 0, 0 };
  461         uint32_t                rxfilt;
  462 
  463         ifp = sc->sf_ifp;
  464 
  465         /* First zot all the existing filters. */
  466         for (i = 1; i < SF_RXFILT_PERFECT_CNT; i++)
  467                 sf_setperf(sc, i, dummy);
  468         for (i = SF_RXFILT_HASH_BASE; i < (SF_RXFILT_HASH_MAX + 1);
  469             i += sizeof(uint32_t))
  470                 csr_write_4(sc, i, 0);
  471 
  472         rxfilt = csr_read_4(sc, SF_RXFILT);
  473         rxfilt &= ~(SF_RXFILT_PROMISC | SF_RXFILT_ALLMULTI | SF_RXFILT_BROAD);
  474         if ((ifp->if_flags & IFF_BROADCAST) != 0)
  475                 rxfilt |= SF_RXFILT_BROAD;
  476         if ((ifp->if_flags & IFF_ALLMULTI) != 0 ||
  477             (ifp->if_flags & IFF_PROMISC) != 0) {
  478                 if ((ifp->if_flags & IFF_PROMISC) != 0)
  479                         rxfilt |= SF_RXFILT_PROMISC;
  480                 if ((ifp->if_flags & IFF_ALLMULTI) != 0)
  481                         rxfilt |= SF_RXFILT_ALLMULTI;
  482                 goto done;
  483         }
  484 
  485         /* Now program new ones. */
  486         i = 1;
  487         /* XXX how do we maintain reverse semantics without impl */
  488         if_maddr_rlock(ifp);
  489         CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs,
  490             ifma_link) {
  491                 if (ifma->ifma_addr->sa_family != AF_LINK)
  492                         continue;
  493                 /*
  494                  * Program the first 15 multicast groups
  495                  * into the perfect filter. For all others,
  496                  * use the hash table.
  497                  */
  498                 if (i < SF_RXFILT_PERFECT_CNT) {
  499                         sf_setperf(sc, i,
  500                             LLADDR((struct sockaddr_dl *)ifma->ifma_addr));
  501                         i++;
  502                         continue;
  503                 }
  504 
  505                 sf_sethash(sc,
  506                     LLADDR((struct sockaddr_dl *)ifma->ifma_addr), 0);
  507         }
  508         if_maddr_runlock(ifp);
  509 
  510 done:
  511         csr_write_4(sc, SF_RXFILT, rxfilt);
  512 }
  513 
  514 /*
  515  * Set media options.
  516  */
  517 static int
  518 sf_ifmedia_upd(struct ifnet *ifp)
  519 {
  520         struct sf_softc         *sc;
  521         int                     error;
  522 
  523         sc = ifp->if_softc;
  524         SF_LOCK(sc);
  525         error = sf_ifmedia_upd_locked(ifp);
  526         SF_UNLOCK(sc);
  527         return (error);
  528 }
  529 
  530 static int
  531 sf_ifmedia_upd_locked(struct ifnet *ifp)
  532 {
  533         struct sf_softc         *sc;
  534         struct mii_data         *mii;
  535         struct mii_softc        *miisc;
  536 
  537         sc = ifp->if_softc;
  538         mii = device_get_softc(sc->sf_miibus);
  539         LIST_FOREACH(miisc, &mii->mii_phys, mii_list)
  540                 PHY_RESET(miisc);
  541         return (mii_mediachg(mii));
  542 }
  543 
  544 /*
  545  * Report current media status.
  546  */
  547 static void
  548 sf_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
  549 {
  550         struct sf_softc         *sc;
  551         struct mii_data         *mii;
  552 
  553         sc = ifp->if_softc;
  554         SF_LOCK(sc);
  555         if ((ifp->if_flags & IFF_UP) == 0) {
  556                 SF_UNLOCK(sc);
  557                 return;
  558         }
  559 
  560         mii = device_get_softc(sc->sf_miibus);
  561         mii_pollstat(mii);
  562         ifmr->ifm_active = mii->mii_media_active;
  563         ifmr->ifm_status = mii->mii_media_status;
  564         SF_UNLOCK(sc);
  565 }
  566 
  567 static int
  568 sf_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
  569 {
  570         struct sf_softc         *sc;
  571         struct ifreq            *ifr;
  572         struct mii_data         *mii;
  573         int                     error, mask;
  574 
  575         sc = ifp->if_softc;
  576         ifr = (struct ifreq *)data;
  577         error = 0;
  578 
  579         switch (command) {
  580         case SIOCSIFFLAGS:
  581                 SF_LOCK(sc);
  582                 if (ifp->if_flags & IFF_UP) {
  583                         if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) {
  584                                 if ((ifp->if_flags ^ sc->sf_if_flags) &
  585                                     (IFF_PROMISC | IFF_ALLMULTI))
  586                                         sf_rxfilter(sc);
  587                         } else {
  588                                 if (sc->sf_detach == 0)
  589                                         sf_init_locked(sc);
  590                         }
  591                 } else {
  592                         if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
  593                                 sf_stop(sc);
  594                 }
  595                 sc->sf_if_flags = ifp->if_flags;
  596                 SF_UNLOCK(sc);
  597                 break;
  598         case SIOCADDMULTI:
  599         case SIOCDELMULTI:
  600                 SF_LOCK(sc);
  601                 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
  602                         sf_rxfilter(sc);
  603                 SF_UNLOCK(sc);
  604                 break;
  605         case SIOCGIFMEDIA:
  606         case SIOCSIFMEDIA:
  607                 mii = device_get_softc(sc->sf_miibus);
  608                 error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, command);
  609                 break;
  610         case SIOCSIFCAP:
  611                 mask = ifr->ifr_reqcap ^ ifp->if_capenable;
  612 #ifdef DEVICE_POLLING
  613                 if ((mask & IFCAP_POLLING) != 0) {
  614                         if ((ifr->ifr_reqcap & IFCAP_POLLING) != 0) {
  615                                 error = ether_poll_register(sf_poll, ifp);
  616                                 if (error != 0)
  617                                         break;
  618                                 SF_LOCK(sc);
  619                                 /* Disable interrupts. */
  620                                 csr_write_4(sc, SF_IMR, 0);
  621                                 ifp->if_capenable |= IFCAP_POLLING;
  622                                 SF_UNLOCK(sc);
  623                         } else {
  624                                 error = ether_poll_deregister(ifp);
  625                                 /* Enable interrupts. */
  626                                 SF_LOCK(sc);
  627                                 csr_write_4(sc, SF_IMR, SF_INTRS);
  628                                 ifp->if_capenable &= ~IFCAP_POLLING;
  629                                 SF_UNLOCK(sc);
  630                         }
  631                 }
  632 #endif /* DEVICE_POLLING */
  633                 if ((mask & IFCAP_TXCSUM) != 0) {
  634                         if ((IFCAP_TXCSUM & ifp->if_capabilities) != 0) {
  635                                 SF_LOCK(sc);
  636                                 ifp->if_capenable ^= IFCAP_TXCSUM;
  637                                 if ((IFCAP_TXCSUM & ifp->if_capenable) != 0) {
  638                                         ifp->if_hwassist |= SF_CSUM_FEATURES;
  639                                         SF_SETBIT(sc, SF_GEN_ETH_CTL,
  640                                             SF_ETHCTL_TXGFP_ENB);
  641                                 } else {
  642                                         ifp->if_hwassist &= ~SF_CSUM_FEATURES;
  643                                         SF_CLRBIT(sc, SF_GEN_ETH_CTL,
  644                                             SF_ETHCTL_TXGFP_ENB);
  645                                 }
  646                                 SF_UNLOCK(sc);
  647                         }
  648                 }
  649                 if ((mask & IFCAP_RXCSUM) != 0) {
  650                         if ((IFCAP_RXCSUM & ifp->if_capabilities) != 0) {
  651                                 SF_LOCK(sc);
  652                                 ifp->if_capenable ^= IFCAP_RXCSUM;
  653                                 if ((IFCAP_RXCSUM & ifp->if_capenable) != 0)
  654                                         SF_SETBIT(sc, SF_GEN_ETH_CTL,
  655                                             SF_ETHCTL_RXGFP_ENB);
  656                                 else
  657                                         SF_CLRBIT(sc, SF_GEN_ETH_CTL,
  658                                             SF_ETHCTL_RXGFP_ENB);
  659                                 SF_UNLOCK(sc);
  660                         }
  661                 }
  662                 break;
  663         default:
  664                 error = ether_ioctl(ifp, command, data);
  665                 break;
  666         }
  667 
  668         return (error);
  669 }
  670 
  671 static void
  672 sf_reset(struct sf_softc *sc)
  673 {
  674         int             i;
  675 
  676         csr_write_4(sc, SF_GEN_ETH_CTL, 0);
  677         SF_SETBIT(sc, SF_MACCFG_1, SF_MACCFG1_SOFTRESET);
  678         DELAY(1000);
  679         SF_CLRBIT(sc, SF_MACCFG_1, SF_MACCFG1_SOFTRESET);
  680 
  681         SF_SETBIT(sc, SF_PCI_DEVCFG, SF_PCIDEVCFG_RESET);
  682 
  683         for (i = 0; i < SF_TIMEOUT; i++) {
  684                 DELAY(10);
  685                 if (!(csr_read_4(sc, SF_PCI_DEVCFG) & SF_PCIDEVCFG_RESET))
  686                         break;
  687         }
  688 
  689         if (i == SF_TIMEOUT)
  690                 device_printf(sc->sf_dev, "reset never completed!\n");
  691 
  692         /* Wait a little while for the chip to get its brains in order. */
  693         DELAY(1000);
  694 }
  695 
  696 /*
  697  * Probe for an Adaptec AIC-6915 chip. Check the PCI vendor and device
  698  * IDs against our list and return a device name if we find a match.
  699  * We also check the subsystem ID so that we can identify exactly which
  700  * NIC has been found, if possible.
  701  */
  702 static int
  703 sf_probe(device_t dev)
  704 {
  705         struct sf_type          *t;
  706         uint16_t                vid;
  707         uint16_t                did;
  708         uint16_t                sdid;
  709         int                     i;
  710 
  711         vid = pci_get_vendor(dev);
  712         did = pci_get_device(dev);
  713         sdid = pci_get_subdevice(dev);
  714 
  715         t = sf_devs;
  716         for (i = 0; i < nitems(sf_devs); i++, t++) {
  717                 if (vid == t->sf_vid && did == t->sf_did) {
  718                         if (sdid == t->sf_sdid) {
  719                                 device_set_desc(dev, t->sf_sname);
  720                                 return (BUS_PROBE_DEFAULT);
  721                         }
  722                 }
  723         }
  724 
  725         if (vid == AD_VENDORID && did == AD_DEVICEID_STARFIRE) {
  726                 /* unknown subdevice */
  727                 device_set_desc(dev, sf_devs[0].sf_name);
  728                 return (BUS_PROBE_DEFAULT);
  729         }
  730 
  731         return (ENXIO);
  732 }
  733 
  734 /*
  735  * Attach the interface. Allocate softc structures, do ifmedia
  736  * setup and ethernet/BPF attach.
  737  */
  738 static int
  739 sf_attach(device_t dev)
  740 {
  741         int                     i;
  742         struct sf_softc         *sc;
  743         struct ifnet            *ifp;
  744         uint32_t                reg;
  745         int                     rid, error = 0;
  746         uint8_t                 eaddr[ETHER_ADDR_LEN];
  747 
  748         sc = device_get_softc(dev);
  749         sc->sf_dev = dev;
  750 
  751         mtx_init(&sc->sf_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK,
  752             MTX_DEF);
  753         callout_init_mtx(&sc->sf_co, &sc->sf_mtx, 0);
  754 
  755         /*
  756          * Map control/status registers.
  757          */
  758         pci_enable_busmaster(dev);
  759 
  760         /*
  761          * Prefer memory space register mapping over I/O space as the
  762          * hardware requires lots of register access to get various
  763          * producer/consumer index during Tx/Rx operation. However this
  764          * requires large memory space(512K) to map the entire register
  765          * space.
  766          */
  767         sc->sf_rid = PCIR_BAR(0);
  768         sc->sf_restype = SYS_RES_MEMORY;
  769         sc->sf_res = bus_alloc_resource_any(dev, sc->sf_restype, &sc->sf_rid,
  770             RF_ACTIVE);
  771         if (sc->sf_res == NULL) {
  772                 reg = pci_read_config(dev, PCIR_BAR(0), 4);
  773                 if ((reg & PCIM_BAR_MEM_64) == PCIM_BAR_MEM_64)
  774                         sc->sf_rid = PCIR_BAR(2);
  775                 else
  776                         sc->sf_rid = PCIR_BAR(1);
  777                 sc->sf_restype = SYS_RES_IOPORT;
  778                 sc->sf_res = bus_alloc_resource_any(dev, sc->sf_restype,
  779                     &sc->sf_rid, RF_ACTIVE);
  780                 if (sc->sf_res == NULL) {
  781                         device_printf(dev, "couldn't allocate resources\n");
  782                         mtx_destroy(&sc->sf_mtx);
  783                         return (ENXIO);
  784                 }
  785         }
  786         if (bootverbose)
  787                 device_printf(dev, "using %s space register mapping\n",
  788                     sc->sf_restype == SYS_RES_MEMORY ? "memory" : "I/O");
  789 
  790         reg = pci_read_config(dev, PCIR_CACHELNSZ, 1);
  791         if (reg == 0) {
  792                 /*
  793                  * If cache line size is 0, MWI is not used at all, so set
  794                  * reasonable default. AIC-6915 supports 0, 4, 8, 16, 32
  795                  * and 64.
  796                  */
  797                 reg = 16;
  798                 device_printf(dev, "setting PCI cache line size to %u\n", reg);
  799                 pci_write_config(dev, PCIR_CACHELNSZ, reg, 1);
  800         } else {
  801                 if (bootverbose)
  802                         device_printf(dev, "PCI cache line size : %u\n", reg);
  803         }
  804         /* Enable MWI. */
  805         reg = pci_read_config(dev, PCIR_COMMAND, 2);
  806         reg |= PCIM_CMD_MWRICEN;
  807         pci_write_config(dev, PCIR_COMMAND, reg, 2);
  808 
  809         /* Allocate interrupt. */
  810         rid = 0;
  811         sc->sf_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
  812             RF_SHAREABLE | RF_ACTIVE);
  813 
  814         if (sc->sf_irq == NULL) {
  815                 device_printf(dev, "couldn't map interrupt\n");
  816                 error = ENXIO;
  817                 goto fail;
  818         }
  819 
  820         SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
  821             SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
  822             OID_AUTO, "stats", CTLTYPE_INT | CTLFLAG_RW, sc, 0,
  823             sf_sysctl_stats, "I", "Statistics");
  824 
  825         SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
  826                 SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
  827                 OID_AUTO, "int_mod", CTLTYPE_INT | CTLFLAG_RW,
  828                 &sc->sf_int_mod, 0, sysctl_hw_sf_int_mod, "I",
  829                 "sf interrupt moderation");
  830         /* Pull in device tunables. */
  831         sc->sf_int_mod = SF_IM_DEFAULT;
  832         error = resource_int_value(device_get_name(dev), device_get_unit(dev),
  833             "int_mod", &sc->sf_int_mod);
  834         if (error == 0) {
  835                 if (sc->sf_int_mod < SF_IM_MIN ||
  836                     sc->sf_int_mod > SF_IM_MAX) {
  837                         device_printf(dev, "int_mod value out of range; "
  838                             "using default: %d\n", SF_IM_DEFAULT);
  839                         sc->sf_int_mod = SF_IM_DEFAULT;
  840                 }
  841         }
  842 
  843         /* Reset the adapter. */
  844         sf_reset(sc);
  845 
  846         /*
  847          * Get station address from the EEPROM.
  848          */
  849         for (i = 0; i < ETHER_ADDR_LEN; i++)
  850                 eaddr[i] =
  851                     sf_read_eeprom(sc, SF_EE_NODEADDR + ETHER_ADDR_LEN - i);
  852 
  853         /* Allocate DMA resources. */
  854         if (sf_dma_alloc(sc) != 0) {
  855                 error = ENOSPC;
  856                 goto fail;
  857         }
  858 
  859         sc->sf_txthresh = SF_MIN_TX_THRESHOLD;
  860 
  861         ifp = sc->sf_ifp = if_alloc(IFT_ETHER);
  862         if (ifp == NULL) {
  863                 device_printf(dev, "can not allocate ifnet structure\n");
  864                 error = ENOSPC;
  865                 goto fail;
  866         }
  867 
  868         /* Do MII setup. */
  869         error = mii_attach(dev, &sc->sf_miibus, ifp, sf_ifmedia_upd,
  870             sf_ifmedia_sts, BMSR_DEFCAPMASK, MII_PHY_ANY, MII_OFFSET_ANY, 0);
  871         if (error != 0) {
  872                 device_printf(dev, "attaching PHYs failed\n");
  873                 goto fail;
  874         }
  875 
  876         ifp->if_softc = sc;
  877         if_initname(ifp, device_get_name(dev), device_get_unit(dev));
  878         ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
  879         ifp->if_ioctl = sf_ioctl;
  880         ifp->if_start = sf_start;
  881         ifp->if_init = sf_init;
  882         IFQ_SET_MAXLEN(&ifp->if_snd, SF_TX_DLIST_CNT - 1);
  883         ifp->if_snd.ifq_drv_maxlen = SF_TX_DLIST_CNT - 1;
  884         IFQ_SET_READY(&ifp->if_snd);
  885         /*
  886          * With the help of firmware, AIC-6915 supports
  887          * Tx/Rx TCP/UDP checksum offload.
  888          */
  889         ifp->if_hwassist = SF_CSUM_FEATURES;
  890         ifp->if_capabilities = IFCAP_HWCSUM;
  891 
  892         /*
  893          * Call MI attach routine.
  894          */
  895         ether_ifattach(ifp, eaddr);
  896 
  897         /* VLAN capability setup. */
  898         ifp->if_capabilities |= IFCAP_VLAN_MTU;
  899         ifp->if_capenable = ifp->if_capabilities;
  900 #ifdef DEVICE_POLLING
  901         ifp->if_capabilities |= IFCAP_POLLING;
  902 #endif
  903         /*
  904          * Tell the upper layer(s) we support long frames.
  905          * Must appear after the call to ether_ifattach() because
  906          * ether_ifattach() sets ifi_hdrlen to the default value.
  907          */
  908         ifp->if_hdrlen = sizeof(struct ether_vlan_header);
  909 
  910         /* Hook interrupt last to avoid having to lock softc */
  911         error = bus_setup_intr(dev, sc->sf_irq, INTR_TYPE_NET | INTR_MPSAFE,
  912             NULL, sf_intr, sc, &sc->sf_intrhand);
  913 
  914         if (error) {
  915                 device_printf(dev, "couldn't set up irq\n");
  916                 ether_ifdetach(ifp);
  917                 goto fail;
  918         }
  919 
  920         gone_by_fcp101_dev(dev);
  921 
  922 fail:
  923         if (error)
  924                 sf_detach(dev);
  925 
  926         return (error);
  927 }
  928 
  929 /*
  930  * Shutdown hardware and free up resources. This can be called any
  931  * time after the mutex has been initialized. It is called in both
  932  * the error case in attach and the normal detach case so it needs
  933  * to be careful about only freeing resources that have actually been
  934  * allocated.
  935  */
  936 static int
  937 sf_detach(device_t dev)
  938 {
  939         struct sf_softc         *sc;
  940         struct ifnet            *ifp;
  941 
  942         sc = device_get_softc(dev);
  943         ifp = sc->sf_ifp;
  944 
  945 #ifdef DEVICE_POLLING
  946         if (ifp != NULL && ifp->if_capenable & IFCAP_POLLING)
  947                 ether_poll_deregister(ifp);
  948 #endif
  949 
  950         /* These should only be active if attach succeeded */
  951         if (device_is_attached(dev)) {
  952                 SF_LOCK(sc);
  953                 sc->sf_detach = 1;
  954                 sf_stop(sc);
  955                 SF_UNLOCK(sc);
  956                 callout_drain(&sc->sf_co);
  957                 if (ifp != NULL)
  958                         ether_ifdetach(ifp);
  959         }
  960         if (sc->sf_miibus) {
  961                 device_delete_child(dev, sc->sf_miibus);
  962                 sc->sf_miibus = NULL;
  963         }
  964         bus_generic_detach(dev);
  965 
  966         if (sc->sf_intrhand != NULL)
  967                 bus_teardown_intr(dev, sc->sf_irq, sc->sf_intrhand);
  968         if (sc->sf_irq != NULL)
  969                 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sf_irq);
  970         if (sc->sf_res != NULL)
  971                 bus_release_resource(dev, sc->sf_restype, sc->sf_rid,
  972                     sc->sf_res);
  973 
  974         sf_dma_free(sc);
  975         if (ifp != NULL)
  976                 if_free(ifp);
  977 
  978         mtx_destroy(&sc->sf_mtx);
  979 
  980         return (0);
  981 }
  982 
  983 struct sf_dmamap_arg {
  984         bus_addr_t              sf_busaddr;
  985 };
  986 
  987 static void
  988 sf_dmamap_cb(void *arg, bus_dma_segment_t *segs, int nseg, int error)
  989 {
  990         struct sf_dmamap_arg    *ctx;
  991 
  992         if (error != 0)
  993                 return;
  994         ctx = arg;
  995         ctx->sf_busaddr = segs[0].ds_addr;
  996 }
  997 
  998 static int
  999 sf_dma_alloc(struct sf_softc *sc)
 1000 {
 1001         struct sf_dmamap_arg    ctx;
 1002         struct sf_txdesc        *txd;
 1003         struct sf_rxdesc        *rxd;
 1004         bus_addr_t              lowaddr;
 1005         bus_addr_t              rx_ring_end, rx_cring_end;
 1006         bus_addr_t              tx_ring_end, tx_cring_end;
 1007         int                     error, i;
 1008 
 1009         lowaddr = BUS_SPACE_MAXADDR;
 1010 
 1011 again:
 1012         /* Create parent DMA tag. */
 1013         error = bus_dma_tag_create(
 1014             bus_get_dma_tag(sc->sf_dev),        /* parent */
 1015             1, 0,                       /* alignment, boundary */
 1016             lowaddr,                    /* lowaddr */
 1017             BUS_SPACE_MAXADDR,          /* highaddr */
 1018             NULL, NULL,                 /* filter, filterarg */
 1019             BUS_SPACE_MAXSIZE_32BIT,    /* maxsize */
 1020             0,                          /* nsegments */
 1021             BUS_SPACE_MAXSIZE_32BIT,    /* maxsegsize */
 1022             0,                          /* flags */
 1023             NULL, NULL,                 /* lockfunc, lockarg */
 1024             &sc->sf_cdata.sf_parent_tag);
 1025         if (error != 0) {
 1026                 device_printf(sc->sf_dev, "failed to create parent DMA tag\n");
 1027                 goto fail;
 1028         }
 1029         /* Create tag for Tx ring. */
 1030         error = bus_dma_tag_create(sc->sf_cdata.sf_parent_tag,/* parent */
 1031             SF_RING_ALIGN, 0,           /* alignment, boundary */
 1032             BUS_SPACE_MAXADDR,          /* lowaddr */
 1033             BUS_SPACE_MAXADDR,          /* highaddr */
 1034             NULL, NULL,                 /* filter, filterarg */
 1035             SF_TX_DLIST_SIZE,           /* maxsize */
 1036             1,                          /* nsegments */
 1037             SF_TX_DLIST_SIZE,           /* maxsegsize */
 1038             0,                          /* flags */
 1039             NULL, NULL,                 /* lockfunc, lockarg */
 1040             &sc->sf_cdata.sf_tx_ring_tag);
 1041         if (error != 0) {
 1042                 device_printf(sc->sf_dev, "failed to create Tx ring DMA tag\n");
 1043                 goto fail;
 1044         }
 1045 
 1046         /* Create tag for Tx completion ring. */
 1047         error = bus_dma_tag_create(sc->sf_cdata.sf_parent_tag,/* parent */
 1048             SF_RING_ALIGN, 0,           /* alignment, boundary */
 1049             BUS_SPACE_MAXADDR,          /* lowaddr */
 1050             BUS_SPACE_MAXADDR,          /* highaddr */
 1051             NULL, NULL,                 /* filter, filterarg */
 1052             SF_TX_CLIST_SIZE,           /* maxsize */
 1053             1,                          /* nsegments */
 1054             SF_TX_CLIST_SIZE,           /* maxsegsize */
 1055             0,                          /* flags */
 1056             NULL, NULL,                 /* lockfunc, lockarg */
 1057             &sc->sf_cdata.sf_tx_cring_tag);
 1058         if (error != 0) {
 1059                 device_printf(sc->sf_dev,
 1060                     "failed to create Tx completion ring DMA tag\n");
 1061                 goto fail;
 1062         }
 1063 
 1064         /* Create tag for Rx ring. */
 1065         error = bus_dma_tag_create(sc->sf_cdata.sf_parent_tag,/* parent */
 1066             SF_RING_ALIGN, 0,           /* alignment, boundary */
 1067             BUS_SPACE_MAXADDR,          /* lowaddr */
 1068             BUS_SPACE_MAXADDR,          /* highaddr */
 1069             NULL, NULL,                 /* filter, filterarg */
 1070             SF_RX_DLIST_SIZE,           /* maxsize */
 1071             1,                          /* nsegments */
 1072             SF_RX_DLIST_SIZE,           /* maxsegsize */
 1073             0,                          /* flags */
 1074             NULL, NULL,                 /* lockfunc, lockarg */
 1075             &sc->sf_cdata.sf_rx_ring_tag);
 1076         if (error != 0) {
 1077                 device_printf(sc->sf_dev,
 1078                     "failed to create Rx ring DMA tag\n");
 1079                 goto fail;
 1080         }
 1081 
 1082         /* Create tag for Rx completion ring. */
 1083         error = bus_dma_tag_create(sc->sf_cdata.sf_parent_tag,/* parent */
 1084             SF_RING_ALIGN, 0,           /* alignment, boundary */
 1085             BUS_SPACE_MAXADDR,          /* lowaddr */
 1086             BUS_SPACE_MAXADDR,          /* highaddr */
 1087             NULL, NULL,                 /* filter, filterarg */
 1088             SF_RX_CLIST_SIZE,           /* maxsize */
 1089             1,                          /* nsegments */
 1090             SF_RX_CLIST_SIZE,           /* maxsegsize */
 1091             0,                          /* flags */
 1092             NULL, NULL,                 /* lockfunc, lockarg */
 1093             &sc->sf_cdata.sf_rx_cring_tag);
 1094         if (error != 0) {
 1095                 device_printf(sc->sf_dev,
 1096                     "failed to create Rx completion ring DMA tag\n");
 1097                 goto fail;
 1098         }
 1099 
 1100         /* Create tag for Tx buffers. */
 1101         error = bus_dma_tag_create(sc->sf_cdata.sf_parent_tag,/* parent */
 1102             1, 0,                       /* alignment, boundary */
 1103             BUS_SPACE_MAXADDR,          /* lowaddr */
 1104             BUS_SPACE_MAXADDR,          /* highaddr */
 1105             NULL, NULL,                 /* filter, filterarg */
 1106             MCLBYTES * SF_MAXTXSEGS,    /* maxsize */
 1107             SF_MAXTXSEGS,               /* nsegments */
 1108             MCLBYTES,                   /* maxsegsize */
 1109             0,                          /* flags */
 1110             NULL, NULL,                 /* lockfunc, lockarg */
 1111             &sc->sf_cdata.sf_tx_tag);
 1112         if (error != 0) {
 1113                 device_printf(sc->sf_dev, "failed to create Tx DMA tag\n");
 1114                 goto fail;
 1115         }
 1116 
 1117         /* Create tag for Rx buffers. */
 1118         error = bus_dma_tag_create(sc->sf_cdata.sf_parent_tag,/* parent */
 1119             SF_RX_ALIGN, 0,             /* alignment, boundary */
 1120             BUS_SPACE_MAXADDR,          /* lowaddr */
 1121             BUS_SPACE_MAXADDR,          /* highaddr */
 1122             NULL, NULL,                 /* filter, filterarg */
 1123             MCLBYTES,                   /* maxsize */
 1124             1,                          /* nsegments */
 1125             MCLBYTES,                   /* maxsegsize */
 1126             0,                          /* flags */
 1127             NULL, NULL,                 /* lockfunc, lockarg */
 1128             &sc->sf_cdata.sf_rx_tag);
 1129         if (error != 0) {
 1130                 device_printf(sc->sf_dev, "failed to create Rx DMA tag\n");
 1131                 goto fail;
 1132         }
 1133 
 1134         /* Allocate DMA'able memory and load the DMA map for Tx ring. */
 1135         error = bus_dmamem_alloc(sc->sf_cdata.sf_tx_ring_tag,
 1136             (void **)&sc->sf_rdata.sf_tx_ring, BUS_DMA_WAITOK |
 1137             BUS_DMA_COHERENT | BUS_DMA_ZERO, &sc->sf_cdata.sf_tx_ring_map);
 1138         if (error != 0) {
 1139                 device_printf(sc->sf_dev,
 1140                     "failed to allocate DMA'able memory for Tx ring\n");
 1141                 goto fail;
 1142         }
 1143 
 1144         ctx.sf_busaddr = 0;
 1145         error = bus_dmamap_load(sc->sf_cdata.sf_tx_ring_tag,
 1146             sc->sf_cdata.sf_tx_ring_map, sc->sf_rdata.sf_tx_ring,
 1147             SF_TX_DLIST_SIZE, sf_dmamap_cb, &ctx, 0);
 1148         if (error != 0 || ctx.sf_busaddr == 0) {
 1149                 device_printf(sc->sf_dev,
 1150                     "failed to load DMA'able memory for Tx ring\n");
 1151                 goto fail;
 1152         }
 1153         sc->sf_rdata.sf_tx_ring_paddr = ctx.sf_busaddr;
 1154 
 1155         /*
 1156          * Allocate DMA'able memory and load the DMA map for Tx completion ring.
 1157          */
 1158         error = bus_dmamem_alloc(sc->sf_cdata.sf_tx_cring_tag,
 1159             (void **)&sc->sf_rdata.sf_tx_cring, BUS_DMA_WAITOK |
 1160             BUS_DMA_COHERENT | BUS_DMA_ZERO, &sc->sf_cdata.sf_tx_cring_map);
 1161         if (error != 0) {
 1162                 device_printf(sc->sf_dev,
 1163                     "failed to allocate DMA'able memory for "
 1164                     "Tx completion ring\n");
 1165                 goto fail;
 1166         }
 1167 
 1168         ctx.sf_busaddr = 0;
 1169         error = bus_dmamap_load(sc->sf_cdata.sf_tx_cring_tag,
 1170             sc->sf_cdata.sf_tx_cring_map, sc->sf_rdata.sf_tx_cring,
 1171             SF_TX_CLIST_SIZE, sf_dmamap_cb, &ctx, 0);
 1172         if (error != 0 || ctx.sf_busaddr == 0) {
 1173                 device_printf(sc->sf_dev,
 1174                     "failed to load DMA'able memory for Tx completion ring\n");
 1175                 goto fail;
 1176         }
 1177         sc->sf_rdata.sf_tx_cring_paddr = ctx.sf_busaddr;
 1178 
 1179         /* Allocate DMA'able memory and load the DMA map for Rx ring. */
 1180         error = bus_dmamem_alloc(sc->sf_cdata.sf_rx_ring_tag,
 1181             (void **)&sc->sf_rdata.sf_rx_ring, BUS_DMA_WAITOK |
 1182             BUS_DMA_COHERENT | BUS_DMA_ZERO, &sc->sf_cdata.sf_rx_ring_map);
 1183         if (error != 0) {
 1184                 device_printf(sc->sf_dev,
 1185                     "failed to allocate DMA'able memory for Rx ring\n");
 1186                 goto fail;
 1187         }
 1188 
 1189         ctx.sf_busaddr = 0;
 1190         error = bus_dmamap_load(sc->sf_cdata.sf_rx_ring_tag,
 1191             sc->sf_cdata.sf_rx_ring_map, sc->sf_rdata.sf_rx_ring,
 1192             SF_RX_DLIST_SIZE, sf_dmamap_cb, &ctx, 0);
 1193         if (error != 0 || ctx.sf_busaddr == 0) {
 1194                 device_printf(sc->sf_dev,
 1195                     "failed to load DMA'able memory for Rx ring\n");
 1196                 goto fail;
 1197         }
 1198         sc->sf_rdata.sf_rx_ring_paddr = ctx.sf_busaddr;
 1199 
 1200         /*
 1201          * Allocate DMA'able memory and load the DMA map for Rx completion ring.
 1202          */
 1203         error = bus_dmamem_alloc(sc->sf_cdata.sf_rx_cring_tag,
 1204             (void **)&sc->sf_rdata.sf_rx_cring, BUS_DMA_WAITOK |
 1205             BUS_DMA_COHERENT | BUS_DMA_ZERO, &sc->sf_cdata.sf_rx_cring_map);
 1206         if (error != 0) {
 1207                 device_printf(sc->sf_dev,
 1208                     "failed to allocate DMA'able memory for "
 1209                     "Rx completion ring\n");
 1210                 goto fail;
 1211         }
 1212 
 1213         ctx.sf_busaddr = 0;
 1214         error = bus_dmamap_load(sc->sf_cdata.sf_rx_cring_tag,
 1215             sc->sf_cdata.sf_rx_cring_map, sc->sf_rdata.sf_rx_cring,
 1216             SF_RX_CLIST_SIZE, sf_dmamap_cb, &ctx, 0);
 1217         if (error != 0 || ctx.sf_busaddr == 0) {
 1218                 device_printf(sc->sf_dev,
 1219                     "failed to load DMA'able memory for Rx completion ring\n");
 1220                 goto fail;
 1221         }
 1222         sc->sf_rdata.sf_rx_cring_paddr = ctx.sf_busaddr;
 1223 
 1224         /*
 1225          * Tx desciptor ring and Tx completion ring should be addressed in
 1226          * the same 4GB space. The same rule applys to Rx ring and Rx
 1227          * completion ring. Unfortunately there is no way to specify this
 1228          * boundary restriction with bus_dma(9). So just try to allocate
 1229          * without the restriction and check the restriction was satisfied.
 1230          * If not, fall back to 32bit dma addressing mode which always
 1231          * guarantees the restriction.
 1232          */
 1233         tx_ring_end = sc->sf_rdata.sf_tx_ring_paddr + SF_TX_DLIST_SIZE;
 1234         tx_cring_end = sc->sf_rdata.sf_tx_cring_paddr + SF_TX_CLIST_SIZE;
 1235         rx_ring_end = sc->sf_rdata.sf_rx_ring_paddr + SF_RX_DLIST_SIZE;
 1236         rx_cring_end = sc->sf_rdata.sf_rx_cring_paddr + SF_RX_CLIST_SIZE;
 1237         if ((SF_ADDR_HI(sc->sf_rdata.sf_tx_ring_paddr) !=
 1238             SF_ADDR_HI(tx_cring_end)) ||
 1239             (SF_ADDR_HI(sc->sf_rdata.sf_tx_cring_paddr) !=
 1240             SF_ADDR_HI(tx_ring_end)) ||
 1241             (SF_ADDR_HI(sc->sf_rdata.sf_rx_ring_paddr) !=
 1242             SF_ADDR_HI(rx_cring_end)) ||
 1243             (SF_ADDR_HI(sc->sf_rdata.sf_rx_cring_paddr) !=
 1244             SF_ADDR_HI(rx_ring_end))) {
 1245                 device_printf(sc->sf_dev,
 1246                     "switching to 32bit DMA mode\n");
 1247                 sf_dma_free(sc);
 1248                 /* Limit DMA address space to 32bit and try again. */
 1249                 lowaddr = BUS_SPACE_MAXADDR_32BIT;
 1250                 goto again;
 1251         }
 1252 
 1253         /* Create DMA maps for Tx buffers. */
 1254         for (i = 0; i < SF_TX_DLIST_CNT; i++) {
 1255                 txd = &sc->sf_cdata.sf_txdesc[i];
 1256                 txd->tx_m = NULL;
 1257                 txd->ndesc = 0;
 1258                 txd->tx_dmamap = NULL;
 1259                 error = bus_dmamap_create(sc->sf_cdata.sf_tx_tag, 0,
 1260                     &txd->tx_dmamap);
 1261                 if (error != 0) {
 1262                         device_printf(sc->sf_dev,
 1263                             "failed to create Tx dmamap\n");
 1264                         goto fail;
 1265                 }
 1266         }
 1267         /* Create DMA maps for Rx buffers. */
 1268         if ((error = bus_dmamap_create(sc->sf_cdata.sf_rx_tag, 0,
 1269             &sc->sf_cdata.sf_rx_sparemap)) != 0) {
 1270                 device_printf(sc->sf_dev,
 1271                     "failed to create spare Rx dmamap\n");
 1272                 goto fail;
 1273         }
 1274         for (i = 0; i < SF_RX_DLIST_CNT; i++) {
 1275                 rxd = &sc->sf_cdata.sf_rxdesc[i];
 1276                 rxd->rx_m = NULL;
 1277                 rxd->rx_dmamap = NULL;
 1278                 error = bus_dmamap_create(sc->sf_cdata.sf_rx_tag, 0,
 1279                     &rxd->rx_dmamap);
 1280                 if (error != 0) {
 1281                         device_printf(sc->sf_dev,
 1282                             "failed to create Rx dmamap\n");
 1283                         goto fail;
 1284                 }
 1285         }
 1286 
 1287 fail:
 1288         return (error);
 1289 }
 1290 
 1291 static void
 1292 sf_dma_free(struct sf_softc *sc)
 1293 {
 1294         struct sf_txdesc        *txd;
 1295         struct sf_rxdesc        *rxd;
 1296         int                     i;
 1297 
 1298         /* Tx ring. */
 1299         if (sc->sf_cdata.sf_tx_ring_tag) {
 1300                 if (sc->sf_rdata.sf_tx_ring_paddr)
 1301                         bus_dmamap_unload(sc->sf_cdata.sf_tx_ring_tag,
 1302                             sc->sf_cdata.sf_tx_ring_map);
 1303                 if (sc->sf_rdata.sf_tx_ring)
 1304                         bus_dmamem_free(sc->sf_cdata.sf_tx_ring_tag,
 1305                             sc->sf_rdata.sf_tx_ring,
 1306                             sc->sf_cdata.sf_tx_ring_map);
 1307                 sc->sf_rdata.sf_tx_ring = NULL;
 1308                 sc->sf_rdata.sf_tx_ring_paddr = 0;
 1309                 bus_dma_tag_destroy(sc->sf_cdata.sf_tx_ring_tag);
 1310                 sc->sf_cdata.sf_tx_ring_tag = NULL;
 1311         }
 1312         /* Tx completion ring. */
 1313         if (sc->sf_cdata.sf_tx_cring_tag) {
 1314                 if (sc->sf_rdata.sf_tx_cring_paddr)
 1315                         bus_dmamap_unload(sc->sf_cdata.sf_tx_cring_tag,
 1316                             sc->sf_cdata.sf_tx_cring_map);
 1317                 if (sc->sf_rdata.sf_tx_cring)
 1318                         bus_dmamem_free(sc->sf_cdata.sf_tx_cring_tag,
 1319                             sc->sf_rdata.sf_tx_cring,
 1320                             sc->sf_cdata.sf_tx_cring_map);
 1321                 sc->sf_rdata.sf_tx_cring = NULL;
 1322                 sc->sf_rdata.sf_tx_cring_paddr = 0;
 1323                 bus_dma_tag_destroy(sc->sf_cdata.sf_tx_cring_tag);
 1324                 sc->sf_cdata.sf_tx_cring_tag = NULL;
 1325         }
 1326         /* Rx ring. */
 1327         if (sc->sf_cdata.sf_rx_ring_tag) {
 1328                 if (sc->sf_rdata.sf_rx_ring_paddr)
 1329                         bus_dmamap_unload(sc->sf_cdata.sf_rx_ring_tag,
 1330                             sc->sf_cdata.sf_rx_ring_map);
 1331                 if (sc->sf_rdata.sf_rx_ring)
 1332                         bus_dmamem_free(sc->sf_cdata.sf_rx_ring_tag,
 1333                             sc->sf_rdata.sf_rx_ring,
 1334                             sc->sf_cdata.sf_rx_ring_map);
 1335                 sc->sf_rdata.sf_rx_ring = NULL;
 1336                 sc->sf_rdata.sf_rx_ring_paddr = 0;
 1337                 bus_dma_tag_destroy(sc->sf_cdata.sf_rx_ring_tag);
 1338                 sc->sf_cdata.sf_rx_ring_tag = NULL;
 1339         }
 1340         /* Rx completion ring. */
 1341         if (sc->sf_cdata.sf_rx_cring_tag) {
 1342                 if (sc->sf_rdata.sf_rx_cring_paddr)
 1343                         bus_dmamap_unload(sc->sf_cdata.sf_rx_cring_tag,
 1344                             sc->sf_cdata.sf_rx_cring_map);
 1345                 if (sc->sf_rdata.sf_rx_cring)
 1346                         bus_dmamem_free(sc->sf_cdata.sf_rx_cring_tag,
 1347                             sc->sf_rdata.sf_rx_cring,
 1348                             sc->sf_cdata.sf_rx_cring_map);
 1349                 sc->sf_rdata.sf_rx_cring = NULL;
 1350                 sc->sf_rdata.sf_rx_cring_paddr = 0;
 1351                 bus_dma_tag_destroy(sc->sf_cdata.sf_rx_cring_tag);
 1352                 sc->sf_cdata.sf_rx_cring_tag = NULL;
 1353         }
 1354         /* Tx buffers. */
 1355         if (sc->sf_cdata.sf_tx_tag) {
 1356                 for (i = 0; i < SF_TX_DLIST_CNT; i++) {
 1357                         txd = &sc->sf_cdata.sf_txdesc[i];
 1358                         if (txd->tx_dmamap) {
 1359                                 bus_dmamap_destroy(sc->sf_cdata.sf_tx_tag,
 1360                                     txd->tx_dmamap);
 1361                                 txd->tx_dmamap = NULL;
 1362                         }
 1363                 }
 1364                 bus_dma_tag_destroy(sc->sf_cdata.sf_tx_tag);
 1365                 sc->sf_cdata.sf_tx_tag = NULL;
 1366         }
 1367         /* Rx buffers. */
 1368         if (sc->sf_cdata.sf_rx_tag) {
 1369                 for (i = 0; i < SF_RX_DLIST_CNT; i++) {
 1370                         rxd = &sc->sf_cdata.sf_rxdesc[i];
 1371                         if (rxd->rx_dmamap) {
 1372                                 bus_dmamap_destroy(sc->sf_cdata.sf_rx_tag,
 1373                                     rxd->rx_dmamap);
 1374                                 rxd->rx_dmamap = NULL;
 1375                         }
 1376                 }
 1377                 if (sc->sf_cdata.sf_rx_sparemap) {
 1378                         bus_dmamap_destroy(sc->sf_cdata.sf_rx_tag,
 1379                             sc->sf_cdata.sf_rx_sparemap);
 1380                         sc->sf_cdata.sf_rx_sparemap = 0;
 1381                 }
 1382                 bus_dma_tag_destroy(sc->sf_cdata.sf_rx_tag);
 1383                 sc->sf_cdata.sf_rx_tag = NULL;
 1384         }
 1385 
 1386         if (sc->sf_cdata.sf_parent_tag) {
 1387                 bus_dma_tag_destroy(sc->sf_cdata.sf_parent_tag);
 1388                 sc->sf_cdata.sf_parent_tag = NULL;
 1389         }
 1390 }
 1391 
 1392 static int
 1393 sf_init_rx_ring(struct sf_softc *sc)
 1394 {
 1395         struct sf_ring_data     *rd;
 1396         int                     i;
 1397 
 1398         sc->sf_cdata.sf_rxc_cons = 0;
 1399 
 1400         rd = &sc->sf_rdata;
 1401         bzero(rd->sf_rx_ring, SF_RX_DLIST_SIZE);
 1402         bzero(rd->sf_rx_cring, SF_RX_CLIST_SIZE);
 1403 
 1404         for (i = 0; i < SF_RX_DLIST_CNT; i++) {
 1405                 if (sf_newbuf(sc, i) != 0)
 1406                         return (ENOBUFS);
 1407         }
 1408 
 1409         bus_dmamap_sync(sc->sf_cdata.sf_rx_cring_tag,
 1410             sc->sf_cdata.sf_rx_cring_map,
 1411             BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 1412         bus_dmamap_sync(sc->sf_cdata.sf_rx_ring_tag,
 1413             sc->sf_cdata.sf_rx_ring_map,
 1414             BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 1415 
 1416         return (0);
 1417 }
 1418 
 1419 static void
 1420 sf_init_tx_ring(struct sf_softc *sc)
 1421 {
 1422         struct sf_ring_data     *rd;
 1423         int                     i;
 1424 
 1425         sc->sf_cdata.sf_tx_prod = 0;
 1426         sc->sf_cdata.sf_tx_cnt = 0;
 1427         sc->sf_cdata.sf_txc_cons = 0;
 1428 
 1429         rd = &sc->sf_rdata;
 1430         bzero(rd->sf_tx_ring, SF_TX_DLIST_SIZE);
 1431         bzero(rd->sf_tx_cring, SF_TX_CLIST_SIZE);
 1432         for (i = 0; i < SF_TX_DLIST_CNT; i++) {
 1433                 rd->sf_tx_ring[i].sf_tx_ctrl = htole32(SF_TX_DESC_ID);
 1434                 sc->sf_cdata.sf_txdesc[i].tx_m = NULL;
 1435                 sc->sf_cdata.sf_txdesc[i].ndesc = 0;
 1436         }
 1437         rd->sf_tx_ring[i].sf_tx_ctrl |= htole32(SF_TX_DESC_END);
 1438 
 1439         bus_dmamap_sync(sc->sf_cdata.sf_tx_ring_tag,
 1440             sc->sf_cdata.sf_tx_ring_map,
 1441             BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 1442         bus_dmamap_sync(sc->sf_cdata.sf_tx_cring_tag,
 1443             sc->sf_cdata.sf_tx_cring_map,
 1444             BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 1445 }
 1446 
 1447 /*
 1448  * Initialize an RX descriptor and attach an MBUF cluster.
 1449  */
 1450 static int
 1451 sf_newbuf(struct sf_softc *sc, int idx)
 1452 {
 1453         struct sf_rx_rdesc      *desc;
 1454         struct sf_rxdesc        *rxd;
 1455         struct mbuf             *m;
 1456         bus_dma_segment_t       segs[1];
 1457         bus_dmamap_t            map;
 1458         int                     nsegs;
 1459 
 1460         m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
 1461         if (m == NULL)
 1462                 return (ENOBUFS);
 1463         m->m_len = m->m_pkthdr.len = MCLBYTES;
 1464         m_adj(m, sizeof(uint32_t));
 1465 
 1466         if (bus_dmamap_load_mbuf_sg(sc->sf_cdata.sf_rx_tag,
 1467             sc->sf_cdata.sf_rx_sparemap, m, segs, &nsegs, 0) != 0) {
 1468                 m_freem(m);
 1469                 return (ENOBUFS);
 1470         }
 1471         KASSERT(nsegs == 1, ("%s: %d segments returned!", __func__, nsegs));
 1472 
 1473         rxd = &sc->sf_cdata.sf_rxdesc[idx];
 1474         if (rxd->rx_m != NULL) {
 1475                 bus_dmamap_sync(sc->sf_cdata.sf_rx_tag, rxd->rx_dmamap,
 1476                     BUS_DMASYNC_POSTREAD);
 1477                 bus_dmamap_unload(sc->sf_cdata.sf_rx_tag, rxd->rx_dmamap);
 1478         }
 1479         map = rxd->rx_dmamap;
 1480         rxd->rx_dmamap = sc->sf_cdata.sf_rx_sparemap;
 1481         sc->sf_cdata.sf_rx_sparemap = map;
 1482         bus_dmamap_sync(sc->sf_cdata.sf_rx_tag, rxd->rx_dmamap,
 1483             BUS_DMASYNC_PREREAD);
 1484         rxd->rx_m = m;
 1485         desc = &sc->sf_rdata.sf_rx_ring[idx];
 1486         desc->sf_addr = htole64(segs[0].ds_addr);
 1487 
 1488         return (0);
 1489 }
 1490 
 1491 #ifndef __NO_STRICT_ALIGNMENT
 1492 static __inline void
 1493 sf_fixup_rx(struct mbuf *m)
 1494 {
 1495         int                     i;
 1496         uint16_t                *src, *dst;
 1497 
 1498         src = mtod(m, uint16_t *);
 1499         dst = src - 1;
 1500 
 1501         for (i = 0; i < (m->m_len / sizeof(uint16_t) + 1); i++)
 1502                 *dst++ = *src++;
 1503 
 1504         m->m_data -= ETHER_ALIGN;
 1505 }
 1506 #endif
 1507 
 1508 /*
 1509  * The starfire is programmed to use 'normal' mode for packet reception,
 1510  * which means we use the consumer/producer model for both the buffer
 1511  * descriptor queue and the completion descriptor queue. The only problem
 1512  * with this is that it involves a lot of register accesses: we have to
 1513  * read the RX completion consumer and producer indexes and the RX buffer
 1514  * producer index, plus the RX completion consumer and RX buffer producer
 1515  * indexes have to be updated. It would have been easier if Adaptec had
 1516  * put each index in a separate register, especially given that the damn
 1517  * NIC has a 512K register space.
 1518  *
 1519  * In spite of all the lovely features that Adaptec crammed into the 6915,
 1520  * it is marred by one truly stupid design flaw, which is that receive
 1521  * buffer addresses must be aligned on a longword boundary. This forces
 1522  * the packet payload to be unaligned, which is suboptimal on the x86 and
 1523  * completely unusable on the Alpha. Our only recourse is to copy received
 1524  * packets into properly aligned buffers before handing them off.
 1525  */
 1526 static int
 1527 sf_rxeof(struct sf_softc *sc)
 1528 {
 1529         struct mbuf             *m;
 1530         struct ifnet            *ifp;
 1531         struct sf_rxdesc        *rxd;
 1532         struct sf_rx_rcdesc     *cur_cmp;
 1533         int                     cons, eidx, prog, rx_npkts;
 1534         uint32_t                status, status2;
 1535 
 1536         SF_LOCK_ASSERT(sc);
 1537 
 1538         ifp = sc->sf_ifp;
 1539         rx_npkts = 0;
 1540 
 1541         bus_dmamap_sync(sc->sf_cdata.sf_rx_ring_tag,
 1542             sc->sf_cdata.sf_rx_ring_map,
 1543             BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
 1544         bus_dmamap_sync(sc->sf_cdata.sf_rx_cring_tag,
 1545             sc->sf_cdata.sf_rx_cring_map,
 1546             BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
 1547 
 1548         /*
 1549          * To reduce register access, directly read Receive completion
 1550          * queue entry.
 1551          */
 1552         eidx = 0;
 1553         prog = 0;
 1554         for (cons = sc->sf_cdata.sf_rxc_cons;
 1555             (ifp->if_drv_flags & IFF_DRV_RUNNING) != 0;
 1556             SF_INC(cons, SF_RX_CLIST_CNT)) {
 1557                 cur_cmp = &sc->sf_rdata.sf_rx_cring[cons];
 1558                 status = le32toh(cur_cmp->sf_rx_status1);
 1559                 if (status == 0)
 1560                         break;
 1561 #ifdef DEVICE_POLLING
 1562                 if ((ifp->if_capenable & IFCAP_POLLING) != 0) {
 1563                         if (sc->rxcycles <= 0)
 1564                                 break;
 1565                         sc->rxcycles--;
 1566                 }
 1567 #endif
 1568                 prog++;
 1569                 eidx = (status & SF_RX_CMPDESC_EIDX) >> 16;
 1570                 rxd = &sc->sf_cdata.sf_rxdesc[eidx];
 1571                 m = rxd->rx_m;
 1572 
 1573                 /*
 1574                  * Note, IFCOUNTER_IPACKETS and IFCOUNTER_IERRORS
 1575                  * are handled in sf_stats_update().
 1576                  */
 1577                 if ((status & SF_RXSTAT1_OK) == 0) {
 1578                         cur_cmp->sf_rx_status1 = 0;
 1579                         continue;
 1580                 }
 1581 
 1582                 if (sf_newbuf(sc, eidx) != 0) {
 1583                         if_inc_counter(ifp, IFCOUNTER_IQDROPS, 1);
 1584                         cur_cmp->sf_rx_status1 = 0;
 1585                         continue;
 1586                 }
 1587 
 1588                 /* AIC-6915 supports TCP/UDP checksum offload. */
 1589                 if ((ifp->if_capenable & IFCAP_RXCSUM) != 0) {
 1590                         status2 = le32toh(cur_cmp->sf_rx_status2);
 1591                         /*
 1592                          * Sometimes AIC-6915 generates an interrupt to
 1593                          * warn RxGFP stall with bad checksum bit set
 1594                          * in status word. I'm not sure what conditioan
 1595                          * triggers it but recevied packet's checksum
 1596                          * was correct even though AIC-6915 does not
 1597                          * agree on this. This may be an indication of
 1598                          * firmware bug. To fix the issue, do not rely
 1599                          * on bad checksum bit in status word and let
 1600                          * upper layer verify integrity of received
 1601                          * frame.
 1602                          * Another nice feature of AIC-6915 is hardware
 1603                          * assistance of checksum calculation by
 1604                          * providing partial checksum value for received
 1605                          * frame. The partial checksum value can be used
 1606                          * to accelerate checksum computation for
 1607                          * fragmented TCP/UDP packets. Upper network
 1608                          * stack already takes advantage of the partial
 1609                          * checksum value in IP reassembly stage. But
 1610                          * I'm not sure the correctness of the partial
 1611                          * hardware checksum assistance as frequent
 1612                          * RxGFP stalls are seen on non-fragmented
 1613                          * frames. Due to the nature of the complexity
 1614                          * of checksum computation code in firmware it's
 1615                          * possible to see another bug in RxGFP so
 1616                          * ignore checksum assistance for fragmented
 1617                          * frames. This can be changed in future.
 1618                          */
 1619                         if ((status2 & SF_RXSTAT2_FRAG) == 0) {
 1620                                 if ((status2 & (SF_RXSTAT2_TCP |
 1621                                     SF_RXSTAT2_UDP)) != 0) {
 1622                                         if ((status2 & SF_RXSTAT2_CSUM_OK)) {
 1623                                                 m->m_pkthdr.csum_flags =
 1624                                                     CSUM_DATA_VALID |
 1625                                                     CSUM_PSEUDO_HDR;
 1626                                                 m->m_pkthdr.csum_data = 0xffff;
 1627                                         }
 1628                                 }
 1629                         }
 1630 #ifdef SF_PARTIAL_CSUM_SUPPORT
 1631                         else if ((status2 & SF_RXSTAT2_FRAG) != 0) {
 1632                                 if ((status2 & (SF_RXSTAT2_TCP |
 1633                                     SF_RXSTAT2_UDP)) != 0) {
 1634                                         if ((status2 & SF_RXSTAT2_PCSUM_OK)) {
 1635                                                 m->m_pkthdr.csum_flags =
 1636                                                     CSUM_DATA_VALID;
 1637                                                 m->m_pkthdr.csum_data =
 1638                                                     (status &
 1639                                                     SF_RX_CMPDESC_CSUM2);
 1640                                         }
 1641                                 }
 1642                         }
 1643 #endif
 1644                 }
 1645 
 1646                 m->m_pkthdr.len = m->m_len = status & SF_RX_CMPDESC_LEN;
 1647 #ifndef __NO_STRICT_ALIGNMENT
 1648                 sf_fixup_rx(m);
 1649 #endif
 1650                 m->m_pkthdr.rcvif = ifp;
 1651 
 1652                 SF_UNLOCK(sc);
 1653                 (*ifp->if_input)(ifp, m);
 1654                 SF_LOCK(sc);
 1655                 rx_npkts++;
 1656 
 1657                 /* Clear completion status. */
 1658                 cur_cmp->sf_rx_status1 = 0;
 1659         }
 1660 
 1661         if (prog > 0) {
 1662                 sc->sf_cdata.sf_rxc_cons = cons;
 1663                 bus_dmamap_sync(sc->sf_cdata.sf_rx_ring_tag,
 1664                     sc->sf_cdata.sf_rx_ring_map,
 1665                     BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 1666                 bus_dmamap_sync(sc->sf_cdata.sf_rx_cring_tag,
 1667                     sc->sf_cdata.sf_rx_cring_map,
 1668                     BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 1669 
 1670                 /* Update Rx completion Q1 consumer index. */
 1671                 csr_write_4(sc, SF_CQ_CONSIDX,
 1672                     (csr_read_4(sc, SF_CQ_CONSIDX) & ~SF_CQ_CONSIDX_RXQ1) |
 1673                     (cons & SF_CQ_CONSIDX_RXQ1));
 1674                 /* Update Rx descriptor Q1 ptr. */
 1675                 csr_write_4(sc, SF_RXDQ_PTR_Q1,
 1676                     (csr_read_4(sc, SF_RXDQ_PTR_Q1) & ~SF_RXDQ_PRODIDX) |
 1677                     (eidx & SF_RXDQ_PRODIDX));
 1678         }
 1679         return (rx_npkts);
 1680 }
 1681 
 1682 /*
 1683  * Read the transmit status from the completion queue and release
 1684  * mbufs. Note that the buffer descriptor index in the completion
 1685  * descriptor is an offset from the start of the transmit buffer
 1686  * descriptor list in bytes. This is important because the manual
 1687  * gives the impression that it should match the producer/consumer
 1688  * index, which is the offset in 8 byte blocks.
 1689  */
 1690 static void
 1691 sf_txeof(struct sf_softc *sc)
 1692 {
 1693         struct sf_txdesc        *txd;
 1694         struct sf_tx_rcdesc     *cur_cmp;
 1695         struct ifnet            *ifp;
 1696         uint32_t                status;
 1697         int                     cons, idx, prod;
 1698 
 1699         SF_LOCK_ASSERT(sc);
 1700 
 1701         ifp = sc->sf_ifp;
 1702 
 1703         bus_dmamap_sync(sc->sf_cdata.sf_tx_cring_tag,
 1704             sc->sf_cdata.sf_tx_cring_map,
 1705             BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
 1706 
 1707         cons = sc->sf_cdata.sf_txc_cons;
 1708         prod = (csr_read_4(sc, SF_CQ_PRODIDX) & SF_TXDQ_PRODIDX_HIPRIO) >> 16;
 1709         if (prod == cons)
 1710                 return;
 1711 
 1712         for (; cons != prod; SF_INC(cons, SF_TX_CLIST_CNT)) {
 1713                 cur_cmp = &sc->sf_rdata.sf_tx_cring[cons];
 1714                 status = le32toh(cur_cmp->sf_tx_status1);
 1715                 if (status == 0)
 1716                         break;
 1717                 switch (status & SF_TX_CMPDESC_TYPE) {
 1718                 case SF_TXCMPTYPE_TX:
 1719                         /* Tx complete entry. */
 1720                         break;
 1721                 case SF_TXCMPTYPE_DMA:
 1722                         /* DMA complete entry. */
 1723                         idx = status & SF_TX_CMPDESC_IDX;
 1724                         idx = idx / sizeof(struct sf_tx_rdesc);
 1725                         /*
 1726                          * We don't need to check Tx status here.
 1727                          * SF_ISR_TX_LOFIFO intr would handle this.
 1728                          * Note, IFCOUNTER_OPACKETS, IFCOUNTER_COLLISIONS
 1729                          * and IFCOUNTER_OERROR are handled in
 1730                          * sf_stats_update().
 1731                          */
 1732                         txd = &sc->sf_cdata.sf_txdesc[idx];
 1733                         if (txd->tx_m != NULL) {
 1734                                 bus_dmamap_sync(sc->sf_cdata.sf_tx_tag,
 1735                                     txd->tx_dmamap,
 1736                                     BUS_DMASYNC_POSTWRITE);
 1737                                 bus_dmamap_unload(sc->sf_cdata.sf_tx_tag,
 1738                                     txd->tx_dmamap);
 1739                                 m_freem(txd->tx_m);
 1740                                 txd->tx_m = NULL;
 1741                         }
 1742                         sc->sf_cdata.sf_tx_cnt -= txd->ndesc;
 1743                         KASSERT(sc->sf_cdata.sf_tx_cnt >= 0,
 1744                             ("%s: Active Tx desc counter was garbled\n",
 1745                             __func__));
 1746                         txd->ndesc = 0;
 1747                         ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
 1748                         break;
 1749                 default:
 1750                         /* It should not happen. */
 1751                         device_printf(sc->sf_dev,
 1752                             "unknown Tx completion type : 0x%08x : %d : %d\n",
 1753                             status, cons, prod);
 1754                         break;
 1755                 }
 1756                 cur_cmp->sf_tx_status1 = 0;
 1757         }
 1758 
 1759         sc->sf_cdata.sf_txc_cons = cons;
 1760         bus_dmamap_sync(sc->sf_cdata.sf_tx_cring_tag,
 1761             sc->sf_cdata.sf_tx_cring_map,
 1762             BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 1763 
 1764         if (sc->sf_cdata.sf_tx_cnt == 0)
 1765                 sc->sf_watchdog_timer = 0;
 1766 
 1767         /* Update Tx completion consumer index. */
 1768         csr_write_4(sc, SF_CQ_CONSIDX,
 1769             (csr_read_4(sc, SF_CQ_CONSIDX) & 0xffff) |
 1770             ((cons << 16) & 0xffff0000));
 1771 }
 1772 
 1773 static void
 1774 sf_txthresh_adjust(struct sf_softc *sc)
 1775 {
 1776         uint32_t                txfctl;
 1777 
 1778         device_printf(sc->sf_dev, "Tx underrun -- ");
 1779         if (sc->sf_txthresh < SF_MAX_TX_THRESHOLD) {
 1780                 txfctl = csr_read_4(sc, SF_TX_FRAMCTL);
 1781                 /* Increase Tx threshold 256 bytes. */
 1782                 sc->sf_txthresh += 16;
 1783                 if (sc->sf_txthresh > SF_MAX_TX_THRESHOLD)
 1784                         sc->sf_txthresh = SF_MAX_TX_THRESHOLD;
 1785                 txfctl &= ~SF_TXFRMCTL_TXTHRESH;
 1786                 txfctl |= sc->sf_txthresh;
 1787                 printf("increasing Tx threshold to %d bytes\n",
 1788                     sc->sf_txthresh * SF_TX_THRESHOLD_UNIT);
 1789                 csr_write_4(sc, SF_TX_FRAMCTL, txfctl);
 1790         } else
 1791                 printf("\n");
 1792 }
 1793 
 1794 #ifdef DEVICE_POLLING
 1795 static int
 1796 sf_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
 1797 {
 1798         struct sf_softc         *sc;
 1799         uint32_t                status;
 1800         int                     rx_npkts;
 1801 
 1802         sc = ifp->if_softc;
 1803         rx_npkts = 0;
 1804         SF_LOCK(sc);
 1805 
 1806         if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
 1807                 SF_UNLOCK(sc);
 1808                 return (rx_npkts);
 1809         }
 1810 
 1811         sc->rxcycles = count;
 1812         rx_npkts = sf_rxeof(sc);
 1813         sf_txeof(sc);
 1814         if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
 1815                 sf_start_locked(ifp);
 1816 
 1817         if (cmd == POLL_AND_CHECK_STATUS) {
 1818                 /* Reading the ISR register clears all interrrupts. */
 1819                 status = csr_read_4(sc, SF_ISR);
 1820 
 1821                 if ((status & SF_ISR_ABNORMALINTR) != 0) {
 1822                         if ((status & SF_ISR_STATSOFLOW) != 0)
 1823                                 sf_stats_update(sc);
 1824                         else if ((status & SF_ISR_TX_LOFIFO) != 0)
 1825                                 sf_txthresh_adjust(sc);
 1826                         else if ((status & SF_ISR_DMAERR) != 0) {
 1827                                 device_printf(sc->sf_dev,
 1828                                     "DMA error, resetting\n");
 1829                                 ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
 1830                                 sf_init_locked(sc);
 1831                                 SF_UNLOCK(sc);
 1832                                 return (rx_npkts);
 1833                         } else if ((status & SF_ISR_NO_TX_CSUM) != 0) {
 1834                                 sc->sf_statistics.sf_tx_gfp_stall++;
 1835 #ifdef  SF_GFP_DEBUG
 1836                                 device_printf(sc->sf_dev,
 1837                                     "TxGFP is not responding!\n");
 1838 #endif
 1839                         } else if ((status & SF_ISR_RXGFP_NORESP) != 0) {
 1840                                 sc->sf_statistics.sf_rx_gfp_stall++;
 1841 #ifdef  SF_GFP_DEBUG
 1842                                 device_printf(sc->sf_dev,
 1843                                     "RxGFP is not responding!\n");
 1844 #endif
 1845                         }
 1846                 }
 1847         }
 1848 
 1849         SF_UNLOCK(sc);
 1850         return (rx_npkts);
 1851 }
 1852 #endif /* DEVICE_POLLING */
 1853 
 1854 static void
 1855 sf_intr(void *arg)
 1856 {
 1857         struct sf_softc         *sc;
 1858         struct ifnet            *ifp;
 1859         uint32_t                status;
 1860         int                     cnt;
 1861 
 1862         sc = (struct sf_softc *)arg;
 1863         SF_LOCK(sc);
 1864 
 1865         if (sc->sf_suspended != 0)
 1866                 goto done_locked;
 1867 
 1868         /* Reading the ISR register clears all interrrupts. */
 1869         status = csr_read_4(sc, SF_ISR);
 1870         if (status == 0 || status == 0xffffffff ||
 1871             (status & SF_ISR_PCIINT_ASSERTED) == 0)
 1872                 goto done_locked;
 1873 
 1874         ifp = sc->sf_ifp;
 1875 #ifdef DEVICE_POLLING
 1876         if ((ifp->if_capenable & IFCAP_POLLING) != 0)
 1877                 goto done_locked;
 1878 #endif
 1879 
 1880         /* Disable interrupts. */
 1881         csr_write_4(sc, SF_IMR, 0x00000000);
 1882 
 1883         for (cnt = 32; (status & SF_INTRS) != 0;) {
 1884                 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
 1885                         break;
 1886                 if ((status & SF_ISR_RXDQ1_DMADONE) != 0)
 1887                         sf_rxeof(sc);
 1888 
 1889                 if ((status & (SF_ISR_TX_TXDONE | SF_ISR_TX_DMADONE |
 1890                     SF_ISR_TX_QUEUEDONE)) != 0)
 1891                         sf_txeof(sc);
 1892 
 1893                 if ((status & SF_ISR_ABNORMALINTR) != 0) {
 1894                         if ((status & SF_ISR_STATSOFLOW) != 0)
 1895                                 sf_stats_update(sc);
 1896                         else if ((status & SF_ISR_TX_LOFIFO) != 0)
 1897                                 sf_txthresh_adjust(sc);
 1898                         else if ((status & SF_ISR_DMAERR) != 0) {
 1899                                 device_printf(sc->sf_dev,
 1900                                     "DMA error, resetting\n");
 1901                                 ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
 1902                                 sf_init_locked(sc);
 1903                                 SF_UNLOCK(sc);
 1904                                 return;
 1905                         } else if ((status & SF_ISR_NO_TX_CSUM) != 0) {
 1906                                 sc->sf_statistics.sf_tx_gfp_stall++;
 1907 #ifdef  SF_GFP_DEBUG
 1908                                 device_printf(sc->sf_dev,
 1909                                     "TxGFP is not responding!\n");
 1910 #endif
 1911                         }
 1912                         else if ((status & SF_ISR_RXGFP_NORESP) != 0) {
 1913                                 sc->sf_statistics.sf_rx_gfp_stall++;
 1914 #ifdef  SF_GFP_DEBUG
 1915                                 device_printf(sc->sf_dev,
 1916                                     "RxGFP is not responding!\n");
 1917 #endif
 1918                         }
 1919                 }
 1920                 if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
 1921                         sf_start_locked(ifp);
 1922                 if (--cnt <= 0)
 1923                         break;
 1924                 /* Reading the ISR register clears all interrrupts. */
 1925                 status = csr_read_4(sc, SF_ISR);
 1926         }
 1927 
 1928         if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) {
 1929                 /* Re-enable interrupts. */
 1930                 csr_write_4(sc, SF_IMR, SF_INTRS);
 1931         }
 1932 
 1933 done_locked:
 1934         SF_UNLOCK(sc);
 1935 }
 1936 
 1937 static void
 1938 sf_download_fw(struct sf_softc *sc)
 1939 {
 1940         uint32_t gfpinst;
 1941         int i, ndx;
 1942         uint8_t *p;
 1943 
 1944         /*
 1945          * A FP instruction is composed of 48bits so we have to
 1946          * write it with two parts.
 1947          */
 1948         p = txfwdata;
 1949         ndx = 0;
 1950         for (i = 0; i < sizeof(txfwdata) / SF_GFP_INST_BYTES; i++) {
 1951                 gfpinst = p[2] << 24 | p[3] << 16 | p[4] << 8 | p[5];
 1952                 csr_write_4(sc, SF_TXGFP_MEM_BASE + ndx * 4, gfpinst);
 1953                 gfpinst = p[0] << 8 | p[1];
 1954                 csr_write_4(sc, SF_TXGFP_MEM_BASE + (ndx + 1) * 4, gfpinst);
 1955                 p += SF_GFP_INST_BYTES;
 1956                 ndx += 2;
 1957         }
 1958         if (bootverbose)
 1959                 device_printf(sc->sf_dev, "%d Tx instructions downloaded\n", i);
 1960 
 1961         p = rxfwdata;
 1962         ndx = 0;
 1963         for (i = 0; i < sizeof(rxfwdata) / SF_GFP_INST_BYTES; i++) {
 1964                 gfpinst = p[2] << 24 | p[3] << 16 | p[4] << 8 | p[5];
 1965                 csr_write_4(sc, SF_RXGFP_MEM_BASE + (ndx * 4), gfpinst);
 1966                 gfpinst = p[0] << 8 | p[1];
 1967                 csr_write_4(sc, SF_RXGFP_MEM_BASE + (ndx + 1) * 4, gfpinst);
 1968                 p += SF_GFP_INST_BYTES;
 1969                 ndx += 2;
 1970         }
 1971         if (bootverbose)
 1972                 device_printf(sc->sf_dev, "%d Rx instructions downloaded\n", i);
 1973 }
 1974 
 1975 static void
 1976 sf_init(void *xsc)
 1977 {
 1978         struct sf_softc         *sc;
 1979 
 1980         sc = (struct sf_softc *)xsc;
 1981         SF_LOCK(sc);
 1982         sf_init_locked(sc);
 1983         SF_UNLOCK(sc);
 1984 }
 1985 
 1986 static void
 1987 sf_init_locked(struct sf_softc *sc)
 1988 {
 1989         struct ifnet            *ifp;
 1990         uint8_t                 eaddr[ETHER_ADDR_LEN];
 1991         bus_addr_t              addr;
 1992         int                     i;
 1993 
 1994         SF_LOCK_ASSERT(sc);
 1995         ifp = sc->sf_ifp;
 1996         if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
 1997                 return;
 1998 
 1999         sf_stop(sc);
 2000         /* Reset the hardware to a known state. */
 2001         sf_reset(sc);
 2002 
 2003         /* Init all the receive filter registers */
 2004         for (i = SF_RXFILT_PERFECT_BASE;
 2005             i < (SF_RXFILT_HASH_MAX + 1); i += sizeof(uint32_t))
 2006                 csr_write_4(sc, i, 0);
 2007 
 2008         /* Empty stats counter registers. */
 2009         for (i = SF_STATS_BASE; i < (SF_STATS_END + 1); i += sizeof(uint32_t))
 2010                 csr_write_4(sc, i, 0);
 2011 
 2012         /* Init our MAC address. */
 2013         bcopy(IF_LLADDR(sc->sf_ifp), eaddr, sizeof(eaddr));
 2014         csr_write_4(sc, SF_PAR0,
 2015             eaddr[2] << 24 | eaddr[3] << 16 | eaddr[4] << 8 | eaddr[5]);
 2016         csr_write_4(sc, SF_PAR1, eaddr[0] << 8 | eaddr[1]);
 2017         sf_setperf(sc, 0, eaddr);
 2018 
 2019         if (sf_init_rx_ring(sc) == ENOBUFS) {
 2020                 device_printf(sc->sf_dev,
 2021                     "initialization failed: no memory for rx buffers\n");
 2022                 sf_stop(sc);
 2023                 return;
 2024         }
 2025 
 2026         sf_init_tx_ring(sc);
 2027 
 2028         /*
 2029          * 16 perfect address filtering.
 2030          * Hash only multicast destination address, Accept matching
 2031          * frames regardless of VLAN ID.
 2032          */
 2033         csr_write_4(sc, SF_RXFILT, SF_PERFMODE_NORMAL | SF_HASHMODE_ANYVLAN);
 2034 
 2035         /*
 2036          * Set Rx filter.
 2037          */
 2038         sf_rxfilter(sc);
 2039 
 2040         /* Init the completion queue indexes. */
 2041         csr_write_4(sc, SF_CQ_CONSIDX, 0);
 2042         csr_write_4(sc, SF_CQ_PRODIDX, 0);
 2043 
 2044         /* Init the RX completion queue. */
 2045         addr = sc->sf_rdata.sf_rx_cring_paddr;
 2046         csr_write_4(sc, SF_CQ_ADDR_HI, SF_ADDR_HI(addr));
 2047         csr_write_4(sc, SF_RXCQ_CTL_1, SF_ADDR_LO(addr) & SF_RXCQ_ADDR);
 2048         if (SF_ADDR_HI(addr) != 0)
 2049                 SF_SETBIT(sc, SF_RXCQ_CTL_1, SF_RXCQ_USE_64BIT);
 2050         /* Set RX completion queue type 2. */
 2051         SF_SETBIT(sc, SF_RXCQ_CTL_1, SF_RXCQTYPE_2);
 2052         csr_write_4(sc, SF_RXCQ_CTL_2, 0);
 2053 
 2054         /*
 2055          * Init RX DMA control.
 2056          * default RxHighPriority Threshold,
 2057          * default RxBurstSize, 128bytes.
 2058          */
 2059         SF_SETBIT(sc, SF_RXDMA_CTL,
 2060             SF_RXDMA_REPORTBADPKTS |
 2061             (SF_RXDMA_HIGHPRIO_THRESH << 8) |
 2062             SF_RXDMA_BURST);
 2063 
 2064         /* Init the RX buffer descriptor queue. */
 2065         addr = sc->sf_rdata.sf_rx_ring_paddr;
 2066         csr_write_4(sc, SF_RXDQ_ADDR_HI, SF_ADDR_HI(addr));
 2067         csr_write_4(sc, SF_RXDQ_ADDR_Q1, SF_ADDR_LO(addr));
 2068 
 2069         /* Set RX queue buffer length. */
 2070         csr_write_4(sc, SF_RXDQ_CTL_1,
 2071             ((MCLBYTES  - sizeof(uint32_t)) << 16) |
 2072             SF_RXDQCTL_64BITBADDR | SF_RXDQCTL_VARIABLE);
 2073 
 2074         if (SF_ADDR_HI(addr) != 0)
 2075                 SF_SETBIT(sc, SF_RXDQ_CTL_1, SF_RXDQCTL_64BITDADDR);
 2076         csr_write_4(sc, SF_RXDQ_PTR_Q1, SF_RX_DLIST_CNT - 1);
 2077         csr_write_4(sc, SF_RXDQ_CTL_2, 0);
 2078 
 2079         /* Init the TX completion queue */
 2080         addr = sc->sf_rdata.sf_tx_cring_paddr;
 2081         csr_write_4(sc, SF_TXCQ_CTL, SF_ADDR_LO(addr) & SF_TXCQ_ADDR);
 2082         if (SF_ADDR_HI(addr) != 0)
 2083                 SF_SETBIT(sc, SF_TXCQ_CTL, SF_TXCQ_USE_64BIT);
 2084 
 2085         /* Init the TX buffer descriptor queue. */
 2086         addr = sc->sf_rdata.sf_tx_ring_paddr;
 2087         csr_write_4(sc, SF_TXDQ_ADDR_HI, SF_ADDR_HI(addr));
 2088         csr_write_4(sc, SF_TXDQ_ADDR_HIPRIO, 0);
 2089         csr_write_4(sc, SF_TXDQ_ADDR_LOPRIO, SF_ADDR_LO(addr));
 2090         csr_write_4(sc, SF_TX_FRAMCTL,
 2091             SF_TXFRMCTL_CPLAFTERTX | sc->sf_txthresh);
 2092         csr_write_4(sc, SF_TXDQ_CTL,
 2093             SF_TXDMA_HIPRIO_THRESH << 24 |
 2094             SF_TXSKIPLEN_0BYTES << 16 |
 2095             SF_TXDDMA_BURST << 8 |
 2096             SF_TXBUFDESC_TYPE2 | SF_TXMINSPACE_UNLIMIT);
 2097         if (SF_ADDR_HI(addr) != 0)
 2098                 SF_SETBIT(sc, SF_TXDQ_CTL, SF_TXDQCTL_64BITADDR);
 2099 
 2100         /* Set VLAN Type register. */
 2101         csr_write_4(sc, SF_VLANTYPE, ETHERTYPE_VLAN);
 2102 
 2103         /* Set TxPause Timer. */
 2104         csr_write_4(sc, SF_TXPAUSETIMER, 0xffff);
 2105 
 2106         /* Enable autopadding of short TX frames. */
 2107         SF_SETBIT(sc, SF_MACCFG_1, SF_MACCFG1_AUTOPAD);
 2108         SF_SETBIT(sc, SF_MACCFG_2, SF_MACCFG2_AUTOVLANPAD);
 2109         /* Make sure to reset MAC to take changes effect. */
 2110         SF_SETBIT(sc, SF_MACCFG_1, SF_MACCFG1_SOFTRESET);
 2111         DELAY(1000);
 2112         SF_CLRBIT(sc, SF_MACCFG_1, SF_MACCFG1_SOFTRESET);
 2113 
 2114         /* Enable PCI bus master. */
 2115         SF_SETBIT(sc, SF_PCI_DEVCFG, SF_PCIDEVCFG_PCIMEN);
 2116 
 2117         /* Load StarFire firmware. */
 2118         sf_download_fw(sc);
 2119 
 2120         /* Intialize interrupt moderation. */
 2121         csr_write_4(sc, SF_TIMER_CTL, SF_TIMER_IMASK_MODE | SF_TIMER_TIMES_TEN |
 2122             (sc->sf_int_mod & SF_TIMER_IMASK_INTERVAL));
 2123 
 2124 #ifdef DEVICE_POLLING
 2125         /* Disable interrupts if we are polling. */
 2126         if ((ifp->if_capenable & IFCAP_POLLING) != 0)
 2127                 csr_write_4(sc, SF_IMR, 0x00000000);
 2128         else
 2129 #endif
 2130         /* Enable interrupts. */
 2131         csr_write_4(sc, SF_IMR, SF_INTRS);
 2132         SF_SETBIT(sc, SF_PCI_DEVCFG, SF_PCIDEVCFG_INTR_ENB);
 2133 
 2134         /* Enable the RX and TX engines. */
 2135         csr_write_4(sc, SF_GEN_ETH_CTL,
 2136             SF_ETHCTL_RX_ENB | SF_ETHCTL_RXDMA_ENB |
 2137             SF_ETHCTL_TX_ENB | SF_ETHCTL_TXDMA_ENB);
 2138 
 2139         if ((ifp->if_capenable & IFCAP_TXCSUM) != 0)
 2140                 SF_SETBIT(sc, SF_GEN_ETH_CTL, SF_ETHCTL_TXGFP_ENB);
 2141         else
 2142                 SF_CLRBIT(sc, SF_GEN_ETH_CTL, SF_ETHCTL_TXGFP_ENB);
 2143         if ((ifp->if_capenable & IFCAP_RXCSUM) != 0)
 2144                 SF_SETBIT(sc, SF_GEN_ETH_CTL, SF_ETHCTL_RXGFP_ENB);
 2145         else
 2146                 SF_CLRBIT(sc, SF_GEN_ETH_CTL, SF_ETHCTL_RXGFP_ENB);
 2147 
 2148         ifp->if_drv_flags |= IFF_DRV_RUNNING;
 2149         ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
 2150 
 2151         sc->sf_link = 0;
 2152         sf_ifmedia_upd_locked(ifp);
 2153 
 2154         callout_reset(&sc->sf_co, hz, sf_tick, sc);
 2155 }
 2156 
 2157 static int
 2158 sf_encap(struct sf_softc *sc, struct mbuf **m_head)
 2159 {
 2160         struct sf_txdesc        *txd;
 2161         struct sf_tx_rdesc      *desc;
 2162         struct mbuf             *m;
 2163         bus_dmamap_t            map;
 2164         bus_dma_segment_t       txsegs[SF_MAXTXSEGS];
 2165         int                     error, i, nsegs, prod, si;
 2166         int                     avail, nskip;
 2167 
 2168         SF_LOCK_ASSERT(sc);
 2169 
 2170         m = *m_head;
 2171         prod = sc->sf_cdata.sf_tx_prod;
 2172         txd = &sc->sf_cdata.sf_txdesc[prod];
 2173         map = txd->tx_dmamap;
 2174         error = bus_dmamap_load_mbuf_sg(sc->sf_cdata.sf_tx_tag, map,
 2175             *m_head, txsegs, &nsegs, BUS_DMA_NOWAIT);
 2176         if (error == EFBIG) {
 2177                 m = m_collapse(*m_head, M_NOWAIT, SF_MAXTXSEGS);
 2178                 if (m == NULL) {
 2179                         m_freem(*m_head);
 2180                         *m_head = NULL;
 2181                         return (ENOBUFS);
 2182                 }
 2183                 *m_head = m;
 2184                 error = bus_dmamap_load_mbuf_sg(sc->sf_cdata.sf_tx_tag,
 2185                     map, *m_head, txsegs, &nsegs, BUS_DMA_NOWAIT);
 2186                 if (error != 0) {
 2187                         m_freem(*m_head);
 2188                         *m_head = NULL;
 2189                         return (error);
 2190                 }
 2191         } else if (error != 0)
 2192                 return (error);
 2193         if (nsegs == 0) {
 2194                 m_freem(*m_head);
 2195                 *m_head = NULL;
 2196                 return (EIO);
 2197         }
 2198 
 2199         /* Check number of available descriptors. */
 2200         avail = (SF_TX_DLIST_CNT - 1) - sc->sf_cdata.sf_tx_cnt;
 2201         if (avail < nsegs) {
 2202                 bus_dmamap_unload(sc->sf_cdata.sf_tx_tag, map);
 2203                 return (ENOBUFS);
 2204         }
 2205         nskip = 0;
 2206         if (prod + nsegs >= SF_TX_DLIST_CNT) {
 2207                 nskip = SF_TX_DLIST_CNT - prod - 1;
 2208                 if (avail < nsegs + nskip) {
 2209                         bus_dmamap_unload(sc->sf_cdata.sf_tx_tag, map);
 2210                         return (ENOBUFS);
 2211                 }
 2212         }
 2213 
 2214         bus_dmamap_sync(sc->sf_cdata.sf_tx_tag, map, BUS_DMASYNC_PREWRITE);
 2215 
 2216         si = prod;
 2217         for (i = 0; i < nsegs; i++) {
 2218                 desc = &sc->sf_rdata.sf_tx_ring[prod];
 2219                 desc->sf_tx_ctrl = htole32(SF_TX_DESC_ID |
 2220                     (txsegs[i].ds_len & SF_TX_DESC_FRAGLEN));
 2221                 desc->sf_tx_reserved = 0;
 2222                 desc->sf_addr = htole64(txsegs[i].ds_addr);
 2223                 if (i == 0 && prod + nsegs >= SF_TX_DLIST_CNT) {
 2224                         /* Queue wraps! */
 2225                         desc->sf_tx_ctrl |= htole32(SF_TX_DESC_END);
 2226                         prod = 0;
 2227                 } else
 2228                         SF_INC(prod, SF_TX_DLIST_CNT);
 2229         }
 2230         /* Update producer index. */
 2231         sc->sf_cdata.sf_tx_prod = prod;
 2232         sc->sf_cdata.sf_tx_cnt += nsegs + nskip;
 2233 
 2234         desc = &sc->sf_rdata.sf_tx_ring[si];
 2235         /* Check TDP/UDP checksum offload request. */
 2236         if ((m->m_pkthdr.csum_flags & SF_CSUM_FEATURES) != 0)
 2237                 desc->sf_tx_ctrl |= htole32(SF_TX_DESC_CALTCP);
 2238         desc->sf_tx_ctrl |=
 2239             htole32(SF_TX_DESC_CRCEN | SF_TX_DESC_INTR | (nsegs << 16));
 2240 
 2241         txd->tx_dmamap = map;
 2242         txd->tx_m = m;
 2243         txd->ndesc = nsegs + nskip;
 2244 
 2245         return (0);
 2246 }
 2247 
 2248 static void
 2249 sf_start(struct ifnet *ifp)
 2250 {
 2251         struct sf_softc         *sc;
 2252 
 2253         sc = ifp->if_softc;
 2254         SF_LOCK(sc);
 2255         sf_start_locked(ifp);
 2256         SF_UNLOCK(sc);
 2257 }
 2258 
 2259 static void
 2260 sf_start_locked(struct ifnet *ifp)
 2261 {
 2262         struct sf_softc         *sc;
 2263         struct mbuf             *m_head;
 2264         int                     enq;
 2265 
 2266         sc = ifp->if_softc;
 2267         SF_LOCK_ASSERT(sc);
 2268 
 2269         if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
 2270             IFF_DRV_RUNNING || sc->sf_link == 0)
 2271                 return;
 2272 
 2273         /*
 2274          * Since we don't know when descriptor wrap occurrs in advance
 2275          * limit available number of active Tx descriptor counter to be
 2276          * higher than maximum number of DMA segments allowed in driver.
 2277          */
 2278         for (enq = 0; !IFQ_DRV_IS_EMPTY(&ifp->if_snd) &&
 2279             sc->sf_cdata.sf_tx_cnt < SF_TX_DLIST_CNT - SF_MAXTXSEGS; ) {
 2280                 IFQ_DRV_DEQUEUE(&ifp->if_snd, m_head);
 2281                 if (m_head == NULL)
 2282                         break;
 2283                 /*
 2284                  * Pack the data into the transmit ring. If we
 2285                  * don't have room, set the OACTIVE flag and wait
 2286                  * for the NIC to drain the ring.
 2287                  */
 2288                 if (sf_encap(sc, &m_head)) {
 2289                         if (m_head == NULL)
 2290                                 break;
 2291                         IFQ_DRV_PREPEND(&ifp->if_snd, m_head);
 2292                         ifp->if_drv_flags |= IFF_DRV_OACTIVE;
 2293                         break;
 2294                 }
 2295 
 2296                 enq++;
 2297                 /*
 2298                  * If there's a BPF listener, bounce a copy of this frame
 2299                  * to him.
 2300                  */
 2301                 ETHER_BPF_MTAP(ifp, m_head);
 2302         }
 2303 
 2304         if (enq > 0) {
 2305                 bus_dmamap_sync(sc->sf_cdata.sf_tx_ring_tag,
 2306                     sc->sf_cdata.sf_tx_ring_map,
 2307                     BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 2308                 /* Kick transmit. */
 2309                 csr_write_4(sc, SF_TXDQ_PRODIDX,
 2310                     sc->sf_cdata.sf_tx_prod * (sizeof(struct sf_tx_rdesc) / 8));
 2311 
 2312                 /* Set a timeout in case the chip goes out to lunch. */
 2313                 sc->sf_watchdog_timer = 5;
 2314         }
 2315 }
 2316 
 2317 static void
 2318 sf_stop(struct sf_softc *sc)
 2319 {
 2320         struct sf_txdesc        *txd;
 2321         struct sf_rxdesc        *rxd;
 2322         struct ifnet            *ifp;
 2323         int                     i;
 2324 
 2325         SF_LOCK_ASSERT(sc);
 2326 
 2327         ifp = sc->sf_ifp;
 2328 
 2329         ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
 2330         sc->sf_link = 0;
 2331         callout_stop(&sc->sf_co);
 2332         sc->sf_watchdog_timer = 0;
 2333 
 2334         /* Reading the ISR register clears all interrrupts. */
 2335         csr_read_4(sc, SF_ISR);
 2336         /* Disable further interrupts. */
 2337         csr_write_4(sc, SF_IMR, 0);
 2338 
 2339         /* Disable Tx/Rx egine. */
 2340         csr_write_4(sc, SF_GEN_ETH_CTL, 0);
 2341 
 2342         /* Give hardware chance to drain active DMA cycles. */
 2343         DELAY(1000);
 2344 
 2345         csr_write_4(sc, SF_CQ_CONSIDX, 0);
 2346         csr_write_4(sc, SF_CQ_PRODIDX, 0);
 2347         csr_write_4(sc, SF_RXDQ_ADDR_Q1, 0);
 2348         csr_write_4(sc, SF_RXDQ_CTL_1, 0);
 2349         csr_write_4(sc, SF_RXDQ_PTR_Q1, 0);
 2350         csr_write_4(sc, SF_TXCQ_CTL, 0);
 2351         csr_write_4(sc, SF_TXDQ_ADDR_HIPRIO, 0);
 2352         csr_write_4(sc, SF_TXDQ_CTL, 0);
 2353 
 2354         /*
 2355          * Free RX and TX mbufs still in the queues.
 2356          */
 2357         for (i = 0; i < SF_RX_DLIST_CNT; i++) {
 2358                 rxd = &sc->sf_cdata.sf_rxdesc[i];
 2359                 if (rxd->rx_m != NULL) {
 2360                         bus_dmamap_sync(sc->sf_cdata.sf_rx_tag,
 2361                             rxd->rx_dmamap, BUS_DMASYNC_POSTREAD);
 2362                         bus_dmamap_unload(sc->sf_cdata.sf_rx_tag,
 2363                             rxd->rx_dmamap);
 2364                         m_freem(rxd->rx_m);
 2365                         rxd->rx_m = NULL;
 2366                 }
 2367         }
 2368         for (i = 0; i < SF_TX_DLIST_CNT; i++) {
 2369                 txd = &sc->sf_cdata.sf_txdesc[i];
 2370                 if (txd->tx_m != NULL) {
 2371                         bus_dmamap_sync(sc->sf_cdata.sf_tx_tag,
 2372                             txd->tx_dmamap, BUS_DMASYNC_POSTWRITE);
 2373                         bus_dmamap_unload(sc->sf_cdata.sf_tx_tag,
 2374                             txd->tx_dmamap);
 2375                         m_freem(txd->tx_m);
 2376                         txd->tx_m = NULL;
 2377                         txd->ndesc = 0;
 2378                 }
 2379         }
 2380 }
 2381 
 2382 static void
 2383 sf_tick(void *xsc)
 2384 {
 2385         struct sf_softc         *sc;
 2386         struct mii_data         *mii;
 2387 
 2388         sc = xsc;
 2389         SF_LOCK_ASSERT(sc);
 2390         mii = device_get_softc(sc->sf_miibus);
 2391         mii_tick(mii);
 2392         sf_stats_update(sc);
 2393         sf_watchdog(sc);
 2394         callout_reset(&sc->sf_co, hz, sf_tick, sc);
 2395 }
 2396 
 2397 /*
 2398  * Note: it is important that this function not be interrupted. We
 2399  * use a two-stage register access scheme: if we are interrupted in
 2400  * between setting the indirect address register and reading from the
 2401  * indirect data register, the contents of the address register could
 2402  * be changed out from under us.
 2403  */
 2404 static void
 2405 sf_stats_update(struct sf_softc *sc)
 2406 {
 2407         struct ifnet            *ifp;
 2408         struct sf_stats         now, *stats, *nstats;
 2409         int                     i;
 2410 
 2411         SF_LOCK_ASSERT(sc);
 2412 
 2413         ifp = sc->sf_ifp;
 2414         stats = &now;
 2415 
 2416         stats->sf_tx_frames =
 2417             csr_read_4(sc, SF_STATS_BASE + SF_STATS_TX_FRAMES);
 2418         stats->sf_tx_single_colls =
 2419             csr_read_4(sc, SF_STATS_BASE + SF_STATS_TX_SINGLE_COL);
 2420         stats->sf_tx_multi_colls =
 2421             csr_read_4(sc, SF_STATS_BASE + SF_STATS_TX_MULTI_COL);
 2422         stats->sf_tx_crcerrs =
 2423             csr_read_4(sc, SF_STATS_BASE + SF_STATS_TX_CRC_ERRS);
 2424         stats->sf_tx_bytes =
 2425             csr_read_4(sc, SF_STATS_BASE + SF_STATS_TX_BYTES);
 2426         stats->sf_tx_deferred =
 2427             csr_read_4(sc, SF_STATS_BASE + SF_STATS_TX_DEFERRED);
 2428         stats->sf_tx_late_colls =
 2429             csr_read_4(sc, SF_STATS_BASE + SF_STATS_TX_LATE_COL);
 2430         stats->sf_tx_pause_frames =
 2431             csr_read_4(sc, SF_STATS_BASE + SF_STATS_TX_PAUSE);
 2432         stats->sf_tx_control_frames =
 2433             csr_read_4(sc, SF_STATS_BASE + SF_STATS_TX_CTL_FRAME);
 2434         stats->sf_tx_excess_colls =
 2435             csr_read_4(sc, SF_STATS_BASE + SF_STATS_TX_EXCESS_COL);
 2436         stats->sf_tx_excess_defer =
 2437             csr_read_4(sc, SF_STATS_BASE + SF_STATS_TX_EXCESS_DEF);
 2438         stats->sf_tx_mcast_frames =
 2439             csr_read_4(sc, SF_STATS_BASE + SF_STATS_TX_MULTI);
 2440         stats->sf_tx_bcast_frames =
 2441             csr_read_4(sc, SF_STATS_BASE + SF_STATS_TX_BCAST);
 2442         stats->sf_tx_frames_lost =
 2443             csr_read_4(sc, SF_STATS_BASE + SF_STATS_TX_FRAME_LOST);
 2444         stats->sf_rx_frames =
 2445             csr_read_4(sc, SF_STATS_BASE + SF_STATS_RX_FRAMES);
 2446         stats->sf_rx_crcerrs =
 2447             csr_read_4(sc, SF_STATS_BASE + SF_STATS_RX_CRC_ERRS);
 2448         stats->sf_rx_alignerrs =
 2449             csr_read_4(sc, SF_STATS_BASE + SF_STATS_RX_ALIGN_ERRS);
 2450         stats->sf_rx_bytes =
 2451             csr_read_4(sc, SF_STATS_BASE + SF_STATS_RX_BYTES);
 2452         stats->sf_rx_pause_frames =
 2453             csr_read_4(sc, SF_STATS_BASE + SF_STATS_RX_PAUSE);
 2454         stats->sf_rx_control_frames =
 2455             csr_read_4(sc, SF_STATS_BASE + SF_STATS_RX_CTL_FRAME);
 2456         stats->sf_rx_unsup_control_frames =
 2457             csr_read_4(sc, SF_STATS_BASE + SF_STATS_RX_UNSUP_FRAME);
 2458         stats->sf_rx_giants =
 2459             csr_read_4(sc, SF_STATS_BASE + SF_STATS_RX_GIANTS);
 2460         stats->sf_rx_runts =
 2461             csr_read_4(sc, SF_STATS_BASE + SF_STATS_RX_RUNTS);
 2462         stats->sf_rx_jabbererrs =
 2463             csr_read_4(sc, SF_STATS_BASE + SF_STATS_RX_JABBER);
 2464         stats->sf_rx_fragments =
 2465             csr_read_4(sc, SF_STATS_BASE + SF_STATS_RX_FRAGMENTS);
 2466         stats->sf_rx_pkts_64 =
 2467             csr_read_4(sc, SF_STATS_BASE + SF_STATS_RX_64);
 2468         stats->sf_rx_pkts_65_127 =
 2469             csr_read_4(sc, SF_STATS_BASE + SF_STATS_RX_65_127);
 2470         stats->sf_rx_pkts_128_255 =
 2471             csr_read_4(sc, SF_STATS_BASE + SF_STATS_RX_128_255);
 2472         stats->sf_rx_pkts_256_511 =
 2473             csr_read_4(sc, SF_STATS_BASE + SF_STATS_RX_256_511);
 2474         stats->sf_rx_pkts_512_1023 =
 2475             csr_read_4(sc, SF_STATS_BASE + SF_STATS_RX_512_1023);
 2476         stats->sf_rx_pkts_1024_1518 =
 2477             csr_read_4(sc, SF_STATS_BASE + SF_STATS_RX_1024_1518);
 2478         stats->sf_rx_frames_lost =
 2479             csr_read_4(sc, SF_STATS_BASE + SF_STATS_RX_FRAME_LOST);
 2480         /* Lower 16bits are valid. */
 2481         stats->sf_tx_underruns =
 2482             (csr_read_4(sc, SF_STATS_BASE + SF_STATS_TX_UNDERRUN) & 0xffff);
 2483 
 2484         /* Empty stats counter registers. */
 2485         for (i = SF_STATS_BASE; i < (SF_STATS_END + 1); i += sizeof(uint32_t))
 2486                 csr_write_4(sc, i, 0);
 2487 
 2488         if_inc_counter(ifp, IFCOUNTER_OPACKETS, (u_long)stats->sf_tx_frames);
 2489 
 2490         if_inc_counter(ifp, IFCOUNTER_COLLISIONS,
 2491             (u_long)stats->sf_tx_single_colls +
 2492             (u_long)stats->sf_tx_multi_colls);
 2493 
 2494         if_inc_counter(ifp, IFCOUNTER_OERRORS,
 2495             (u_long)stats->sf_tx_excess_colls +
 2496             (u_long)stats->sf_tx_excess_defer +
 2497             (u_long)stats->sf_tx_frames_lost);
 2498 
 2499         if_inc_counter(ifp, IFCOUNTER_IPACKETS, (u_long)stats->sf_rx_frames);
 2500 
 2501         if_inc_counter(ifp, IFCOUNTER_IERRORS,
 2502             (u_long)stats->sf_rx_crcerrs +
 2503             (u_long)stats->sf_rx_alignerrs +
 2504             (u_long)stats->sf_rx_giants +
 2505             (u_long)stats->sf_rx_runts +
 2506             (u_long)stats->sf_rx_jabbererrs +
 2507             (u_long)stats->sf_rx_frames_lost);
 2508 
 2509         nstats = &sc->sf_statistics;
 2510 
 2511         nstats->sf_tx_frames += stats->sf_tx_frames;
 2512         nstats->sf_tx_single_colls += stats->sf_tx_single_colls;
 2513         nstats->sf_tx_multi_colls += stats->sf_tx_multi_colls;
 2514         nstats->sf_tx_crcerrs += stats->sf_tx_crcerrs;
 2515         nstats->sf_tx_bytes += stats->sf_tx_bytes;
 2516         nstats->sf_tx_deferred += stats->sf_tx_deferred;
 2517         nstats->sf_tx_late_colls += stats->sf_tx_late_colls;
 2518         nstats->sf_tx_pause_frames += stats->sf_tx_pause_frames;
 2519         nstats->sf_tx_control_frames += stats->sf_tx_control_frames;
 2520         nstats->sf_tx_excess_colls += stats->sf_tx_excess_colls;
 2521         nstats->sf_tx_excess_defer += stats->sf_tx_excess_defer;
 2522         nstats->sf_tx_mcast_frames += stats->sf_tx_mcast_frames;
 2523         nstats->sf_tx_bcast_frames += stats->sf_tx_bcast_frames;
 2524         nstats->sf_tx_frames_lost += stats->sf_tx_frames_lost;
 2525         nstats->sf_rx_frames += stats->sf_rx_frames;
 2526         nstats->sf_rx_crcerrs += stats->sf_rx_crcerrs;
 2527         nstats->sf_rx_alignerrs += stats->sf_rx_alignerrs;
 2528         nstats->sf_rx_bytes += stats->sf_rx_bytes;
 2529         nstats->sf_rx_pause_frames += stats->sf_rx_pause_frames;
 2530         nstats->sf_rx_control_frames += stats->sf_rx_control_frames;
 2531         nstats->sf_rx_unsup_control_frames += stats->sf_rx_unsup_control_frames;
 2532         nstats->sf_rx_giants += stats->sf_rx_giants;
 2533         nstats->sf_rx_runts += stats->sf_rx_runts;
 2534         nstats->sf_rx_jabbererrs += stats->sf_rx_jabbererrs;
 2535         nstats->sf_rx_fragments += stats->sf_rx_fragments;
 2536         nstats->sf_rx_pkts_64 += stats->sf_rx_pkts_64;
 2537         nstats->sf_rx_pkts_65_127 += stats->sf_rx_pkts_65_127;
 2538         nstats->sf_rx_pkts_128_255 += stats->sf_rx_pkts_128_255;
 2539         nstats->sf_rx_pkts_256_511 += stats->sf_rx_pkts_256_511;
 2540         nstats->sf_rx_pkts_512_1023 += stats->sf_rx_pkts_512_1023;
 2541         nstats->sf_rx_pkts_1024_1518 += stats->sf_rx_pkts_1024_1518;
 2542         nstats->sf_rx_frames_lost += stats->sf_rx_frames_lost;
 2543         nstats->sf_tx_underruns += stats->sf_tx_underruns;
 2544 }
 2545 
 2546 static void
 2547 sf_watchdog(struct sf_softc *sc)
 2548 {
 2549         struct ifnet            *ifp;
 2550 
 2551         SF_LOCK_ASSERT(sc);
 2552 
 2553         if (sc->sf_watchdog_timer == 0 || --sc->sf_watchdog_timer)
 2554                 return;
 2555 
 2556         ifp = sc->sf_ifp;
 2557 
 2558         if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
 2559         if (sc->sf_link == 0) {
 2560                 if (bootverbose)
 2561                         if_printf(sc->sf_ifp, "watchdog timeout "
 2562                            "(missed link)\n");
 2563         } else
 2564                 if_printf(ifp, "watchdog timeout, %d Tx descs are active\n",
 2565                     sc->sf_cdata.sf_tx_cnt);
 2566 
 2567         ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
 2568         sf_init_locked(sc);
 2569 
 2570         if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
 2571                 sf_start_locked(ifp);
 2572 }
 2573 
 2574 static int
 2575 sf_shutdown(device_t dev)
 2576 {
 2577         struct sf_softc         *sc;
 2578 
 2579         sc = device_get_softc(dev);
 2580 
 2581         SF_LOCK(sc);
 2582         sf_stop(sc);
 2583         SF_UNLOCK(sc);
 2584 
 2585         return (0);
 2586 }
 2587 
 2588 static int
 2589 sf_suspend(device_t dev)
 2590 {
 2591         struct sf_softc         *sc;
 2592 
 2593         sc = device_get_softc(dev);
 2594 
 2595         SF_LOCK(sc);
 2596         sf_stop(sc);
 2597         sc->sf_suspended = 1;
 2598         bus_generic_suspend(dev);
 2599         SF_UNLOCK(sc);
 2600 
 2601         return (0);
 2602 }
 2603 
 2604 static int
 2605 sf_resume(device_t dev)
 2606 {
 2607         struct sf_softc         *sc;
 2608         struct ifnet            *ifp;
 2609 
 2610         sc = device_get_softc(dev);
 2611 
 2612         SF_LOCK(sc);
 2613         bus_generic_resume(dev);
 2614         ifp = sc->sf_ifp;
 2615         if ((ifp->if_flags & IFF_UP) != 0)
 2616                 sf_init_locked(sc);
 2617 
 2618         sc->sf_suspended = 0;
 2619         SF_UNLOCK(sc);
 2620 
 2621         return (0);
 2622 }
 2623 
 2624 static int
 2625 sf_sysctl_stats(SYSCTL_HANDLER_ARGS)
 2626 {
 2627         struct sf_softc         *sc;
 2628         struct sf_stats         *stats;
 2629         int                     error;
 2630         int                     result;
 2631 
 2632         result = -1;
 2633         error = sysctl_handle_int(oidp, &result, 0, req);
 2634 
 2635         if (error != 0 || req->newptr == NULL)
 2636                 return (error);
 2637 
 2638         if (result != 1)
 2639                 return (error);
 2640 
 2641         sc = (struct sf_softc *)arg1;
 2642         stats = &sc->sf_statistics;
 2643 
 2644         printf("%s statistics:\n", device_get_nameunit(sc->sf_dev));
 2645         printf("Transmit good frames : %ju\n",
 2646             (uintmax_t)stats->sf_tx_frames);
 2647         printf("Transmit good octets : %ju\n",
 2648             (uintmax_t)stats->sf_tx_bytes);
 2649         printf("Transmit single collisions : %u\n",
 2650             stats->sf_tx_single_colls);
 2651         printf("Transmit multiple collisions : %u\n",
 2652             stats->sf_tx_multi_colls);
 2653         printf("Transmit late collisions : %u\n",
 2654             stats->sf_tx_late_colls);
 2655         printf("Transmit abort due to excessive collisions : %u\n",
 2656             stats->sf_tx_excess_colls);
 2657         printf("Transmit CRC errors : %u\n",
 2658             stats->sf_tx_crcerrs);
 2659         printf("Transmit deferrals : %u\n",
 2660             stats->sf_tx_deferred);
 2661         printf("Transmit abort due to excessive deferrals : %u\n",
 2662             stats->sf_tx_excess_defer);
 2663         printf("Transmit pause control frames : %u\n",
 2664             stats->sf_tx_pause_frames);
 2665         printf("Transmit control frames : %u\n",
 2666             stats->sf_tx_control_frames);
 2667         printf("Transmit good multicast frames : %u\n",
 2668             stats->sf_tx_mcast_frames);
 2669         printf("Transmit good broadcast frames : %u\n",
 2670             stats->sf_tx_bcast_frames);
 2671         printf("Transmit frames lost due to internal transmit errors : %u\n",
 2672             stats->sf_tx_frames_lost);
 2673         printf("Transmit FIFO underflows : %u\n",
 2674             stats->sf_tx_underruns);
 2675         printf("Transmit GFP stalls : %u\n", stats->sf_tx_gfp_stall);
 2676         printf("Receive good frames : %ju\n",
 2677             (uint64_t)stats->sf_rx_frames);
 2678         printf("Receive good octets : %ju\n",
 2679             (uint64_t)stats->sf_rx_bytes);
 2680         printf("Receive CRC errors : %u\n",
 2681             stats->sf_rx_crcerrs);
 2682         printf("Receive alignment errors : %u\n",
 2683             stats->sf_rx_alignerrs);
 2684         printf("Receive pause frames : %u\n",
 2685             stats->sf_rx_pause_frames);
 2686         printf("Receive control frames : %u\n",
 2687             stats->sf_rx_control_frames);
 2688         printf("Receive control frames with unsupported opcode : %u\n",
 2689             stats->sf_rx_unsup_control_frames);
 2690         printf("Receive frames too long : %u\n",
 2691             stats->sf_rx_giants);
 2692         printf("Receive frames too short : %u\n",
 2693             stats->sf_rx_runts);
 2694         printf("Receive frames jabber errors : %u\n",
 2695             stats->sf_rx_jabbererrs);
 2696         printf("Receive frames fragments : %u\n",
 2697             stats->sf_rx_fragments);
 2698         printf("Receive packets 64 bytes : %ju\n",
 2699             (uint64_t)stats->sf_rx_pkts_64);
 2700         printf("Receive packets 65 to 127 bytes : %ju\n",
 2701             (uint64_t)stats->sf_rx_pkts_65_127);
 2702         printf("Receive packets 128 to 255 bytes : %ju\n",
 2703             (uint64_t)stats->sf_rx_pkts_128_255);
 2704         printf("Receive packets 256 to 511 bytes : %ju\n",
 2705             (uint64_t)stats->sf_rx_pkts_256_511);
 2706         printf("Receive packets 512 to 1023 bytes : %ju\n",
 2707             (uint64_t)stats->sf_rx_pkts_512_1023);
 2708         printf("Receive packets 1024 to 1518 bytes : %ju\n",
 2709             (uint64_t)stats->sf_rx_pkts_1024_1518);
 2710         printf("Receive frames lost due to internal receive errors : %u\n",
 2711             stats->sf_rx_frames_lost);
 2712         printf("Receive GFP stalls : %u\n", stats->sf_rx_gfp_stall);
 2713 
 2714         return (error);
 2715 }
 2716 
 2717 static int
 2718 sysctl_int_range(SYSCTL_HANDLER_ARGS, int low, int high)
 2719 {
 2720         int error, value;
 2721 
 2722         if (!arg1)
 2723                 return (EINVAL);
 2724         value = *(int *)arg1;
 2725         error = sysctl_handle_int(oidp, &value, 0, req);
 2726         if (error || !req->newptr)
 2727                 return (error);
 2728         if (value < low || value > high)
 2729                 return (EINVAL);
 2730         *(int *)arg1 = value;
 2731 
 2732         return (0);
 2733 }
 2734 
 2735 static int
 2736 sysctl_hw_sf_int_mod(SYSCTL_HANDLER_ARGS)
 2737 {
 2738 
 2739         return (sysctl_int_range(oidp, arg1, arg2, req, SF_IM_MIN, SF_IM_MAX));
 2740 }

Cache object: 642f9f865bb0527e586e7b3e8bc38c72


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.