1 /*- 2 * SPDX-License-Identifier: BSD-2-Clause 3 * 4 * Copyright (c) 2019 The FreeBSD Foundation, Inc. 5 * 6 * This driver was written by Gerald ND Aryeetey <gndaryee@uwaterloo.ca> 7 * under sponsorship from the FreeBSD Foundation. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24 * OR SERVICES; LOSS OF USE DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28 * SUCH DAMAGE. 29 */ 30 #include <sys/cdefs.h> 31 __FBSDID("$FreeBSD$"); 32 33 /* 34 * Microchip LAN7430/LAN7431 PCIe to Gigabit Ethernet Controller driver. 35 * 36 * Product information: 37 * LAN7430 https://www.microchip.com/en-us/product/LAN7430 38 * - Integrated IEEE 802.3 compliant PHY 39 * LAN7431 https://www.microchip.com/en-us/product/LAN7431 40 * - RGMII Interface 41 * 42 * This driver uses the iflib interface and the default 'ukphy' PHY driver. 43 * 44 * UNIMPLEMENTED FEATURES 45 * ---------------------- 46 * A number of features supported by LAN743X device are not yet implemented in 47 * this driver: 48 * 49 * - Multiple (up to 4) RX queues support 50 * - Just needs to remove asserts and malloc multiple `rx_ring_data` 51 * structs based on ncpus. 52 * - RX/TX Checksum Offloading support 53 * - VLAN support 54 * - Receive Packet Filtering (Multicast Perfect/Hash Address) support 55 * - Wake on LAN (WoL) support 56 * - TX LSO support 57 * - Receive Side Scaling (RSS) support 58 * - Debugging Capabilities: 59 * - Could include MAC statistics and 60 * error status registers in sysctl. 61 */ 62 63 #include <sys/param.h> 64 #include <sys/bus.h> 65 #include <sys/endian.h> 66 #include <sys/kdb.h> 67 #include <sys/kernel.h> 68 #include <sys/module.h> 69 #include <sys/rman.h> 70 #include <sys/socket.h> 71 #include <sys/sockio.h> 72 #include <machine/bus.h> 73 #include <machine/resource.h> 74 75 #include <net/ethernet.h> 76 #include <net/if.h> 77 #include <net/if_var.h> 78 #include <net/if_types.h> 79 #include <net/if_media.h> 80 #include <net/iflib.h> 81 82 #include <dev/mgb/if_mgb.h> 83 #include <dev/mii/mii.h> 84 #include <dev/mii/miivar.h> 85 #include <dev/pci/pcireg.h> 86 #include <dev/pci/pcivar.h> 87 88 #include "ifdi_if.h" 89 #include "miibus_if.h" 90 91 static pci_vendor_info_t mgb_vendor_info_array[] = { 92 PVID(MGB_MICROCHIP_VENDOR_ID, MGB_LAN7430_DEVICE_ID, 93 "Microchip LAN7430 PCIe Gigabit Ethernet Controller"), 94 PVID(MGB_MICROCHIP_VENDOR_ID, MGB_LAN7431_DEVICE_ID, 95 "Microchip LAN7431 PCIe Gigabit Ethernet Controller"), 96 PVID_END 97 }; 98 99 /* Device methods */ 100 static device_register_t mgb_register; 101 102 /* IFLIB methods */ 103 static ifdi_attach_pre_t mgb_attach_pre; 104 static ifdi_attach_post_t mgb_attach_post; 105 static ifdi_detach_t mgb_detach; 106 107 static ifdi_tx_queues_alloc_t mgb_tx_queues_alloc; 108 static ifdi_rx_queues_alloc_t mgb_rx_queues_alloc; 109 static ifdi_queues_free_t mgb_queues_free; 110 111 static ifdi_init_t mgb_init; 112 static ifdi_stop_t mgb_stop; 113 114 static ifdi_msix_intr_assign_t mgb_msix_intr_assign; 115 static ifdi_tx_queue_intr_enable_t mgb_tx_queue_intr_enable; 116 static ifdi_rx_queue_intr_enable_t mgb_rx_queue_intr_enable; 117 static ifdi_intr_enable_t mgb_intr_enable_all; 118 static ifdi_intr_disable_t mgb_intr_disable_all; 119 120 /* IFLIB_TXRX methods */ 121 static int mgb_isc_txd_encap(void *, 122 if_pkt_info_t); 123 static void mgb_isc_txd_flush(void *, 124 uint16_t, qidx_t); 125 static int mgb_isc_txd_credits_update(void *, 126 uint16_t, bool); 127 static int mgb_isc_rxd_available(void *, 128 uint16_t, qidx_t, qidx_t); 129 static int mgb_isc_rxd_pkt_get(void *, 130 if_rxd_info_t); 131 static void mgb_isc_rxd_refill(void *, 132 if_rxd_update_t); 133 static void mgb_isc_rxd_flush(void *, 134 uint16_t, uint8_t, qidx_t); 135 136 /* Interrupts */ 137 static driver_filter_t mgb_legacy_intr; 138 static driver_filter_t mgb_admin_intr; 139 static driver_filter_t mgb_rxq_intr; 140 static bool mgb_intr_test(struct mgb_softc *); 141 142 /* MII methods */ 143 static miibus_readreg_t mgb_miibus_readreg; 144 static miibus_writereg_t mgb_miibus_writereg; 145 static miibus_linkchg_t mgb_miibus_linkchg; 146 static miibus_statchg_t mgb_miibus_statchg; 147 148 static int mgb_media_change(if_t); 149 static void mgb_media_status(if_t, 150 struct ifmediareq *); 151 152 /* Helper/Test functions */ 153 static int mgb_test_bar(struct mgb_softc *); 154 static int mgb_alloc_regs(struct mgb_softc *); 155 static int mgb_release_regs(struct mgb_softc *); 156 157 static void mgb_get_ethaddr(struct mgb_softc *, 158 struct ether_addr *); 159 160 static int mgb_wait_for_bits(struct mgb_softc *, 161 int, int, int); 162 163 /* H/W init, reset and teardown helpers */ 164 static int mgb_hw_init(struct mgb_softc *); 165 static int mgb_hw_teardown(struct mgb_softc *); 166 static int mgb_hw_reset(struct mgb_softc *); 167 static int mgb_mac_init(struct mgb_softc *); 168 static int mgb_dmac_reset(struct mgb_softc *); 169 static int mgb_phy_reset(struct mgb_softc *); 170 171 static int mgb_dma_init(struct mgb_softc *); 172 static int mgb_dma_tx_ring_init(struct mgb_softc *, 173 int); 174 static int mgb_dma_rx_ring_init(struct mgb_softc *, 175 int); 176 177 static int mgb_dmac_control(struct mgb_softc *, 178 int, int, enum mgb_dmac_cmd); 179 static int mgb_fct_control(struct mgb_softc *, 180 int, int, enum mgb_fct_cmd); 181 182 /********************************************************************* 183 * FreeBSD Device Interface Entry Points 184 *********************************************************************/ 185 186 static device_method_t mgb_methods[] = { 187 /* Device interface */ 188 DEVMETHOD(device_register, mgb_register), 189 DEVMETHOD(device_probe, iflib_device_probe), 190 DEVMETHOD(device_attach, iflib_device_attach), 191 DEVMETHOD(device_detach, iflib_device_detach), 192 DEVMETHOD(device_shutdown, iflib_device_shutdown), 193 DEVMETHOD(device_suspend, iflib_device_suspend), 194 DEVMETHOD(device_resume, iflib_device_resume), 195 196 /* MII Interface */ 197 DEVMETHOD(miibus_readreg, mgb_miibus_readreg), 198 DEVMETHOD(miibus_writereg, mgb_miibus_writereg), 199 DEVMETHOD(miibus_linkchg, mgb_miibus_linkchg), 200 DEVMETHOD(miibus_statchg, mgb_miibus_statchg), 201 202 DEVMETHOD_END 203 }; 204 205 static driver_t mgb_driver = { 206 "mgb", mgb_methods, sizeof(struct mgb_softc) 207 }; 208 209 static devclass_t mgb_devclass; 210 DRIVER_MODULE(mgb, pci, mgb_driver, mgb_devclass, NULL, NULL); 211 IFLIB_PNP_INFO(pci, mgb, mgb_vendor_info_array); 212 MODULE_VERSION(mgb, 1); 213 214 #if 0 /* MIIBUS_DEBUG */ 215 /* If MIIBUS debug stuff is in attach then order matters. Use below instead. */ 216 DRIVER_MODULE_ORDERED(miibus, mgb, miibus_driver, miibus_devclass, NULL, NULL, 217 SI_ORDER_ANY); 218 #endif /* MIIBUS_DEBUG */ 219 DRIVER_MODULE(miibus, mgb, miibus_driver, miibus_devclass, NULL, NULL); 220 221 MODULE_DEPEND(mgb, pci, 1, 1, 1); 222 MODULE_DEPEND(mgb, ether, 1, 1, 1); 223 MODULE_DEPEND(mgb, miibus, 1, 1, 1); 224 MODULE_DEPEND(mgb, iflib, 1, 1, 1); 225 226 static device_method_t mgb_iflib_methods[] = { 227 DEVMETHOD(ifdi_attach_pre, mgb_attach_pre), 228 DEVMETHOD(ifdi_attach_post, mgb_attach_post), 229 DEVMETHOD(ifdi_detach, mgb_detach), 230 231 DEVMETHOD(ifdi_init, mgb_init), 232 DEVMETHOD(ifdi_stop, mgb_stop), 233 234 DEVMETHOD(ifdi_tx_queues_alloc, mgb_tx_queues_alloc), 235 DEVMETHOD(ifdi_rx_queues_alloc, mgb_rx_queues_alloc), 236 DEVMETHOD(ifdi_queues_free, mgb_queues_free), 237 238 DEVMETHOD(ifdi_msix_intr_assign, mgb_msix_intr_assign), 239 DEVMETHOD(ifdi_tx_queue_intr_enable, mgb_tx_queue_intr_enable), 240 DEVMETHOD(ifdi_rx_queue_intr_enable, mgb_rx_queue_intr_enable), 241 DEVMETHOD(ifdi_intr_enable, mgb_intr_enable_all), 242 DEVMETHOD(ifdi_intr_disable, mgb_intr_disable_all), 243 244 #if 0 /* Not yet implemented IFLIB methods */ 245 /* 246 * Set multicast addresses, mtu and promiscuous mode 247 */ 248 DEVMETHOD(ifdi_multi_set, mgb_multi_set), 249 DEVMETHOD(ifdi_mtu_set, mgb_mtu_set), 250 DEVMETHOD(ifdi_promisc_set, mgb_promisc_set), 251 252 /* 253 * Needed for VLAN support 254 */ 255 DEVMETHOD(ifdi_vlan_register, mgb_vlan_register), 256 DEVMETHOD(ifdi_vlan_unregister, mgb_vlan_unregister), 257 258 /* 259 * Needed for WOL support 260 * at the very least. 261 */ 262 DEVMETHOD(ifdi_shutdown, mgb_shutdown), 263 DEVMETHOD(ifdi_suspend, mgb_suspend), 264 DEVMETHOD(ifdi_resume, mgb_resume), 265 #endif /* UNUSED_IFLIB_METHODS */ 266 DEVMETHOD_END 267 }; 268 269 static driver_t mgb_iflib_driver = { 270 "mgb", mgb_iflib_methods, sizeof(struct mgb_softc) 271 }; 272 273 static struct if_txrx mgb_txrx = { 274 .ift_txd_encap = mgb_isc_txd_encap, 275 .ift_txd_flush = mgb_isc_txd_flush, 276 .ift_txd_credits_update = mgb_isc_txd_credits_update, 277 .ift_rxd_available = mgb_isc_rxd_available, 278 .ift_rxd_pkt_get = mgb_isc_rxd_pkt_get, 279 .ift_rxd_refill = mgb_isc_rxd_refill, 280 .ift_rxd_flush = mgb_isc_rxd_flush, 281 282 .ift_legacy_intr = mgb_legacy_intr 283 }; 284 285 static struct if_shared_ctx mgb_sctx_init = { 286 .isc_magic = IFLIB_MAGIC, 287 288 .isc_q_align = PAGE_SIZE, 289 .isc_admin_intrcnt = 1, 290 .isc_flags = IFLIB_DRIVER_MEDIA /* | IFLIB_HAS_RXCQ | IFLIB_HAS_TXCQ*/, 291 292 .isc_vendor_info = mgb_vendor_info_array, 293 .isc_driver_version = "1", 294 .isc_driver = &mgb_iflib_driver, 295 /* 2 queues per set for TX and RX (ring queue, head writeback queue) */ 296 .isc_ntxqs = 2, 297 298 .isc_tx_maxsize = MGB_DMA_MAXSEGS * MCLBYTES, 299 /* .isc_tx_nsegments = MGB_DMA_MAXSEGS, */ 300 .isc_tx_maxsegsize = MCLBYTES, 301 302 .isc_ntxd_min = {1, 1}, /* Will want to make this bigger */ 303 .isc_ntxd_max = {MGB_DMA_RING_SIZE, 1}, 304 .isc_ntxd_default = {MGB_DMA_RING_SIZE, 1}, 305 306 .isc_nrxqs = 2, 307 308 .isc_rx_maxsize = MCLBYTES, 309 .isc_rx_nsegments = 1, 310 .isc_rx_maxsegsize = MCLBYTES, 311 312 .isc_nrxd_min = {1, 1}, /* Will want to make this bigger */ 313 .isc_nrxd_max = {MGB_DMA_RING_SIZE, 1}, 314 .isc_nrxd_default = {MGB_DMA_RING_SIZE, 1}, 315 316 .isc_nfl = 1, /*one free list since there is only one queue */ 317 #if 0 /* UNUSED_CTX */ 318 319 .isc_tso_maxsize = MGB_TSO_MAXSIZE + sizeof(struct ether_vlan_header), 320 .isc_tso_maxsegsize = MGB_TX_MAXSEGSIZE, 321 #endif /* UNUSED_CTX */ 322 }; 323 324 /*********************************************************************/ 325 326 static void * 327 mgb_register(device_t dev) 328 { 329 330 return (&mgb_sctx_init); 331 } 332 333 static int 334 mgb_attach_pre(if_ctx_t ctx) 335 { 336 struct mgb_softc *sc; 337 if_softc_ctx_t scctx; 338 int error, phyaddr, rid; 339 struct ether_addr hwaddr; 340 struct mii_data *miid; 341 342 sc = iflib_get_softc(ctx); 343 sc->ctx = ctx; 344 sc->dev = iflib_get_dev(ctx); 345 scctx = iflib_get_softc_ctx(ctx); 346 347 /* IFLIB required setup */ 348 scctx->isc_txrx = &mgb_txrx; 349 scctx->isc_tx_nsegments = MGB_DMA_MAXSEGS; 350 /* Ring desc queues */ 351 scctx->isc_txqsizes[0] = sizeof(struct mgb_ring_desc) * 352 scctx->isc_ntxd[0]; 353 scctx->isc_rxqsizes[0] = sizeof(struct mgb_ring_desc) * 354 scctx->isc_nrxd[0]; 355 356 /* Head WB queues */ 357 scctx->isc_txqsizes[1] = sizeof(uint32_t) * scctx->isc_ntxd[1]; 358 scctx->isc_rxqsizes[1] = sizeof(uint32_t) * scctx->isc_nrxd[1]; 359 360 /* XXX: Must have 1 txqset, but can have up to 4 rxqsets */ 361 scctx->isc_nrxqsets = 1; 362 scctx->isc_ntxqsets = 1; 363 364 /* scctx->isc_tx_csum_flags = (CSUM_TCP | CSUM_UDP) | 365 (CSUM_TCP_IPV6 | CSUM_UDP_IPV6) | CSUM_TSO */ 366 scctx->isc_tx_csum_flags = 0; 367 scctx->isc_capabilities = scctx->isc_capenable = 0; 368 #if 0 369 /* 370 * CSUM, TSO and VLAN support are TBD 371 */ 372 IFCAP_TXCSUM | IFCAP_TXCSUM_IPV6 | 373 IFCAP_TSO4 | IFCAP_TSO6 | 374 IFCAP_RXCSUM | IFCAP_RXCSUM_IPV6 | 375 IFCAP_VLAN_MTU | IFCAP_VLAN_HWTAGGING | 376 IFCAP_VLAN_HWCSUM | IFCAP_VLAN_HWTSO | 377 IFCAP_JUMBO_MTU; 378 scctx->isc_capabilities |= IFCAP_LRO | IFCAP_VLAN_HWFILTER; 379 #endif 380 381 /* get the BAR */ 382 error = mgb_alloc_regs(sc); 383 if (error != 0) { 384 device_printf(sc->dev, 385 "Unable to allocate bus resource: registers.\n"); 386 goto fail; 387 } 388 389 error = mgb_test_bar(sc); 390 if (error != 0) 391 goto fail; 392 393 error = mgb_hw_init(sc); 394 if (error != 0) { 395 device_printf(sc->dev, 396 "MGB device init failed. (err: %d)\n", error); 397 goto fail; 398 } 399 400 switch (pci_get_device(sc->dev)) { 401 case MGB_LAN7430_DEVICE_ID: 402 phyaddr = 1; 403 break; 404 case MGB_LAN7431_DEVICE_ID: 405 default: 406 phyaddr = MII_PHY_ANY; 407 break; 408 } 409 410 /* XXX: Would be nice(r) if locked methods were here */ 411 error = mii_attach(sc->dev, &sc->miibus, iflib_get_ifp(ctx), 412 mgb_media_change, mgb_media_status, 413 BMSR_DEFCAPMASK, phyaddr, MII_OFFSET_ANY, MIIF_DOPAUSE); 414 if (error != 0) { 415 device_printf(sc->dev, "Failed to attach MII interface\n"); 416 goto fail; 417 } 418 419 miid = device_get_softc(sc->miibus); 420 scctx->isc_media = &miid->mii_media; 421 422 scctx->isc_msix_bar = pci_msix_table_bar(sc->dev); 423 /** Setup PBA BAR **/ 424 rid = pci_msix_pba_bar(sc->dev); 425 if (rid != scctx->isc_msix_bar) { 426 sc->pba = bus_alloc_resource_any(sc->dev, SYS_RES_MEMORY, 427 &rid, RF_ACTIVE); 428 if (sc->pba == NULL) { 429 error = ENXIO; 430 device_printf(sc->dev, "Failed to setup PBA BAR\n"); 431 goto fail; 432 } 433 } 434 435 mgb_get_ethaddr(sc, &hwaddr); 436 if (ETHER_IS_BROADCAST(hwaddr.octet) || 437 ETHER_IS_MULTICAST(hwaddr.octet) || 438 ETHER_IS_ZERO(hwaddr.octet)) 439 ether_gen_addr(iflib_get_ifp(ctx), &hwaddr); 440 441 /* 442 * XXX: if the MAC address was generated the linux driver 443 * writes it back to the device. 444 */ 445 iflib_set_mac(ctx, hwaddr.octet); 446 447 /* Map all vectors to vector 0 (admin interrupts) by default. */ 448 CSR_WRITE_REG(sc, MGB_INTR_VEC_RX_MAP, 0); 449 CSR_WRITE_REG(sc, MGB_INTR_VEC_TX_MAP, 0); 450 CSR_WRITE_REG(sc, MGB_INTR_VEC_OTHER_MAP, 0); 451 452 return (0); 453 454 fail: 455 mgb_detach(ctx); 456 return (error); 457 } 458 459 static int 460 mgb_attach_post(if_ctx_t ctx) 461 { 462 struct mgb_softc *sc; 463 464 sc = iflib_get_softc(ctx); 465 466 device_printf(sc->dev, "Interrupt test: %s\n", 467 (mgb_intr_test(sc) ? "PASS" : "FAIL")); 468 469 return (0); 470 } 471 472 static int 473 mgb_detach(if_ctx_t ctx) 474 { 475 struct mgb_softc *sc; 476 int error; 477 478 sc = iflib_get_softc(ctx); 479 480 /* XXX: Should report errors but still detach everything. */ 481 error = mgb_hw_teardown(sc); 482 483 /* Release IRQs */ 484 iflib_irq_free(ctx, &sc->rx_irq); 485 iflib_irq_free(ctx, &sc->admin_irq); 486 487 if (sc->miibus != NULL) 488 device_delete_child(sc->dev, sc->miibus); 489 490 if (sc->pba != NULL) 491 error = bus_release_resource(sc->dev, SYS_RES_MEMORY, 492 rman_get_rid(sc->pba), sc->pba); 493 sc->pba = NULL; 494 495 error = mgb_release_regs(sc); 496 497 return (error); 498 } 499 500 static int 501 mgb_media_change(if_t ifp) 502 { 503 struct mii_data *miid; 504 struct mii_softc *miisc; 505 struct mgb_softc *sc; 506 if_ctx_t ctx; 507 int needs_reset; 508 509 ctx = if_getsoftc(ifp); 510 sc = iflib_get_softc(ctx); 511 miid = device_get_softc(sc->miibus); 512 LIST_FOREACH(miisc, &miid->mii_phys, mii_list) 513 PHY_RESET(miisc); 514 515 needs_reset = mii_mediachg(miid); 516 if (needs_reset != 0) 517 ifp->if_init(ctx); 518 return (needs_reset); 519 } 520 521 static void 522 mgb_media_status(if_t ifp, struct ifmediareq *ifmr) 523 { 524 struct mgb_softc *sc; 525 struct mii_data *miid; 526 527 sc = iflib_get_softc(if_getsoftc(ifp)); 528 miid = device_get_softc(sc->miibus); 529 if ((if_getflags(ifp) & IFF_UP) == 0) 530 return; 531 532 mii_pollstat(miid); 533 ifmr->ifm_active = miid->mii_media_active; 534 ifmr->ifm_status = miid->mii_media_status; 535 } 536 537 static int 538 mgb_tx_queues_alloc(if_ctx_t ctx, caddr_t *vaddrs, uint64_t *paddrs, int ntxqs, 539 int ntxqsets) 540 { 541 struct mgb_softc *sc; 542 struct mgb_ring_data *rdata; 543 int q; 544 545 sc = iflib_get_softc(ctx); 546 KASSERT(ntxqsets == 1, ("ntxqsets = %d", ntxqsets)); 547 rdata = &sc->tx_ring_data; 548 for (q = 0; q < ntxqsets; q++) { 549 KASSERT(ntxqs == 2, ("ntxqs = %d", ntxqs)); 550 /* Ring */ 551 rdata->ring = (struct mgb_ring_desc *) vaddrs[q * ntxqs + 0]; 552 rdata->ring_bus_addr = paddrs[q * ntxqs + 0]; 553 554 /* Head WB */ 555 rdata->head_wb = (uint32_t *) vaddrs[q * ntxqs + 1]; 556 rdata->head_wb_bus_addr = paddrs[q * ntxqs + 1]; 557 } 558 return (0); 559 } 560 561 static int 562 mgb_rx_queues_alloc(if_ctx_t ctx, caddr_t *vaddrs, uint64_t *paddrs, int nrxqs, 563 int nrxqsets) 564 { 565 struct mgb_softc *sc; 566 struct mgb_ring_data *rdata; 567 int q; 568 569 sc = iflib_get_softc(ctx); 570 KASSERT(nrxqsets == 1, ("nrxqsets = %d", nrxqsets)); 571 rdata = &sc->rx_ring_data; 572 for (q = 0; q < nrxqsets; q++) { 573 KASSERT(nrxqs == 2, ("nrxqs = %d", nrxqs)); 574 /* Ring */ 575 rdata->ring = (struct mgb_ring_desc *) vaddrs[q * nrxqs + 0]; 576 rdata->ring_bus_addr = paddrs[q * nrxqs + 0]; 577 578 /* Head WB */ 579 rdata->head_wb = (uint32_t *) vaddrs[q * nrxqs + 1]; 580 rdata->head_wb_bus_addr = paddrs[q * nrxqs + 1]; 581 } 582 return (0); 583 } 584 585 static void 586 mgb_queues_free(if_ctx_t ctx) 587 { 588 struct mgb_softc *sc; 589 590 sc = iflib_get_softc(ctx); 591 592 memset(&sc->rx_ring_data, 0, sizeof(struct mgb_ring_data)); 593 memset(&sc->tx_ring_data, 0, sizeof(struct mgb_ring_data)); 594 } 595 596 static void 597 mgb_init(if_ctx_t ctx) 598 { 599 struct mgb_softc *sc; 600 struct mii_data *miid; 601 int error; 602 603 sc = iflib_get_softc(ctx); 604 miid = device_get_softc(sc->miibus); 605 device_printf(sc->dev, "running init ...\n"); 606 607 mgb_dma_init(sc); 608 609 /* XXX: Turn off perfect filtering, turn on (broad|multi|uni)cast rx */ 610 CSR_CLEAR_REG(sc, MGB_RFE_CTL, MGB_RFE_ALLOW_PERFECT_FILTER); 611 CSR_UPDATE_REG(sc, MGB_RFE_CTL, 612 MGB_RFE_ALLOW_BROADCAST | 613 MGB_RFE_ALLOW_MULTICAST | 614 MGB_RFE_ALLOW_UNICAST); 615 616 error = mii_mediachg(miid); 617 /* Not much we can do if this fails. */ 618 if (error) 619 device_printf(sc->dev, "%s: mii_mediachg returned %d", __func__, 620 error); 621 } 622 623 #ifdef DEBUG 624 static void 625 mgb_dump_some_stats(struct mgb_softc *sc) 626 { 627 int i; 628 int first_stat = 0x1200; 629 int last_stat = 0x12FC; 630 631 for (i = first_stat; i <= last_stat; i += 4) 632 if (CSR_READ_REG(sc, i) != 0) 633 device_printf(sc->dev, "0x%04x: 0x%08x\n", i, 634 CSR_READ_REG(sc, i)); 635 char *stat_names[] = { 636 "MAC_ERR_STS ", 637 "FCT_INT_STS ", 638 "DMAC_CFG ", 639 "DMAC_CMD ", 640 "DMAC_INT_STS ", 641 "DMAC_INT_EN ", 642 "DMAC_RX_ERR_STS0 ", 643 "DMAC_RX_ERR_STS1 ", 644 "DMAC_RX_ERR_STS2 ", 645 "DMAC_RX_ERR_STS3 ", 646 "INT_STS ", 647 "INT_EN ", 648 "INT_VEC_EN ", 649 "INT_VEC_MAP0 ", 650 "INT_VEC_MAP1 ", 651 "INT_VEC_MAP2 ", 652 "TX_HEAD0", 653 "TX_TAIL0", 654 "DMAC_TX_ERR_STS0 ", 655 NULL 656 }; 657 int stats[] = { 658 0x114, 659 0xA0, 660 0xC00, 661 0xC0C, 662 0xC10, 663 0xC14, 664 0xC60, 665 0xCA0, 666 0xCE0, 667 0xD20, 668 0x780, 669 0x788, 670 0x794, 671 0x7A0, 672 0x7A4, 673 0x780, 674 0xD58, 675 0xD5C, 676 0xD60, 677 0x0 678 }; 679 i = 0; 680 printf("==============================\n"); 681 while (stats[i++]) 682 device_printf(sc->dev, "%s at offset 0x%04x = 0x%08x\n", 683 stat_names[i - 1], stats[i - 1], 684 CSR_READ_REG(sc, stats[i - 1])); 685 printf("==== TX RING DESCS ====\n"); 686 for (i = 0; i < MGB_DMA_RING_SIZE; i++) 687 device_printf(sc->dev, "ring[%d].data0=0x%08x\n" 688 "ring[%d].data1=0x%08x\n" 689 "ring[%d].data2=0x%08x\n" 690 "ring[%d].data3=0x%08x\n", 691 i, sc->tx_ring_data.ring[i].ctl, 692 i, sc->tx_ring_data.ring[i].addr.low, 693 i, sc->tx_ring_data.ring[i].addr.high, 694 i, sc->tx_ring_data.ring[i].sts); 695 device_printf(sc->dev, "==== DUMP_TX_DMA_RAM ====\n"); 696 CSR_WRITE_REG(sc, 0x24, 0xF); // DP_SEL & TX_RAM_0 697 for (i = 0; i < 128; i++) { 698 CSR_WRITE_REG(sc, 0x2C, i); // DP_ADDR 699 700 CSR_WRITE_REG(sc, 0x28, 0); // DP_CMD 701 702 while ((CSR_READ_REG(sc, 0x24) & 0x80000000) == 0) // DP_SEL & READY 703 DELAY(1000); 704 705 device_printf(sc->dev, "DMAC_TX_RAM_0[%u]=%08x\n", i, 706 CSR_READ_REG(sc, 0x30)); // DP_DATA 707 } 708 } 709 #endif 710 711 static void 712 mgb_stop(if_ctx_t ctx) 713 { 714 struct mgb_softc *sc ; 715 if_softc_ctx_t scctx; 716 int i; 717 718 sc = iflib_get_softc(ctx); 719 scctx = iflib_get_softc_ctx(ctx); 720 721 /* XXX: Could potentially timeout */ 722 for (i = 0; i < scctx->isc_nrxqsets; i++) { 723 mgb_dmac_control(sc, MGB_DMAC_RX_START, 0, DMAC_STOP); 724 mgb_fct_control(sc, MGB_FCT_RX_CTL, 0, FCT_DISABLE); 725 } 726 for (i = 0; i < scctx->isc_ntxqsets; i++) { 727 mgb_dmac_control(sc, MGB_DMAC_TX_START, 0, DMAC_STOP); 728 mgb_fct_control(sc, MGB_FCT_TX_CTL, 0, FCT_DISABLE); 729 } 730 } 731 732 static int 733 mgb_legacy_intr(void *xsc) 734 { 735 struct mgb_softc *sc; 736 737 sc = xsc; 738 iflib_admin_intr_deferred(sc->ctx); 739 return (FILTER_HANDLED); 740 } 741 742 static int 743 mgb_rxq_intr(void *xsc) 744 { 745 struct mgb_softc *sc; 746 if_softc_ctx_t scctx; 747 uint32_t intr_sts, intr_en; 748 int qidx; 749 750 sc = xsc; 751 scctx = iflib_get_softc_ctx(sc->ctx); 752 753 intr_sts = CSR_READ_REG(sc, MGB_INTR_STS); 754 intr_en = CSR_READ_REG(sc, MGB_INTR_ENBL_SET); 755 intr_sts &= intr_en; 756 757 for (qidx = 0; qidx < scctx->isc_nrxqsets; qidx++) { 758 if ((intr_sts & MGB_INTR_STS_RX(qidx))){ 759 CSR_WRITE_REG(sc, MGB_INTR_ENBL_CLR, 760 MGB_INTR_STS_RX(qidx)); 761 CSR_WRITE_REG(sc, MGB_INTR_STS, MGB_INTR_STS_RX(qidx)); 762 } 763 } 764 return (FILTER_SCHEDULE_THREAD); 765 } 766 767 static int 768 mgb_admin_intr(void *xsc) 769 { 770 struct mgb_softc *sc; 771 if_softc_ctx_t scctx; 772 uint32_t intr_sts, intr_en; 773 int qidx; 774 775 sc = xsc; 776 scctx = iflib_get_softc_ctx(sc->ctx); 777 778 intr_sts = CSR_READ_REG(sc, MGB_INTR_STS); 779 intr_en = CSR_READ_REG(sc, MGB_INTR_ENBL_SET); 780 intr_sts &= intr_en; 781 782 /* TODO: shouldn't continue if suspended */ 783 if ((intr_sts & MGB_INTR_STS_ANY) == 0) 784 return (FILTER_STRAY); 785 if ((intr_sts & MGB_INTR_STS_TEST) != 0) { 786 sc->isr_test_flag = true; 787 CSR_WRITE_REG(sc, MGB_INTR_STS, MGB_INTR_STS_TEST); 788 return (FILTER_HANDLED); 789 } 790 if ((intr_sts & MGB_INTR_STS_RX_ANY) != 0) { 791 for (qidx = 0; qidx < scctx->isc_nrxqsets; qidx++) { 792 if ((intr_sts & MGB_INTR_STS_RX(qidx))){ 793 iflib_rx_intr_deferred(sc->ctx, qidx); 794 } 795 } 796 return (FILTER_HANDLED); 797 } 798 /* XXX: TX interrupts should not occur */ 799 if ((intr_sts & MGB_INTR_STS_TX_ANY) != 0) { 800 for (qidx = 0; qidx < scctx->isc_ntxqsets; qidx++) { 801 if ((intr_sts & MGB_INTR_STS_RX(qidx))) { 802 /* clear the interrupt sts and run handler */ 803 CSR_WRITE_REG(sc, MGB_INTR_ENBL_CLR, 804 MGB_INTR_STS_TX(qidx)); 805 CSR_WRITE_REG(sc, MGB_INTR_STS, 806 MGB_INTR_STS_TX(qidx)); 807 iflib_tx_intr_deferred(sc->ctx, qidx); 808 } 809 } 810 return (FILTER_HANDLED); 811 } 812 813 return (FILTER_SCHEDULE_THREAD); 814 } 815 816 static int 817 mgb_msix_intr_assign(if_ctx_t ctx, int msix) 818 { 819 struct mgb_softc *sc; 820 if_softc_ctx_t scctx; 821 int error, i, vectorid; 822 char irq_name[16]; 823 824 sc = iflib_get_softc(ctx); 825 scctx = iflib_get_softc_ctx(ctx); 826 827 KASSERT(scctx->isc_nrxqsets == 1 && scctx->isc_ntxqsets == 1, 828 ("num rxqsets/txqsets != 1 ")); 829 830 /* 831 * First vector should be admin interrupts, others vectors are TX/RX 832 * 833 * RIDs start at 1, and vector ids start at 0. 834 */ 835 vectorid = 0; 836 error = iflib_irq_alloc_generic(ctx, &sc->admin_irq, vectorid + 1, 837 IFLIB_INTR_ADMIN, mgb_admin_intr, sc, 0, "admin"); 838 if (error) { 839 device_printf(sc->dev, 840 "Failed to register admin interrupt handler\n"); 841 return (error); 842 } 843 844 for (i = 0; i < scctx->isc_nrxqsets; i++) { 845 vectorid++; 846 snprintf(irq_name, sizeof(irq_name), "rxq%d", i); 847 error = iflib_irq_alloc_generic(ctx, &sc->rx_irq, vectorid + 1, 848 IFLIB_INTR_RXTX, mgb_rxq_intr, sc, i, irq_name); 849 if (error) { 850 device_printf(sc->dev, 851 "Failed to register rxq %d interrupt handler\n", i); 852 return (error); 853 } 854 CSR_UPDATE_REG(sc, MGB_INTR_VEC_RX_MAP, 855 MGB_INTR_VEC_MAP(vectorid, i)); 856 } 857 858 /* Not actually mapping hw TX interrupts ... */ 859 for (i = 0; i < scctx->isc_ntxqsets; i++) { 860 snprintf(irq_name, sizeof(irq_name), "txq%d", i); 861 iflib_softirq_alloc_generic(ctx, NULL, IFLIB_INTR_TX, NULL, i, 862 irq_name); 863 } 864 865 return (0); 866 } 867 868 static void 869 mgb_intr_enable_all(if_ctx_t ctx) 870 { 871 struct mgb_softc *sc; 872 if_softc_ctx_t scctx; 873 int i, dmac_enable = 0, intr_sts = 0, vec_en = 0; 874 875 sc = iflib_get_softc(ctx); 876 scctx = iflib_get_softc_ctx(ctx); 877 intr_sts |= MGB_INTR_STS_ANY; 878 vec_en |= MGB_INTR_STS_ANY; 879 880 for (i = 0; i < scctx->isc_nrxqsets; i++) { 881 intr_sts |= MGB_INTR_STS_RX(i); 882 dmac_enable |= MGB_DMAC_RX_INTR_ENBL(i); 883 vec_en |= MGB_INTR_RX_VEC_STS(i); 884 } 885 886 /* TX interrupts aren't needed ... */ 887 888 CSR_WRITE_REG(sc, MGB_INTR_ENBL_SET, intr_sts); 889 CSR_WRITE_REG(sc, MGB_INTR_VEC_ENBL_SET, vec_en); 890 CSR_WRITE_REG(sc, MGB_DMAC_INTR_STS, dmac_enable); 891 CSR_WRITE_REG(sc, MGB_DMAC_INTR_ENBL_SET, dmac_enable); 892 } 893 894 static void 895 mgb_intr_disable_all(if_ctx_t ctx) 896 { 897 struct mgb_softc *sc; 898 899 sc = iflib_get_softc(ctx); 900 CSR_WRITE_REG(sc, MGB_INTR_ENBL_CLR, UINT32_MAX); 901 CSR_WRITE_REG(sc, MGB_INTR_VEC_ENBL_CLR, UINT32_MAX); 902 CSR_WRITE_REG(sc, MGB_INTR_STS, UINT32_MAX); 903 904 CSR_WRITE_REG(sc, MGB_DMAC_INTR_ENBL_CLR, UINT32_MAX); 905 CSR_WRITE_REG(sc, MGB_DMAC_INTR_STS, UINT32_MAX); 906 } 907 908 static int 909 mgb_rx_queue_intr_enable(if_ctx_t ctx, uint16_t qid) 910 { 911 /* called after successful rx isr */ 912 struct mgb_softc *sc; 913 914 sc = iflib_get_softc(ctx); 915 CSR_WRITE_REG(sc, MGB_INTR_VEC_ENBL_SET, MGB_INTR_RX_VEC_STS(qid)); 916 CSR_WRITE_REG(sc, MGB_INTR_ENBL_SET, MGB_INTR_STS_RX(qid)); 917 918 CSR_WRITE_REG(sc, MGB_DMAC_INTR_STS, MGB_DMAC_RX_INTR_ENBL(qid)); 919 CSR_WRITE_REG(sc, MGB_DMAC_INTR_ENBL_SET, MGB_DMAC_RX_INTR_ENBL(qid)); 920 return (0); 921 } 922 923 static int 924 mgb_tx_queue_intr_enable(if_ctx_t ctx, uint16_t qid) 925 { 926 /* XXX: not called (since tx interrupts not used) */ 927 struct mgb_softc *sc; 928 929 sc = iflib_get_softc(ctx); 930 931 CSR_WRITE_REG(sc, MGB_INTR_ENBL_SET, MGB_INTR_STS_TX(qid)); 932 933 CSR_WRITE_REG(sc, MGB_DMAC_INTR_STS, MGB_DMAC_TX_INTR_ENBL(qid)); 934 CSR_WRITE_REG(sc, MGB_DMAC_INTR_ENBL_SET, MGB_DMAC_TX_INTR_ENBL(qid)); 935 return (0); 936 } 937 938 static bool 939 mgb_intr_test(struct mgb_softc *sc) 940 { 941 int i; 942 943 sc->isr_test_flag = false; 944 CSR_WRITE_REG(sc, MGB_INTR_STS, MGB_INTR_STS_TEST); 945 CSR_WRITE_REG(sc, MGB_INTR_VEC_ENBL_SET, MGB_INTR_STS_ANY); 946 CSR_WRITE_REG(sc, MGB_INTR_ENBL_SET, 947 MGB_INTR_STS_ANY | MGB_INTR_STS_TEST); 948 CSR_WRITE_REG(sc, MGB_INTR_SET, MGB_INTR_STS_TEST); 949 if (sc->isr_test_flag) 950 return (true); 951 for (i = 0; i < MGB_TIMEOUT; i++) { 952 DELAY(10); 953 if (sc->isr_test_flag) 954 break; 955 } 956 CSR_WRITE_REG(sc, MGB_INTR_ENBL_CLR, MGB_INTR_STS_TEST); 957 CSR_WRITE_REG(sc, MGB_INTR_STS, MGB_INTR_STS_TEST); 958 return (sc->isr_test_flag); 959 } 960 961 static int 962 mgb_isc_txd_encap(void *xsc , if_pkt_info_t ipi) 963 { 964 struct mgb_softc *sc; 965 struct mgb_ring_data *rdata; 966 struct mgb_ring_desc *txd; 967 bus_dma_segment_t *segs; 968 qidx_t pidx, nsegs; 969 int i; 970 971 KASSERT(ipi->ipi_qsidx == 0, 972 ("tried to refill TX Channel %d.\n", ipi->ipi_qsidx)); 973 sc = xsc; 974 rdata = &sc->tx_ring_data; 975 976 pidx = ipi->ipi_pidx; 977 segs = ipi->ipi_segs; 978 nsegs = ipi->ipi_nsegs; 979 980 /* For each seg, create a descriptor */ 981 for (i = 0; i < nsegs; ++i) { 982 KASSERT(nsegs == 1, ("Multisegment packet !!!!!\n")); 983 txd = &rdata->ring[pidx]; 984 txd->ctl = htole32( 985 (segs[i].ds_len & MGB_DESC_CTL_BUFLEN_MASK ) | 986 /* 987 * XXX: This will be wrong in the multipacket case 988 * I suspect FS should be for the first packet and 989 * LS should be for the last packet 990 */ 991 MGB_TX_DESC_CTL_FS | MGB_TX_DESC_CTL_LS | 992 MGB_DESC_CTL_FCS); 993 txd->addr.low = htole32(CSR_TRANSLATE_ADDR_LOW32( 994 segs[i].ds_addr)); 995 txd->addr.high = htole32(CSR_TRANSLATE_ADDR_HIGH32( 996 segs[i].ds_addr)); 997 txd->sts = htole32( 998 (segs[i].ds_len << 16) & MGB_DESC_FRAME_LEN_MASK); 999 pidx = MGB_NEXT_RING_IDX(pidx); 1000 } 1001 ipi->ipi_new_pidx = pidx; 1002 return (0); 1003 } 1004 1005 static void 1006 mgb_isc_txd_flush(void *xsc, uint16_t txqid, qidx_t pidx) 1007 { 1008 struct mgb_softc *sc; 1009 struct mgb_ring_data *rdata; 1010 1011 KASSERT(txqid == 0, ("tried to flush TX Channel %d.\n", txqid)); 1012 sc = xsc; 1013 rdata = &sc->tx_ring_data; 1014 1015 if (rdata->last_tail != pidx) { 1016 rdata->last_tail = pidx; 1017 CSR_WRITE_REG(sc, MGB_DMA_TX_TAIL(txqid), rdata->last_tail); 1018 } 1019 } 1020 1021 static int 1022 mgb_isc_txd_credits_update(void *xsc, uint16_t txqid, bool clear) 1023 { 1024 struct mgb_softc *sc; 1025 struct mgb_ring_desc *txd; 1026 struct mgb_ring_data *rdata; 1027 int processed = 0; 1028 1029 /* 1030 * > If clear is true, we need to report the number of TX command ring 1031 * > descriptors that have been processed by the device. If clear is 1032 * > false, we just need to report whether or not at least one TX 1033 * > command ring descriptor has been processed by the device. 1034 * - vmx driver 1035 */ 1036 KASSERT(txqid == 0, ("tried to credits_update TX Channel %d.\n", 1037 txqid)); 1038 sc = xsc; 1039 rdata = &sc->tx_ring_data; 1040 1041 while (*(rdata->head_wb) != rdata->last_head) { 1042 if (!clear) 1043 return (1); 1044 1045 txd = &rdata->ring[rdata->last_head]; 1046 memset(txd, 0, sizeof(struct mgb_ring_desc)); 1047 rdata->last_head = MGB_NEXT_RING_IDX(rdata->last_head); 1048 processed++; 1049 } 1050 1051 return (processed); 1052 } 1053 1054 static int 1055 mgb_isc_rxd_available(void *xsc, uint16_t rxqid, qidx_t idx, qidx_t budget) 1056 { 1057 struct mgb_softc *sc; 1058 struct mgb_ring_data *rdata; 1059 int avail = 0; 1060 1061 sc = xsc; 1062 KASSERT(rxqid == 0, ("tried to check availability in RX Channel %d.\n", 1063 rxqid)); 1064 1065 rdata = &sc->rx_ring_data; 1066 for (; idx != *(rdata->head_wb); idx = MGB_NEXT_RING_IDX(idx)) { 1067 avail++; 1068 /* XXX: Could verify desc is device owned here */ 1069 if (avail == budget) 1070 break; 1071 } 1072 return (avail); 1073 } 1074 1075 static int 1076 mgb_isc_rxd_pkt_get(void *xsc, if_rxd_info_t ri) 1077 { 1078 struct mgb_softc *sc; 1079 struct mgb_ring_data *rdata; 1080 struct mgb_ring_desc rxd; 1081 int total_len; 1082 1083 KASSERT(ri->iri_qsidx == 0, 1084 ("tried to check availability in RX Channel %d\n", ri->iri_qsidx)); 1085 sc = xsc; 1086 total_len = 0; 1087 rdata = &sc->rx_ring_data; 1088 1089 while (*(rdata->head_wb) != rdata->last_head) { 1090 /* copy ring desc and do swapping */ 1091 rxd = rdata->ring[rdata->last_head]; 1092 rxd.ctl = le32toh(rxd.ctl); 1093 rxd.addr.low = le32toh(rxd.ctl); 1094 rxd.addr.high = le32toh(rxd.ctl); 1095 rxd.sts = le32toh(rxd.ctl); 1096 1097 if ((rxd.ctl & MGB_DESC_CTL_OWN) != 0) { 1098 device_printf(sc->dev, 1099 "Tried to read descriptor ... " 1100 "found that it's owned by the driver\n"); 1101 return (EINVAL); 1102 } 1103 if ((rxd.ctl & MGB_RX_DESC_CTL_FS) == 0) { 1104 device_printf(sc->dev, 1105 "Tried to read descriptor ... " 1106 "found that FS is not set.\n"); 1107 device_printf(sc->dev, "Tried to read descriptor ... that it FS is not set.\n"); 1108 return (EINVAL); 1109 } 1110 /* XXX: Multi-packet support */ 1111 if ((rxd.ctl & MGB_RX_DESC_CTL_LS) == 0) { 1112 device_printf(sc->dev, 1113 "Tried to read descriptor ... " 1114 "found that LS is not set. (Multi-buffer packets not yet supported)\n"); 1115 return (EINVAL); 1116 } 1117 ri->iri_frags[0].irf_flid = 0; 1118 ri->iri_frags[0].irf_idx = rdata->last_head; 1119 ri->iri_frags[0].irf_len = MGB_DESC_GET_FRAME_LEN(&rxd); 1120 total_len += ri->iri_frags[0].irf_len; 1121 1122 rdata->last_head = MGB_NEXT_RING_IDX(rdata->last_head); 1123 break; 1124 } 1125 ri->iri_nfrags = 1; 1126 ri->iri_len = total_len; 1127 1128 return (0); 1129 } 1130 1131 static void 1132 mgb_isc_rxd_refill(void *xsc, if_rxd_update_t iru) 1133 { 1134 struct mgb_softc *sc; 1135 struct mgb_ring_data *rdata; 1136 struct mgb_ring_desc *rxd; 1137 uint64_t *paddrs; 1138 qidx_t *idxs; 1139 qidx_t idx; 1140 int count, len; 1141 1142 count = iru->iru_count; 1143 len = iru->iru_buf_size; 1144 idxs = iru->iru_idxs; 1145 paddrs = iru->iru_paddrs; 1146 KASSERT(iru->iru_qsidx == 0, 1147 ("tried to refill RX Channel %d.\n", iru->iru_qsidx)); 1148 1149 sc = xsc; 1150 rdata = &sc->rx_ring_data; 1151 1152 while (count > 0) { 1153 idx = idxs[--count]; 1154 rxd = &rdata->ring[idx]; 1155 1156 rxd->sts = 0; 1157 rxd->addr.low = 1158 htole32(CSR_TRANSLATE_ADDR_LOW32(paddrs[count])); 1159 rxd->addr.high = 1160 htole32(CSR_TRANSLATE_ADDR_HIGH32(paddrs[count])); 1161 rxd->ctl = htole32(MGB_DESC_CTL_OWN | 1162 (len & MGB_DESC_CTL_BUFLEN_MASK)); 1163 } 1164 return; 1165 } 1166 1167 static void 1168 mgb_isc_rxd_flush(void *xsc, uint16_t rxqid, uint8_t flid, qidx_t pidx) 1169 { 1170 struct mgb_softc *sc; 1171 1172 sc = xsc; 1173 1174 KASSERT(rxqid == 0, ("tried to flush RX Channel %d.\n", rxqid)); 1175 /* 1176 * According to the programming guide, last_tail must be set to 1177 * the last valid RX descriptor, rather than to the one past that. 1178 * Note that this is not true for the TX ring! 1179 */ 1180 sc->rx_ring_data.last_tail = MGB_PREV_RING_IDX(pidx); 1181 CSR_WRITE_REG(sc, MGB_DMA_RX_TAIL(rxqid), sc->rx_ring_data.last_tail); 1182 return; 1183 } 1184 1185 static int 1186 mgb_test_bar(struct mgb_softc *sc) 1187 { 1188 uint32_t id_rev, dev_id; 1189 1190 id_rev = CSR_READ_REG(sc, 0); 1191 dev_id = id_rev >> 16; 1192 if (dev_id == MGB_LAN7430_DEVICE_ID || 1193 dev_id == MGB_LAN7431_DEVICE_ID) { 1194 return (0); 1195 } else { 1196 device_printf(sc->dev, "ID check failed.\n"); 1197 return (ENXIO); 1198 } 1199 } 1200 1201 static int 1202 mgb_alloc_regs(struct mgb_softc *sc) 1203 { 1204 int rid; 1205 1206 rid = PCIR_BAR(MGB_BAR); 1207 pci_enable_busmaster(sc->dev); 1208 sc->regs = bus_alloc_resource_any(sc->dev, SYS_RES_MEMORY, 1209 &rid, RF_ACTIVE); 1210 if (sc->regs == NULL) 1211 return (ENXIO); 1212 1213 return (0); 1214 } 1215 1216 static int 1217 mgb_release_regs(struct mgb_softc *sc) 1218 { 1219 int error = 0; 1220 1221 if (sc->regs != NULL) 1222 error = bus_release_resource(sc->dev, SYS_RES_MEMORY, 1223 rman_get_rid(sc->regs), sc->regs); 1224 sc->regs = NULL; 1225 pci_disable_busmaster(sc->dev); 1226 return (error); 1227 } 1228 1229 static int 1230 mgb_dma_init(struct mgb_softc *sc) 1231 { 1232 if_softc_ctx_t scctx; 1233 int ch, error = 0; 1234 1235 scctx = iflib_get_softc_ctx(sc->ctx); 1236 1237 for (ch = 0; ch < scctx->isc_nrxqsets; ch++) 1238 if ((error = mgb_dma_rx_ring_init(sc, ch))) 1239 goto fail; 1240 1241 for (ch = 0; ch < scctx->isc_nrxqsets; ch++) 1242 if ((error = mgb_dma_tx_ring_init(sc, ch))) 1243 goto fail; 1244 1245 fail: 1246 return (error); 1247 } 1248 1249 static int 1250 mgb_dma_rx_ring_init(struct mgb_softc *sc, int channel) 1251 { 1252 struct mgb_ring_data *rdata; 1253 int ring_config, error = 0; 1254 1255 rdata = &sc->rx_ring_data; 1256 mgb_dmac_control(sc, MGB_DMAC_RX_START, 0, DMAC_RESET); 1257 KASSERT(MGB_DMAC_STATE_IS_INITIAL(sc, MGB_DMAC_RX_START, channel), 1258 ("Trying to init channels when not in init state\n")); 1259 1260 /* write ring address */ 1261 if (rdata->ring_bus_addr == 0) { 1262 device_printf(sc->dev, "Invalid ring bus addr.\n"); 1263 goto fail; 1264 } 1265 1266 CSR_WRITE_REG(sc, MGB_DMA_RX_BASE_H(channel), 1267 CSR_TRANSLATE_ADDR_HIGH32(rdata->ring_bus_addr)); 1268 CSR_WRITE_REG(sc, MGB_DMA_RX_BASE_L(channel), 1269 CSR_TRANSLATE_ADDR_LOW32(rdata->ring_bus_addr)); 1270 1271 /* write head pointer writeback address */ 1272 if (rdata->head_wb_bus_addr == 0) { 1273 device_printf(sc->dev, "Invalid head wb bus addr.\n"); 1274 goto fail; 1275 } 1276 CSR_WRITE_REG(sc, MGB_DMA_RX_HEAD_WB_H(channel), 1277 CSR_TRANSLATE_ADDR_HIGH32(rdata->head_wb_bus_addr)); 1278 CSR_WRITE_REG(sc, MGB_DMA_RX_HEAD_WB_L(channel), 1279 CSR_TRANSLATE_ADDR_LOW32(rdata->head_wb_bus_addr)); 1280 1281 /* Enable head pointer writeback */ 1282 CSR_WRITE_REG(sc, MGB_DMA_RX_CONFIG0(channel), MGB_DMA_HEAD_WB_ENBL); 1283 1284 ring_config = CSR_READ_REG(sc, MGB_DMA_RX_CONFIG1(channel)); 1285 /* ring size */ 1286 ring_config &= ~MGB_DMA_RING_LEN_MASK; 1287 ring_config |= (MGB_DMA_RING_SIZE & MGB_DMA_RING_LEN_MASK); 1288 /* packet padding (PAD_2 is better for IP header alignment ...) */ 1289 ring_config &= ~MGB_DMA_RING_PAD_MASK; 1290 ring_config |= (MGB_DMA_RING_PAD_0 & MGB_DMA_RING_PAD_MASK); 1291 1292 CSR_WRITE_REG(sc, MGB_DMA_RX_CONFIG1(channel), ring_config); 1293 1294 rdata->last_head = CSR_READ_REG(sc, MGB_DMA_RX_HEAD(channel)); 1295 1296 mgb_fct_control(sc, MGB_FCT_RX_CTL, channel, FCT_RESET); 1297 if (error != 0) { 1298 device_printf(sc->dev, "Failed to reset RX FCT.\n"); 1299 goto fail; 1300 } 1301 mgb_fct_control(sc, MGB_FCT_RX_CTL, channel, FCT_ENABLE); 1302 if (error != 0) { 1303 device_printf(sc->dev, "Failed to enable RX FCT.\n"); 1304 goto fail; 1305 } 1306 mgb_dmac_control(sc, MGB_DMAC_RX_START, channel, DMAC_START); 1307 if (error != 0) 1308 device_printf(sc->dev, "Failed to start RX DMAC.\n"); 1309 fail: 1310 return (error); 1311 } 1312 1313 static int 1314 mgb_dma_tx_ring_init(struct mgb_softc *sc, int channel) 1315 { 1316 struct mgb_ring_data *rdata; 1317 int ring_config, error = 0; 1318 1319 rdata = &sc->tx_ring_data; 1320 if ((error = mgb_fct_control(sc, MGB_FCT_TX_CTL, channel, FCT_RESET))) { 1321 device_printf(sc->dev, "Failed to reset TX FCT.\n"); 1322 goto fail; 1323 } 1324 if ((error = mgb_fct_control(sc, MGB_FCT_TX_CTL, channel, 1325 FCT_ENABLE))) { 1326 device_printf(sc->dev, "Failed to enable TX FCT.\n"); 1327 goto fail; 1328 } 1329 if ((error = mgb_dmac_control(sc, MGB_DMAC_TX_START, channel, 1330 DMAC_RESET))) { 1331 device_printf(sc->dev, "Failed to reset TX DMAC.\n"); 1332 goto fail; 1333 } 1334 KASSERT(MGB_DMAC_STATE_IS_INITIAL(sc, MGB_DMAC_TX_START, channel), 1335 ("Trying to init channels in not init state\n")); 1336 1337 /* write ring address */ 1338 if (rdata->ring_bus_addr == 0) { 1339 device_printf(sc->dev, "Invalid ring bus addr.\n"); 1340 goto fail; 1341 } 1342 CSR_WRITE_REG(sc, MGB_DMA_TX_BASE_H(channel), 1343 CSR_TRANSLATE_ADDR_HIGH32(rdata->ring_bus_addr)); 1344 CSR_WRITE_REG(sc, MGB_DMA_TX_BASE_L(channel), 1345 CSR_TRANSLATE_ADDR_LOW32(rdata->ring_bus_addr)); 1346 1347 /* write ring size */ 1348 ring_config = CSR_READ_REG(sc, MGB_DMA_TX_CONFIG1(channel)); 1349 ring_config &= ~MGB_DMA_RING_LEN_MASK; 1350 ring_config |= (MGB_DMA_RING_SIZE & MGB_DMA_RING_LEN_MASK); 1351 CSR_WRITE_REG(sc, MGB_DMA_TX_CONFIG1(channel), ring_config); 1352 1353 /* Enable interrupt on completion and head pointer writeback */ 1354 ring_config = (MGB_DMA_HEAD_WB_LS_ENBL | MGB_DMA_HEAD_WB_ENBL); 1355 CSR_WRITE_REG(sc, MGB_DMA_TX_CONFIG0(channel), ring_config); 1356 1357 /* write head pointer writeback address */ 1358 if (rdata->head_wb_bus_addr == 0) { 1359 device_printf(sc->dev, "Invalid head wb bus addr.\n"); 1360 goto fail; 1361 } 1362 CSR_WRITE_REG(sc, MGB_DMA_TX_HEAD_WB_H(channel), 1363 CSR_TRANSLATE_ADDR_HIGH32(rdata->head_wb_bus_addr)); 1364 CSR_WRITE_REG(sc, MGB_DMA_TX_HEAD_WB_L(channel), 1365 CSR_TRANSLATE_ADDR_LOW32(rdata->head_wb_bus_addr)); 1366 1367 rdata->last_head = CSR_READ_REG(sc, MGB_DMA_TX_HEAD(channel)); 1368 KASSERT(rdata->last_head == 0, ("MGB_DMA_TX_HEAD was not reset.\n")); 1369 rdata->last_tail = 0; 1370 CSR_WRITE_REG(sc, MGB_DMA_TX_TAIL(channel), rdata->last_tail); 1371 1372 if ((error = mgb_dmac_control(sc, MGB_DMAC_TX_START, channel, 1373 DMAC_START))) 1374 device_printf(sc->dev, "Failed to start TX DMAC.\n"); 1375 fail: 1376 return (error); 1377 } 1378 1379 static int 1380 mgb_dmac_control(struct mgb_softc *sc, int start, int channel, 1381 enum mgb_dmac_cmd cmd) 1382 { 1383 int error = 0; 1384 1385 switch (cmd) { 1386 case DMAC_RESET: 1387 CSR_WRITE_REG(sc, MGB_DMAC_CMD, 1388 MGB_DMAC_CMD_RESET(start, channel)); 1389 error = mgb_wait_for_bits(sc, MGB_DMAC_CMD, 0, 1390 MGB_DMAC_CMD_RESET(start, channel)); 1391 break; 1392 1393 case DMAC_START: 1394 /* 1395 * NOTE: this simplifies the logic, since it will never 1396 * try to start in STOP_PENDING, but it also increases work. 1397 */ 1398 error = mgb_dmac_control(sc, start, channel, DMAC_STOP); 1399 if (error != 0) 1400 return (error); 1401 CSR_WRITE_REG(sc, MGB_DMAC_CMD, 1402 MGB_DMAC_CMD_START(start, channel)); 1403 break; 1404 1405 case DMAC_STOP: 1406 CSR_WRITE_REG(sc, MGB_DMAC_CMD, 1407 MGB_DMAC_CMD_STOP(start, channel)); 1408 error = mgb_wait_for_bits(sc, MGB_DMAC_CMD, 1409 MGB_DMAC_CMD_STOP(start, channel), 1410 MGB_DMAC_CMD_START(start, channel)); 1411 break; 1412 } 1413 return (error); 1414 } 1415 1416 static int 1417 mgb_fct_control(struct mgb_softc *sc, int reg, int channel, 1418 enum mgb_fct_cmd cmd) 1419 { 1420 1421 switch (cmd) { 1422 case FCT_RESET: 1423 CSR_WRITE_REG(sc, reg, MGB_FCT_RESET(channel)); 1424 return (mgb_wait_for_bits(sc, reg, 0, MGB_FCT_RESET(channel))); 1425 case FCT_ENABLE: 1426 CSR_WRITE_REG(sc, reg, MGB_FCT_ENBL(channel)); 1427 return (0); 1428 case FCT_DISABLE: 1429 CSR_WRITE_REG(sc, reg, MGB_FCT_DSBL(channel)); 1430 return (mgb_wait_for_bits(sc, reg, 0, MGB_FCT_ENBL(channel))); 1431 } 1432 } 1433 1434 static int 1435 mgb_hw_teardown(struct mgb_softc *sc) 1436 { 1437 int err = 0; 1438 1439 /* Stop MAC */ 1440 CSR_CLEAR_REG(sc, MGB_MAC_RX, MGB_MAC_ENBL); 1441 CSR_WRITE_REG(sc, MGB_MAC_TX, MGB_MAC_ENBL); 1442 if ((err = mgb_wait_for_bits(sc, MGB_MAC_RX, MGB_MAC_DSBL, 0))) 1443 return (err); 1444 if ((err = mgb_wait_for_bits(sc, MGB_MAC_TX, MGB_MAC_DSBL, 0))) 1445 return (err); 1446 return (err); 1447 } 1448 1449 static int 1450 mgb_hw_init(struct mgb_softc *sc) 1451 { 1452 int error = 0; 1453 1454 error = mgb_hw_reset(sc); 1455 if (error != 0) 1456 goto fail; 1457 1458 mgb_mac_init(sc); 1459 1460 error = mgb_phy_reset(sc); 1461 if (error != 0) 1462 goto fail; 1463 1464 error = mgb_dmac_reset(sc); 1465 if (error != 0) 1466 goto fail; 1467 1468 fail: 1469 return (error); 1470 } 1471 1472 static int 1473 mgb_hw_reset(struct mgb_softc *sc) 1474 { 1475 1476 CSR_UPDATE_REG(sc, MGB_HW_CFG, MGB_LITE_RESET); 1477 return (mgb_wait_for_bits(sc, MGB_HW_CFG, 0, MGB_LITE_RESET)); 1478 } 1479 1480 static int 1481 mgb_mac_init(struct mgb_softc *sc) 1482 { 1483 1484 /** 1485 * enable automatic duplex detection and 1486 * automatic speed detection 1487 */ 1488 CSR_UPDATE_REG(sc, MGB_MAC_CR, MGB_MAC_ADD_ENBL | MGB_MAC_ASD_ENBL); 1489 CSR_UPDATE_REG(sc, MGB_MAC_TX, MGB_MAC_ENBL); 1490 CSR_UPDATE_REG(sc, MGB_MAC_RX, MGB_MAC_ENBL); 1491 1492 return (MGB_STS_OK); 1493 } 1494 1495 static int 1496 mgb_phy_reset(struct mgb_softc *sc) 1497 { 1498 1499 CSR_UPDATE_BYTE(sc, MGB_PMT_CTL, MGB_PHY_RESET); 1500 if (mgb_wait_for_bits(sc, MGB_PMT_CTL, 0, MGB_PHY_RESET) == 1501 MGB_STS_TIMEOUT) 1502 return (MGB_STS_TIMEOUT); 1503 return (mgb_wait_for_bits(sc, MGB_PMT_CTL, MGB_PHY_READY, 0)); 1504 } 1505 1506 static int 1507 mgb_dmac_reset(struct mgb_softc *sc) 1508 { 1509 1510 CSR_WRITE_REG(sc, MGB_DMAC_CMD, MGB_DMAC_RESET); 1511 return (mgb_wait_for_bits(sc, MGB_DMAC_CMD, 0, MGB_DMAC_RESET)); 1512 } 1513 1514 static int 1515 mgb_wait_for_bits(struct mgb_softc *sc, int reg, int set_bits, int clear_bits) 1516 { 1517 int i, val; 1518 1519 i = 0; 1520 do { 1521 /* 1522 * XXX: Datasheets states delay should be > 5 microseconds 1523 * for device reset. 1524 */ 1525 DELAY(100); 1526 val = CSR_READ_REG(sc, reg); 1527 if ((val & set_bits) == set_bits && (val & clear_bits) == 0) 1528 return (MGB_STS_OK); 1529 } while (i++ < MGB_TIMEOUT); 1530 1531 return (MGB_STS_TIMEOUT); 1532 } 1533 1534 static void 1535 mgb_get_ethaddr(struct mgb_softc *sc, struct ether_addr *dest) 1536 { 1537 1538 CSR_READ_REG_BYTES(sc, MGB_MAC_ADDR_BASE_L, &dest->octet[0], 4); 1539 CSR_READ_REG_BYTES(sc, MGB_MAC_ADDR_BASE_H, &dest->octet[4], 2); 1540 } 1541 1542 static int 1543 mgb_miibus_readreg(device_t dev, int phy, int reg) 1544 { 1545 struct mgb_softc *sc; 1546 int mii_access; 1547 1548 sc = iflib_get_softc(device_get_softc(dev)); 1549 1550 if (mgb_wait_for_bits(sc, MGB_MII_ACCESS, 0, MGB_MII_BUSY) == 1551 MGB_STS_TIMEOUT) 1552 return (EIO); 1553 mii_access = (phy & MGB_MII_PHY_ADDR_MASK) << MGB_MII_PHY_ADDR_SHIFT; 1554 mii_access |= (reg & MGB_MII_REG_ADDR_MASK) << MGB_MII_REG_ADDR_SHIFT; 1555 mii_access |= MGB_MII_BUSY | MGB_MII_READ; 1556 CSR_WRITE_REG(sc, MGB_MII_ACCESS, mii_access); 1557 if (mgb_wait_for_bits(sc, MGB_MII_ACCESS, 0, MGB_MII_BUSY) == 1558 MGB_STS_TIMEOUT) 1559 return (EIO); 1560 return (CSR_READ_2_BYTES(sc, MGB_MII_DATA)); 1561 } 1562 1563 static int 1564 mgb_miibus_writereg(device_t dev, int phy, int reg, int data) 1565 { 1566 struct mgb_softc *sc; 1567 int mii_access; 1568 1569 sc = iflib_get_softc(device_get_softc(dev)); 1570 1571 if (mgb_wait_for_bits(sc, MGB_MII_ACCESS, 0, MGB_MII_BUSY) == 1572 MGB_STS_TIMEOUT) 1573 return (EIO); 1574 mii_access = (phy & MGB_MII_PHY_ADDR_MASK) << MGB_MII_PHY_ADDR_SHIFT; 1575 mii_access |= (reg & MGB_MII_REG_ADDR_MASK) << MGB_MII_REG_ADDR_SHIFT; 1576 mii_access |= MGB_MII_BUSY | MGB_MII_WRITE; 1577 CSR_WRITE_REG(sc, MGB_MII_DATA, data); 1578 CSR_WRITE_REG(sc, MGB_MII_ACCESS, mii_access); 1579 if (mgb_wait_for_bits(sc, MGB_MII_ACCESS, 0, MGB_MII_BUSY) == 1580 MGB_STS_TIMEOUT) 1581 return (EIO); 1582 return (0); 1583 } 1584 1585 /* XXX: May need to lock these up */ 1586 static void 1587 mgb_miibus_statchg(device_t dev) 1588 { 1589 struct mgb_softc *sc; 1590 struct mii_data *miid; 1591 1592 sc = iflib_get_softc(device_get_softc(dev)); 1593 miid = device_get_softc(sc->miibus); 1594 /* Update baudrate in iflib */ 1595 sc->baudrate = ifmedia_baudrate(miid->mii_media_active); 1596 iflib_link_state_change(sc->ctx, sc->link_state, sc->baudrate); 1597 } 1598 1599 static void 1600 mgb_miibus_linkchg(device_t dev) 1601 { 1602 struct mgb_softc *sc; 1603 struct mii_data *miid; 1604 int link_state; 1605 1606 sc = iflib_get_softc(device_get_softc(dev)); 1607 miid = device_get_softc(sc->miibus); 1608 /* XXX: copied from miibus_linkchg **/ 1609 if (miid->mii_media_status & IFM_AVALID) { 1610 if (miid->mii_media_status & IFM_ACTIVE) 1611 link_state = LINK_STATE_UP; 1612 else 1613 link_state = LINK_STATE_DOWN; 1614 } else 1615 link_state = LINK_STATE_UNKNOWN; 1616 sc->link_state = link_state; 1617 iflib_link_state_change(sc->ctx, sc->link_state, sc->baudrate); 1618 } 1619