1 /*- 2 * SPDX-License-Identifier: BSD-3-Clause 3 * 4 * Copyright (C) 2013 Emulex 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions are met: 9 * 10 * 1. Redistributions of source code must retain the above copyright notice, 11 * this list of conditions and the following disclaimer. 12 * 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * 3. Neither the name of the Emulex Corporation nor the names of its 18 * contributors may be used to endorse or promote products derived from 19 * this software without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 25 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 31 * POSSIBILITY OF SUCH DAMAGE. 32 * 33 * Contact Information: 34 * freebsd-drivers@emulex.com 35 * 36 * Emulex 37 * 3333 Susan Street 38 * Costa Mesa, CA 92626 39 */ 40 41 /* $FreeBSD$ */ 42 43 #include "opt_inet6.h" 44 #include "opt_inet.h" 45 46 #include "oce_if.h" 47 #include "oce_user.h" 48 49 #define is_tso_pkt(m) (m->m_pkthdr.csum_flags & CSUM_TSO) 50 51 /* UE Status Low CSR */ 52 static char *ue_status_low_desc[] = { 53 "CEV", 54 "CTX", 55 "DBUF", 56 "ERX", 57 "Host", 58 "MPU", 59 "NDMA", 60 "PTC ", 61 "RDMA ", 62 "RXF ", 63 "RXIPS ", 64 "RXULP0 ", 65 "RXULP1 ", 66 "RXULP2 ", 67 "TIM ", 68 "TPOST ", 69 "TPRE ", 70 "TXIPS ", 71 "TXULP0 ", 72 "TXULP1 ", 73 "UC ", 74 "WDMA ", 75 "TXULP2 ", 76 "HOST1 ", 77 "P0_OB_LINK ", 78 "P1_OB_LINK ", 79 "HOST_GPIO ", 80 "MBOX ", 81 "AXGMAC0", 82 "AXGMAC1", 83 "JTAG", 84 "MPU_INTPEND" 85 }; 86 87 /* UE Status High CSR */ 88 static char *ue_status_hi_desc[] = { 89 "LPCMEMHOST", 90 "MGMT_MAC", 91 "PCS0ONLINE", 92 "MPU_IRAM", 93 "PCS1ONLINE", 94 "PCTL0", 95 "PCTL1", 96 "PMEM", 97 "RR", 98 "TXPB", 99 "RXPP", 100 "XAUI", 101 "TXP", 102 "ARM", 103 "IPC", 104 "HOST2", 105 "HOST3", 106 "HOST4", 107 "HOST5", 108 "HOST6", 109 "HOST7", 110 "HOST8", 111 "HOST9", 112 "NETC", 113 "Unknown", 114 "Unknown", 115 "Unknown", 116 "Unknown", 117 "Unknown", 118 "Unknown", 119 "Unknown", 120 "Unknown" 121 }; 122 123 struct oce_common_cqe_info{ 124 uint8_t vtp:1; 125 uint8_t l4_cksum_pass:1; 126 uint8_t ip_cksum_pass:1; 127 uint8_t ipv6_frame:1; 128 uint8_t qnq:1; 129 uint8_t rsvd:3; 130 uint8_t num_frags; 131 uint16_t pkt_size; 132 uint16_t vtag; 133 }; 134 135 136 /* Driver entry points prototypes */ 137 static int oce_probe(device_t dev); 138 static int oce_attach(device_t dev); 139 static int oce_detach(device_t dev); 140 static int oce_shutdown(device_t dev); 141 static int oce_ioctl(struct ifnet *ifp, u_long command, caddr_t data); 142 static void oce_init(void *xsc); 143 static int oce_multiq_start(struct ifnet *ifp, struct mbuf *m); 144 static void oce_multiq_flush(struct ifnet *ifp); 145 146 /* Driver interrupt routines protypes */ 147 static void oce_intr(void *arg, int pending); 148 static int oce_setup_intr(POCE_SOFTC sc); 149 static int oce_fast_isr(void *arg); 150 static int oce_alloc_intr(POCE_SOFTC sc, int vector, 151 void (*isr) (void *arg, int pending)); 152 153 /* Media callbacks prototypes */ 154 static void oce_media_status(struct ifnet *ifp, struct ifmediareq *req); 155 static int oce_media_change(struct ifnet *ifp); 156 157 /* Transmit routines prototypes */ 158 static int oce_tx(POCE_SOFTC sc, struct mbuf **mpp, int wq_index); 159 static void oce_tx_restart(POCE_SOFTC sc, struct oce_wq *wq); 160 static void oce_process_tx_completion(struct oce_wq *wq); 161 static int oce_multiq_transmit(struct ifnet *ifp, struct mbuf *m, 162 struct oce_wq *wq); 163 164 /* Receive routines prototypes */ 165 static int oce_cqe_vtp_valid(POCE_SOFTC sc, struct oce_nic_rx_cqe *cqe); 166 static int oce_cqe_portid_valid(POCE_SOFTC sc, struct oce_nic_rx_cqe *cqe); 167 static void oce_rx(struct oce_rq *rq, struct oce_nic_rx_cqe *cqe); 168 static void oce_check_rx_bufs(POCE_SOFTC sc, uint32_t num_cqes, struct oce_rq *rq); 169 static uint16_t oce_rq_handler_lro(void *arg); 170 static void oce_correct_header(struct mbuf *m, struct nic_hwlro_cqe_part1 *cqe1, struct nic_hwlro_cqe_part2 *cqe2); 171 static void oce_rx_lro(struct oce_rq *rq, struct nic_hwlro_singleton_cqe *cqe, struct nic_hwlro_cqe_part2 *cqe2); 172 static void oce_rx_mbuf_chain(struct oce_rq *rq, struct oce_common_cqe_info *cqe_info, struct mbuf **m); 173 174 /* Helper function prototypes in this file */ 175 static int oce_attach_ifp(POCE_SOFTC sc); 176 static void oce_add_vlan(void *arg, struct ifnet *ifp, uint16_t vtag); 177 static void oce_del_vlan(void *arg, struct ifnet *ifp, uint16_t vtag); 178 static int oce_vid_config(POCE_SOFTC sc); 179 static void oce_mac_addr_set(POCE_SOFTC sc); 180 static int oce_handle_passthrough(struct ifnet *ifp, caddr_t data); 181 static void oce_local_timer(void *arg); 182 static void oce_if_deactivate(POCE_SOFTC sc); 183 static void oce_if_activate(POCE_SOFTC sc); 184 static void setup_max_queues_want(POCE_SOFTC sc); 185 static void update_queues_got(POCE_SOFTC sc); 186 static void process_link_state(POCE_SOFTC sc, 187 struct oce_async_cqe_link_state *acqe); 188 static int oce_tx_asic_stall_verify(POCE_SOFTC sc, struct mbuf *m); 189 static void oce_get_config(POCE_SOFTC sc); 190 static struct mbuf *oce_insert_vlan_tag(POCE_SOFTC sc, struct mbuf *m, boolean_t *complete); 191 static void oce_read_env_variables(POCE_SOFTC sc); 192 193 194 /* IP specific */ 195 #if defined(INET6) || defined(INET) 196 static int oce_init_lro(POCE_SOFTC sc); 197 static struct mbuf * oce_tso_setup(POCE_SOFTC sc, struct mbuf **mpp); 198 #endif 199 200 static device_method_t oce_dispatch[] = { 201 DEVMETHOD(device_probe, oce_probe), 202 DEVMETHOD(device_attach, oce_attach), 203 DEVMETHOD(device_detach, oce_detach), 204 DEVMETHOD(device_shutdown, oce_shutdown), 205 206 DEVMETHOD_END 207 }; 208 209 static driver_t oce_driver = { 210 "oce", 211 oce_dispatch, 212 sizeof(OCE_SOFTC) 213 }; 214 static devclass_t oce_devclass; 215 216 217 /* global vars */ 218 const char component_revision[32] = {"///" COMPONENT_REVISION "///"}; 219 220 /* Module capabilites and parameters */ 221 uint32_t oce_max_rsp_handled = OCE_MAX_RSP_HANDLED; 222 uint32_t oce_enable_rss = OCE_MODCAP_RSS; 223 uint32_t oce_rq_buf_size = 2048; 224 225 TUNABLE_INT("hw.oce.max_rsp_handled", &oce_max_rsp_handled); 226 TUNABLE_INT("hw.oce.enable_rss", &oce_enable_rss); 227 228 229 /* Supported devices table */ 230 static uint32_t supportedDevices[] = { 231 (PCI_VENDOR_SERVERENGINES << 16) | PCI_PRODUCT_BE2, 232 (PCI_VENDOR_SERVERENGINES << 16) | PCI_PRODUCT_BE3, 233 (PCI_VENDOR_EMULEX << 16) | PCI_PRODUCT_BE3, 234 (PCI_VENDOR_EMULEX << 16) | PCI_PRODUCT_XE201, 235 (PCI_VENDOR_EMULEX << 16) | PCI_PRODUCT_XE201_VF, 236 (PCI_VENDOR_EMULEX << 16) | PCI_PRODUCT_SH 237 }; 238 239 240 DRIVER_MODULE(oce, pci, oce_driver, oce_devclass, 0, 0); 241 MODULE_PNP_INFO("W32:vendor/device", pci, oce, supportedDevices, 242 nitems(supportedDevices)); 243 MODULE_DEPEND(oce, pci, 1, 1, 1); 244 MODULE_DEPEND(oce, ether, 1, 1, 1); 245 MODULE_VERSION(oce, 1); 246 247 248 POCE_SOFTC softc_head = NULL; 249 POCE_SOFTC softc_tail = NULL; 250 251 struct oce_rdma_if *oce_rdma_if = NULL; 252 253 /***************************************************************************** 254 * Driver entry points functions * 255 *****************************************************************************/ 256 257 static int 258 oce_probe(device_t dev) 259 { 260 uint16_t vendor = 0; 261 uint16_t device = 0; 262 int i = 0; 263 char str[256] = {0}; 264 POCE_SOFTC sc; 265 266 sc = device_get_softc(dev); 267 bzero(sc, sizeof(OCE_SOFTC)); 268 sc->dev = dev; 269 270 vendor = pci_get_vendor(dev); 271 device = pci_get_device(dev); 272 273 for (i = 0; i < (sizeof(supportedDevices) / sizeof(uint32_t)); i++) { 274 if (vendor == ((supportedDevices[i] >> 16) & 0xffff)) { 275 if (device == (supportedDevices[i] & 0xffff)) { 276 sprintf(str, "%s:%s", "Emulex CNA NIC function", 277 component_revision); 278 device_set_desc_copy(dev, str); 279 280 switch (device) { 281 case PCI_PRODUCT_BE2: 282 sc->flags |= OCE_FLAGS_BE2; 283 break; 284 case PCI_PRODUCT_BE3: 285 sc->flags |= OCE_FLAGS_BE3; 286 break; 287 case PCI_PRODUCT_XE201: 288 case PCI_PRODUCT_XE201_VF: 289 sc->flags |= OCE_FLAGS_XE201; 290 break; 291 case PCI_PRODUCT_SH: 292 sc->flags |= OCE_FLAGS_SH; 293 break; 294 default: 295 return ENXIO; 296 } 297 return BUS_PROBE_DEFAULT; 298 } 299 } 300 } 301 302 return ENXIO; 303 } 304 305 306 static int 307 oce_attach(device_t dev) 308 { 309 POCE_SOFTC sc; 310 int rc = 0; 311 312 sc = device_get_softc(dev); 313 314 rc = oce_hw_pci_alloc(sc); 315 if (rc) 316 return rc; 317 318 sc->tx_ring_size = OCE_TX_RING_SIZE; 319 sc->rx_ring_size = OCE_RX_RING_SIZE; 320 /* receive fragment size should be multiple of 2K */ 321 sc->rq_frag_size = ((oce_rq_buf_size / 2048) * 2048); 322 sc->flow_control = OCE_DEFAULT_FLOW_CONTROL; 323 sc->promisc = OCE_DEFAULT_PROMISCUOUS; 324 325 LOCK_CREATE(&sc->bmbx_lock, "Mailbox_lock"); 326 LOCK_CREATE(&sc->dev_lock, "Device_lock"); 327 328 /* initialise the hardware */ 329 rc = oce_hw_init(sc); 330 if (rc) 331 goto pci_res_free; 332 333 oce_read_env_variables(sc); 334 335 oce_get_config(sc); 336 337 setup_max_queues_want(sc); 338 339 rc = oce_setup_intr(sc); 340 if (rc) 341 goto mbox_free; 342 343 rc = oce_queue_init_all(sc); 344 if (rc) 345 goto intr_free; 346 347 rc = oce_attach_ifp(sc); 348 if (rc) 349 goto queues_free; 350 351 #if defined(INET6) || defined(INET) 352 rc = oce_init_lro(sc); 353 if (rc) 354 goto ifp_free; 355 #endif 356 357 rc = oce_hw_start(sc); 358 if (rc) 359 goto lro_free; 360 361 sc->vlan_attach = EVENTHANDLER_REGISTER(vlan_config, 362 oce_add_vlan, sc, EVENTHANDLER_PRI_FIRST); 363 sc->vlan_detach = EVENTHANDLER_REGISTER(vlan_unconfig, 364 oce_del_vlan, sc, EVENTHANDLER_PRI_FIRST); 365 366 rc = oce_stats_init(sc); 367 if (rc) 368 goto vlan_free; 369 370 oce_add_sysctls(sc); 371 372 callout_init(&sc->timer, CALLOUT_MPSAFE); 373 rc = callout_reset(&sc->timer, 2 * hz, oce_local_timer, sc); 374 if (rc) 375 goto stats_free; 376 377 sc->next =NULL; 378 if (softc_tail != NULL) { 379 softc_tail->next = sc; 380 } else { 381 softc_head = sc; 382 } 383 softc_tail = sc; 384 385 return 0; 386 387 stats_free: 388 callout_drain(&sc->timer); 389 oce_stats_free(sc); 390 vlan_free: 391 if (sc->vlan_attach) 392 EVENTHANDLER_DEREGISTER(vlan_config, sc->vlan_attach); 393 if (sc->vlan_detach) 394 EVENTHANDLER_DEREGISTER(vlan_unconfig, sc->vlan_detach); 395 oce_hw_intr_disable(sc); 396 lro_free: 397 #if defined(INET6) || defined(INET) 398 oce_free_lro(sc); 399 ifp_free: 400 #endif 401 ether_ifdetach(sc->ifp); 402 if_free(sc->ifp); 403 queues_free: 404 oce_queue_release_all(sc); 405 intr_free: 406 oce_intr_free(sc); 407 mbox_free: 408 oce_dma_free(sc, &sc->bsmbx); 409 pci_res_free: 410 oce_hw_pci_free(sc); 411 LOCK_DESTROY(&sc->dev_lock); 412 LOCK_DESTROY(&sc->bmbx_lock); 413 return rc; 414 415 } 416 417 418 static int 419 oce_detach(device_t dev) 420 { 421 POCE_SOFTC sc = device_get_softc(dev); 422 POCE_SOFTC poce_sc_tmp, *ppoce_sc_tmp1, poce_sc_tmp2 = NULL; 423 424 poce_sc_tmp = softc_head; 425 ppoce_sc_tmp1 = &softc_head; 426 while (poce_sc_tmp != NULL) { 427 if (poce_sc_tmp == sc) { 428 *ppoce_sc_tmp1 = sc->next; 429 if (sc->next == NULL) { 430 softc_tail = poce_sc_tmp2; 431 } 432 break; 433 } 434 poce_sc_tmp2 = poce_sc_tmp; 435 ppoce_sc_tmp1 = &poce_sc_tmp->next; 436 poce_sc_tmp = poce_sc_tmp->next; 437 } 438 439 LOCK(&sc->dev_lock); 440 oce_if_deactivate(sc); 441 UNLOCK(&sc->dev_lock); 442 443 callout_drain(&sc->timer); 444 445 if (sc->vlan_attach != NULL) 446 EVENTHANDLER_DEREGISTER(vlan_config, sc->vlan_attach); 447 if (sc->vlan_detach != NULL) 448 EVENTHANDLER_DEREGISTER(vlan_unconfig, sc->vlan_detach); 449 450 ether_ifdetach(sc->ifp); 451 452 if_free(sc->ifp); 453 454 oce_hw_shutdown(sc); 455 456 bus_generic_detach(dev); 457 458 return 0; 459 } 460 461 462 static int 463 oce_shutdown(device_t dev) 464 { 465 int rc; 466 467 rc = oce_detach(dev); 468 469 return rc; 470 } 471 472 473 static int 474 oce_ioctl(struct ifnet *ifp, u_long command, caddr_t data) 475 { 476 struct ifreq *ifr = (struct ifreq *)data; 477 POCE_SOFTC sc = ifp->if_softc; 478 struct ifi2creq i2c; 479 uint8_t offset = 0; 480 int rc = 0; 481 uint32_t u; 482 483 switch (command) { 484 485 case SIOCGIFMEDIA: 486 rc = ifmedia_ioctl(ifp, ifr, &sc->media, command); 487 break; 488 489 case SIOCSIFMTU: 490 if (ifr->ifr_mtu > OCE_MAX_MTU) 491 rc = EINVAL; 492 else 493 ifp->if_mtu = ifr->ifr_mtu; 494 break; 495 496 case SIOCSIFFLAGS: 497 if (ifp->if_flags & IFF_UP) { 498 if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) { 499 sc->ifp->if_drv_flags |= IFF_DRV_RUNNING; 500 oce_init(sc); 501 } 502 device_printf(sc->dev, "Interface Up\n"); 503 } else { 504 LOCK(&sc->dev_lock); 505 506 sc->ifp->if_drv_flags &= 507 ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); 508 oce_if_deactivate(sc); 509 510 UNLOCK(&sc->dev_lock); 511 512 device_printf(sc->dev, "Interface Down\n"); 513 } 514 515 if ((ifp->if_flags & IFF_PROMISC) && !sc->promisc) { 516 if (!oce_rxf_set_promiscuous(sc, (1 | (1 << 1)))) 517 sc->promisc = TRUE; 518 } else if (!(ifp->if_flags & IFF_PROMISC) && sc->promisc) { 519 if (!oce_rxf_set_promiscuous(sc, 0)) 520 sc->promisc = FALSE; 521 } 522 523 break; 524 525 case SIOCADDMULTI: 526 case SIOCDELMULTI: 527 rc = oce_hw_update_multicast(sc); 528 if (rc) 529 device_printf(sc->dev, 530 "Update multicast address failed\n"); 531 break; 532 533 case SIOCSIFCAP: 534 u = ifr->ifr_reqcap ^ ifp->if_capenable; 535 536 if (u & IFCAP_TXCSUM) { 537 ifp->if_capenable ^= IFCAP_TXCSUM; 538 ifp->if_hwassist ^= (CSUM_TCP | CSUM_UDP | CSUM_IP); 539 540 if (IFCAP_TSO & ifp->if_capenable && 541 !(IFCAP_TXCSUM & ifp->if_capenable)) { 542 ifp->if_capenable &= ~IFCAP_TSO; 543 ifp->if_hwassist &= ~CSUM_TSO; 544 if_printf(ifp, 545 "TSO disabled due to -txcsum.\n"); 546 } 547 } 548 549 if (u & IFCAP_RXCSUM) 550 ifp->if_capenable ^= IFCAP_RXCSUM; 551 552 if (u & IFCAP_TSO4) { 553 ifp->if_capenable ^= IFCAP_TSO4; 554 555 if (IFCAP_TSO & ifp->if_capenable) { 556 if (IFCAP_TXCSUM & ifp->if_capenable) 557 ifp->if_hwassist |= CSUM_TSO; 558 else { 559 ifp->if_capenable &= ~IFCAP_TSO; 560 ifp->if_hwassist &= ~CSUM_TSO; 561 if_printf(ifp, 562 "Enable txcsum first.\n"); 563 rc = EAGAIN; 564 } 565 } else 566 ifp->if_hwassist &= ~CSUM_TSO; 567 } 568 569 if (u & IFCAP_VLAN_HWTAGGING) 570 ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING; 571 572 if (u & IFCAP_VLAN_HWFILTER) { 573 ifp->if_capenable ^= IFCAP_VLAN_HWFILTER; 574 oce_vid_config(sc); 575 } 576 #if defined(INET6) || defined(INET) 577 if (u & IFCAP_LRO) { 578 ifp->if_capenable ^= IFCAP_LRO; 579 if(sc->enable_hwlro) { 580 if(ifp->if_capenable & IFCAP_LRO) { 581 rc = oce_mbox_nic_set_iface_lro_config(sc, 1); 582 }else { 583 rc = oce_mbox_nic_set_iface_lro_config(sc, 0); 584 } 585 } 586 } 587 #endif 588 589 break; 590 591 case SIOCGI2C: 592 rc = copyin(ifr_data_get_ptr(ifr), &i2c, sizeof(i2c)); 593 if (rc) 594 break; 595 596 if (i2c.dev_addr == PAGE_NUM_A0) { 597 offset = i2c.offset; 598 } else if (i2c.dev_addr == PAGE_NUM_A2) { 599 offset = TRANSCEIVER_A0_SIZE + i2c.offset; 600 } else { 601 rc = EINVAL; 602 break; 603 } 604 605 if (i2c.len > sizeof(i2c.data) || 606 i2c.len + offset > sizeof(sfp_vpd_dump_buffer)) { 607 rc = EINVAL; 608 break; 609 } 610 611 rc = oce_mbox_read_transrecv_data(sc, i2c.dev_addr); 612 if (rc) { 613 rc = -rc; 614 break; 615 } 616 617 memcpy(&i2c.data[0], &sfp_vpd_dump_buffer[offset], i2c.len); 618 619 rc = copyout(&i2c, ifr_data_get_ptr(ifr), sizeof(i2c)); 620 break; 621 622 case SIOCGPRIVATE_0: 623 rc = oce_handle_passthrough(ifp, data); 624 break; 625 default: 626 rc = ether_ioctl(ifp, command, data); 627 break; 628 } 629 630 return rc; 631 } 632 633 634 static void 635 oce_init(void *arg) 636 { 637 POCE_SOFTC sc = arg; 638 639 LOCK(&sc->dev_lock); 640 641 if (sc->ifp->if_flags & IFF_UP) { 642 oce_if_deactivate(sc); 643 oce_if_activate(sc); 644 } 645 646 UNLOCK(&sc->dev_lock); 647 648 } 649 650 651 static int 652 oce_multiq_start(struct ifnet *ifp, struct mbuf *m) 653 { 654 POCE_SOFTC sc = ifp->if_softc; 655 struct oce_wq *wq = NULL; 656 int queue_index = 0; 657 int status = 0; 658 659 if (!sc->link_status) 660 return ENXIO; 661 662 if (M_HASHTYPE_GET(m) != M_HASHTYPE_NONE) 663 queue_index = m->m_pkthdr.flowid % sc->nwqs; 664 665 wq = sc->wq[queue_index]; 666 667 LOCK(&wq->tx_lock); 668 status = oce_multiq_transmit(ifp, m, wq); 669 UNLOCK(&wq->tx_lock); 670 671 return status; 672 673 } 674 675 676 static void 677 oce_multiq_flush(struct ifnet *ifp) 678 { 679 POCE_SOFTC sc = ifp->if_softc; 680 struct mbuf *m; 681 int i = 0; 682 683 for (i = 0; i < sc->nwqs; i++) { 684 while ((m = buf_ring_dequeue_sc(sc->wq[i]->br)) != NULL) 685 m_freem(m); 686 } 687 if_qflush(ifp); 688 } 689 690 691 692 /***************************************************************************** 693 * Driver interrupt routines functions * 694 *****************************************************************************/ 695 696 static void 697 oce_intr(void *arg, int pending) 698 { 699 700 POCE_INTR_INFO ii = (POCE_INTR_INFO) arg; 701 POCE_SOFTC sc = ii->sc; 702 struct oce_eq *eq = ii->eq; 703 struct oce_eqe *eqe; 704 struct oce_cq *cq = NULL; 705 int i, num_eqes = 0; 706 707 708 bus_dmamap_sync(eq->ring->dma.tag, eq->ring->dma.map, 709 BUS_DMASYNC_POSTWRITE); 710 do { 711 eqe = RING_GET_CONSUMER_ITEM_VA(eq->ring, struct oce_eqe); 712 if (eqe->evnt == 0) 713 break; 714 eqe->evnt = 0; 715 bus_dmamap_sync(eq->ring->dma.tag, eq->ring->dma.map, 716 BUS_DMASYNC_POSTWRITE); 717 RING_GET(eq->ring, 1); 718 num_eqes++; 719 720 } while (TRUE); 721 722 if (!num_eqes) 723 goto eq_arm; /* Spurious */ 724 725 /* Clear EQ entries, but dont arm */ 726 oce_arm_eq(sc, eq->eq_id, num_eqes, FALSE, FALSE); 727 728 /* Process TX, RX and MCC. But dont arm CQ*/ 729 for (i = 0; i < eq->cq_valid; i++) { 730 cq = eq->cq[i]; 731 (*cq->cq_handler)(cq->cb_arg); 732 } 733 734 /* Arm all cqs connected to this EQ */ 735 for (i = 0; i < eq->cq_valid; i++) { 736 cq = eq->cq[i]; 737 oce_arm_cq(sc, cq->cq_id, 0, TRUE); 738 } 739 740 eq_arm: 741 oce_arm_eq(sc, eq->eq_id, 0, TRUE, FALSE); 742 743 return; 744 } 745 746 747 static int 748 oce_setup_intr(POCE_SOFTC sc) 749 { 750 int rc = 0, use_intx = 0; 751 int vector = 0, req_vectors = 0; 752 int tot_req_vectors, tot_vectors; 753 754 if (is_rss_enabled(sc)) 755 req_vectors = MAX((sc->nrqs - 1), sc->nwqs); 756 else 757 req_vectors = 1; 758 759 tot_req_vectors = req_vectors; 760 if (sc->rdma_flags & OCE_RDMA_FLAG_SUPPORTED) { 761 if (req_vectors > 1) { 762 tot_req_vectors += OCE_RDMA_VECTORS; 763 sc->roce_intr_count = OCE_RDMA_VECTORS; 764 } 765 } 766 767 if (sc->flags & OCE_FLAGS_MSIX_CAPABLE) { 768 sc->intr_count = req_vectors; 769 tot_vectors = tot_req_vectors; 770 rc = pci_alloc_msix(sc->dev, &tot_vectors); 771 if (rc != 0) { 772 use_intx = 1; 773 pci_release_msi(sc->dev); 774 } else { 775 if (sc->rdma_flags & OCE_RDMA_FLAG_SUPPORTED) { 776 if (tot_vectors < tot_req_vectors) { 777 if (sc->intr_count < (2 * OCE_RDMA_VECTORS)) { 778 sc->roce_intr_count = (tot_vectors / 2); 779 } 780 sc->intr_count = tot_vectors - sc->roce_intr_count; 781 } 782 } else { 783 sc->intr_count = tot_vectors; 784 } 785 sc->flags |= OCE_FLAGS_USING_MSIX; 786 } 787 } else 788 use_intx = 1; 789 790 if (use_intx) 791 sc->intr_count = 1; 792 793 /* Scale number of queues based on intr we got */ 794 update_queues_got(sc); 795 796 if (use_intx) { 797 device_printf(sc->dev, "Using legacy interrupt\n"); 798 rc = oce_alloc_intr(sc, vector, oce_intr); 799 if (rc) 800 goto error; 801 } else { 802 for (; vector < sc->intr_count; vector++) { 803 rc = oce_alloc_intr(sc, vector, oce_intr); 804 if (rc) 805 goto error; 806 } 807 } 808 809 return 0; 810 error: 811 oce_intr_free(sc); 812 return rc; 813 } 814 815 816 static int 817 oce_fast_isr(void *arg) 818 { 819 POCE_INTR_INFO ii = (POCE_INTR_INFO) arg; 820 POCE_SOFTC sc = ii->sc; 821 822 if (ii->eq == NULL) 823 return FILTER_STRAY; 824 825 oce_arm_eq(sc, ii->eq->eq_id, 0, FALSE, TRUE); 826 827 taskqueue_enqueue(ii->tq, &ii->task); 828 829 ii->eq->intr++; 830 831 return FILTER_HANDLED; 832 } 833 834 835 static int 836 oce_alloc_intr(POCE_SOFTC sc, int vector, void (*isr) (void *arg, int pending)) 837 { 838 POCE_INTR_INFO ii; 839 int rc = 0, rr; 840 841 if (vector >= OCE_MAX_EQ) 842 return (EINVAL); 843 844 ii = &sc->intrs[vector]; 845 846 /* Set the resource id for the interrupt. 847 * MSIx is vector + 1 for the resource id, 848 * INTx is 0 for the resource id. 849 */ 850 if (sc->flags & OCE_FLAGS_USING_MSIX) 851 rr = vector + 1; 852 else 853 rr = 0; 854 ii->intr_res = bus_alloc_resource_any(sc->dev, 855 SYS_RES_IRQ, 856 &rr, RF_ACTIVE|RF_SHAREABLE); 857 ii->irq_rr = rr; 858 if (ii->intr_res == NULL) { 859 device_printf(sc->dev, 860 "Could not allocate interrupt\n"); 861 rc = ENXIO; 862 return rc; 863 } 864 865 TASK_INIT(&ii->task, 0, isr, ii); 866 ii->vector = vector; 867 sprintf(ii->task_name, "oce_task[%d]", ii->vector); 868 ii->tq = taskqueue_create_fast(ii->task_name, 869 M_NOWAIT, 870 taskqueue_thread_enqueue, 871 &ii->tq); 872 taskqueue_start_threads(&ii->tq, 1, PI_NET, "%s taskq", 873 device_get_nameunit(sc->dev)); 874 875 ii->sc = sc; 876 rc = bus_setup_intr(sc->dev, 877 ii->intr_res, 878 INTR_TYPE_NET, 879 oce_fast_isr, NULL, ii, &ii->tag); 880 return rc; 881 882 } 883 884 885 void 886 oce_intr_free(POCE_SOFTC sc) 887 { 888 int i = 0; 889 890 for (i = 0; i < sc->intr_count; i++) { 891 892 if (sc->intrs[i].tag != NULL) 893 bus_teardown_intr(sc->dev, sc->intrs[i].intr_res, 894 sc->intrs[i].tag); 895 if (sc->intrs[i].tq != NULL) 896 taskqueue_free(sc->intrs[i].tq); 897 898 if (sc->intrs[i].intr_res != NULL) 899 bus_release_resource(sc->dev, SYS_RES_IRQ, 900 sc->intrs[i].irq_rr, 901 sc->intrs[i].intr_res); 902 sc->intrs[i].tag = NULL; 903 sc->intrs[i].intr_res = NULL; 904 } 905 906 if (sc->flags & OCE_FLAGS_USING_MSIX) 907 pci_release_msi(sc->dev); 908 909 } 910 911 912 913 /****************************************************************************** 914 * Media callbacks functions * 915 ******************************************************************************/ 916 917 static void 918 oce_media_status(struct ifnet *ifp, struct ifmediareq *req) 919 { 920 POCE_SOFTC sc = (POCE_SOFTC) ifp->if_softc; 921 922 923 req->ifm_status = IFM_AVALID; 924 req->ifm_active = IFM_ETHER; 925 926 if (sc->link_status == 1) 927 req->ifm_status |= IFM_ACTIVE; 928 else 929 return; 930 931 switch (sc->link_speed) { 932 case 1: /* 10 Mbps */ 933 req->ifm_active |= IFM_10_T | IFM_FDX; 934 sc->speed = 10; 935 break; 936 case 2: /* 100 Mbps */ 937 req->ifm_active |= IFM_100_TX | IFM_FDX; 938 sc->speed = 100; 939 break; 940 case 3: /* 1 Gbps */ 941 req->ifm_active |= IFM_1000_T | IFM_FDX; 942 sc->speed = 1000; 943 break; 944 case 4: /* 10 Gbps */ 945 req->ifm_active |= IFM_10G_SR | IFM_FDX; 946 sc->speed = 10000; 947 break; 948 case 5: /* 20 Gbps */ 949 req->ifm_active |= IFM_10G_SR | IFM_FDX; 950 sc->speed = 20000; 951 break; 952 case 6: /* 25 Gbps */ 953 req->ifm_active |= IFM_10G_SR | IFM_FDX; 954 sc->speed = 25000; 955 break; 956 case 7: /* 40 Gbps */ 957 req->ifm_active |= IFM_40G_SR4 | IFM_FDX; 958 sc->speed = 40000; 959 break; 960 default: 961 sc->speed = 0; 962 break; 963 } 964 965 return; 966 } 967 968 969 int 970 oce_media_change(struct ifnet *ifp) 971 { 972 return 0; 973 } 974 975 976 static void oce_is_pkt_dest_bmc(POCE_SOFTC sc, 977 struct mbuf *m, boolean_t *os2bmc, 978 struct mbuf **m_new) 979 { 980 struct ether_header *eh = NULL; 981 982 eh = mtod(m, struct ether_header *); 983 984 if (!is_os2bmc_enabled(sc) || *os2bmc) { 985 *os2bmc = FALSE; 986 goto done; 987 } 988 if (!ETHER_IS_MULTICAST(eh->ether_dhost)) 989 goto done; 990 991 if (is_mc_allowed_on_bmc(sc, eh) || 992 is_bc_allowed_on_bmc(sc, eh) || 993 is_arp_allowed_on_bmc(sc, ntohs(eh->ether_type))) { 994 *os2bmc = TRUE; 995 goto done; 996 } 997 998 if (mtod(m, struct ip *)->ip_p == IPPROTO_IPV6) { 999 struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *); 1000 uint8_t nexthdr = ip6->ip6_nxt; 1001 if (nexthdr == IPPROTO_ICMPV6) { 1002 struct icmp6_hdr *icmp6 = (struct icmp6_hdr *)(ip6 + 1); 1003 switch (icmp6->icmp6_type) { 1004 case ND_ROUTER_ADVERT: 1005 *os2bmc = is_ipv6_ra_filt_enabled(sc); 1006 goto done; 1007 case ND_NEIGHBOR_ADVERT: 1008 *os2bmc = is_ipv6_na_filt_enabled(sc); 1009 goto done; 1010 default: 1011 break; 1012 } 1013 } 1014 } 1015 1016 if (mtod(m, struct ip *)->ip_p == IPPROTO_UDP) { 1017 struct ip *ip = mtod(m, struct ip *); 1018 int iphlen = ip->ip_hl << 2; 1019 struct udphdr *uh = (struct udphdr *)((caddr_t)ip + iphlen); 1020 switch (uh->uh_dport) { 1021 case DHCP_CLIENT_PORT: 1022 *os2bmc = is_dhcp_client_filt_enabled(sc); 1023 goto done; 1024 case DHCP_SERVER_PORT: 1025 *os2bmc = is_dhcp_srvr_filt_enabled(sc); 1026 goto done; 1027 case NET_BIOS_PORT1: 1028 case NET_BIOS_PORT2: 1029 *os2bmc = is_nbios_filt_enabled(sc); 1030 goto done; 1031 case DHCPV6_RAS_PORT: 1032 *os2bmc = is_ipv6_ras_filt_enabled(sc); 1033 goto done; 1034 default: 1035 break; 1036 } 1037 } 1038 done: 1039 if (*os2bmc) { 1040 *m_new = m_dup(m, M_NOWAIT); 1041 if (!*m_new) { 1042 *os2bmc = FALSE; 1043 return; 1044 } 1045 *m_new = oce_insert_vlan_tag(sc, *m_new, NULL); 1046 } 1047 } 1048 1049 1050 1051 /***************************************************************************** 1052 * Transmit routines functions * 1053 *****************************************************************************/ 1054 1055 static int 1056 oce_tx(POCE_SOFTC sc, struct mbuf **mpp, int wq_index) 1057 { 1058 int rc = 0, i, retry_cnt = 0; 1059 bus_dma_segment_t segs[OCE_MAX_TX_ELEMENTS]; 1060 struct mbuf *m, *m_temp, *m_new = NULL; 1061 struct oce_wq *wq = sc->wq[wq_index]; 1062 struct oce_packet_desc *pd; 1063 struct oce_nic_hdr_wqe *nichdr; 1064 struct oce_nic_frag_wqe *nicfrag; 1065 struct ether_header *eh = NULL; 1066 int num_wqes; 1067 uint32_t reg_value; 1068 boolean_t complete = TRUE; 1069 boolean_t os2bmc = FALSE; 1070 1071 m = *mpp; 1072 if (!m) 1073 return EINVAL; 1074 1075 if (!(m->m_flags & M_PKTHDR)) { 1076 rc = ENXIO; 1077 goto free_ret; 1078 } 1079 1080 /* Don't allow non-TSO packets longer than MTU */ 1081 if (!is_tso_pkt(m)) { 1082 eh = mtod(m, struct ether_header *); 1083 if(m->m_pkthdr.len > ETHER_MAX_FRAME(sc->ifp, eh->ether_type, FALSE)) 1084 goto free_ret; 1085 } 1086 1087 if(oce_tx_asic_stall_verify(sc, m)) { 1088 m = oce_insert_vlan_tag(sc, m, &complete); 1089 if(!m) { 1090 device_printf(sc->dev, "Insertion unsuccessful\n"); 1091 return 0; 1092 } 1093 1094 } 1095 1096 /* Lancer, SH ASIC has a bug wherein Packets that are 32 bytes or less 1097 * may cause a transmit stall on that port. So the work-around is to 1098 * pad short packets (<= 32 bytes) to a 36-byte length. 1099 */ 1100 if(IS_SH(sc) || IS_XE201(sc) ) { 1101 if(m->m_pkthdr.len <= 32) { 1102 char buf[36]; 1103 bzero((void *)buf, 36); 1104 m_append(m, (36 - m->m_pkthdr.len), buf); 1105 } 1106 } 1107 1108 tx_start: 1109 if (m->m_pkthdr.csum_flags & CSUM_TSO) { 1110 /* consolidate packet buffers for TSO/LSO segment offload */ 1111 #if defined(INET6) || defined(INET) 1112 m = oce_tso_setup(sc, mpp); 1113 #else 1114 m = NULL; 1115 #endif 1116 if (m == NULL) { 1117 rc = ENXIO; 1118 goto free_ret; 1119 } 1120 } 1121 1122 1123 pd = &wq->pckts[wq->pkt_desc_head]; 1124 1125 retry: 1126 rc = bus_dmamap_load_mbuf_sg(wq->tag, 1127 pd->map, 1128 m, segs, &pd->nsegs, BUS_DMA_NOWAIT); 1129 if (rc == 0) { 1130 num_wqes = pd->nsegs + 1; 1131 if (IS_BE(sc) || IS_SH(sc)) { 1132 /*Dummy required only for BE3.*/ 1133 if (num_wqes & 1) 1134 num_wqes++; 1135 } 1136 if (num_wqes >= RING_NUM_FREE(wq->ring)) { 1137 bus_dmamap_unload(wq->tag, pd->map); 1138 return EBUSY; 1139 } 1140 atomic_store_rel_int(&wq->pkt_desc_head, 1141 (wq->pkt_desc_head + 1) % \ 1142 OCE_WQ_PACKET_ARRAY_SIZE); 1143 bus_dmamap_sync(wq->tag, pd->map, BUS_DMASYNC_PREWRITE); 1144 pd->mbuf = m; 1145 1146 nichdr = 1147 RING_GET_PRODUCER_ITEM_VA(wq->ring, struct oce_nic_hdr_wqe); 1148 nichdr->u0.dw[0] = 0; 1149 nichdr->u0.dw[1] = 0; 1150 nichdr->u0.dw[2] = 0; 1151 nichdr->u0.dw[3] = 0; 1152 1153 nichdr->u0.s.complete = complete; 1154 nichdr->u0.s.mgmt = os2bmc; 1155 nichdr->u0.s.event = 1; 1156 nichdr->u0.s.crc = 1; 1157 nichdr->u0.s.forward = 0; 1158 nichdr->u0.s.ipcs = (m->m_pkthdr.csum_flags & CSUM_IP) ? 1 : 0; 1159 nichdr->u0.s.udpcs = 1160 (m->m_pkthdr.csum_flags & CSUM_UDP) ? 1 : 0; 1161 nichdr->u0.s.tcpcs = 1162 (m->m_pkthdr.csum_flags & CSUM_TCP) ? 1 : 0; 1163 nichdr->u0.s.num_wqe = num_wqes; 1164 nichdr->u0.s.total_length = m->m_pkthdr.len; 1165 1166 if (m->m_flags & M_VLANTAG) { 1167 nichdr->u0.s.vlan = 1; /*Vlan present*/ 1168 nichdr->u0.s.vlan_tag = m->m_pkthdr.ether_vtag; 1169 } 1170 1171 if (m->m_pkthdr.csum_flags & CSUM_TSO) { 1172 if (m->m_pkthdr.tso_segsz) { 1173 nichdr->u0.s.lso = 1; 1174 nichdr->u0.s.lso_mss = m->m_pkthdr.tso_segsz; 1175 } 1176 if (!IS_BE(sc) || !IS_SH(sc)) 1177 nichdr->u0.s.ipcs = 1; 1178 } 1179 1180 RING_PUT(wq->ring, 1); 1181 atomic_add_int(&wq->ring->num_used, 1); 1182 1183 for (i = 0; i < pd->nsegs; i++) { 1184 nicfrag = 1185 RING_GET_PRODUCER_ITEM_VA(wq->ring, 1186 struct oce_nic_frag_wqe); 1187 nicfrag->u0.s.rsvd0 = 0; 1188 nicfrag->u0.s.frag_pa_hi = ADDR_HI(segs[i].ds_addr); 1189 nicfrag->u0.s.frag_pa_lo = ADDR_LO(segs[i].ds_addr); 1190 nicfrag->u0.s.frag_len = segs[i].ds_len; 1191 pd->wqe_idx = wq->ring->pidx; 1192 RING_PUT(wq->ring, 1); 1193 atomic_add_int(&wq->ring->num_used, 1); 1194 } 1195 if (num_wqes > (pd->nsegs + 1)) { 1196 nicfrag = 1197 RING_GET_PRODUCER_ITEM_VA(wq->ring, 1198 struct oce_nic_frag_wqe); 1199 nicfrag->u0.dw[0] = 0; 1200 nicfrag->u0.dw[1] = 0; 1201 nicfrag->u0.dw[2] = 0; 1202 nicfrag->u0.dw[3] = 0; 1203 pd->wqe_idx = wq->ring->pidx; 1204 RING_PUT(wq->ring, 1); 1205 atomic_add_int(&wq->ring->num_used, 1); 1206 pd->nsegs++; 1207 } 1208 1209 if_inc_counter(sc->ifp, IFCOUNTER_OPACKETS, 1); 1210 wq->tx_stats.tx_reqs++; 1211 wq->tx_stats.tx_wrbs += num_wqes; 1212 wq->tx_stats.tx_bytes += m->m_pkthdr.len; 1213 wq->tx_stats.tx_pkts++; 1214 1215 bus_dmamap_sync(wq->ring->dma.tag, wq->ring->dma.map, 1216 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 1217 reg_value = (num_wqes << 16) | wq->wq_id; 1218 1219 /* if os2bmc is not enabled or if the pkt is already tagged as 1220 bmc, do nothing 1221 */ 1222 oce_is_pkt_dest_bmc(sc, m, &os2bmc, &m_new); 1223 1224 OCE_WRITE_REG32(sc, db, wq->db_offset, reg_value); 1225 1226 } else if (rc == EFBIG) { 1227 if (retry_cnt == 0) { 1228 m_temp = m_defrag(m, M_NOWAIT); 1229 if (m_temp == NULL) 1230 goto free_ret; 1231 m = m_temp; 1232 *mpp = m_temp; 1233 retry_cnt = retry_cnt + 1; 1234 goto retry; 1235 } else 1236 goto free_ret; 1237 } else if (rc == ENOMEM) 1238 return rc; 1239 else 1240 goto free_ret; 1241 1242 if (os2bmc) { 1243 m = m_new; 1244 goto tx_start; 1245 } 1246 1247 return 0; 1248 1249 free_ret: 1250 m_freem(*mpp); 1251 *mpp = NULL; 1252 return rc; 1253 } 1254 1255 1256 static void 1257 oce_process_tx_completion(struct oce_wq *wq) 1258 { 1259 struct oce_packet_desc *pd; 1260 POCE_SOFTC sc = (POCE_SOFTC) wq->parent; 1261 struct mbuf *m; 1262 1263 pd = &wq->pckts[wq->pkt_desc_tail]; 1264 atomic_store_rel_int(&wq->pkt_desc_tail, 1265 (wq->pkt_desc_tail + 1) % OCE_WQ_PACKET_ARRAY_SIZE); 1266 atomic_subtract_int(&wq->ring->num_used, pd->nsegs + 1); 1267 bus_dmamap_sync(wq->tag, pd->map, BUS_DMASYNC_POSTWRITE); 1268 bus_dmamap_unload(wq->tag, pd->map); 1269 1270 m = pd->mbuf; 1271 m_freem(m); 1272 pd->mbuf = NULL; 1273 1274 1275 if (sc->ifp->if_drv_flags & IFF_DRV_OACTIVE) { 1276 if (wq->ring->num_used < (wq->ring->num_items / 2)) { 1277 sc->ifp->if_drv_flags &= ~(IFF_DRV_OACTIVE); 1278 oce_tx_restart(sc, wq); 1279 } 1280 } 1281 } 1282 1283 1284 static void 1285 oce_tx_restart(POCE_SOFTC sc, struct oce_wq *wq) 1286 { 1287 1288 if ((sc->ifp->if_drv_flags & IFF_DRV_RUNNING) != IFF_DRV_RUNNING) 1289 return; 1290 1291 #if __FreeBSD_version >= 800000 1292 if (!drbr_empty(sc->ifp, wq->br)) 1293 #else 1294 if (!IFQ_DRV_IS_EMPTY(&sc->ifp->if_snd)) 1295 #endif 1296 taskqueue_enqueue(taskqueue_swi, &wq->txtask); 1297 1298 } 1299 1300 1301 #if defined(INET6) || defined(INET) 1302 static struct mbuf * 1303 oce_tso_setup(POCE_SOFTC sc, struct mbuf **mpp) 1304 { 1305 struct mbuf *m; 1306 #ifdef INET 1307 struct ip *ip; 1308 #endif 1309 #ifdef INET6 1310 struct ip6_hdr *ip6; 1311 #endif 1312 struct ether_vlan_header *eh; 1313 struct tcphdr *th; 1314 uint16_t etype; 1315 int total_len = 0, ehdrlen = 0; 1316 1317 m = *mpp; 1318 1319 if (M_WRITABLE(m) == 0) { 1320 m = m_dup(*mpp, M_NOWAIT); 1321 if (!m) 1322 return NULL; 1323 m_freem(*mpp); 1324 *mpp = m; 1325 } 1326 1327 eh = mtod(m, struct ether_vlan_header *); 1328 if (eh->evl_encap_proto == htons(ETHERTYPE_VLAN)) { 1329 etype = ntohs(eh->evl_proto); 1330 ehdrlen = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN; 1331 } else { 1332 etype = ntohs(eh->evl_encap_proto); 1333 ehdrlen = ETHER_HDR_LEN; 1334 } 1335 1336 switch (etype) { 1337 #ifdef INET 1338 case ETHERTYPE_IP: 1339 ip = (struct ip *)(m->m_data + ehdrlen); 1340 if (ip->ip_p != IPPROTO_TCP) 1341 return NULL; 1342 th = (struct tcphdr *)((caddr_t)ip + (ip->ip_hl << 2)); 1343 1344 total_len = ehdrlen + (ip->ip_hl << 2) + (th->th_off << 2); 1345 break; 1346 #endif 1347 #ifdef INET6 1348 case ETHERTYPE_IPV6: 1349 ip6 = (struct ip6_hdr *)(m->m_data + ehdrlen); 1350 if (ip6->ip6_nxt != IPPROTO_TCP) 1351 return NULL; 1352 th = (struct tcphdr *)((caddr_t)ip6 + sizeof(struct ip6_hdr)); 1353 1354 total_len = ehdrlen + sizeof(struct ip6_hdr) + (th->th_off << 2); 1355 break; 1356 #endif 1357 default: 1358 return NULL; 1359 } 1360 1361 m = m_pullup(m, total_len); 1362 if (!m) 1363 return NULL; 1364 *mpp = m; 1365 return m; 1366 1367 } 1368 #endif /* INET6 || INET */ 1369 1370 void 1371 oce_tx_task(void *arg, int npending) 1372 { 1373 struct oce_wq *wq = arg; 1374 POCE_SOFTC sc = wq->parent; 1375 struct ifnet *ifp = sc->ifp; 1376 int rc = 0; 1377 1378 #if __FreeBSD_version >= 800000 1379 LOCK(&wq->tx_lock); 1380 rc = oce_multiq_transmit(ifp, NULL, wq); 1381 if (rc) { 1382 device_printf(sc->dev, 1383 "TX[%d] restart failed\n", wq->queue_index); 1384 } 1385 UNLOCK(&wq->tx_lock); 1386 #else 1387 oce_start(ifp); 1388 #endif 1389 1390 } 1391 1392 1393 void 1394 oce_start(struct ifnet *ifp) 1395 { 1396 POCE_SOFTC sc = ifp->if_softc; 1397 struct mbuf *m; 1398 int rc = 0; 1399 int def_q = 0; /* Defualt tx queue is 0*/ 1400 1401 if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != 1402 IFF_DRV_RUNNING) 1403 return; 1404 1405 if (!sc->link_status) 1406 return; 1407 1408 do { 1409 IF_DEQUEUE(&sc->ifp->if_snd, m); 1410 if (m == NULL) 1411 break; 1412 1413 LOCK(&sc->wq[def_q]->tx_lock); 1414 rc = oce_tx(sc, &m, def_q); 1415 UNLOCK(&sc->wq[def_q]->tx_lock); 1416 if (rc) { 1417 if (m != NULL) { 1418 sc->wq[def_q]->tx_stats.tx_stops ++; 1419 ifp->if_drv_flags |= IFF_DRV_OACTIVE; 1420 IFQ_DRV_PREPEND(&ifp->if_snd, m); 1421 m = NULL; 1422 } 1423 break; 1424 } 1425 if (m != NULL) 1426 ETHER_BPF_MTAP(ifp, m); 1427 1428 } while (TRUE); 1429 1430 return; 1431 } 1432 1433 1434 /* Handle the Completion Queue for transmit */ 1435 uint16_t 1436 oce_wq_handler(void *arg) 1437 { 1438 struct oce_wq *wq = (struct oce_wq *)arg; 1439 POCE_SOFTC sc = wq->parent; 1440 struct oce_cq *cq = wq->cq; 1441 struct oce_nic_tx_cqe *cqe; 1442 int num_cqes = 0; 1443 1444 LOCK(&wq->tx_compl_lock); 1445 bus_dmamap_sync(cq->ring->dma.tag, 1446 cq->ring->dma.map, BUS_DMASYNC_POSTWRITE); 1447 cqe = RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_nic_tx_cqe); 1448 while (cqe->u0.dw[3]) { 1449 DW_SWAP((uint32_t *) cqe, sizeof(oce_wq_cqe)); 1450 1451 wq->ring->cidx = cqe->u0.s.wqe_index + 1; 1452 if (wq->ring->cidx >= wq->ring->num_items) 1453 wq->ring->cidx -= wq->ring->num_items; 1454 1455 oce_process_tx_completion(wq); 1456 wq->tx_stats.tx_compl++; 1457 cqe->u0.dw[3] = 0; 1458 RING_GET(cq->ring, 1); 1459 bus_dmamap_sync(cq->ring->dma.tag, 1460 cq->ring->dma.map, BUS_DMASYNC_POSTWRITE); 1461 cqe = 1462 RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_nic_tx_cqe); 1463 num_cqes++; 1464 } 1465 1466 if (num_cqes) 1467 oce_arm_cq(sc, cq->cq_id, num_cqes, FALSE); 1468 1469 UNLOCK(&wq->tx_compl_lock); 1470 return num_cqes; 1471 } 1472 1473 1474 static int 1475 oce_multiq_transmit(struct ifnet *ifp, struct mbuf *m, struct oce_wq *wq) 1476 { 1477 POCE_SOFTC sc = ifp->if_softc; 1478 int status = 0, queue_index = 0; 1479 struct mbuf *next = NULL; 1480 struct buf_ring *br = NULL; 1481 1482 br = wq->br; 1483 queue_index = wq->queue_index; 1484 1485 if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != 1486 IFF_DRV_RUNNING) { 1487 if (m != NULL) 1488 status = drbr_enqueue(ifp, br, m); 1489 return status; 1490 } 1491 1492 if (m != NULL) { 1493 if ((status = drbr_enqueue(ifp, br, m)) != 0) 1494 return status; 1495 } 1496 while ((next = drbr_peek(ifp, br)) != NULL) { 1497 if (oce_tx(sc, &next, queue_index)) { 1498 if (next == NULL) { 1499 drbr_advance(ifp, br); 1500 } else { 1501 drbr_putback(ifp, br, next); 1502 wq->tx_stats.tx_stops ++; 1503 ifp->if_drv_flags |= IFF_DRV_OACTIVE; 1504 } 1505 break; 1506 } 1507 drbr_advance(ifp, br); 1508 if_inc_counter(ifp, IFCOUNTER_OBYTES, next->m_pkthdr.len); 1509 if (next->m_flags & M_MCAST) 1510 if_inc_counter(ifp, IFCOUNTER_OMCASTS, 1); 1511 ETHER_BPF_MTAP(ifp, next); 1512 } 1513 1514 return 0; 1515 } 1516 1517 1518 1519 1520 /***************************************************************************** 1521 * Receive routines functions * 1522 *****************************************************************************/ 1523 1524 static void 1525 oce_correct_header(struct mbuf *m, struct nic_hwlro_cqe_part1 *cqe1, struct nic_hwlro_cqe_part2 *cqe2) 1526 { 1527 uint32_t *p; 1528 struct ether_header *eh = NULL; 1529 struct tcphdr *tcp_hdr = NULL; 1530 struct ip *ip4_hdr = NULL; 1531 struct ip6_hdr *ip6 = NULL; 1532 uint32_t payload_len = 0; 1533 1534 eh = mtod(m, struct ether_header *); 1535 /* correct IP header */ 1536 if(!cqe2->ipv6_frame) { 1537 ip4_hdr = (struct ip *)((char*)eh + sizeof(struct ether_header)); 1538 ip4_hdr->ip_ttl = cqe2->frame_lifespan; 1539 ip4_hdr->ip_len = htons(cqe2->coalesced_size - sizeof(struct ether_header)); 1540 tcp_hdr = (struct tcphdr *)((char*)ip4_hdr + sizeof(struct ip)); 1541 }else { 1542 ip6 = (struct ip6_hdr *)((char*)eh + sizeof(struct ether_header)); 1543 ip6->ip6_ctlun.ip6_un1.ip6_un1_hlim = cqe2->frame_lifespan; 1544 payload_len = cqe2->coalesced_size - sizeof(struct ether_header) 1545 - sizeof(struct ip6_hdr); 1546 ip6->ip6_ctlun.ip6_un1.ip6_un1_plen = htons(payload_len); 1547 tcp_hdr = (struct tcphdr *)((char*)ip6 + sizeof(struct ip6_hdr)); 1548 } 1549 1550 /* correct tcp header */ 1551 tcp_hdr->th_ack = htonl(cqe2->tcp_ack_num); 1552 if(cqe2->push) { 1553 tcp_hdr->th_flags |= TH_PUSH; 1554 } 1555 tcp_hdr->th_win = htons(cqe2->tcp_window); 1556 tcp_hdr->th_sum = 0xffff; 1557 if(cqe2->ts_opt) { 1558 p = (uint32_t *)((char*)tcp_hdr + sizeof(struct tcphdr) + 2); 1559 *p = cqe1->tcp_timestamp_val; 1560 *(p+1) = cqe1->tcp_timestamp_ecr; 1561 } 1562 1563 return; 1564 } 1565 1566 static void 1567 oce_rx_mbuf_chain(struct oce_rq *rq, struct oce_common_cqe_info *cqe_info, struct mbuf **m) 1568 { 1569 POCE_SOFTC sc = (POCE_SOFTC) rq->parent; 1570 uint32_t i = 0, frag_len = 0; 1571 uint32_t len = cqe_info->pkt_size; 1572 struct oce_packet_desc *pd; 1573 struct mbuf *tail = NULL; 1574 1575 for (i = 0; i < cqe_info->num_frags; i++) { 1576 if (rq->ring->cidx == rq->ring->pidx) { 1577 device_printf(sc->dev, 1578 "oce_rx_mbuf_chain: Invalid RX completion - Queue is empty\n"); 1579 return; 1580 } 1581 pd = &rq->pckts[rq->ring->cidx]; 1582 1583 bus_dmamap_sync(rq->tag, pd->map, BUS_DMASYNC_POSTWRITE); 1584 bus_dmamap_unload(rq->tag, pd->map); 1585 RING_GET(rq->ring, 1); 1586 rq->pending--; 1587 1588 frag_len = (len > rq->cfg.frag_size) ? rq->cfg.frag_size : len; 1589 pd->mbuf->m_len = frag_len; 1590 1591 if (tail != NULL) { 1592 /* additional fragments */ 1593 pd->mbuf->m_flags &= ~M_PKTHDR; 1594 tail->m_next = pd->mbuf; 1595 if(rq->islro) 1596 tail->m_nextpkt = NULL; 1597 tail = pd->mbuf; 1598 } else { 1599 /* first fragment, fill out much of the packet header */ 1600 pd->mbuf->m_pkthdr.len = len; 1601 if(rq->islro) 1602 pd->mbuf->m_nextpkt = NULL; 1603 pd->mbuf->m_pkthdr.csum_flags = 0; 1604 if (IF_CSUM_ENABLED(sc)) { 1605 if (cqe_info->l4_cksum_pass) { 1606 if(!cqe_info->ipv6_frame) { /* IPV4 */ 1607 pd->mbuf->m_pkthdr.csum_flags |= 1608 (CSUM_DATA_VALID | CSUM_PSEUDO_HDR); 1609 }else { /* IPV6 frame */ 1610 if(rq->islro) { 1611 pd->mbuf->m_pkthdr.csum_flags |= 1612 (CSUM_DATA_VALID | CSUM_PSEUDO_HDR); 1613 } 1614 } 1615 pd->mbuf->m_pkthdr.csum_data = 0xffff; 1616 } 1617 if (cqe_info->ip_cksum_pass) { 1618 pd->mbuf->m_pkthdr.csum_flags |= 1619 (CSUM_IP_CHECKED|CSUM_IP_VALID); 1620 } 1621 } 1622 *m = tail = pd->mbuf; 1623 } 1624 pd->mbuf = NULL; 1625 len -= frag_len; 1626 } 1627 1628 return; 1629 } 1630 1631 static void 1632 oce_rx_lro(struct oce_rq *rq, struct nic_hwlro_singleton_cqe *cqe, struct nic_hwlro_cqe_part2 *cqe2) 1633 { 1634 POCE_SOFTC sc = (POCE_SOFTC) rq->parent; 1635 struct nic_hwlro_cqe_part1 *cqe1 = NULL; 1636 struct mbuf *m = NULL; 1637 struct oce_common_cqe_info cq_info; 1638 1639 /* parse cqe */ 1640 if(cqe2 == NULL) { 1641 cq_info.pkt_size = cqe->pkt_size; 1642 cq_info.vtag = cqe->vlan_tag; 1643 cq_info.l4_cksum_pass = cqe->l4_cksum_pass; 1644 cq_info.ip_cksum_pass = cqe->ip_cksum_pass; 1645 cq_info.ipv6_frame = cqe->ipv6_frame; 1646 cq_info.vtp = cqe->vtp; 1647 cq_info.qnq = cqe->qnq; 1648 }else { 1649 cqe1 = (struct nic_hwlro_cqe_part1 *)cqe; 1650 cq_info.pkt_size = cqe2->coalesced_size; 1651 cq_info.vtag = cqe2->vlan_tag; 1652 cq_info.l4_cksum_pass = cqe2->l4_cksum_pass; 1653 cq_info.ip_cksum_pass = cqe2->ip_cksum_pass; 1654 cq_info.ipv6_frame = cqe2->ipv6_frame; 1655 cq_info.vtp = cqe2->vtp; 1656 cq_info.qnq = cqe1->qnq; 1657 } 1658 1659 cq_info.vtag = BSWAP_16(cq_info.vtag); 1660 1661 cq_info.num_frags = cq_info.pkt_size / rq->cfg.frag_size; 1662 if(cq_info.pkt_size % rq->cfg.frag_size) 1663 cq_info.num_frags++; 1664 1665 oce_rx_mbuf_chain(rq, &cq_info, &m); 1666 1667 if (m) { 1668 if(cqe2) { 1669 //assert(cqe2->valid != 0); 1670 1671 //assert(cqe2->cqe_type != 2); 1672 oce_correct_header(m, cqe1, cqe2); 1673 } 1674 1675 m->m_pkthdr.rcvif = sc->ifp; 1676 #if __FreeBSD_version >= 800000 1677 if (rq->queue_index) 1678 m->m_pkthdr.flowid = (rq->queue_index - 1); 1679 else 1680 m->m_pkthdr.flowid = rq->queue_index; 1681 M_HASHTYPE_SET(m, M_HASHTYPE_OPAQUE); 1682 #endif 1683 /* This deternies if vlan tag is Valid */ 1684 if (cq_info.vtp) { 1685 if (sc->function_mode & FNM_FLEX10_MODE) { 1686 /* FLEX10. If QnQ is not set, neglect VLAN */ 1687 if (cq_info.qnq) { 1688 m->m_pkthdr.ether_vtag = cq_info.vtag; 1689 m->m_flags |= M_VLANTAG; 1690 } 1691 } else if (sc->pvid != (cq_info.vtag & VLAN_VID_MASK)) { 1692 /* In UMC mode generally pvid will be striped by 1693 hw. But in some cases we have seen it comes 1694 with pvid. So if pvid == vlan, neglect vlan. 1695 */ 1696 m->m_pkthdr.ether_vtag = cq_info.vtag; 1697 m->m_flags |= M_VLANTAG; 1698 } 1699 } 1700 if_inc_counter(sc->ifp, IFCOUNTER_IPACKETS, 1); 1701 1702 (*sc->ifp->if_input) (sc->ifp, m); 1703 1704 /* Update rx stats per queue */ 1705 rq->rx_stats.rx_pkts++; 1706 rq->rx_stats.rx_bytes += cq_info.pkt_size; 1707 rq->rx_stats.rx_frags += cq_info.num_frags; 1708 rq->rx_stats.rx_ucast_pkts++; 1709 } 1710 return; 1711 } 1712 1713 static void 1714 oce_rx(struct oce_rq *rq, struct oce_nic_rx_cqe *cqe) 1715 { 1716 POCE_SOFTC sc = (POCE_SOFTC) rq->parent; 1717 int len; 1718 struct mbuf *m = NULL; 1719 struct oce_common_cqe_info cq_info; 1720 uint16_t vtag = 0; 1721 1722 /* Is it a flush compl that has no data */ 1723 if(!cqe->u0.s.num_fragments) 1724 goto exit; 1725 1726 len = cqe->u0.s.pkt_size; 1727 if (!len) { 1728 /*partial DMA workaround for Lancer*/ 1729 oce_discard_rx_comp(rq, cqe->u0.s.num_fragments); 1730 goto exit; 1731 } 1732 1733 if (!oce_cqe_portid_valid(sc, cqe)) { 1734 oce_discard_rx_comp(rq, cqe->u0.s.num_fragments); 1735 goto exit; 1736 } 1737 1738 /* Get vlan_tag value */ 1739 if(IS_BE(sc) || IS_SH(sc)) 1740 vtag = BSWAP_16(cqe->u0.s.vlan_tag); 1741 else 1742 vtag = cqe->u0.s.vlan_tag; 1743 1744 cq_info.l4_cksum_pass = cqe->u0.s.l4_cksum_pass; 1745 cq_info.ip_cksum_pass = cqe->u0.s.ip_cksum_pass; 1746 cq_info.ipv6_frame = cqe->u0.s.ip_ver; 1747 cq_info.num_frags = cqe->u0.s.num_fragments; 1748 cq_info.pkt_size = cqe->u0.s.pkt_size; 1749 1750 oce_rx_mbuf_chain(rq, &cq_info, &m); 1751 1752 if (m) { 1753 m->m_pkthdr.rcvif = sc->ifp; 1754 #if __FreeBSD_version >= 800000 1755 if (rq->queue_index) 1756 m->m_pkthdr.flowid = (rq->queue_index - 1); 1757 else 1758 m->m_pkthdr.flowid = rq->queue_index; 1759 M_HASHTYPE_SET(m, M_HASHTYPE_OPAQUE); 1760 #endif 1761 /* This deternies if vlan tag is Valid */ 1762 if (oce_cqe_vtp_valid(sc, cqe)) { 1763 if (sc->function_mode & FNM_FLEX10_MODE) { 1764 /* FLEX10. If QnQ is not set, neglect VLAN */ 1765 if (cqe->u0.s.qnq) { 1766 m->m_pkthdr.ether_vtag = vtag; 1767 m->m_flags |= M_VLANTAG; 1768 } 1769 } else if (sc->pvid != (vtag & VLAN_VID_MASK)) { 1770 /* In UMC mode generally pvid will be striped by 1771 hw. But in some cases we have seen it comes 1772 with pvid. So if pvid == vlan, neglect vlan. 1773 */ 1774 m->m_pkthdr.ether_vtag = vtag; 1775 m->m_flags |= M_VLANTAG; 1776 } 1777 } 1778 1779 if_inc_counter(sc->ifp, IFCOUNTER_IPACKETS, 1); 1780 #if defined(INET6) || defined(INET) 1781 /* Try to queue to LRO */ 1782 if (IF_LRO_ENABLED(sc) && 1783 (cqe->u0.s.ip_cksum_pass) && 1784 (cqe->u0.s.l4_cksum_pass) && 1785 (!cqe->u0.s.ip_ver) && 1786 (rq->lro.lro_cnt != 0)) { 1787 1788 if (tcp_lro_rx(&rq->lro, m, 0) == 0) { 1789 rq->lro_pkts_queued ++; 1790 goto post_done; 1791 } 1792 /* If LRO posting fails then try to post to STACK */ 1793 } 1794 #endif 1795 1796 (*sc->ifp->if_input) (sc->ifp, m); 1797 #if defined(INET6) || defined(INET) 1798 post_done: 1799 #endif 1800 /* Update rx stats per queue */ 1801 rq->rx_stats.rx_pkts++; 1802 rq->rx_stats.rx_bytes += cqe->u0.s.pkt_size; 1803 rq->rx_stats.rx_frags += cqe->u0.s.num_fragments; 1804 if (cqe->u0.s.pkt_type == OCE_MULTICAST_PACKET) 1805 rq->rx_stats.rx_mcast_pkts++; 1806 if (cqe->u0.s.pkt_type == OCE_UNICAST_PACKET) 1807 rq->rx_stats.rx_ucast_pkts++; 1808 } 1809 exit: 1810 return; 1811 } 1812 1813 1814 void 1815 oce_discard_rx_comp(struct oce_rq *rq, int num_frags) 1816 { 1817 uint32_t i = 0; 1818 struct oce_packet_desc *pd; 1819 POCE_SOFTC sc = (POCE_SOFTC) rq->parent; 1820 1821 for (i = 0; i < num_frags; i++) { 1822 if (rq->ring->cidx == rq->ring->pidx) { 1823 device_printf(sc->dev, 1824 "oce_discard_rx_comp: Invalid RX completion - Queue is empty\n"); 1825 return; 1826 } 1827 pd = &rq->pckts[rq->ring->cidx]; 1828 bus_dmamap_sync(rq->tag, pd->map, BUS_DMASYNC_POSTWRITE); 1829 bus_dmamap_unload(rq->tag, pd->map); 1830 if (pd->mbuf != NULL) { 1831 m_freem(pd->mbuf); 1832 pd->mbuf = NULL; 1833 } 1834 1835 RING_GET(rq->ring, 1); 1836 rq->pending--; 1837 } 1838 } 1839 1840 1841 static int 1842 oce_cqe_vtp_valid(POCE_SOFTC sc, struct oce_nic_rx_cqe *cqe) 1843 { 1844 struct oce_nic_rx_cqe_v1 *cqe_v1; 1845 int vtp = 0; 1846 1847 if (sc->be3_native) { 1848 cqe_v1 = (struct oce_nic_rx_cqe_v1 *)cqe; 1849 vtp = cqe_v1->u0.s.vlan_tag_present; 1850 } else 1851 vtp = cqe->u0.s.vlan_tag_present; 1852 1853 return vtp; 1854 1855 } 1856 1857 1858 static int 1859 oce_cqe_portid_valid(POCE_SOFTC sc, struct oce_nic_rx_cqe *cqe) 1860 { 1861 struct oce_nic_rx_cqe_v1 *cqe_v1; 1862 int port_id = 0; 1863 1864 if (sc->be3_native && (IS_BE(sc) || IS_SH(sc))) { 1865 cqe_v1 = (struct oce_nic_rx_cqe_v1 *)cqe; 1866 port_id = cqe_v1->u0.s.port; 1867 if (sc->port_id != port_id) 1868 return 0; 1869 } else 1870 ;/* For BE3 legacy and Lancer this is dummy */ 1871 1872 return 1; 1873 1874 } 1875 1876 #if defined(INET6) || defined(INET) 1877 void 1878 oce_rx_flush_lro(struct oce_rq *rq) 1879 { 1880 struct lro_ctrl *lro = &rq->lro; 1881 POCE_SOFTC sc = (POCE_SOFTC) rq->parent; 1882 1883 if (!IF_LRO_ENABLED(sc)) 1884 return; 1885 1886 tcp_lro_flush_all(lro); 1887 rq->lro_pkts_queued = 0; 1888 1889 return; 1890 } 1891 1892 1893 static int 1894 oce_init_lro(POCE_SOFTC sc) 1895 { 1896 struct lro_ctrl *lro = NULL; 1897 int i = 0, rc = 0; 1898 1899 for (i = 0; i < sc->nrqs; i++) { 1900 lro = &sc->rq[i]->lro; 1901 rc = tcp_lro_init(lro); 1902 if (rc != 0) { 1903 device_printf(sc->dev, "LRO init failed\n"); 1904 return rc; 1905 } 1906 lro->ifp = sc->ifp; 1907 } 1908 1909 return rc; 1910 } 1911 1912 1913 void 1914 oce_free_lro(POCE_SOFTC sc) 1915 { 1916 struct lro_ctrl *lro = NULL; 1917 int i = 0; 1918 1919 for (i = 0; i < sc->nrqs; i++) { 1920 lro = &sc->rq[i]->lro; 1921 if (lro) 1922 tcp_lro_free(lro); 1923 } 1924 } 1925 #endif 1926 1927 int 1928 oce_alloc_rx_bufs(struct oce_rq *rq, int count) 1929 { 1930 POCE_SOFTC sc = (POCE_SOFTC) rq->parent; 1931 int i, in, rc; 1932 struct oce_packet_desc *pd; 1933 bus_dma_segment_t segs[6]; 1934 int nsegs, added = 0; 1935 struct oce_nic_rqe *rqe; 1936 pd_rxulp_db_t rxdb_reg; 1937 uint32_t val = 0; 1938 uint32_t oce_max_rq_posts = 64; 1939 1940 bzero(&rxdb_reg, sizeof(pd_rxulp_db_t)); 1941 for (i = 0; i < count; i++) { 1942 in = (rq->ring->pidx + 1) % OCE_RQ_PACKET_ARRAY_SIZE; 1943 1944 pd = &rq->pckts[rq->ring->pidx]; 1945 pd->mbuf = m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR, oce_rq_buf_size); 1946 if (pd->mbuf == NULL) { 1947 device_printf(sc->dev, "mbuf allocation failed, size = %d\n",oce_rq_buf_size); 1948 break; 1949 } 1950 pd->mbuf->m_nextpkt = NULL; 1951 1952 pd->mbuf->m_len = pd->mbuf->m_pkthdr.len = rq->cfg.frag_size; 1953 1954 rc = bus_dmamap_load_mbuf_sg(rq->tag, 1955 pd->map, 1956 pd->mbuf, 1957 segs, &nsegs, BUS_DMA_NOWAIT); 1958 if (rc) { 1959 m_free(pd->mbuf); 1960 device_printf(sc->dev, "bus_dmamap_load_mbuf_sg failed rc = %d\n", rc); 1961 break; 1962 } 1963 1964 if (nsegs != 1) { 1965 i--; 1966 continue; 1967 } 1968 1969 bus_dmamap_sync(rq->tag, pd->map, BUS_DMASYNC_PREREAD); 1970 1971 rqe = RING_GET_PRODUCER_ITEM_VA(rq->ring, struct oce_nic_rqe); 1972 rqe->u0.s.frag_pa_hi = ADDR_HI(segs[0].ds_addr); 1973 rqe->u0.s.frag_pa_lo = ADDR_LO(segs[0].ds_addr); 1974 DW_SWAP(u32ptr(rqe), sizeof(struct oce_nic_rqe)); 1975 RING_PUT(rq->ring, 1); 1976 added++; 1977 rq->pending++; 1978 } 1979 oce_max_rq_posts = sc->enable_hwlro ? OCE_HWLRO_MAX_RQ_POSTS : OCE_MAX_RQ_POSTS; 1980 if (added != 0) { 1981 for (i = added / oce_max_rq_posts; i > 0; i--) { 1982 rxdb_reg.bits.num_posted = oce_max_rq_posts; 1983 rxdb_reg.bits.qid = rq->rq_id; 1984 if(rq->islro) { 1985 val |= rq->rq_id & DB_LRO_RQ_ID_MASK; 1986 val |= oce_max_rq_posts << 16; 1987 OCE_WRITE_REG32(sc, db, DB_OFFSET, val); 1988 }else { 1989 OCE_WRITE_REG32(sc, db, PD_RXULP_DB, rxdb_reg.dw0); 1990 } 1991 added -= oce_max_rq_posts; 1992 } 1993 if (added > 0) { 1994 rxdb_reg.bits.qid = rq->rq_id; 1995 rxdb_reg.bits.num_posted = added; 1996 if(rq->islro) { 1997 val |= rq->rq_id & DB_LRO_RQ_ID_MASK; 1998 val |= added << 16; 1999 OCE_WRITE_REG32(sc, db, DB_OFFSET, val); 2000 }else { 2001 OCE_WRITE_REG32(sc, db, PD_RXULP_DB, rxdb_reg.dw0); 2002 } 2003 } 2004 } 2005 2006 return 0; 2007 } 2008 2009 static void 2010 oce_check_rx_bufs(POCE_SOFTC sc, uint32_t num_cqes, struct oce_rq *rq) 2011 { 2012 if (num_cqes) { 2013 oce_arm_cq(sc, rq->cq->cq_id, num_cqes, FALSE); 2014 if(!sc->enable_hwlro) { 2015 if((OCE_RQ_PACKET_ARRAY_SIZE - rq->pending) > 1) 2016 oce_alloc_rx_bufs(rq, ((OCE_RQ_PACKET_ARRAY_SIZE - rq->pending) - 1)); 2017 }else { 2018 if ((OCE_RQ_PACKET_ARRAY_SIZE -1 - rq->pending) > 64) 2019 oce_alloc_rx_bufs(rq, 64); 2020 } 2021 } 2022 2023 return; 2024 } 2025 2026 uint16_t 2027 oce_rq_handler_lro(void *arg) 2028 { 2029 struct oce_rq *rq = (struct oce_rq *)arg; 2030 struct oce_cq *cq = rq->cq; 2031 POCE_SOFTC sc = rq->parent; 2032 struct nic_hwlro_singleton_cqe *cqe; 2033 struct nic_hwlro_cqe_part2 *cqe2; 2034 int num_cqes = 0; 2035 2036 LOCK(&rq->rx_lock); 2037 bus_dmamap_sync(cq->ring->dma.tag,cq->ring->dma.map, BUS_DMASYNC_POSTWRITE); 2038 cqe = RING_GET_CONSUMER_ITEM_VA(cq->ring, struct nic_hwlro_singleton_cqe); 2039 while (cqe->valid) { 2040 if(cqe->cqe_type == 0) { /* singleton cqe */ 2041 /* we should not get singleton cqe after cqe1 on same rq */ 2042 if(rq->cqe_firstpart != NULL) { 2043 device_printf(sc->dev, "Got singleton cqe after cqe1 \n"); 2044 goto exit_rq_handler_lro; 2045 } 2046 if(cqe->error != 0) { 2047 rq->rx_stats.rxcp_err++; 2048 if_inc_counter(sc->ifp, IFCOUNTER_IERRORS, 1); 2049 } 2050 oce_rx_lro(rq, cqe, NULL); 2051 rq->rx_stats.rx_compl++; 2052 cqe->valid = 0; 2053 RING_GET(cq->ring, 1); 2054 num_cqes++; 2055 if (num_cqes >= (IS_XE201(sc) ? 8 : oce_max_rsp_handled)) 2056 break; 2057 }else if(cqe->cqe_type == 0x1) { /* first part */ 2058 /* we should not get cqe1 after cqe1 on same rq */ 2059 if(rq->cqe_firstpart != NULL) { 2060 device_printf(sc->dev, "Got cqe1 after cqe1 \n"); 2061 goto exit_rq_handler_lro; 2062 } 2063 rq->cqe_firstpart = (struct nic_hwlro_cqe_part1 *)cqe; 2064 RING_GET(cq->ring, 1); 2065 }else if(cqe->cqe_type == 0x2) { /* second part */ 2066 cqe2 = (struct nic_hwlro_cqe_part2 *)cqe; 2067 if(cqe2->error != 0) { 2068 rq->rx_stats.rxcp_err++; 2069 if_inc_counter(sc->ifp, IFCOUNTER_IERRORS, 1); 2070 } 2071 /* We should not get cqe2 without cqe1 */ 2072 if(rq->cqe_firstpart == NULL) { 2073 device_printf(sc->dev, "Got cqe2 without cqe1 \n"); 2074 goto exit_rq_handler_lro; 2075 } 2076 oce_rx_lro(rq, (struct nic_hwlro_singleton_cqe *)rq->cqe_firstpart, cqe2); 2077 2078 rq->rx_stats.rx_compl++; 2079 rq->cqe_firstpart->valid = 0; 2080 cqe2->valid = 0; 2081 rq->cqe_firstpart = NULL; 2082 2083 RING_GET(cq->ring, 1); 2084 num_cqes += 2; 2085 if (num_cqes >= (IS_XE201(sc) ? 8 : oce_max_rsp_handled)) 2086 break; 2087 } 2088 2089 bus_dmamap_sync(cq->ring->dma.tag,cq->ring->dma.map, BUS_DMASYNC_POSTWRITE); 2090 cqe = RING_GET_CONSUMER_ITEM_VA(cq->ring, struct nic_hwlro_singleton_cqe); 2091 } 2092 oce_check_rx_bufs(sc, num_cqes, rq); 2093 exit_rq_handler_lro: 2094 UNLOCK(&rq->rx_lock); 2095 return 0; 2096 } 2097 2098 /* Handle the Completion Queue for receive */ 2099 uint16_t 2100 oce_rq_handler(void *arg) 2101 { 2102 struct oce_rq *rq = (struct oce_rq *)arg; 2103 struct oce_cq *cq = rq->cq; 2104 POCE_SOFTC sc = rq->parent; 2105 struct oce_nic_rx_cqe *cqe; 2106 int num_cqes = 0; 2107 2108 if(rq->islro) { 2109 oce_rq_handler_lro(arg); 2110 return 0; 2111 } 2112 LOCK(&rq->rx_lock); 2113 bus_dmamap_sync(cq->ring->dma.tag, 2114 cq->ring->dma.map, BUS_DMASYNC_POSTWRITE); 2115 cqe = RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_nic_rx_cqe); 2116 while (cqe->u0.dw[2]) { 2117 DW_SWAP((uint32_t *) cqe, sizeof(oce_rq_cqe)); 2118 2119 if (cqe->u0.s.error == 0) { 2120 oce_rx(rq, cqe); 2121 } else { 2122 rq->rx_stats.rxcp_err++; 2123 if_inc_counter(sc->ifp, IFCOUNTER_IERRORS, 1); 2124 /* Post L3/L4 errors to stack.*/ 2125 oce_rx(rq, cqe); 2126 } 2127 rq->rx_stats.rx_compl++; 2128 cqe->u0.dw[2] = 0; 2129 2130 #if defined(INET6) || defined(INET) 2131 if (IF_LRO_ENABLED(sc) && rq->lro_pkts_queued >= 16) { 2132 oce_rx_flush_lro(rq); 2133 } 2134 #endif 2135 2136 RING_GET(cq->ring, 1); 2137 bus_dmamap_sync(cq->ring->dma.tag, 2138 cq->ring->dma.map, BUS_DMASYNC_POSTWRITE); 2139 cqe = 2140 RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_nic_rx_cqe); 2141 num_cqes++; 2142 if (num_cqes >= (IS_XE201(sc) ? 8 : oce_max_rsp_handled)) 2143 break; 2144 } 2145 2146 #if defined(INET6) || defined(INET) 2147 if (IF_LRO_ENABLED(sc)) 2148 oce_rx_flush_lro(rq); 2149 #endif 2150 2151 oce_check_rx_bufs(sc, num_cqes, rq); 2152 UNLOCK(&rq->rx_lock); 2153 return 0; 2154 2155 } 2156 2157 2158 2159 2160 /***************************************************************************** 2161 * Helper function prototypes in this file * 2162 *****************************************************************************/ 2163 2164 static int 2165 oce_attach_ifp(POCE_SOFTC sc) 2166 { 2167 2168 sc->ifp = if_alloc(IFT_ETHER); 2169 if (!sc->ifp) 2170 return ENOMEM; 2171 2172 ifmedia_init(&sc->media, IFM_IMASK, oce_media_change, oce_media_status); 2173 ifmedia_add(&sc->media, IFM_ETHER | IFM_AUTO, 0, NULL); 2174 ifmedia_set(&sc->media, IFM_ETHER | IFM_AUTO); 2175 2176 sc->ifp->if_flags = IFF_BROADCAST | IFF_MULTICAST; 2177 sc->ifp->if_ioctl = oce_ioctl; 2178 sc->ifp->if_start = oce_start; 2179 sc->ifp->if_init = oce_init; 2180 sc->ifp->if_mtu = ETHERMTU; 2181 sc->ifp->if_softc = sc; 2182 #if __FreeBSD_version >= 800000 2183 sc->ifp->if_transmit = oce_multiq_start; 2184 sc->ifp->if_qflush = oce_multiq_flush; 2185 #endif 2186 2187 if_initname(sc->ifp, 2188 device_get_name(sc->dev), device_get_unit(sc->dev)); 2189 2190 sc->ifp->if_snd.ifq_drv_maxlen = OCE_MAX_TX_DESC - 1; 2191 IFQ_SET_MAXLEN(&sc->ifp->if_snd, sc->ifp->if_snd.ifq_drv_maxlen); 2192 IFQ_SET_READY(&sc->ifp->if_snd); 2193 2194 sc->ifp->if_hwassist = OCE_IF_HWASSIST; 2195 sc->ifp->if_hwassist |= CSUM_TSO; 2196 sc->ifp->if_hwassist |= (CSUM_IP | CSUM_TCP | CSUM_UDP); 2197 2198 sc->ifp->if_capabilities = OCE_IF_CAPABILITIES; 2199 sc->ifp->if_capabilities |= IFCAP_HWCSUM; 2200 sc->ifp->if_capabilities |= IFCAP_VLAN_HWFILTER; 2201 2202 #if defined(INET6) || defined(INET) 2203 sc->ifp->if_capabilities |= IFCAP_TSO; 2204 sc->ifp->if_capabilities |= IFCAP_LRO; 2205 sc->ifp->if_capabilities |= IFCAP_VLAN_HWTSO; 2206 #endif 2207 2208 sc->ifp->if_capenable = sc->ifp->if_capabilities; 2209 sc->ifp->if_baudrate = IF_Gbps(10); 2210 2211 #if __FreeBSD_version >= 1000000 2212 sc->ifp->if_hw_tsomax = 65536 - (ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN); 2213 sc->ifp->if_hw_tsomaxsegcount = OCE_MAX_TX_ELEMENTS; 2214 sc->ifp->if_hw_tsomaxsegsize = 4096; 2215 #endif 2216 2217 ether_ifattach(sc->ifp, sc->macaddr.mac_addr); 2218 2219 return 0; 2220 } 2221 2222 2223 static void 2224 oce_add_vlan(void *arg, struct ifnet *ifp, uint16_t vtag) 2225 { 2226 POCE_SOFTC sc = ifp->if_softc; 2227 2228 if (ifp->if_softc != arg) 2229 return; 2230 if ((vtag == 0) || (vtag > 4095)) 2231 return; 2232 2233 sc->vlan_tag[vtag] = 1; 2234 sc->vlans_added++; 2235 if (sc->vlans_added <= (sc->max_vlans + 1)) 2236 oce_vid_config(sc); 2237 } 2238 2239 2240 static void 2241 oce_del_vlan(void *arg, struct ifnet *ifp, uint16_t vtag) 2242 { 2243 POCE_SOFTC sc = ifp->if_softc; 2244 2245 if (ifp->if_softc != arg) 2246 return; 2247 if ((vtag == 0) || (vtag > 4095)) 2248 return; 2249 2250 sc->vlan_tag[vtag] = 0; 2251 sc->vlans_added--; 2252 oce_vid_config(sc); 2253 } 2254 2255 2256 /* 2257 * A max of 64 vlans can be configured in BE. If the user configures 2258 * more, place the card in vlan promiscuous mode. 2259 */ 2260 static int 2261 oce_vid_config(POCE_SOFTC sc) 2262 { 2263 struct normal_vlan vtags[MAX_VLANFILTER_SIZE]; 2264 uint16_t ntags = 0, i; 2265 int status = 0; 2266 2267 if ((sc->vlans_added <= MAX_VLANFILTER_SIZE) && 2268 (sc->ifp->if_capenable & IFCAP_VLAN_HWFILTER)) { 2269 for (i = 0; i < MAX_VLANS; i++) { 2270 if (sc->vlan_tag[i]) { 2271 vtags[ntags].vtag = i; 2272 ntags++; 2273 } 2274 } 2275 if (ntags) 2276 status = oce_config_vlan(sc, (uint8_t) sc->if_id, 2277 vtags, ntags, 1, 0); 2278 } else 2279 status = oce_config_vlan(sc, (uint8_t) sc->if_id, 2280 NULL, 0, 1, 1); 2281 return status; 2282 } 2283 2284 2285 static void 2286 oce_mac_addr_set(POCE_SOFTC sc) 2287 { 2288 uint32_t old_pmac_id = sc->pmac_id; 2289 int status = 0; 2290 2291 2292 status = bcmp((IF_LLADDR(sc->ifp)), sc->macaddr.mac_addr, 2293 sc->macaddr.size_of_struct); 2294 if (!status) 2295 return; 2296 2297 status = oce_mbox_macaddr_add(sc, (uint8_t *)(IF_LLADDR(sc->ifp)), 2298 sc->if_id, &sc->pmac_id); 2299 if (!status) { 2300 status = oce_mbox_macaddr_del(sc, sc->if_id, old_pmac_id); 2301 bcopy((IF_LLADDR(sc->ifp)), sc->macaddr.mac_addr, 2302 sc->macaddr.size_of_struct); 2303 } 2304 if (status) 2305 device_printf(sc->dev, "Failed update macaddress\n"); 2306 2307 } 2308 2309 2310 static int 2311 oce_handle_passthrough(struct ifnet *ifp, caddr_t data) 2312 { 2313 POCE_SOFTC sc = ifp->if_softc; 2314 struct ifreq *ifr = (struct ifreq *)data; 2315 int rc = ENXIO; 2316 char cookie[32] = {0}; 2317 void *priv_data = ifr_data_get_ptr(ifr); 2318 void *ioctl_ptr; 2319 uint32_t req_size; 2320 struct mbx_hdr req; 2321 OCE_DMA_MEM dma_mem; 2322 struct mbx_common_get_cntl_attr *fw_cmd; 2323 2324 if (copyin(priv_data, cookie, strlen(IOCTL_COOKIE))) 2325 return EFAULT; 2326 2327 if (memcmp(cookie, IOCTL_COOKIE, strlen(IOCTL_COOKIE))) 2328 return EINVAL; 2329 2330 ioctl_ptr = (char *)priv_data + strlen(IOCTL_COOKIE); 2331 if (copyin(ioctl_ptr, &req, sizeof(struct mbx_hdr))) 2332 return EFAULT; 2333 2334 req_size = le32toh(req.u0.req.request_length); 2335 if (req_size > 65536) 2336 return EINVAL; 2337 2338 req_size += sizeof(struct mbx_hdr); 2339 rc = oce_dma_alloc(sc, req_size, &dma_mem, 0); 2340 if (rc) 2341 return ENOMEM; 2342 2343 if (copyin(ioctl_ptr, OCE_DMAPTR(&dma_mem,char), req_size)) { 2344 rc = EFAULT; 2345 goto dma_free; 2346 } 2347 2348 rc = oce_pass_through_mbox(sc, &dma_mem, req_size); 2349 if (rc) { 2350 rc = EIO; 2351 goto dma_free; 2352 } 2353 2354 if (copyout(OCE_DMAPTR(&dma_mem,char), ioctl_ptr, req_size)) 2355 rc = EFAULT; 2356 2357 /* 2358 firmware is filling all the attributes for this ioctl except 2359 the driver version..so fill it 2360 */ 2361 if(req.u0.rsp.opcode == OPCODE_COMMON_GET_CNTL_ATTRIBUTES) { 2362 fw_cmd = (struct mbx_common_get_cntl_attr *) ioctl_ptr; 2363 strncpy(fw_cmd->params.rsp.cntl_attr_info.hba_attr.drv_ver_str, 2364 COMPONENT_REVISION, strlen(COMPONENT_REVISION)); 2365 } 2366 2367 dma_free: 2368 oce_dma_free(sc, &dma_mem); 2369 return rc; 2370 2371 } 2372 2373 static void 2374 oce_eqd_set_periodic(POCE_SOFTC sc) 2375 { 2376 struct oce_set_eqd set_eqd[OCE_MAX_EQ]; 2377 struct oce_aic_obj *aic; 2378 struct oce_eq *eqo; 2379 uint64_t now = 0, delta; 2380 int eqd, i, num = 0; 2381 uint32_t tx_reqs = 0, rxpkts = 0, pps; 2382 struct oce_wq *wq; 2383 struct oce_rq *rq; 2384 2385 #define ticks_to_msecs(t) (1000 * (t) / hz) 2386 2387 for (i = 0 ; i < sc->neqs; i++) { 2388 eqo = sc->eq[i]; 2389 aic = &sc->aic_obj[i]; 2390 /* When setting the static eq delay from the user space */ 2391 if (!aic->enable) { 2392 if (aic->ticks) 2393 aic->ticks = 0; 2394 eqd = aic->et_eqd; 2395 goto modify_eqd; 2396 } 2397 2398 if (i == 0) { 2399 rq = sc->rq[0]; 2400 rxpkts = rq->rx_stats.rx_pkts; 2401 } else 2402 rxpkts = 0; 2403 if (i + 1 < sc->nrqs) { 2404 rq = sc->rq[i + 1]; 2405 rxpkts += rq->rx_stats.rx_pkts; 2406 } 2407 if (i < sc->nwqs) { 2408 wq = sc->wq[i]; 2409 tx_reqs = wq->tx_stats.tx_reqs; 2410 } else 2411 tx_reqs = 0; 2412 now = ticks; 2413 2414 if (!aic->ticks || now < aic->ticks || 2415 rxpkts < aic->prev_rxpkts || tx_reqs < aic->prev_txreqs) { 2416 aic->prev_rxpkts = rxpkts; 2417 aic->prev_txreqs = tx_reqs; 2418 aic->ticks = now; 2419 continue; 2420 } 2421 2422 delta = ticks_to_msecs(now - aic->ticks); 2423 2424 pps = (((uint32_t)(rxpkts - aic->prev_rxpkts) * 1000) / delta) + 2425 (((uint32_t)(tx_reqs - aic->prev_txreqs) * 1000) / delta); 2426 eqd = (pps / 15000) << 2; 2427 if (eqd < 8) 2428 eqd = 0; 2429 2430 /* Make sure that the eq delay is in the known range */ 2431 eqd = min(eqd, aic->max_eqd); 2432 eqd = max(eqd, aic->min_eqd); 2433 2434 aic->prev_rxpkts = rxpkts; 2435 aic->prev_txreqs = tx_reqs; 2436 aic->ticks = now; 2437 2438 modify_eqd: 2439 if (eqd != aic->cur_eqd) { 2440 set_eqd[num].delay_multiplier = (eqd * 65)/100; 2441 set_eqd[num].eq_id = eqo->eq_id; 2442 aic->cur_eqd = eqd; 2443 num++; 2444 } 2445 } 2446 2447 /* Is there atleast one eq that needs to be modified? */ 2448 for(i = 0; i < num; i += 8) { 2449 if((num - i) >=8 ) 2450 oce_mbox_eqd_modify_periodic(sc, &set_eqd[i], 8); 2451 else 2452 oce_mbox_eqd_modify_periodic(sc, &set_eqd[i], (num - i)); 2453 } 2454 2455 } 2456 2457 static void oce_detect_hw_error(POCE_SOFTC sc) 2458 { 2459 2460 uint32_t ue_low = 0, ue_high = 0, ue_low_mask = 0, ue_high_mask = 0; 2461 uint32_t sliport_status = 0, sliport_err1 = 0, sliport_err2 = 0; 2462 uint32_t i; 2463 2464 if (sc->hw_error) 2465 return; 2466 2467 if (IS_XE201(sc)) { 2468 sliport_status = OCE_READ_REG32(sc, db, SLIPORT_STATUS_OFFSET); 2469 if (sliport_status & SLIPORT_STATUS_ERR_MASK) { 2470 sliport_err1 = OCE_READ_REG32(sc, db, SLIPORT_ERROR1_OFFSET); 2471 sliport_err2 = OCE_READ_REG32(sc, db, SLIPORT_ERROR2_OFFSET); 2472 } 2473 } else { 2474 ue_low = OCE_READ_REG32(sc, devcfg, PCICFG_UE_STATUS_LOW); 2475 ue_high = OCE_READ_REG32(sc, devcfg, PCICFG_UE_STATUS_HIGH); 2476 ue_low_mask = OCE_READ_REG32(sc, devcfg, PCICFG_UE_STATUS_LOW_MASK); 2477 ue_high_mask = OCE_READ_REG32(sc, devcfg, PCICFG_UE_STATUS_HI_MASK); 2478 2479 ue_low = (ue_low & ~ue_low_mask); 2480 ue_high = (ue_high & ~ue_high_mask); 2481 } 2482 2483 /* On certain platforms BE hardware can indicate spurious UEs. 2484 * Allow the h/w to stop working completely in case of a real UE. 2485 * Hence not setting the hw_error for UE detection. 2486 */ 2487 if (sliport_status & SLIPORT_STATUS_ERR_MASK) { 2488 sc->hw_error = TRUE; 2489 device_printf(sc->dev, "Error detected in the card\n"); 2490 } 2491 2492 if (sliport_status & SLIPORT_STATUS_ERR_MASK) { 2493 device_printf(sc->dev, 2494 "ERR: sliport status 0x%x\n", sliport_status); 2495 device_printf(sc->dev, 2496 "ERR: sliport error1 0x%x\n", sliport_err1); 2497 device_printf(sc->dev, 2498 "ERR: sliport error2 0x%x\n", sliport_err2); 2499 } 2500 2501 if (ue_low) { 2502 for (i = 0; ue_low; ue_low >>= 1, i++) { 2503 if (ue_low & 1) 2504 device_printf(sc->dev, "UE: %s bit set\n", 2505 ue_status_low_desc[i]); 2506 } 2507 } 2508 2509 if (ue_high) { 2510 for (i = 0; ue_high; ue_high >>= 1, i++) { 2511 if (ue_high & 1) 2512 device_printf(sc->dev, "UE: %s bit set\n", 2513 ue_status_hi_desc[i]); 2514 } 2515 } 2516 2517 } 2518 2519 2520 static void 2521 oce_local_timer(void *arg) 2522 { 2523 POCE_SOFTC sc = arg; 2524 int i = 0; 2525 2526 oce_detect_hw_error(sc); 2527 oce_refresh_nic_stats(sc); 2528 oce_refresh_queue_stats(sc); 2529 oce_mac_addr_set(sc); 2530 2531 /* TX Watch Dog*/ 2532 for (i = 0; i < sc->nwqs; i++) 2533 oce_tx_restart(sc, sc->wq[i]); 2534 2535 /* calculate and set the eq delay for optimal interrupt rate */ 2536 if (IS_BE(sc) || IS_SH(sc)) 2537 oce_eqd_set_periodic(sc); 2538 2539 callout_reset(&sc->timer, hz, oce_local_timer, sc); 2540 } 2541 2542 static void 2543 oce_tx_compl_clean(POCE_SOFTC sc) 2544 { 2545 struct oce_wq *wq; 2546 int i = 0, timeo = 0, num_wqes = 0; 2547 int pending_txqs = sc->nwqs; 2548 2549 /* Stop polling for compls when HW has been silent for 10ms or 2550 * hw_error or no outstanding completions expected 2551 */ 2552 do { 2553 pending_txqs = sc->nwqs; 2554 2555 for_all_wq_queues(sc, wq, i) { 2556 num_wqes = oce_wq_handler(wq); 2557 2558 if(num_wqes) 2559 timeo = 0; 2560 2561 if(!wq->ring->num_used) 2562 pending_txqs--; 2563 } 2564 2565 if (pending_txqs == 0 || ++timeo > 10 || sc->hw_error) 2566 break; 2567 2568 DELAY(1000); 2569 } while (TRUE); 2570 2571 for_all_wq_queues(sc, wq, i) { 2572 while(wq->ring->num_used) { 2573 LOCK(&wq->tx_compl_lock); 2574 oce_process_tx_completion(wq); 2575 UNLOCK(&wq->tx_compl_lock); 2576 } 2577 } 2578 2579 } 2580 2581 /* NOTE : This should only be called holding 2582 * DEVICE_LOCK. 2583 */ 2584 static void 2585 oce_if_deactivate(POCE_SOFTC sc) 2586 { 2587 int i; 2588 struct oce_rq *rq; 2589 struct oce_wq *wq; 2590 struct oce_eq *eq; 2591 2592 sc->ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); 2593 2594 oce_tx_compl_clean(sc); 2595 2596 /* Stop intrs and finish any bottom halves pending */ 2597 oce_hw_intr_disable(sc); 2598 2599 /* Since taskqueue_drain takes a Gaint Lock, We should not acquire 2600 any other lock. So unlock device lock and require after 2601 completing taskqueue_drain. 2602 */ 2603 UNLOCK(&sc->dev_lock); 2604 for (i = 0; i < sc->intr_count; i++) { 2605 if (sc->intrs[i].tq != NULL) { 2606 taskqueue_drain(sc->intrs[i].tq, &sc->intrs[i].task); 2607 } 2608 } 2609 LOCK(&sc->dev_lock); 2610 2611 /* Delete RX queue in card with flush param */ 2612 oce_stop_rx(sc); 2613 2614 /* Invalidate any pending cq and eq entries*/ 2615 for_all_evnt_queues(sc, eq, i) 2616 oce_drain_eq(eq); 2617 for_all_rq_queues(sc, rq, i) 2618 oce_drain_rq_cq(rq); 2619 for_all_wq_queues(sc, wq, i) 2620 oce_drain_wq_cq(wq); 2621 2622 /* But still we need to get MCC aync events. 2623 So enable intrs and also arm first EQ 2624 */ 2625 oce_hw_intr_enable(sc); 2626 oce_arm_eq(sc, sc->eq[0]->eq_id, 0, TRUE, FALSE); 2627 2628 DELAY(10); 2629 } 2630 2631 2632 static void 2633 oce_if_activate(POCE_SOFTC sc) 2634 { 2635 struct oce_eq *eq; 2636 struct oce_rq *rq; 2637 struct oce_wq *wq; 2638 int i, rc = 0; 2639 2640 sc->ifp->if_drv_flags |= IFF_DRV_RUNNING; 2641 2642 oce_hw_intr_disable(sc); 2643 2644 oce_start_rx(sc); 2645 2646 for_all_rq_queues(sc, rq, i) { 2647 rc = oce_start_rq(rq); 2648 if (rc) 2649 device_printf(sc->dev, "Unable to start RX\n"); 2650 } 2651 2652 for_all_wq_queues(sc, wq, i) { 2653 rc = oce_start_wq(wq); 2654 if (rc) 2655 device_printf(sc->dev, "Unable to start TX\n"); 2656 } 2657 2658 2659 for_all_evnt_queues(sc, eq, i) 2660 oce_arm_eq(sc, eq->eq_id, 0, TRUE, FALSE); 2661 2662 oce_hw_intr_enable(sc); 2663 2664 } 2665 2666 static void 2667 process_link_state(POCE_SOFTC sc, struct oce_async_cqe_link_state *acqe) 2668 { 2669 /* Update Link status */ 2670 if ((acqe->u0.s.link_status & ~ASYNC_EVENT_LOGICAL) == 2671 ASYNC_EVENT_LINK_UP) { 2672 sc->link_status = ASYNC_EVENT_LINK_UP; 2673 if_link_state_change(sc->ifp, LINK_STATE_UP); 2674 } else { 2675 sc->link_status = ASYNC_EVENT_LINK_DOWN; 2676 if_link_state_change(sc->ifp, LINK_STATE_DOWN); 2677 } 2678 } 2679 2680 2681 static void oce_async_grp5_osbmc_process(POCE_SOFTC sc, 2682 struct oce_async_evt_grp5_os2bmc *evt) 2683 { 2684 DW_SWAP(evt, sizeof(struct oce_async_evt_grp5_os2bmc)); 2685 if (evt->u.s.mgmt_enable) 2686 sc->flags |= OCE_FLAGS_OS2BMC; 2687 else 2688 return; 2689 2690 sc->bmc_filt_mask = evt->u.s.arp_filter; 2691 sc->bmc_filt_mask |= (evt->u.s.dhcp_client_filt << 1); 2692 sc->bmc_filt_mask |= (evt->u.s.dhcp_server_filt << 2); 2693 sc->bmc_filt_mask |= (evt->u.s.net_bios_filt << 3); 2694 sc->bmc_filt_mask |= (evt->u.s.bcast_filt << 4); 2695 sc->bmc_filt_mask |= (evt->u.s.ipv6_nbr_filt << 5); 2696 sc->bmc_filt_mask |= (evt->u.s.ipv6_ra_filt << 6); 2697 sc->bmc_filt_mask |= (evt->u.s.ipv6_ras_filt << 7); 2698 sc->bmc_filt_mask |= (evt->u.s.mcast_filt << 8); 2699 } 2700 2701 2702 static void oce_process_grp5_events(POCE_SOFTC sc, struct oce_mq_cqe *cqe) 2703 { 2704 struct oce_async_event_grp5_pvid_state *gcqe; 2705 struct oce_async_evt_grp5_os2bmc *bmccqe; 2706 2707 switch (cqe->u0.s.async_type) { 2708 case ASYNC_EVENT_PVID_STATE: 2709 /* GRP5 PVID */ 2710 gcqe = (struct oce_async_event_grp5_pvid_state *)cqe; 2711 if (gcqe->enabled) 2712 sc->pvid = gcqe->tag & VLAN_VID_MASK; 2713 else 2714 sc->pvid = 0; 2715 break; 2716 case ASYNC_EVENT_OS2BMC: 2717 bmccqe = (struct oce_async_evt_grp5_os2bmc *)cqe; 2718 oce_async_grp5_osbmc_process(sc, bmccqe); 2719 break; 2720 default: 2721 break; 2722 } 2723 } 2724 2725 /* Handle the Completion Queue for the Mailbox/Async notifications */ 2726 uint16_t 2727 oce_mq_handler(void *arg) 2728 { 2729 struct oce_mq *mq = (struct oce_mq *)arg; 2730 POCE_SOFTC sc = mq->parent; 2731 struct oce_cq *cq = mq->cq; 2732 int num_cqes = 0, evt_type = 0, optype = 0; 2733 struct oce_mq_cqe *cqe; 2734 struct oce_async_cqe_link_state *acqe; 2735 struct oce_async_event_qnq *dbgcqe; 2736 2737 2738 bus_dmamap_sync(cq->ring->dma.tag, 2739 cq->ring->dma.map, BUS_DMASYNC_POSTWRITE); 2740 cqe = RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_mq_cqe); 2741 2742 while (cqe->u0.dw[3]) { 2743 DW_SWAP((uint32_t *) cqe, sizeof(oce_mq_cqe)); 2744 if (cqe->u0.s.async_event) { 2745 evt_type = cqe->u0.s.event_type; 2746 optype = cqe->u0.s.async_type; 2747 if (evt_type == ASYNC_EVENT_CODE_LINK_STATE) { 2748 /* Link status evt */ 2749 acqe = (struct oce_async_cqe_link_state *)cqe; 2750 process_link_state(sc, acqe); 2751 } else if (evt_type == ASYNC_EVENT_GRP5) { 2752 oce_process_grp5_events(sc, cqe); 2753 } else if (evt_type == ASYNC_EVENT_CODE_DEBUG && 2754 optype == ASYNC_EVENT_DEBUG_QNQ) { 2755 dbgcqe = (struct oce_async_event_qnq *)cqe; 2756 if(dbgcqe->valid) 2757 sc->qnqid = dbgcqe->vlan_tag; 2758 sc->qnq_debug_event = TRUE; 2759 } 2760 } 2761 cqe->u0.dw[3] = 0; 2762 RING_GET(cq->ring, 1); 2763 bus_dmamap_sync(cq->ring->dma.tag, 2764 cq->ring->dma.map, BUS_DMASYNC_POSTWRITE); 2765 cqe = RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_mq_cqe); 2766 num_cqes++; 2767 } 2768 2769 if (num_cqes) 2770 oce_arm_cq(sc, cq->cq_id, num_cqes, FALSE); 2771 2772 return 0; 2773 } 2774 2775 2776 static void 2777 setup_max_queues_want(POCE_SOFTC sc) 2778 { 2779 /* Check if it is FLEX machine. Is so dont use RSS */ 2780 if ((sc->function_mode & FNM_FLEX10_MODE) || 2781 (sc->function_mode & FNM_UMC_MODE) || 2782 (sc->function_mode & FNM_VNIC_MODE) || 2783 (!is_rss_enabled(sc)) || 2784 IS_BE2(sc)) { 2785 sc->nrqs = 1; 2786 sc->nwqs = 1; 2787 } else { 2788 sc->nrqs = MIN(OCE_NCPUS, sc->nrssqs) + 1; 2789 sc->nwqs = MIN(OCE_NCPUS, sc->nrssqs); 2790 } 2791 2792 if (IS_BE2(sc) && is_rss_enabled(sc)) 2793 sc->nrqs = MIN(OCE_NCPUS, sc->nrssqs) + 1; 2794 } 2795 2796 2797 static void 2798 update_queues_got(POCE_SOFTC sc) 2799 { 2800 if (is_rss_enabled(sc)) { 2801 sc->nrqs = sc->intr_count + 1; 2802 sc->nwqs = sc->intr_count; 2803 } else { 2804 sc->nrqs = 1; 2805 sc->nwqs = 1; 2806 } 2807 2808 if (IS_BE2(sc)) 2809 sc->nwqs = 1; 2810 } 2811 2812 static int 2813 oce_check_ipv6_ext_hdr(struct mbuf *m) 2814 { 2815 struct ether_header *eh = mtod(m, struct ether_header *); 2816 caddr_t m_datatemp = m->m_data; 2817 2818 if (eh->ether_type == htons(ETHERTYPE_IPV6)) { 2819 m->m_data += sizeof(struct ether_header); 2820 struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *); 2821 2822 if((ip6->ip6_nxt != IPPROTO_TCP) && \ 2823 (ip6->ip6_nxt != IPPROTO_UDP)){ 2824 struct ip6_ext *ip6e = NULL; 2825 m->m_data += sizeof(struct ip6_hdr); 2826 2827 ip6e = (struct ip6_ext *) mtod(m, struct ip6_ext *); 2828 if(ip6e->ip6e_len == 0xff) { 2829 m->m_data = m_datatemp; 2830 return TRUE; 2831 } 2832 } 2833 m->m_data = m_datatemp; 2834 } 2835 return FALSE; 2836 } 2837 2838 static int 2839 is_be3_a1(POCE_SOFTC sc) 2840 { 2841 if((sc->flags & OCE_FLAGS_BE3) && ((sc->asic_revision & 0xFF) < 2)) { 2842 return TRUE; 2843 } 2844 return FALSE; 2845 } 2846 2847 static struct mbuf * 2848 oce_insert_vlan_tag(POCE_SOFTC sc, struct mbuf *m, boolean_t *complete) 2849 { 2850 uint16_t vlan_tag = 0; 2851 2852 if(!M_WRITABLE(m)) 2853 return NULL; 2854 2855 /* Embed vlan tag in the packet if it is not part of it */ 2856 if(m->m_flags & M_VLANTAG) { 2857 vlan_tag = EVL_VLANOFTAG(m->m_pkthdr.ether_vtag); 2858 m->m_flags &= ~M_VLANTAG; 2859 } 2860 2861 /* if UMC, ignore vlan tag insertion and instead insert pvid */ 2862 if(sc->pvid) { 2863 if(!vlan_tag) 2864 vlan_tag = sc->pvid; 2865 if (complete) 2866 *complete = FALSE; 2867 } 2868 2869 if(vlan_tag) { 2870 m = ether_vlanencap(m, vlan_tag); 2871 } 2872 2873 if(sc->qnqid) { 2874 m = ether_vlanencap(m, sc->qnqid); 2875 2876 if (complete) 2877 *complete = FALSE; 2878 } 2879 return m; 2880 } 2881 2882 static int 2883 oce_tx_asic_stall_verify(POCE_SOFTC sc, struct mbuf *m) 2884 { 2885 if(is_be3_a1(sc) && IS_QNQ_OR_UMC(sc) && \ 2886 oce_check_ipv6_ext_hdr(m)) { 2887 return TRUE; 2888 } 2889 return FALSE; 2890 } 2891 2892 static void 2893 oce_get_config(POCE_SOFTC sc) 2894 { 2895 int rc = 0; 2896 uint32_t max_rss = 0; 2897 2898 if ((IS_BE(sc) || IS_SH(sc)) && (!sc->be3_native)) 2899 max_rss = OCE_LEGACY_MODE_RSS; 2900 else 2901 max_rss = OCE_MAX_RSS; 2902 2903 if (!IS_BE(sc)) { 2904 rc = oce_get_profile_config(sc, max_rss); 2905 if (rc) { 2906 sc->nwqs = OCE_MAX_WQ; 2907 sc->nrssqs = max_rss; 2908 sc->nrqs = sc->nrssqs + 1; 2909 } 2910 } 2911 else { /* For BE3 don't rely on fw for determining the resources */ 2912 sc->nrssqs = max_rss; 2913 sc->nrqs = sc->nrssqs + 1; 2914 sc->nwqs = OCE_MAX_WQ; 2915 sc->max_vlans = MAX_VLANFILTER_SIZE; 2916 } 2917 } 2918 2919 static void 2920 oce_rdma_close(void) 2921 { 2922 if (oce_rdma_if != NULL) { 2923 oce_rdma_if = NULL; 2924 } 2925 } 2926 2927 static void 2928 oce_get_mac_addr(POCE_SOFTC sc, uint8_t *macaddr) 2929 { 2930 memcpy(macaddr, sc->macaddr.mac_addr, 6); 2931 } 2932 2933 int 2934 oce_register_rdma(POCE_RDMA_INFO rdma_info, POCE_RDMA_IF rdma_if) 2935 { 2936 POCE_SOFTC sc; 2937 struct oce_dev_info di; 2938 int i; 2939 2940 if ((rdma_info == NULL) || (rdma_if == NULL)) { 2941 return -EINVAL; 2942 } 2943 2944 if ((rdma_info->size != OCE_RDMA_INFO_SIZE) || 2945 (rdma_if->size != OCE_RDMA_IF_SIZE)) { 2946 return -ENXIO; 2947 } 2948 2949 rdma_info->close = oce_rdma_close; 2950 rdma_info->mbox_post = oce_mbox_post; 2951 rdma_info->common_req_hdr_init = mbx_common_req_hdr_init; 2952 rdma_info->get_mac_addr = oce_get_mac_addr; 2953 2954 oce_rdma_if = rdma_if; 2955 2956 sc = softc_head; 2957 while (sc != NULL) { 2958 if (oce_rdma_if->announce != NULL) { 2959 memset(&di, 0, sizeof(di)); 2960 di.dev = sc->dev; 2961 di.softc = sc; 2962 di.ifp = sc->ifp; 2963 di.db_bhandle = sc->db_bhandle; 2964 di.db_btag = sc->db_btag; 2965 di.db_page_size = 4096; 2966 if (sc->flags & OCE_FLAGS_USING_MSIX) { 2967 di.intr_mode = OCE_INTERRUPT_MODE_MSIX; 2968 } else if (sc->flags & OCE_FLAGS_USING_MSI) { 2969 di.intr_mode = OCE_INTERRUPT_MODE_MSI; 2970 } else { 2971 di.intr_mode = OCE_INTERRUPT_MODE_INTX; 2972 } 2973 di.dev_family = OCE_GEN2_FAMILY; // fixme: must detect skyhawk 2974 if (di.intr_mode != OCE_INTERRUPT_MODE_INTX) { 2975 di.msix.num_vectors = sc->intr_count + sc->roce_intr_count; 2976 di.msix.start_vector = sc->intr_count; 2977 for (i=0; i<di.msix.num_vectors; i++) { 2978 di.msix.vector_list[i] = sc->intrs[i].vector; 2979 } 2980 } else { 2981 } 2982 memcpy(di.mac_addr, sc->macaddr.mac_addr, 6); 2983 di.vendor_id = pci_get_vendor(sc->dev); 2984 di.dev_id = pci_get_device(sc->dev); 2985 2986 if (sc->rdma_flags & OCE_RDMA_FLAG_SUPPORTED) { 2987 di.flags |= OCE_RDMA_INFO_RDMA_SUPPORTED; 2988 } 2989 2990 rdma_if->announce(&di); 2991 sc = sc->next; 2992 } 2993 } 2994 2995 return 0; 2996 } 2997 2998 static void 2999 oce_read_env_variables( POCE_SOFTC sc ) 3000 { 3001 char *value = NULL; 3002 int rc = 0; 3003 3004 /* read if user wants to enable hwlro or swlro */ 3005 //value = getenv("oce_enable_hwlro"); 3006 if(value && IS_SH(sc)) { 3007 sc->enable_hwlro = strtol(value, NULL, 10); 3008 if(sc->enable_hwlro) { 3009 rc = oce_mbox_nic_query_lro_capabilities(sc, NULL, NULL); 3010 if(rc) { 3011 device_printf(sc->dev, "no hardware lro support\n"); 3012 device_printf(sc->dev, "software lro enabled\n"); 3013 sc->enable_hwlro = 0; 3014 }else { 3015 device_printf(sc->dev, "hardware lro enabled\n"); 3016 oce_max_rsp_handled = 32; 3017 } 3018 }else { 3019 device_printf(sc->dev, "software lro enabled\n"); 3020 } 3021 }else { 3022 sc->enable_hwlro = 0; 3023 } 3024 3025 /* read mbuf size */ 3026 //value = getenv("oce_rq_buf_size"); 3027 if(value && IS_SH(sc)) { 3028 oce_rq_buf_size = strtol(value, NULL, 10); 3029 switch(oce_rq_buf_size) { 3030 case 2048: 3031 case 4096: 3032 case 9216: 3033 case 16384: 3034 break; 3035 3036 default: 3037 device_printf(sc->dev, " Supported oce_rq_buf_size values are 2K, 4K, 9K, 16K \n"); 3038 oce_rq_buf_size = 2048; 3039 } 3040 } 3041 3042 return; 3043 } 3044