1 /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0) 2 * Copyright(c) 2018-2019 Pensando Systems, Inc. All rights reserved. 3 */ 4 5 #include <rte_malloc.h> 6 #include <rte_ethdev_driver.h> 7 8 #include "ionic.h" 9 #include "ionic_logs.h" 10 #include "ionic_lif.h" 11 #include "ionic_ethdev.h" 12 #include "ionic_rx_filter.h" 13 #include "ionic_rxtx.h" 14 15 static int ionic_lif_addr_add(struct ionic_lif *lif, const uint8_t *addr); 16 static int ionic_lif_addr_del(struct ionic_lif *lif, const uint8_t *addr); 17 18 int 19 ionic_qcq_enable(struct ionic_qcq *qcq) 20 { 21 struct ionic_queue *q = &qcq->q; 22 struct ionic_lif *lif = q->lif; 23 struct ionic_dev *idev = &lif->adapter->idev; 24 struct ionic_admin_ctx ctx = { 25 .pending_work = true, 26 .cmd.q_control = { 27 .opcode = IONIC_CMD_Q_CONTROL, 28 .type = q->type, 29 .index = q->index, 30 .oper = IONIC_Q_ENABLE, 31 }, 32 }; 33 34 if (qcq->flags & IONIC_QCQ_F_INTR) { 35 ionic_intr_mask(idev->intr_ctrl, qcq->intr.index, 36 IONIC_INTR_MASK_CLEAR); 37 } 38 39 return ionic_adminq_post_wait(lif, &ctx); 40 } 41 42 int 43 ionic_qcq_disable(struct ionic_qcq *qcq) 44 { 45 struct ionic_queue *q = &qcq->q; 46 struct ionic_lif *lif = q->lif; 47 struct ionic_dev *idev = &lif->adapter->idev; 48 struct ionic_admin_ctx ctx = { 49 .pending_work = true, 50 .cmd.q_control = { 51 .opcode = IONIC_CMD_Q_CONTROL, 52 .type = q->type, 53 .index = q->index, 54 .oper = IONIC_Q_DISABLE, 55 }, 56 }; 57 58 if (qcq->flags & IONIC_QCQ_F_INTR) { 59 ionic_intr_mask(idev->intr_ctrl, qcq->intr.index, 60 IONIC_INTR_MASK_SET); 61 } 62 63 return ionic_adminq_post_wait(lif, &ctx); 64 } 65 66 void 67 ionic_lif_stop(struct ionic_lif *lif) 68 { 69 uint32_t i; 70 71 IONIC_PRINT_CALL(); 72 73 lif->state &= ~IONIC_LIF_F_UP; 74 75 for (i = 0; i < lif->nrxqcqs; i++) { 76 struct ionic_qcq *rxq = lif->rxqcqs[i]; 77 if (rxq->flags & IONIC_QCQ_F_INITED) 78 (void)ionic_dev_rx_queue_stop(lif->eth_dev, i); 79 } 80 81 for (i = 0; i < lif->ntxqcqs; i++) { 82 struct ionic_qcq *txq = lif->txqcqs[i]; 83 if (txq->flags & IONIC_QCQ_F_INITED) 84 (void)ionic_dev_tx_queue_stop(lif->eth_dev, i); 85 } 86 } 87 88 void 89 ionic_lif_reset(struct ionic_lif *lif) 90 { 91 struct ionic_dev *idev = &lif->adapter->idev; 92 int err; 93 94 IONIC_PRINT_CALL(); 95 96 ionic_dev_cmd_lif_reset(idev); 97 err = ionic_dev_cmd_wait_check(idev, IONIC_DEVCMD_TIMEOUT); 98 if (err) 99 IONIC_PRINT(WARNING, "Failed to reset %s", lif->name); 100 } 101 102 static void 103 ionic_lif_get_abs_stats(const struct ionic_lif *lif, struct rte_eth_stats *stats) 104 { 105 struct ionic_lif_stats *ls = &lif->info->stats; 106 uint32_t i; 107 uint32_t num_rx_q_counters = RTE_MIN(lif->nrxqcqs, (uint32_t) 108 RTE_ETHDEV_QUEUE_STAT_CNTRS); 109 uint32_t num_tx_q_counters = RTE_MIN(lif->ntxqcqs, (uint32_t) 110 RTE_ETHDEV_QUEUE_STAT_CNTRS); 111 112 memset(stats, 0, sizeof(*stats)); 113 114 if (ls == NULL) { 115 IONIC_PRINT(DEBUG, "Stats on port %u not yet initialized", 116 lif->port_id); 117 return; 118 } 119 120 /* RX */ 121 122 stats->ipackets = ls->rx_ucast_packets + 123 ls->rx_mcast_packets + 124 ls->rx_bcast_packets; 125 126 stats->ibytes = ls->rx_ucast_bytes + 127 ls->rx_mcast_bytes + 128 ls->rx_bcast_bytes; 129 130 for (i = 0; i < lif->nrxqcqs; i++) { 131 struct ionic_rx_stats *rx_stats = &lif->rxqcqs[i]->stats.rx; 132 stats->imissed += 133 rx_stats->no_cb_arg + 134 rx_stats->bad_cq_status + 135 rx_stats->no_room + 136 rx_stats->bad_len; 137 } 138 139 stats->imissed += 140 ls->rx_ucast_drop_packets + 141 ls->rx_mcast_drop_packets + 142 ls->rx_bcast_drop_packets; 143 144 stats->imissed += 145 ls->rx_queue_empty + 146 ls->rx_dma_error + 147 ls->rx_queue_disabled + 148 ls->rx_desc_fetch_error + 149 ls->rx_desc_data_error; 150 151 for (i = 0; i < num_rx_q_counters; i++) { 152 struct ionic_rx_stats *rx_stats = &lif->rxqcqs[i]->stats.rx; 153 stats->q_ipackets[i] = rx_stats->packets; 154 stats->q_ibytes[i] = rx_stats->bytes; 155 stats->q_errors[i] = 156 rx_stats->no_cb_arg + 157 rx_stats->bad_cq_status + 158 rx_stats->no_room + 159 rx_stats->bad_len; 160 } 161 162 /* TX */ 163 164 stats->opackets = ls->tx_ucast_packets + 165 ls->tx_mcast_packets + 166 ls->tx_bcast_packets; 167 168 stats->obytes = ls->tx_ucast_bytes + 169 ls->tx_mcast_bytes + 170 ls->tx_bcast_bytes; 171 172 for (i = 0; i < lif->ntxqcqs; i++) { 173 struct ionic_tx_stats *tx_stats = &lif->txqcqs[i]->stats.tx; 174 stats->oerrors += tx_stats->drop; 175 } 176 177 stats->oerrors += 178 ls->tx_ucast_drop_packets + 179 ls->tx_mcast_drop_packets + 180 ls->tx_bcast_drop_packets; 181 182 stats->oerrors += 183 ls->tx_dma_error + 184 ls->tx_queue_disabled + 185 ls->tx_desc_fetch_error + 186 ls->tx_desc_data_error; 187 188 for (i = 0; i < num_tx_q_counters; i++) { 189 struct ionic_tx_stats *tx_stats = &lif->txqcqs[i]->stats.tx; 190 stats->q_opackets[i] = tx_stats->packets; 191 stats->q_obytes[i] = tx_stats->bytes; 192 } 193 } 194 195 void 196 ionic_lif_get_stats(const struct ionic_lif *lif, 197 struct rte_eth_stats *stats) 198 { 199 ionic_lif_get_abs_stats(lif, stats); 200 201 stats->ipackets -= lif->stats_base.ipackets; 202 stats->opackets -= lif->stats_base.opackets; 203 stats->ibytes -= lif->stats_base.ibytes; 204 stats->obytes -= lif->stats_base.obytes; 205 stats->imissed -= lif->stats_base.imissed; 206 stats->ierrors -= lif->stats_base.ierrors; 207 stats->oerrors -= lif->stats_base.oerrors; 208 stats->rx_nombuf -= lif->stats_base.rx_nombuf; 209 } 210 211 void 212 ionic_lif_reset_stats(struct ionic_lif *lif) 213 { 214 uint32_t i; 215 216 for (i = 0; i < lif->nrxqcqs; i++) { 217 memset(&lif->rxqcqs[i]->stats.rx, 0, 218 sizeof(struct ionic_rx_stats)); 219 memset(&lif->txqcqs[i]->stats.tx, 0, 220 sizeof(struct ionic_tx_stats)); 221 } 222 223 ionic_lif_get_abs_stats(lif, &lif->stats_base); 224 } 225 226 void 227 ionic_lif_get_hw_stats(struct ionic_lif *lif, struct ionic_lif_stats *stats) 228 { 229 uint16_t i, count = sizeof(struct ionic_lif_stats) / sizeof(uint64_t); 230 uint64_t *stats64 = (uint64_t *)stats; 231 uint64_t *lif_stats64 = (uint64_t *)&lif->info->stats; 232 uint64_t *lif_stats64_base = (uint64_t *)&lif->lif_stats_base; 233 234 for (i = 0; i < count; i++) 235 stats64[i] = lif_stats64[i] - lif_stats64_base[i]; 236 } 237 238 void 239 ionic_lif_reset_hw_stats(struct ionic_lif *lif) 240 { 241 uint16_t i, count = sizeof(struct ionic_lif_stats) / sizeof(uint64_t); 242 uint64_t *lif_stats64 = (uint64_t *)&lif->info->stats; 243 uint64_t *lif_stats64_base = (uint64_t *)&lif->lif_stats_base; 244 245 for (i = 0; i < count; i++) 246 lif_stats64_base[i] = lif_stats64[i]; 247 } 248 249 static int 250 ionic_lif_addr_add(struct ionic_lif *lif, const uint8_t *addr) 251 { 252 struct ionic_admin_ctx ctx = { 253 .pending_work = true, 254 .cmd.rx_filter_add = { 255 .opcode = IONIC_CMD_RX_FILTER_ADD, 256 .match = IONIC_RX_FILTER_MATCH_MAC, 257 }, 258 }; 259 int err; 260 261 memcpy(ctx.cmd.rx_filter_add.mac.addr, addr, RTE_ETHER_ADDR_LEN); 262 263 err = ionic_adminq_post_wait(lif, &ctx); 264 if (err) 265 return err; 266 267 IONIC_PRINT(INFO, "rx_filter add (id %d)", 268 ctx.comp.rx_filter_add.filter_id); 269 270 return ionic_rx_filter_save(lif, 0, IONIC_RXQ_INDEX_ANY, &ctx); 271 } 272 273 static int 274 ionic_lif_addr_del(struct ionic_lif *lif, const uint8_t *addr) 275 { 276 struct ionic_admin_ctx ctx = { 277 .pending_work = true, 278 .cmd.rx_filter_del = { 279 .opcode = IONIC_CMD_RX_FILTER_DEL, 280 }, 281 }; 282 struct ionic_rx_filter *f; 283 int err; 284 285 IONIC_PRINT_CALL(); 286 287 rte_spinlock_lock(&lif->rx_filters.lock); 288 289 f = ionic_rx_filter_by_addr(lif, addr); 290 if (!f) { 291 rte_spinlock_unlock(&lif->rx_filters.lock); 292 return -ENOENT; 293 } 294 295 ctx.cmd.rx_filter_del.filter_id = f->filter_id; 296 ionic_rx_filter_free(f); 297 298 rte_spinlock_unlock(&lif->rx_filters.lock); 299 300 err = ionic_adminq_post_wait(lif, &ctx); 301 if (err) 302 return err; 303 304 IONIC_PRINT(INFO, "rx_filter del (id %d)", 305 ctx.cmd.rx_filter_del.filter_id); 306 307 return 0; 308 } 309 310 int 311 ionic_dev_add_mac(struct rte_eth_dev *eth_dev, 312 struct rte_ether_addr *mac_addr, 313 uint32_t index __rte_unused, uint32_t pool __rte_unused) 314 { 315 struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 316 317 IONIC_PRINT_CALL(); 318 319 return ionic_lif_addr_add(lif, (const uint8_t *)mac_addr); 320 } 321 322 void 323 ionic_dev_remove_mac(struct rte_eth_dev *eth_dev, uint32_t index) 324 { 325 struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 326 struct ionic_adapter *adapter = lif->adapter; 327 struct rte_ether_addr *mac_addr; 328 329 IONIC_PRINT_CALL(); 330 331 if (index >= adapter->max_mac_addrs) { 332 IONIC_PRINT(WARNING, 333 "Index %u is above MAC filter limit %u", 334 index, adapter->max_mac_addrs); 335 return; 336 } 337 338 mac_addr = ð_dev->data->mac_addrs[index]; 339 340 if (!rte_is_valid_assigned_ether_addr(mac_addr)) 341 return; 342 343 ionic_lif_addr_del(lif, (const uint8_t *)mac_addr); 344 } 345 346 int 347 ionic_dev_set_mac(struct rte_eth_dev *eth_dev, struct rte_ether_addr *mac_addr) 348 { 349 struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 350 351 IONIC_PRINT_CALL(); 352 353 if (mac_addr == NULL) { 354 IONIC_PRINT(NOTICE, "New mac is null"); 355 return -1; 356 } 357 358 if (!rte_is_zero_ether_addr((struct rte_ether_addr *)lif->mac_addr)) { 359 IONIC_PRINT(INFO, "Deleting mac addr %pM", 360 lif->mac_addr); 361 ionic_lif_addr_del(lif, lif->mac_addr); 362 memset(lif->mac_addr, 0, RTE_ETHER_ADDR_LEN); 363 } 364 365 IONIC_PRINT(INFO, "Updating mac addr"); 366 367 rte_ether_addr_copy(mac_addr, (struct rte_ether_addr *)lif->mac_addr); 368 369 return ionic_lif_addr_add(lif, (const uint8_t *)mac_addr); 370 } 371 372 static int 373 ionic_vlan_rx_add_vid(struct ionic_lif *lif, uint16_t vid) 374 { 375 struct ionic_admin_ctx ctx = { 376 .pending_work = true, 377 .cmd.rx_filter_add = { 378 .opcode = IONIC_CMD_RX_FILTER_ADD, 379 .match = IONIC_RX_FILTER_MATCH_VLAN, 380 .vlan.vlan = vid, 381 }, 382 }; 383 int err; 384 385 err = ionic_adminq_post_wait(lif, &ctx); 386 if (err) 387 return err; 388 389 IONIC_PRINT(INFO, "rx_filter add VLAN %d (id %d)", vid, 390 ctx.comp.rx_filter_add.filter_id); 391 392 return ionic_rx_filter_save(lif, 0, IONIC_RXQ_INDEX_ANY, &ctx); 393 } 394 395 static int 396 ionic_vlan_rx_kill_vid(struct ionic_lif *lif, uint16_t vid) 397 { 398 struct ionic_admin_ctx ctx = { 399 .pending_work = true, 400 .cmd.rx_filter_del = { 401 .opcode = IONIC_CMD_RX_FILTER_DEL, 402 }, 403 }; 404 struct ionic_rx_filter *f; 405 int err; 406 407 IONIC_PRINT_CALL(); 408 409 rte_spinlock_lock(&lif->rx_filters.lock); 410 411 f = ionic_rx_filter_by_vlan(lif, vid); 412 if (!f) { 413 rte_spinlock_unlock(&lif->rx_filters.lock); 414 return -ENOENT; 415 } 416 417 ctx.cmd.rx_filter_del.filter_id = f->filter_id; 418 ionic_rx_filter_free(f); 419 rte_spinlock_unlock(&lif->rx_filters.lock); 420 421 err = ionic_adminq_post_wait(lif, &ctx); 422 if (err) 423 return err; 424 425 IONIC_PRINT(INFO, "rx_filter del VLAN %d (id %d)", vid, 426 ctx.cmd.rx_filter_del.filter_id); 427 428 return 0; 429 } 430 431 int 432 ionic_dev_vlan_filter_set(struct rte_eth_dev *eth_dev, uint16_t vlan_id, 433 int on) 434 { 435 struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 436 int err; 437 438 if (on) 439 err = ionic_vlan_rx_add_vid(lif, vlan_id); 440 else 441 err = ionic_vlan_rx_kill_vid(lif, vlan_id); 442 443 return err; 444 } 445 446 static void 447 ionic_lif_rx_mode(struct ionic_lif *lif, uint32_t rx_mode) 448 { 449 struct ionic_admin_ctx ctx = { 450 .pending_work = true, 451 .cmd.rx_mode_set = { 452 .opcode = IONIC_CMD_RX_MODE_SET, 453 .rx_mode = rx_mode, 454 }, 455 }; 456 int err; 457 458 if (rx_mode & IONIC_RX_MODE_F_UNICAST) 459 IONIC_PRINT(DEBUG, "rx_mode IONIC_RX_MODE_F_UNICAST"); 460 if (rx_mode & IONIC_RX_MODE_F_MULTICAST) 461 IONIC_PRINT(DEBUG, "rx_mode IONIC_RX_MODE_F_MULTICAST"); 462 if (rx_mode & IONIC_RX_MODE_F_BROADCAST) 463 IONIC_PRINT(DEBUG, "rx_mode IONIC_RX_MODE_F_BROADCAST"); 464 if (rx_mode & IONIC_RX_MODE_F_PROMISC) 465 IONIC_PRINT(DEBUG, "rx_mode IONIC_RX_MODE_F_PROMISC"); 466 if (rx_mode & IONIC_RX_MODE_F_ALLMULTI) 467 IONIC_PRINT(DEBUG, "rx_mode IONIC_RX_MODE_F_ALLMULTI"); 468 469 err = ionic_adminq_post_wait(lif, &ctx); 470 if (err) 471 IONIC_PRINT(ERR, "Failure setting RX mode"); 472 } 473 474 static void 475 ionic_set_rx_mode(struct ionic_lif *lif, uint32_t rx_mode) 476 { 477 if (lif->rx_mode != rx_mode) { 478 lif->rx_mode = rx_mode; 479 ionic_lif_rx_mode(lif, rx_mode); 480 } 481 } 482 483 int 484 ionic_dev_promiscuous_enable(struct rte_eth_dev *eth_dev) 485 { 486 struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 487 uint32_t rx_mode = lif->rx_mode; 488 489 IONIC_PRINT_CALL(); 490 491 rx_mode |= IONIC_RX_MODE_F_PROMISC; 492 493 ionic_set_rx_mode(lif, rx_mode); 494 495 return 0; 496 } 497 498 int 499 ionic_dev_promiscuous_disable(struct rte_eth_dev *eth_dev) 500 { 501 struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 502 uint32_t rx_mode = lif->rx_mode; 503 504 rx_mode &= ~IONIC_RX_MODE_F_PROMISC; 505 506 ionic_set_rx_mode(lif, rx_mode); 507 508 return 0; 509 } 510 511 int 512 ionic_dev_allmulticast_enable(struct rte_eth_dev *eth_dev) 513 { 514 struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 515 uint32_t rx_mode = lif->rx_mode; 516 517 rx_mode |= IONIC_RX_MODE_F_ALLMULTI; 518 519 ionic_set_rx_mode(lif, rx_mode); 520 521 return 0; 522 } 523 524 int 525 ionic_dev_allmulticast_disable(struct rte_eth_dev *eth_dev) 526 { 527 struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); 528 uint32_t rx_mode = lif->rx_mode; 529 530 rx_mode &= ~IONIC_RX_MODE_F_ALLMULTI; 531 532 ionic_set_rx_mode(lif, rx_mode); 533 534 return 0; 535 } 536 537 int 538 ionic_lif_change_mtu(struct ionic_lif *lif, int new_mtu) 539 { 540 struct ionic_admin_ctx ctx = { 541 .pending_work = true, 542 .cmd.lif_setattr = { 543 .opcode = IONIC_CMD_LIF_SETATTR, 544 .attr = IONIC_LIF_ATTR_MTU, 545 .mtu = new_mtu, 546 }, 547 }; 548 int err; 549 550 err = ionic_adminq_post_wait(lif, &ctx); 551 if (err) 552 return err; 553 554 return 0; 555 } 556 557 int 558 ionic_intr_alloc(struct ionic_lif *lif, struct ionic_intr_info *intr) 559 { 560 struct ionic_adapter *adapter = lif->adapter; 561 struct ionic_dev *idev = &adapter->idev; 562 unsigned long index; 563 564 /* 565 * Note: interrupt handler is called for index = 0 only 566 * (we use interrupts for the notifyq only anyway, 567 * which has index = 0) 568 */ 569 570 for (index = 0; index < adapter->nintrs; index++) 571 if (!adapter->intrs[index]) 572 break; 573 574 if (index == adapter->nintrs) 575 return -ENOSPC; 576 577 adapter->intrs[index] = true; 578 579 ionic_intr_init(idev, intr, index); 580 581 return 0; 582 } 583 584 void 585 ionic_intr_free(struct ionic_lif *lif, struct ionic_intr_info *intr) 586 { 587 if (intr->index != IONIC_INTR_INDEX_NOT_ASSIGNED) 588 lif->adapter->intrs[intr->index] = false; 589 } 590 591 static int 592 ionic_qcq_alloc(struct ionic_lif *lif, uint8_t type, 593 uint32_t index, 594 const char *base, uint32_t flags, 595 uint32_t num_descs, 596 uint32_t desc_size, 597 uint32_t cq_desc_size, 598 uint32_t sg_desc_size, 599 struct ionic_qcq **qcq) 600 { 601 struct ionic_dev *idev = &lif->adapter->idev; 602 struct ionic_qcq *new; 603 uint32_t q_size, cq_size, sg_size, total_size; 604 void *q_base, *cq_base, *sg_base; 605 rte_iova_t q_base_pa = 0; 606 rte_iova_t cq_base_pa = 0; 607 rte_iova_t sg_base_pa = 0; 608 uint32_t socket_id = rte_socket_id(); 609 int err; 610 611 *qcq = NULL; 612 613 q_size = num_descs * desc_size; 614 cq_size = num_descs * cq_desc_size; 615 sg_size = num_descs * sg_desc_size; 616 617 total_size = RTE_ALIGN(q_size, PAGE_SIZE) + 618 RTE_ALIGN(cq_size, PAGE_SIZE); 619 /* 620 * Note: aligning q_size/cq_size is not enough due to cq_base address 621 * aligning as q_base could be not aligned to the page. 622 * Adding PAGE_SIZE. 623 */ 624 total_size += PAGE_SIZE; 625 626 if (flags & IONIC_QCQ_F_SG) { 627 total_size += RTE_ALIGN(sg_size, PAGE_SIZE); 628 total_size += PAGE_SIZE; 629 } 630 631 new = rte_zmalloc("ionic", sizeof(*new), 0); 632 if (!new) { 633 IONIC_PRINT(ERR, "Cannot allocate queue structure"); 634 return -ENOMEM; 635 } 636 637 new->lif = lif; 638 new->flags = flags; 639 640 new->q.info = rte_zmalloc("ionic", sizeof(*new->q.info) * num_descs, 0); 641 if (!new->q.info) { 642 IONIC_PRINT(ERR, "Cannot allocate queue info"); 643 return -ENOMEM; 644 } 645 646 new->q.type = type; 647 648 err = ionic_q_init(lif, idev, &new->q, index, num_descs, 649 desc_size, sg_desc_size); 650 if (err) { 651 IONIC_PRINT(ERR, "Queue initialization failed"); 652 return err; 653 } 654 655 if (flags & IONIC_QCQ_F_INTR) { 656 err = ionic_intr_alloc(lif, &new->intr); 657 if (err) 658 return err; 659 660 ionic_intr_mask_assert(idev->intr_ctrl, new->intr.index, 661 IONIC_INTR_MASK_SET); 662 } else { 663 new->intr.index = IONIC_INTR_INDEX_NOT_ASSIGNED; 664 } 665 666 err = ionic_cq_init(lif, &new->cq, &new->intr, 667 num_descs, cq_desc_size); 668 if (err) { 669 IONIC_PRINT(ERR, "Completion queue initialization failed"); 670 goto err_out_free_intr; 671 } 672 673 new->base_z = rte_eth_dma_zone_reserve(lif->eth_dev, 674 base /* name */, index /* queue_idx */, 675 total_size, IONIC_ALIGN, socket_id); 676 677 if (!new->base_z) { 678 IONIC_PRINT(ERR, "Cannot reserve queue DMA memory"); 679 err = -ENOMEM; 680 goto err_out_free_intr; 681 } 682 683 new->base = new->base_z->addr; 684 new->base_pa = new->base_z->iova; 685 new->total_size = total_size; 686 687 q_base = new->base; 688 q_base_pa = new->base_pa; 689 690 cq_base = (void *)RTE_ALIGN((uintptr_t)q_base + q_size, PAGE_SIZE); 691 cq_base_pa = RTE_ALIGN(q_base_pa + q_size, PAGE_SIZE); 692 693 if (flags & IONIC_QCQ_F_SG) { 694 sg_base = (void *)RTE_ALIGN((uintptr_t)cq_base + cq_size, 695 PAGE_SIZE); 696 sg_base_pa = RTE_ALIGN(cq_base_pa + cq_size, PAGE_SIZE); 697 ionic_q_sg_map(&new->q, sg_base, sg_base_pa); 698 } 699 700 IONIC_PRINT(DEBUG, "Q-Base-PA = %#jx CQ-Base-PA = %#jx " 701 "SG-base-PA = %#jx", 702 q_base_pa, cq_base_pa, sg_base_pa); 703 704 ionic_q_map(&new->q, q_base, q_base_pa); 705 ionic_cq_map(&new->cq, cq_base, cq_base_pa); 706 ionic_cq_bind(&new->cq, &new->q); 707 708 *qcq = new; 709 710 return 0; 711 712 err_out_free_intr: 713 if (flags & IONIC_QCQ_F_INTR) 714 ionic_intr_free(lif, &new->intr); 715 716 return err; 717 } 718 719 void 720 ionic_qcq_free(struct ionic_qcq *qcq) 721 { 722 if (qcq->base_z) { 723 qcq->base = NULL; 724 qcq->base_pa = 0; 725 rte_memzone_free(qcq->base_z); 726 qcq->base_z = NULL; 727 } 728 729 if (qcq->q.info) { 730 rte_free(qcq->q.info); 731 qcq->q.info = NULL; 732 } 733 734 rte_free(qcq); 735 } 736 737 int 738 ionic_rx_qcq_alloc(struct ionic_lif *lif, uint32_t index, uint16_t nrxq_descs, 739 struct ionic_qcq **qcq) 740 { 741 uint32_t flags; 742 int err = -ENOMEM; 743 744 flags = IONIC_QCQ_F_SG; 745 err = ionic_qcq_alloc(lif, IONIC_QTYPE_RXQ, index, "rx", flags, 746 nrxq_descs, 747 sizeof(struct ionic_rxq_desc), 748 sizeof(struct ionic_rxq_comp), 749 sizeof(struct ionic_rxq_sg_desc), 750 &lif->rxqcqs[index]); 751 if (err) 752 return err; 753 754 *qcq = lif->rxqcqs[index]; 755 756 return 0; 757 } 758 759 int 760 ionic_tx_qcq_alloc(struct ionic_lif *lif, uint32_t index, uint16_t ntxq_descs, 761 struct ionic_qcq **qcq) 762 { 763 uint32_t flags; 764 int err = -ENOMEM; 765 766 flags = IONIC_QCQ_F_SG; 767 err = ionic_qcq_alloc(lif, IONIC_QTYPE_TXQ, index, "tx", flags, 768 ntxq_descs, 769 sizeof(struct ionic_txq_desc), 770 sizeof(struct ionic_txq_comp), 771 sizeof(struct ionic_txq_sg_desc), 772 &lif->txqcqs[index]); 773 if (err) 774 return err; 775 776 *qcq = lif->txqcqs[index]; 777 778 return 0; 779 } 780 781 static int 782 ionic_admin_qcq_alloc(struct ionic_lif *lif) 783 { 784 uint32_t flags; 785 int err = -ENOMEM; 786 787 flags = 0; 788 err = ionic_qcq_alloc(lif, IONIC_QTYPE_ADMINQ, 0, "admin", flags, 789 IONIC_ADMINQ_LENGTH, 790 sizeof(struct ionic_admin_cmd), 791 sizeof(struct ionic_admin_comp), 792 0, 793 &lif->adminqcq); 794 if (err) 795 return err; 796 797 return 0; 798 } 799 800 static int 801 ionic_notify_qcq_alloc(struct ionic_lif *lif) 802 { 803 uint32_t flags; 804 int err = -ENOMEM; 805 806 flags = IONIC_QCQ_F_NOTIFYQ | IONIC_QCQ_F_INTR; 807 808 err = ionic_qcq_alloc(lif, IONIC_QTYPE_NOTIFYQ, 0, "notify", 809 flags, 810 IONIC_NOTIFYQ_LENGTH, 811 sizeof(struct ionic_notifyq_cmd), 812 sizeof(union ionic_notifyq_comp), 813 0, 814 &lif->notifyqcq); 815 if (err) 816 return err; 817 818 return 0; 819 } 820 821 static void * 822 ionic_bus_map_dbpage(struct ionic_adapter *adapter, int page_num) 823 { 824 char *vaddr = adapter->bars[IONIC_PCI_BAR_DBELL].vaddr; 825 826 if (adapter->num_bars <= IONIC_PCI_BAR_DBELL) 827 return NULL; 828 829 return (void *)&vaddr[page_num << PAGE_SHIFT]; 830 } 831 832 int 833 ionic_lif_alloc(struct ionic_lif *lif) 834 { 835 struct ionic_adapter *adapter = lif->adapter; 836 uint32_t socket_id = rte_socket_id(); 837 int err; 838 839 /* 840 * lif->name was zeroed on allocation. 841 * Copy (sizeof() - 1) bytes to ensure that it is NULL terminated. 842 */ 843 memcpy(lif->name, lif->eth_dev->data->name, sizeof(lif->name) - 1); 844 845 IONIC_PRINT(DEBUG, "LIF: %s", lif->name); 846 847 IONIC_PRINT(DEBUG, "Allocating Lif Info"); 848 849 rte_spinlock_init(&lif->adminq_lock); 850 rte_spinlock_init(&lif->adminq_service_lock); 851 852 lif->kern_dbpage = ionic_bus_map_dbpage(adapter, 0); 853 if (!lif->kern_dbpage) { 854 IONIC_PRINT(ERR, "Cannot map dbpage, aborting"); 855 return -ENOMEM; 856 } 857 858 lif->txqcqs = rte_zmalloc("ionic", sizeof(*lif->txqcqs) * 859 adapter->max_ntxqs_per_lif, 0); 860 861 if (!lif->txqcqs) { 862 IONIC_PRINT(ERR, "Cannot allocate tx queues array"); 863 return -ENOMEM; 864 } 865 866 lif->rxqcqs = rte_zmalloc("ionic", sizeof(*lif->rxqcqs) * 867 adapter->max_nrxqs_per_lif, 0); 868 869 if (!lif->rxqcqs) { 870 IONIC_PRINT(ERR, "Cannot allocate rx queues array"); 871 return -ENOMEM; 872 } 873 874 IONIC_PRINT(DEBUG, "Allocating Notify Queue"); 875 876 err = ionic_notify_qcq_alloc(lif); 877 if (err) { 878 IONIC_PRINT(ERR, "Cannot allocate notify queue"); 879 return err; 880 } 881 882 IONIC_PRINT(DEBUG, "Allocating Admin Queue"); 883 884 err = ionic_admin_qcq_alloc(lif); 885 if (err) { 886 IONIC_PRINT(ERR, "Cannot allocate admin queue"); 887 return err; 888 } 889 890 IONIC_PRINT(DEBUG, "Allocating Lif Info"); 891 892 lif->info_sz = RTE_ALIGN(sizeof(*lif->info), PAGE_SIZE); 893 894 lif->info_z = rte_eth_dma_zone_reserve(lif->eth_dev, 895 "lif_info", 0 /* queue_idx*/, 896 lif->info_sz, IONIC_ALIGN, socket_id); 897 if (!lif->info_z) { 898 IONIC_PRINT(ERR, "Cannot allocate lif info memory"); 899 return -ENOMEM; 900 } 901 902 lif->info = lif->info_z->addr; 903 lif->info_pa = lif->info_z->iova; 904 905 return 0; 906 } 907 908 void 909 ionic_lif_free(struct ionic_lif *lif) 910 { 911 if (lif->notifyqcq) { 912 ionic_qcq_free(lif->notifyqcq); 913 lif->notifyqcq = NULL; 914 } 915 916 if (lif->adminqcq) { 917 ionic_qcq_free(lif->adminqcq); 918 lif->adminqcq = NULL; 919 } 920 921 if (lif->txqcqs) { 922 rte_free(lif->txqcqs); 923 lif->txqcqs = NULL; 924 } 925 926 if (lif->rxqcqs) { 927 rte_free(lif->rxqcqs); 928 lif->rxqcqs = NULL; 929 } 930 931 if (lif->info) { 932 rte_memzone_free(lif->info_z); 933 lif->info = NULL; 934 } 935 } 936 937 void 938 ionic_lif_free_queues(struct ionic_lif *lif) 939 { 940 uint32_t i; 941 942 for (i = 0; i < lif->ntxqcqs; i++) { 943 ionic_dev_tx_queue_release(lif->eth_dev->data->tx_queues[i]); 944 lif->eth_dev->data->tx_queues[i] = NULL; 945 } 946 for (i = 0; i < lif->nrxqcqs; i++) { 947 ionic_dev_rx_queue_release(lif->eth_dev->data->rx_queues[i]); 948 lif->eth_dev->data->rx_queues[i] = NULL; 949 } 950 } 951 952 int 953 ionic_lif_rss_config(struct ionic_lif *lif, 954 const uint16_t types, const uint8_t *key, const uint32_t *indir) 955 { 956 struct ionic_admin_ctx ctx = { 957 .pending_work = true, 958 .cmd.lif_setattr = { 959 .opcode = IONIC_CMD_LIF_SETATTR, 960 .attr = IONIC_LIF_ATTR_RSS, 961 .rss.types = types, 962 .rss.addr = lif->rss_ind_tbl_pa, 963 }, 964 }; 965 unsigned int i; 966 967 IONIC_PRINT_CALL(); 968 969 lif->rss_types = types; 970 971 if (key) 972 memcpy(lif->rss_hash_key, key, IONIC_RSS_HASH_KEY_SIZE); 973 974 if (indir) 975 for (i = 0; i < lif->adapter->ident.lif.eth.rss_ind_tbl_sz; i++) 976 lif->rss_ind_tbl[i] = indir[i]; 977 978 memcpy(ctx.cmd.lif_setattr.rss.key, lif->rss_hash_key, 979 IONIC_RSS_HASH_KEY_SIZE); 980 981 return ionic_adminq_post_wait(lif, &ctx); 982 } 983 984 static int 985 ionic_lif_rss_setup(struct ionic_lif *lif) 986 { 987 static const uint8_t toeplitz_symmetric_key[] = { 988 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 989 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 990 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 991 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 992 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 993 }; 994 uint32_t i; 995 uint16_t tbl_sz = lif->adapter->ident.lif.eth.rss_ind_tbl_sz; 996 997 IONIC_PRINT_CALL(); 998 999 if (!lif->rss_ind_tbl_z) { 1000 lif->rss_ind_tbl_z = rte_eth_dma_zone_reserve(lif->eth_dev, 1001 "rss_ind_tbl", 0 /* queue_idx */, 1002 sizeof(*lif->rss_ind_tbl) * tbl_sz, 1003 IONIC_ALIGN, rte_socket_id()); 1004 if (!lif->rss_ind_tbl_z) { 1005 IONIC_PRINT(ERR, "OOM"); 1006 return -ENOMEM; 1007 } 1008 1009 lif->rss_ind_tbl = lif->rss_ind_tbl_z->addr; 1010 lif->rss_ind_tbl_pa = lif->rss_ind_tbl_z->iova; 1011 } 1012 1013 if (lif->rss_ind_tbl_nrxqcqs != lif->nrxqcqs) { 1014 lif->rss_ind_tbl_nrxqcqs = lif->nrxqcqs; 1015 1016 /* Fill indirection table with 'default' values */ 1017 for (i = 0; i < tbl_sz; i++) 1018 lif->rss_ind_tbl[i] = i % lif->nrxqcqs; 1019 } 1020 1021 return ionic_lif_rss_config(lif, IONIC_RSS_OFFLOAD_ALL, 1022 toeplitz_symmetric_key, NULL); 1023 } 1024 1025 static void 1026 ionic_lif_rss_teardown(struct ionic_lif *lif) 1027 { 1028 if (!lif->rss_ind_tbl) 1029 return; 1030 1031 if (lif->rss_ind_tbl_z) { 1032 /* Disable RSS on the NIC */ 1033 ionic_lif_rss_config(lif, 0x0, NULL, NULL); 1034 1035 lif->rss_ind_tbl = NULL; 1036 lif->rss_ind_tbl_pa = 0; 1037 rte_memzone_free(lif->rss_ind_tbl_z); 1038 lif->rss_ind_tbl_z = NULL; 1039 } 1040 } 1041 1042 static void 1043 ionic_lif_qcq_deinit(struct ionic_lif *lif, struct ionic_qcq *qcq) 1044 { 1045 struct ionic_dev *idev = &lif->adapter->idev; 1046 1047 if (!(qcq->flags & IONIC_QCQ_F_INITED)) 1048 return; 1049 1050 if (qcq->flags & IONIC_QCQ_F_INTR) 1051 ionic_intr_mask(idev->intr_ctrl, qcq->intr.index, 1052 IONIC_INTR_MASK_SET); 1053 1054 qcq->flags &= ~IONIC_QCQ_F_INITED; 1055 } 1056 1057 void 1058 ionic_lif_txq_deinit(struct ionic_qcq *qcq) 1059 { 1060 ionic_lif_qcq_deinit(qcq->lif, qcq); 1061 } 1062 1063 void 1064 ionic_lif_rxq_deinit(struct ionic_qcq *qcq) 1065 { 1066 ionic_lif_qcq_deinit(qcq->lif, qcq); 1067 } 1068 1069 bool 1070 ionic_adminq_service(struct ionic_cq *cq, uint32_t cq_desc_index, 1071 void *cb_arg __rte_unused) 1072 { 1073 struct ionic_admin_comp *cq_desc_base = cq->base; 1074 struct ionic_admin_comp *cq_desc = &cq_desc_base[cq_desc_index]; 1075 1076 if (!color_match(cq_desc->color, cq->done_color)) 1077 return false; 1078 1079 ionic_q_service(cq->bound_q, cq_desc_index, cq_desc->comp_index, NULL); 1080 1081 return true; 1082 } 1083 1084 /* This acts like ionic_napi */ 1085 int 1086 ionic_qcq_service(struct ionic_qcq *qcq, int budget, ionic_cq_cb cb, 1087 void *cb_arg) 1088 { 1089 struct ionic_cq *cq = &qcq->cq; 1090 uint32_t work_done; 1091 1092 work_done = ionic_cq_service(cq, budget, cb, cb_arg); 1093 1094 return work_done; 1095 } 1096 1097 static void 1098 ionic_link_status_check(struct ionic_lif *lif) 1099 { 1100 struct ionic_adapter *adapter = lif->adapter; 1101 bool link_up; 1102 1103 lif->state &= ~IONIC_LIF_F_LINK_CHECK_NEEDED; 1104 1105 if (!lif->info) 1106 return; 1107 1108 link_up = (lif->info->status.link_status == IONIC_PORT_OPER_STATUS_UP); 1109 1110 if ((link_up && adapter->link_up) || 1111 (!link_up && !adapter->link_up)) 1112 return; 1113 1114 if (link_up) { 1115 adapter->link_speed = lif->info->status.link_speed; 1116 IONIC_PRINT(DEBUG, "Link up - %d Gbps", 1117 adapter->link_speed); 1118 } else { 1119 IONIC_PRINT(DEBUG, "Link down"); 1120 } 1121 1122 adapter->link_up = link_up; 1123 ionic_dev_link_update(lif->eth_dev, 0); 1124 } 1125 1126 static void 1127 ionic_lif_handle_fw_down(struct ionic_lif *lif) 1128 { 1129 if (lif->state & IONIC_LIF_F_FW_RESET) 1130 return; 1131 1132 lif->state |= IONIC_LIF_F_FW_RESET; 1133 1134 if (lif->state & IONIC_LIF_F_UP) { 1135 IONIC_PRINT(NOTICE, 1136 "Surprise FW stop, stopping %s\n", lif->name); 1137 ionic_lif_stop(lif); 1138 } 1139 1140 IONIC_PRINT(NOTICE, "FW down, %s stopped", lif->name); 1141 } 1142 1143 static bool 1144 ionic_notifyq_cb(struct ionic_cq *cq, uint32_t cq_desc_index, void *cb_arg) 1145 { 1146 union ionic_notifyq_comp *cq_desc_base = cq->base; 1147 union ionic_notifyq_comp *cq_desc = &cq_desc_base[cq_desc_index]; 1148 struct ionic_lif *lif = cb_arg; 1149 1150 IONIC_PRINT(DEBUG, "Notifyq callback eid = %jd ecode = %d", 1151 cq_desc->event.eid, cq_desc->event.ecode); 1152 1153 /* Have we run out of new completions to process? */ 1154 if (!(cq_desc->event.eid > lif->last_eid)) 1155 return false; 1156 1157 lif->last_eid = cq_desc->event.eid; 1158 1159 switch (cq_desc->event.ecode) { 1160 case IONIC_EVENT_LINK_CHANGE: 1161 IONIC_PRINT(DEBUG, 1162 "Notifyq IONIC_EVENT_LINK_CHANGE %s " 1163 "eid=%jd link_status=%d link_speed=%d", 1164 lif->name, 1165 cq_desc->event.eid, 1166 cq_desc->link_change.link_status, 1167 cq_desc->link_change.link_speed); 1168 1169 lif->state |= IONIC_LIF_F_LINK_CHECK_NEEDED; 1170 break; 1171 1172 case IONIC_EVENT_RESET: 1173 IONIC_PRINT(NOTICE, 1174 "Notifyq IONIC_EVENT_RESET %s " 1175 "eid=%jd, reset_code=%d state=%d", 1176 lif->name, 1177 cq_desc->event.eid, 1178 cq_desc->reset.reset_code, 1179 cq_desc->reset.state); 1180 ionic_lif_handle_fw_down(lif); 1181 break; 1182 1183 default: 1184 IONIC_PRINT(WARNING, "Notifyq bad event ecode=%d eid=%jd", 1185 cq_desc->event.ecode, cq_desc->event.eid); 1186 break; 1187 } 1188 1189 return true; 1190 } 1191 1192 int 1193 ionic_notifyq_handler(struct ionic_lif *lif, int budget) 1194 { 1195 struct ionic_dev *idev = &lif->adapter->idev; 1196 struct ionic_qcq *qcq = lif->notifyqcq; 1197 uint32_t work_done; 1198 1199 if (!(qcq->flags & IONIC_QCQ_F_INITED)) { 1200 IONIC_PRINT(DEBUG, "Notifyq not yet initialized"); 1201 return -1; 1202 } 1203 1204 ionic_intr_mask(idev->intr_ctrl, qcq->intr.index, 1205 IONIC_INTR_MASK_SET); 1206 1207 work_done = ionic_qcq_service(qcq, budget, ionic_notifyq_cb, lif); 1208 1209 if (lif->state & IONIC_LIF_F_LINK_CHECK_NEEDED) 1210 ionic_link_status_check(lif); 1211 1212 ionic_intr_credits(idev->intr_ctrl, qcq->intr.index, 1213 work_done, IONIC_INTR_CRED_RESET_COALESCE); 1214 1215 ionic_intr_mask(idev->intr_ctrl, qcq->intr.index, 1216 IONIC_INTR_MASK_CLEAR); 1217 1218 return 0; 1219 } 1220 1221 static int 1222 ionic_lif_adminq_init(struct ionic_lif *lif) 1223 { 1224 struct ionic_dev *idev = &lif->adapter->idev; 1225 struct ionic_qcq *qcq = lif->adminqcq; 1226 struct ionic_queue *q = &qcq->q; 1227 struct ionic_q_init_comp comp; 1228 int err; 1229 1230 ionic_dev_cmd_adminq_init(idev, qcq, qcq->intr.index); 1231 err = ionic_dev_cmd_wait_check(idev, IONIC_DEVCMD_TIMEOUT); 1232 if (err) 1233 return err; 1234 1235 ionic_dev_cmd_comp(idev, &comp); 1236 1237 q->hw_type = comp.hw_type; 1238 q->hw_index = comp.hw_index; 1239 q->db = ionic_db_map(lif, q); 1240 1241 IONIC_PRINT(DEBUG, "adminq->hw_type %d", q->hw_type); 1242 IONIC_PRINT(DEBUG, "adminq->hw_index %d", q->hw_index); 1243 IONIC_PRINT(DEBUG, "adminq->db %p", q->db); 1244 1245 if (qcq->flags & IONIC_QCQ_F_INTR) 1246 ionic_intr_mask(idev->intr_ctrl, qcq->intr.index, 1247 IONIC_INTR_MASK_CLEAR); 1248 1249 qcq->flags |= IONIC_QCQ_F_INITED; 1250 1251 return 0; 1252 } 1253 1254 static int 1255 ionic_lif_notifyq_init(struct ionic_lif *lif) 1256 { 1257 struct ionic_dev *idev = &lif->adapter->idev; 1258 struct ionic_qcq *qcq = lif->notifyqcq; 1259 struct ionic_queue *q = &qcq->q; 1260 int err; 1261 1262 struct ionic_admin_ctx ctx = { 1263 .pending_work = true, 1264 .cmd.q_init = { 1265 .opcode = IONIC_CMD_Q_INIT, 1266 .type = q->type, 1267 .index = q->index, 1268 .flags = (IONIC_QINIT_F_IRQ | IONIC_QINIT_F_ENA), 1269 .intr_index = qcq->intr.index, 1270 .ring_size = rte_log2_u32(q->num_descs), 1271 .ring_base = q->base_pa, 1272 } 1273 }; 1274 1275 IONIC_PRINT(DEBUG, "notifyq_init.index %d", 1276 ctx.cmd.q_init.index); 1277 IONIC_PRINT(DEBUG, "notifyq_init.ring_base 0x%" PRIx64 "", 1278 ctx.cmd.q_init.ring_base); 1279 IONIC_PRINT(DEBUG, "notifyq_init.ring_size %d", 1280 ctx.cmd.q_init.ring_size); 1281 IONIC_PRINT(DEBUG, "notifyq_init.ver %u", ctx.cmd.q_init.ver); 1282 1283 err = ionic_adminq_post_wait(lif, &ctx); 1284 if (err) 1285 return err; 1286 1287 q->hw_type = ctx.comp.q_init.hw_type; 1288 q->hw_index = ctx.comp.q_init.hw_index; 1289 q->db = NULL; 1290 1291 IONIC_PRINT(DEBUG, "notifyq->hw_type %d", q->hw_type); 1292 IONIC_PRINT(DEBUG, "notifyq->hw_index %d", q->hw_index); 1293 IONIC_PRINT(DEBUG, "notifyq->db %p", q->db); 1294 1295 if (qcq->flags & IONIC_QCQ_F_INTR) 1296 ionic_intr_mask(idev->intr_ctrl, qcq->intr.index, 1297 IONIC_INTR_MASK_CLEAR); 1298 1299 qcq->flags |= IONIC_QCQ_F_INITED; 1300 1301 return 0; 1302 } 1303 1304 int 1305 ionic_lif_set_features(struct ionic_lif *lif) 1306 { 1307 struct ionic_admin_ctx ctx = { 1308 .pending_work = true, 1309 .cmd.lif_setattr = { 1310 .opcode = IONIC_CMD_LIF_SETATTR, 1311 .attr = IONIC_LIF_ATTR_FEATURES, 1312 .features = lif->features, 1313 }, 1314 }; 1315 int err; 1316 1317 err = ionic_adminq_post_wait(lif, &ctx); 1318 if (err) 1319 return err; 1320 1321 lif->hw_features = (ctx.cmd.lif_setattr.features & 1322 ctx.comp.lif_setattr.features); 1323 1324 if (lif->hw_features & IONIC_ETH_HW_VLAN_TX_TAG) 1325 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_VLAN_TX_TAG"); 1326 if (lif->hw_features & IONIC_ETH_HW_VLAN_RX_STRIP) 1327 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_VLAN_RX_STRIP"); 1328 if (lif->hw_features & IONIC_ETH_HW_VLAN_RX_FILTER) 1329 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_VLAN_RX_FILTER"); 1330 if (lif->hw_features & IONIC_ETH_HW_RX_HASH) 1331 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_RX_HASH"); 1332 if (lif->hw_features & IONIC_ETH_HW_TX_SG) 1333 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TX_SG"); 1334 if (lif->hw_features & IONIC_ETH_HW_RX_SG) 1335 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_RX_SG"); 1336 if (lif->hw_features & IONIC_ETH_HW_TX_CSUM) 1337 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TX_CSUM"); 1338 if (lif->hw_features & IONIC_ETH_HW_RX_CSUM) 1339 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_RX_CSUM"); 1340 if (lif->hw_features & IONIC_ETH_HW_TSO) 1341 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TSO"); 1342 if (lif->hw_features & IONIC_ETH_HW_TSO_IPV6) 1343 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TSO_IPV6"); 1344 if (lif->hw_features & IONIC_ETH_HW_TSO_ECN) 1345 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TSO_ECN"); 1346 if (lif->hw_features & IONIC_ETH_HW_TSO_GRE) 1347 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TSO_GRE"); 1348 if (lif->hw_features & IONIC_ETH_HW_TSO_GRE_CSUM) 1349 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TSO_GRE_CSUM"); 1350 if (lif->hw_features & IONIC_ETH_HW_TSO_IPXIP4) 1351 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TSO_IPXIP4"); 1352 if (lif->hw_features & IONIC_ETH_HW_TSO_IPXIP6) 1353 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TSO_IPXIP6"); 1354 if (lif->hw_features & IONIC_ETH_HW_TSO_UDP) 1355 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TSO_UDP"); 1356 if (lif->hw_features & IONIC_ETH_HW_TSO_UDP_CSUM) 1357 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TSO_UDP_CSUM"); 1358 1359 return 0; 1360 } 1361 1362 int 1363 ionic_lif_txq_init(struct ionic_qcq *qcq) 1364 { 1365 struct ionic_queue *q = &qcq->q; 1366 struct ionic_lif *lif = qcq->lif; 1367 struct ionic_cq *cq = &qcq->cq; 1368 struct ionic_admin_ctx ctx = { 1369 .pending_work = true, 1370 .cmd.q_init = { 1371 .opcode = IONIC_CMD_Q_INIT, 1372 .type = q->type, 1373 .index = q->index, 1374 .flags = IONIC_QINIT_F_SG, 1375 .intr_index = cq->bound_intr->index, 1376 .ring_size = rte_log2_u32(q->num_descs), 1377 .ring_base = q->base_pa, 1378 .cq_ring_base = cq->base_pa, 1379 .sg_ring_base = q->sg_base_pa, 1380 }, 1381 }; 1382 int err; 1383 1384 IONIC_PRINT(DEBUG, "txq_init.index %d", ctx.cmd.q_init.index); 1385 IONIC_PRINT(DEBUG, "txq_init.ring_base 0x%" PRIx64 "", 1386 ctx.cmd.q_init.ring_base); 1387 IONIC_PRINT(DEBUG, "txq_init.ring_size %d", 1388 ctx.cmd.q_init.ring_size); 1389 IONIC_PRINT(DEBUG, "txq_init.ver %u", ctx.cmd.q_init.ver); 1390 1391 err = ionic_adminq_post_wait(qcq->lif, &ctx); 1392 if (err) 1393 return err; 1394 1395 q->hw_type = ctx.comp.q_init.hw_type; 1396 q->hw_index = ctx.comp.q_init.hw_index; 1397 q->db = ionic_db_map(lif, q); 1398 1399 IONIC_PRINT(DEBUG, "txq->hw_type %d", q->hw_type); 1400 IONIC_PRINT(DEBUG, "txq->hw_index %d", q->hw_index); 1401 IONIC_PRINT(DEBUG, "txq->db %p", q->db); 1402 1403 qcq->flags |= IONIC_QCQ_F_INITED; 1404 1405 return 0; 1406 } 1407 1408 int 1409 ionic_lif_rxq_init(struct ionic_qcq *qcq) 1410 { 1411 struct ionic_queue *q = &qcq->q; 1412 struct ionic_lif *lif = qcq->lif; 1413 struct ionic_cq *cq = &qcq->cq; 1414 struct ionic_admin_ctx ctx = { 1415 .pending_work = true, 1416 .cmd.q_init = { 1417 .opcode = IONIC_CMD_Q_INIT, 1418 .type = q->type, 1419 .index = q->index, 1420 .flags = IONIC_QINIT_F_SG, 1421 .intr_index = cq->bound_intr->index, 1422 .ring_size = rte_log2_u32(q->num_descs), 1423 .ring_base = q->base_pa, 1424 .cq_ring_base = cq->base_pa, 1425 .sg_ring_base = q->sg_base_pa, 1426 }, 1427 }; 1428 int err; 1429 1430 IONIC_PRINT(DEBUG, "rxq_init.index %d", ctx.cmd.q_init.index); 1431 IONIC_PRINT(DEBUG, "rxq_init.ring_base 0x%" PRIx64 "", 1432 ctx.cmd.q_init.ring_base); 1433 IONIC_PRINT(DEBUG, "rxq_init.ring_size %d", 1434 ctx.cmd.q_init.ring_size); 1435 IONIC_PRINT(DEBUG, "rxq_init.ver %u", ctx.cmd.q_init.ver); 1436 1437 err = ionic_adminq_post_wait(qcq->lif, &ctx); 1438 if (err) 1439 return err; 1440 1441 q->hw_type = ctx.comp.q_init.hw_type; 1442 q->hw_index = ctx.comp.q_init.hw_index; 1443 q->db = ionic_db_map(lif, q); 1444 1445 qcq->flags |= IONIC_QCQ_F_INITED; 1446 1447 IONIC_PRINT(DEBUG, "rxq->hw_type %d", q->hw_type); 1448 IONIC_PRINT(DEBUG, "rxq->hw_index %d", q->hw_index); 1449 IONIC_PRINT(DEBUG, "rxq->db %p", q->db); 1450 1451 return 0; 1452 } 1453 1454 static int 1455 ionic_station_set(struct ionic_lif *lif) 1456 { 1457 struct ionic_admin_ctx ctx = { 1458 .pending_work = true, 1459 .cmd.lif_getattr = { 1460 .opcode = IONIC_CMD_LIF_GETATTR, 1461 .attr = IONIC_LIF_ATTR_MAC, 1462 }, 1463 }; 1464 int err; 1465 1466 IONIC_PRINT_CALL(); 1467 1468 err = ionic_adminq_post_wait(lif, &ctx); 1469 if (err) 1470 return err; 1471 1472 if (!rte_is_zero_ether_addr((struct rte_ether_addr *) 1473 lif->mac_addr)) { 1474 IONIC_PRINT(INFO, "deleting station MAC addr"); 1475 1476 ionic_lif_addr_del(lif, lif->mac_addr); 1477 } 1478 1479 memcpy(lif->mac_addr, ctx.comp.lif_getattr.mac, RTE_ETHER_ADDR_LEN); 1480 1481 if (rte_is_zero_ether_addr((struct rte_ether_addr *)lif->mac_addr)) { 1482 IONIC_PRINT(NOTICE, "empty MAC addr (VF?)"); 1483 return 0; 1484 } 1485 1486 IONIC_PRINT(DEBUG, "adding station MAC addr"); 1487 1488 ionic_lif_addr_add(lif, lif->mac_addr); 1489 1490 return 0; 1491 } 1492 1493 static void 1494 ionic_lif_set_name(struct ionic_lif *lif) 1495 { 1496 struct ionic_admin_ctx ctx = { 1497 .pending_work = true, 1498 .cmd.lif_setattr = { 1499 .opcode = IONIC_CMD_LIF_SETATTR, 1500 .attr = IONIC_LIF_ATTR_NAME, 1501 }, 1502 }; 1503 1504 memcpy(ctx.cmd.lif_setattr.name, lif->name, 1505 sizeof(ctx.cmd.lif_setattr.name) - 1); 1506 1507 ionic_adminq_post_wait(lif, &ctx); 1508 } 1509 1510 int 1511 ionic_lif_init(struct ionic_lif *lif) 1512 { 1513 struct ionic_dev *idev = &lif->adapter->idev; 1514 struct ionic_q_init_comp comp; 1515 int err; 1516 1517 memset(&lif->stats_base, 0, sizeof(lif->stats_base)); 1518 1519 ionic_dev_cmd_lif_init(idev, lif->info_pa); 1520 err = ionic_dev_cmd_wait_check(idev, IONIC_DEVCMD_TIMEOUT); 1521 ionic_dev_cmd_comp(idev, &comp); 1522 if (err) 1523 return err; 1524 1525 lif->hw_index = comp.hw_index; 1526 1527 err = ionic_lif_adminq_init(lif); 1528 if (err) 1529 return err; 1530 1531 err = ionic_lif_notifyq_init(lif); 1532 if (err) 1533 goto err_out_adminq_deinit; 1534 1535 lif->features = 1536 IONIC_ETH_HW_VLAN_TX_TAG 1537 | IONIC_ETH_HW_VLAN_RX_STRIP 1538 | IONIC_ETH_HW_VLAN_RX_FILTER 1539 | IONIC_ETH_HW_RX_HASH 1540 | IONIC_ETH_HW_TX_SG 1541 | IONIC_ETH_HW_RX_SG 1542 | IONIC_ETH_HW_TX_CSUM 1543 | IONIC_ETH_HW_RX_CSUM 1544 | IONIC_ETH_HW_TSO 1545 | IONIC_ETH_HW_TSO_IPV6 1546 | IONIC_ETH_HW_TSO_ECN; 1547 1548 err = ionic_lif_set_features(lif); 1549 if (err) 1550 goto err_out_notifyq_deinit; 1551 1552 err = ionic_rx_filters_init(lif); 1553 if (err) 1554 goto err_out_notifyq_deinit; 1555 1556 err = ionic_station_set(lif); 1557 if (err) 1558 goto err_out_rx_filter_deinit; 1559 1560 ionic_lif_set_name(lif); 1561 1562 lif->state |= IONIC_LIF_F_INITED; 1563 1564 return 0; 1565 1566 err_out_rx_filter_deinit: 1567 ionic_rx_filters_deinit(lif); 1568 1569 err_out_notifyq_deinit: 1570 ionic_lif_qcq_deinit(lif, lif->notifyqcq); 1571 1572 err_out_adminq_deinit: 1573 ionic_lif_qcq_deinit(lif, lif->adminqcq); 1574 1575 return err; 1576 } 1577 1578 void 1579 ionic_lif_deinit(struct ionic_lif *lif) 1580 { 1581 if (!(lif->state & IONIC_LIF_F_INITED)) 1582 return; 1583 1584 ionic_rx_filters_deinit(lif); 1585 ionic_lif_rss_teardown(lif); 1586 ionic_lif_qcq_deinit(lif, lif->notifyqcq); 1587 ionic_lif_qcq_deinit(lif, lif->adminqcq); 1588 1589 lif->state &= ~IONIC_LIF_F_INITED; 1590 } 1591 1592 int 1593 ionic_lif_configure(struct ionic_lif *lif) 1594 { 1595 struct ionic_identity *ident = &lif->adapter->ident; 1596 uint32_t ntxqs_per_lif = 1597 ident->lif.eth.config.queue_count[IONIC_QTYPE_TXQ]; 1598 uint32_t nrxqs_per_lif = 1599 ident->lif.eth.config.queue_count[IONIC_QTYPE_RXQ]; 1600 uint32_t nrxqs = lif->eth_dev->data->nb_rx_queues; 1601 uint32_t ntxqs = lif->eth_dev->data->nb_tx_queues; 1602 1603 lif->port_id = lif->eth_dev->data->port_id; 1604 1605 IONIC_PRINT(DEBUG, "Configuring LIF on port %u", 1606 lif->port_id); 1607 1608 if (nrxqs > 0) 1609 nrxqs_per_lif = RTE_MIN(nrxqs_per_lif, nrxqs); 1610 1611 if (ntxqs > 0) 1612 ntxqs_per_lif = RTE_MIN(ntxqs_per_lif, ntxqs); 1613 1614 lif->nrxqcqs = nrxqs_per_lif; 1615 lif->ntxqcqs = ntxqs_per_lif; 1616 1617 return 0; 1618 } 1619 1620 int 1621 ionic_lif_start(struct ionic_lif *lif) 1622 { 1623 uint32_t rx_mode; 1624 uint32_t i; 1625 int err; 1626 1627 err = ionic_lif_rss_setup(lif); 1628 if (err) 1629 return err; 1630 1631 if (!lif->rx_mode) { 1632 IONIC_PRINT(DEBUG, "Setting RX mode on %s", 1633 lif->name); 1634 1635 rx_mode = IONIC_RX_MODE_F_UNICAST; 1636 rx_mode |= IONIC_RX_MODE_F_MULTICAST; 1637 rx_mode |= IONIC_RX_MODE_F_BROADCAST; 1638 1639 ionic_set_rx_mode(lif, rx_mode); 1640 } 1641 1642 IONIC_PRINT(DEBUG, "Starting %u RX queues and %u TX queues " 1643 "on port %u", 1644 lif->nrxqcqs, lif->ntxqcqs, lif->port_id); 1645 1646 for (i = 0; i < lif->nrxqcqs; i++) { 1647 struct ionic_qcq *rxq = lif->rxqcqs[i]; 1648 if (!(rxq->flags & IONIC_QCQ_F_DEFERRED)) { 1649 err = ionic_dev_rx_queue_start(lif->eth_dev, i); 1650 1651 if (err) 1652 return err; 1653 } 1654 } 1655 1656 for (i = 0; i < lif->ntxqcqs; i++) { 1657 struct ionic_qcq *txq = lif->txqcqs[i]; 1658 if (!(txq->flags & IONIC_QCQ_F_DEFERRED)) { 1659 err = ionic_dev_tx_queue_start(lif->eth_dev, i); 1660 1661 if (err) 1662 return err; 1663 } 1664 } 1665 1666 /* Carrier ON here */ 1667 lif->state |= IONIC_LIF_F_UP; 1668 1669 ionic_link_status_check(lif); 1670 1671 return 0; 1672 } 1673 1674 int 1675 ionic_lif_identify(struct ionic_adapter *adapter) 1676 { 1677 struct ionic_dev *idev = &adapter->idev; 1678 struct ionic_identity *ident = &adapter->ident; 1679 int err; 1680 unsigned int i; 1681 unsigned int lif_words = sizeof(ident->lif.words) / 1682 sizeof(ident->lif.words[0]); 1683 unsigned int cmd_words = sizeof(idev->dev_cmd->data) / 1684 sizeof(idev->dev_cmd->data[0]); 1685 unsigned int nwords; 1686 1687 ionic_dev_cmd_lif_identify(idev, IONIC_LIF_TYPE_CLASSIC, 1688 IONIC_IDENTITY_VERSION_1); 1689 err = ionic_dev_cmd_wait_check(idev, IONIC_DEVCMD_TIMEOUT); 1690 if (err) 1691 return (err); 1692 1693 nwords = RTE_MIN(lif_words, cmd_words); 1694 for (i = 0; i < nwords; i++) 1695 ident->lif.words[i] = ioread32(&idev->dev_cmd->data[i]); 1696 1697 IONIC_PRINT(INFO, "capabilities 0x%" PRIx64 " ", 1698 ident->lif.capabilities); 1699 1700 IONIC_PRINT(INFO, "eth.max_ucast_filters 0x%" PRIx32 " ", 1701 ident->lif.eth.max_ucast_filters); 1702 IONIC_PRINT(INFO, "eth.max_mcast_filters 0x%" PRIx32 " ", 1703 ident->lif.eth.max_mcast_filters); 1704 1705 IONIC_PRINT(INFO, "eth.features 0x%" PRIx64 " ", 1706 ident->lif.eth.config.features); 1707 IONIC_PRINT(INFO, "eth.queue_count[IONIC_QTYPE_ADMINQ] 0x%" PRIx32 " ", 1708 ident->lif.eth.config.queue_count[IONIC_QTYPE_ADMINQ]); 1709 IONIC_PRINT(INFO, "eth.queue_count[IONIC_QTYPE_NOTIFYQ] 0x%" PRIx32 " ", 1710 ident->lif.eth.config.queue_count[IONIC_QTYPE_NOTIFYQ]); 1711 IONIC_PRINT(INFO, "eth.queue_count[IONIC_QTYPE_RXQ] 0x%" PRIx32 " ", 1712 ident->lif.eth.config.queue_count[IONIC_QTYPE_RXQ]); 1713 IONIC_PRINT(INFO, "eth.queue_count[IONIC_QTYPE_TXQ] 0x%" PRIx32 " ", 1714 ident->lif.eth.config.queue_count[IONIC_QTYPE_TXQ]); 1715 1716 return 0; 1717 } 1718 1719 int 1720 ionic_lifs_size(struct ionic_adapter *adapter) 1721 { 1722 struct ionic_identity *ident = &adapter->ident; 1723 uint32_t nintrs, dev_nintrs = ident->dev.nintrs; 1724 1725 adapter->max_ntxqs_per_lif = 1726 ident->lif.eth.config.queue_count[IONIC_QTYPE_TXQ]; 1727 adapter->max_nrxqs_per_lif = 1728 ident->lif.eth.config.queue_count[IONIC_QTYPE_RXQ]; 1729 1730 nintrs = 1 /* notifyq */; 1731 1732 if (nintrs > dev_nintrs) { 1733 IONIC_PRINT(ERR, 1734 "At most %d intr supported, minimum req'd is %u", 1735 dev_nintrs, nintrs); 1736 return -ENOSPC; 1737 } 1738 1739 adapter->nintrs = nintrs; 1740 1741 return 0; 1742 } 1743