FILE
lio_core.c
File preview with syntax highlighting.
linux-6.19.14/drivers/net/ethernet/cavium/liquidio/lio_core.c
1/********************************************************************** 2 * Author: Cavium, Inc. 3 * 4 * Contact: support@cavium.com 5 * Please include "LiquidIO" in the subject. 6 * 7 * Copyright (c) 2003-2016 Cavium, Inc. 8 * 9 * This file is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License, Version 2, as 11 * published by the Free Software Foundation. 12 * 13 * This file is distributed in the hope that it will be useful, but 14 * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty 15 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 16 * NONINFRINGEMENT. See the GNU General Public License for more details. 17 ***********************************************************************/ 18#include <linux/pci.h> 19#include <linux/if_vlan.h> 20#include "liquidio_common.h" 21#include "octeon_droq.h" 22#include "octeon_iq.h" 23#include "response_manager.h" 24#include "octeon_device.h" 25#include "octeon_nic.h" 26#include "octeon_main.h" 27#include "octeon_network.h" 28 29MODULE_AUTHOR("Cavium Networks, <support@cavium.com>"); 30MODULE_DESCRIPTION("Cavium LiquidIO Intelligent Server Adapter Core"); 31MODULE_LICENSE("GPL"); 32 33/* OOM task polling interval */ 34#define LIO_OOM_POLL_INTERVAL_MS 250 35 36#define OCTNIC_MAX_SG MAX_SKB_FRAGS 37 38/** 39 * lio_delete_glists - Delete gather lists 40 * @lio: per-network private data 41 */ 42void lio_delete_glists(struct lio *lio) 43{ 44 struct octnic_gather *g; 45 int i; 46 47 kfree(lio->glist_lock); 48 lio->glist_lock = NULL; 49 50 if (!lio->glist) 51 return; 52 53 for (i = 0; i < lio->oct_dev->num_iqs; i++) { 54 do { 55 g = (struct octnic_gather *) 56 lio_list_delete_head(&lio->glist[i]); 57 kfree(g); 58 } while (g); 59 60 if (lio->glists_virt_base && lio->glists_virt_base[i] && 61 lio->glists_dma_base && lio->glists_dma_base[i]) { 62 lio_dma_free(lio->oct_dev, 63 lio->glist_entry_size * lio->tx_qsize, 64 lio->glists_virt_base[i], 65 lio->glists_dma_base[i]); 66 } 67 } 68 69 kfree(lio->glists_virt_base); 70 lio->glists_virt_base = NULL; 71 72 kfree(lio->glists_dma_base); 73 lio->glists_dma_base = NULL; 74 75 kfree(lio->glist); 76 lio->glist = NULL; 77} 78EXPORT_SYMBOL_GPL(lio_delete_glists); 79 80/** 81 * lio_setup_glists - Setup gather lists 82 * @oct: octeon_device 83 * @lio: per-network private data 84 * @num_iqs: count of iqs to allocate 85 */ 86int lio_setup_glists(struct octeon_device *oct, struct lio *lio, int num_iqs) 87{ 88 struct octnic_gather *g; 89 int i, j; 90 91 lio->glist_lock = 92 kcalloc(num_iqs, sizeof(*lio->glist_lock), GFP_KERNEL); 93 if (!lio->glist_lock) 94 return -ENOMEM; 95 96 lio->glist = 97 kcalloc(num_iqs, sizeof(*lio->glist), GFP_KERNEL); 98 if (!lio->glist) { 99 kfree(lio->glist_lock); 100 lio->glist_lock = NULL; 101 return -ENOMEM; 102 } 103 104 lio->glist_entry_size = 105 ROUNDUP8((ROUNDUP4(OCTNIC_MAX_SG) >> 2) * OCT_SG_ENTRY_SIZE); 106 107 /* allocate memory to store virtual and dma base address of 108 * per glist consistent memory 109 */ 110 lio->glists_virt_base = kcalloc(num_iqs, sizeof(*lio->glists_virt_base), 111 GFP_KERNEL); 112 lio->glists_dma_base = kcalloc(num_iqs, sizeof(*lio->glists_dma_base), 113 GFP_KERNEL); 114 115 if (!lio->glists_virt_base || !lio->glists_dma_base) { 116 lio_delete_glists(lio); 117 return -ENOMEM; 118 } 119 120 for (i = 0; i < num_iqs; i++) { 121 int numa_node = dev_to_node(&oct->pci_dev->dev); 122 123 spin_lock_init(&lio->glist_lock[i]); 124 125 INIT_LIST_HEAD(&lio->glist[i]); 126 127 lio->glists_virt_base[i] = 128 lio_dma_alloc(oct, 129 lio->glist_entry_size * lio->tx_qsize, 130 &lio->glists_dma_base[i]); 131 132 if (!lio->glists_virt_base[i]) { 133 lio_delete_glists(lio); 134 return -ENOMEM; 135 } 136 137 for (j = 0; j < lio->tx_qsize; j++) { 138 g = kzalloc_node(sizeof(*g), GFP_KERNEL, 139 numa_node); 140 if (!g) 141 g = kzalloc(sizeof(*g), GFP_KERNEL); 142 if (!g) 143 break; 144 145 g->sg = lio->glists_virt_base[i] + 146 (j * lio->glist_entry_size); 147 148 g->sg_dma_ptr = lio->glists_dma_base[i] + 149 (j * lio->glist_entry_size); 150 151 list_add_tail(&g->list, &lio->glist[i]); 152 } 153 154 if (j != lio->tx_qsize) { 155 lio_delete_glists(lio); 156 return -ENOMEM; 157 } 158 } 159 160 return 0; 161} 162EXPORT_SYMBOL_GPL(lio_setup_glists); 163 164int liquidio_set_feature(struct net_device *netdev, int cmd, u16 param1) 165{ 166 struct lio *lio = GET_LIO(netdev); 167 struct octeon_device *oct = lio->oct_dev; 168 struct octnic_ctrl_pkt nctrl; 169 int ret = 0; 170 171 memset(&nctrl, 0, sizeof(struct octnic_ctrl_pkt)); 172 173 nctrl.ncmd.u64 = 0; 174 nctrl.ncmd.s.cmd = cmd; 175 nctrl.ncmd.s.param1 = param1; 176 nctrl.iq_no = lio->linfo.txpciq[0].s.q_no; 177 nctrl.netpndev = (u64)netdev; 178 nctrl.cb_fn = liquidio_link_ctrl_cmd_completion; 179 180 ret = octnet_send_nic_ctrl_pkt(lio->oct_dev, &nctrl); 181 if (ret) { 182 dev_err(&oct->pci_dev->dev, "Feature change failed in core (ret: 0x%x)\n", 183 ret); 184 if (ret > 0) 185 ret = -EIO; 186 } 187 return ret; 188} 189EXPORT_SYMBOL_GPL(liquidio_set_feature); 190 191void octeon_report_tx_completion_to_bql(void *txq, unsigned int pkts_compl, 192 unsigned int bytes_compl) 193{ 194 struct netdev_queue *netdev_queue = txq; 195 196 netdev_tx_completed_queue(netdev_queue, pkts_compl, bytes_compl); 197} 198 199void octeon_update_tx_completion_counters(void *buf, int reqtype, 200 unsigned int *pkts_compl, 201 unsigned int *bytes_compl) 202{ 203 struct octnet_buf_free_info *finfo; 204 struct sk_buff *skb = NULL; 205 struct octeon_soft_command *sc; 206 207 switch (reqtype) { 208 case REQTYPE_NORESP_NET: 209 case REQTYPE_NORESP_NET_SG: 210 finfo = buf; 211 skb = finfo->skb; 212 break; 213 214 case REQTYPE_RESP_NET_SG: 215 case REQTYPE_RESP_NET: 216 sc = buf; 217 skb = sc->callback_arg; 218 break; 219 220 default: 221 return; 222 } 223 224 (*pkts_compl)++; 225 *bytes_compl += skb->len; 226} 227 228int octeon_report_sent_bytes_to_bql(void *buf, int reqtype) 229{ 230 struct octnet_buf_free_info *finfo; 231 struct sk_buff *skb; 232 struct octeon_soft_command *sc; 233 struct netdev_queue *txq; 234 235 switch (reqtype) { 236 case REQTYPE_NORESP_NET: 237 case REQTYPE_NORESP_NET_SG: 238 finfo = buf; 239 skb = finfo->skb; 240 break; 241 242 case REQTYPE_RESP_NET_SG: 243 case REQTYPE_RESP_NET: 244 sc = buf; 245 skb = sc->callback_arg; 246 break; 247 248 default: 249 return 0; 250 } 251 252 txq = netdev_get_tx_queue(skb->dev, skb_get_queue_mapping(skb)); 253 netdev_tx_sent_queue(txq, skb->len); 254 255 return netif_xmit_stopped(txq); 256} 257 258void liquidio_link_ctrl_cmd_completion(void *nctrl_ptr) 259{ 260 struct octnic_ctrl_pkt *nctrl = (struct octnic_ctrl_pkt *)nctrl_ptr; 261 struct net_device *netdev = (struct net_device *)nctrl->netpndev; 262 struct lio *lio = GET_LIO(netdev); 263 struct octeon_device *oct = lio->oct_dev; 264 u8 *mac; 265 266 if (nctrl->sc_status) 267 return; 268 269 switch (nctrl->ncmd.s.cmd) { 270 case OCTNET_CMD_CHANGE_DEVFLAGS: 271 case OCTNET_CMD_SET_MULTI_LIST: 272 case OCTNET_CMD_SET_UC_LIST: 273 break; 274 275 case OCTNET_CMD_CHANGE_MACADDR: 276 mac = ((u8 *)&nctrl->udd[0]) + 2; 277 if (nctrl->ncmd.s.param1) { 278 /* vfidx is 0 based, but vf_num (param1) is 1 based */ 279 int vfidx = nctrl->ncmd.s.param1 - 1; 280 bool mac_is_admin_assigned = nctrl->ncmd.s.param2; 281 282 if (mac_is_admin_assigned) 283 netif_info(lio, probe, lio->netdev, 284 "MAC Address %pM is configured for VF %d\n", 285 mac, vfidx); 286 } else { 287 netif_info(lio, probe, lio->netdev, 288 " MACAddr changed to %pM\n", 289 mac); 290 } 291 break; 292 293 case OCTNET_CMD_GPIO_ACCESS: 294 netif_info(lio, probe, lio->netdev, "LED Flashing visual identification\n"); 295 296 break; 297 298 case OCTNET_CMD_ID_ACTIVE: 299 netif_info(lio, probe, lio->netdev, "LED Flashing visual identification\n"); 300 301 break; 302 303 case OCTNET_CMD_LRO_ENABLE: 304 dev_info(&oct->pci_dev->dev, "%s LRO Enabled\n", netdev->name); 305 break; 306 307 case OCTNET_CMD_LRO_DISABLE: 308 dev_info(&oct->pci_dev->dev, "%s LRO Disabled\n", 309 netdev->name); 310 break; 311 312 case OCTNET_CMD_VERBOSE_ENABLE: 313 dev_info(&oct->pci_dev->dev, "%s Firmware debug enabled\n", 314 netdev->name); 315 break; 316 317 case OCTNET_CMD_VERBOSE_DISABLE: 318 dev_info(&oct->pci_dev->dev, "%s Firmware debug disabled\n", 319 netdev->name); 320 break; 321 322 case OCTNET_CMD_VLAN_FILTER_CTL: 323 if (nctrl->ncmd.s.param1) 324 dev_info(&oct->pci_dev->dev, 325 "%s VLAN filter enabled\n", netdev->name); 326 else 327 dev_info(&oct->pci_dev->dev, 328 "%s VLAN filter disabled\n", netdev->name); 329 break; 330 331 case OCTNET_CMD_ADD_VLAN_FILTER: 332 dev_info(&oct->pci_dev->dev, "%s VLAN filter %d added\n", 333 netdev->name, nctrl->ncmd.s.param1); 334 break; 335 336 case OCTNET_CMD_DEL_VLAN_FILTER: 337 dev_info(&oct->pci_dev->dev, "%s VLAN filter %d removed\n", 338 netdev->name, nctrl->ncmd.s.param1); 339 break; 340 341 case OCTNET_CMD_SET_SETTINGS: 342 dev_info(&oct->pci_dev->dev, "%s settings changed\n", 343 netdev->name); 344 345 break; 346 347 /* Case to handle "OCTNET_CMD_TNL_RX_CSUM_CTL" 348 * Command passed by NIC driver 349 */ 350 case OCTNET_CMD_TNL_RX_CSUM_CTL: 351 if (nctrl->ncmd.s.param1 == OCTNET_CMD_RXCSUM_ENABLE) { 352 netif_info(lio, probe, lio->netdev, 353 "RX Checksum Offload Enabled\n"); 354 } else if (nctrl->ncmd.s.param1 == 355 OCTNET_CMD_RXCSUM_DISABLE) { 356 netif_info(lio, probe, lio->netdev, 357 "RX Checksum Offload Disabled\n"); 358 } 359 break; 360 361 /* Case to handle "OCTNET_CMD_TNL_TX_CSUM_CTL" 362 * Command passed by NIC driver 363 */ 364 case OCTNET_CMD_TNL_TX_CSUM_CTL: 365 if (nctrl->ncmd.s.param1 == OCTNET_CMD_TXCSUM_ENABLE) { 366 netif_info(lio, probe, lio->netdev, 367 "TX Checksum Offload Enabled\n"); 368 } else if (nctrl->ncmd.s.param1 == 369 OCTNET_CMD_TXCSUM_DISABLE) { 370 netif_info(lio, probe, lio->netdev, 371 "TX Checksum Offload Disabled\n"); 372 } 373 break; 374 375 /* Case to handle "OCTNET_CMD_VXLAN_PORT_CONFIG" 376 * Command passed by NIC driver 377 */ 378 case OCTNET_CMD_VXLAN_PORT_CONFIG: 379 if (nctrl->ncmd.s.more == OCTNET_CMD_VXLAN_PORT_ADD) { 380 netif_info(lio, probe, lio->netdev, 381 "VxLAN Destination UDP PORT:%d ADDED\n", 382 nctrl->ncmd.s.param1); 383 } else if (nctrl->ncmd.s.more == 384 OCTNET_CMD_VXLAN_PORT_DEL) { 385 netif_info(lio, probe, lio->netdev, 386 "VxLAN Destination UDP PORT:%d DELETED\n", 387 nctrl->ncmd.s.param1); 388 } 389 break; 390 391 case OCTNET_CMD_SET_FLOW_CTL: 392 netif_info(lio, probe, lio->netdev, "Set RX/TX flow control parameters\n"); 393 break; 394 395 case OCTNET_CMD_QUEUE_COUNT_CTL: 396 netif_info(lio, probe, lio->netdev, "Queue count updated to %d\n", 397 nctrl->ncmd.s.param1); 398 break; 399 400 default: 401 dev_err(&oct->pci_dev->dev, "%s Unknown cmd %d\n", __func__, 402 nctrl->ncmd.s.cmd); 403 } 404} 405EXPORT_SYMBOL_GPL(liquidio_link_ctrl_cmd_completion); 406 407void octeon_pf_changed_vf_macaddr(struct octeon_device *oct, u8 *mac) 408{ 409 bool macaddr_changed = false; 410 struct net_device *netdev; 411 struct lio *lio; 412 413 rtnl_lock(); 414 415 netdev = oct->props[0].netdev; 416 lio = GET_LIO(netdev); 417 418 lio->linfo.macaddr_is_admin_asgnd = true; 419 420 if (!ether_addr_equal(netdev->dev_addr, mac)) { 421 macaddr_changed = true; 422 eth_hw_addr_set(netdev, mac); 423 ether_addr_copy(((u8 *)&lio->linfo.hw_addr) + 2, mac); 424 call_netdevice_notifiers(NETDEV_CHANGEADDR, netdev); 425 } 426 427 rtnl_unlock(); 428 429 if (macaddr_changed) 430 dev_info(&oct->pci_dev->dev, 431 "PF changed VF's MAC address to %pM\n", mac); 432 433 /* no need to notify the firmware of the macaddr change because 434 * the PF did that already 435 */ 436} 437 438void octeon_schedule_rxq_oom_work(struct octeon_device *oct, 439 struct octeon_droq *droq) 440{ 441 struct net_device *netdev = oct->props[0].netdev; 442 struct lio *lio = GET_LIO(netdev); 443 struct cavium_wq *wq = &lio->rxq_status_wq[droq->q_no]; 444 445 queue_delayed_work(wq->wq, &wq->wk.work, 446 msecs_to_jiffies(LIO_OOM_POLL_INTERVAL_MS)); 447} 448 449static void octnet_poll_check_rxq_oom_status(struct work_struct *work) 450{ 451 struct cavium_wk *wk = (struct cavium_wk *)work; 452 struct lio *lio = (struct lio *)wk->ctxptr; 453 struct octeon_device *oct = lio->oct_dev; 454 int q_no = wk->ctxul; 455 struct octeon_droq *droq = oct->droq[q_no]; 456 457 if (!ifstate_check(lio, LIO_IFSTATE_RUNNING) || !droq) 458 return; 459 460 if (octeon_retry_droq_refill(droq)) 461 octeon_schedule_rxq_oom_work(oct, droq); 462} 463 464int setup_rx_oom_poll_fn(struct net_device *netdev) 465{ 466 struct lio *lio = GET_LIO(netdev); 467 struct octeon_device *oct = lio->oct_dev; 468 struct cavium_wq *wq; 469 int q, q_no; 470 471 for (q = 0; q < oct->num_oqs; q++) { 472 q_no = lio->linfo.rxpciq[q].s.q_no; 473 wq = &lio->rxq_status_wq[q_no]; 474 wq->wq = alloc_workqueue("rxq-oom-status", 475 WQ_MEM_RECLAIM | WQ_PERCPU, 0); 476 if (!wq->wq) { 477 dev_err(&oct->pci_dev->dev, "unable to create cavium rxq oom status wq\n"); 478 return -ENOMEM; 479 } 480 481 INIT_DELAYED_WORK(&wq->wk.work, 482 octnet_poll_check_rxq_oom_status); 483 wq->wk.ctxptr = lio; 484 wq->wk.ctxul = q_no; 485 } 486 487 return 0; 488} 489EXPORT_SYMBOL_GPL(setup_rx_oom_poll_fn); 490 491void cleanup_rx_oom_poll_fn(struct net_device *netdev) 492{ 493 struct lio *lio = GET_LIO(netdev); 494 struct octeon_device *oct = lio->oct_dev; 495 struct cavium_wq *wq; 496 int q_no; 497 498 for (q_no = 0; q_no < oct->num_oqs; q_no++) { 499 wq = &lio->rxq_status_wq[q_no]; 500 if (wq->wq) { 501 cancel_delayed_work_sync(&wq->wk.work); 502 destroy_workqueue(wq->wq); 503 wq->wq = NULL; 504 } 505 } 506} 507EXPORT_SYMBOL_GPL(cleanup_rx_oom_poll_fn); 508 509/* Runs in interrupt context. */ 510static void lio_update_txq_status(struct octeon_device *oct, int iq_num) 511{ 512 struct octeon_instr_queue *iq = oct->instr_queue[iq_num]; 513 struct net_device *netdev; 514 struct lio *lio; 515 516 netdev = oct->props[iq->ifidx].netdev; 517 518 /* This is needed because the first IQ does not have 519 * a netdev associated with it. 520 */ 521 if (!netdev) 522 return; 523 524 lio = GET_LIO(netdev); 525 if (__netif_subqueue_stopped(netdev, iq->q_index) && 526 lio->linfo.link.s.link_up && 527 (!octnet_iq_is_full(oct, iq_num))) { 528 netif_wake_subqueue(netdev, iq->q_index); 529 INCR_INSTRQUEUE_PKT_COUNT(lio->oct_dev, iq_num, 530 tx_restart, 1); 531 } 532} 533 534/** 535 * octeon_setup_droq - Setup output queue 536 * @oct: octeon device 537 * @q_no: which queue 538 * @num_descs: how many descriptors 539 * @desc_size: size of each descriptor 540 * @app_ctx: application context 541 */ 542static int octeon_setup_droq(struct octeon_device *oct, int q_no, int num_descs, 543 int desc_size, void *app_ctx) 544{ 545 int ret_val; 546 547 dev_dbg(&oct->pci_dev->dev, "Creating Droq: %d\n", q_no); 548 /* droq creation and local register settings. */ 549 ret_val = octeon_create_droq(oct, q_no, num_descs, desc_size, app_ctx); 550 if (ret_val < 0) 551 return ret_val; 552 553 if (ret_val == 1) { 554 dev_dbg(&oct->pci_dev->dev, "Using default droq %d\n", q_no); 555 return 0; 556 } 557 558 /* Enable the droq queues */ 559 octeon_set_droq_pkt_op(oct, q_no, 1); 560 561 /* Send Credit for Octeon Output queues. Credits are always 562 * sent after the output queue is enabled. 563 */ 564 writel(oct->droq[q_no]->max_count, oct->droq[q_no]->pkts_credit_reg); 565 566 return ret_val; 567} 568 569/** 570 * liquidio_push_packet - Routine to push packets arriving on Octeon interface upto network layer. 571 * @octeon_id:octeon device id. 572 * @skbuff: skbuff struct to be passed to network layer. 573 * @len: size of total data received. 574 * @rh: Control header associated with the packet 575 * @param: additional control data with the packet 576 * @arg: farg registered in droq_ops 577 */ 578static void 579liquidio_push_packet(u32 __maybe_unused octeon_id, 580 void *skbuff, 581 u32 len, 582 union octeon_rh *rh, 583 void *param, 584 void *arg) 585{ 586 struct net_device *netdev = (struct net_device *)arg; 587 struct octeon_droq *droq = 588 container_of(param, struct octeon_droq, napi); 589 struct sk_buff *skb = (struct sk_buff *)skbuff; 590 struct skb_shared_hwtstamps *shhwtstamps; 591 struct napi_struct *napi = param; 592 u16 vtag = 0; 593 u32 r_dh_off; 594 u64 ns; 595 596 if (netdev) { 597 struct lio *lio = GET_LIO(netdev); 598 struct octeon_device *oct = lio->oct_dev; 599 600 /* Do not proceed if the interface is not in RUNNING state. */ 601 if (!ifstate_check(lio, LIO_IFSTATE_RUNNING)) { 602 recv_buffer_free(skb); 603 droq->stats.rx_dropped++; 604 return; 605 } 606 607 skb->dev = netdev; 608 609 skb_record_rx_queue(skb, droq->q_no); 610 if (likely(len > MIN_SKB_SIZE)) { 611 struct octeon_skb_page_info *pg_info; 612 unsigned char *va; 613 614 pg_info = ((struct octeon_skb_page_info *)(skb->cb)); 615 if (pg_info->page) { 616 /* For Paged allocation use the frags */ 617 va = page_address(pg_info->page) + 618 pg_info->page_offset; 619 memcpy(skb->data, va, MIN_SKB_SIZE); 620 skb_put(skb, MIN_SKB_SIZE); 621 skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, 622 pg_info->page, 623 pg_info->page_offset + 624 MIN_SKB_SIZE, 625 len - MIN_SKB_SIZE, 626 LIO_RXBUFFER_SZ); 627 } 628 } else { 629 struct octeon_skb_page_info *pg_info = 630 ((struct octeon_skb_page_info *)(skb->cb)); 631 skb_copy_to_linear_data(skb, page_address(pg_info->page) 632 + pg_info->page_offset, len); 633 skb_put(skb, len); 634 put_page(pg_info->page); 635 } 636 637 r_dh_off = (rh->r_dh.len - 1) * BYTES_PER_DHLEN_UNIT; 638 639 if (oct->ptp_enable) { 640 if (rh->r_dh.has_hwtstamp) { 641 /* timestamp is included from the hardware at 642 * the beginning of the packet. 643 */ 644 if (ifstate_check 645 (lio, 646 LIO_IFSTATE_RX_TIMESTAMP_ENABLED)) { 647 /* Nanoseconds are in the first 64-bits 648 * of the packet. 649 */ 650 memcpy(&ns, (skb->data + r_dh_off), 651 sizeof(ns)); 652 r_dh_off -= BYTES_PER_DHLEN_UNIT; 653 shhwtstamps = skb_hwtstamps(skb); 654 shhwtstamps->hwtstamp = 655 ns_to_ktime(ns + 656 lio->ptp_adjust); 657 } 658 } 659 } 660 661 if (rh->r_dh.has_hash) { 662 __be32 *hash_be = (__be32 *)(skb->data + r_dh_off); 663 u32 hash = be32_to_cpu(*hash_be); 664 665 skb_set_hash(skb, hash, PKT_HASH_TYPE_L4); 666 r_dh_off -= BYTES_PER_DHLEN_UNIT; 667 } 668 669 skb_pull(skb, rh->r_dh.len * BYTES_PER_DHLEN_UNIT); 670 skb->protocol = eth_type_trans(skb, skb->dev); 671 672 if ((netdev->features & NETIF_F_RXCSUM) && 673 (((rh->r_dh.encap_on) && 674 (rh->r_dh.csum_verified & CNNIC_TUN_CSUM_VERIFIED)) || 675 (!(rh->r_dh.encap_on) && 676 ((rh->r_dh.csum_verified & CNNIC_CSUM_VERIFIED) == 677 CNNIC_CSUM_VERIFIED)))) 678 /* checksum has already been verified */ 679 skb->ip_summed = CHECKSUM_UNNECESSARY; 680 else 681 skb->ip_summed = CHECKSUM_NONE; 682 683 /* Setting Encapsulation field on basis of status received 684 * from the firmware 685 */ 686 if (rh->r_dh.encap_on) { 687 skb->encapsulation = 1; 688 skb->csum_level = 1; 689 droq->stats.rx_vxlan++; 690 } 691 692 /* inbound VLAN tag */ 693 if ((netdev->features & NETIF_F_HW_VLAN_CTAG_RX) && 694 rh->r_dh.vlan) { 695 u16 priority = rh->r_dh.priority; 696 u16 vid = rh->r_dh.vlan; 697 698 vtag = (priority << VLAN_PRIO_SHIFT) | vid; 699 __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), vtag); 700 } 701 702 napi_gro_receive(napi, skb); 703 704 droq->stats.rx_bytes_received += len - 705 rh->r_dh.len * BYTES_PER_DHLEN_UNIT; 706 droq->stats.rx_pkts_received++; 707 } else { 708 recv_buffer_free(skb); 709 } 710} 711 712/** 713 * napi_schedule_wrapper - wrapper for calling napi_schedule 714 * @param: parameters to pass to napi_schedule 715 * 716 * Used when scheduling on different CPUs 717 */ 718static void napi_schedule_wrapper(void *param) 719{ 720 struct napi_struct *napi = param; 721 722 napi_schedule(napi); 723} 724 725/** 726 * liquidio_napi_drv_callback - callback when receive interrupt occurs and we are in NAPI mode 727 * @arg: pointer to octeon output queue 728 */ 729static void liquidio_napi_drv_callback(void *arg) 730{ 731 struct octeon_device *oct; 732 struct octeon_droq *droq = arg; 733 int this_cpu = smp_processor_id(); 734 735 oct = droq->oct_dev; 736 737 if (OCTEON_CN23XX_PF(oct) || OCTEON_CN23XX_VF(oct) || 738 droq->cpu_id == this_cpu) { 739 napi_schedule_irqoff(&droq->napi); 740 } else { 741 INIT_CSD(&droq->csd, napi_schedule_wrapper, &droq->napi); 742 smp_call_function_single_async(droq->cpu_id, &droq->csd); 743 } 744} 745 746/** 747 * liquidio_napi_poll - Entry point for NAPI polling 748 * @napi: NAPI structure 749 * @budget: maximum number of items to process 750 */ 751static int liquidio_napi_poll(struct napi_struct *napi, int budget) 752{ 753 struct octeon_instr_queue *iq; 754 struct octeon_device *oct; 755 struct octeon_droq *droq; 756 int tx_done = 0, iq_no; 757 int work_done; 758 759 droq = container_of(napi, struct octeon_droq, napi); 760 oct = droq->oct_dev; 761 iq_no = droq->q_no; 762 763 /* Handle Droq descriptors */ 764 work_done = octeon_droq_process_poll_pkts(oct, droq, budget); 765 766 /* Flush the instruction queue */ 767 iq = oct->instr_queue[iq_no]; 768 if (iq) { 769 /* TODO: move this check to inside octeon_flush_iq, 770 * once check_db_timeout is removed 771 */ 772 if (atomic_read(&iq->instr_pending)) 773 /* Process iq buffers with in the budget limits */ 774 tx_done = octeon_flush_iq(oct, iq, budget); 775 else 776 tx_done = 1; 777 /* Update iq read-index rather than waiting for next interrupt. 778 * Return back if tx_done is false. 779 */ 780 /* sub-queue status update */ 781 lio_update_txq_status(oct, iq_no); 782 } else { 783 dev_err(&oct->pci_dev->dev, "%s: iq (%d) num invalid\n", 784 __func__, iq_no); 785 } 786 787#define MAX_REG_CNT 2000000U 788 /* force enable interrupt if reg cnts are high to avoid wraparound */ 789 if ((work_done < budget && tx_done) || 790 (iq && iq->pkt_in_done >= MAX_REG_CNT) || 791 (droq->pkt_count >= MAX_REG_CNT)) { 792 napi_complete_done(napi, work_done); 793 794 octeon_enable_irq(droq->oct_dev, droq->q_no); 795 return 0; 796 } 797 798 return (!tx_done) ? (budget) : (work_done); 799} 800 801/** 802 * liquidio_setup_io_queues - Setup input and output queues 803 * @octeon_dev: octeon device 804 * @ifidx: Interface index 805 * @num_iqs: input io queue count 806 * @num_oqs: output io queue count 807 * 808 * Note: Queues are with respect to the octeon device. Thus 809 * an input queue is for egress packets, and output queues 810 * are for ingress packets. 811 */ 812int liquidio_setup_io_queues(struct octeon_device *octeon_dev, int ifidx, 813 u32 num_iqs, u32 num_oqs) 814{ 815 struct octeon_droq_ops droq_ops; 816 struct net_device *netdev; 817 struct octeon_droq *droq; 818 struct napi_struct *napi; 819 int cpu_id_modulus; 820 int num_tx_descs; 821 struct lio *lio; 822 int retval = 0; 823 int q, q_no; 824 int cpu_id; 825 826 netdev = octeon_dev->props[ifidx].netdev; 827 828 lio = GET_LIO(netdev); 829 830 memset(&droq_ops, 0, sizeof(struct octeon_droq_ops)); 831 832 droq_ops.fptr = liquidio_push_packet; 833 droq_ops.farg = netdev; 834 835 droq_ops.poll_mode = 1; 836 droq_ops.napi_fn = liquidio_napi_drv_callback; 837 cpu_id = 0; 838 cpu_id_modulus = num_present_cpus(); 839 840 /* set up DROQs. */ 841 for (q = 0; q < num_oqs; q++) { 842 q_no = lio->linfo.rxpciq[q].s.q_no; 843 dev_dbg(&octeon_dev->pci_dev->dev, 844 "%s index:%d linfo.rxpciq.s.q_no:%d\n", 845 __func__, q, q_no); 846 retval = octeon_setup_droq( 847 octeon_dev, q_no, 848 CFG_GET_NUM_RX_DESCS_NIC_IF(octeon_get_conf(octeon_dev), 849 lio->ifidx), 850 CFG_GET_NUM_RX_BUF_SIZE_NIC_IF(octeon_get_conf(octeon_dev), 851 lio->ifidx), 852 NULL); 853 if (retval) { 854 dev_err(&octeon_dev->pci_dev->dev, 855 "%s : Runtime DROQ(RxQ) creation failed.\n", 856 __func__); 857 return 1; 858 } 859 860 droq = octeon_dev->droq[q_no]; 861 napi = &droq->napi; 862 dev_dbg(&octeon_dev->pci_dev->dev, "netif_napi_add netdev:%llx oct:%llx\n", 863 (u64)netdev, (u64)octeon_dev); 864 netif_napi_add(netdev, napi, liquidio_napi_poll); 865 866 /* designate a CPU for this droq */ 867 droq->cpu_id = cpu_id; 868 cpu_id++; 869 if (cpu_id >= cpu_id_modulus) 870 cpu_id = 0; 871 872 octeon_register_droq_ops(octeon_dev, q_no, &droq_ops); 873 } 874 875 if (OCTEON_CN23XX_PF(octeon_dev) || OCTEON_CN23XX_VF(octeon_dev)) { 876 /* 23XX PF/VF can send/recv control messages (via the first 877 * PF/VF-owned droq) from the firmware even if the ethX 878 * interface is down, so that's why poll_mode must be off 879 * for the first droq. 880 */ 881 octeon_dev->droq[0]->ops.poll_mode = 0; 882 } 883 884 /* set up IQs. */ 885 for (q = 0; q < num_iqs; q++) { 886 num_tx_descs = CFG_GET_NUM_TX_DESCS_NIC_IF( 887 octeon_get_conf(octeon_dev), lio->ifidx); 888 retval = octeon_setup_iq(octeon_dev, ifidx, q, 889 lio->linfo.txpciq[q], num_tx_descs, 890 netdev_get_tx_queue(netdev, q)); 891 if (retval) { 892 dev_err(&octeon_dev->pci_dev->dev, 893 " %s : Runtime IQ(TxQ) creation failed.\n", 894 __func__); 895 return 1; 896 } 897 898 /* XPS */ 899 if (!OCTEON_CN23XX_VF(octeon_dev) && octeon_dev->msix_on && 900 octeon_dev->ioq_vector) { 901 struct octeon_ioq_vector *ioq_vector; 902 903 ioq_vector = &octeon_dev->ioq_vector[q]; 904 netif_set_xps_queue(netdev, 905 &ioq_vector->affinity_mask, 906 ioq_vector->iq_index); 907 } 908 } 909 910 return 0; 911} 912EXPORT_SYMBOL_GPL(liquidio_setup_io_queues); 913 914static 915int liquidio_schedule_msix_droq_pkt_handler(struct octeon_droq *droq, u64 ret) 916{ 917 struct octeon_device *oct = droq->oct_dev; 918 struct octeon_device_priv *oct_priv = 919 (struct octeon_device_priv *)oct->priv; 920 921 if (droq->ops.poll_mode) { 922 droq->ops.napi_fn(droq); 923 } else { 924 if (ret & MSIX_PO_INT) { 925 if (OCTEON_CN23XX_VF(oct)) 926 dev_err(&oct->pci_dev->dev, 927 "should not come here should not get rx when poll mode = 0 for vf\n"); 928 tasklet_schedule(&oct_priv->droq_tasklet); 929 return 1; 930 } 931 /* this will be flushed periodically by check iq db */ 932 if (ret & MSIX_PI_INT) 933 return 0; 934 } 935 936 return 0; 937} 938 939irqreturn_t 940liquidio_msix_intr_handler(int __maybe_unused irq, void *dev) 941{ 942 struct octeon_ioq_vector *ioq_vector = (struct octeon_ioq_vector *)dev; 943 struct octeon_device *oct = ioq_vector->oct_dev; 944 struct octeon_droq *droq = oct->droq[ioq_vector->droq_index]; 945 u64 ret; 946 947 ret = oct->fn_list.msix_interrupt_handler(ioq_vector); 948 949 if (ret & MSIX_PO_INT || ret & MSIX_PI_INT) 950 liquidio_schedule_msix_droq_pkt_handler(droq, ret); 951 952 return IRQ_HANDLED; 953} 954 955/** 956 * liquidio_schedule_droq_pkt_handlers - Droq packet processor sceduler 957 * @oct: octeon device 958 */ 959static void liquidio_schedule_droq_pkt_handlers(struct octeon_device *oct) 960{ 961 struct octeon_device_priv *oct_priv = 962 (struct octeon_device_priv *)oct->priv; 963 struct octeon_droq *droq; 964 u64 oq_no; 965 966 if (oct->int_status & OCT_DEV_INTR_PKT_DATA) { 967 for (oq_no = 0; oq_no < MAX_OCTEON_OUTPUT_QUEUES(oct); 968 oq_no++) { 969 if (!(oct->droq_intr & BIT_ULL(oq_no))) 970 continue; 971 972 droq = oct->droq[oq_no]; 973 974 if (droq->ops.poll_mode) { 975 droq->ops.napi_fn(droq); 976 oct_priv->napi_mask |= BIT_ULL(oq_no); 977 } else { 978 tasklet_schedule(&oct_priv->droq_tasklet); 979 } 980 } 981 } 982} 983 984/** 985 * liquidio_legacy_intr_handler - Interrupt handler for octeon 986 * @irq: unused 987 * @dev: octeon device 988 */ 989static 990irqreturn_t liquidio_legacy_intr_handler(int __maybe_unused irq, void *dev) 991{ 992 struct octeon_device *oct = (struct octeon_device *)dev; 993 irqreturn_t ret; 994 995 /* Disable our interrupts for the duration of ISR */ 996 oct->fn_list.disable_interrupt(oct, OCTEON_ALL_INTR); 997 998 ret = oct->fn_list.process_interrupt_regs(oct); 999 1000 if (ret == IRQ_HANDLED) 1001 liquidio_schedule_droq_pkt_handlers(oct); 1002 1003 /* Re-enable our interrupts */ 1004 if (!(atomic_read(&oct->status) == OCT_DEV_IN_RESET)) 1005 oct->fn_list.enable_interrupt(oct, OCTEON_ALL_INTR); 1006 1007 return ret; 1008} 1009 1010/** 1011 * octeon_setup_interrupt - Setup interrupt for octeon device 1012 * @oct: octeon device 1013 * @num_ioqs: number of queues 1014 * 1015 * Enable interrupt in Octeon device as given in the PCI interrupt mask. 1016 */ 1017int octeon_setup_interrupt(struct octeon_device *oct, u32 num_ioqs) 1018{ 1019 struct msix_entry *msix_entries; 1020 char *queue_irq_names = NULL; 1021 int i, num_interrupts = 0; 1022 int num_alloc_ioq_vectors; 1023 char *aux_irq_name = NULL; 1024 int num_ioq_vectors; 1025 int irqret, err; 1026 1027 if (oct->msix_on) { 1028 oct->num_msix_irqs = num_ioqs; 1029 if (OCTEON_CN23XX_PF(oct)) { 1030 num_interrupts = MAX_IOQ_INTERRUPTS_PER_PF + 1; 1031 1032 /* one non ioq interrupt for handling 1033 * sli_mac_pf_int_sum 1034 */ 1035 oct->num_msix_irqs += 1; 1036 } else if (OCTEON_CN23XX_VF(oct)) { 1037 num_interrupts = MAX_IOQ_INTERRUPTS_PER_VF; 1038 } 1039 1040 /* allocate storage for the names assigned to each irq */ 1041 oct->irq_name_storage = 1042 kcalloc(num_interrupts, INTRNAMSIZ, GFP_KERNEL); 1043 if (!oct->irq_name_storage) { 1044 dev_err(&oct->pci_dev->dev, "Irq name storage alloc failed...\n"); 1045 return -ENOMEM; 1046 } 1047 1048 queue_irq_names = oct->irq_name_storage; 1049 1050 if (OCTEON_CN23XX_PF(oct)) 1051 aux_irq_name = &queue_irq_names 1052 [IRQ_NAME_OFF(MAX_IOQ_INTERRUPTS_PER_PF)]; 1053 1054 oct->msix_entries = kcalloc(oct->num_msix_irqs, 1055 sizeof(struct msix_entry), 1056 GFP_KERNEL); 1057 if (!oct->msix_entries) { 1058 dev_err(&oct->pci_dev->dev, "Memory Alloc failed...\n"); 1059 kfree(oct->irq_name_storage); 1060 oct->irq_name_storage = NULL; 1061 return -ENOMEM; 1062 } 1063 1064 msix_entries = (struct msix_entry *)oct->msix_entries; 1065 1066 /*Assumption is that pf msix vectors start from pf srn to pf to 1067 * trs and not from 0. if not change this code 1068 */ 1069 if (OCTEON_CN23XX_PF(oct)) { 1070 for (i = 0; i < oct->num_msix_irqs - 1; i++) 1071 msix_entries[i].entry = 1072 oct->sriov_info.pf_srn + i; 1073 1074 msix_entries[oct->num_msix_irqs - 1].entry = 1075 oct->sriov_info.trs; 1076 } else if (OCTEON_CN23XX_VF(oct)) { 1077 for (i = 0; i < oct->num_msix_irqs; i++) 1078 msix_entries[i].entry = i; 1079 } 1080 num_alloc_ioq_vectors = pci_enable_msix_range( 1081 oct->pci_dev, msix_entries, 1082 oct->num_msix_irqs, 1083 oct->num_msix_irqs); 1084 if (num_alloc_ioq_vectors < 0) { 1085 dev_err(&oct->pci_dev->dev, "unable to Allocate MSI-X interrupts\n"); 1086 kfree(oct->msix_entries); 1087 oct->msix_entries = NULL; 1088 kfree(oct->irq_name_storage); 1089 oct->irq_name_storage = NULL; 1090 return num_alloc_ioq_vectors; 1091 } 1092 1093 dev_dbg(&oct->pci_dev->dev, "OCTEON: Enough MSI-X interrupts are allocated...\n"); 1094 1095 num_ioq_vectors = oct->num_msix_irqs; 1096 /* For PF, there is one non-ioq interrupt handler */ 1097 if (OCTEON_CN23XX_PF(oct)) { 1098 num_ioq_vectors -= 1; 1099 1100 snprintf(aux_irq_name, INTRNAMSIZ, 1101 "LiquidIO%u-pf%u-aux", oct->octeon_id, 1102 oct->pf_num); 1103 irqret = request_irq( 1104 msix_entries[num_ioq_vectors].vector, 1105 liquidio_legacy_intr_handler, 0, 1106 aux_irq_name, oct); 1107 if (irqret) { 1108 dev_err(&oct->pci_dev->dev, 1109 "Request_irq failed for MSIX interrupt Error: %d\n", 1110 irqret); 1111 pci_disable_msix(oct->pci_dev); 1112 kfree(oct->msix_entries); 1113 kfree(oct->irq_name_storage); 1114 oct->irq_name_storage = NULL; 1115 oct->msix_entries = NULL; 1116 return irqret; 1117 } 1118 } 1119 for (i = 0 ; i < num_ioq_vectors ; i++) { 1120 if (OCTEON_CN23XX_PF(oct)) 1121 snprintf(&queue_irq_names[IRQ_NAME_OFF(i)], 1122 INTRNAMSIZ, "LiquidIO%u-pf%u-rxtx-%u", 1123 oct->octeon_id, oct->pf_num, i); 1124 1125 if (OCTEON_CN23XX_VF(oct)) 1126 snprintf(&queue_irq_names[IRQ_NAME_OFF(i)], 1127 INTRNAMSIZ, "LiquidIO%u-vf%u-rxtx-%u", 1128 oct->octeon_id, oct->vf_num, i); 1129 1130 irqret = request_irq(msix_entries[i].vector, 1131 liquidio_msix_intr_handler, 0, 1132 &queue_irq_names[IRQ_NAME_OFF(i)], 1133 &oct->ioq_vector[i]); 1134 1135 if (irqret) { 1136 dev_err(&oct->pci_dev->dev, 1137 "Request_irq failed for MSIX interrupt Error: %d\n", 1138 irqret); 1139 /* Freeing the non-ioq irq vector here . */ 1140 free_irq(msix_entries[num_ioq_vectors].vector, 1141 oct); 1142 1143 while (i) { 1144 i--; 1145 /* clearing affinity mask. */ 1146 irq_set_affinity_hint( 1147 msix_entries[i].vector, 1148 NULL); 1149 free_irq(msix_entries[i].vector, 1150 &oct->ioq_vector[i]); 1151 } 1152 pci_disable_msix(oct->pci_dev); 1153 kfree(oct->msix_entries); 1154 kfree(oct->irq_name_storage); 1155 oct->irq_name_storage = NULL; 1156 oct->msix_entries = NULL; 1157 return irqret; 1158 } 1159 oct->ioq_vector[i].vector = msix_entries[i].vector; 1160 /* assign the cpu mask for this msix interrupt vector */ 1161 irq_set_affinity_hint(msix_entries[i].vector, 1162 &oct->ioq_vector[i].affinity_mask 1163 ); 1164 } 1165 dev_dbg(&oct->pci_dev->dev, "OCTEON[%d]: MSI-X enabled\n", 1166 oct->octeon_id); 1167 } else { 1168 err = pci_enable_msi(oct->pci_dev); 1169 if (err) 1170 dev_warn(&oct->pci_dev->dev, "Reverting to legacy interrupts. Error: %d\n", 1171 err); 1172 else 1173 oct->flags |= LIO_FLAG_MSI_ENABLED; 1174 1175 /* allocate storage for the names assigned to the irq */ 1176 oct->irq_name_storage = kzalloc(INTRNAMSIZ, GFP_KERNEL); 1177 if (!oct->irq_name_storage) 1178 return -ENOMEM; 1179 1180 queue_irq_names = oct->irq_name_storage; 1181 1182 if (OCTEON_CN23XX_PF(oct)) 1183 snprintf(&queue_irq_names[IRQ_NAME_OFF(0)], INTRNAMSIZ, 1184 "LiquidIO%u-pf%u-rxtx-%u", 1185 oct->octeon_id, oct->pf_num, 0); 1186 1187 if (OCTEON_CN23XX_VF(oct)) 1188 snprintf(&queue_irq_names[IRQ_NAME_OFF(0)], INTRNAMSIZ, 1189 "LiquidIO%u-vf%u-rxtx-%u", 1190 oct->octeon_id, oct->vf_num, 0); 1191 1192 irqret = request_irq(oct->pci_dev->irq, 1193 liquidio_legacy_intr_handler, 1194 IRQF_SHARED, 1195 &queue_irq_names[IRQ_NAME_OFF(0)], oct); 1196 if (irqret) { 1197 if (oct->flags & LIO_FLAG_MSI_ENABLED) 1198 pci_disable_msi(oct->pci_dev); 1199 dev_err(&oct->pci_dev->dev, "Request IRQ failed with code: %d\n", 1200 irqret); 1201 kfree(oct->irq_name_storage); 1202 oct->irq_name_storage = NULL; 1203 return irqret; 1204 } 1205 } 1206 return 0; 1207} 1208EXPORT_SYMBOL_GPL(octeon_setup_interrupt); 1209 1210/** 1211 * liquidio_change_mtu - Net device change_mtu 1212 * @netdev: network device 1213 * @new_mtu: the new max transmit unit size 1214 */ 1215int liquidio_change_mtu(struct net_device *netdev, int new_mtu) 1216{ 1217 struct lio *lio = GET_LIO(netdev); 1218 struct octeon_device *oct = lio->oct_dev; 1219 struct octeon_soft_command *sc; 1220 union octnet_cmd *ncmd; 1221 int ret = 0; 1222 1223 sc = (struct octeon_soft_command *) 1224 octeon_alloc_soft_command(oct, OCTNET_CMD_SIZE, 16, 0); 1225 if (!sc) { 1226 netif_info(lio, rx_err, lio->netdev, 1227 "Failed to allocate soft command\n"); 1228 return -ENOMEM; 1229 } 1230 1231 ncmd = (union octnet_cmd *)sc->virtdptr; 1232 1233 init_completion(&sc->complete); 1234 sc->sc_status = OCTEON_REQUEST_PENDING; 1235 1236 ncmd->u64 = 0; 1237 ncmd->s.cmd = OCTNET_CMD_CHANGE_MTU; 1238 ncmd->s.param1 = new_mtu; 1239 1240 octeon_swap_8B_data((u64 *)ncmd, (OCTNET_CMD_SIZE >> 3)); 1241 1242 sc->iq_no = lio->linfo.txpciq[0].s.q_no; 1243 1244 octeon_prepare_soft_command(oct, sc, OPCODE_NIC, 1245 OPCODE_NIC_CMD, 0, 0, 0); 1246 1247 ret = octeon_send_soft_command(oct, sc); 1248 if (ret == IQ_SEND_FAILED) { 1249 netif_info(lio, rx_err, lio->netdev, "Failed to change MTU\n"); 1250 octeon_free_soft_command(oct, sc); 1251 return -EINVAL; 1252 } 1253 /* Sleep on a wait queue till the cond flag indicates that the 1254 * response arrived or timed-out. 1255 */ 1256 ret = wait_for_sc_completion_timeout(oct, sc, 0); 1257 if (ret) 1258 return ret; 1259 1260 if (sc->sc_status) { 1261 WRITE_ONCE(sc->caller_is_done, true); 1262 return -EINVAL; 1263 } 1264 1265 WRITE_ONCE(netdev->mtu, new_mtu); 1266 lio->mtu = new_mtu; 1267 1268 WRITE_ONCE(sc->caller_is_done, true); 1269 return 0; 1270} 1271EXPORT_SYMBOL_GPL(liquidio_change_mtu); 1272 1273int lio_wait_for_clean_oq(struct octeon_device *oct) 1274{ 1275 int retry = 100, pending_pkts = 0; 1276 int idx; 1277 1278 do { 1279 pending_pkts = 0; 1280 1281 for (idx = 0; idx < MAX_OCTEON_OUTPUT_QUEUES(oct); idx++) { 1282 if (!(oct->io_qmask.oq & BIT_ULL(idx))) 1283 continue; 1284 pending_pkts += 1285 atomic_read(&oct->droq[idx]->pkts_pending); 1286 } 1287 1288 if (pending_pkts > 0) 1289 schedule_timeout_uninterruptible(1); 1290 1291 } while (retry-- && pending_pkts); 1292 1293 return pending_pkts; 1294} 1295EXPORT_SYMBOL_GPL(lio_wait_for_clean_oq); 1296 1297static void 1298octnet_nic_stats_callback(struct octeon_device *oct_dev, 1299 u32 status, void *ptr) 1300{ 1301 struct octeon_soft_command *sc = (struct octeon_soft_command *)ptr; 1302 struct oct_nic_stats_resp *resp = 1303 (struct oct_nic_stats_resp *)sc->virtrptr; 1304 struct nic_rx_stats *rsp_rstats = &resp->stats.fromwire; 1305 struct nic_tx_stats *rsp_tstats = &resp->stats.fromhost; 1306 struct nic_rx_stats *rstats = &oct_dev->link_stats.fromwire; 1307 struct nic_tx_stats *tstats = &oct_dev->link_stats.fromhost; 1308 1309 if (status != OCTEON_REQUEST_TIMEOUT && !resp->status) { 1310 octeon_swap_8B_data((u64 *)&resp->stats, 1311 (sizeof(struct oct_link_stats)) >> 3); 1312 1313 /* RX link-level stats */ 1314 rstats->total_rcvd = rsp_rstats->total_rcvd; 1315 rstats->bytes_rcvd = rsp_rstats->bytes_rcvd; 1316 rstats->total_bcst = rsp_rstats->total_bcst; 1317 rstats->total_mcst = rsp_rstats->total_mcst; 1318 rstats->runts = rsp_rstats->runts; 1319 rstats->ctl_rcvd = rsp_rstats->ctl_rcvd; 1320 /* Accounts for over/under-run of buffers */ 1321 rstats->fifo_err = rsp_rstats->fifo_err; 1322 rstats->dmac_drop = rsp_rstats->dmac_drop; 1323 rstats->fcs_err = rsp_rstats->fcs_err; 1324 rstats->jabber_err = rsp_rstats->jabber_err; 1325 rstats->l2_err = rsp_rstats->l2_err; 1326 rstats->frame_err = rsp_rstats->frame_err; 1327 rstats->red_drops = rsp_rstats->red_drops; 1328 1329 /* RX firmware stats */ 1330 rstats->fw_total_rcvd = rsp_rstats->fw_total_rcvd; 1331 rstats->fw_total_fwd = rsp_rstats->fw_total_fwd; 1332 rstats->fw_total_mcast = rsp_rstats->fw_total_mcast; 1333 rstats->fw_total_bcast = rsp_rstats->fw_total_bcast; 1334 rstats->fw_err_pko = rsp_rstats->fw_err_pko; 1335 rstats->fw_err_link = rsp_rstats->fw_err_link; 1336 rstats->fw_err_drop = rsp_rstats->fw_err_drop; 1337 rstats->fw_rx_vxlan = rsp_rstats->fw_rx_vxlan; 1338 rstats->fw_rx_vxlan_err = rsp_rstats->fw_rx_vxlan_err; 1339 1340 /* Number of packets that are LROed */ 1341 rstats->fw_lro_pkts = rsp_rstats->fw_lro_pkts; 1342 /* Number of octets that are LROed */ 1343 rstats->fw_lro_octs = rsp_rstats->fw_lro_octs; 1344 /* Number of LRO packets formed */ 1345 rstats->fw_total_lro = rsp_rstats->fw_total_lro; 1346 /* Number of times lRO of packet aborted */ 1347 rstats->fw_lro_aborts = rsp_rstats->fw_lro_aborts; 1348 rstats->fw_lro_aborts_port = rsp_rstats->fw_lro_aborts_port; 1349 rstats->fw_lro_aborts_seq = rsp_rstats->fw_lro_aborts_seq; 1350 rstats->fw_lro_aborts_tsval = rsp_rstats->fw_lro_aborts_tsval; 1351 rstats->fw_lro_aborts_timer = rsp_rstats->fw_lro_aborts_timer; 1352 /* intrmod: packet forward rate */ 1353 rstats->fwd_rate = rsp_rstats->fwd_rate; 1354 1355 /* TX link-level stats */ 1356 tstats->total_pkts_sent = rsp_tstats->total_pkts_sent; 1357 tstats->total_bytes_sent = rsp_tstats->total_bytes_sent; 1358 tstats->mcast_pkts_sent = rsp_tstats->mcast_pkts_sent; 1359 tstats->bcast_pkts_sent = rsp_tstats->bcast_pkts_sent; 1360 tstats->ctl_sent = rsp_tstats->ctl_sent; 1361 /* Packets sent after one collision*/ 1362 tstats->one_collision_sent = rsp_tstats->one_collision_sent; 1363 /* Packets sent after multiple collision*/ 1364 tstats->multi_collision_sent = rsp_tstats->multi_collision_sent; 1365 /* Packets not sent due to max collisions */ 1366 tstats->max_collision_fail = rsp_tstats->max_collision_fail; 1367 /* Packets not sent due to max deferrals */ 1368 tstats->max_deferral_fail = rsp_tstats->max_deferral_fail; 1369 /* Accounts for over/under-run of buffers */ 1370 tstats->fifo_err = rsp_tstats->fifo_err; 1371 tstats->runts = rsp_tstats->runts; 1372 /* Total number of collisions detected */ 1373 tstats->total_collisions = rsp_tstats->total_collisions; 1374 1375 /* firmware stats */ 1376 tstats->fw_total_sent = rsp_tstats->fw_total_sent; 1377 tstats->fw_total_fwd = rsp_tstats->fw_total_fwd; 1378 tstats->fw_total_mcast_sent = rsp_tstats->fw_total_mcast_sent; 1379 tstats->fw_total_bcast_sent = rsp_tstats->fw_total_bcast_sent; 1380 tstats->fw_err_pko = rsp_tstats->fw_err_pko; 1381 tstats->fw_err_pki = rsp_tstats->fw_err_pki; 1382 tstats->fw_err_link = rsp_tstats->fw_err_link; 1383 tstats->fw_err_drop = rsp_tstats->fw_err_drop; 1384 tstats->fw_tso = rsp_tstats->fw_tso; 1385 tstats->fw_tso_fwd = rsp_tstats->fw_tso_fwd; 1386 tstats->fw_err_tso = rsp_tstats->fw_err_tso; 1387 tstats->fw_tx_vxlan = rsp_tstats->fw_tx_vxlan; 1388 1389 resp->status = 1; 1390 } else { 1391 dev_err(&oct_dev->pci_dev->dev, "sc OPCODE_NIC_PORT_STATS command failed\n"); 1392 resp->status = -1; 1393 } 1394} 1395 1396static int lio_fetch_vf_stats(struct lio *lio) 1397{ 1398 struct octeon_device *oct_dev = lio->oct_dev; 1399 struct octeon_soft_command *sc; 1400 struct oct_nic_vf_stats_resp *resp; 1401 1402 int retval; 1403 1404 /* Alloc soft command */ 1405 sc = (struct octeon_soft_command *) 1406 octeon_alloc_soft_command(oct_dev, 1407 0, 1408 sizeof(struct oct_nic_vf_stats_resp), 1409 0); 1410 1411 if (!sc) { 1412 dev_err(&oct_dev->pci_dev->dev, "Soft command allocation failed\n"); 1413 retval = -ENOMEM; 1414 goto lio_fetch_vf_stats_exit; 1415 } 1416 1417 resp = (struct oct_nic_vf_stats_resp *)sc->virtrptr; 1418 memset(resp, 0, sizeof(struct oct_nic_vf_stats_resp)); 1419 1420 init_completion(&sc->complete); 1421 sc->sc_status = OCTEON_REQUEST_PENDING; 1422 1423 sc->iq_no = lio->linfo.txpciq[0].s.q_no; 1424 1425 octeon_prepare_soft_command(oct_dev, sc, OPCODE_NIC, 1426 OPCODE_NIC_VF_PORT_STATS, 0, 0, 0); 1427 1428 retval = octeon_send_soft_command(oct_dev, sc); 1429 if (retval == IQ_SEND_FAILED) { 1430 octeon_free_soft_command(oct_dev, sc); 1431 goto lio_fetch_vf_stats_exit; 1432 } 1433 1434 retval = 1435 wait_for_sc_completion_timeout(oct_dev, sc, 1436 (2 * LIO_SC_MAX_TMO_MS)); 1437 if (retval) { 1438 dev_err(&oct_dev->pci_dev->dev, 1439 "sc OPCODE_NIC_VF_PORT_STATS command failed\n"); 1440 goto lio_fetch_vf_stats_exit; 1441 } 1442 1443 if (sc->sc_status != OCTEON_REQUEST_TIMEOUT && !resp->status) { 1444 octeon_swap_8B_data((u64 *)&resp->spoofmac_cnt, 1445 (sizeof(u64)) >> 3); 1446 1447 if (resp->spoofmac_cnt != 0) { 1448 dev_warn(&oct_dev->pci_dev->dev, 1449 "%llu Spoofed packets detected\n", 1450 resp->spoofmac_cnt); 1451 } 1452 } 1453 WRITE_ONCE(sc->caller_is_done, 1); 1454 1455lio_fetch_vf_stats_exit: 1456 return retval; 1457} 1458 1459void lio_fetch_stats(struct work_struct *work) 1460{ 1461 struct cavium_wk *wk = (struct cavium_wk *)work; 1462 struct lio *lio = wk->ctxptr; 1463 struct octeon_device *oct_dev = lio->oct_dev; 1464 struct octeon_soft_command *sc; 1465 struct oct_nic_stats_resp *resp; 1466 unsigned long time_in_jiffies; 1467 int retval; 1468 1469 if (OCTEON_CN23XX_PF(oct_dev)) { 1470 /* report spoofchk every 2 seconds */ 1471 if (!(oct_dev->vfstats_poll % LIO_VFSTATS_POLL) && 1472 (oct_dev->fw_info.app_cap_flags & LIQUIDIO_SPOOFCHK_CAP) && 1473 oct_dev->sriov_info.num_vfs_alloced) { 1474 lio_fetch_vf_stats(lio); 1475 } 1476 1477 oct_dev->vfstats_poll++; 1478 } 1479 1480 /* Alloc soft command */ 1481 sc = (struct octeon_soft_command *) 1482 octeon_alloc_soft_command(oct_dev, 1483 0, 1484 sizeof(struct oct_nic_stats_resp), 1485 0); 1486 1487 if (!sc) { 1488 dev_err(&oct_dev->pci_dev->dev, "Soft command allocation failed\n"); 1489 goto lio_fetch_stats_exit; 1490 } 1491 1492 resp = (struct oct_nic_stats_resp *)sc->virtrptr; 1493 memset(resp, 0, sizeof(struct oct_nic_stats_resp)); 1494 1495 init_completion(&sc->complete); 1496 sc->sc_status = OCTEON_REQUEST_PENDING; 1497 1498 sc->iq_no = lio->linfo.txpciq[0].s.q_no; 1499 1500 octeon_prepare_soft_command(oct_dev, sc, OPCODE_NIC, 1501 OPCODE_NIC_PORT_STATS, 0, 0, 0); 1502 1503 retval = octeon_send_soft_command(oct_dev, sc); 1504 if (retval == IQ_SEND_FAILED) { 1505 octeon_free_soft_command(oct_dev, sc); 1506 goto lio_fetch_stats_exit; 1507 } 1508 1509 retval = wait_for_sc_completion_timeout(oct_dev, sc, 1510 (2 * LIO_SC_MAX_TMO_MS)); 1511 if (retval) { 1512 dev_err(&oct_dev->pci_dev->dev, "sc OPCODE_NIC_PORT_STATS command failed\n"); 1513 goto lio_fetch_stats_exit; 1514 } 1515 1516 octnet_nic_stats_callback(oct_dev, sc->sc_status, sc); 1517 WRITE_ONCE(sc->caller_is_done, true); 1518 1519lio_fetch_stats_exit: 1520 time_in_jiffies = msecs_to_jiffies(LIQUIDIO_NDEV_STATS_POLL_TIME_MS); 1521 if (ifstate_check(lio, LIO_IFSTATE_RUNNING)) 1522 schedule_delayed_work(&lio->stats_wk.work, time_in_jiffies); 1523 1524 return; 1525} 1526EXPORT_SYMBOL_GPL(lio_fetch_stats); 1527 1528int liquidio_set_speed(struct lio *lio, int speed) 1529{ 1530 struct octeon_device *oct = lio->oct_dev; 1531 struct oct_nic_seapi_resp *resp; 1532 struct octeon_soft_command *sc; 1533 union octnet_cmd *ncmd; 1534 int retval; 1535 u32 var; 1536 1537 if (oct->speed_setting == speed) 1538 return 0; 1539 1540 if (!OCTEON_CN23XX_PF(oct)) { 1541 dev_err(&oct->pci_dev->dev, "%s: SET SPEED only for PF\n", 1542 __func__); 1543 return -EOPNOTSUPP; 1544 } 1545 1546 sc = octeon_alloc_soft_command(oct, OCTNET_CMD_SIZE, 1547 sizeof(struct oct_nic_seapi_resp), 1548 0); 1549 if (!sc) 1550 return -ENOMEM; 1551 1552 ncmd = sc->virtdptr; 1553 resp = sc->virtrptr; 1554 memset(resp, 0, sizeof(struct oct_nic_seapi_resp)); 1555 1556 init_completion(&sc->complete); 1557 sc->sc_status = OCTEON_REQUEST_PENDING; 1558 1559 ncmd->u64 = 0; 1560 ncmd->s.cmd = SEAPI_CMD_SPEED_SET; 1561 ncmd->s.param1 = speed; 1562 1563 octeon_swap_8B_data((u64 *)ncmd, (OCTNET_CMD_SIZE >> 3)); 1564 1565 sc->iq_no = lio->linfo.txpciq[0].s.q_no; 1566 1567 octeon_prepare_soft_command(oct, sc, OPCODE_NIC, 1568 OPCODE_NIC_UBOOT_CTL, 0, 0, 0); 1569 1570 retval = octeon_send_soft_command(oct, sc); 1571 if (retval == IQ_SEND_FAILED) { 1572 dev_info(&oct->pci_dev->dev, "Failed to send soft command\n"); 1573 octeon_free_soft_command(oct, sc); 1574 retval = -EBUSY; 1575 } else { 1576 /* Wait for response or timeout */ 1577 retval = wait_for_sc_completion_timeout(oct, sc, 0); 1578 if (retval) 1579 return retval; 1580 1581 retval = resp->status; 1582 1583 if (retval) { 1584 dev_err(&oct->pci_dev->dev, "%s failed, retval=%d\n", 1585 __func__, retval); 1586 WRITE_ONCE(sc->caller_is_done, true); 1587 1588 return -EIO; 1589 } 1590 1591 var = be32_to_cpu((__force __be32)resp->speed); 1592 if (var != speed) { 1593 dev_err(&oct->pci_dev->dev, 1594 "%s: setting failed speed= %x, expect %x\n", 1595 __func__, var, speed); 1596 } 1597 1598 oct->speed_setting = var; 1599 WRITE_ONCE(sc->caller_is_done, true); 1600 } 1601 1602 return retval; 1603} 1604 1605int liquidio_get_speed(struct lio *lio) 1606{ 1607 struct octeon_device *oct = lio->oct_dev; 1608 struct oct_nic_seapi_resp *resp; 1609 struct octeon_soft_command *sc; 1610 union octnet_cmd *ncmd; 1611 int retval; 1612 1613 sc = octeon_alloc_soft_command(oct, OCTNET_CMD_SIZE, 1614 sizeof(struct oct_nic_seapi_resp), 1615 0); 1616 if (!sc) 1617 return -ENOMEM; 1618 1619 ncmd = sc->virtdptr; 1620 resp = sc->virtrptr; 1621 memset(resp, 0, sizeof(struct oct_nic_seapi_resp)); 1622 1623 init_completion(&sc->complete); 1624 sc->sc_status = OCTEON_REQUEST_PENDING; 1625 1626 ncmd->u64 = 0; 1627 ncmd->s.cmd = SEAPI_CMD_SPEED_GET; 1628 1629 octeon_swap_8B_data((u64 *)ncmd, (OCTNET_CMD_SIZE >> 3)); 1630 1631 sc->iq_no = lio->linfo.txpciq[0].s.q_no; 1632 1633 octeon_prepare_soft_command(oct, sc, OPCODE_NIC, 1634 OPCODE_NIC_UBOOT_CTL, 0, 0, 0); 1635 1636 retval = octeon_send_soft_command(oct, sc); 1637 if (retval == IQ_SEND_FAILED) { 1638 dev_info(&oct->pci_dev->dev, "Failed to send soft command\n"); 1639 octeon_free_soft_command(oct, sc); 1640 retval = -EIO; 1641 } else { 1642 retval = wait_for_sc_completion_timeout(oct, sc, 0); 1643 if (retval) 1644 return retval; 1645 1646 retval = resp->status; 1647 if (retval) { 1648 dev_err(&oct->pci_dev->dev, 1649 "%s failed retval=%d\n", __func__, retval); 1650 retval = -EIO; 1651 } else { 1652 u32 var; 1653 1654 var = be32_to_cpu((__force __be32)resp->speed); 1655 oct->speed_setting = var; 1656 if (var == 0xffff) { 1657 /* unable to access boot variables 1658 * get the default value based on the NIC type 1659 */ 1660 if (oct->subsystem_id == 1661 OCTEON_CN2350_25GB_SUBSYS_ID || 1662 oct->subsystem_id == 1663 OCTEON_CN2360_25GB_SUBSYS_ID) { 1664 oct->no_speed_setting = 1; 1665 oct->speed_setting = 25; 1666 } else { 1667 oct->speed_setting = 10; 1668 } 1669 } 1670 1671 } 1672 WRITE_ONCE(sc->caller_is_done, true); 1673 } 1674 1675 return retval; 1676} 1677EXPORT_SYMBOL_GPL(liquidio_get_speed); 1678 1679int liquidio_set_fec(struct lio *lio, int on_off) 1680{ 1681 struct oct_nic_seapi_resp *resp; 1682 struct octeon_soft_command *sc; 1683 struct octeon_device *oct; 1684 union octnet_cmd *ncmd; 1685 int retval; 1686 u32 var; 1687 1688 oct = lio->oct_dev; 1689 1690 if (oct->props[lio->ifidx].fec == on_off) 1691 return 0; 1692 1693 if (!OCTEON_CN23XX_PF(oct)) { 1694 dev_err(&oct->pci_dev->dev, "%s: SET FEC only for PF\n", 1695 __func__); 1696 return -1; 1697 } 1698 1699 if (oct->speed_boot != 25) { 1700 dev_err(&oct->pci_dev->dev, 1701 "Set FEC only when link speed is 25G during insmod\n"); 1702 return -1; 1703 } 1704 1705 sc = octeon_alloc_soft_command(oct, OCTNET_CMD_SIZE, 1706 sizeof(struct oct_nic_seapi_resp), 0); 1707 if (!sc) { 1708 dev_err(&oct->pci_dev->dev, 1709 "Failed to allocate soft command\n"); 1710 return -ENOMEM; 1711 } 1712 1713 ncmd = sc->virtdptr; 1714 resp = sc->virtrptr; 1715 memset(resp, 0, sizeof(struct oct_nic_seapi_resp)); 1716 1717 init_completion(&sc->complete); 1718 sc->sc_status = OCTEON_REQUEST_PENDING; 1719 1720 ncmd->u64 = 0; 1721 ncmd->s.cmd = SEAPI_CMD_FEC_SET; 1722 ncmd->s.param1 = on_off; 1723 /* SEAPI_CMD_FEC_DISABLE(0) or SEAPI_CMD_FEC_RS(1) */ 1724 1725 octeon_swap_8B_data((u64 *)ncmd, (OCTNET_CMD_SIZE >> 3)); 1726 1727 sc->iq_no = lio->linfo.txpciq[0].s.q_no; 1728 1729 octeon_prepare_soft_command(oct, sc, OPCODE_NIC, 1730 OPCODE_NIC_UBOOT_CTL, 0, 0, 0); 1731 1732 retval = octeon_send_soft_command(oct, sc); 1733 if (retval == IQ_SEND_FAILED) { 1734 dev_info(&oct->pci_dev->dev, "Failed to send soft command\n"); 1735 octeon_free_soft_command(oct, sc); 1736 return -EIO; 1737 } 1738 1739 retval = wait_for_sc_completion_timeout(oct, sc, 0); 1740 if (retval) 1741 return (-EIO); 1742 1743 var = be32_to_cpu(resp->fec_setting); 1744 resp->fec_setting = var; 1745 if (var != on_off) { 1746 dev_err(&oct->pci_dev->dev, 1747 "Setting failed fec= %x, expect %x\n", 1748 var, on_off); 1749 oct->props[lio->ifidx].fec = var; 1750 if (resp->fec_setting == SEAPI_CMD_FEC_SET_RS) 1751 oct->props[lio->ifidx].fec = 1; 1752 else 1753 oct->props[lio->ifidx].fec = 0; 1754 } 1755 1756 WRITE_ONCE(sc->caller_is_done, true); 1757 1758 if (oct->props[lio->ifidx].fec != 1759 oct->props[lio->ifidx].fec_boot) { 1760 dev_dbg(&oct->pci_dev->dev, 1761 "Reload driver to change fec to %s\n", 1762 oct->props[lio->ifidx].fec ? "on" : "off"); 1763 } 1764 1765 return retval; 1766} 1767 1768int liquidio_get_fec(struct lio *lio) 1769{ 1770 struct oct_nic_seapi_resp *resp; 1771 struct octeon_soft_command *sc; 1772 struct octeon_device *oct; 1773 union octnet_cmd *ncmd; 1774 int retval; 1775 u32 var; 1776 1777 oct = lio->oct_dev; 1778 1779 sc = octeon_alloc_soft_command(oct, OCTNET_CMD_SIZE, 1780 sizeof(struct oct_nic_seapi_resp), 0); 1781 if (!sc) 1782 return -ENOMEM; 1783 1784 ncmd = sc->virtdptr; 1785 resp = sc->virtrptr; 1786 memset(resp, 0, sizeof(struct oct_nic_seapi_resp)); 1787 1788 init_completion(&sc->complete); 1789 sc->sc_status = OCTEON_REQUEST_PENDING; 1790 1791 ncmd->u64 = 0; 1792 ncmd->s.cmd = SEAPI_CMD_FEC_GET; 1793 1794 octeon_swap_8B_data((u64 *)ncmd, (OCTNET_CMD_SIZE >> 3)); 1795 1796 sc->iq_no = lio->linfo.txpciq[0].s.q_no; 1797 1798 octeon_prepare_soft_command(oct, sc, OPCODE_NIC, 1799 OPCODE_NIC_UBOOT_CTL, 0, 0, 0); 1800 1801 retval = octeon_send_soft_command(oct, sc); 1802 if (retval == IQ_SEND_FAILED) { 1803 dev_info(&oct->pci_dev->dev, 1804 "%s: Failed to send soft command\n", __func__); 1805 octeon_free_soft_command(oct, sc); 1806 return -EIO; 1807 } 1808 1809 retval = wait_for_sc_completion_timeout(oct, sc, 0); 1810 if (retval) 1811 return retval; 1812 1813 var = be32_to_cpu(resp->fec_setting); 1814 resp->fec_setting = var; 1815 if (resp->fec_setting == SEAPI_CMD_FEC_SET_RS) 1816 oct->props[lio->ifidx].fec = 1; 1817 else 1818 oct->props[lio->ifidx].fec = 0; 1819 1820 WRITE_ONCE(sc->caller_is_done, true); 1821 1822 if (oct->props[lio->ifidx].fec != 1823 oct->props[lio->ifidx].fec_boot) { 1824 dev_dbg(&oct->pci_dev->dev, 1825 "Reload driver to change fec to %s\n", 1826 oct->props[lio->ifidx].fec ? "on" : "off"); 1827 } 1828 1829 return retval; 1830} 1831EXPORT_SYMBOL_GPL(liquidio_get_fec);
~/
Read-only file preview.