oce_if.c revision 314667
1112490Skeramida/*- 2112490Skeramida * Copyright (C) 2013 Emulex 3112490Skeramida * All rights reserved. 4112490Skeramida * 5112490Skeramida * Redistribution and use in source and binary forms, with or without 6112490Skeramida * modification, are permitted provided that the following conditions are met: 7112490Skeramida * 8112490Skeramida * 1. Redistributions of source code must retain the above copyright notice, 9112490Skeramida * this list of conditions and the following disclaimer. 10112490Skeramida * 11112490Skeramida * 2. Redistributions in binary form must reproduce the above copyright 12112490Skeramida * notice, this list of conditions and the following disclaimer in the 13112490Skeramida * documentation and/or other materials provided with the distribution. 14112490Skeramida * 15112490Skeramida * 3. Neither the name of the Emulex Corporation nor the names of its 16112490Skeramida * contributors may be used to endorse or promote products derived from 17112490Skeramida * this software without specific prior written permission. 18112490Skeramida * 19112490Skeramida * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20112490Skeramida * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21112490Skeramida * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22112490Skeramida * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 23112490Skeramida * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24112490Skeramida * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25112490Skeramida * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26112490Skeramida * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27268791Sdelphij * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28112490Skeramida * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29112490Skeramida * POSSIBILITY OF SUCH DAMAGE. 30112490Skeramida * 31112490Skeramida * Contact Information: 32115475Sru * freebsd-drivers@emulex.com 33112490Skeramida * 34112490Skeramida * Emulex 35268791Sdelphij * 3333 Susan Street 36158771Ssimon * Costa Mesa, CA 92626 37112490Skeramida */ 38112490Skeramida 39112490Skeramida/* $FreeBSD: stable/10/sys/dev/oce/oce_if.c 314667 2017-03-04 13:03:31Z avg $ */ 40112490Skeramida 41112490Skeramida#include "opt_inet6.h" 42112490Skeramida#include "opt_inet.h" 43112490Skeramida 44112490Skeramida#include "oce_if.h" 45112490Skeramida 46112490Skeramida/* UE Status Low CSR */ 47136354Slestatic char *ue_status_low_desc[] = { 48136354Sle "CEV", 49183665Slulf "CTX", 50189739Smaxim "DBUF", 51189739Smaxim "ERX", 52189739Smaxim "Host", 53112490Skeramida "MPU", 54112490Skeramida "NDMA", 55112490Skeramida "PTC ", 56112490Skeramida "RDMA ", 57112490Skeramida "RXF ", 58112490Skeramida "RXIPS ", 59112490Skeramida "RXULP0 ", 60125844Sphk "RXULP1 ", 61130087Sru "RXULP2 ", 62130087Sru "TIM ", 63130087Sru "TPOST ", 64158771Ssimon "TPRE ", 65158771Ssimon "TXIPS ", 66158771Ssimon "TXULP0 ", 67162800Sru "TXULP1 ", 68158771Ssimon "UC ", 69158771Ssimon "WDMA ", 70158771Ssimon "TXULP2 ", 71158771Ssimon "HOST1 ", 72266610Smav "P0_OB_LINK ", 73266610Smav "P1_OB_LINK ", 74266610Smav "HOST_GPIO ", 75112490Skeramida "MBOX ", 76112490Skeramida "AXGMAC0", 77112490Skeramida "AXGMAC1", 78112490Skeramida "JTAG", 79112490Skeramida "MPU_INTPEND" 80112490Skeramida}; 81115475Sru 82115475Sru/* UE Status High CSR */ 83112490Skeramidastatic char *ue_status_hi_desc[] = { 84112490Skeramida "LPCMEMHOST", 85115475Sru "MGMT_MAC", 86115475Sru "PCS0ONLINE", 87268791Sdelphij "MPU_IRAM", 88268791Sdelphij "PCS1ONLINE", 89112490Skeramida "PCTL0", 90140368Sru "PCTL1", 91112490Skeramida "PMEM", 92112490Skeramida "RR", 93146665Skeramida "TXPB", 94146665Skeramida "RXPP", 95146665Skeramida "XAUI", 96146665Skeramida "TXP", 97112490Skeramida "ARM", 98112490Skeramida "IPC", 99112490Skeramida "HOST2", 100112490Skeramida "HOST3", 101112490Skeramida "HOST4", 102 "HOST5", 103 "HOST6", 104 "HOST7", 105 "HOST8", 106 "HOST9", 107 "NETC", 108 "Unknown", 109 "Unknown", 110 "Unknown", 111 "Unknown", 112 "Unknown", 113 "Unknown", 114 "Unknown", 115 "Unknown" 116}; 117 118 119/* Driver entry points prototypes */ 120static int oce_probe(device_t dev); 121static int oce_attach(device_t dev); 122static int oce_detach(device_t dev); 123static int oce_shutdown(device_t dev); 124static int oce_ioctl(struct ifnet *ifp, u_long command, caddr_t data); 125static void oce_init(void *xsc); 126static int oce_multiq_start(struct ifnet *ifp, struct mbuf *m); 127static void oce_multiq_flush(struct ifnet *ifp); 128 129/* Driver interrupt routines protypes */ 130static void oce_intr(void *arg, int pending); 131static int oce_setup_intr(POCE_SOFTC sc); 132static int oce_fast_isr(void *arg); 133static int oce_alloc_intr(POCE_SOFTC sc, int vector, 134 void (*isr) (void *arg, int pending)); 135 136/* Media callbacks prototypes */ 137static void oce_media_status(struct ifnet *ifp, struct ifmediareq *req); 138static int oce_media_change(struct ifnet *ifp); 139 140/* Transmit routines prototypes */ 141static int oce_tx(POCE_SOFTC sc, struct mbuf **mpp, int wq_index); 142static void oce_tx_restart(POCE_SOFTC sc, struct oce_wq *wq); 143static void oce_tx_complete(struct oce_wq *wq, uint32_t wqe_idx, 144 uint32_t status); 145static int oce_multiq_transmit(struct ifnet *ifp, struct mbuf *m, 146 struct oce_wq *wq); 147 148/* Receive routines prototypes */ 149static void oce_discard_rx_comp(struct oce_rq *rq, struct oce_nic_rx_cqe *cqe); 150static int oce_cqe_vtp_valid(POCE_SOFTC sc, struct oce_nic_rx_cqe *cqe); 151static int oce_cqe_portid_valid(POCE_SOFTC sc, struct oce_nic_rx_cqe *cqe); 152static void oce_rx(struct oce_rq *rq, uint32_t rqe_idx, 153 struct oce_nic_rx_cqe *cqe); 154 155/* Helper function prototypes in this file */ 156static int oce_attach_ifp(POCE_SOFTC sc); 157static void oce_add_vlan(void *arg, struct ifnet *ifp, uint16_t vtag); 158static void oce_del_vlan(void *arg, struct ifnet *ifp, uint16_t vtag); 159static int oce_vid_config(POCE_SOFTC sc); 160static void oce_mac_addr_set(POCE_SOFTC sc); 161static int oce_handle_passthrough(struct ifnet *ifp, caddr_t data); 162static void oce_local_timer(void *arg); 163static void oce_if_deactivate(POCE_SOFTC sc); 164static void oce_if_activate(POCE_SOFTC sc); 165static void setup_max_queues_want(POCE_SOFTC sc); 166static void update_queues_got(POCE_SOFTC sc); 167static void process_link_state(POCE_SOFTC sc, 168 struct oce_async_cqe_link_state *acqe); 169static int oce_tx_asic_stall_verify(POCE_SOFTC sc, struct mbuf *m); 170static void oce_get_config(POCE_SOFTC sc); 171static struct mbuf *oce_insert_vlan_tag(POCE_SOFTC sc, struct mbuf *m, boolean_t *complete); 172 173/* IP specific */ 174#if defined(INET6) || defined(INET) 175static int oce_init_lro(POCE_SOFTC sc); 176static void oce_rx_flush_lro(struct oce_rq *rq); 177static struct mbuf * oce_tso_setup(POCE_SOFTC sc, struct mbuf **mpp); 178#endif 179 180static device_method_t oce_dispatch[] = { 181 DEVMETHOD(device_probe, oce_probe), 182 DEVMETHOD(device_attach, oce_attach), 183 DEVMETHOD(device_detach, oce_detach), 184 DEVMETHOD(device_shutdown, oce_shutdown), 185 186 DEVMETHOD_END 187}; 188 189static driver_t oce_driver = { 190 "oce", 191 oce_dispatch, 192 sizeof(OCE_SOFTC) 193}; 194static devclass_t oce_devclass; 195 196 197DRIVER_MODULE(oce, pci, oce_driver, oce_devclass, 0, 0); 198MODULE_DEPEND(oce, pci, 1, 1, 1); 199MODULE_DEPEND(oce, ether, 1, 1, 1); 200MODULE_VERSION(oce, 1); 201 202 203/* global vars */ 204const char component_revision[32] = {"///" COMPONENT_REVISION "///"}; 205 206/* Module capabilites and parameters */ 207uint32_t oce_max_rsp_handled = OCE_MAX_RSP_HANDLED; 208uint32_t oce_enable_rss = OCE_MODCAP_RSS; 209 210 211TUNABLE_INT("hw.oce.max_rsp_handled", &oce_max_rsp_handled); 212TUNABLE_INT("hw.oce.enable_rss", &oce_enable_rss); 213 214 215/* Supported devices table */ 216static uint32_t supportedDevices[] = { 217 (PCI_VENDOR_SERVERENGINES << 16) | PCI_PRODUCT_BE2, 218 (PCI_VENDOR_SERVERENGINES << 16) | PCI_PRODUCT_BE3, 219 (PCI_VENDOR_EMULEX << 16) | PCI_PRODUCT_BE3, 220 (PCI_VENDOR_EMULEX << 16) | PCI_PRODUCT_XE201, 221 (PCI_VENDOR_EMULEX << 16) | PCI_PRODUCT_XE201_VF, 222 (PCI_VENDOR_EMULEX << 16) | PCI_PRODUCT_SH 223}; 224 225 226 227 228/***************************************************************************** 229 * Driver entry points functions * 230 *****************************************************************************/ 231 232static int 233oce_probe(device_t dev) 234{ 235 uint16_t vendor = 0; 236 uint16_t device = 0; 237 int i = 0; 238 char str[256] = {0}; 239 POCE_SOFTC sc; 240 241 sc = device_get_softc(dev); 242 bzero(sc, sizeof(OCE_SOFTC)); 243 sc->dev = dev; 244 245 vendor = pci_get_vendor(dev); 246 device = pci_get_device(dev); 247 248 for (i = 0; i < (sizeof(supportedDevices) / sizeof(uint32_t)); i++) { 249 if (vendor == ((supportedDevices[i] >> 16) & 0xffff)) { 250 if (device == (supportedDevices[i] & 0xffff)) { 251 sprintf(str, "%s:%s", "Emulex CNA NIC function", 252 component_revision); 253 device_set_desc_copy(dev, str); 254 255 switch (device) { 256 case PCI_PRODUCT_BE2: 257 sc->flags |= OCE_FLAGS_BE2; 258 break; 259 case PCI_PRODUCT_BE3: 260 sc->flags |= OCE_FLAGS_BE3; 261 break; 262 case PCI_PRODUCT_XE201: 263 case PCI_PRODUCT_XE201_VF: 264 sc->flags |= OCE_FLAGS_XE201; 265 break; 266 case PCI_PRODUCT_SH: 267 sc->flags |= OCE_FLAGS_SH; 268 break; 269 default: 270 return ENXIO; 271 } 272 return BUS_PROBE_DEFAULT; 273 } 274 } 275 } 276 277 return ENXIO; 278} 279 280 281static int 282oce_attach(device_t dev) 283{ 284 POCE_SOFTC sc; 285 int rc = 0; 286 287 sc = device_get_softc(dev); 288 289 rc = oce_hw_pci_alloc(sc); 290 if (rc) 291 return rc; 292 293 sc->tx_ring_size = OCE_TX_RING_SIZE; 294 sc->rx_ring_size = OCE_RX_RING_SIZE; 295 sc->rq_frag_size = OCE_RQ_BUF_SIZE; 296 sc->flow_control = OCE_DEFAULT_FLOW_CONTROL; 297 sc->promisc = OCE_DEFAULT_PROMISCUOUS; 298 299 LOCK_CREATE(&sc->bmbx_lock, "Mailbox_lock"); 300 LOCK_CREATE(&sc->dev_lock, "Device_lock"); 301 302 /* initialise the hardware */ 303 rc = oce_hw_init(sc); 304 if (rc) 305 goto pci_res_free; 306 307 oce_get_config(sc); 308 309 setup_max_queues_want(sc); 310 311 rc = oce_setup_intr(sc); 312 if (rc) 313 goto mbox_free; 314 315 rc = oce_queue_init_all(sc); 316 if (rc) 317 goto intr_free; 318 319 rc = oce_attach_ifp(sc); 320 if (rc) 321 goto queues_free; 322 323#if defined(INET6) || defined(INET) 324 rc = oce_init_lro(sc); 325 if (rc) 326 goto ifp_free; 327#endif 328 329 rc = oce_hw_start(sc); 330 if (rc) 331 goto lro_free; 332 333 sc->vlan_attach = EVENTHANDLER_REGISTER(vlan_config, 334 oce_add_vlan, sc, EVENTHANDLER_PRI_FIRST); 335 sc->vlan_detach = EVENTHANDLER_REGISTER(vlan_unconfig, 336 oce_del_vlan, sc, EVENTHANDLER_PRI_FIRST); 337 338 rc = oce_stats_init(sc); 339 if (rc) 340 goto vlan_free; 341 342 oce_add_sysctls(sc); 343 344 callout_init(&sc->timer, 1); 345 rc = callout_reset(&sc->timer, 2 * hz, oce_local_timer, sc); 346 if (rc) 347 goto stats_free; 348 349 return 0; 350 351stats_free: 352 callout_drain(&sc->timer); 353 oce_stats_free(sc); 354vlan_free: 355 if (sc->vlan_attach) 356 EVENTHANDLER_DEREGISTER(vlan_config, sc->vlan_attach); 357 if (sc->vlan_detach) 358 EVENTHANDLER_DEREGISTER(vlan_unconfig, sc->vlan_detach); 359 oce_hw_intr_disable(sc); 360lro_free: 361#if defined(INET6) || defined(INET) 362 oce_free_lro(sc); 363ifp_free: 364#endif 365 ether_ifdetach(sc->ifp); 366 if_free(sc->ifp); 367queues_free: 368 oce_queue_release_all(sc); 369intr_free: 370 oce_intr_free(sc); 371mbox_free: 372 oce_dma_free(sc, &sc->bsmbx); 373pci_res_free: 374 oce_hw_pci_free(sc); 375 LOCK_DESTROY(&sc->dev_lock); 376 LOCK_DESTROY(&sc->bmbx_lock); 377 return rc; 378 379} 380 381 382static int 383oce_detach(device_t dev) 384{ 385 POCE_SOFTC sc = device_get_softc(dev); 386 387 LOCK(&sc->dev_lock); 388 oce_if_deactivate(sc); 389 UNLOCK(&sc->dev_lock); 390 391 callout_drain(&sc->timer); 392 393 if (sc->vlan_attach != NULL) 394 EVENTHANDLER_DEREGISTER(vlan_config, sc->vlan_attach); 395 if (sc->vlan_detach != NULL) 396 EVENTHANDLER_DEREGISTER(vlan_unconfig, sc->vlan_detach); 397 398 ether_ifdetach(sc->ifp); 399 400 if_free(sc->ifp); 401 402 oce_hw_shutdown(sc); 403 404 bus_generic_detach(dev); 405 406 return 0; 407} 408 409 410static int 411oce_shutdown(device_t dev) 412{ 413 int rc; 414 415 rc = oce_detach(dev); 416 417 return rc; 418} 419 420 421static int 422oce_ioctl(struct ifnet *ifp, u_long command, caddr_t data) 423{ 424 struct ifreq *ifr = (struct ifreq *)data; 425 POCE_SOFTC sc = ifp->if_softc; 426 int rc = 0; 427 uint32_t u; 428 429 switch (command) { 430 431 case SIOCGIFMEDIA: 432 rc = ifmedia_ioctl(ifp, ifr, &sc->media, command); 433 break; 434 435 case SIOCSIFMTU: 436 if (ifr->ifr_mtu > OCE_MAX_MTU) 437 rc = EINVAL; 438 else 439 ifp->if_mtu = ifr->ifr_mtu; 440 break; 441 442 case SIOCSIFFLAGS: 443 if (ifp->if_flags & IFF_UP) { 444 if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) { 445 sc->ifp->if_drv_flags |= IFF_DRV_RUNNING; 446 oce_init(sc); 447 } 448 device_printf(sc->dev, "Interface Up\n"); 449 } else { 450 LOCK(&sc->dev_lock); 451 452 sc->ifp->if_drv_flags &= 453 ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); 454 oce_if_deactivate(sc); 455 456 UNLOCK(&sc->dev_lock); 457 458 device_printf(sc->dev, "Interface Down\n"); 459 } 460 461 if ((ifp->if_flags & IFF_PROMISC) && !sc->promisc) { 462 if (!oce_rxf_set_promiscuous(sc, (1 | (1 << 1)))) 463 sc->promisc = TRUE; 464 } else if (!(ifp->if_flags & IFF_PROMISC) && sc->promisc) { 465 if (!oce_rxf_set_promiscuous(sc, 0)) 466 sc->promisc = FALSE; 467 } 468 469 break; 470 471 case SIOCADDMULTI: 472 case SIOCDELMULTI: 473 rc = oce_hw_update_multicast(sc); 474 if (rc) 475 device_printf(sc->dev, 476 "Update multicast address failed\n"); 477 break; 478 479 case SIOCSIFCAP: 480 u = ifr->ifr_reqcap ^ ifp->if_capenable; 481 482 if (u & IFCAP_TXCSUM) { 483 ifp->if_capenable ^= IFCAP_TXCSUM; 484 ifp->if_hwassist ^= (CSUM_TCP | CSUM_UDP | CSUM_IP); 485 486 if (IFCAP_TSO & ifp->if_capenable && 487 !(IFCAP_TXCSUM & ifp->if_capenable)) { 488 ifp->if_capenable &= ~IFCAP_TSO; 489 ifp->if_hwassist &= ~CSUM_TSO; 490 if_printf(ifp, 491 "TSO disabled due to -txcsum.\n"); 492 } 493 } 494 495 if (u & IFCAP_RXCSUM) 496 ifp->if_capenable ^= IFCAP_RXCSUM; 497 498 if (u & IFCAP_TSO4) { 499 ifp->if_capenable ^= IFCAP_TSO4; 500 501 if (IFCAP_TSO & ifp->if_capenable) { 502 if (IFCAP_TXCSUM & ifp->if_capenable) 503 ifp->if_hwassist |= CSUM_TSO; 504 else { 505 ifp->if_capenable &= ~IFCAP_TSO; 506 ifp->if_hwassist &= ~CSUM_TSO; 507 if_printf(ifp, 508 "Enable txcsum first.\n"); 509 rc = EAGAIN; 510 } 511 } else 512 ifp->if_hwassist &= ~CSUM_TSO; 513 } 514 515 if (u & IFCAP_VLAN_HWTAGGING) 516 ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING; 517 518 if (u & IFCAP_VLAN_HWFILTER) { 519 ifp->if_capenable ^= IFCAP_VLAN_HWFILTER; 520 oce_vid_config(sc); 521 } 522#if defined(INET6) || defined(INET) 523 if (u & IFCAP_LRO) 524 ifp->if_capenable ^= IFCAP_LRO; 525#endif 526 527 break; 528 529 case SIOCGPRIVATE_0: 530 rc = oce_handle_passthrough(ifp, data); 531 break; 532 default: 533 rc = ether_ioctl(ifp, command, data); 534 break; 535 } 536 537 return rc; 538} 539 540 541static void 542oce_init(void *arg) 543{ 544 POCE_SOFTC sc = arg; 545 546 LOCK(&sc->dev_lock); 547 548 if (sc->ifp->if_flags & IFF_UP) { 549 oce_if_deactivate(sc); 550 oce_if_activate(sc); 551 } 552 553 UNLOCK(&sc->dev_lock); 554 555} 556 557 558static int 559oce_multiq_start(struct ifnet *ifp, struct mbuf *m) 560{ 561 POCE_SOFTC sc = ifp->if_softc; 562 struct oce_wq *wq = NULL; 563 int queue_index = 0; 564 int status = 0; 565 566 if (M_HASHTYPE_GET(m) != M_HASHTYPE_NONE) 567 queue_index = m->m_pkthdr.flowid % sc->nwqs; 568 569 wq = sc->wq[queue_index]; 570 571 LOCK(&wq->tx_lock); 572 status = oce_multiq_transmit(ifp, m, wq); 573 UNLOCK(&wq->tx_lock); 574 575 return status; 576 577} 578 579 580static void 581oce_multiq_flush(struct ifnet *ifp) 582{ 583 POCE_SOFTC sc = ifp->if_softc; 584 struct mbuf *m; 585 int i = 0; 586 587 for (i = 0; i < sc->nwqs; i++) { 588 while ((m = buf_ring_dequeue_sc(sc->wq[i]->br)) != NULL) 589 m_freem(m); 590 } 591 if_qflush(ifp); 592} 593 594 595 596/***************************************************************************** 597 * Driver interrupt routines functions * 598 *****************************************************************************/ 599 600static void 601oce_intr(void *arg, int pending) 602{ 603 604 POCE_INTR_INFO ii = (POCE_INTR_INFO) arg; 605 POCE_SOFTC sc = ii->sc; 606 struct oce_eq *eq = ii->eq; 607 struct oce_eqe *eqe; 608 struct oce_cq *cq = NULL; 609 int i, num_eqes = 0; 610 611 612 bus_dmamap_sync(eq->ring->dma.tag, eq->ring->dma.map, 613 BUS_DMASYNC_POSTWRITE); 614 do { 615 eqe = RING_GET_CONSUMER_ITEM_VA(eq->ring, struct oce_eqe); 616 if (eqe->evnt == 0) 617 break; 618 eqe->evnt = 0; 619 bus_dmamap_sync(eq->ring->dma.tag, eq->ring->dma.map, 620 BUS_DMASYNC_POSTWRITE); 621 RING_GET(eq->ring, 1); 622 num_eqes++; 623 624 } while (TRUE); 625 626 if (!num_eqes) 627 goto eq_arm; /* Spurious */ 628 629 /* Clear EQ entries, but dont arm */ 630 oce_arm_eq(sc, eq->eq_id, num_eqes, FALSE, FALSE); 631 632 /* Process TX, RX and MCC. But dont arm CQ*/ 633 for (i = 0; i < eq->cq_valid; i++) { 634 cq = eq->cq[i]; 635 (*cq->cq_handler)(cq->cb_arg); 636 } 637 638 /* Arm all cqs connected to this EQ */ 639 for (i = 0; i < eq->cq_valid; i++) { 640 cq = eq->cq[i]; 641 oce_arm_cq(sc, cq->cq_id, 0, TRUE); 642 } 643 644eq_arm: 645 oce_arm_eq(sc, eq->eq_id, 0, TRUE, FALSE); 646 647 return; 648} 649 650 651static int 652oce_setup_intr(POCE_SOFTC sc) 653{ 654 int rc = 0, use_intx = 0; 655 int vector = 0, req_vectors = 0; 656 657 if (is_rss_enabled(sc)) 658 req_vectors = MAX((sc->nrqs - 1), sc->nwqs); 659 else 660 req_vectors = 1; 661 662 if (sc->flags & OCE_FLAGS_MSIX_CAPABLE) { 663 sc->intr_count = req_vectors; 664 rc = pci_alloc_msix(sc->dev, &sc->intr_count); 665 if (rc != 0) { 666 use_intx = 1; 667 pci_release_msi(sc->dev); 668 } else 669 sc->flags |= OCE_FLAGS_USING_MSIX; 670 } else 671 use_intx = 1; 672 673 if (use_intx) 674 sc->intr_count = 1; 675 676 /* Scale number of queues based on intr we got */ 677 update_queues_got(sc); 678 679 if (use_intx) { 680 device_printf(sc->dev, "Using legacy interrupt\n"); 681 rc = oce_alloc_intr(sc, vector, oce_intr); 682 if (rc) 683 goto error; 684 } else { 685 for (; vector < sc->intr_count; vector++) { 686 rc = oce_alloc_intr(sc, vector, oce_intr); 687 if (rc) 688 goto error; 689 } 690 } 691 692 return 0; 693error: 694 oce_intr_free(sc); 695 return rc; 696} 697 698 699static int 700oce_fast_isr(void *arg) 701{ 702 POCE_INTR_INFO ii = (POCE_INTR_INFO) arg; 703 POCE_SOFTC sc = ii->sc; 704 705 if (ii->eq == NULL) 706 return FILTER_STRAY; 707 708 oce_arm_eq(sc, ii->eq->eq_id, 0, FALSE, TRUE); 709 710 taskqueue_enqueue_fast(ii->tq, &ii->task); 711 712 ii->eq->intr++; 713 714 return FILTER_HANDLED; 715} 716 717 718static int 719oce_alloc_intr(POCE_SOFTC sc, int vector, void (*isr) (void *arg, int pending)) 720{ 721 POCE_INTR_INFO ii = &sc->intrs[vector]; 722 int rc = 0, rr; 723 724 if (vector >= OCE_MAX_EQ) 725 return (EINVAL); 726 727 /* Set the resource id for the interrupt. 728 * MSIx is vector + 1 for the resource id, 729 * INTx is 0 for the resource id. 730 */ 731 if (sc->flags & OCE_FLAGS_USING_MSIX) 732 rr = vector + 1; 733 else 734 rr = 0; 735 ii->intr_res = bus_alloc_resource_any(sc->dev, 736 SYS_RES_IRQ, 737 &rr, RF_ACTIVE|RF_SHAREABLE); 738 ii->irq_rr = rr; 739 if (ii->intr_res == NULL) { 740 device_printf(sc->dev, 741 "Could not allocate interrupt\n"); 742 rc = ENXIO; 743 return rc; 744 } 745 746 TASK_INIT(&ii->task, 0, isr, ii); 747 ii->vector = vector; 748 sprintf(ii->task_name, "oce_task[%d]", ii->vector); 749 ii->tq = taskqueue_create_fast(ii->task_name, 750 M_NOWAIT, 751 taskqueue_thread_enqueue, 752 &ii->tq); 753 taskqueue_start_threads(&ii->tq, 1, PI_NET, "%s taskq", 754 device_get_nameunit(sc->dev)); 755 756 ii->sc = sc; 757 rc = bus_setup_intr(sc->dev, 758 ii->intr_res, 759 INTR_TYPE_NET, 760 oce_fast_isr, NULL, ii, &ii->tag); 761 return rc; 762 763} 764 765 766void 767oce_intr_free(POCE_SOFTC sc) 768{ 769 int i = 0; 770 771 for (i = 0; i < sc->intr_count; i++) { 772 773 if (sc->intrs[i].tag != NULL) 774 bus_teardown_intr(sc->dev, sc->intrs[i].intr_res, 775 sc->intrs[i].tag); 776 if (sc->intrs[i].tq != NULL) 777 taskqueue_free(sc->intrs[i].tq); 778 779 if (sc->intrs[i].intr_res != NULL) 780 bus_release_resource(sc->dev, SYS_RES_IRQ, 781 sc->intrs[i].irq_rr, 782 sc->intrs[i].intr_res); 783 sc->intrs[i].tag = NULL; 784 sc->intrs[i].intr_res = NULL; 785 } 786 787 if (sc->flags & OCE_FLAGS_USING_MSIX) 788 pci_release_msi(sc->dev); 789 790} 791 792 793 794/****************************************************************************** 795* Media callbacks functions * 796******************************************************************************/ 797 798static void 799oce_media_status(struct ifnet *ifp, struct ifmediareq *req) 800{ 801 POCE_SOFTC sc = (POCE_SOFTC) ifp->if_softc; 802 803 804 req->ifm_status = IFM_AVALID; 805 req->ifm_active = IFM_ETHER; 806 807 if (sc->link_status == 1) 808 req->ifm_status |= IFM_ACTIVE; 809 else 810 return; 811 812 switch (sc->link_speed) { 813 case 1: /* 10 Mbps */ 814 req->ifm_active |= IFM_10_T | IFM_FDX; 815 sc->speed = 10; 816 break; 817 case 2: /* 100 Mbps */ 818 req->ifm_active |= IFM_100_TX | IFM_FDX; 819 sc->speed = 100; 820 break; 821 case 3: /* 1 Gbps */ 822 req->ifm_active |= IFM_1000_T | IFM_FDX; 823 sc->speed = 1000; 824 break; 825 case 4: /* 10 Gbps */ 826 req->ifm_active |= IFM_10G_SR | IFM_FDX; 827 sc->speed = 10000; 828 break; 829 case 5: /* 20 Gbps */ 830 req->ifm_active |= IFM_10G_SR | IFM_FDX; 831 sc->speed = 20000; 832 break; 833 case 6: /* 25 Gbps */ 834 req->ifm_active |= IFM_10G_SR | IFM_FDX; 835 sc->speed = 25000; 836 break; 837 case 7: /* 40 Gbps */ 838 req->ifm_active |= IFM_40G_SR4 | IFM_FDX; 839 sc->speed = 40000; 840 break; 841 default: 842 sc->speed = 0; 843 break; 844 } 845 846 return; 847} 848 849 850int 851oce_media_change(struct ifnet *ifp) 852{ 853 return 0; 854} 855 856 857 858 859/***************************************************************************** 860 * Transmit routines functions * 861 *****************************************************************************/ 862 863static int 864oce_tx(POCE_SOFTC sc, struct mbuf **mpp, int wq_index) 865{ 866 int rc = 0, i, retry_cnt = 0; 867 bus_dma_segment_t segs[OCE_MAX_TX_ELEMENTS]; 868 struct mbuf *m, *m_temp; 869 struct oce_wq *wq = sc->wq[wq_index]; 870 struct oce_packet_desc *pd; 871 struct oce_nic_hdr_wqe *nichdr; 872 struct oce_nic_frag_wqe *nicfrag; 873 int num_wqes; 874 uint32_t reg_value; 875 boolean_t complete = TRUE; 876 877 m = *mpp; 878 if (!m) 879 return EINVAL; 880 881 if (!(m->m_flags & M_PKTHDR)) { 882 rc = ENXIO; 883 goto free_ret; 884 } 885 886 if(oce_tx_asic_stall_verify(sc, m)) { 887 m = oce_insert_vlan_tag(sc, m, &complete); 888 if(!m) { 889 device_printf(sc->dev, "Insertion unsuccessful\n"); 890 return 0; 891 } 892 893 } 894 895 if (m->m_pkthdr.csum_flags & CSUM_TSO) { 896 /* consolidate packet buffers for TSO/LSO segment offload */ 897#if defined(INET6) || defined(INET) 898 m = oce_tso_setup(sc, mpp); 899#else 900 m = NULL; 901#endif 902 if (m == NULL) { 903 rc = ENXIO; 904 goto free_ret; 905 } 906 } 907 908 pd = &wq->pckts[wq->pkt_desc_head]; 909retry: 910 rc = bus_dmamap_load_mbuf_sg(wq->tag, 911 pd->map, 912 m, segs, &pd->nsegs, BUS_DMA_NOWAIT); 913 if (rc == 0) { 914 num_wqes = pd->nsegs + 1; 915 if (IS_BE(sc) || IS_SH(sc)) { 916 /*Dummy required only for BE3.*/ 917 if (num_wqes & 1) 918 num_wqes++; 919 } 920 if (num_wqes >= RING_NUM_FREE(wq->ring)) { 921 bus_dmamap_unload(wq->tag, pd->map); 922 return EBUSY; 923 } 924 atomic_store_rel_int(&wq->pkt_desc_head, 925 (wq->pkt_desc_head + 1) % \ 926 OCE_WQ_PACKET_ARRAY_SIZE); 927 bus_dmamap_sync(wq->tag, pd->map, BUS_DMASYNC_PREWRITE); 928 pd->mbuf = m; 929 930 nichdr = 931 RING_GET_PRODUCER_ITEM_VA(wq->ring, struct oce_nic_hdr_wqe); 932 nichdr->u0.dw[0] = 0; 933 nichdr->u0.dw[1] = 0; 934 nichdr->u0.dw[2] = 0; 935 nichdr->u0.dw[3] = 0; 936 937 nichdr->u0.s.complete = complete; 938 nichdr->u0.s.event = 1; 939 nichdr->u0.s.crc = 1; 940 nichdr->u0.s.forward = 0; 941 nichdr->u0.s.ipcs = (m->m_pkthdr.csum_flags & CSUM_IP) ? 1 : 0; 942 nichdr->u0.s.udpcs = 943 (m->m_pkthdr.csum_flags & CSUM_UDP) ? 1 : 0; 944 nichdr->u0.s.tcpcs = 945 (m->m_pkthdr.csum_flags & CSUM_TCP) ? 1 : 0; 946 nichdr->u0.s.num_wqe = num_wqes; 947 nichdr->u0.s.total_length = m->m_pkthdr.len; 948 949 if (m->m_flags & M_VLANTAG) { 950 nichdr->u0.s.vlan = 1; /*Vlan present*/ 951 nichdr->u0.s.vlan_tag = m->m_pkthdr.ether_vtag; 952 } 953 954 if (m->m_pkthdr.csum_flags & CSUM_TSO) { 955 if (m->m_pkthdr.tso_segsz) { 956 nichdr->u0.s.lso = 1; 957 nichdr->u0.s.lso_mss = m->m_pkthdr.tso_segsz; 958 } 959 if (!IS_BE(sc) || !IS_SH(sc)) 960 nichdr->u0.s.ipcs = 1; 961 } 962 963 RING_PUT(wq->ring, 1); 964 atomic_add_int(&wq->ring->num_used, 1); 965 966 for (i = 0; i < pd->nsegs; i++) { 967 nicfrag = 968 RING_GET_PRODUCER_ITEM_VA(wq->ring, 969 struct oce_nic_frag_wqe); 970 nicfrag->u0.s.rsvd0 = 0; 971 nicfrag->u0.s.frag_pa_hi = ADDR_HI(segs[i].ds_addr); 972 nicfrag->u0.s.frag_pa_lo = ADDR_LO(segs[i].ds_addr); 973 nicfrag->u0.s.frag_len = segs[i].ds_len; 974 pd->wqe_idx = wq->ring->pidx; 975 RING_PUT(wq->ring, 1); 976 atomic_add_int(&wq->ring->num_used, 1); 977 } 978 if (num_wqes > (pd->nsegs + 1)) { 979 nicfrag = 980 RING_GET_PRODUCER_ITEM_VA(wq->ring, 981 struct oce_nic_frag_wqe); 982 nicfrag->u0.dw[0] = 0; 983 nicfrag->u0.dw[1] = 0; 984 nicfrag->u0.dw[2] = 0; 985 nicfrag->u0.dw[3] = 0; 986 pd->wqe_idx = wq->ring->pidx; 987 RING_PUT(wq->ring, 1); 988 atomic_add_int(&wq->ring->num_used, 1); 989 pd->nsegs++; 990 } 991 992 sc->ifp->if_opackets++; 993 wq->tx_stats.tx_reqs++; 994 wq->tx_stats.tx_wrbs += num_wqes; 995 wq->tx_stats.tx_bytes += m->m_pkthdr.len; 996 wq->tx_stats.tx_pkts++; 997 998 bus_dmamap_sync(wq->ring->dma.tag, wq->ring->dma.map, 999 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 1000 reg_value = (num_wqes << 16) | wq->wq_id; 1001 OCE_WRITE_REG32(sc, db, wq->db_offset, reg_value); 1002 1003 } else if (rc == EFBIG) { 1004 if (retry_cnt == 0) { 1005 m_temp = m_defrag(m, M_NOWAIT); 1006 if (m_temp == NULL) 1007 goto free_ret; 1008 m = m_temp; 1009 *mpp = m_temp; 1010 retry_cnt = retry_cnt + 1; 1011 goto retry; 1012 } else 1013 goto free_ret; 1014 } else if (rc == ENOMEM) 1015 return rc; 1016 else 1017 goto free_ret; 1018 1019 return 0; 1020 1021free_ret: 1022 m_freem(*mpp); 1023 *mpp = NULL; 1024 return rc; 1025} 1026 1027 1028static void 1029oce_tx_complete(struct oce_wq *wq, uint32_t wqe_idx, uint32_t status) 1030{ 1031 struct oce_packet_desc *pd; 1032 POCE_SOFTC sc = (POCE_SOFTC) wq->parent; 1033 struct mbuf *m; 1034 1035 pd = &wq->pckts[wq->pkt_desc_tail]; 1036 atomic_store_rel_int(&wq->pkt_desc_tail, 1037 (wq->pkt_desc_tail + 1) % OCE_WQ_PACKET_ARRAY_SIZE); 1038 atomic_subtract_int(&wq->ring->num_used, pd->nsegs + 1); 1039 bus_dmamap_sync(wq->tag, pd->map, BUS_DMASYNC_POSTWRITE); 1040 bus_dmamap_unload(wq->tag, pd->map); 1041 1042 m = pd->mbuf; 1043 m_freem(m); 1044 pd->mbuf = NULL; 1045 1046 1047 if (sc->ifp->if_drv_flags & IFF_DRV_OACTIVE) { 1048 if (wq->ring->num_used < (wq->ring->num_items / 2)) { 1049 sc->ifp->if_drv_flags &= ~(IFF_DRV_OACTIVE); 1050 oce_tx_restart(sc, wq); 1051 } 1052 } 1053} 1054 1055 1056static void 1057oce_tx_restart(POCE_SOFTC sc, struct oce_wq *wq) 1058{ 1059 1060 if ((sc->ifp->if_drv_flags & IFF_DRV_RUNNING) != IFF_DRV_RUNNING) 1061 return; 1062 1063#if __FreeBSD_version >= 800000 1064 if (!drbr_empty(sc->ifp, wq->br)) 1065#else 1066 if (!IFQ_DRV_IS_EMPTY(&sc->ifp->if_snd)) 1067#endif 1068 taskqueue_enqueue_fast(taskqueue_swi, &wq->txtask); 1069 1070} 1071 1072 1073#if defined(INET6) || defined(INET) 1074static struct mbuf * 1075oce_tso_setup(POCE_SOFTC sc, struct mbuf **mpp) 1076{ 1077 struct mbuf *m; 1078#ifdef INET 1079 struct ip *ip; 1080#endif 1081#ifdef INET6 1082 struct ip6_hdr *ip6; 1083#endif 1084 struct ether_vlan_header *eh; 1085 struct tcphdr *th; 1086 uint16_t etype; 1087 int total_len = 0, ehdrlen = 0; 1088 1089 m = *mpp; 1090 1091 if (M_WRITABLE(m) == 0) { 1092 m = m_dup(*mpp, M_NOWAIT); 1093 if (!m) 1094 return NULL; 1095 m_freem(*mpp); 1096 *mpp = m; 1097 } 1098 1099 eh = mtod(m, struct ether_vlan_header *); 1100 if (eh->evl_encap_proto == htons(ETHERTYPE_VLAN)) { 1101 etype = ntohs(eh->evl_proto); 1102 ehdrlen = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN; 1103 } else { 1104 etype = ntohs(eh->evl_encap_proto); 1105 ehdrlen = ETHER_HDR_LEN; 1106 } 1107 1108 switch (etype) { 1109#ifdef INET 1110 case ETHERTYPE_IP: 1111 ip = (struct ip *)(m->m_data + ehdrlen); 1112 if (ip->ip_p != IPPROTO_TCP) 1113 return NULL; 1114 th = (struct tcphdr *)((caddr_t)ip + (ip->ip_hl << 2)); 1115 1116 total_len = ehdrlen + (ip->ip_hl << 2) + (th->th_off << 2); 1117 break; 1118#endif 1119#ifdef INET6 1120 case ETHERTYPE_IPV6: 1121 ip6 = (struct ip6_hdr *)(m->m_data + ehdrlen); 1122 if (ip6->ip6_nxt != IPPROTO_TCP) 1123 return NULL; 1124 th = (struct tcphdr *)((caddr_t)ip6 + sizeof(struct ip6_hdr)); 1125 1126 total_len = ehdrlen + sizeof(struct ip6_hdr) + (th->th_off << 2); 1127 break; 1128#endif 1129 default: 1130 return NULL; 1131 } 1132 1133 m = m_pullup(m, total_len); 1134 if (!m) 1135 return NULL; 1136 *mpp = m; 1137 return m; 1138 1139} 1140#endif /* INET6 || INET */ 1141 1142void 1143oce_tx_task(void *arg, int npending) 1144{ 1145 struct oce_wq *wq = arg; 1146 POCE_SOFTC sc = wq->parent; 1147 struct ifnet *ifp = sc->ifp; 1148 int rc = 0; 1149 1150#if __FreeBSD_version >= 800000 1151 LOCK(&wq->tx_lock); 1152 rc = oce_multiq_transmit(ifp, NULL, wq); 1153 if (rc) { 1154 device_printf(sc->dev, 1155 "TX[%d] restart failed\n", wq->queue_index); 1156 } 1157 UNLOCK(&wq->tx_lock); 1158#else 1159 oce_start(ifp); 1160#endif 1161 1162} 1163 1164 1165void 1166oce_start(struct ifnet *ifp) 1167{ 1168 POCE_SOFTC sc = ifp->if_softc; 1169 struct mbuf *m; 1170 int rc = 0; 1171 int def_q = 0; /* Defualt tx queue is 0*/ 1172 1173 if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != 1174 IFF_DRV_RUNNING) 1175 return; 1176 1177 if (!sc->link_status) 1178 return; 1179 1180 do { 1181 IF_DEQUEUE(&sc->ifp->if_snd, m); 1182 if (m == NULL) 1183 break; 1184 1185 LOCK(&sc->wq[def_q]->tx_lock); 1186 rc = oce_tx(sc, &m, def_q); 1187 UNLOCK(&sc->wq[def_q]->tx_lock); 1188 if (rc) { 1189 if (m != NULL) { 1190 sc->wq[def_q]->tx_stats.tx_stops ++; 1191 ifp->if_drv_flags |= IFF_DRV_OACTIVE; 1192 IFQ_DRV_PREPEND(&ifp->if_snd, m); 1193 m = NULL; 1194 } 1195 break; 1196 } 1197 if (m != NULL) 1198 ETHER_BPF_MTAP(ifp, m); 1199 1200 } while (TRUE); 1201 1202 return; 1203} 1204 1205 1206/* Handle the Completion Queue for transmit */ 1207uint16_t 1208oce_wq_handler(void *arg) 1209{ 1210 struct oce_wq *wq = (struct oce_wq *)arg; 1211 POCE_SOFTC sc = wq->parent; 1212 struct oce_cq *cq = wq->cq; 1213 struct oce_nic_tx_cqe *cqe; 1214 int num_cqes = 0; 1215 1216 bus_dmamap_sync(cq->ring->dma.tag, 1217 cq->ring->dma.map, BUS_DMASYNC_POSTWRITE); 1218 cqe = RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_nic_tx_cqe); 1219 while (cqe->u0.dw[3]) { 1220 DW_SWAP((uint32_t *) cqe, sizeof(oce_wq_cqe)); 1221 1222 wq->ring->cidx = cqe->u0.s.wqe_index + 1; 1223 if (wq->ring->cidx >= wq->ring->num_items) 1224 wq->ring->cidx -= wq->ring->num_items; 1225 1226 oce_tx_complete(wq, cqe->u0.s.wqe_index, cqe->u0.s.status); 1227 wq->tx_stats.tx_compl++; 1228 cqe->u0.dw[3] = 0; 1229 RING_GET(cq->ring, 1); 1230 bus_dmamap_sync(cq->ring->dma.tag, 1231 cq->ring->dma.map, BUS_DMASYNC_POSTWRITE); 1232 cqe = 1233 RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_nic_tx_cqe); 1234 num_cqes++; 1235 } 1236 1237 if (num_cqes) 1238 oce_arm_cq(sc, cq->cq_id, num_cqes, FALSE); 1239 1240 return 0; 1241} 1242 1243 1244static int 1245oce_multiq_transmit(struct ifnet *ifp, struct mbuf *m, struct oce_wq *wq) 1246{ 1247 POCE_SOFTC sc = ifp->if_softc; 1248 int status = 0, queue_index = 0; 1249 struct mbuf *next = NULL; 1250 struct buf_ring *br = NULL; 1251 1252 br = wq->br; 1253 queue_index = wq->queue_index; 1254 1255 if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != 1256 IFF_DRV_RUNNING) { 1257 if (m != NULL) 1258 status = drbr_enqueue(ifp, br, m); 1259 return status; 1260 } 1261 1262 if (m != NULL) { 1263 if ((status = drbr_enqueue(ifp, br, m)) != 0) 1264 return status; 1265 } 1266 while ((next = drbr_peek(ifp, br)) != NULL) { 1267 if (oce_tx(sc, &next, queue_index)) { 1268 if (next == NULL) { 1269 drbr_advance(ifp, br); 1270 } else { 1271 drbr_putback(ifp, br, next); 1272 wq->tx_stats.tx_stops ++; 1273 ifp->if_drv_flags |= IFF_DRV_OACTIVE; 1274 } 1275 break; 1276 } 1277 drbr_advance(ifp, br); 1278 ifp->if_obytes += next->m_pkthdr.len; 1279 if (next->m_flags & M_MCAST) 1280 ifp->if_omcasts++; 1281 ETHER_BPF_MTAP(ifp, next); 1282 } 1283 1284 return 0; 1285} 1286 1287 1288 1289 1290/***************************************************************************** 1291 * Receive routines functions * 1292 *****************************************************************************/ 1293 1294static void 1295oce_rx(struct oce_rq *rq, uint32_t rqe_idx, struct oce_nic_rx_cqe *cqe) 1296{ 1297 uint32_t out; 1298 struct oce_packet_desc *pd; 1299 POCE_SOFTC sc = (POCE_SOFTC) rq->parent; 1300 int i, len, frag_len; 1301 struct mbuf *m = NULL, *tail = NULL; 1302 uint16_t vtag; 1303 1304 len = cqe->u0.s.pkt_size; 1305 if (!len) { 1306 /*partial DMA workaround for Lancer*/ 1307 oce_discard_rx_comp(rq, cqe); 1308 goto exit; 1309 } 1310 1311 /* Get vlan_tag value */ 1312 if(IS_BE(sc) || IS_SH(sc)) 1313 vtag = BSWAP_16(cqe->u0.s.vlan_tag); 1314 else 1315 vtag = cqe->u0.s.vlan_tag; 1316 1317 1318 for (i = 0; i < cqe->u0.s.num_fragments; i++) { 1319 1320 if (rq->packets_out == rq->packets_in) { 1321 device_printf(sc->dev, 1322 "RQ transmit descriptor missing\n"); 1323 } 1324 out = rq->packets_out + 1; 1325 if (out == OCE_RQ_PACKET_ARRAY_SIZE) 1326 out = 0; 1327 pd = &rq->pckts[rq->packets_out]; 1328 rq->packets_out = out; 1329 1330 bus_dmamap_sync(rq->tag, pd->map, BUS_DMASYNC_POSTWRITE); 1331 bus_dmamap_unload(rq->tag, pd->map); 1332 rq->pending--; 1333 1334 frag_len = (len > rq->cfg.frag_size) ? rq->cfg.frag_size : len; 1335 pd->mbuf->m_len = frag_len; 1336 1337 if (tail != NULL) { 1338 /* additional fragments */ 1339 pd->mbuf->m_flags &= ~M_PKTHDR; 1340 tail->m_next = pd->mbuf; 1341 tail = pd->mbuf; 1342 } else { 1343 /* first fragment, fill out much of the packet header */ 1344 pd->mbuf->m_pkthdr.len = len; 1345 pd->mbuf->m_pkthdr.csum_flags = 0; 1346 if (IF_CSUM_ENABLED(sc)) { 1347 if (cqe->u0.s.l4_cksum_pass) { 1348 pd->mbuf->m_pkthdr.csum_flags |= 1349 (CSUM_DATA_VALID | CSUM_PSEUDO_HDR); 1350 pd->mbuf->m_pkthdr.csum_data = 0xffff; 1351 } 1352 if (cqe->u0.s.ip_cksum_pass) { 1353 if (!cqe->u0.s.ip_ver) { /* IPV4 */ 1354 pd->mbuf->m_pkthdr.csum_flags |= 1355 (CSUM_IP_CHECKED|CSUM_IP_VALID); 1356 } 1357 } 1358 } 1359 m = tail = pd->mbuf; 1360 } 1361 pd->mbuf = NULL; 1362 len -= frag_len; 1363 } 1364 1365 if (m) { 1366 if (!oce_cqe_portid_valid(sc, cqe)) { 1367 m_freem(m); 1368 goto exit; 1369 } 1370 1371 m->m_pkthdr.rcvif = sc->ifp; 1372#if __FreeBSD_version >= 800000 1373 if (rq->queue_index) 1374 m->m_pkthdr.flowid = (rq->queue_index - 1); 1375 else 1376 m->m_pkthdr.flowid = rq->queue_index; 1377 M_HASHTYPE_SET(m, M_HASHTYPE_OPAQUE); 1378#endif 1379 /* This deternies if vlan tag is Valid */ 1380 if (oce_cqe_vtp_valid(sc, cqe)) { 1381 if (sc->function_mode & FNM_FLEX10_MODE) { 1382 /* FLEX10. If QnQ is not set, neglect VLAN */ 1383 if (cqe->u0.s.qnq) { 1384 m->m_pkthdr.ether_vtag = vtag; 1385 m->m_flags |= M_VLANTAG; 1386 } 1387 } else if (sc->pvid != (vtag & VLAN_VID_MASK)) { 1388 /* In UMC mode generally pvid will be striped by 1389 hw. But in some cases we have seen it comes 1390 with pvid. So if pvid == vlan, neglect vlan. 1391 */ 1392 m->m_pkthdr.ether_vtag = vtag; 1393 m->m_flags |= M_VLANTAG; 1394 } 1395 } 1396 1397 sc->ifp->if_ipackets++; 1398#if defined(INET6) || defined(INET) 1399 /* Try to queue to LRO */ 1400 if (IF_LRO_ENABLED(sc) && 1401 (cqe->u0.s.ip_cksum_pass) && 1402 (cqe->u0.s.l4_cksum_pass) && 1403 (!cqe->u0.s.ip_ver) && 1404 (rq->lro.lro_cnt != 0)) { 1405 1406 if (tcp_lro_rx(&rq->lro, m, 0) == 0) { 1407 rq->lro_pkts_queued ++; 1408 goto post_done; 1409 } 1410 /* If LRO posting fails then try to post to STACK */ 1411 } 1412#endif 1413 1414 (*sc->ifp->if_input) (sc->ifp, m); 1415#if defined(INET6) || defined(INET) 1416post_done: 1417#endif 1418 /* Update rx stats per queue */ 1419 rq->rx_stats.rx_pkts++; 1420 rq->rx_stats.rx_bytes += cqe->u0.s.pkt_size; 1421 rq->rx_stats.rx_frags += cqe->u0.s.num_fragments; 1422 if (cqe->u0.s.pkt_type == OCE_MULTICAST_PACKET) 1423 rq->rx_stats.rx_mcast_pkts++; 1424 if (cqe->u0.s.pkt_type == OCE_UNICAST_PACKET) 1425 rq->rx_stats.rx_ucast_pkts++; 1426 } 1427exit: 1428 return; 1429} 1430 1431 1432static void 1433oce_discard_rx_comp(struct oce_rq *rq, struct oce_nic_rx_cqe *cqe) 1434{ 1435 uint32_t out, i = 0; 1436 struct oce_packet_desc *pd; 1437 POCE_SOFTC sc = (POCE_SOFTC) rq->parent; 1438 int num_frags = cqe->u0.s.num_fragments; 1439 1440 for (i = 0; i < num_frags; i++) { 1441 if (rq->packets_out == rq->packets_in) { 1442 device_printf(sc->dev, 1443 "RQ transmit descriptor missing\n"); 1444 } 1445 out = rq->packets_out + 1; 1446 if (out == OCE_RQ_PACKET_ARRAY_SIZE) 1447 out = 0; 1448 pd = &rq->pckts[rq->packets_out]; 1449 rq->packets_out = out; 1450 1451 bus_dmamap_sync(rq->tag, pd->map, BUS_DMASYNC_POSTWRITE); 1452 bus_dmamap_unload(rq->tag, pd->map); 1453 rq->pending--; 1454 m_freem(pd->mbuf); 1455 } 1456 1457} 1458 1459 1460static int 1461oce_cqe_vtp_valid(POCE_SOFTC sc, struct oce_nic_rx_cqe *cqe) 1462{ 1463 struct oce_nic_rx_cqe_v1 *cqe_v1; 1464 int vtp = 0; 1465 1466 if (sc->be3_native) { 1467 cqe_v1 = (struct oce_nic_rx_cqe_v1 *)cqe; 1468 vtp = cqe_v1->u0.s.vlan_tag_present; 1469 } else 1470 vtp = cqe->u0.s.vlan_tag_present; 1471 1472 return vtp; 1473 1474} 1475 1476 1477static int 1478oce_cqe_portid_valid(POCE_SOFTC sc, struct oce_nic_rx_cqe *cqe) 1479{ 1480 struct oce_nic_rx_cqe_v1 *cqe_v1; 1481 int port_id = 0; 1482 1483 if (sc->be3_native && (IS_BE(sc) || IS_SH(sc))) { 1484 cqe_v1 = (struct oce_nic_rx_cqe_v1 *)cqe; 1485 port_id = cqe_v1->u0.s.port; 1486 if (sc->port_id != port_id) 1487 return 0; 1488 } else 1489 ;/* For BE3 legacy and Lancer this is dummy */ 1490 1491 return 1; 1492 1493} 1494 1495#if defined(INET6) || defined(INET) 1496static void 1497oce_rx_flush_lro(struct oce_rq *rq) 1498{ 1499 struct lro_ctrl *lro = &rq->lro; 1500 struct lro_entry *queued; 1501 POCE_SOFTC sc = (POCE_SOFTC) rq->parent; 1502 1503 if (!IF_LRO_ENABLED(sc)) 1504 return; 1505 1506 while ((queued = SLIST_FIRST(&lro->lro_active)) != NULL) { 1507 SLIST_REMOVE_HEAD(&lro->lro_active, next); 1508 tcp_lro_flush(lro, queued); 1509 } 1510 rq->lro_pkts_queued = 0; 1511 1512 return; 1513} 1514 1515 1516static int 1517oce_init_lro(POCE_SOFTC sc) 1518{ 1519 struct lro_ctrl *lro = NULL; 1520 int i = 0, rc = 0; 1521 1522 for (i = 0; i < sc->nrqs; i++) { 1523 lro = &sc->rq[i]->lro; 1524 rc = tcp_lro_init(lro); 1525 if (rc != 0) { 1526 device_printf(sc->dev, "LRO init failed\n"); 1527 return rc; 1528 } 1529 lro->ifp = sc->ifp; 1530 } 1531 1532 return rc; 1533} 1534 1535 1536void 1537oce_free_lro(POCE_SOFTC sc) 1538{ 1539 struct lro_ctrl *lro = NULL; 1540 int i = 0; 1541 1542 for (i = 0; i < sc->nrqs; i++) { 1543 lro = &sc->rq[i]->lro; 1544 if (lro) 1545 tcp_lro_free(lro); 1546 } 1547} 1548#endif 1549 1550int 1551oce_alloc_rx_bufs(struct oce_rq *rq, int count) 1552{ 1553 POCE_SOFTC sc = (POCE_SOFTC) rq->parent; 1554 int i, in, rc; 1555 struct oce_packet_desc *pd; 1556 bus_dma_segment_t segs[6]; 1557 int nsegs, added = 0; 1558 struct oce_nic_rqe *rqe; 1559 pd_rxulp_db_t rxdb_reg; 1560 1561 bzero(&rxdb_reg, sizeof(pd_rxulp_db_t)); 1562 for (i = 0; i < count; i++) { 1563 in = rq->packets_in + 1; 1564 if (in == OCE_RQ_PACKET_ARRAY_SIZE) 1565 in = 0; 1566 if (in == rq->packets_out) 1567 break; /* no more room */ 1568 1569 pd = &rq->pckts[rq->packets_in]; 1570 pd->mbuf = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR); 1571 if (pd->mbuf == NULL) 1572 break; 1573 1574 pd->mbuf->m_len = pd->mbuf->m_pkthdr.len = MCLBYTES; 1575 rc = bus_dmamap_load_mbuf_sg(rq->tag, 1576 pd->map, 1577 pd->mbuf, 1578 segs, &nsegs, BUS_DMA_NOWAIT); 1579 if (rc) { 1580 m_free(pd->mbuf); 1581 break; 1582 } 1583 1584 if (nsegs != 1) { 1585 i--; 1586 continue; 1587 } 1588 1589 rq->packets_in = in; 1590 bus_dmamap_sync(rq->tag, pd->map, BUS_DMASYNC_PREREAD); 1591 1592 rqe = RING_GET_PRODUCER_ITEM_VA(rq->ring, struct oce_nic_rqe); 1593 rqe->u0.s.frag_pa_hi = ADDR_HI(segs[0].ds_addr); 1594 rqe->u0.s.frag_pa_lo = ADDR_LO(segs[0].ds_addr); 1595 DW_SWAP(u32ptr(rqe), sizeof(struct oce_nic_rqe)); 1596 RING_PUT(rq->ring, 1); 1597 added++; 1598 rq->pending++; 1599 } 1600 if (added != 0) { 1601 for (i = added / OCE_MAX_RQ_POSTS; i > 0; i--) { 1602 rxdb_reg.bits.num_posted = OCE_MAX_RQ_POSTS; 1603 rxdb_reg.bits.qid = rq->rq_id; 1604 OCE_WRITE_REG32(sc, db, PD_RXULP_DB, rxdb_reg.dw0); 1605 added -= OCE_MAX_RQ_POSTS; 1606 } 1607 if (added > 0) { 1608 rxdb_reg.bits.qid = rq->rq_id; 1609 rxdb_reg.bits.num_posted = added; 1610 OCE_WRITE_REG32(sc, db, PD_RXULP_DB, rxdb_reg.dw0); 1611 } 1612 } 1613 1614 return 0; 1615} 1616 1617 1618/* Handle the Completion Queue for receive */ 1619uint16_t 1620oce_rq_handler(void *arg) 1621{ 1622 struct oce_rq *rq = (struct oce_rq *)arg; 1623 struct oce_cq *cq = rq->cq; 1624 POCE_SOFTC sc = rq->parent; 1625 struct oce_nic_rx_cqe *cqe; 1626 int num_cqes = 0, rq_buffers_used = 0; 1627 1628 1629 bus_dmamap_sync(cq->ring->dma.tag, 1630 cq->ring->dma.map, BUS_DMASYNC_POSTWRITE); 1631 cqe = RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_nic_rx_cqe); 1632 while (cqe->u0.dw[2]) { 1633 DW_SWAP((uint32_t *) cqe, sizeof(oce_rq_cqe)); 1634 1635 RING_GET(rq->ring, 1); 1636 if (cqe->u0.s.error == 0) { 1637 oce_rx(rq, cqe->u0.s.frag_index, cqe); 1638 } else { 1639 rq->rx_stats.rxcp_err++; 1640 sc->ifp->if_ierrors++; 1641 /* Post L3/L4 errors to stack.*/ 1642 oce_rx(rq, cqe->u0.s.frag_index, cqe); 1643 } 1644 rq->rx_stats.rx_compl++; 1645 cqe->u0.dw[2] = 0; 1646 1647#if defined(INET6) || defined(INET) 1648 if (IF_LRO_ENABLED(sc) && rq->lro_pkts_queued >= 16) { 1649 oce_rx_flush_lro(rq); 1650 } 1651#endif 1652 1653 RING_GET(cq->ring, 1); 1654 bus_dmamap_sync(cq->ring->dma.tag, 1655 cq->ring->dma.map, BUS_DMASYNC_POSTWRITE); 1656 cqe = 1657 RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_nic_rx_cqe); 1658 num_cqes++; 1659 if (num_cqes >= (IS_XE201(sc) ? 8 : oce_max_rsp_handled)) 1660 break; 1661 } 1662 1663#if defined(INET6) || defined(INET) 1664 if (IF_LRO_ENABLED(sc)) 1665 oce_rx_flush_lro(rq); 1666#endif 1667 1668 if (num_cqes) { 1669 oce_arm_cq(sc, cq->cq_id, num_cqes, FALSE); 1670 rq_buffers_used = OCE_RQ_PACKET_ARRAY_SIZE - rq->pending; 1671 if (rq_buffers_used > 1) 1672 oce_alloc_rx_bufs(rq, (rq_buffers_used - 1)); 1673 } 1674 1675 return 0; 1676 1677} 1678 1679 1680 1681 1682/***************************************************************************** 1683 * Helper function prototypes in this file * 1684 *****************************************************************************/ 1685 1686static int 1687oce_attach_ifp(POCE_SOFTC sc) 1688{ 1689 1690 sc->ifp = if_alloc(IFT_ETHER); 1691 if (!sc->ifp) 1692 return ENOMEM; 1693 1694 ifmedia_init(&sc->media, IFM_IMASK, oce_media_change, oce_media_status); 1695 ifmedia_add(&sc->media, IFM_ETHER | IFM_AUTO, 0, NULL); 1696 ifmedia_set(&sc->media, IFM_ETHER | IFM_AUTO); 1697 1698 sc->ifp->if_flags = IFF_BROADCAST | IFF_MULTICAST; 1699 sc->ifp->if_ioctl = oce_ioctl; 1700 sc->ifp->if_start = oce_start; 1701 sc->ifp->if_init = oce_init; 1702 sc->ifp->if_mtu = ETHERMTU; 1703 sc->ifp->if_softc = sc; 1704#if __FreeBSD_version >= 800000 1705 sc->ifp->if_transmit = oce_multiq_start; 1706 sc->ifp->if_qflush = oce_multiq_flush; 1707#endif 1708 1709 if_initname(sc->ifp, 1710 device_get_name(sc->dev), device_get_unit(sc->dev)); 1711 1712 sc->ifp->if_snd.ifq_drv_maxlen = OCE_MAX_TX_DESC - 1; 1713 IFQ_SET_MAXLEN(&sc->ifp->if_snd, sc->ifp->if_snd.ifq_drv_maxlen); 1714 IFQ_SET_READY(&sc->ifp->if_snd); 1715 1716 sc->ifp->if_hwassist = OCE_IF_HWASSIST; 1717 sc->ifp->if_hwassist |= CSUM_TSO; 1718 sc->ifp->if_hwassist |= (CSUM_IP | CSUM_TCP | CSUM_UDP); 1719 1720 sc->ifp->if_capabilities = OCE_IF_CAPABILITIES; 1721 sc->ifp->if_capabilities |= IFCAP_HWCSUM; 1722 sc->ifp->if_capabilities |= IFCAP_VLAN_HWFILTER; 1723 1724#if defined(INET6) || defined(INET) 1725 sc->ifp->if_capabilities |= IFCAP_TSO; 1726 sc->ifp->if_capabilities |= IFCAP_LRO; 1727 sc->ifp->if_capabilities |= IFCAP_VLAN_HWTSO; 1728#endif 1729 1730 sc->ifp->if_capenable = sc->ifp->if_capabilities; 1731 if_initbaudrate(sc->ifp, IF_Gbps(10)); 1732 1733#if __FreeBSD_version >= 1000000 1734 sc->ifp->if_hw_tsomax = 65536 - (ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN); 1735 sc->ifp->if_hw_tsomaxsegcount = OCE_MAX_TX_ELEMENTS; 1736 sc->ifp->if_hw_tsomaxsegsize = 4096; 1737#endif 1738 1739 ether_ifattach(sc->ifp, sc->macaddr.mac_addr); 1740 1741 return 0; 1742} 1743 1744 1745static void 1746oce_add_vlan(void *arg, struct ifnet *ifp, uint16_t vtag) 1747{ 1748 POCE_SOFTC sc = ifp->if_softc; 1749 1750 if (ifp->if_softc != arg) 1751 return; 1752 if ((vtag == 0) || (vtag > 4095)) 1753 return; 1754 1755 sc->vlan_tag[vtag] = 1; 1756 sc->vlans_added++; 1757 if (sc->vlans_added <= (sc->max_vlans + 1)) 1758 oce_vid_config(sc); 1759} 1760 1761 1762static void 1763oce_del_vlan(void *arg, struct ifnet *ifp, uint16_t vtag) 1764{ 1765 POCE_SOFTC sc = ifp->if_softc; 1766 1767 if (ifp->if_softc != arg) 1768 return; 1769 if ((vtag == 0) || (vtag > 4095)) 1770 return; 1771 1772 sc->vlan_tag[vtag] = 0; 1773 sc->vlans_added--; 1774 oce_vid_config(sc); 1775} 1776 1777 1778/* 1779 * A max of 64 vlans can be configured in BE. If the user configures 1780 * more, place the card in vlan promiscuous mode. 1781 */ 1782static int 1783oce_vid_config(POCE_SOFTC sc) 1784{ 1785 struct normal_vlan vtags[MAX_VLANFILTER_SIZE]; 1786 uint16_t ntags = 0, i; 1787 int status = 0; 1788 1789 if ((sc->vlans_added <= MAX_VLANFILTER_SIZE) && 1790 (sc->ifp->if_capenable & IFCAP_VLAN_HWFILTER)) { 1791 for (i = 0; i < MAX_VLANS; i++) { 1792 if (sc->vlan_tag[i]) { 1793 vtags[ntags].vtag = i; 1794 ntags++; 1795 } 1796 } 1797 if (ntags) 1798 status = oce_config_vlan(sc, (uint8_t) sc->if_id, 1799 vtags, ntags, 1, 0); 1800 } else 1801 status = oce_config_vlan(sc, (uint8_t) sc->if_id, 1802 NULL, 0, 1, 1); 1803 return status; 1804} 1805 1806 1807static void 1808oce_mac_addr_set(POCE_SOFTC sc) 1809{ 1810 uint32_t old_pmac_id = sc->pmac_id; 1811 int status = 0; 1812 1813 1814 status = bcmp((IF_LLADDR(sc->ifp)), sc->macaddr.mac_addr, 1815 sc->macaddr.size_of_struct); 1816 if (!status) 1817 return; 1818 1819 status = oce_mbox_macaddr_add(sc, (uint8_t *)(IF_LLADDR(sc->ifp)), 1820 sc->if_id, &sc->pmac_id); 1821 if (!status) { 1822 status = oce_mbox_macaddr_del(sc, sc->if_id, old_pmac_id); 1823 bcopy((IF_LLADDR(sc->ifp)), sc->macaddr.mac_addr, 1824 sc->macaddr.size_of_struct); 1825 } 1826 if (status) 1827 device_printf(sc->dev, "Failed update macaddress\n"); 1828 1829} 1830 1831 1832static int 1833oce_handle_passthrough(struct ifnet *ifp, caddr_t data) 1834{ 1835 POCE_SOFTC sc = ifp->if_softc; 1836 struct ifreq *ifr = (struct ifreq *)data; 1837 int rc = ENXIO; 1838 char cookie[32] = {0}; 1839 void *priv_data = (void *)ifr->ifr_data; 1840 void *ioctl_ptr; 1841 uint32_t req_size; 1842 struct mbx_hdr req; 1843 OCE_DMA_MEM dma_mem; 1844 struct mbx_common_get_cntl_attr *fw_cmd; 1845 1846 if (copyin(priv_data, cookie, strlen(IOCTL_COOKIE))) 1847 return EFAULT; 1848 1849 if (memcmp(cookie, IOCTL_COOKIE, strlen(IOCTL_COOKIE))) 1850 return EINVAL; 1851 1852 ioctl_ptr = (char *)priv_data + strlen(IOCTL_COOKIE); 1853 if (copyin(ioctl_ptr, &req, sizeof(struct mbx_hdr))) 1854 return EFAULT; 1855 1856 req_size = le32toh(req.u0.req.request_length); 1857 if (req_size > 65536) 1858 return EINVAL; 1859 1860 req_size += sizeof(struct mbx_hdr); 1861 rc = oce_dma_alloc(sc, req_size, &dma_mem, 0); 1862 if (rc) 1863 return ENOMEM; 1864 1865 if (copyin(ioctl_ptr, OCE_DMAPTR(&dma_mem,char), req_size)) { 1866 rc = EFAULT; 1867 goto dma_free; 1868 } 1869 1870 rc = oce_pass_through_mbox(sc, &dma_mem, req_size); 1871 if (rc) { 1872 rc = EIO; 1873 goto dma_free; 1874 } 1875 1876 if (copyout(OCE_DMAPTR(&dma_mem,char), ioctl_ptr, req_size)) 1877 rc = EFAULT; 1878 1879 /* 1880 firmware is filling all the attributes for this ioctl except 1881 the driver version..so fill it 1882 */ 1883 if(req.u0.rsp.opcode == OPCODE_COMMON_GET_CNTL_ATTRIBUTES) { 1884 fw_cmd = (struct mbx_common_get_cntl_attr *) ioctl_ptr; 1885 strncpy(fw_cmd->params.rsp.cntl_attr_info.hba_attr.drv_ver_str, 1886 COMPONENT_REVISION, strlen(COMPONENT_REVISION)); 1887 } 1888 1889dma_free: 1890 oce_dma_free(sc, &dma_mem); 1891 return rc; 1892 1893} 1894 1895static void 1896oce_eqd_set_periodic(POCE_SOFTC sc) 1897{ 1898 struct oce_set_eqd set_eqd[OCE_MAX_EQ]; 1899 struct oce_aic_obj *aic; 1900 struct oce_eq *eqo; 1901 uint64_t now = 0, delta; 1902 int eqd, i, num = 0; 1903 uint32_t ips = 0; 1904 int tps; 1905 1906 for (i = 0 ; i < sc->neqs; i++) { 1907 eqo = sc->eq[i]; 1908 aic = &sc->aic_obj[i]; 1909 /* When setting the static eq delay from the user space */ 1910 if (!aic->enable) { 1911 eqd = aic->et_eqd; 1912 goto modify_eqd; 1913 } 1914 1915 now = ticks; 1916 1917 /* Over flow check */ 1918 if ((now < aic->ticks) || (eqo->intr < aic->intr_prev)) 1919 goto done; 1920 1921 delta = now - aic->ticks; 1922 tps = delta/hz; 1923 1924 /* Interrupt rate based on elapsed ticks */ 1925 if(tps) 1926 ips = (uint32_t)(eqo->intr - aic->intr_prev) / tps; 1927 1928 if (ips > INTR_RATE_HWM) 1929 eqd = aic->cur_eqd + 20; 1930 else if (ips < INTR_RATE_LWM) 1931 eqd = aic->cur_eqd / 2; 1932 else 1933 goto done; 1934 1935 if (eqd < 10) 1936 eqd = 0; 1937 1938 /* Make sure that the eq delay is in the known range */ 1939 eqd = min(eqd, aic->max_eqd); 1940 eqd = max(eqd, aic->min_eqd); 1941 1942modify_eqd: 1943 if (eqd != aic->cur_eqd) { 1944 set_eqd[num].delay_multiplier = (eqd * 65)/100; 1945 set_eqd[num].eq_id = eqo->eq_id; 1946 aic->cur_eqd = eqd; 1947 num++; 1948 } 1949done: 1950 aic->intr_prev = eqo->intr; 1951 aic->ticks = now; 1952 } 1953 1954 /* Is there atleast one eq that needs to be modified? */ 1955 if(num) 1956 oce_mbox_eqd_modify_periodic(sc, set_eqd, num); 1957} 1958 1959static void oce_detect_hw_error(POCE_SOFTC sc) 1960{ 1961 1962 uint32_t ue_low = 0, ue_high = 0, ue_low_mask = 0, ue_high_mask = 0; 1963 uint32_t sliport_status = 0, sliport_err1 = 0, sliport_err2 = 0; 1964 uint32_t i; 1965 1966 if (sc->hw_error) 1967 return; 1968 1969 if (IS_XE201(sc)) { 1970 sliport_status = OCE_READ_REG32(sc, db, SLIPORT_STATUS_OFFSET); 1971 if (sliport_status & SLIPORT_STATUS_ERR_MASK) { 1972 sliport_err1 = OCE_READ_REG32(sc, db, SLIPORT_ERROR1_OFFSET); 1973 sliport_err2 = OCE_READ_REG32(sc, db, SLIPORT_ERROR2_OFFSET); 1974 } 1975 } else { 1976 ue_low = OCE_READ_REG32(sc, devcfg, PCICFG_UE_STATUS_LOW); 1977 ue_high = OCE_READ_REG32(sc, devcfg, PCICFG_UE_STATUS_HIGH); 1978 ue_low_mask = OCE_READ_REG32(sc, devcfg, PCICFG_UE_STATUS_LOW_MASK); 1979 ue_high_mask = OCE_READ_REG32(sc, devcfg, PCICFG_UE_STATUS_HI_MASK); 1980 1981 ue_low = (ue_low & ~ue_low_mask); 1982 ue_high = (ue_high & ~ue_high_mask); 1983 } 1984 1985 /* On certain platforms BE hardware can indicate spurious UEs. 1986 * Allow the h/w to stop working completely in case of a real UE. 1987 * Hence not setting the hw_error for UE detection. 1988 */ 1989 if (sliport_status & SLIPORT_STATUS_ERR_MASK) { 1990 sc->hw_error = TRUE; 1991 device_printf(sc->dev, "Error detected in the card\n"); 1992 } 1993 1994 if (sliport_status & SLIPORT_STATUS_ERR_MASK) { 1995 device_printf(sc->dev, 1996 "ERR: sliport status 0x%x\n", sliport_status); 1997 device_printf(sc->dev, 1998 "ERR: sliport error1 0x%x\n", sliport_err1); 1999 device_printf(sc->dev, 2000 "ERR: sliport error2 0x%x\n", sliport_err2); 2001 } 2002 2003 if (ue_low) { 2004 for (i = 0; ue_low; ue_low >>= 1, i++) { 2005 if (ue_low & 1) 2006 device_printf(sc->dev, "UE: %s bit set\n", 2007 ue_status_low_desc[i]); 2008 } 2009 } 2010 2011 if (ue_high) { 2012 for (i = 0; ue_high; ue_high >>= 1, i++) { 2013 if (ue_high & 1) 2014 device_printf(sc->dev, "UE: %s bit set\n", 2015 ue_status_hi_desc[i]); 2016 } 2017 } 2018 2019} 2020 2021 2022static void 2023oce_local_timer(void *arg) 2024{ 2025 POCE_SOFTC sc = arg; 2026 int i = 0; 2027 2028 oce_detect_hw_error(sc); 2029 oce_refresh_nic_stats(sc); 2030 oce_refresh_queue_stats(sc); 2031 oce_mac_addr_set(sc); 2032 2033 /* TX Watch Dog*/ 2034 for (i = 0; i < sc->nwqs; i++) 2035 oce_tx_restart(sc, sc->wq[i]); 2036 2037 /* calculate and set the eq delay for optimal interrupt rate */ 2038 if (IS_BE(sc) || IS_SH(sc)) 2039 oce_eqd_set_periodic(sc); 2040 2041 callout_reset(&sc->timer, hz, oce_local_timer, sc); 2042} 2043 2044 2045/* NOTE : This should only be called holding 2046 * DEVICE_LOCK. 2047 */ 2048static void 2049oce_if_deactivate(POCE_SOFTC sc) 2050{ 2051 int i, mtime = 0; 2052 int wait_req = 0; 2053 struct oce_rq *rq; 2054 struct oce_wq *wq; 2055 struct oce_eq *eq; 2056 2057 sc->ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); 2058 2059 /*Wait for max of 400ms for TX completions to be done */ 2060 while (mtime < 400) { 2061 wait_req = 0; 2062 for_all_wq_queues(sc, wq, i) { 2063 if (wq->ring->num_used) { 2064 wait_req = 1; 2065 DELAY(1); 2066 break; 2067 } 2068 } 2069 mtime += 1; 2070 if (!wait_req) 2071 break; 2072 } 2073 2074 /* Stop intrs and finish any bottom halves pending */ 2075 oce_hw_intr_disable(sc); 2076 2077 /* Since taskqueue_drain takes a Gaint Lock, We should not acquire 2078 any other lock. So unlock device lock and require after 2079 completing taskqueue_drain. 2080 */ 2081 UNLOCK(&sc->dev_lock); 2082 for (i = 0; i < sc->intr_count; i++) { 2083 if (sc->intrs[i].tq != NULL) { 2084 taskqueue_drain(sc->intrs[i].tq, &sc->intrs[i].task); 2085 } 2086 } 2087 LOCK(&sc->dev_lock); 2088 2089 /* Delete RX queue in card with flush param */ 2090 oce_stop_rx(sc); 2091 2092 /* Invalidate any pending cq and eq entries*/ 2093 for_all_evnt_queues(sc, eq, i) 2094 oce_drain_eq(eq); 2095 for_all_rq_queues(sc, rq, i) 2096 oce_drain_rq_cq(rq); 2097 for_all_wq_queues(sc, wq, i) 2098 oce_drain_wq_cq(wq); 2099 2100 /* But still we need to get MCC aync events. 2101 So enable intrs and also arm first EQ 2102 */ 2103 oce_hw_intr_enable(sc); 2104 oce_arm_eq(sc, sc->eq[0]->eq_id, 0, TRUE, FALSE); 2105 2106 DELAY(10); 2107} 2108 2109 2110static void 2111oce_if_activate(POCE_SOFTC sc) 2112{ 2113 struct oce_eq *eq; 2114 struct oce_rq *rq; 2115 struct oce_wq *wq; 2116 int i, rc = 0; 2117 2118 sc->ifp->if_drv_flags |= IFF_DRV_RUNNING; 2119 2120 oce_hw_intr_disable(sc); 2121 2122 oce_start_rx(sc); 2123 2124 for_all_rq_queues(sc, rq, i) { 2125 rc = oce_start_rq(rq); 2126 if (rc) 2127 device_printf(sc->dev, "Unable to start RX\n"); 2128 } 2129 2130 for_all_wq_queues(sc, wq, i) { 2131 rc = oce_start_wq(wq); 2132 if (rc) 2133 device_printf(sc->dev, "Unable to start TX\n"); 2134 } 2135 2136 2137 for_all_evnt_queues(sc, eq, i) 2138 oce_arm_eq(sc, eq->eq_id, 0, TRUE, FALSE); 2139 2140 oce_hw_intr_enable(sc); 2141 2142} 2143 2144static void 2145process_link_state(POCE_SOFTC sc, struct oce_async_cqe_link_state *acqe) 2146{ 2147 /* Update Link status */ 2148 if ((acqe->u0.s.link_status & ~ASYNC_EVENT_LOGICAL) == 2149 ASYNC_EVENT_LINK_UP) { 2150 sc->link_status = ASYNC_EVENT_LINK_UP; 2151 if_link_state_change(sc->ifp, LINK_STATE_UP); 2152 } else { 2153 sc->link_status = ASYNC_EVENT_LINK_DOWN; 2154 if_link_state_change(sc->ifp, LINK_STATE_DOWN); 2155 } 2156} 2157 2158 2159/* Handle the Completion Queue for the Mailbox/Async notifications */ 2160uint16_t 2161oce_mq_handler(void *arg) 2162{ 2163 struct oce_mq *mq = (struct oce_mq *)arg; 2164 POCE_SOFTC sc = mq->parent; 2165 struct oce_cq *cq = mq->cq; 2166 int num_cqes = 0, evt_type = 0, optype = 0; 2167 struct oce_mq_cqe *cqe; 2168 struct oce_async_cqe_link_state *acqe; 2169 struct oce_async_event_grp5_pvid_state *gcqe; 2170 struct oce_async_event_qnq *dbgcqe; 2171 2172 2173 bus_dmamap_sync(cq->ring->dma.tag, 2174 cq->ring->dma.map, BUS_DMASYNC_POSTWRITE); 2175 cqe = RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_mq_cqe); 2176 2177 while (cqe->u0.dw[3]) { 2178 DW_SWAP((uint32_t *) cqe, sizeof(oce_mq_cqe)); 2179 if (cqe->u0.s.async_event) { 2180 evt_type = cqe->u0.s.event_type; 2181 optype = cqe->u0.s.async_type; 2182 if (evt_type == ASYNC_EVENT_CODE_LINK_STATE) { 2183 /* Link status evt */ 2184 acqe = (struct oce_async_cqe_link_state *)cqe; 2185 process_link_state(sc, acqe); 2186 } else if ((evt_type == ASYNC_EVENT_GRP5) && 2187 (optype == ASYNC_EVENT_PVID_STATE)) { 2188 /* GRP5 PVID */ 2189 gcqe = 2190 (struct oce_async_event_grp5_pvid_state *)cqe; 2191 if (gcqe->enabled) 2192 sc->pvid = gcqe->tag & VLAN_VID_MASK; 2193 else 2194 sc->pvid = 0; 2195 2196 } 2197 else if(evt_type == ASYNC_EVENT_CODE_DEBUG && 2198 optype == ASYNC_EVENT_DEBUG_QNQ) { 2199 dbgcqe = 2200 (struct oce_async_event_qnq *)cqe; 2201 if(dbgcqe->valid) 2202 sc->qnqid = dbgcqe->vlan_tag; 2203 sc->qnq_debug_event = TRUE; 2204 } 2205 } 2206 cqe->u0.dw[3] = 0; 2207 RING_GET(cq->ring, 1); 2208 bus_dmamap_sync(cq->ring->dma.tag, 2209 cq->ring->dma.map, BUS_DMASYNC_POSTWRITE); 2210 cqe = RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_mq_cqe); 2211 num_cqes++; 2212 } 2213 2214 if (num_cqes) 2215 oce_arm_cq(sc, cq->cq_id, num_cqes, FALSE); 2216 2217 return 0; 2218} 2219 2220 2221static void 2222setup_max_queues_want(POCE_SOFTC sc) 2223{ 2224 /* Check if it is FLEX machine. Is so dont use RSS */ 2225 if ((sc->function_mode & FNM_FLEX10_MODE) || 2226 (sc->function_mode & FNM_UMC_MODE) || 2227 (sc->function_mode & FNM_VNIC_MODE) || 2228 (!is_rss_enabled(sc)) || 2229 IS_BE2(sc)) { 2230 sc->nrqs = 1; 2231 sc->nwqs = 1; 2232 } else { 2233 sc->nrqs = MIN(OCE_NCPUS, sc->nrssqs) + 1; 2234 sc->nwqs = MIN(OCE_NCPUS, sc->nrssqs); 2235 } 2236 2237 if (IS_BE2(sc) && is_rss_enabled(sc)) 2238 sc->nrqs = MIN(OCE_NCPUS, sc->nrssqs) + 1; 2239} 2240 2241 2242static void 2243update_queues_got(POCE_SOFTC sc) 2244{ 2245 if (is_rss_enabled(sc)) { 2246 sc->nrqs = sc->intr_count + 1; 2247 sc->nwqs = sc->intr_count; 2248 } else { 2249 sc->nrqs = 1; 2250 sc->nwqs = 1; 2251 } 2252 2253 if (IS_BE2(sc)) 2254 sc->nwqs = 1; 2255} 2256 2257static int 2258oce_check_ipv6_ext_hdr(struct mbuf *m) 2259{ 2260 struct ether_header *eh = mtod(m, struct ether_header *); 2261 caddr_t m_datatemp = m->m_data; 2262 2263 if (eh->ether_type == htons(ETHERTYPE_IPV6)) { 2264 m->m_data += sizeof(struct ether_header); 2265 struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *); 2266 2267 if((ip6->ip6_nxt != IPPROTO_TCP) && \ 2268 (ip6->ip6_nxt != IPPROTO_UDP)){ 2269 struct ip6_ext *ip6e = NULL; 2270 m->m_data += sizeof(struct ip6_hdr); 2271 2272 ip6e = (struct ip6_ext *) mtod(m, struct ip6_ext *); 2273 if(ip6e->ip6e_len == 0xff) { 2274 m->m_data = m_datatemp; 2275 return TRUE; 2276 } 2277 } 2278 m->m_data = m_datatemp; 2279 } 2280 return FALSE; 2281} 2282 2283static int 2284is_be3_a1(POCE_SOFTC sc) 2285{ 2286 if((sc->flags & OCE_FLAGS_BE3) && ((sc->asic_revision & 0xFF) < 2)) { 2287 return TRUE; 2288 } 2289 return FALSE; 2290} 2291 2292static struct mbuf * 2293oce_insert_vlan_tag(POCE_SOFTC sc, struct mbuf *m, boolean_t *complete) 2294{ 2295 uint16_t vlan_tag = 0; 2296 2297 if(!M_WRITABLE(m)) 2298 return NULL; 2299 2300 /* Embed vlan tag in the packet if it is not part of it */ 2301 if(m->m_flags & M_VLANTAG) { 2302 vlan_tag = EVL_VLANOFTAG(m->m_pkthdr.ether_vtag); 2303 m->m_flags &= ~M_VLANTAG; 2304 } 2305 2306 /* if UMC, ignore vlan tag insertion and instead insert pvid */ 2307 if(sc->pvid) { 2308 if(!vlan_tag) 2309 vlan_tag = sc->pvid; 2310 *complete = FALSE; 2311 } 2312 2313 if(vlan_tag) { 2314 m = ether_vlanencap(m, vlan_tag); 2315 } 2316 2317 if(sc->qnqid) { 2318 m = ether_vlanencap(m, sc->qnqid); 2319 *complete = FALSE; 2320 } 2321 return m; 2322} 2323 2324static int 2325oce_tx_asic_stall_verify(POCE_SOFTC sc, struct mbuf *m) 2326{ 2327 if(is_be3_a1(sc) && IS_QNQ_OR_UMC(sc) && \ 2328 oce_check_ipv6_ext_hdr(m)) { 2329 return TRUE; 2330 } 2331 return FALSE; 2332} 2333 2334static void 2335oce_get_config(POCE_SOFTC sc) 2336{ 2337 int rc = 0; 2338 uint32_t max_rss = 0; 2339 2340 if ((IS_BE(sc) || IS_SH(sc)) && (!sc->be3_native)) 2341 max_rss = OCE_LEGACY_MODE_RSS; 2342 else 2343 max_rss = OCE_MAX_RSS; 2344 2345 if (!IS_BE(sc)) { 2346 rc = oce_get_profile_config(sc, max_rss); 2347 if (rc) { 2348 sc->nwqs = OCE_MAX_WQ; 2349 sc->nrssqs = max_rss; 2350 sc->nrqs = sc->nrssqs + 1; 2351 } 2352 } 2353 else { /* For BE3 don't rely on fw for determining the resources */ 2354 sc->nrssqs = max_rss; 2355 sc->nrqs = sc->nrssqs + 1; 2356 sc->nwqs = OCE_MAX_WQ; 2357 sc->max_vlans = MAX_VLANFILTER_SIZE; 2358 } 2359} 2360