1 1.74 riastrad /* $NetBSD: if_age.c,v 1.74 2024/06/29 12:11:11 riastradh Exp $ */ 2 1.1 cegger /* $OpenBSD: if_age.c,v 1.1 2009/01/16 05:00:34 kevlo Exp $ */ 3 1.1 cegger 4 1.1 cegger /*- 5 1.1 cegger * Copyright (c) 2008, Pyun YongHyeon <yongari (at) FreeBSD.org> 6 1.1 cegger * All rights reserved. 7 1.1 cegger * 8 1.1 cegger * Redistribution and use in source and binary forms, with or without 9 1.1 cegger * modification, are permitted provided that the following conditions 10 1.1 cegger * are met: 11 1.1 cegger * 1. Redistributions of source code must retain the above copyright 12 1.1 cegger * notice unmodified, this list of conditions, and the following 13 1.1 cegger * disclaimer. 14 1.1 cegger * 2. Redistributions in binary form must reproduce the above copyright 15 1.1 cegger * notice, this list of conditions and the following disclaimer in the 16 1.1 cegger * documentation and/or other materials provided with the distribution. 17 1.1 cegger * 18 1.1 cegger * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 19 1.1 cegger * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 1.1 cegger * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 1.1 cegger * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 22 1.1 cegger * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 1.1 cegger * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24 1.1 cegger * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25 1.1 cegger * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26 1.1 cegger * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27 1.1 cegger * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28 1.1 cegger * SUCH DAMAGE. 29 1.1 cegger */ 30 1.1 cegger 31 1.1 cegger /* Driver for Attansic Technology Corp. L1 Gigabit Ethernet. */ 32 1.1 cegger 33 1.2 cegger #include <sys/cdefs.h> 34 1.74 riastrad __KERNEL_RCSID(0, "$NetBSD: if_age.c,v 1.74 2024/06/29 12:11:11 riastradh Exp $"); 35 1.2 cegger 36 1.1 cegger #include "vlan.h" 37 1.1 cegger 38 1.1 cegger #include <sys/param.h> 39 1.1 cegger #include <sys/proc.h> 40 1.1 cegger #include <sys/endian.h> 41 1.1 cegger #include <sys/systm.h> 42 1.1 cegger #include <sys/types.h> 43 1.1 cegger #include <sys/sockio.h> 44 1.1 cegger #include <sys/mbuf.h> 45 1.1 cegger #include <sys/queue.h> 46 1.1 cegger #include <sys/kernel.h> 47 1.1 cegger #include <sys/device.h> 48 1.1 cegger #include <sys/callout.h> 49 1.1 cegger #include <sys/socket.h> 50 1.1 cegger 51 1.1 cegger #include <net/if.h> 52 1.1 cegger #include <net/if_dl.h> 53 1.1 cegger #include <net/if_media.h> 54 1.1 cegger #include <net/if_ether.h> 55 1.1 cegger 56 1.1 cegger #ifdef INET 57 1.1 cegger #include <netinet/in.h> 58 1.1 cegger #include <netinet/in_systm.h> 59 1.1 cegger #include <netinet/in_var.h> 60 1.1 cegger #include <netinet/ip.h> 61 1.1 cegger #endif 62 1.1 cegger 63 1.1 cegger #include <net/if_types.h> 64 1.1 cegger #include <net/if_vlanvar.h> 65 1.1 cegger 66 1.1 cegger #include <net/bpf.h> 67 1.1 cegger 68 1.1 cegger #include <dev/mii/mii.h> 69 1.1 cegger #include <dev/mii/miivar.h> 70 1.1 cegger 71 1.1 cegger #include <dev/pci/pcireg.h> 72 1.1 cegger #include <dev/pci/pcivar.h> 73 1.1 cegger #include <dev/pci/pcidevs.h> 74 1.1 cegger 75 1.1 cegger #include <dev/pci/if_agereg.h> 76 1.1 cegger 77 1.1 cegger static int age_match(device_t, cfdata_t, void *); 78 1.1 cegger static void age_attach(device_t, device_t, void *); 79 1.1 cegger static int age_detach(device_t, int); 80 1.1 cegger 81 1.37 dyoung static bool age_resume(device_t, const pmf_qual_t *); 82 1.3 cegger 83 1.55 msaitoh static int age_miibus_readreg(device_t, int, int, uint16_t *); 84 1.55 msaitoh static int age_miibus_writereg(device_t, int, int, uint16_t); 85 1.41 matt static void age_miibus_statchg(struct ifnet *); 86 1.1 cegger 87 1.1 cegger static int age_init(struct ifnet *); 88 1.1 cegger static int age_ioctl(struct ifnet *, u_long, void *); 89 1.1 cegger static void age_start(struct ifnet *); 90 1.1 cegger static void age_watchdog(struct ifnet *); 91 1.40 bouyer static bool age_shutdown(device_t, int); 92 1.1 cegger static void age_mediastatus(struct ifnet *, struct ifmediareq *); 93 1.1 cegger static int age_mediachange(struct ifnet *); 94 1.1 cegger 95 1.1 cegger static int age_intr(void *); 96 1.1 cegger static int age_dma_alloc(struct age_softc *); 97 1.1 cegger static void age_dma_free(struct age_softc *); 98 1.1 cegger static void age_get_macaddr(struct age_softc *, uint8_t[]); 99 1.1 cegger static void age_phy_reset(struct age_softc *); 100 1.1 cegger 101 1.71 thorpej static int age_encap(struct age_softc *, struct mbuf *); 102 1.1 cegger static void age_init_tx_ring(struct age_softc *); 103 1.1 cegger static int age_init_rx_ring(struct age_softc *); 104 1.1 cegger static void age_init_rr_ring(struct age_softc *); 105 1.1 cegger static void age_init_cmb_block(struct age_softc *); 106 1.1 cegger static void age_init_smb_block(struct age_softc *); 107 1.1 cegger static int age_newbuf(struct age_softc *, struct age_rxdesc *, int); 108 1.1 cegger static void age_mac_config(struct age_softc *); 109 1.1 cegger static void age_txintr(struct age_softc *, int); 110 1.1 cegger static void age_rxeof(struct age_softc *sc, struct rx_rdesc *); 111 1.1 cegger static void age_rxintr(struct age_softc *, int); 112 1.1 cegger static void age_tick(void *); 113 1.1 cegger static void age_reset(struct age_softc *); 114 1.18 cegger static void age_stop(struct ifnet *, int); 115 1.1 cegger static void age_stats_update(struct age_softc *); 116 1.1 cegger static void age_stop_txmac(struct age_softc *); 117 1.1 cegger static void age_stop_rxmac(struct age_softc *); 118 1.1 cegger static void age_rxvlan(struct age_softc *sc); 119 1.1 cegger static void age_rxfilter(struct age_softc *); 120 1.1 cegger 121 1.1 cegger CFATTACH_DECL_NEW(age, sizeof(struct age_softc), 122 1.1 cegger age_match, age_attach, age_detach, NULL); 123 1.1 cegger 124 1.1 cegger int agedebug = 0; 125 1.1 cegger #define DPRINTF(x) do { if (agedebug) printf x; } while (0) 126 1.1 cegger 127 1.1 cegger #define AGE_CSUM_FEATURES (M_CSUM_TCPv4 | M_CSUM_UDPv4) 128 1.1 cegger 129 1.1 cegger static int 130 1.1 cegger age_match(device_t dev, cfdata_t match, void *aux) 131 1.1 cegger { 132 1.1 cegger struct pci_attach_args *pa = aux; 133 1.1 cegger 134 1.1 cegger return (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_ATTANSIC && 135 1.1 cegger PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_ATTANSIC_ETHERNET_GIGA); 136 1.1 cegger } 137 1.1 cegger 138 1.1 cegger static void 139 1.1 cegger age_attach(device_t parent, device_t self, void *aux) 140 1.1 cegger { 141 1.1 cegger struct age_softc *sc = device_private(self); 142 1.1 cegger struct pci_attach_args *pa = aux; 143 1.1 cegger pci_intr_handle_t ih; 144 1.1 cegger const char *intrstr; 145 1.1 cegger struct ifnet *ifp = &sc->sc_ec.ec_if; 146 1.57 msaitoh struct mii_data * const mii = &sc->sc_miibus; 147 1.1 cegger pcireg_t memtype; 148 1.1 cegger int error = 0; 149 1.44 christos char intrbuf[PCI_INTRSTR_LEN]; 150 1.1 cegger 151 1.1 cegger aprint_naive("\n"); 152 1.1 cegger aprint_normal(": Attansic/Atheros L1 Gigabit Ethernet\n"); 153 1.1 cegger 154 1.1 cegger sc->sc_dev = self; 155 1.1 cegger sc->sc_pct = pa->pa_pc; 156 1.1 cegger sc->sc_pcitag = pa->pa_tag; 157 1.1 cegger 158 1.69 thorpej if (pci_dma64_available(pa)) 159 1.69 thorpej sc->sc_dmat = pa->pa_dmat64; 160 1.69 thorpej else 161 1.69 thorpej sc->sc_dmat = pa->pa_dmat; 162 1.69 thorpej 163 1.1 cegger /* 164 1.1 cegger * Allocate IO memory 165 1.1 cegger */ 166 1.1 cegger memtype = pci_mapreg_type(sc->sc_pct, sc->sc_pcitag, AGE_PCIR_BAR); 167 1.1 cegger switch (memtype) { 168 1.58 msaitoh case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT: 169 1.58 msaitoh case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT_1M: 170 1.58 msaitoh case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_64BIT: 171 1.1 cegger break; 172 1.58 msaitoh default: 173 1.1 cegger aprint_error_dev(self, "invalid base address register\n"); 174 1.1 cegger break; 175 1.1 cegger } 176 1.1 cegger 177 1.1 cegger if (pci_mapreg_map(pa, AGE_PCIR_BAR, memtype, 0, &sc->sc_mem_bt, 178 1.1 cegger &sc->sc_mem_bh, NULL, &sc->sc_mem_size) != 0) { 179 1.1 cegger aprint_error_dev(self, "could not map mem space\n"); 180 1.1 cegger return; 181 1.1 cegger } 182 1.1 cegger 183 1.1 cegger if (pci_intr_map(pa, &ih) != 0) { 184 1.1 cegger aprint_error_dev(self, "could not map interrupt\n"); 185 1.23 cegger goto fail; 186 1.1 cegger } 187 1.1 cegger 188 1.1 cegger /* 189 1.1 cegger * Allocate IRQ 190 1.1 cegger */ 191 1.44 christos intrstr = pci_intr_string(sc->sc_pct, ih, intrbuf, sizeof(intrbuf)); 192 1.54 jdolecek sc->sc_irq_handle = pci_intr_establish_xname(sc->sc_pct, ih, IPL_NET, 193 1.54 jdolecek age_intr, sc, device_xname(self)); 194 1.1 cegger if (sc->sc_irq_handle == NULL) { 195 1.1 cegger aprint_error_dev(self, "could not establish interrupt"); 196 1.1 cegger if (intrstr != NULL) 197 1.1 cegger aprint_error(" at %s", intrstr); 198 1.1 cegger aprint_error("\n"); 199 1.23 cegger goto fail; 200 1.1 cegger } 201 1.7 cegger aprint_normal_dev(self, "%s\n", intrstr); 202 1.1 cegger 203 1.1 cegger /* Set PHY address. */ 204 1.1 cegger sc->age_phyaddr = AGE_PHY_ADDR; 205 1.1 cegger 206 1.1 cegger /* Reset PHY. */ 207 1.1 cegger age_phy_reset(sc); 208 1.1 cegger 209 1.1 cegger /* Reset the ethernet controller. */ 210 1.1 cegger age_reset(sc); 211 1.1 cegger 212 1.1 cegger /* Get PCI and chip id/revision. */ 213 1.1 cegger sc->age_rev = PCI_REVISION(pa->pa_class); 214 1.42 christos sc->age_chip_rev = CSR_READ_4(sc, AGE_MASTER_CFG) >> 215 1.1 cegger MASTER_CHIP_REV_SHIFT; 216 1.1 cegger 217 1.1 cegger aprint_debug_dev(self, "PCI device revision : 0x%04x\n", sc->age_rev); 218 1.1 cegger aprint_debug_dev(self, "Chip id/revision : 0x%04x\n", sc->age_chip_rev); 219 1.1 cegger 220 1.1 cegger if (agedebug) { 221 1.1 cegger aprint_debug_dev(self, "%d Tx FIFO, %d Rx FIFO\n", 222 1.1 cegger CSR_READ_4(sc, AGE_SRAM_TX_FIFO_LEN), 223 1.1 cegger CSR_READ_4(sc, AGE_SRAM_RX_FIFO_LEN)); 224 1.1 cegger } 225 1.1 cegger 226 1.1 cegger /* Set max allowable DMA size. */ 227 1.1 cegger sc->age_dma_rd_burst = DMA_CFG_RD_BURST_128; 228 1.1 cegger sc->age_dma_wr_burst = DMA_CFG_WR_BURST_128; 229 1.1 cegger 230 1.1 cegger /* Allocate DMA stuffs */ 231 1.1 cegger error = age_dma_alloc(sc); 232 1.1 cegger if (error) 233 1.1 cegger goto fail; 234 1.1 cegger 235 1.1 cegger callout_init(&sc->sc_tick_ch, 0); 236 1.1 cegger callout_setfunc(&sc->sc_tick_ch, age_tick, sc); 237 1.1 cegger 238 1.1 cegger /* Load station address. */ 239 1.1 cegger age_get_macaddr(sc, sc->sc_enaddr); 240 1.1 cegger 241 1.1 cegger aprint_normal_dev(self, "Ethernet address %s\n", 242 1.1 cegger ether_sprintf(sc->sc_enaddr)); 243 1.1 cegger 244 1.1 cegger ifp->if_softc = sc; 245 1.1 cegger ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 246 1.1 cegger ifp->if_init = age_init; 247 1.1 cegger ifp->if_ioctl = age_ioctl; 248 1.1 cegger ifp->if_start = age_start; 249 1.18 cegger ifp->if_stop = age_stop; 250 1.1 cegger ifp->if_watchdog = age_watchdog; 251 1.1 cegger ifp->if_baudrate = IF_Gbps(1); 252 1.1 cegger IFQ_SET_MAXLEN(&ifp->if_snd, AGE_TX_RING_CNT - 1); 253 1.1 cegger IFQ_SET_READY(&ifp->if_snd); 254 1.1 cegger strlcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ); 255 1.1 cegger 256 1.1 cegger sc->sc_ec.ec_capabilities = ETHERCAP_VLAN_MTU; 257 1.1 cegger 258 1.32 cegger ifp->if_capabilities |= IFCAP_CSUM_IPv4_Rx | 259 1.32 cegger IFCAP_CSUM_TCPv4_Rx | 260 1.32 cegger IFCAP_CSUM_UDPv4_Rx; 261 1.1 cegger #ifdef AGE_CHECKSUM 262 1.32 cegger ifp->if_capabilities |= IFCAP_CSUM_IPv4_Tx | 263 1.32 cegger IFCAP_CSUM_TCPv4_Tx | 264 1.32 cegger IFCAP_CSUM_UDPv4_Tx; 265 1.1 cegger #endif 266 1.1 cegger 267 1.1 cegger #if NVLAN > 0 268 1.1 cegger sc->sc_ec.ec_capabilities |= ETHERCAP_VLAN_HWTAGGING; 269 1.60 msaitoh sc->sc_ec.ec_capenable |= ETHERCAP_VLAN_HWTAGGING; 270 1.1 cegger #endif 271 1.1 cegger 272 1.1 cegger /* Set up MII bus. */ 273 1.57 msaitoh mii->mii_ifp = ifp; 274 1.57 msaitoh mii->mii_readreg = age_miibus_readreg; 275 1.57 msaitoh mii->mii_writereg = age_miibus_writereg; 276 1.57 msaitoh mii->mii_statchg = age_miibus_statchg; 277 1.57 msaitoh 278 1.57 msaitoh sc->sc_ec.ec_mii = mii; 279 1.57 msaitoh ifmedia_init(&mii->mii_media, 0, age_mediachange, age_mediastatus); 280 1.57 msaitoh mii_attach(self, mii, 0xffffffff, MII_PHY_ANY, 281 1.29 cegger MII_OFFSET_ANY, MIIF_DOPAUSE); 282 1.1 cegger 283 1.57 msaitoh if (LIST_FIRST(&mii->mii_phys) == NULL) { 284 1.1 cegger aprint_error_dev(self, "no PHY found!\n"); 285 1.57 msaitoh ifmedia_add(&mii->mii_media, IFM_ETHER | IFM_MANUAL, 0, NULL); 286 1.57 msaitoh ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_MANUAL); 287 1.1 cegger } else 288 1.57 msaitoh ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_AUTO); 289 1.1 cegger 290 1.1 cegger if_attach(ifp); 291 1.49 ozaki if_deferred_start_init(ifp, NULL); 292 1.1 cegger ether_ifattach(ifp, sc->sc_enaddr); 293 1.1 cegger 294 1.40 bouyer if (pmf_device_register1(self, NULL, age_resume, age_shutdown)) 295 1.33 tsutsui pmf_class_network_register(self, ifp); 296 1.33 tsutsui else 297 1.1 cegger aprint_error_dev(self, "couldn't establish power handler\n"); 298 1.1 cegger 299 1.1 cegger return; 300 1.14 cegger 301 1.1 cegger fail: 302 1.23 cegger age_dma_free(sc); 303 1.14 cegger if (sc->sc_irq_handle != NULL) { 304 1.14 cegger pci_intr_disestablish(sc->sc_pct, sc->sc_irq_handle); 305 1.14 cegger sc->sc_irq_handle = NULL; 306 1.14 cegger } 307 1.23 cegger if (sc->sc_mem_size) { 308 1.23 cegger bus_space_unmap(sc->sc_mem_bt, sc->sc_mem_bh, sc->sc_mem_size); 309 1.23 cegger sc->sc_mem_size = 0; 310 1.23 cegger } 311 1.1 cegger } 312 1.1 cegger 313 1.1 cegger static int 314 1.1 cegger age_detach(device_t self, int flags) 315 1.1 cegger { 316 1.1 cegger struct age_softc *sc = device_private(self); 317 1.1 cegger struct ifnet *ifp = &sc->sc_ec.ec_if; 318 1.1 cegger int s; 319 1.1 cegger 320 1.28 cegger pmf_device_deregister(self); 321 1.1 cegger s = splnet(); 322 1.18 cegger age_stop(ifp, 0); 323 1.1 cegger splx(s); 324 1.1 cegger 325 1.1 cegger mii_detach(&sc->sc_miibus, MII_PHY_ANY, MII_OFFSET_ANY); 326 1.1 cegger 327 1.1 cegger ether_ifdetach(ifp); 328 1.1 cegger if_detach(ifp); 329 1.1 cegger age_dma_free(sc); 330 1.1 cegger 331 1.67 thorpej /* Delete all remaining media. */ 332 1.67 thorpej ifmedia_fini(&sc->sc_miibus.mii_media); 333 1.67 thorpej 334 1.1 cegger if (sc->sc_irq_handle != NULL) { 335 1.1 cegger pci_intr_disestablish(sc->sc_pct, sc->sc_irq_handle); 336 1.1 cegger sc->sc_irq_handle = NULL; 337 1.1 cegger } 338 1.28 cegger if (sc->sc_mem_size) { 339 1.28 cegger bus_space_unmap(sc->sc_mem_bt, sc->sc_mem_bh, sc->sc_mem_size); 340 1.28 cegger sc->sc_mem_size = 0; 341 1.28 cegger } 342 1.15 cegger return 0; 343 1.1 cegger } 344 1.1 cegger 345 1.1 cegger /* 346 1.1 cegger * Read a PHY register on the MII of the L1. 347 1.1 cegger */ 348 1.1 cegger static int 349 1.55 msaitoh age_miibus_readreg(device_t dev, int phy, int reg, uint16_t *val) 350 1.1 cegger { 351 1.1 cegger struct age_softc *sc = device_private(dev); 352 1.1 cegger uint32_t v; 353 1.1 cegger int i; 354 1.1 cegger 355 1.1 cegger if (phy != sc->age_phyaddr) 356 1.55 msaitoh return -1; 357 1.1 cegger 358 1.1 cegger CSR_WRITE_4(sc, AGE_MDIO, MDIO_OP_EXECUTE | MDIO_OP_READ | 359 1.1 cegger MDIO_SUP_PREAMBLE | MDIO_CLK_25_4 | MDIO_REG_ADDR(reg)); 360 1.1 cegger for (i = AGE_PHY_TIMEOUT; i > 0; i--) { 361 1.1 cegger DELAY(1); 362 1.1 cegger v = CSR_READ_4(sc, AGE_MDIO); 363 1.1 cegger if ((v & (MDIO_OP_EXECUTE | MDIO_OP_BUSY)) == 0) 364 1.1 cegger break; 365 1.1 cegger } 366 1.1 cegger 367 1.1 cegger if (i == 0) { 368 1.1 cegger printf("%s: phy read timeout: phy %d, reg %d\n", 369 1.1 cegger device_xname(sc->sc_dev), phy, reg); 370 1.55 msaitoh return ETIMEDOUT; 371 1.1 cegger } 372 1.1 cegger 373 1.55 msaitoh *val = (v & MDIO_DATA_MASK) >> MDIO_DATA_SHIFT; 374 1.55 msaitoh return 0; 375 1.1 cegger } 376 1.1 cegger 377 1.1 cegger /* 378 1.58 msaitoh * Write a PHY register on the MII of the L1. 379 1.1 cegger */ 380 1.55 msaitoh static int 381 1.55 msaitoh age_miibus_writereg(device_t dev, int phy, int reg, uint16_t val) 382 1.1 cegger { 383 1.1 cegger struct age_softc *sc = device_private(dev); 384 1.1 cegger uint32_t v; 385 1.1 cegger int i; 386 1.1 cegger 387 1.1 cegger if (phy != sc->age_phyaddr) 388 1.55 msaitoh return -1; 389 1.1 cegger 390 1.1 cegger CSR_WRITE_4(sc, AGE_MDIO, MDIO_OP_EXECUTE | MDIO_OP_WRITE | 391 1.1 cegger (val & MDIO_DATA_MASK) << MDIO_DATA_SHIFT | 392 1.1 cegger MDIO_SUP_PREAMBLE | MDIO_CLK_25_4 | MDIO_REG_ADDR(reg)); 393 1.1 cegger 394 1.1 cegger for (i = AGE_PHY_TIMEOUT; i > 0; i--) { 395 1.1 cegger DELAY(1); 396 1.1 cegger v = CSR_READ_4(sc, AGE_MDIO); 397 1.1 cegger if ((v & (MDIO_OP_EXECUTE | MDIO_OP_BUSY)) == 0) 398 1.1 cegger break; 399 1.1 cegger } 400 1.1 cegger 401 1.1 cegger if (i == 0) { 402 1.1 cegger printf("%s: phy write timeout: phy %d, reg %d\n", 403 1.1 cegger device_xname(sc->sc_dev), phy, reg); 404 1.55 msaitoh return ETIMEDOUT; 405 1.1 cegger } 406 1.55 msaitoh 407 1.55 msaitoh return 0; 408 1.1 cegger } 409 1.1 cegger 410 1.1 cegger /* 411 1.1 cegger * Callback from MII layer when media changes. 412 1.1 cegger */ 413 1.1 cegger static void 414 1.41 matt age_miibus_statchg(struct ifnet *ifp) 415 1.1 cegger { 416 1.41 matt struct age_softc *sc = ifp->if_softc; 417 1.41 matt struct mii_data *mii = &sc->sc_miibus; 418 1.1 cegger 419 1.1 cegger if ((ifp->if_flags & IFF_RUNNING) == 0) 420 1.1 cegger return; 421 1.1 cegger 422 1.1 cegger sc->age_flags &= ~AGE_FLAG_LINK; 423 1.1 cegger if ((mii->mii_media_status & IFM_AVALID) != 0) { 424 1.1 cegger switch (IFM_SUBTYPE(mii->mii_media_active)) { 425 1.1 cegger case IFM_10_T: 426 1.1 cegger case IFM_100_TX: 427 1.1 cegger case IFM_1000_T: 428 1.1 cegger sc->age_flags |= AGE_FLAG_LINK; 429 1.1 cegger break; 430 1.1 cegger default: 431 1.1 cegger break; 432 1.1 cegger } 433 1.1 cegger } 434 1.1 cegger 435 1.1 cegger /* Stop Rx/Tx MACs. */ 436 1.1 cegger age_stop_rxmac(sc); 437 1.1 cegger age_stop_txmac(sc); 438 1.1 cegger 439 1.1 cegger /* Program MACs with resolved speed/duplex/flow-control. */ 440 1.1 cegger if ((sc->age_flags & AGE_FLAG_LINK) != 0) { 441 1.1 cegger uint32_t reg; 442 1.1 cegger 443 1.1 cegger age_mac_config(sc); 444 1.1 cegger reg = CSR_READ_4(sc, AGE_MAC_CFG); 445 1.1 cegger /* Restart DMA engine and Tx/Rx MAC. */ 446 1.1 cegger CSR_WRITE_4(sc, AGE_DMA_CFG, CSR_READ_4(sc, AGE_DMA_CFG) | 447 1.1 cegger DMA_CFG_RD_ENB | DMA_CFG_WR_ENB); 448 1.1 cegger reg |= MAC_CFG_TX_ENB | MAC_CFG_RX_ENB; 449 1.1 cegger CSR_WRITE_4(sc, AGE_MAC_CFG, reg); 450 1.1 cegger } 451 1.1 cegger } 452 1.1 cegger 453 1.1 cegger /* 454 1.1 cegger * Get the current interface media status. 455 1.1 cegger */ 456 1.1 cegger static void 457 1.1 cegger age_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr) 458 1.1 cegger { 459 1.1 cegger struct age_softc *sc = ifp->if_softc; 460 1.1 cegger struct mii_data *mii = &sc->sc_miibus; 461 1.1 cegger 462 1.1 cegger mii_pollstat(mii); 463 1.1 cegger ifmr->ifm_status = mii->mii_media_status; 464 1.1 cegger ifmr->ifm_active = mii->mii_media_active; 465 1.1 cegger } 466 1.1 cegger 467 1.1 cegger /* 468 1.1 cegger * Set hardware to newly-selected media. 469 1.1 cegger */ 470 1.1 cegger static int 471 1.1 cegger age_mediachange(struct ifnet *ifp) 472 1.1 cegger { 473 1.1 cegger struct age_softc *sc = ifp->if_softc; 474 1.1 cegger struct mii_data *mii = &sc->sc_miibus; 475 1.1 cegger int error; 476 1.1 cegger 477 1.1 cegger if (mii->mii_instance != 0) { 478 1.1 cegger struct mii_softc *miisc; 479 1.1 cegger 480 1.1 cegger LIST_FOREACH(miisc, &mii->mii_phys, mii_list) 481 1.1 cegger mii_phy_reset(miisc); 482 1.1 cegger } 483 1.1 cegger error = mii_mediachg(mii); 484 1.1 cegger 485 1.15 cegger return error; 486 1.1 cegger } 487 1.1 cegger 488 1.1 cegger static int 489 1.1 cegger age_intr(void *arg) 490 1.1 cegger { 491 1.58 msaitoh struct age_softc *sc = arg; 492 1.58 msaitoh struct ifnet *ifp = &sc->sc_ec.ec_if; 493 1.1 cegger struct cmb *cmb; 494 1.58 msaitoh uint32_t status; 495 1.42 christos 496 1.1 cegger status = CSR_READ_4(sc, AGE_INTR_STATUS); 497 1.1 cegger if (status == 0 || (status & AGE_INTRS) == 0) 498 1.10 cegger return 0; 499 1.10 cegger 500 1.10 cegger cmb = sc->age_rdata.age_cmb_block; 501 1.27 cegger if (cmb == NULL) { 502 1.27 cegger /* Happens when bringing up the interface 503 1.40 bouyer * w/o having a carrier. Ack the interrupt. 504 1.27 cegger */ 505 1.27 cegger CSR_WRITE_4(sc, AGE_INTR_STATUS, status); 506 1.10 cegger return 0; 507 1.27 cegger } 508 1.1 cegger 509 1.1 cegger bus_dmamap_sync(sc->sc_dmat, sc->age_cdata.age_cmb_block_map, 0, 510 1.40 bouyer sc->age_cdata.age_cmb_block_map->dm_mapsize, 511 1.57 msaitoh BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); 512 1.1 cegger status = le32toh(cmb->intr_status); 513 1.40 bouyer /* ACK/reenable interrupts */ 514 1.40 bouyer CSR_WRITE_4(sc, AGE_INTR_STATUS, status); 515 1.40 bouyer while ((status & AGE_INTRS) != 0) { 516 1.40 bouyer sc->age_tpd_cons = (le32toh(cmb->tpd_cons) & TPD_CONS_MASK) >> 517 1.40 bouyer TPD_CONS_SHIFT; 518 1.40 bouyer sc->age_rr_prod = (le32toh(cmb->rprod_cons) & RRD_PROD_MASK) >> 519 1.40 bouyer RRD_PROD_SHIFT; 520 1.40 bouyer 521 1.40 bouyer /* Let hardware know CMB was served. */ 522 1.40 bouyer cmb->intr_status = 0; 523 1.40 bouyer bus_dmamap_sync(sc->sc_dmat, sc->age_cdata.age_cmb_block_map, 0, 524 1.40 bouyer sc->age_cdata.age_cmb_block_map->dm_mapsize, 525 1.57 msaitoh BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 526 1.40 bouyer 527 1.40 bouyer if (ifp->if_flags & IFF_RUNNING) { 528 1.40 bouyer if (status & INTR_CMB_RX) 529 1.40 bouyer age_rxintr(sc, sc->age_rr_prod); 530 1.40 bouyer 531 1.40 bouyer if (status & INTR_CMB_TX) 532 1.40 bouyer age_txintr(sc, sc->age_tpd_cons); 533 1.40 bouyer 534 1.40 bouyer if (status & (INTR_DMA_RD_TO_RST | INTR_DMA_WR_TO_RST)) { 535 1.40 bouyer if (status & INTR_DMA_RD_TO_RST) 536 1.40 bouyer printf("%s: DMA read error! -- " 537 1.40 bouyer "resetting\n", 538 1.40 bouyer device_xname(sc->sc_dev)); 539 1.40 bouyer if (status & INTR_DMA_WR_TO_RST) 540 1.40 bouyer printf("%s: DMA write error! -- " 541 1.40 bouyer "resetting\n", 542 1.40 bouyer device_xname(sc->sc_dev)); 543 1.40 bouyer age_init(ifp); 544 1.40 bouyer } 545 1.1 cegger 546 1.49 ozaki if_schedule_deferred_start(ifp); 547 1.1 cegger 548 1.40 bouyer if (status & INTR_SMB) 549 1.40 bouyer age_stats_update(sc); 550 1.1 cegger } 551 1.40 bouyer /* check if more interrupts did came in */ 552 1.40 bouyer bus_dmamap_sync(sc->sc_dmat, sc->age_cdata.age_cmb_block_map, 0, 553 1.40 bouyer sc->age_cdata.age_cmb_block_map->dm_mapsize, 554 1.57 msaitoh BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); 555 1.40 bouyer status = le32toh(cmb->intr_status); 556 1.1 cegger } 557 1.1 cegger 558 1.15 cegger return 1; 559 1.1 cegger } 560 1.1 cegger 561 1.1 cegger static void 562 1.1 cegger age_get_macaddr(struct age_softc *sc, uint8_t eaddr[]) 563 1.1 cegger { 564 1.30 cegger uint32_t ea[2], reg; 565 1.30 cegger int i, vpdc; 566 1.1 cegger 567 1.1 cegger reg = CSR_READ_4(sc, AGE_SPI_CTRL); 568 1.1 cegger if ((reg & SPI_VPD_ENB) != 0) { 569 1.1 cegger /* Get VPD stored in TWSI EEPROM. */ 570 1.1 cegger reg &= ~SPI_VPD_ENB; 571 1.1 cegger CSR_WRITE_4(sc, AGE_SPI_CTRL, reg); 572 1.1 cegger } 573 1.1 cegger 574 1.30 cegger if (pci_get_capability(sc->sc_pct, sc->sc_pcitag, 575 1.30 cegger PCI_CAP_VPD, &vpdc, NULL)) { 576 1.1 cegger /* 577 1.30 cegger * PCI VPD capability found, let TWSI reload EEPROM. 578 1.30 cegger * This will set Ethernet address of controller. 579 1.1 cegger */ 580 1.30 cegger CSR_WRITE_4(sc, AGE_TWSI_CTRL, CSR_READ_4(sc, AGE_TWSI_CTRL) | 581 1.30 cegger TWSI_CTRL_SW_LD_START); 582 1.61 maxv for (i = 100; i > 0; i--) { 583 1.30 cegger DELAY(1000); 584 1.30 cegger reg = CSR_READ_4(sc, AGE_TWSI_CTRL); 585 1.30 cegger if ((reg & TWSI_CTRL_SW_LD_START) == 0) 586 1.1 cegger break; 587 1.1 cegger } 588 1.30 cegger if (i == 0) 589 1.42 christos printf("%s: reloading EEPROM timeout!\n", 590 1.42 christos device_xname(sc->sc_dev)); 591 1.1 cegger } else { 592 1.1 cegger if (agedebug) 593 1.42 christos printf("%s: PCI VPD capability not found!\n", 594 1.1 cegger device_xname(sc->sc_dev)); 595 1.1 cegger } 596 1.1 cegger 597 1.30 cegger ea[0] = CSR_READ_4(sc, AGE_PAR0); 598 1.30 cegger ea[1] = CSR_READ_4(sc, AGE_PAR1); 599 1.1 cegger 600 1.1 cegger eaddr[0] = (ea[1] >> 8) & 0xFF; 601 1.1 cegger eaddr[1] = (ea[1] >> 0) & 0xFF; 602 1.1 cegger eaddr[2] = (ea[0] >> 24) & 0xFF; 603 1.1 cegger eaddr[3] = (ea[0] >> 16) & 0xFF; 604 1.1 cegger eaddr[4] = (ea[0] >> 8) & 0xFF; 605 1.1 cegger eaddr[5] = (ea[0] >> 0) & 0xFF; 606 1.1 cegger } 607 1.1 cegger 608 1.1 cegger static void 609 1.1 cegger age_phy_reset(struct age_softc *sc) 610 1.1 cegger { 611 1.30 cegger uint16_t reg, pn; 612 1.30 cegger int i, linkup; 613 1.30 cegger 614 1.1 cegger /* Reset PHY. */ 615 1.1 cegger CSR_WRITE_4(sc, AGE_GPHY_CTRL, GPHY_CTRL_RST); 616 1.30 cegger DELAY(2000); 617 1.1 cegger CSR_WRITE_4(sc, AGE_GPHY_CTRL, GPHY_CTRL_CLR); 618 1.30 cegger DELAY(2000); 619 1.30 cegger 620 1.30 cegger #define ATPHY_DBG_ADDR 0x1D 621 1.30 cegger #define ATPHY_DBG_DATA 0x1E 622 1.30 cegger #define ATPHY_CDTC 0x16 623 1.30 cegger #define PHY_CDTC_ENB 0x0001 624 1.30 cegger #define PHY_CDTC_POFF 8 625 1.30 cegger #define ATPHY_CDTS 0x1C 626 1.30 cegger #define PHY_CDTS_STAT_OK 0x0000 627 1.30 cegger #define PHY_CDTS_STAT_SHORT 0x0100 628 1.30 cegger #define PHY_CDTS_STAT_OPEN 0x0200 629 1.30 cegger #define PHY_CDTS_STAT_INVAL 0x0300 630 1.30 cegger #define PHY_CDTS_STAT_MASK 0x0300 631 1.30 cegger 632 1.30 cegger /* Check power saving mode. Magic from Linux. */ 633 1.30 cegger age_miibus_writereg(sc->sc_dev, sc->age_phyaddr, MII_BMCR, BMCR_RESET); 634 1.30 cegger for (linkup = 0, pn = 0; pn < 4; pn++) { 635 1.30 cegger age_miibus_writereg(sc->sc_dev, sc->age_phyaddr, ATPHY_CDTC, 636 1.30 cegger (pn << PHY_CDTC_POFF) | PHY_CDTC_ENB); 637 1.30 cegger for (i = 200; i > 0; i--) { 638 1.30 cegger DELAY(1000); 639 1.55 msaitoh age_miibus_readreg(sc->sc_dev, sc->age_phyaddr, 640 1.55 msaitoh ATPHY_CDTC, ®); 641 1.30 cegger if ((reg & PHY_CDTC_ENB) == 0) 642 1.30 cegger break; 643 1.30 cegger } 644 1.30 cegger DELAY(1000); 645 1.55 msaitoh age_miibus_readreg(sc->sc_dev, sc->age_phyaddr, 646 1.55 msaitoh ATPHY_CDTS, ®); 647 1.30 cegger if ((reg & PHY_CDTS_STAT_MASK) != PHY_CDTS_STAT_OPEN) { 648 1.30 cegger linkup++; 649 1.30 cegger break; 650 1.30 cegger } 651 1.30 cegger } 652 1.30 cegger age_miibus_writereg(sc->sc_dev, sc->age_phyaddr, MII_BMCR, 653 1.30 cegger BMCR_RESET | BMCR_AUTOEN | BMCR_STARTNEG); 654 1.30 cegger if (linkup == 0) { 655 1.30 cegger age_miibus_writereg(sc->sc_dev, sc->age_phyaddr, 656 1.30 cegger ATPHY_DBG_ADDR, 0); 657 1.30 cegger age_miibus_writereg(sc->sc_dev, sc->age_phyaddr, 658 1.30 cegger ATPHY_DBG_DATA, 0x124E); 659 1.30 cegger age_miibus_writereg(sc->sc_dev, sc->age_phyaddr, 660 1.30 cegger ATPHY_DBG_ADDR, 1); 661 1.55 msaitoh age_miibus_readreg(sc->sc_dev, sc->age_phyaddr, 662 1.55 msaitoh ATPHY_DBG_DATA, ®); 663 1.30 cegger age_miibus_writereg(sc->sc_dev, sc->age_phyaddr, 664 1.30 cegger ATPHY_DBG_DATA, reg | 0x03); 665 1.30 cegger /* XXX */ 666 1.30 cegger DELAY(1500 * 1000); 667 1.30 cegger age_miibus_writereg(sc->sc_dev, sc->age_phyaddr, 668 1.30 cegger ATPHY_DBG_ADDR, 0); 669 1.30 cegger age_miibus_writereg(sc->sc_dev, sc->age_phyaddr, 670 1.30 cegger ATPHY_DBG_DATA, 0x024E); 671 1.30 cegger } 672 1.30 cegger 673 1.30 cegger #undef ATPHY_DBG_ADDR 674 1.30 cegger #undef ATPHY_DBG_DATA 675 1.30 cegger #undef ATPHY_CDTC 676 1.30 cegger #undef PHY_CDTC_ENB 677 1.30 cegger #undef PHY_CDTC_POFF 678 1.30 cegger #undef ATPHY_CDTS 679 1.30 cegger #undef PHY_CDTS_STAT_OK 680 1.30 cegger #undef PHY_CDTS_STAT_SHORT 681 1.30 cegger #undef PHY_CDTS_STAT_OPEN 682 1.30 cegger #undef PHY_CDTS_STAT_INVAL 683 1.30 cegger #undef PHY_CDTS_STAT_MASK 684 1.1 cegger } 685 1.1 cegger 686 1.1 cegger static int 687 1.1 cegger age_dma_alloc(struct age_softc *sc) 688 1.1 cegger { 689 1.1 cegger struct age_txdesc *txd; 690 1.1 cegger struct age_rxdesc *rxd; 691 1.1 cegger int nsegs, error, i; 692 1.1 cegger 693 1.1 cegger /* 694 1.1 cegger * Create DMA stuffs for TX ring 695 1.1 cegger */ 696 1.42 christos error = bus_dmamap_create(sc->sc_dmat, AGE_TX_RING_SZ, 1, 697 1.1 cegger AGE_TX_RING_SZ, 0, BUS_DMA_NOWAIT, &sc->age_cdata.age_tx_ring_map); 698 1.25 cegger if (error) { 699 1.25 cegger sc->age_cdata.age_tx_ring_map = NULL; 700 1.15 cegger return ENOBUFS; 701 1.25 cegger } 702 1.1 cegger 703 1.1 cegger /* Allocate DMA'able memory for TX ring */ 704 1.42 christos error = bus_dmamem_alloc(sc->sc_dmat, AGE_TX_RING_SZ, 705 1.68 thorpej PAGE_SIZE, 0, &sc->age_rdata.age_tx_ring_seg, 1, 706 1.40 bouyer &nsegs, BUS_DMA_NOWAIT); 707 1.1 cegger if (error) { 708 1.16 cegger printf("%s: could not allocate DMA'able memory for Tx ring, " 709 1.16 cegger "error = %i\n", device_xname(sc->sc_dev), error); 710 1.1 cegger return error; 711 1.1 cegger } 712 1.1 cegger 713 1.1 cegger error = bus_dmamem_map(sc->sc_dmat, &sc->age_rdata.age_tx_ring_seg, 714 1.1 cegger nsegs, AGE_TX_RING_SZ, (void **)&sc->age_rdata.age_tx_ring, 715 1.40 bouyer BUS_DMA_NOWAIT | BUS_DMA_COHERENT); 716 1.42 christos if (error) 717 1.15 cegger return ENOBUFS; 718 1.1 cegger 719 1.1 cegger memset(sc->age_rdata.age_tx_ring, 0, AGE_TX_RING_SZ); 720 1.1 cegger 721 1.1 cegger /* Load the DMA map for Tx ring. */ 722 1.1 cegger error = bus_dmamap_load(sc->sc_dmat, sc->age_cdata.age_tx_ring_map, 723 1.40 bouyer sc->age_rdata.age_tx_ring, AGE_TX_RING_SZ, NULL, BUS_DMA_NOWAIT); 724 1.1 cegger if (error) { 725 1.16 cegger printf("%s: could not load DMA'able memory for Tx ring, " 726 1.16 cegger "error = %i\n", device_xname(sc->sc_dev), error); 727 1.42 christos bus_dmamem_free(sc->sc_dmat, 728 1.26 tsutsui &sc->age_rdata.age_tx_ring_seg, 1); 729 1.1 cegger return error; 730 1.1 cegger } 731 1.1 cegger 732 1.42 christos sc->age_rdata.age_tx_ring_paddr = 733 1.1 cegger sc->age_cdata.age_tx_ring_map->dm_segs[0].ds_addr; 734 1.1 cegger 735 1.1 cegger /* 736 1.1 cegger * Create DMA stuffs for RX ring 737 1.1 cegger */ 738 1.42 christos error = bus_dmamap_create(sc->sc_dmat, AGE_RX_RING_SZ, 1, 739 1.1 cegger AGE_RX_RING_SZ, 0, BUS_DMA_NOWAIT, &sc->age_cdata.age_rx_ring_map); 740 1.25 cegger if (error) { 741 1.25 cegger sc->age_cdata.age_rx_ring_map = NULL; 742 1.15 cegger return ENOBUFS; 743 1.25 cegger } 744 1.1 cegger 745 1.1 cegger /* Allocate DMA'able memory for RX ring */ 746 1.42 christos error = bus_dmamem_alloc(sc->sc_dmat, AGE_RX_RING_SZ, 747 1.68 thorpej PAGE_SIZE, 0, &sc->age_rdata.age_rx_ring_seg, 1, 748 1.40 bouyer &nsegs, BUS_DMA_NOWAIT); 749 1.1 cegger if (error) { 750 1.16 cegger printf("%s: could not allocate DMA'able memory for Rx ring, " 751 1.16 cegger "error = %i.\n", device_xname(sc->sc_dev), error); 752 1.1 cegger return error; 753 1.1 cegger } 754 1.1 cegger 755 1.1 cegger error = bus_dmamem_map(sc->sc_dmat, &sc->age_rdata.age_rx_ring_seg, 756 1.1 cegger nsegs, AGE_RX_RING_SZ, (void **)&sc->age_rdata.age_rx_ring, 757 1.40 bouyer BUS_DMA_NOWAIT | BUS_DMA_COHERENT); 758 1.1 cegger if (error) 759 1.15 cegger return ENOBUFS; 760 1.1 cegger 761 1.1 cegger memset(sc->age_rdata.age_rx_ring, 0, AGE_RX_RING_SZ); 762 1.1 cegger 763 1.1 cegger /* Load the DMA map for Rx ring. */ 764 1.1 cegger error = bus_dmamap_load(sc->sc_dmat, sc->age_cdata.age_rx_ring_map, 765 1.40 bouyer sc->age_rdata.age_rx_ring, AGE_RX_RING_SZ, NULL, BUS_DMA_NOWAIT); 766 1.1 cegger if (error) { 767 1.16 cegger printf("%s: could not load DMA'able memory for Rx ring, " 768 1.16 cegger "error = %i.\n", device_xname(sc->sc_dev), error); 769 1.1 cegger bus_dmamem_free(sc->sc_dmat, 770 1.26 tsutsui &sc->age_rdata.age_rx_ring_seg, 1); 771 1.1 cegger return error; 772 1.1 cegger } 773 1.1 cegger 774 1.42 christos sc->age_rdata.age_rx_ring_paddr = 775 1.1 cegger sc->age_cdata.age_rx_ring_map->dm_segs[0].ds_addr; 776 1.1 cegger 777 1.1 cegger /* 778 1.1 cegger * Create DMA stuffs for RX return ring 779 1.1 cegger */ 780 1.42 christos error = bus_dmamap_create(sc->sc_dmat, AGE_RR_RING_SZ, 1, 781 1.1 cegger AGE_RR_RING_SZ, 0, BUS_DMA_NOWAIT, &sc->age_cdata.age_rr_ring_map); 782 1.25 cegger if (error) { 783 1.25 cegger sc->age_cdata.age_rr_ring_map = NULL; 784 1.15 cegger return ENOBUFS; 785 1.25 cegger } 786 1.1 cegger 787 1.1 cegger /* Allocate DMA'able memory for RX return ring */ 788 1.42 christos error = bus_dmamem_alloc(sc->sc_dmat, AGE_RR_RING_SZ, 789 1.68 thorpej PAGE_SIZE, 0, &sc->age_rdata.age_rr_ring_seg, 1, 790 1.40 bouyer &nsegs, BUS_DMA_NOWAIT); 791 1.1 cegger if (error) { 792 1.1 cegger printf("%s: could not allocate DMA'able memory for Rx " 793 1.16 cegger "return ring, error = %i.\n", 794 1.16 cegger device_xname(sc->sc_dev), error); 795 1.1 cegger return error; 796 1.1 cegger } 797 1.1 cegger 798 1.1 cegger error = bus_dmamem_map(sc->sc_dmat, &sc->age_rdata.age_rr_ring_seg, 799 1.1 cegger nsegs, AGE_RR_RING_SZ, (void **)&sc->age_rdata.age_rr_ring, 800 1.40 bouyer BUS_DMA_NOWAIT | BUS_DMA_COHERENT); 801 1.1 cegger if (error) 802 1.15 cegger return ENOBUFS; 803 1.1 cegger 804 1.1 cegger memset(sc->age_rdata.age_rr_ring, 0, AGE_RR_RING_SZ); 805 1.1 cegger 806 1.1 cegger /* Load the DMA map for Rx return ring. */ 807 1.1 cegger error = bus_dmamap_load(sc->sc_dmat, sc->age_cdata.age_rr_ring_map, 808 1.40 bouyer sc->age_rdata.age_rr_ring, AGE_RR_RING_SZ, NULL, BUS_DMA_NOWAIT); 809 1.1 cegger if (error) { 810 1.16 cegger printf("%s: could not load DMA'able memory for Rx return ring, " 811 1.16 cegger "error = %i\n", device_xname(sc->sc_dev), error); 812 1.1 cegger bus_dmamem_free(sc->sc_dmat, 813 1.26 tsutsui &sc->age_rdata.age_rr_ring_seg, 1); 814 1.1 cegger return error; 815 1.1 cegger } 816 1.1 cegger 817 1.42 christos sc->age_rdata.age_rr_ring_paddr = 818 1.1 cegger sc->age_cdata.age_rr_ring_map->dm_segs[0].ds_addr; 819 1.1 cegger 820 1.1 cegger /* 821 1.42 christos * Create DMA stuffs for CMB block 822 1.1 cegger */ 823 1.42 christos error = bus_dmamap_create(sc->sc_dmat, AGE_CMB_BLOCK_SZ, 1, 824 1.42 christos AGE_CMB_BLOCK_SZ, 0, BUS_DMA_NOWAIT, 825 1.1 cegger &sc->age_cdata.age_cmb_block_map); 826 1.25 cegger if (error) { 827 1.25 cegger sc->age_cdata.age_cmb_block_map = NULL; 828 1.15 cegger return ENOBUFS; 829 1.25 cegger } 830 1.1 cegger 831 1.1 cegger /* Allocate DMA'able memory for CMB block */ 832 1.42 christos error = bus_dmamem_alloc(sc->sc_dmat, AGE_CMB_BLOCK_SZ, 833 1.68 thorpej PAGE_SIZE, 0, &sc->age_rdata.age_cmb_block_seg, 1, 834 1.40 bouyer &nsegs, BUS_DMA_NOWAIT); 835 1.1 cegger if (error) { 836 1.1 cegger printf("%s: could not allocate DMA'able memory for " 837 1.16 cegger "CMB block, error = %i\n", device_xname(sc->sc_dev), error); 838 1.1 cegger return error; 839 1.1 cegger } 840 1.1 cegger 841 1.1 cegger error = bus_dmamem_map(sc->sc_dmat, &sc->age_rdata.age_cmb_block_seg, 842 1.1 cegger nsegs, AGE_CMB_BLOCK_SZ, (void **)&sc->age_rdata.age_cmb_block, 843 1.40 bouyer BUS_DMA_NOWAIT | BUS_DMA_COHERENT); 844 1.1 cegger if (error) 845 1.15 cegger return ENOBUFS; 846 1.1 cegger 847 1.1 cegger memset(sc->age_rdata.age_cmb_block, 0, AGE_CMB_BLOCK_SZ); 848 1.1 cegger 849 1.1 cegger /* Load the DMA map for CMB block. */ 850 1.1 cegger error = bus_dmamap_load(sc->sc_dmat, sc->age_cdata.age_cmb_block_map, 851 1.42 christos sc->age_rdata.age_cmb_block, AGE_CMB_BLOCK_SZ, NULL, 852 1.40 bouyer BUS_DMA_NOWAIT); 853 1.1 cegger if (error) { 854 1.16 cegger printf("%s: could not load DMA'able memory for CMB block, " 855 1.16 cegger "error = %i\n", device_xname(sc->sc_dev), error); 856 1.1 cegger bus_dmamem_free(sc->sc_dmat, 857 1.26 tsutsui &sc->age_rdata.age_cmb_block_seg, 1); 858 1.1 cegger return error; 859 1.1 cegger } 860 1.1 cegger 861 1.42 christos sc->age_rdata.age_cmb_block_paddr = 862 1.1 cegger sc->age_cdata.age_cmb_block_map->dm_segs[0].ds_addr; 863 1.1 cegger 864 1.1 cegger /* 865 1.1 cegger * Create DMA stuffs for SMB block 866 1.1 cegger */ 867 1.42 christos error = bus_dmamap_create(sc->sc_dmat, AGE_SMB_BLOCK_SZ, 1, 868 1.42 christos AGE_SMB_BLOCK_SZ, 0, BUS_DMA_NOWAIT, 869 1.1 cegger &sc->age_cdata.age_smb_block_map); 870 1.25 cegger if (error) { 871 1.25 cegger sc->age_cdata.age_smb_block_map = NULL; 872 1.15 cegger return ENOBUFS; 873 1.25 cegger } 874 1.1 cegger 875 1.1 cegger /* Allocate DMA'able memory for SMB block */ 876 1.42 christos error = bus_dmamem_alloc(sc->sc_dmat, AGE_SMB_BLOCK_SZ, 877 1.68 thorpej PAGE_SIZE, 0, &sc->age_rdata.age_smb_block_seg, 1, 878 1.40 bouyer &nsegs, BUS_DMA_NOWAIT); 879 1.1 cegger if (error) { 880 1.1 cegger printf("%s: could not allocate DMA'able memory for " 881 1.16 cegger "SMB block, error = %i\n", device_xname(sc->sc_dev), error); 882 1.1 cegger return error; 883 1.1 cegger } 884 1.1 cegger 885 1.1 cegger error = bus_dmamem_map(sc->sc_dmat, &sc->age_rdata.age_smb_block_seg, 886 1.1 cegger nsegs, AGE_SMB_BLOCK_SZ, (void **)&sc->age_rdata.age_smb_block, 887 1.40 bouyer BUS_DMA_NOWAIT | BUS_DMA_COHERENT); 888 1.1 cegger if (error) 889 1.15 cegger return ENOBUFS; 890 1.1 cegger 891 1.1 cegger memset(sc->age_rdata.age_smb_block, 0, AGE_SMB_BLOCK_SZ); 892 1.1 cegger 893 1.1 cegger /* Load the DMA map for SMB block */ 894 1.1 cegger error = bus_dmamap_load(sc->sc_dmat, sc->age_cdata.age_smb_block_map, 895 1.42 christos sc->age_rdata.age_smb_block, AGE_SMB_BLOCK_SZ, NULL, 896 1.40 bouyer BUS_DMA_NOWAIT); 897 1.1 cegger if (error) { 898 1.16 cegger printf("%s: could not load DMA'able memory for SMB block, " 899 1.16 cegger "error = %i\n", device_xname(sc->sc_dev), error); 900 1.1 cegger bus_dmamem_free(sc->sc_dmat, 901 1.26 tsutsui &sc->age_rdata.age_smb_block_seg, 1); 902 1.1 cegger return error; 903 1.1 cegger } 904 1.1 cegger 905 1.42 christos sc->age_rdata.age_smb_block_paddr = 906 1.1 cegger sc->age_cdata.age_smb_block_map->dm_segs[0].ds_addr; 907 1.1 cegger 908 1.69 thorpej /* 909 1.69 thorpej * All of the memory we allocated above needs to be within 910 1.69 thorpej * the same 4GB segment. Make sure this is so. 911 1.69 thorpej * 912 1.69 thorpej * XXX We don't care WHAT 4GB segment they're in, just that 913 1.69 thorpej * XXX they're all in the same one. Need some bus_dma API 914 1.69 thorpej * XXX help to make this easier to enforce when we actually 915 1.69 thorpej * XXX perform the allocation. 916 1.69 thorpej */ 917 1.69 thorpej if (! (AGE_ADDR_HI(sc->age_rdata.age_tx_ring_paddr) == 918 1.69 thorpej AGE_ADDR_HI(sc->age_rdata.age_rx_ring_paddr) 919 1.69 thorpej 920 1.69 thorpej && AGE_ADDR_HI(sc->age_rdata.age_tx_ring_paddr) == 921 1.69 thorpej AGE_ADDR_HI(sc->age_rdata.age_rr_ring_paddr) 922 1.69 thorpej 923 1.69 thorpej && AGE_ADDR_HI(sc->age_rdata.age_tx_ring_paddr) == 924 1.69 thorpej AGE_ADDR_HI(sc->age_rdata.age_cmb_block_paddr) 925 1.69 thorpej 926 1.69 thorpej && AGE_ADDR_HI(sc->age_rdata.age_tx_ring_paddr) == 927 1.69 thorpej AGE_ADDR_HI(sc->age_rdata.age_smb_block_paddr))) { 928 1.69 thorpej aprint_error_dev(sc->sc_dev, 929 1.69 thorpej "control data allocation constraints failed\n"); 930 1.69 thorpej return ENOBUFS; 931 1.69 thorpej } 932 1.69 thorpej 933 1.1 cegger /* Create DMA maps for Tx buffers. */ 934 1.1 cegger for (i = 0; i < AGE_TX_RING_CNT; i++) { 935 1.1 cegger txd = &sc->age_cdata.age_txdesc[i]; 936 1.1 cegger txd->tx_m = NULL; 937 1.1 cegger txd->tx_dmamap = NULL; 938 1.1 cegger error = bus_dmamap_create(sc->sc_dmat, AGE_TSO_MAXSIZE, 939 1.1 cegger AGE_MAXTXSEGS, AGE_TSO_MAXSEGSIZE, 0, BUS_DMA_NOWAIT, 940 1.1 cegger &txd->tx_dmamap); 941 1.1 cegger if (error) { 942 1.25 cegger txd->tx_dmamap = NULL; 943 1.16 cegger printf("%s: could not create Tx dmamap, error = %i.\n", 944 1.16 cegger device_xname(sc->sc_dev), error); 945 1.1 cegger return error; 946 1.1 cegger } 947 1.1 cegger } 948 1.1 cegger 949 1.1 cegger /* Create DMA maps for Rx buffers. */ 950 1.1 cegger error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1, MCLBYTES, 0, 951 1.1 cegger BUS_DMA_NOWAIT, &sc->age_cdata.age_rx_sparemap); 952 1.1 cegger if (error) { 953 1.25 cegger sc->age_cdata.age_rx_sparemap = NULL; 954 1.42 christos printf("%s: could not create spare Rx dmamap, error = %i.\n", 955 1.16 cegger device_xname(sc->sc_dev), error); 956 1.1 cegger return error; 957 1.1 cegger } 958 1.1 cegger for (i = 0; i < AGE_RX_RING_CNT; i++) { 959 1.1 cegger rxd = &sc->age_cdata.age_rxdesc[i]; 960 1.1 cegger rxd->rx_m = NULL; 961 1.1 cegger rxd->rx_dmamap = NULL; 962 1.1 cegger error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1, 963 1.1 cegger MCLBYTES, 0, BUS_DMA_NOWAIT, &rxd->rx_dmamap); 964 1.1 cegger if (error) { 965 1.25 cegger rxd->rx_dmamap = NULL; 966 1.16 cegger printf("%s: could not create Rx dmamap, error = %i.\n", 967 1.16 cegger device_xname(sc->sc_dev), error); 968 1.1 cegger return error; 969 1.1 cegger } 970 1.1 cegger } 971 1.1 cegger 972 1.15 cegger return 0; 973 1.1 cegger } 974 1.1 cegger 975 1.1 cegger static void 976 1.1 cegger age_dma_free(struct age_softc *sc) 977 1.1 cegger { 978 1.1 cegger struct age_txdesc *txd; 979 1.1 cegger struct age_rxdesc *rxd; 980 1.1 cegger int i; 981 1.1 cegger 982 1.1 cegger /* Tx buffers */ 983 1.1 cegger for (i = 0; i < AGE_TX_RING_CNT; i++) { 984 1.1 cegger txd = &sc->age_cdata.age_txdesc[i]; 985 1.1 cegger if (txd->tx_dmamap != NULL) { 986 1.1 cegger bus_dmamap_destroy(sc->sc_dmat, txd->tx_dmamap); 987 1.1 cegger txd->tx_dmamap = NULL; 988 1.1 cegger } 989 1.1 cegger } 990 1.1 cegger /* Rx buffers */ 991 1.1 cegger for (i = 0; i < AGE_RX_RING_CNT; i++) { 992 1.1 cegger rxd = &sc->age_cdata.age_rxdesc[i]; 993 1.1 cegger if (rxd->rx_dmamap != NULL) { 994 1.1 cegger bus_dmamap_destroy(sc->sc_dmat, rxd->rx_dmamap); 995 1.1 cegger rxd->rx_dmamap = NULL; 996 1.1 cegger } 997 1.1 cegger } 998 1.1 cegger if (sc->age_cdata.age_rx_sparemap != NULL) { 999 1.1 cegger bus_dmamap_destroy(sc->sc_dmat, sc->age_cdata.age_rx_sparemap); 1000 1.1 cegger sc->age_cdata.age_rx_sparemap = NULL; 1001 1.1 cegger } 1002 1.1 cegger 1003 1.1 cegger /* Tx ring. */ 1004 1.1 cegger if (sc->age_cdata.age_tx_ring_map != NULL) 1005 1.1 cegger bus_dmamap_unload(sc->sc_dmat, sc->age_cdata.age_tx_ring_map); 1006 1.1 cegger if (sc->age_cdata.age_tx_ring_map != NULL && 1007 1.1 cegger sc->age_rdata.age_tx_ring != NULL) 1008 1.1 cegger bus_dmamem_free(sc->sc_dmat, 1009 1.26 tsutsui &sc->age_rdata.age_tx_ring_seg, 1); 1010 1.1 cegger sc->age_rdata.age_tx_ring = NULL; 1011 1.1 cegger sc->age_cdata.age_tx_ring_map = NULL; 1012 1.1 cegger 1013 1.1 cegger /* Rx ring. */ 1014 1.42 christos if (sc->age_cdata.age_rx_ring_map != NULL) 1015 1.1 cegger bus_dmamap_unload(sc->sc_dmat, sc->age_cdata.age_rx_ring_map); 1016 1.1 cegger if (sc->age_cdata.age_rx_ring_map != NULL && 1017 1.1 cegger sc->age_rdata.age_rx_ring != NULL) 1018 1.42 christos bus_dmamem_free(sc->sc_dmat, 1019 1.26 tsutsui &sc->age_rdata.age_rx_ring_seg, 1); 1020 1.1 cegger sc->age_rdata.age_rx_ring = NULL; 1021 1.1 cegger sc->age_cdata.age_rx_ring_map = NULL; 1022 1.1 cegger 1023 1.1 cegger /* Rx return ring. */ 1024 1.1 cegger if (sc->age_cdata.age_rr_ring_map != NULL) 1025 1.1 cegger bus_dmamap_unload(sc->sc_dmat, sc->age_cdata.age_rr_ring_map); 1026 1.1 cegger if (sc->age_cdata.age_rr_ring_map != NULL && 1027 1.1 cegger sc->age_rdata.age_rr_ring != NULL) 1028 1.42 christos bus_dmamem_free(sc->sc_dmat, 1029 1.26 tsutsui &sc->age_rdata.age_rr_ring_seg, 1); 1030 1.1 cegger sc->age_rdata.age_rr_ring = NULL; 1031 1.1 cegger sc->age_cdata.age_rr_ring_map = NULL; 1032 1.1 cegger 1033 1.1 cegger /* CMB block */ 1034 1.1 cegger if (sc->age_cdata.age_cmb_block_map != NULL) 1035 1.1 cegger bus_dmamap_unload(sc->sc_dmat, sc->age_cdata.age_cmb_block_map); 1036 1.1 cegger if (sc->age_cdata.age_cmb_block_map != NULL && 1037 1.1 cegger sc->age_rdata.age_cmb_block != NULL) 1038 1.1 cegger bus_dmamem_free(sc->sc_dmat, 1039 1.26 tsutsui &sc->age_rdata.age_cmb_block_seg, 1); 1040 1.1 cegger sc->age_rdata.age_cmb_block = NULL; 1041 1.1 cegger sc->age_cdata.age_cmb_block_map = NULL; 1042 1.1 cegger 1043 1.1 cegger /* SMB block */ 1044 1.1 cegger if (sc->age_cdata.age_smb_block_map != NULL) 1045 1.1 cegger bus_dmamap_unload(sc->sc_dmat, sc->age_cdata.age_smb_block_map); 1046 1.1 cegger if (sc->age_cdata.age_smb_block_map != NULL && 1047 1.1 cegger sc->age_rdata.age_smb_block != NULL) 1048 1.42 christos bus_dmamem_free(sc->sc_dmat, 1049 1.26 tsutsui &sc->age_rdata.age_smb_block_seg, 1); 1050 1.21 cegger sc->age_rdata.age_smb_block = NULL; 1051 1.21 cegger sc->age_cdata.age_smb_block_map = NULL; 1052 1.1 cegger } 1053 1.1 cegger 1054 1.1 cegger static void 1055 1.1 cegger age_start(struct ifnet *ifp) 1056 1.1 cegger { 1057 1.58 msaitoh struct age_softc *sc = ifp->if_softc; 1058 1.58 msaitoh struct mbuf *m_head; 1059 1.71 thorpej int enq, error; 1060 1.1 cegger 1061 1.1 cegger if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING) 1062 1.1 cegger return; 1063 1.40 bouyer if ((sc->age_flags & AGE_FLAG_LINK) == 0) 1064 1.40 bouyer return; 1065 1.1 cegger 1066 1.1 cegger enq = 0; 1067 1.1 cegger for (;;) { 1068 1.72 thorpej IFQ_POLL(&ifp->if_snd, m_head); 1069 1.1 cegger if (m_head == NULL) 1070 1.1 cegger break; 1071 1.1 cegger 1072 1.1 cegger /* 1073 1.1 cegger * Pack the data into the transmit ring. If we 1074 1.1 cegger * don't have room, set the OACTIVE flag and wait 1075 1.1 cegger * for the NIC to drain the ring. 1076 1.1 cegger */ 1077 1.71 thorpej if ((error = age_encap(sc, m_head)) != 0) { 1078 1.71 thorpej if (error == EFBIG) { 1079 1.71 thorpej /* This is fatal for the packet. */ 1080 1.72 thorpej IFQ_DEQUEUE(&ifp->if_snd, m_head); 1081 1.71 thorpej m_freem(m_head); 1082 1.71 thorpej if_statinc(ifp, if_oerrors); 1083 1.71 thorpej continue; 1084 1.71 thorpej } 1085 1.1 cegger ifp->if_flags |= IFF_OACTIVE; 1086 1.1 cegger break; 1087 1.1 cegger } 1088 1.72 thorpej IFQ_DEQUEUE(&ifp->if_snd, m_head); 1089 1.1 cegger enq = 1; 1090 1.1 cegger 1091 1.1 cegger /* 1092 1.1 cegger * If there's a BPF listener, bounce a copy of this frame 1093 1.1 cegger * to him. 1094 1.1 cegger */ 1095 1.53 msaitoh bpf_mtap(ifp, m_head, BPF_D_OUT); 1096 1.1 cegger } 1097 1.1 cegger 1098 1.1 cegger if (enq) { 1099 1.1 cegger /* Update mbox. */ 1100 1.1 cegger AGE_COMMIT_MBOX(sc); 1101 1.1 cegger /* Set a timeout in case the chip goes out to lunch. */ 1102 1.1 cegger ifp->if_timer = AGE_TX_TIMEOUT; 1103 1.1 cegger } 1104 1.1 cegger } 1105 1.1 cegger 1106 1.1 cegger static void 1107 1.1 cegger age_watchdog(struct ifnet *ifp) 1108 1.1 cegger { 1109 1.1 cegger struct age_softc *sc = ifp->if_softc; 1110 1.1 cegger 1111 1.1 cegger if ((sc->age_flags & AGE_FLAG_LINK) == 0) { 1112 1.1 cegger printf("%s: watchdog timeout (missed link)\n", 1113 1.1 cegger device_xname(sc->sc_dev)); 1114 1.66 thorpej if_statinc(ifp, if_oerrors); 1115 1.1 cegger age_init(ifp); 1116 1.1 cegger return; 1117 1.1 cegger } 1118 1.1 cegger 1119 1.1 cegger if (sc->age_cdata.age_tx_cnt == 0) { 1120 1.1 cegger printf("%s: watchdog timeout (missed Tx interrupts) " 1121 1.1 cegger "-- recovering\n", device_xname(sc->sc_dev)); 1122 1.40 bouyer age_start(ifp); 1123 1.1 cegger return; 1124 1.1 cegger } 1125 1.1 cegger 1126 1.1 cegger printf("%s: watchdog timeout\n", device_xname(sc->sc_dev)); 1127 1.66 thorpej if_statinc(ifp, if_oerrors); 1128 1.1 cegger age_init(ifp); 1129 1.40 bouyer age_start(ifp); 1130 1.40 bouyer } 1131 1.40 bouyer 1132 1.42 christos static bool 1133 1.42 christos age_shutdown(device_t self, int howto) 1134 1.40 bouyer { 1135 1.40 bouyer struct age_softc *sc; 1136 1.40 bouyer struct ifnet *ifp; 1137 1.40 bouyer 1138 1.40 bouyer sc = device_private(self); 1139 1.40 bouyer ifp = &sc->sc_ec.ec_if; 1140 1.42 christos age_stop(ifp, 1); 1141 1.40 bouyer 1142 1.40 bouyer return true; 1143 1.57 msaitoh } 1144 1.1 cegger 1145 1.1 cegger static int 1146 1.1 cegger age_ioctl(struct ifnet *ifp, u_long cmd, void *data) 1147 1.1 cegger { 1148 1.1 cegger struct age_softc *sc = ifp->if_softc; 1149 1.19 dyoung int s, error; 1150 1.1 cegger 1151 1.1 cegger s = splnet(); 1152 1.1 cegger 1153 1.19 dyoung error = ether_ioctl(ifp, cmd, data); 1154 1.19 dyoung if (error == ENETRESET) { 1155 1.19 dyoung if (ifp->if_flags & IFF_RUNNING) 1156 1.19 dyoung age_rxfilter(sc); 1157 1.19 dyoung error = 0; 1158 1.1 cegger } 1159 1.1 cegger 1160 1.1 cegger splx(s); 1161 1.8 cegger return error; 1162 1.1 cegger } 1163 1.1 cegger 1164 1.1 cegger static void 1165 1.1 cegger age_mac_config(struct age_softc *sc) 1166 1.1 cegger { 1167 1.1 cegger struct mii_data *mii; 1168 1.1 cegger uint32_t reg; 1169 1.1 cegger 1170 1.1 cegger mii = &sc->sc_miibus; 1171 1.1 cegger 1172 1.1 cegger reg = CSR_READ_4(sc, AGE_MAC_CFG); 1173 1.1 cegger reg &= ~MAC_CFG_FULL_DUPLEX; 1174 1.1 cegger reg &= ~(MAC_CFG_TX_FC | MAC_CFG_RX_FC); 1175 1.1 cegger reg &= ~MAC_CFG_SPEED_MASK; 1176 1.1 cegger 1177 1.1 cegger /* Reprogram MAC with resolved speed/duplex. */ 1178 1.1 cegger switch (IFM_SUBTYPE(mii->mii_media_active)) { 1179 1.1 cegger case IFM_10_T: 1180 1.1 cegger case IFM_100_TX: 1181 1.1 cegger reg |= MAC_CFG_SPEED_10_100; 1182 1.1 cegger break; 1183 1.1 cegger case IFM_1000_T: 1184 1.1 cegger reg |= MAC_CFG_SPEED_1000; 1185 1.1 cegger break; 1186 1.1 cegger } 1187 1.1 cegger if ((IFM_OPTIONS(mii->mii_media_active) & IFM_FDX) != 0) { 1188 1.1 cegger reg |= MAC_CFG_FULL_DUPLEX; 1189 1.1 cegger if ((IFM_OPTIONS(mii->mii_media_active) & IFM_ETH_TXPAUSE) != 0) 1190 1.1 cegger reg |= MAC_CFG_TX_FC; 1191 1.1 cegger if ((IFM_OPTIONS(mii->mii_media_active) & IFM_ETH_RXPAUSE) != 0) 1192 1.1 cegger reg |= MAC_CFG_RX_FC; 1193 1.1 cegger } 1194 1.1 cegger 1195 1.1 cegger CSR_WRITE_4(sc, AGE_MAC_CFG, reg); 1196 1.1 cegger } 1197 1.1 cegger 1198 1.3 cegger static bool 1199 1.37 dyoung age_resume(device_t dv, const pmf_qual_t *qual) 1200 1.3 cegger { 1201 1.3 cegger struct age_softc *sc = device_private(dv); 1202 1.3 cegger uint16_t cmd; 1203 1.3 cegger 1204 1.3 cegger /* 1205 1.3 cegger * Clear INTx emulation disable for hardware that 1206 1.3 cegger * is set in resume event. From Linux. 1207 1.3 cegger */ 1208 1.3 cegger cmd = pci_conf_read(sc->sc_pct, sc->sc_pcitag, PCI_COMMAND_STATUS_REG); 1209 1.19 dyoung if ((cmd & PCI_COMMAND_INTERRUPT_DISABLE) != 0) { 1210 1.19 dyoung cmd &= ~PCI_COMMAND_INTERRUPT_DISABLE; 1211 1.3 cegger pci_conf_write(sc->sc_pct, sc->sc_pcitag, 1212 1.3 cegger PCI_COMMAND_STATUS_REG, cmd); 1213 1.3 cegger } 1214 1.3 cegger 1215 1.3 cegger return true; 1216 1.3 cegger } 1217 1.3 cegger 1218 1.1 cegger static int 1219 1.71 thorpej age_encap(struct age_softc *sc, struct mbuf * const m) 1220 1.1 cegger { 1221 1.1 cegger struct age_txdesc *txd, *txd_last; 1222 1.1 cegger struct tx_desc *desc; 1223 1.1 cegger bus_dmamap_t map; 1224 1.1 cegger uint32_t cflags, poff, vtag; 1225 1.1 cegger int error, i, nsegs, prod; 1226 1.1 cegger 1227 1.1 cegger cflags = vtag = 0; 1228 1.1 cegger poff = 0; 1229 1.1 cegger 1230 1.1 cegger prod = sc->age_cdata.age_tx_prod; 1231 1.1 cegger txd = &sc->age_cdata.age_txdesc[prod]; 1232 1.1 cegger txd_last = txd; 1233 1.1 cegger map = txd->tx_dmamap; 1234 1.1 cegger 1235 1.71 thorpej error = bus_dmamap_load_mbuf(sc->sc_dmat, map, m, BUS_DMA_NOWAIT); 1236 1.1 cegger if (error == EFBIG) { 1237 1.71 thorpej struct mbuf *mnew = m_defrag(m, M_NOWAIT); 1238 1.71 thorpej if (mnew != NULL) { 1239 1.71 thorpej KASSERT(m == mnew); 1240 1.71 thorpej error = bus_dmamap_load_mbuf(sc->sc_dmat, map, mnew, 1241 1.71 thorpej BUS_DMA_NOWAIT); 1242 1.71 thorpej } else { 1243 1.71 thorpej /* Just drop if we can't defrag. */ 1244 1.71 thorpej error = EFBIG; 1245 1.1 cegger } 1246 1.71 thorpej if (error) { 1247 1.71 thorpej if (error == EFBIG) { 1248 1.71 thorpej printf("%s: Tx packet consumes too many " 1249 1.71 thorpej "DMA segments, dropping...\n", 1250 1.71 thorpej device_xname(sc->sc_dev)); 1251 1.71 thorpej } 1252 1.15 cegger return error; 1253 1.1 cegger } 1254 1.1 cegger } else if (error) { 1255 1.15 cegger return error; 1256 1.1 cegger } 1257 1.1 cegger 1258 1.1 cegger nsegs = map->dm_nsegs; 1259 1.71 thorpej KASSERT(nsegs != 0); 1260 1.1 cegger 1261 1.1 cegger /* Check descriptor overrun. */ 1262 1.1 cegger if (sc->age_cdata.age_tx_cnt + nsegs >= AGE_TX_RING_CNT - 2) { 1263 1.1 cegger bus_dmamap_unload(sc->sc_dmat, map); 1264 1.15 cegger return ENOBUFS; 1265 1.1 cegger } 1266 1.40 bouyer bus_dmamap_sync(sc->sc_dmat, map, 0, map->dm_mapsize, 1267 1.40 bouyer BUS_DMASYNC_PREWRITE); 1268 1.1 cegger 1269 1.1 cegger /* Configure Tx IP/TCP/UDP checksum offload. */ 1270 1.1 cegger if ((m->m_pkthdr.csum_flags & AGE_CSUM_FEATURES) != 0) { 1271 1.1 cegger cflags |= AGE_TD_CSUM; 1272 1.1 cegger if ((m->m_pkthdr.csum_flags & M_CSUM_TCPv4) != 0) 1273 1.1 cegger cflags |= AGE_TD_TCPCSUM; 1274 1.1 cegger if ((m->m_pkthdr.csum_flags & M_CSUM_UDPv4) != 0) 1275 1.1 cegger cflags |= AGE_TD_UDPCSUM; 1276 1.1 cegger /* Set checksum start offset. */ 1277 1.1 cegger cflags |= (poff << AGE_TD_CSUM_PLOADOFFSET_SHIFT); 1278 1.1 cegger } 1279 1.1 cegger 1280 1.1 cegger #if NVLAN > 0 1281 1.1 cegger /* Configure VLAN hardware tag insertion. */ 1282 1.51 knakahar if (vlan_has_tag(m)) { 1283 1.51 knakahar vtag = AGE_TX_VLAN_TAG(htons(vlan_get_tag(m))); 1284 1.1 cegger vtag = ((vtag << AGE_TD_VLAN_SHIFT) & AGE_TD_VLAN_MASK); 1285 1.1 cegger cflags |= AGE_TD_INSERT_VLAN_TAG; 1286 1.1 cegger } 1287 1.1 cegger #endif 1288 1.1 cegger 1289 1.1 cegger desc = NULL; 1290 1.40 bouyer KASSERT(nsegs > 0); 1291 1.40 bouyer for (i = 0; ; i++) { 1292 1.1 cegger desc = &sc->age_rdata.age_tx_ring[prod]; 1293 1.1 cegger desc->addr = htole64(map->dm_segs[i].ds_addr); 1294 1.42 christos desc->len = 1295 1.1 cegger htole32(AGE_TX_BYTES(map->dm_segs[i].ds_len) | vtag); 1296 1.1 cegger desc->flags = htole32(cflags); 1297 1.1 cegger sc->age_cdata.age_tx_cnt++; 1298 1.40 bouyer if (i == (nsegs - 1)) 1299 1.40 bouyer break; 1300 1.57 msaitoh 1301 1.57 msaitoh /* Sync this descriptor and go to the next one */ 1302 1.40 bouyer bus_dmamap_sync(sc->sc_dmat, sc->age_cdata.age_tx_ring_map, 1303 1.40 bouyer prod * sizeof(struct tx_desc), sizeof(struct tx_desc), 1304 1.40 bouyer BUS_DMASYNC_PREWRITE); 1305 1.1 cegger AGE_DESC_INC(prod, AGE_TX_RING_CNT); 1306 1.1 cegger } 1307 1.1 cegger 1308 1.40 bouyer /* Set EOP on the last descriptor and sync it. */ 1309 1.1 cegger desc->flags |= htole32(AGE_TD_EOP); 1310 1.40 bouyer bus_dmamap_sync(sc->sc_dmat, sc->age_cdata.age_tx_ring_map, 1311 1.40 bouyer prod * sizeof(struct tx_desc), sizeof(struct tx_desc), 1312 1.40 bouyer BUS_DMASYNC_PREWRITE); 1313 1.1 cegger 1314 1.40 bouyer if (nsegs > 1) { 1315 1.40 bouyer /* Swap dmamap of the first and the last. */ 1316 1.40 bouyer txd = &sc->age_cdata.age_txdesc[prod]; 1317 1.40 bouyer map = txd_last->tx_dmamap; 1318 1.40 bouyer txd_last->tx_dmamap = txd->tx_dmamap; 1319 1.40 bouyer txd->tx_dmamap = map; 1320 1.40 bouyer txd->tx_m = m; 1321 1.40 bouyer KASSERT(txd_last->tx_m == NULL); 1322 1.40 bouyer } else { 1323 1.40 bouyer KASSERT(txd_last == &sc->age_cdata.age_txdesc[prod]); 1324 1.40 bouyer txd_last->tx_m = m; 1325 1.40 bouyer } 1326 1.1 cegger 1327 1.40 bouyer /* Update producer index. */ 1328 1.40 bouyer AGE_DESC_INC(prod, AGE_TX_RING_CNT); 1329 1.40 bouyer sc->age_cdata.age_tx_prod = prod; 1330 1.1 cegger 1331 1.15 cegger return 0; 1332 1.1 cegger } 1333 1.1 cegger 1334 1.1 cegger static void 1335 1.1 cegger age_txintr(struct age_softc *sc, int tpd_cons) 1336 1.1 cegger { 1337 1.1 cegger struct ifnet *ifp = &sc->sc_ec.ec_if; 1338 1.1 cegger struct age_txdesc *txd; 1339 1.1 cegger int cons, prog; 1340 1.1 cegger 1341 1.40 bouyer if (sc->age_cdata.age_tx_cnt <= 0) { 1342 1.40 bouyer if (ifp->if_timer != 0) 1343 1.40 bouyer printf("timer running without packets\n"); 1344 1.40 bouyer if (sc->age_cdata.age_tx_cnt) 1345 1.40 bouyer printf("age_tx_cnt corrupted\n"); 1346 1.40 bouyer } 1347 1.1 cegger 1348 1.1 cegger /* 1349 1.1 cegger * Go through our Tx list and free mbufs for those 1350 1.1 cegger * frames which have been transmitted. 1351 1.1 cegger */ 1352 1.1 cegger cons = sc->age_cdata.age_tx_cons; 1353 1.1 cegger for (prog = 0; cons != tpd_cons; AGE_DESC_INC(cons, AGE_TX_RING_CNT)) { 1354 1.1 cegger if (sc->age_cdata.age_tx_cnt <= 0) 1355 1.1 cegger break; 1356 1.1 cegger prog++; 1357 1.1 cegger ifp->if_flags &= ~IFF_OACTIVE; 1358 1.1 cegger sc->age_cdata.age_tx_cnt--; 1359 1.1 cegger txd = &sc->age_cdata.age_txdesc[cons]; 1360 1.1 cegger /* 1361 1.1 cegger * Clear Tx descriptors, it's not required but would 1362 1.1 cegger * help debugging in case of Tx issues. 1363 1.1 cegger */ 1364 1.40 bouyer bus_dmamap_sync(sc->sc_dmat, sc->age_cdata.age_tx_ring_map, 1365 1.40 bouyer cons * sizeof(struct tx_desc), sizeof(struct tx_desc), 1366 1.40 bouyer BUS_DMASYNC_POSTWRITE); 1367 1.1 cegger txd->tx_desc->addr = 0; 1368 1.1 cegger txd->tx_desc->len = 0; 1369 1.1 cegger txd->tx_desc->flags = 0; 1370 1.1 cegger 1371 1.1 cegger if (txd->tx_m == NULL) 1372 1.1 cegger continue; 1373 1.1 cegger /* Reclaim transmitted mbufs. */ 1374 1.1 cegger bus_dmamap_unload(sc->sc_dmat, txd->tx_dmamap); 1375 1.1 cegger m_freem(txd->tx_m); 1376 1.1 cegger txd->tx_m = NULL; 1377 1.1 cegger } 1378 1.1 cegger 1379 1.1 cegger if (prog > 0) { 1380 1.1 cegger sc->age_cdata.age_tx_cons = cons; 1381 1.1 cegger 1382 1.1 cegger /* 1383 1.1 cegger * Unarm watchdog timer only when there are no pending 1384 1.1 cegger * Tx descriptors in queue. 1385 1.1 cegger */ 1386 1.1 cegger if (sc->age_cdata.age_tx_cnt == 0) 1387 1.1 cegger ifp->if_timer = 0; 1388 1.1 cegger } 1389 1.1 cegger } 1390 1.1 cegger 1391 1.1 cegger /* Receive a frame. */ 1392 1.1 cegger static void 1393 1.1 cegger age_rxeof(struct age_softc *sc, struct rx_rdesc *rxrd) 1394 1.1 cegger { 1395 1.1 cegger struct ifnet *ifp = &sc->sc_ec.ec_if; 1396 1.1 cegger struct age_rxdesc *rxd; 1397 1.1 cegger struct rx_desc *desc; 1398 1.1 cegger struct mbuf *mp, *m; 1399 1.22 cegger uint32_t status, index; 1400 1.1 cegger int count, nsegs, pktlen; 1401 1.1 cegger int rx_cons; 1402 1.1 cegger 1403 1.1 cegger status = le32toh(rxrd->flags); 1404 1.1 cegger index = le32toh(rxrd->index); 1405 1.1 cegger rx_cons = AGE_RX_CONS(index); 1406 1.1 cegger nsegs = AGE_RX_NSEGS(index); 1407 1.1 cegger 1408 1.1 cegger sc->age_cdata.age_rxlen = AGE_RX_BYTES(le32toh(rxrd->len)); 1409 1.1 cegger if ((status & AGE_RRD_ERROR) != 0 && 1410 1.1 cegger (status & (AGE_RRD_CRC | AGE_RRD_CODE | AGE_RRD_DRIBBLE | 1411 1.1 cegger AGE_RRD_RUNT | AGE_RRD_OFLOW | AGE_RRD_TRUNC)) != 0) { 1412 1.1 cegger /* 1413 1.1 cegger * We want to pass the following frames to upper 1414 1.1 cegger * layer regardless of error status of Rx return 1415 1.1 cegger * ring. 1416 1.1 cegger * 1417 1.1 cegger * o IP/TCP/UDP checksum is bad. 1418 1.1 cegger * o frame length and protocol specific length 1419 1.1 cegger * does not match. 1420 1.1 cegger */ 1421 1.1 cegger sc->age_cdata.age_rx_cons += nsegs; 1422 1.1 cegger sc->age_cdata.age_rx_cons %= AGE_RX_RING_CNT; 1423 1.1 cegger return; 1424 1.1 cegger } 1425 1.1 cegger 1426 1.1 cegger pktlen = 0; 1427 1.1 cegger for (count = 0; count < nsegs; count++, 1428 1.1 cegger AGE_DESC_INC(rx_cons, AGE_RX_RING_CNT)) { 1429 1.1 cegger rxd = &sc->age_cdata.age_rxdesc[rx_cons]; 1430 1.1 cegger mp = rxd->rx_m; 1431 1.1 cegger desc = rxd->rx_desc; 1432 1.1 cegger /* Add a new receive buffer to the ring. */ 1433 1.1 cegger if (age_newbuf(sc, rxd, 0) != 0) { 1434 1.66 thorpej if_statinc(ifp, if_iqdrops); 1435 1.1 cegger /* Reuse Rx buffers. */ 1436 1.1 cegger if (sc->age_cdata.age_rxhead != NULL) { 1437 1.1 cegger m_freem(sc->age_cdata.age_rxhead); 1438 1.1 cegger AGE_RXCHAIN_RESET(sc); 1439 1.1 cegger } 1440 1.1 cegger break; 1441 1.1 cegger } 1442 1.1 cegger 1443 1.1 cegger /* The length of the first mbuf is computed last. */ 1444 1.1 cegger if (count != 0) { 1445 1.1 cegger mp->m_len = AGE_RX_BYTES(le32toh(desc->len)); 1446 1.1 cegger pktlen += mp->m_len; 1447 1.1 cegger } 1448 1.1 cegger 1449 1.1 cegger /* Chain received mbufs. */ 1450 1.1 cegger if (sc->age_cdata.age_rxhead == NULL) { 1451 1.1 cegger sc->age_cdata.age_rxhead = mp; 1452 1.1 cegger sc->age_cdata.age_rxtail = mp; 1453 1.1 cegger } else { 1454 1.52 maxv m_remove_pkthdr(mp); 1455 1.1 cegger sc->age_cdata.age_rxprev_tail = 1456 1.1 cegger sc->age_cdata.age_rxtail; 1457 1.1 cegger sc->age_cdata.age_rxtail->m_next = mp; 1458 1.1 cegger sc->age_cdata.age_rxtail = mp; 1459 1.1 cegger } 1460 1.1 cegger 1461 1.1 cegger if (count == nsegs - 1) { 1462 1.1 cegger /* 1463 1.1 cegger * It seems that L1 controller has no way 1464 1.1 cegger * to tell hardware to strip CRC bytes. 1465 1.1 cegger */ 1466 1.1 cegger sc->age_cdata.age_rxlen -= ETHER_CRC_LEN; 1467 1.1 cegger if (nsegs > 1) { 1468 1.1 cegger /* Remove the CRC bytes in chained mbufs. */ 1469 1.1 cegger pktlen -= ETHER_CRC_LEN; 1470 1.1 cegger if (mp->m_len <= ETHER_CRC_LEN) { 1471 1.1 cegger sc->age_cdata.age_rxtail = 1472 1.1 cegger sc->age_cdata.age_rxprev_tail; 1473 1.1 cegger sc->age_cdata.age_rxtail->m_len -= 1474 1.1 cegger (ETHER_CRC_LEN - mp->m_len); 1475 1.1 cegger sc->age_cdata.age_rxtail->m_next = NULL; 1476 1.1 cegger m_freem(mp); 1477 1.1 cegger } else { 1478 1.1 cegger mp->m_len -= ETHER_CRC_LEN; 1479 1.1 cegger } 1480 1.1 cegger } 1481 1.1 cegger 1482 1.1 cegger m = sc->age_cdata.age_rxhead; 1483 1.52 maxv KASSERT(m->m_flags & M_PKTHDR); 1484 1.48 ozaki m_set_rcvif(m, ifp); 1485 1.1 cegger m->m_pkthdr.len = sc->age_cdata.age_rxlen; 1486 1.1 cegger /* Set the first mbuf length. */ 1487 1.1 cegger m->m_len = sc->age_cdata.age_rxlen - pktlen; 1488 1.1 cegger 1489 1.1 cegger /* 1490 1.1 cegger * Set checksum information. 1491 1.1 cegger * It seems that L1 controller can compute partial 1492 1.1 cegger * checksum. The partial checksum value can be used 1493 1.1 cegger * to accelerate checksum computation for fragmented 1494 1.1 cegger * TCP/UDP packets. Upper network stack already 1495 1.1 cegger * takes advantage of the partial checksum value in 1496 1.1 cegger * IP reassembly stage. But I'm not sure the 1497 1.1 cegger * correctness of the partial hardware checksum 1498 1.1 cegger * assistance due to lack of data sheet. If it is 1499 1.1 cegger * proven to work on L1 I'll enable it. 1500 1.1 cegger */ 1501 1.1 cegger if (status & AGE_RRD_IPV4) { 1502 1.13 cegger if (status & AGE_RRD_IPCSUM_NOK) 1503 1.42 christos m->m_pkthdr.csum_flags |= 1504 1.1 cegger M_CSUM_IPv4_BAD; 1505 1.13 cegger if ((status & (AGE_RRD_TCP | AGE_RRD_UDP)) && 1506 1.13 cegger (status & AGE_RRD_TCP_UDPCSUM_NOK)) { 1507 1.1 cegger m->m_pkthdr.csum_flags |= 1508 1.1 cegger M_CSUM_TCP_UDP_BAD; 1509 1.1 cegger } 1510 1.1 cegger /* 1511 1.1 cegger * Don't mark bad checksum for TCP/UDP frames 1512 1.1 cegger * as fragmented frames may always have set 1513 1.1 cegger * bad checksummed bit of descriptor status. 1514 1.1 cegger */ 1515 1.1 cegger } 1516 1.1 cegger #if NVLAN > 0 1517 1.1 cegger /* Check for VLAN tagged frames. */ 1518 1.1 cegger if (status & AGE_RRD_VLAN) { 1519 1.22 cegger uint32_t vtag = AGE_RX_VLAN(le32toh(rxrd->vtags)); 1520 1.51 knakahar vlan_set_tag(m, AGE_RX_VLAN_TAG(vtag)); 1521 1.1 cegger } 1522 1.1 cegger #endif 1523 1.1 cegger 1524 1.1 cegger /* Pass it on. */ 1525 1.46 ozaki if_percpuq_enqueue(ifp->if_percpuq, m); 1526 1.1 cegger 1527 1.1 cegger /* Reset mbuf chains. */ 1528 1.1 cegger AGE_RXCHAIN_RESET(sc); 1529 1.1 cegger } 1530 1.1 cegger } 1531 1.1 cegger 1532 1.1 cegger if (count != nsegs) { 1533 1.1 cegger sc->age_cdata.age_rx_cons += nsegs; 1534 1.1 cegger sc->age_cdata.age_rx_cons %= AGE_RX_RING_CNT; 1535 1.1 cegger } else 1536 1.1 cegger sc->age_cdata.age_rx_cons = rx_cons; 1537 1.1 cegger } 1538 1.1 cegger 1539 1.1 cegger static void 1540 1.1 cegger age_rxintr(struct age_softc *sc, int rr_prod) 1541 1.1 cegger { 1542 1.1 cegger struct rx_rdesc *rxrd; 1543 1.1 cegger int rr_cons, nsegs, pktlen, prog; 1544 1.1 cegger 1545 1.1 cegger rr_cons = sc->age_cdata.age_rr_cons; 1546 1.1 cegger if (rr_cons == rr_prod) 1547 1.1 cegger return; 1548 1.1 cegger 1549 1.1 cegger bus_dmamap_sync(sc->sc_dmat, sc->age_cdata.age_rr_ring_map, 0, 1550 1.42 christos sc->age_cdata.age_rr_ring_map->dm_mapsize, 1551 1.1 cegger BUS_DMASYNC_POSTREAD); 1552 1.1 cegger 1553 1.1 cegger for (prog = 0; rr_cons != rr_prod; prog++) { 1554 1.1 cegger rxrd = &sc->age_rdata.age_rr_ring[rr_cons]; 1555 1.1 cegger nsegs = AGE_RX_NSEGS(le32toh(rxrd->index)); 1556 1.1 cegger if (nsegs == 0) 1557 1.1 cegger break; 1558 1.1 cegger /* 1559 1.1 cegger * Check number of segments against received bytes 1560 1.1 cegger * Non-matching value would indicate that hardware 1561 1.1 cegger * is still trying to update Rx return descriptors. 1562 1.1 cegger * I'm not sure whether this check is really needed. 1563 1.1 cegger */ 1564 1.1 cegger pktlen = AGE_RX_BYTES(le32toh(rxrd->len)); 1565 1.9 cegger if (nsegs != ((pktlen + (MCLBYTES - ETHER_ALIGN - 1)) / 1566 1.9 cegger (MCLBYTES - ETHER_ALIGN))) 1567 1.1 cegger break; 1568 1.1 cegger 1569 1.1 cegger /* Received a frame. */ 1570 1.1 cegger age_rxeof(sc, rxrd); 1571 1.1 cegger 1572 1.1 cegger /* Clear return ring. */ 1573 1.1 cegger rxrd->index = 0; 1574 1.1 cegger AGE_DESC_INC(rr_cons, AGE_RR_RING_CNT); 1575 1.1 cegger } 1576 1.1 cegger 1577 1.1 cegger if (prog > 0) { 1578 1.1 cegger /* Update the consumer index. */ 1579 1.1 cegger sc->age_cdata.age_rr_cons = rr_cons; 1580 1.1 cegger 1581 1.1 cegger /* Sync descriptors. */ 1582 1.1 cegger bus_dmamap_sync(sc->sc_dmat, sc->age_cdata.age_rr_ring_map, 0, 1583 1.1 cegger sc->age_cdata.age_rr_ring_map->dm_mapsize, 1584 1.1 cegger BUS_DMASYNC_PREWRITE); 1585 1.1 cegger 1586 1.1 cegger /* Notify hardware availability of new Rx buffers. */ 1587 1.1 cegger AGE_COMMIT_MBOX(sc); 1588 1.1 cegger } 1589 1.1 cegger } 1590 1.1 cegger 1591 1.1 cegger static void 1592 1.1 cegger age_tick(void *xsc) 1593 1.1 cegger { 1594 1.1 cegger struct age_softc *sc = xsc; 1595 1.1 cegger struct mii_data *mii = &sc->sc_miibus; 1596 1.1 cegger int s; 1597 1.1 cegger 1598 1.1 cegger s = splnet(); 1599 1.1 cegger mii_tick(mii); 1600 1.1 cegger splx(s); 1601 1.1 cegger 1602 1.1 cegger callout_schedule(&sc->sc_tick_ch, hz); 1603 1.1 cegger } 1604 1.1 cegger 1605 1.1 cegger static void 1606 1.1 cegger age_reset(struct age_softc *sc) 1607 1.1 cegger { 1608 1.1 cegger uint32_t reg; 1609 1.1 cegger int i; 1610 1.1 cegger 1611 1.1 cegger CSR_WRITE_4(sc, AGE_MASTER_CFG, MASTER_RESET); 1612 1.30 cegger CSR_READ_4(sc, AGE_MASTER_CFG); 1613 1.30 cegger DELAY(1000); 1614 1.1 cegger for (i = AGE_RESET_TIMEOUT; i > 0; i--) { 1615 1.1 cegger if ((reg = CSR_READ_4(sc, AGE_IDLE_STATUS)) == 0) 1616 1.1 cegger break; 1617 1.1 cegger DELAY(10); 1618 1.1 cegger } 1619 1.1 cegger 1620 1.1 cegger if (i == 0) 1621 1.1 cegger printf("%s: reset timeout(0x%08x)!\n", device_xname(sc->sc_dev), 1622 1.1 cegger reg); 1623 1.1 cegger 1624 1.1 cegger /* Initialize PCIe module. From Linux. */ 1625 1.1 cegger CSR_WRITE_4(sc, 0x12FC, 0x6500); 1626 1.1 cegger CSR_WRITE_4(sc, 0x1008, CSR_READ_4(sc, 0x1008) | 0x8000); 1627 1.1 cegger } 1628 1.1 cegger 1629 1.1 cegger static int 1630 1.1 cegger age_init(struct ifnet *ifp) 1631 1.1 cegger { 1632 1.1 cegger struct age_softc *sc = ifp->if_softc; 1633 1.1 cegger struct mii_data *mii; 1634 1.1 cegger uint8_t eaddr[ETHER_ADDR_LEN]; 1635 1.1 cegger bus_addr_t paddr; 1636 1.1 cegger uint32_t reg, fsize; 1637 1.1 cegger uint32_t rxf_hi, rxf_lo, rrd_hi, rrd_lo; 1638 1.1 cegger int error; 1639 1.1 cegger 1640 1.1 cegger /* 1641 1.1 cegger * Cancel any pending I/O. 1642 1.1 cegger */ 1643 1.18 cegger age_stop(ifp, 0); 1644 1.1 cegger 1645 1.1 cegger /* 1646 1.1 cegger * Reset the chip to a known state. 1647 1.1 cegger */ 1648 1.1 cegger age_reset(sc); 1649 1.1 cegger 1650 1.1 cegger /* Initialize descriptors. */ 1651 1.1 cegger error = age_init_rx_ring(sc); 1652 1.58 msaitoh if (error != 0) { 1653 1.1 cegger printf("%s: no memory for Rx buffers.\n", device_xname(sc->sc_dev)); 1654 1.18 cegger age_stop(ifp, 0); 1655 1.15 cegger return error; 1656 1.58 msaitoh } 1657 1.1 cegger age_init_rr_ring(sc); 1658 1.1 cegger age_init_tx_ring(sc); 1659 1.1 cegger age_init_cmb_block(sc); 1660 1.1 cegger age_init_smb_block(sc); 1661 1.1 cegger 1662 1.1 cegger /* Reprogram the station address. */ 1663 1.1 cegger memcpy(eaddr, CLLADDR(ifp->if_sadl), sizeof(eaddr)); 1664 1.1 cegger CSR_WRITE_4(sc, AGE_PAR0, 1665 1.1 cegger eaddr[2] << 24 | eaddr[3] << 16 | eaddr[4] << 8 | eaddr[5]); 1666 1.1 cegger CSR_WRITE_4(sc, AGE_PAR1, eaddr[0] << 8 | eaddr[1]); 1667 1.1 cegger 1668 1.1 cegger /* Set descriptor base addresses. */ 1669 1.1 cegger paddr = sc->age_rdata.age_tx_ring_paddr; 1670 1.1 cegger CSR_WRITE_4(sc, AGE_DESC_ADDR_HI, AGE_ADDR_HI(paddr)); 1671 1.1 cegger paddr = sc->age_rdata.age_rx_ring_paddr; 1672 1.1 cegger CSR_WRITE_4(sc, AGE_DESC_RD_ADDR_LO, AGE_ADDR_LO(paddr)); 1673 1.1 cegger paddr = sc->age_rdata.age_rr_ring_paddr; 1674 1.1 cegger CSR_WRITE_4(sc, AGE_DESC_RRD_ADDR_LO, AGE_ADDR_LO(paddr)); 1675 1.1 cegger paddr = sc->age_rdata.age_tx_ring_paddr; 1676 1.1 cegger CSR_WRITE_4(sc, AGE_DESC_TPD_ADDR_LO, AGE_ADDR_LO(paddr)); 1677 1.1 cegger paddr = sc->age_rdata.age_cmb_block_paddr; 1678 1.1 cegger CSR_WRITE_4(sc, AGE_DESC_CMB_ADDR_LO, AGE_ADDR_LO(paddr)); 1679 1.1 cegger paddr = sc->age_rdata.age_smb_block_paddr; 1680 1.1 cegger CSR_WRITE_4(sc, AGE_DESC_SMB_ADDR_LO, AGE_ADDR_LO(paddr)); 1681 1.1 cegger 1682 1.1 cegger /* Set Rx/Rx return descriptor counter. */ 1683 1.1 cegger CSR_WRITE_4(sc, AGE_DESC_RRD_RD_CNT, 1684 1.1 cegger ((AGE_RR_RING_CNT << DESC_RRD_CNT_SHIFT) & 1685 1.1 cegger DESC_RRD_CNT_MASK) | 1686 1.1 cegger ((AGE_RX_RING_CNT << DESC_RD_CNT_SHIFT) & DESC_RD_CNT_MASK)); 1687 1.1 cegger 1688 1.1 cegger /* Set Tx descriptor counter. */ 1689 1.1 cegger CSR_WRITE_4(sc, AGE_DESC_TPD_CNT, 1690 1.1 cegger (AGE_TX_RING_CNT << DESC_TPD_CNT_SHIFT) & DESC_TPD_CNT_MASK); 1691 1.1 cegger 1692 1.1 cegger /* Tell hardware that we're ready to load descriptors. */ 1693 1.1 cegger CSR_WRITE_4(sc, AGE_DMA_BLOCK, DMA_BLOCK_LOAD); 1694 1.1 cegger 1695 1.58 msaitoh /* 1696 1.1 cegger * Initialize mailbox register. 1697 1.1 cegger * Updated producer/consumer index information is exchanged 1698 1.1 cegger * through this mailbox register. However Tx producer and 1699 1.1 cegger * Rx return consumer/Rx producer are all shared such that 1700 1.1 cegger * it's hard to separate code path between Tx and Rx without 1701 1.1 cegger * locking. If L1 hardware have a separate mail box register 1702 1.1 cegger * for Tx and Rx consumer/producer management we could have 1703 1.70 andvar * independent Tx/Rx handler which in turn Rx handler could have 1704 1.1 cegger * been run without any locking. 1705 1.1 cegger */ 1706 1.1 cegger AGE_COMMIT_MBOX(sc); 1707 1.1 cegger 1708 1.1 cegger /* Configure IPG/IFG parameters. */ 1709 1.1 cegger CSR_WRITE_4(sc, AGE_IPG_IFG_CFG, 1710 1.1 cegger ((IPG_IFG_IPG2_DEFAULT << IPG_IFG_IPG2_SHIFT) & IPG_IFG_IPG2_MASK) | 1711 1.1 cegger ((IPG_IFG_IPG1_DEFAULT << IPG_IFG_IPG1_SHIFT) & IPG_IFG_IPG1_MASK) | 1712 1.1 cegger ((IPG_IFG_MIFG_DEFAULT << IPG_IFG_MIFG_SHIFT) & IPG_IFG_MIFG_MASK) | 1713 1.1 cegger ((IPG_IFG_IPGT_DEFAULT << IPG_IFG_IPGT_SHIFT) & IPG_IFG_IPGT_MASK)); 1714 1.1 cegger 1715 1.1 cegger /* Set parameters for half-duplex media. */ 1716 1.1 cegger CSR_WRITE_4(sc, AGE_HDPX_CFG, 1717 1.1 cegger ((HDPX_CFG_LCOL_DEFAULT << HDPX_CFG_LCOL_SHIFT) & 1718 1.1 cegger HDPX_CFG_LCOL_MASK) | 1719 1.1 cegger ((HDPX_CFG_RETRY_DEFAULT << HDPX_CFG_RETRY_SHIFT) & 1720 1.1 cegger HDPX_CFG_RETRY_MASK) | HDPX_CFG_EXC_DEF_EN | 1721 1.1 cegger ((HDPX_CFG_ABEBT_DEFAULT << HDPX_CFG_ABEBT_SHIFT) & 1722 1.1 cegger HDPX_CFG_ABEBT_MASK) | 1723 1.1 cegger ((HDPX_CFG_JAMIPG_DEFAULT << HDPX_CFG_JAMIPG_SHIFT) & 1724 1.1 cegger HDPX_CFG_JAMIPG_MASK)); 1725 1.1 cegger 1726 1.1 cegger /* Configure interrupt moderation timer. */ 1727 1.1 cegger sc->age_int_mod = AGE_IM_TIMER_DEFAULT; 1728 1.1 cegger CSR_WRITE_2(sc, AGE_IM_TIMER, AGE_USECS(sc->age_int_mod)); 1729 1.1 cegger reg = CSR_READ_4(sc, AGE_MASTER_CFG); 1730 1.1 cegger reg &= ~MASTER_MTIMER_ENB; 1731 1.1 cegger if (AGE_USECS(sc->age_int_mod) == 0) 1732 1.1 cegger reg &= ~MASTER_ITIMER_ENB; 1733 1.1 cegger else 1734 1.1 cegger reg |= MASTER_ITIMER_ENB; 1735 1.1 cegger CSR_WRITE_4(sc, AGE_MASTER_CFG, reg); 1736 1.1 cegger if (agedebug) 1737 1.42 christos printf("%s: interrupt moderation is %d us.\n", 1738 1.1 cegger device_xname(sc->sc_dev), sc->age_int_mod); 1739 1.1 cegger CSR_WRITE_2(sc, AGE_INTR_CLR_TIMER, AGE_USECS(1000)); 1740 1.1 cegger 1741 1.1 cegger /* Set Maximum frame size but don't let MTU be lass than ETHER_MTU. */ 1742 1.1 cegger if (ifp->if_mtu < ETHERMTU) 1743 1.1 cegger sc->age_max_frame_size = ETHERMTU; 1744 1.1 cegger else 1745 1.1 cegger sc->age_max_frame_size = ifp->if_mtu; 1746 1.1 cegger sc->age_max_frame_size += ETHER_HDR_LEN + 1747 1.1 cegger sizeof(struct ether_vlan_header) + ETHER_CRC_LEN; 1748 1.1 cegger CSR_WRITE_4(sc, AGE_FRAME_SIZE, sc->age_max_frame_size); 1749 1.1 cegger 1750 1.1 cegger /* Configure jumbo frame. */ 1751 1.1 cegger fsize = roundup(sc->age_max_frame_size, sizeof(uint64_t)); 1752 1.1 cegger CSR_WRITE_4(sc, AGE_RXQ_JUMBO_CFG, 1753 1.1 cegger (((fsize / sizeof(uint64_t)) << 1754 1.1 cegger RXQ_JUMBO_CFG_SZ_THRESH_SHIFT) & RXQ_JUMBO_CFG_SZ_THRESH_MASK) | 1755 1.1 cegger ((RXQ_JUMBO_CFG_LKAH_DEFAULT << 1756 1.1 cegger RXQ_JUMBO_CFG_LKAH_SHIFT) & RXQ_JUMBO_CFG_LKAH_MASK) | 1757 1.1 cegger ((AGE_USECS(8) << RXQ_JUMBO_CFG_RRD_TIMER_SHIFT) & 1758 1.1 cegger RXQ_JUMBO_CFG_RRD_TIMER_MASK)); 1759 1.1 cegger 1760 1.1 cegger /* Configure flow-control parameters. From Linux. */ 1761 1.1 cegger if ((sc->age_flags & AGE_FLAG_PCIE) != 0) { 1762 1.1 cegger /* 1763 1.1 cegger * Magic workaround for old-L1. 1764 1.1 cegger * Don't know which hw revision requires this magic. 1765 1.1 cegger */ 1766 1.1 cegger CSR_WRITE_4(sc, 0x12FC, 0x6500); 1767 1.1 cegger /* 1768 1.1 cegger * Another magic workaround for flow-control mode 1769 1.1 cegger * change. From Linux. 1770 1.1 cegger */ 1771 1.1 cegger CSR_WRITE_4(sc, 0x1008, CSR_READ_4(sc, 0x1008) | 0x8000); 1772 1.1 cegger } 1773 1.1 cegger /* 1774 1.1 cegger * TODO 1775 1.1 cegger * Should understand pause parameter relationships between FIFO 1776 1.1 cegger * size and number of Rx descriptors and Rx return descriptors. 1777 1.1 cegger * 1778 1.1 cegger * Magic parameters came from Linux. 1779 1.1 cegger */ 1780 1.1 cegger switch (sc->age_chip_rev) { 1781 1.1 cegger case 0x8001: 1782 1.1 cegger case 0x9001: 1783 1.1 cegger case 0x9002: 1784 1.1 cegger case 0x9003: 1785 1.1 cegger rxf_hi = AGE_RX_RING_CNT / 16; 1786 1.1 cegger rxf_lo = (AGE_RX_RING_CNT * 7) / 8; 1787 1.1 cegger rrd_hi = (AGE_RR_RING_CNT * 7) / 8; 1788 1.1 cegger rrd_lo = AGE_RR_RING_CNT / 16; 1789 1.1 cegger break; 1790 1.1 cegger default: 1791 1.1 cegger reg = CSR_READ_4(sc, AGE_SRAM_RX_FIFO_LEN); 1792 1.1 cegger rxf_lo = reg / 16; 1793 1.1 cegger if (rxf_lo < 192) 1794 1.1 cegger rxf_lo = 192; 1795 1.1 cegger rxf_hi = (reg * 7) / 8; 1796 1.1 cegger if (rxf_hi < rxf_lo) 1797 1.1 cegger rxf_hi = rxf_lo + 16; 1798 1.1 cegger reg = CSR_READ_4(sc, AGE_SRAM_RRD_LEN); 1799 1.1 cegger rrd_lo = reg / 8; 1800 1.1 cegger rrd_hi = (reg * 7) / 8; 1801 1.1 cegger if (rrd_lo < 2) 1802 1.1 cegger rrd_lo = 2; 1803 1.1 cegger if (rrd_hi < rrd_lo) 1804 1.1 cegger rrd_hi = rrd_lo + 3; 1805 1.1 cegger break; 1806 1.1 cegger } 1807 1.1 cegger CSR_WRITE_4(sc, AGE_RXQ_FIFO_PAUSE_THRESH, 1808 1.1 cegger ((rxf_lo << RXQ_FIFO_PAUSE_THRESH_LO_SHIFT) & 1809 1.1 cegger RXQ_FIFO_PAUSE_THRESH_LO_MASK) | 1810 1.1 cegger ((rxf_hi << RXQ_FIFO_PAUSE_THRESH_HI_SHIFT) & 1811 1.1 cegger RXQ_FIFO_PAUSE_THRESH_HI_MASK)); 1812 1.1 cegger CSR_WRITE_4(sc, AGE_RXQ_RRD_PAUSE_THRESH, 1813 1.1 cegger ((rrd_lo << RXQ_RRD_PAUSE_THRESH_LO_SHIFT) & 1814 1.1 cegger RXQ_RRD_PAUSE_THRESH_LO_MASK) | 1815 1.1 cegger ((rrd_hi << RXQ_RRD_PAUSE_THRESH_HI_SHIFT) & 1816 1.1 cegger RXQ_RRD_PAUSE_THRESH_HI_MASK)); 1817 1.1 cegger 1818 1.1 cegger /* Configure RxQ. */ 1819 1.1 cegger CSR_WRITE_4(sc, AGE_RXQ_CFG, 1820 1.1 cegger ((RXQ_CFG_RD_BURST_DEFAULT << RXQ_CFG_RD_BURST_SHIFT) & 1821 1.1 cegger RXQ_CFG_RD_BURST_MASK) | 1822 1.1 cegger ((RXQ_CFG_RRD_BURST_THRESH_DEFAULT << 1823 1.1 cegger RXQ_CFG_RRD_BURST_THRESH_SHIFT) & RXQ_CFG_RRD_BURST_THRESH_MASK) | 1824 1.1 cegger ((RXQ_CFG_RD_PREF_MIN_IPG_DEFAULT << 1825 1.1 cegger RXQ_CFG_RD_PREF_MIN_IPG_SHIFT) & RXQ_CFG_RD_PREF_MIN_IPG_MASK) | 1826 1.1 cegger RXQ_CFG_CUT_THROUGH_ENB | RXQ_CFG_ENB); 1827 1.1 cegger 1828 1.1 cegger /* Configure TxQ. */ 1829 1.1 cegger CSR_WRITE_4(sc, AGE_TXQ_CFG, 1830 1.1 cegger ((TXQ_CFG_TPD_BURST_DEFAULT << TXQ_CFG_TPD_BURST_SHIFT) & 1831 1.1 cegger TXQ_CFG_TPD_BURST_MASK) | 1832 1.1 cegger ((TXQ_CFG_TX_FIFO_BURST_DEFAULT << TXQ_CFG_TX_FIFO_BURST_SHIFT) & 1833 1.1 cegger TXQ_CFG_TX_FIFO_BURST_MASK) | 1834 1.1 cegger ((TXQ_CFG_TPD_FETCH_DEFAULT << 1835 1.1 cegger TXQ_CFG_TPD_FETCH_THRESH_SHIFT) & TXQ_CFG_TPD_FETCH_THRESH_MASK) | 1836 1.1 cegger TXQ_CFG_ENB); 1837 1.1 cegger 1838 1.1 cegger /* Configure DMA parameters. */ 1839 1.1 cegger CSR_WRITE_4(sc, AGE_DMA_CFG, 1840 1.1 cegger DMA_CFG_ENH_ORDER | DMA_CFG_RCB_64 | 1841 1.1 cegger sc->age_dma_rd_burst | DMA_CFG_RD_ENB | 1842 1.1 cegger sc->age_dma_wr_burst | DMA_CFG_WR_ENB); 1843 1.1 cegger 1844 1.1 cegger /* Configure CMB DMA write threshold. */ 1845 1.1 cegger CSR_WRITE_4(sc, AGE_CMB_WR_THRESH, 1846 1.1 cegger ((CMB_WR_THRESH_RRD_DEFAULT << CMB_WR_THRESH_RRD_SHIFT) & 1847 1.1 cegger CMB_WR_THRESH_RRD_MASK) | 1848 1.1 cegger ((CMB_WR_THRESH_TPD_DEFAULT << CMB_WR_THRESH_TPD_SHIFT) & 1849 1.1 cegger CMB_WR_THRESH_TPD_MASK)); 1850 1.1 cegger 1851 1.1 cegger /* Set CMB/SMB timer and enable them. */ 1852 1.1 cegger CSR_WRITE_4(sc, AGE_CMB_WR_TIMER, 1853 1.1 cegger ((AGE_USECS(2) << CMB_WR_TIMER_TX_SHIFT) & CMB_WR_TIMER_TX_MASK) | 1854 1.1 cegger ((AGE_USECS(2) << CMB_WR_TIMER_RX_SHIFT) & CMB_WR_TIMER_RX_MASK)); 1855 1.1 cegger 1856 1.1 cegger /* Request SMB updates for every seconds. */ 1857 1.1 cegger CSR_WRITE_4(sc, AGE_SMB_TIMER, AGE_USECS(1000 * 1000)); 1858 1.1 cegger CSR_WRITE_4(sc, AGE_CSMB_CTRL, CSMB_CTRL_SMB_ENB | CSMB_CTRL_CMB_ENB); 1859 1.1 cegger 1860 1.1 cegger /* 1861 1.1 cegger * Disable all WOL bits as WOL can interfere normal Rx 1862 1.1 cegger * operation. 1863 1.1 cegger */ 1864 1.1 cegger CSR_WRITE_4(sc, AGE_WOL_CFG, 0); 1865 1.1 cegger 1866 1.58 msaitoh /* 1867 1.1 cegger * Configure Tx/Rx MACs. 1868 1.1 cegger * - Auto-padding for short frames. 1869 1.1 cegger * - Enable CRC generation. 1870 1.1 cegger * Start with full-duplex/1000Mbps media. Actual reconfiguration 1871 1.1 cegger * of MAC is followed after link establishment. 1872 1.1 cegger */ 1873 1.1 cegger CSR_WRITE_4(sc, AGE_MAC_CFG, 1874 1.1 cegger MAC_CFG_TX_CRC_ENB | MAC_CFG_TX_AUTO_PAD | 1875 1.1 cegger MAC_CFG_FULL_DUPLEX | MAC_CFG_SPEED_1000 | 1876 1.1 cegger ((MAC_CFG_PREAMBLE_DEFAULT << MAC_CFG_PREAMBLE_SHIFT) & 1877 1.1 cegger MAC_CFG_PREAMBLE_MASK)); 1878 1.1 cegger 1879 1.1 cegger /* Set up the receive filter. */ 1880 1.1 cegger age_rxfilter(sc); 1881 1.1 cegger age_rxvlan(sc); 1882 1.1 cegger 1883 1.1 cegger reg = CSR_READ_4(sc, AGE_MAC_CFG); 1884 1.1 cegger reg |= MAC_CFG_RXCSUM_ENB; 1885 1.1 cegger 1886 1.1 cegger /* Ack all pending interrupts and clear it. */ 1887 1.1 cegger CSR_WRITE_4(sc, AGE_INTR_STATUS, 0); 1888 1.1 cegger CSR_WRITE_4(sc, AGE_INTR_MASK, AGE_INTRS); 1889 1.1 cegger 1890 1.1 cegger /* Finally enable Tx/Rx MAC. */ 1891 1.1 cegger CSR_WRITE_4(sc, AGE_MAC_CFG, reg | MAC_CFG_TX_ENB | MAC_CFG_RX_ENB); 1892 1.1 cegger 1893 1.1 cegger sc->age_flags &= ~AGE_FLAG_LINK; 1894 1.1 cegger 1895 1.1 cegger /* Switch to the current media. */ 1896 1.1 cegger mii = &sc->sc_miibus; 1897 1.1 cegger mii_mediachg(mii); 1898 1.1 cegger 1899 1.1 cegger callout_schedule(&sc->sc_tick_ch, hz); 1900 1.1 cegger 1901 1.1 cegger ifp->if_flags |= IFF_RUNNING; 1902 1.1 cegger ifp->if_flags &= ~IFF_OACTIVE; 1903 1.1 cegger 1904 1.15 cegger return 0; 1905 1.1 cegger } 1906 1.1 cegger 1907 1.1 cegger static void 1908 1.18 cegger age_stop(struct ifnet *ifp, int disable) 1909 1.1 cegger { 1910 1.18 cegger struct age_softc *sc = ifp->if_softc; 1911 1.1 cegger struct age_txdesc *txd; 1912 1.1 cegger struct age_rxdesc *rxd; 1913 1.1 cegger uint32_t reg; 1914 1.1 cegger int i; 1915 1.1 cegger 1916 1.1 cegger callout_stop(&sc->sc_tick_ch); 1917 1.1 cegger 1918 1.1 cegger /* 1919 1.1 cegger * Mark the interface down and cancel the watchdog timer. 1920 1.1 cegger */ 1921 1.1 cegger ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE); 1922 1.1 cegger ifp->if_timer = 0; 1923 1.1 cegger 1924 1.1 cegger sc->age_flags &= ~AGE_FLAG_LINK; 1925 1.1 cegger 1926 1.21 cegger mii_down(&sc->sc_miibus); 1927 1.21 cegger 1928 1.1 cegger /* 1929 1.1 cegger * Disable interrupts. 1930 1.1 cegger */ 1931 1.1 cegger CSR_WRITE_4(sc, AGE_INTR_MASK, 0); 1932 1.1 cegger CSR_WRITE_4(sc, AGE_INTR_STATUS, 0xFFFFFFFF); 1933 1.1 cegger 1934 1.1 cegger /* Stop CMB/SMB updates. */ 1935 1.1 cegger CSR_WRITE_4(sc, AGE_CSMB_CTRL, 0); 1936 1.1 cegger 1937 1.1 cegger /* Stop Rx/Tx MAC. */ 1938 1.1 cegger age_stop_rxmac(sc); 1939 1.1 cegger age_stop_txmac(sc); 1940 1.1 cegger 1941 1.1 cegger /* Stop DMA. */ 1942 1.1 cegger CSR_WRITE_4(sc, AGE_DMA_CFG, 1943 1.1 cegger CSR_READ_4(sc, AGE_DMA_CFG) & ~(DMA_CFG_RD_ENB | DMA_CFG_WR_ENB)); 1944 1.1 cegger 1945 1.1 cegger /* Stop TxQ/RxQ. */ 1946 1.1 cegger CSR_WRITE_4(sc, AGE_TXQ_CFG, 1947 1.1 cegger CSR_READ_4(sc, AGE_TXQ_CFG) & ~TXQ_CFG_ENB); 1948 1.1 cegger CSR_WRITE_4(sc, AGE_RXQ_CFG, 1949 1.1 cegger CSR_READ_4(sc, AGE_RXQ_CFG) & ~RXQ_CFG_ENB); 1950 1.1 cegger for (i = AGE_RESET_TIMEOUT; i > 0; i--) { 1951 1.1 cegger if ((reg = CSR_READ_4(sc, AGE_IDLE_STATUS)) == 0) 1952 1.1 cegger break; 1953 1.1 cegger DELAY(10); 1954 1.1 cegger } 1955 1.1 cegger if (i == 0) 1956 1.1 cegger printf("%s: stopping Rx/Tx MACs timed out(0x%08x)!\n", 1957 1.1 cegger device_xname(sc->sc_dev), reg); 1958 1.1 cegger 1959 1.1 cegger /* Reclaim Rx buffers that have been processed. */ 1960 1.1 cegger if (sc->age_cdata.age_rxhead != NULL) 1961 1.1 cegger m_freem(sc->age_cdata.age_rxhead); 1962 1.1 cegger AGE_RXCHAIN_RESET(sc); 1963 1.1 cegger 1964 1.1 cegger /* 1965 1.1 cegger * Free RX and TX mbufs still in the queues. 1966 1.1 cegger */ 1967 1.1 cegger for (i = 0; i < AGE_RX_RING_CNT; i++) { 1968 1.1 cegger rxd = &sc->age_cdata.age_rxdesc[i]; 1969 1.1 cegger if (rxd->rx_m != NULL) { 1970 1.1 cegger bus_dmamap_unload(sc->sc_dmat, rxd->rx_dmamap); 1971 1.1 cegger m_freem(rxd->rx_m); 1972 1.1 cegger rxd->rx_m = NULL; 1973 1.1 cegger } 1974 1.1 cegger } 1975 1.1 cegger for (i = 0; i < AGE_TX_RING_CNT; i++) { 1976 1.1 cegger txd = &sc->age_cdata.age_txdesc[i]; 1977 1.1 cegger if (txd->tx_m != NULL) { 1978 1.1 cegger bus_dmamap_unload(sc->sc_dmat, txd->tx_dmamap); 1979 1.1 cegger m_freem(txd->tx_m); 1980 1.1 cegger txd->tx_m = NULL; 1981 1.1 cegger } 1982 1.1 cegger } 1983 1.1 cegger } 1984 1.1 cegger 1985 1.1 cegger static void 1986 1.1 cegger age_stats_update(struct age_softc *sc) 1987 1.1 cegger { 1988 1.1 cegger struct ifnet *ifp = &sc->sc_ec.ec_if; 1989 1.1 cegger struct age_stats *stat; 1990 1.1 cegger struct smb *smb; 1991 1.1 cegger 1992 1.1 cegger stat = &sc->age_stat; 1993 1.1 cegger 1994 1.1 cegger bus_dmamap_sync(sc->sc_dmat, sc->age_cdata.age_smb_block_map, 0, 1995 1.40 bouyer sc->age_cdata.age_smb_block_map->dm_mapsize, 1996 1.40 bouyer BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); 1997 1.1 cegger 1998 1.1 cegger smb = sc->age_rdata.age_smb_block; 1999 1.1 cegger if (smb->updated == 0) 2000 1.1 cegger return; 2001 1.1 cegger 2002 1.1 cegger /* Rx stats. */ 2003 1.1 cegger stat->rx_frames += smb->rx_frames; 2004 1.1 cegger stat->rx_bcast_frames += smb->rx_bcast_frames; 2005 1.1 cegger stat->rx_mcast_frames += smb->rx_mcast_frames; 2006 1.1 cegger stat->rx_pause_frames += smb->rx_pause_frames; 2007 1.1 cegger stat->rx_control_frames += smb->rx_control_frames; 2008 1.1 cegger stat->rx_crcerrs += smb->rx_crcerrs; 2009 1.1 cegger stat->rx_lenerrs += smb->rx_lenerrs; 2010 1.1 cegger stat->rx_bytes += smb->rx_bytes; 2011 1.1 cegger stat->rx_runts += smb->rx_runts; 2012 1.1 cegger stat->rx_fragments += smb->rx_fragments; 2013 1.1 cegger stat->rx_pkts_64 += smb->rx_pkts_64; 2014 1.1 cegger stat->rx_pkts_65_127 += smb->rx_pkts_65_127; 2015 1.1 cegger stat->rx_pkts_128_255 += smb->rx_pkts_128_255; 2016 1.1 cegger stat->rx_pkts_256_511 += smb->rx_pkts_256_511; 2017 1.1 cegger stat->rx_pkts_512_1023 += smb->rx_pkts_512_1023; 2018 1.1 cegger stat->rx_pkts_1024_1518 += smb->rx_pkts_1024_1518; 2019 1.1 cegger stat->rx_pkts_1519_max += smb->rx_pkts_1519_max; 2020 1.1 cegger stat->rx_pkts_truncated += smb->rx_pkts_truncated; 2021 1.1 cegger stat->rx_fifo_oflows += smb->rx_fifo_oflows; 2022 1.1 cegger stat->rx_desc_oflows += smb->rx_desc_oflows; 2023 1.1 cegger stat->rx_alignerrs += smb->rx_alignerrs; 2024 1.1 cegger stat->rx_bcast_bytes += smb->rx_bcast_bytes; 2025 1.1 cegger stat->rx_mcast_bytes += smb->rx_mcast_bytes; 2026 1.1 cegger stat->rx_pkts_filtered += smb->rx_pkts_filtered; 2027 1.1 cegger 2028 1.1 cegger /* Tx stats. */ 2029 1.1 cegger stat->tx_frames += smb->tx_frames; 2030 1.1 cegger stat->tx_bcast_frames += smb->tx_bcast_frames; 2031 1.1 cegger stat->tx_mcast_frames += smb->tx_mcast_frames; 2032 1.1 cegger stat->tx_pause_frames += smb->tx_pause_frames; 2033 1.1 cegger stat->tx_excess_defer += smb->tx_excess_defer; 2034 1.1 cegger stat->tx_control_frames += smb->tx_control_frames; 2035 1.1 cegger stat->tx_deferred += smb->tx_deferred; 2036 1.1 cegger stat->tx_bytes += smb->tx_bytes; 2037 1.1 cegger stat->tx_pkts_64 += smb->tx_pkts_64; 2038 1.1 cegger stat->tx_pkts_65_127 += smb->tx_pkts_65_127; 2039 1.1 cegger stat->tx_pkts_128_255 += smb->tx_pkts_128_255; 2040 1.1 cegger stat->tx_pkts_256_511 += smb->tx_pkts_256_511; 2041 1.1 cegger stat->tx_pkts_512_1023 += smb->tx_pkts_512_1023; 2042 1.1 cegger stat->tx_pkts_1024_1518 += smb->tx_pkts_1024_1518; 2043 1.1 cegger stat->tx_pkts_1519_max += smb->tx_pkts_1519_max; 2044 1.1 cegger stat->tx_single_colls += smb->tx_single_colls; 2045 1.1 cegger stat->tx_multi_colls += smb->tx_multi_colls; 2046 1.1 cegger stat->tx_late_colls += smb->tx_late_colls; 2047 1.1 cegger stat->tx_excess_colls += smb->tx_excess_colls; 2048 1.1 cegger stat->tx_underrun += smb->tx_underrun; 2049 1.1 cegger stat->tx_desc_underrun += smb->tx_desc_underrun; 2050 1.1 cegger stat->tx_lenerrs += smb->tx_lenerrs; 2051 1.1 cegger stat->tx_pkts_truncated += smb->tx_pkts_truncated; 2052 1.1 cegger stat->tx_bcast_bytes += smb->tx_bcast_bytes; 2053 1.1 cegger stat->tx_mcast_bytes += smb->tx_mcast_bytes; 2054 1.1 cegger 2055 1.1 cegger /* Update counters in ifnet. */ 2056 1.66 thorpej net_stat_ref_t nsr = IF_STAT_GETREF(ifp); 2057 1.1 cegger 2058 1.74 riastrad if_statadd_ref(ifp, nsr, if_opackets, smb->tx_frames); 2059 1.66 thorpej 2060 1.74 riastrad if_statadd_ref(ifp, nsr, if_collisions, 2061 1.66 thorpej smb->tx_single_colls + 2062 1.1 cegger smb->tx_multi_colls + smb->tx_late_colls + 2063 1.66 thorpej smb->tx_excess_colls * HDPX_CFG_RETRY_DEFAULT); 2064 1.1 cegger 2065 1.74 riastrad if_statadd_ref(ifp, nsr, if_oerrors, 2066 1.66 thorpej smb->tx_excess_colls + 2067 1.1 cegger smb->tx_late_colls + smb->tx_underrun + 2068 1.66 thorpej smb->tx_pkts_truncated); 2069 1.1 cegger 2070 1.74 riastrad if_statadd_ref(ifp, nsr, if_ierrors, 2071 1.66 thorpej smb->rx_crcerrs + smb->rx_lenerrs + 2072 1.1 cegger smb->rx_runts + smb->rx_pkts_truncated + 2073 1.1 cegger smb->rx_fifo_oflows + smb->rx_desc_oflows + 2074 1.66 thorpej smb->rx_alignerrs); 2075 1.66 thorpej 2076 1.66 thorpej IF_STAT_PUTREF(ifp); 2077 1.1 cegger 2078 1.1 cegger /* Update done, clear. */ 2079 1.1 cegger smb->updated = 0; 2080 1.1 cegger 2081 1.1 cegger bus_dmamap_sync(sc->sc_dmat, sc->age_cdata.age_smb_block_map, 0, 2082 1.40 bouyer sc->age_cdata.age_smb_block_map->dm_mapsize, 2083 1.40 bouyer BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 2084 1.1 cegger } 2085 1.1 cegger 2086 1.1 cegger static void 2087 1.1 cegger age_stop_txmac(struct age_softc *sc) 2088 1.1 cegger { 2089 1.1 cegger uint32_t reg; 2090 1.1 cegger int i; 2091 1.1 cegger 2092 1.1 cegger reg = CSR_READ_4(sc, AGE_MAC_CFG); 2093 1.1 cegger if ((reg & MAC_CFG_TX_ENB) != 0) { 2094 1.1 cegger reg &= ~MAC_CFG_TX_ENB; 2095 1.1 cegger CSR_WRITE_4(sc, AGE_MAC_CFG, reg); 2096 1.1 cegger } 2097 1.1 cegger /* Stop Tx DMA engine. */ 2098 1.1 cegger reg = CSR_READ_4(sc, AGE_DMA_CFG); 2099 1.1 cegger if ((reg & DMA_CFG_RD_ENB) != 0) { 2100 1.1 cegger reg &= ~DMA_CFG_RD_ENB; 2101 1.1 cegger CSR_WRITE_4(sc, AGE_DMA_CFG, reg); 2102 1.1 cegger } 2103 1.1 cegger for (i = AGE_RESET_TIMEOUT; i > 0; i--) { 2104 1.1 cegger if ((CSR_READ_4(sc, AGE_IDLE_STATUS) & 2105 1.1 cegger (IDLE_STATUS_TXMAC | IDLE_STATUS_DMARD)) == 0) 2106 1.1 cegger break; 2107 1.1 cegger DELAY(10); 2108 1.1 cegger } 2109 1.1 cegger if (i == 0) 2110 1.1 cegger printf("%s: stopping TxMAC timeout!\n", device_xname(sc->sc_dev)); 2111 1.1 cegger } 2112 1.1 cegger 2113 1.1 cegger static void 2114 1.1 cegger age_stop_rxmac(struct age_softc *sc) 2115 1.1 cegger { 2116 1.1 cegger uint32_t reg; 2117 1.1 cegger int i; 2118 1.1 cegger 2119 1.1 cegger reg = CSR_READ_4(sc, AGE_MAC_CFG); 2120 1.1 cegger if ((reg & MAC_CFG_RX_ENB) != 0) { 2121 1.1 cegger reg &= ~MAC_CFG_RX_ENB; 2122 1.1 cegger CSR_WRITE_4(sc, AGE_MAC_CFG, reg); 2123 1.1 cegger } 2124 1.1 cegger /* Stop Rx DMA engine. */ 2125 1.1 cegger reg = CSR_READ_4(sc, AGE_DMA_CFG); 2126 1.1 cegger if ((reg & DMA_CFG_WR_ENB) != 0) { 2127 1.1 cegger reg &= ~DMA_CFG_WR_ENB; 2128 1.1 cegger CSR_WRITE_4(sc, AGE_DMA_CFG, reg); 2129 1.1 cegger } 2130 1.1 cegger for (i = AGE_RESET_TIMEOUT; i > 0; i--) { 2131 1.1 cegger if ((CSR_READ_4(sc, AGE_IDLE_STATUS) & 2132 1.1 cegger (IDLE_STATUS_RXMAC | IDLE_STATUS_DMAWR)) == 0) 2133 1.1 cegger break; 2134 1.1 cegger DELAY(10); 2135 1.1 cegger } 2136 1.1 cegger if (i == 0) 2137 1.1 cegger printf("%s: stopping RxMAC timeout!\n", device_xname(sc->sc_dev)); 2138 1.1 cegger } 2139 1.1 cegger 2140 1.1 cegger static void 2141 1.1 cegger age_init_tx_ring(struct age_softc *sc) 2142 1.1 cegger { 2143 1.1 cegger struct age_ring_data *rd; 2144 1.1 cegger struct age_txdesc *txd; 2145 1.1 cegger int i; 2146 1.1 cegger 2147 1.1 cegger sc->age_cdata.age_tx_prod = 0; 2148 1.1 cegger sc->age_cdata.age_tx_cons = 0; 2149 1.1 cegger sc->age_cdata.age_tx_cnt = 0; 2150 1.1 cegger 2151 1.1 cegger rd = &sc->age_rdata; 2152 1.1 cegger memset(rd->age_tx_ring, 0, AGE_TX_RING_SZ); 2153 1.1 cegger for (i = 0; i < AGE_TX_RING_CNT; i++) { 2154 1.1 cegger txd = &sc->age_cdata.age_txdesc[i]; 2155 1.1 cegger txd->tx_desc = &rd->age_tx_ring[i]; 2156 1.1 cegger txd->tx_m = NULL; 2157 1.1 cegger } 2158 1.1 cegger bus_dmamap_sync(sc->sc_dmat, sc->age_cdata.age_tx_ring_map, 0, 2159 1.1 cegger sc->age_cdata.age_tx_ring_map->dm_mapsize, BUS_DMASYNC_PREWRITE); 2160 1.1 cegger } 2161 1.1 cegger 2162 1.1 cegger static int 2163 1.1 cegger age_init_rx_ring(struct age_softc *sc) 2164 1.1 cegger { 2165 1.1 cegger struct age_ring_data *rd; 2166 1.1 cegger struct age_rxdesc *rxd; 2167 1.1 cegger int i; 2168 1.1 cegger 2169 1.1 cegger sc->age_cdata.age_rx_cons = AGE_RX_RING_CNT - 1; 2170 1.1 cegger rd = &sc->age_rdata; 2171 1.1 cegger memset(rd->age_rx_ring, 0, AGE_RX_RING_SZ); 2172 1.1 cegger for (i = 0; i < AGE_RX_RING_CNT; i++) { 2173 1.1 cegger rxd = &sc->age_cdata.age_rxdesc[i]; 2174 1.1 cegger rxd->rx_m = NULL; 2175 1.1 cegger rxd->rx_desc = &rd->age_rx_ring[i]; 2176 1.1 cegger if (age_newbuf(sc, rxd, 1) != 0) 2177 1.15 cegger return ENOBUFS; 2178 1.1 cegger } 2179 1.1 cegger 2180 1.1 cegger bus_dmamap_sync(sc->sc_dmat, sc->age_cdata.age_rx_ring_map, 0, 2181 1.1 cegger sc->age_cdata.age_rx_ring_map->dm_mapsize, BUS_DMASYNC_PREWRITE); 2182 1.1 cegger 2183 1.15 cegger return 0; 2184 1.1 cegger } 2185 1.1 cegger 2186 1.1 cegger static void 2187 1.1 cegger age_init_rr_ring(struct age_softc *sc) 2188 1.1 cegger { 2189 1.1 cegger struct age_ring_data *rd; 2190 1.1 cegger 2191 1.1 cegger sc->age_cdata.age_rr_cons = 0; 2192 1.1 cegger AGE_RXCHAIN_RESET(sc); 2193 1.1 cegger 2194 1.1 cegger rd = &sc->age_rdata; 2195 1.1 cegger memset(rd->age_rr_ring, 0, AGE_RR_RING_SZ); 2196 1.1 cegger bus_dmamap_sync(sc->sc_dmat, sc->age_cdata.age_rr_ring_map, 0, 2197 1.1 cegger sc->age_cdata.age_rr_ring_map->dm_mapsize, BUS_DMASYNC_PREWRITE); 2198 1.1 cegger } 2199 1.1 cegger 2200 1.1 cegger static void 2201 1.1 cegger age_init_cmb_block(struct age_softc *sc) 2202 1.1 cegger { 2203 1.1 cegger struct age_ring_data *rd; 2204 1.1 cegger 2205 1.1 cegger rd = &sc->age_rdata; 2206 1.1 cegger memset(rd->age_cmb_block, 0, AGE_CMB_BLOCK_SZ); 2207 1.1 cegger bus_dmamap_sync(sc->sc_dmat, sc->age_cdata.age_cmb_block_map, 0, 2208 1.40 bouyer sc->age_cdata.age_cmb_block_map->dm_mapsize, 2209 1.57 msaitoh BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 2210 1.1 cegger } 2211 1.1 cegger 2212 1.1 cegger static void 2213 1.1 cegger age_init_smb_block(struct age_softc *sc) 2214 1.1 cegger { 2215 1.1 cegger struct age_ring_data *rd; 2216 1.1 cegger 2217 1.1 cegger rd = &sc->age_rdata; 2218 1.1 cegger memset(rd->age_smb_block, 0, AGE_SMB_BLOCK_SZ); 2219 1.1 cegger bus_dmamap_sync(sc->sc_dmat, sc->age_cdata.age_smb_block_map, 0, 2220 1.1 cegger sc->age_cdata.age_smb_block_map->dm_mapsize, BUS_DMASYNC_PREWRITE); 2221 1.1 cegger } 2222 1.1 cegger 2223 1.1 cegger static int 2224 1.1 cegger age_newbuf(struct age_softc *sc, struct age_rxdesc *rxd, int init) 2225 1.1 cegger { 2226 1.1 cegger struct rx_desc *desc; 2227 1.1 cegger struct mbuf *m; 2228 1.1 cegger bus_dmamap_t map; 2229 1.1 cegger int error; 2230 1.1 cegger 2231 1.40 bouyer MGETHDR(m, M_DONTWAIT, MT_DATA); 2232 1.1 cegger if (m == NULL) 2233 1.15 cegger return ENOBUFS; 2234 1.40 bouyer MCLGET(m, M_DONTWAIT); 2235 1.1 cegger if (!(m->m_flags & M_EXT)) { 2236 1.1 cegger m_freem(m); 2237 1.15 cegger return ENOBUFS; 2238 1.1 cegger } 2239 1.1 cegger 2240 1.1 cegger m->m_len = m->m_pkthdr.len = MCLBYTES; 2241 1.9 cegger m_adj(m, ETHER_ALIGN); 2242 1.1 cegger 2243 1.1 cegger error = bus_dmamap_load_mbuf(sc->sc_dmat, 2244 1.1 cegger sc->age_cdata.age_rx_sparemap, m, BUS_DMA_NOWAIT); 2245 1.1 cegger 2246 1.1 cegger if (error != 0) { 2247 1.1 cegger m_freem(m); 2248 1.1 cegger 2249 1.1 cegger if (init) 2250 1.1 cegger printf("%s: can't load RX mbuf\n", device_xname(sc->sc_dev)); 2251 1.15 cegger return error; 2252 1.1 cegger } 2253 1.1 cegger 2254 1.1 cegger if (rxd->rx_m != NULL) { 2255 1.1 cegger bus_dmamap_sync(sc->sc_dmat, rxd->rx_dmamap, 0, 2256 1.1 cegger rxd->rx_dmamap->dm_mapsize, BUS_DMASYNC_POSTREAD); 2257 1.1 cegger bus_dmamap_unload(sc->sc_dmat, rxd->rx_dmamap); 2258 1.1 cegger } 2259 1.1 cegger map = rxd->rx_dmamap; 2260 1.1 cegger rxd->rx_dmamap = sc->age_cdata.age_rx_sparemap; 2261 1.1 cegger sc->age_cdata.age_rx_sparemap = map; 2262 1.1 cegger rxd->rx_m = m; 2263 1.1 cegger 2264 1.1 cegger desc = rxd->rx_desc; 2265 1.1 cegger desc->addr = htole64(rxd->rx_dmamap->dm_segs[0].ds_addr); 2266 1.42 christos desc->len = 2267 1.1 cegger htole32((rxd->rx_dmamap->dm_segs[0].ds_len & AGE_RD_LEN_MASK) << 2268 1.1 cegger AGE_RD_LEN_SHIFT); 2269 1.1 cegger 2270 1.15 cegger return 0; 2271 1.1 cegger } 2272 1.1 cegger 2273 1.1 cegger static void 2274 1.1 cegger age_rxvlan(struct age_softc *sc) 2275 1.1 cegger { 2276 1.1 cegger uint32_t reg; 2277 1.1 cegger 2278 1.1 cegger reg = CSR_READ_4(sc, AGE_MAC_CFG); 2279 1.1 cegger reg &= ~MAC_CFG_VLAN_TAG_STRIP; 2280 1.39 cegger if (sc->sc_ec.ec_capenable & ETHERCAP_VLAN_HWTAGGING) 2281 1.1 cegger reg |= MAC_CFG_VLAN_TAG_STRIP; 2282 1.1 cegger CSR_WRITE_4(sc, AGE_MAC_CFG, reg); 2283 1.1 cegger } 2284 1.1 cegger 2285 1.1 cegger static void 2286 1.1 cegger age_rxfilter(struct age_softc *sc) 2287 1.1 cegger { 2288 1.1 cegger struct ethercom *ec = &sc->sc_ec; 2289 1.1 cegger struct ifnet *ifp = &sc->sc_ec.ec_if; 2290 1.1 cegger struct ether_multi *enm; 2291 1.1 cegger struct ether_multistep step; 2292 1.1 cegger uint32_t crc; 2293 1.1 cegger uint32_t mchash[2]; 2294 1.1 cegger uint32_t rxcfg; 2295 1.1 cegger 2296 1.1 cegger rxcfg = CSR_READ_4(sc, AGE_MAC_CFG); 2297 1.1 cegger rxcfg &= ~(MAC_CFG_ALLMULTI | MAC_CFG_BCAST | MAC_CFG_PROMISC); 2298 1.24 cegger ifp->if_flags &= ~IFF_ALLMULTI; 2299 1.1 cegger 2300 1.24 cegger /* 2301 1.24 cegger * Always accept broadcast frames. 2302 1.24 cegger */ 2303 1.24 cegger rxcfg |= MAC_CFG_BCAST; 2304 1.42 christos 2305 1.64 msaitoh /* Program new filter. */ 2306 1.64 msaitoh if ((ifp->if_flags & IFF_PROMISC) != 0) 2307 1.64 msaitoh goto update; 2308 1.64 msaitoh 2309 1.64 msaitoh memset(mchash, 0, sizeof(mchash)); 2310 1.64 msaitoh 2311 1.64 msaitoh ETHER_LOCK(ec); 2312 1.64 msaitoh ETHER_FIRST_MULTI(step, ec, enm); 2313 1.64 msaitoh while (enm != NULL) { 2314 1.64 msaitoh if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) { 2315 1.64 msaitoh /* XXX Use ETHER_F_ALLMULTI in future. */ 2316 1.64 msaitoh ifp->if_flags |= IFF_ALLMULTI; 2317 1.64 msaitoh ETHER_UNLOCK(ec); 2318 1.64 msaitoh goto update; 2319 1.64 msaitoh } 2320 1.64 msaitoh crc = ether_crc32_be(enm->enm_addrlo, ETHER_ADDR_LEN); 2321 1.65 msaitoh mchash[crc >> 31] |= 1U << ((crc >> 26) & 0x1f); 2322 1.64 msaitoh ETHER_NEXT_MULTI(step, enm); 2323 1.64 msaitoh } 2324 1.64 msaitoh ETHER_UNLOCK(ec); 2325 1.64 msaitoh 2326 1.64 msaitoh update: 2327 1.64 msaitoh if ((ifp->if_flags & (IFF_PROMISC | IFF_ALLMULTI)) != 0) { 2328 1.64 msaitoh if (ifp->if_flags & IFF_PROMISC) { 2329 1.1 cegger rxcfg |= MAC_CFG_PROMISC; 2330 1.64 msaitoh /* XXX Use ETHER_F_ALLMULTI in future. */ 2331 1.64 msaitoh ifp->if_flags |= IFF_ALLMULTI; 2332 1.64 msaitoh } else 2333 1.1 cegger rxcfg |= MAC_CFG_ALLMULTI; 2334 1.24 cegger mchash[0] = mchash[1] = 0xFFFFFFFF; 2335 1.1 cegger } 2336 1.1 cegger CSR_WRITE_4(sc, AGE_MAR0, mchash[0]); 2337 1.1 cegger CSR_WRITE_4(sc, AGE_MAR1, mchash[1]); 2338 1.1 cegger CSR_WRITE_4(sc, AGE_MAC_CFG, rxcfg); 2339 1.1 cegger } 2340