1 /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
2 * Copyright(c) 2018-2019 Pensando Systems, Inc. All rights reserved.
5 #include <rte_malloc.h>
6 #include <ethdev_driver.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"
15 /* queuetype support level */
16 static const uint8_t ionic_qtype_vers[IONIC_QTYPE_MAX] = {
17 [IONIC_QTYPE_ADMINQ] = 0, /* 0 = Base version with CQ support */
18 [IONIC_QTYPE_NOTIFYQ] = 0, /* 0 = Base version */
19 [IONIC_QTYPE_RXQ] = 2, /* 0 = Base version with CQ+SG support
23 [IONIC_QTYPE_TXQ] = 3, /* 0 = Base version with CQ+SG support
24 * 1 = ... with Tx SG version 1
30 static int ionic_lif_addr_add(struct ionic_lif *lif, const uint8_t *addr);
31 static int ionic_lif_addr_del(struct ionic_lif *lif, const uint8_t *addr);
34 ionic_qcq_enable(struct ionic_qcq *qcq)
36 struct ionic_queue *q = &qcq->q;
37 struct ionic_lif *lif = qcq->lif;
38 struct ionic_admin_ctx ctx = {
41 .opcode = IONIC_CMD_Q_CONTROL,
43 .index = rte_cpu_to_le_32(q->index),
44 .oper = IONIC_Q_ENABLE,
48 return ionic_adminq_post_wait(lif, &ctx);
52 ionic_qcq_disable(struct ionic_qcq *qcq)
54 struct ionic_queue *q = &qcq->q;
55 struct ionic_lif *lif = qcq->lif;
56 struct ionic_admin_ctx ctx = {
59 .opcode = IONIC_CMD_Q_CONTROL,
61 .index = rte_cpu_to_le_32(q->index),
62 .oper = IONIC_Q_DISABLE,
66 return ionic_adminq_post_wait(lif, &ctx);
70 ionic_lif_stop(struct ionic_lif *lif)
76 lif->state &= ~IONIC_LIF_F_UP;
78 for (i = 0; i < lif->nrxqcqs; i++) {
79 struct ionic_rx_qcq *rxq = lif->rxqcqs[i];
80 if (rxq->flags & IONIC_QCQ_F_INITED)
81 (void)ionic_dev_rx_queue_stop(lif->eth_dev, i);
84 for (i = 0; i < lif->ntxqcqs; i++) {
85 struct ionic_tx_qcq *txq = lif->txqcqs[i];
86 if (txq->flags & IONIC_QCQ_F_INITED)
87 (void)ionic_dev_tx_queue_stop(lif->eth_dev, i);
92 ionic_lif_reset(struct ionic_lif *lif)
94 struct ionic_dev *idev = &lif->adapter->idev;
99 ionic_dev_cmd_lif_reset(idev);
100 err = ionic_dev_cmd_wait_check(idev, IONIC_DEVCMD_TIMEOUT);
102 IONIC_PRINT(WARNING, "Failed to reset %s", lif->name);
106 ionic_lif_get_abs_stats(const struct ionic_lif *lif, struct rte_eth_stats *stats)
108 struct ionic_lif_stats *ls = &lif->info->stats;
110 uint32_t num_rx_q_counters = RTE_MIN(lif->nrxqcqs, (uint32_t)
111 RTE_ETHDEV_QUEUE_STAT_CNTRS);
112 uint32_t num_tx_q_counters = RTE_MIN(lif->ntxqcqs, (uint32_t)
113 RTE_ETHDEV_QUEUE_STAT_CNTRS);
115 memset(stats, 0, sizeof(*stats));
118 IONIC_PRINT(DEBUG, "Stats on port %u not yet initialized",
125 stats->ipackets = ls->rx_ucast_packets +
126 ls->rx_mcast_packets +
127 ls->rx_bcast_packets;
129 stats->ibytes = ls->rx_ucast_bytes +
133 for (i = 0; i < lif->nrxqcqs; i++) {
134 struct ionic_rx_stats *rx_stats = &lif->rxqcqs[i]->stats;
136 rx_stats->no_cb_arg +
137 rx_stats->bad_cq_status +
143 ls->rx_ucast_drop_packets +
144 ls->rx_mcast_drop_packets +
145 ls->rx_bcast_drop_packets;
150 ls->rx_queue_disabled +
151 ls->rx_desc_fetch_error +
152 ls->rx_desc_data_error;
154 for (i = 0; i < num_rx_q_counters; i++) {
155 struct ionic_rx_stats *rx_stats = &lif->rxqcqs[i]->stats;
156 stats->q_ipackets[i] = rx_stats->packets;
157 stats->q_ibytes[i] = rx_stats->bytes;
159 rx_stats->no_cb_arg +
160 rx_stats->bad_cq_status +
167 stats->opackets = ls->tx_ucast_packets +
168 ls->tx_mcast_packets +
169 ls->tx_bcast_packets;
171 stats->obytes = ls->tx_ucast_bytes +
175 for (i = 0; i < lif->ntxqcqs; i++) {
176 struct ionic_tx_stats *tx_stats = &lif->txqcqs[i]->stats;
177 stats->oerrors += tx_stats->drop;
181 ls->tx_ucast_drop_packets +
182 ls->tx_mcast_drop_packets +
183 ls->tx_bcast_drop_packets;
187 ls->tx_queue_disabled +
188 ls->tx_desc_fetch_error +
189 ls->tx_desc_data_error;
191 for (i = 0; i < num_tx_q_counters; i++) {
192 struct ionic_tx_stats *tx_stats = &lif->txqcqs[i]->stats;
193 stats->q_opackets[i] = tx_stats->packets;
194 stats->q_obytes[i] = tx_stats->bytes;
199 ionic_lif_get_stats(const struct ionic_lif *lif,
200 struct rte_eth_stats *stats)
202 ionic_lif_get_abs_stats(lif, stats);
204 stats->ipackets -= lif->stats_base.ipackets;
205 stats->opackets -= lif->stats_base.opackets;
206 stats->ibytes -= lif->stats_base.ibytes;
207 stats->obytes -= lif->stats_base.obytes;
208 stats->imissed -= lif->stats_base.imissed;
209 stats->ierrors -= lif->stats_base.ierrors;
210 stats->oerrors -= lif->stats_base.oerrors;
211 stats->rx_nombuf -= lif->stats_base.rx_nombuf;
215 ionic_lif_reset_stats(struct ionic_lif *lif)
219 for (i = 0; i < lif->nrxqcqs; i++) {
220 memset(&lif->rxqcqs[i]->stats, 0,
221 sizeof(struct ionic_rx_stats));
222 memset(&lif->txqcqs[i]->stats, 0,
223 sizeof(struct ionic_tx_stats));
226 ionic_lif_get_abs_stats(lif, &lif->stats_base);
230 ionic_lif_get_hw_stats(struct ionic_lif *lif, struct ionic_lif_stats *stats)
232 uint16_t i, count = sizeof(struct ionic_lif_stats) / sizeof(uint64_t);
233 uint64_t *stats64 = (uint64_t *)stats;
234 uint64_t *lif_stats64 = (uint64_t *)&lif->info->stats;
235 uint64_t *lif_stats64_base = (uint64_t *)&lif->lif_stats_base;
237 for (i = 0; i < count; i++)
238 stats64[i] = lif_stats64[i] - lif_stats64_base[i];
242 ionic_lif_reset_hw_stats(struct ionic_lif *lif)
244 uint16_t i, count = sizeof(struct ionic_lif_stats) / sizeof(uint64_t);
245 uint64_t *lif_stats64 = (uint64_t *)&lif->info->stats;
246 uint64_t *lif_stats64_base = (uint64_t *)&lif->lif_stats_base;
248 for (i = 0; i < count; i++)
249 lif_stats64_base[i] = lif_stats64[i];
253 ionic_lif_addr_add(struct ionic_lif *lif, const uint8_t *addr)
255 struct ionic_admin_ctx ctx = {
256 .pending_work = true,
257 .cmd.rx_filter_add = {
258 .opcode = IONIC_CMD_RX_FILTER_ADD,
259 .match = rte_cpu_to_le_16(IONIC_RX_FILTER_MATCH_MAC),
264 memcpy(ctx.cmd.rx_filter_add.mac.addr, addr, RTE_ETHER_ADDR_LEN);
266 err = ionic_adminq_post_wait(lif, &ctx);
270 IONIC_PRINT(INFO, "rx_filter add (id %d)",
271 rte_le_to_cpu_32(ctx.comp.rx_filter_add.filter_id));
273 return ionic_rx_filter_save(lif, 0, IONIC_RXQ_INDEX_ANY, &ctx);
277 ionic_lif_addr_del(struct ionic_lif *lif, const uint8_t *addr)
279 struct ionic_admin_ctx ctx = {
280 .pending_work = true,
281 .cmd.rx_filter_del = {
282 .opcode = IONIC_CMD_RX_FILTER_DEL,
285 struct ionic_rx_filter *f;
290 rte_spinlock_lock(&lif->rx_filters.lock);
292 f = ionic_rx_filter_by_addr(lif, addr);
294 rte_spinlock_unlock(&lif->rx_filters.lock);
298 ctx.cmd.rx_filter_del.filter_id = rte_cpu_to_le_32(f->filter_id);
299 ionic_rx_filter_free(f);
301 rte_spinlock_unlock(&lif->rx_filters.lock);
303 err = ionic_adminq_post_wait(lif, &ctx);
307 IONIC_PRINT(INFO, "rx_filter del (id %d)",
308 rte_le_to_cpu_32(ctx.cmd.rx_filter_del.filter_id));
314 ionic_dev_add_mac(struct rte_eth_dev *eth_dev,
315 struct rte_ether_addr *mac_addr,
316 uint32_t index __rte_unused, uint32_t pool __rte_unused)
318 struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev);
322 return ionic_lif_addr_add(lif, (const uint8_t *)mac_addr);
326 ionic_dev_remove_mac(struct rte_eth_dev *eth_dev, uint32_t index)
328 struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev);
329 struct ionic_adapter *adapter = lif->adapter;
330 struct rte_ether_addr *mac_addr;
334 if (index >= adapter->max_mac_addrs) {
336 "Index %u is above MAC filter limit %u",
337 index, adapter->max_mac_addrs);
341 mac_addr = ð_dev->data->mac_addrs[index];
343 if (!rte_is_valid_assigned_ether_addr(mac_addr))
346 ionic_lif_addr_del(lif, (const uint8_t *)mac_addr);
350 ionic_dev_set_mac(struct rte_eth_dev *eth_dev, struct rte_ether_addr *mac_addr)
352 struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev);
356 if (mac_addr == NULL) {
357 IONIC_PRINT(NOTICE, "New mac is null");
361 if (!rte_is_zero_ether_addr((struct rte_ether_addr *)lif->mac_addr)) {
362 IONIC_PRINT(INFO, "Deleting mac addr %pM",
364 ionic_lif_addr_del(lif, lif->mac_addr);
365 memset(lif->mac_addr, 0, RTE_ETHER_ADDR_LEN);
368 IONIC_PRINT(INFO, "Updating mac addr");
370 rte_ether_addr_copy(mac_addr, (struct rte_ether_addr *)lif->mac_addr);
372 return ionic_lif_addr_add(lif, (const uint8_t *)mac_addr);
376 ionic_vlan_rx_add_vid(struct ionic_lif *lif, uint16_t vid)
378 struct ionic_admin_ctx ctx = {
379 .pending_work = true,
380 .cmd.rx_filter_add = {
381 .opcode = IONIC_CMD_RX_FILTER_ADD,
382 .match = rte_cpu_to_le_16(IONIC_RX_FILTER_MATCH_VLAN),
383 .vlan.vlan = rte_cpu_to_le_16(vid),
388 err = ionic_adminq_post_wait(lif, &ctx);
392 IONIC_PRINT(INFO, "rx_filter add VLAN %d (id %d)", vid,
393 rte_le_to_cpu_32(ctx.comp.rx_filter_add.filter_id));
395 return ionic_rx_filter_save(lif, 0, IONIC_RXQ_INDEX_ANY, &ctx);
399 ionic_vlan_rx_kill_vid(struct ionic_lif *lif, uint16_t vid)
401 struct ionic_admin_ctx ctx = {
402 .pending_work = true,
403 .cmd.rx_filter_del = {
404 .opcode = IONIC_CMD_RX_FILTER_DEL,
407 struct ionic_rx_filter *f;
412 rte_spinlock_lock(&lif->rx_filters.lock);
414 f = ionic_rx_filter_by_vlan(lif, vid);
416 rte_spinlock_unlock(&lif->rx_filters.lock);
420 ctx.cmd.rx_filter_del.filter_id = rte_cpu_to_le_32(f->filter_id);
421 ionic_rx_filter_free(f);
422 rte_spinlock_unlock(&lif->rx_filters.lock);
424 err = ionic_adminq_post_wait(lif, &ctx);
428 IONIC_PRINT(INFO, "rx_filter del VLAN %d (id %d)", vid,
429 rte_le_to_cpu_32(ctx.cmd.rx_filter_del.filter_id));
435 ionic_dev_vlan_filter_set(struct rte_eth_dev *eth_dev, uint16_t vlan_id,
438 struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev);
442 err = ionic_vlan_rx_add_vid(lif, vlan_id);
444 err = ionic_vlan_rx_kill_vid(lif, vlan_id);
450 ionic_lif_rx_mode(struct ionic_lif *lif, uint32_t rx_mode)
452 struct ionic_admin_ctx ctx = {
453 .pending_work = true,
455 .opcode = IONIC_CMD_RX_MODE_SET,
456 .rx_mode = rte_cpu_to_le_16(rx_mode),
461 if (rx_mode & IONIC_RX_MODE_F_UNICAST)
462 IONIC_PRINT(DEBUG, "rx_mode IONIC_RX_MODE_F_UNICAST");
463 if (rx_mode & IONIC_RX_MODE_F_MULTICAST)
464 IONIC_PRINT(DEBUG, "rx_mode IONIC_RX_MODE_F_MULTICAST");
465 if (rx_mode & IONIC_RX_MODE_F_BROADCAST)
466 IONIC_PRINT(DEBUG, "rx_mode IONIC_RX_MODE_F_BROADCAST");
467 if (rx_mode & IONIC_RX_MODE_F_PROMISC)
468 IONIC_PRINT(DEBUG, "rx_mode IONIC_RX_MODE_F_PROMISC");
469 if (rx_mode & IONIC_RX_MODE_F_ALLMULTI)
470 IONIC_PRINT(DEBUG, "rx_mode IONIC_RX_MODE_F_ALLMULTI");
472 err = ionic_adminq_post_wait(lif, &ctx);
474 IONIC_PRINT(ERR, "Failure setting RX mode");
478 ionic_set_rx_mode(struct ionic_lif *lif, uint32_t rx_mode)
480 if (lif->rx_mode != rx_mode) {
481 lif->rx_mode = rx_mode;
482 ionic_lif_rx_mode(lif, rx_mode);
487 ionic_dev_promiscuous_enable(struct rte_eth_dev *eth_dev)
489 struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev);
490 uint32_t rx_mode = lif->rx_mode;
494 rx_mode |= IONIC_RX_MODE_F_PROMISC;
496 ionic_set_rx_mode(lif, rx_mode);
502 ionic_dev_promiscuous_disable(struct rte_eth_dev *eth_dev)
504 struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev);
505 uint32_t rx_mode = lif->rx_mode;
507 rx_mode &= ~IONIC_RX_MODE_F_PROMISC;
509 ionic_set_rx_mode(lif, rx_mode);
515 ionic_dev_allmulticast_enable(struct rte_eth_dev *eth_dev)
517 struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev);
518 uint32_t rx_mode = lif->rx_mode;
520 rx_mode |= IONIC_RX_MODE_F_ALLMULTI;
522 ionic_set_rx_mode(lif, rx_mode);
528 ionic_dev_allmulticast_disable(struct rte_eth_dev *eth_dev)
530 struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev);
531 uint32_t rx_mode = lif->rx_mode;
533 rx_mode &= ~IONIC_RX_MODE_F_ALLMULTI;
535 ionic_set_rx_mode(lif, rx_mode);
541 ionic_lif_change_mtu(struct ionic_lif *lif, int new_mtu)
543 struct ionic_admin_ctx ctx = {
544 .pending_work = true,
546 .opcode = IONIC_CMD_LIF_SETATTR,
547 .attr = IONIC_LIF_ATTR_MTU,
548 .mtu = rte_cpu_to_le_32(new_mtu),
553 err = ionic_adminq_post_wait(lif, &ctx);
561 ionic_intr_alloc(struct ionic_lif *lif, struct ionic_intr_info *intr)
563 struct ionic_adapter *adapter = lif->adapter;
564 struct ionic_dev *idev = &adapter->idev;
568 * Note: interrupt handler is called for index = 0 only
569 * (we use interrupts for the notifyq only anyway,
570 * which has index = 0)
573 for (index = 0; index < adapter->nintrs; index++)
574 if (!adapter->intrs[index])
577 if (index == adapter->nintrs)
580 adapter->intrs[index] = true;
582 ionic_intr_init(idev, intr, index);
588 ionic_qcq_alloc(struct ionic_lif *lif,
593 const char *type_name,
597 uint16_t cq_desc_size,
598 uint16_t sg_desc_size,
599 struct ionic_qcq **qcq)
601 struct ionic_qcq *new;
602 uint32_t q_size, cq_size, sg_size, total_size;
603 void *q_base, *cq_base, *sg_base;
604 rte_iova_t q_base_pa = 0;
605 rte_iova_t cq_base_pa = 0;
606 rte_iova_t sg_base_pa = 0;
611 q_size = num_descs * desc_size;
612 cq_size = num_descs * cq_desc_size;
613 sg_size = num_descs * sg_desc_size;
615 total_size = RTE_ALIGN(q_size, PAGE_SIZE) +
616 RTE_ALIGN(cq_size, PAGE_SIZE);
618 * Note: aligning q_size/cq_size is not enough due to cq_base address
619 * aligning as q_base could be not aligned to the page.
622 total_size += PAGE_SIZE;
624 if (flags & IONIC_QCQ_F_SG) {
625 total_size += RTE_ALIGN(sg_size, PAGE_SIZE);
626 total_size += PAGE_SIZE;
629 new = rte_zmalloc("ionic", struct_size, 0);
631 IONIC_PRINT(ERR, "Cannot allocate queue structure");
637 new->q.info = rte_calloc_socket("ionic",
638 num_descs, sizeof(void *),
639 PAGE_SIZE, socket_id);
641 IONIC_PRINT(ERR, "Cannot allocate queue info");
643 goto err_out_free_qcq;
648 err = ionic_q_init(&new->q, index, num_descs);
650 IONIC_PRINT(ERR, "Queue initialization failed");
651 goto err_out_free_info;
654 err = ionic_cq_init(&new->cq, num_descs);
656 IONIC_PRINT(ERR, "Completion queue initialization failed");
657 goto err_out_free_info;
660 new->base_z = rte_eth_dma_zone_reserve(lif->eth_dev,
661 type_name, index /* queue_idx */,
662 total_size, IONIC_ALIGN, socket_id);
665 IONIC_PRINT(ERR, "Cannot reserve queue DMA memory");
667 goto err_out_free_info;
670 new->base = new->base_z->addr;
671 new->base_pa = new->base_z->iova;
674 q_base_pa = new->base_pa;
676 cq_base = (void *)RTE_ALIGN((uintptr_t)q_base + q_size, PAGE_SIZE);
677 cq_base_pa = RTE_ALIGN(q_base_pa + q_size, PAGE_SIZE);
679 if (flags & IONIC_QCQ_F_SG) {
680 sg_base = (void *)RTE_ALIGN((uintptr_t)cq_base + cq_size,
682 sg_base_pa = RTE_ALIGN(cq_base_pa + cq_size, PAGE_SIZE);
683 ionic_q_sg_map(&new->q, sg_base, sg_base_pa);
686 IONIC_PRINT(DEBUG, "Q-Base-PA = %#jx CQ-Base-PA = %#jx "
688 q_base_pa, cq_base_pa, sg_base_pa);
690 ionic_q_map(&new->q, q_base, q_base_pa);
691 ionic_cq_map(&new->cq, cq_base, cq_base_pa);
698 rte_free(new->q.info);
706 ionic_qcq_free(struct ionic_qcq *qcq)
711 rte_memzone_free(qcq->base_z);
716 rte_free(qcq->q.info);
724 ionic_rx_qcq_alloc(struct ionic_lif *lif, uint32_t socket_id, uint32_t index,
725 uint16_t nrxq_descs, struct ionic_rx_qcq **rxq_out)
727 struct ionic_rx_qcq *rxq;
731 flags = IONIC_QCQ_F_SG;
732 err = ionic_qcq_alloc(lif,
734 sizeof(struct ionic_rx_qcq),
740 sizeof(struct ionic_rxq_desc),
741 sizeof(struct ionic_rxq_comp),
742 sizeof(struct ionic_rxq_sg_desc),
743 (struct ionic_qcq **)&rxq);
749 lif->rxqcqs[index] = rxq;
756 ionic_tx_qcq_alloc(struct ionic_lif *lif, uint32_t socket_id, uint32_t index,
757 uint16_t ntxq_descs, struct ionic_tx_qcq **txq_out)
759 struct ionic_tx_qcq *txq;
763 flags = IONIC_QCQ_F_SG;
764 err = ionic_qcq_alloc(lif,
766 sizeof(struct ionic_tx_qcq),
772 sizeof(struct ionic_txq_desc),
773 sizeof(struct ionic_txq_comp),
774 sizeof(struct ionic_txq_sg_desc_v1),
775 (struct ionic_qcq **)&txq);
781 lif->txqcqs[index] = txq;
788 ionic_admin_qcq_alloc(struct ionic_lif *lif)
793 err = ionic_qcq_alloc(lif,
795 sizeof(struct ionic_admin_qcq),
801 sizeof(struct ionic_admin_cmd),
802 sizeof(struct ionic_admin_comp),
804 (struct ionic_qcq **)&lif->adminqcq);
812 ionic_notify_qcq_alloc(struct ionic_lif *lif)
814 struct ionic_notify_qcq *nqcq;
815 struct ionic_dev *idev = &lif->adapter->idev;
819 err = ionic_qcq_alloc(lif,
821 sizeof(struct ionic_notify_qcq),
826 IONIC_NOTIFYQ_LENGTH,
827 sizeof(struct ionic_notifyq_cmd),
828 sizeof(union ionic_notifyq_comp),
830 (struct ionic_qcq **)&nqcq);
834 err = ionic_intr_alloc(lif, &nqcq->intr);
836 ionic_qcq_free(&nqcq->qcq);
840 ionic_intr_mask_assert(idev->intr_ctrl, nqcq->intr.index,
841 IONIC_INTR_MASK_SET);
843 lif->notifyqcq = nqcq;
849 ionic_bus_map_dbpage(struct ionic_adapter *adapter, int page_num)
851 char *vaddr = adapter->bars[IONIC_PCI_BAR_DBELL].vaddr;
853 if (adapter->num_bars <= IONIC_PCI_BAR_DBELL)
856 return (void *)&vaddr[page_num << PAGE_SHIFT];
860 ionic_lif_queue_identify(struct ionic_lif *lif)
862 struct ionic_adapter *adapter = lif->adapter;
863 struct ionic_dev *idev = &adapter->idev;
864 union ionic_q_identity *q_ident = &adapter->ident.txq;
865 uint32_t q_words = RTE_DIM(q_ident->words);
866 uint32_t cmd_words = RTE_DIM(idev->dev_cmd->data);
867 uint32_t i, nwords, qtype;
870 for (qtype = 0; qtype < RTE_DIM(ionic_qtype_vers); qtype++) {
871 struct ionic_qtype_info *qti = &lif->qtype_info[qtype];
873 /* Filter out the types this driver knows about */
875 case IONIC_QTYPE_ADMINQ:
876 case IONIC_QTYPE_NOTIFYQ:
877 case IONIC_QTYPE_RXQ:
878 case IONIC_QTYPE_TXQ:
884 memset(qti, 0, sizeof(*qti));
886 ionic_dev_cmd_queue_identify(idev, IONIC_LIF_TYPE_CLASSIC,
887 qtype, ionic_qtype_vers[qtype]);
888 err = ionic_dev_cmd_wait_check(idev, IONIC_DEVCMD_TIMEOUT);
889 if (err == -EINVAL) {
890 IONIC_PRINT(ERR, "qtype %d not supported\n", qtype);
892 } else if (err == -EIO) {
893 IONIC_PRINT(ERR, "q_ident failed, older FW\n");
896 IONIC_PRINT(ERR, "q_ident failed, qtype %d: %d\n",
901 nwords = RTE_MIN(q_words, cmd_words);
902 for (i = 0; i < nwords; i++)
903 q_ident->words[i] = ioread32(&idev->dev_cmd->data[i]);
905 qti->version = q_ident->version;
906 qti->supported = q_ident->supported;
907 qti->features = rte_le_to_cpu_64(q_ident->features);
908 qti->desc_sz = rte_le_to_cpu_16(q_ident->desc_sz);
909 qti->comp_sz = rte_le_to_cpu_16(q_ident->comp_sz);
910 qti->sg_desc_sz = rte_le_to_cpu_16(q_ident->sg_desc_sz);
911 qti->max_sg_elems = rte_le_to_cpu_16(q_ident->max_sg_elems);
912 qti->sg_desc_stride =
913 rte_le_to_cpu_16(q_ident->sg_desc_stride);
915 IONIC_PRINT(DEBUG, " qtype[%d].version = %d",
916 qtype, qti->version);
917 IONIC_PRINT(DEBUG, " qtype[%d].supported = %#x",
918 qtype, qti->supported);
919 IONIC_PRINT(DEBUG, " qtype[%d].features = %#jx",
920 qtype, qti->features);
921 IONIC_PRINT(DEBUG, " qtype[%d].desc_sz = %d",
922 qtype, qti->desc_sz);
923 IONIC_PRINT(DEBUG, " qtype[%d].comp_sz = %d",
924 qtype, qti->comp_sz);
925 IONIC_PRINT(DEBUG, " qtype[%d].sg_desc_sz = %d",
926 qtype, qti->sg_desc_sz);
927 IONIC_PRINT(DEBUG, " qtype[%d].max_sg_elems = %d",
928 qtype, qti->max_sg_elems);
929 IONIC_PRINT(DEBUG, " qtype[%d].sg_desc_stride = %d",
930 qtype, qti->sg_desc_stride);
935 ionic_lif_alloc(struct ionic_lif *lif)
937 struct ionic_adapter *adapter = lif->adapter;
938 uint32_t socket_id = rte_socket_id();
942 * lif->name was zeroed on allocation.
943 * Copy (sizeof() - 1) bytes to ensure that it is NULL terminated.
945 memcpy(lif->name, lif->eth_dev->data->name, sizeof(lif->name) - 1);
947 IONIC_PRINT(DEBUG, "LIF: %s", lif->name);
949 ionic_lif_queue_identify(lif);
951 if (lif->qtype_info[IONIC_QTYPE_TXQ].version < 1) {
952 IONIC_PRINT(ERR, "FW too old, please upgrade");
956 IONIC_PRINT(DEBUG, "Allocating Lif Info");
958 rte_spinlock_init(&lif->adminq_lock);
959 rte_spinlock_init(&lif->adminq_service_lock);
961 lif->kern_dbpage = ionic_bus_map_dbpage(adapter, 0);
962 if (!lif->kern_dbpage) {
963 IONIC_PRINT(ERR, "Cannot map dbpage, aborting");
967 lif->txqcqs = rte_zmalloc("ionic", sizeof(*lif->txqcqs) *
968 adapter->max_ntxqs_per_lif, 0);
971 IONIC_PRINT(ERR, "Cannot allocate tx queues array");
975 lif->rxqcqs = rte_zmalloc("ionic", sizeof(*lif->rxqcqs) *
976 adapter->max_nrxqs_per_lif, 0);
979 IONIC_PRINT(ERR, "Cannot allocate rx queues array");
983 IONIC_PRINT(DEBUG, "Allocating Notify Queue");
985 err = ionic_notify_qcq_alloc(lif);
987 IONIC_PRINT(ERR, "Cannot allocate notify queue");
991 IONIC_PRINT(DEBUG, "Allocating Admin Queue");
993 err = ionic_admin_qcq_alloc(lif);
995 IONIC_PRINT(ERR, "Cannot allocate admin queue");
999 IONIC_PRINT(DEBUG, "Allocating Lif Info");
1001 lif->info_sz = RTE_ALIGN(sizeof(*lif->info), PAGE_SIZE);
1003 lif->info_z = rte_eth_dma_zone_reserve(lif->eth_dev,
1004 "lif_info", 0 /* queue_idx*/,
1005 lif->info_sz, IONIC_ALIGN, socket_id);
1007 IONIC_PRINT(ERR, "Cannot allocate lif info memory");
1011 lif->info = lif->info_z->addr;
1012 lif->info_pa = lif->info_z->iova;
1018 ionic_lif_free(struct ionic_lif *lif)
1020 if (lif->notifyqcq) {
1021 ionic_qcq_free(&lif->notifyqcq->qcq);
1022 lif->notifyqcq = NULL;
1025 if (lif->adminqcq) {
1026 ionic_qcq_free(&lif->adminqcq->qcq);
1027 lif->adminqcq = NULL;
1031 rte_free(lif->txqcqs);
1036 rte_free(lif->rxqcqs);
1041 rte_memzone_free(lif->info_z);
1047 ionic_lif_free_queues(struct ionic_lif *lif)
1051 for (i = 0; i < lif->ntxqcqs; i++) {
1052 ionic_dev_tx_queue_release(lif->eth_dev->data->tx_queues[i]);
1053 lif->eth_dev->data->tx_queues[i] = NULL;
1055 for (i = 0; i < lif->nrxqcqs; i++) {
1056 ionic_dev_rx_queue_release(lif->eth_dev->data->rx_queues[i]);
1057 lif->eth_dev->data->rx_queues[i] = NULL;
1062 ionic_lif_rss_config(struct ionic_lif *lif,
1063 const uint16_t types, const uint8_t *key, const uint32_t *indir)
1065 struct ionic_adapter *adapter = lif->adapter;
1066 struct ionic_admin_ctx ctx = {
1067 .pending_work = true,
1068 .cmd.lif_setattr = {
1069 .opcode = IONIC_CMD_LIF_SETATTR,
1070 .attr = IONIC_LIF_ATTR_RSS,
1071 .rss.types = rte_cpu_to_le_16(types),
1072 .rss.addr = rte_cpu_to_le_64(lif->rss_ind_tbl_pa),
1077 rte_le_to_cpu_16(adapter->ident.lif.eth.rss_ind_tbl_sz);
1081 lif->rss_types = types;
1084 memcpy(lif->rss_hash_key, key, IONIC_RSS_HASH_KEY_SIZE);
1087 for (i = 0; i < tbl_sz; i++)
1088 lif->rss_ind_tbl[i] = indir[i];
1090 memcpy(ctx.cmd.lif_setattr.rss.key, lif->rss_hash_key,
1091 IONIC_RSS_HASH_KEY_SIZE);
1093 return ionic_adminq_post_wait(lif, &ctx);
1097 ionic_lif_rss_setup(struct ionic_lif *lif)
1099 struct ionic_adapter *adapter = lif->adapter;
1100 static const uint8_t toeplitz_symmetric_key[] = {
1101 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A,
1102 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A,
1103 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A,
1104 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A,
1105 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A,
1109 rte_le_to_cpu_16(adapter->ident.lif.eth.rss_ind_tbl_sz);
1113 if (!lif->rss_ind_tbl_z) {
1114 lif->rss_ind_tbl_z = rte_eth_dma_zone_reserve(lif->eth_dev,
1115 "rss_ind_tbl", 0 /* queue_idx */,
1116 sizeof(*lif->rss_ind_tbl) * tbl_sz,
1117 IONIC_ALIGN, rte_socket_id());
1118 if (!lif->rss_ind_tbl_z) {
1119 IONIC_PRINT(ERR, "OOM");
1123 lif->rss_ind_tbl = lif->rss_ind_tbl_z->addr;
1124 lif->rss_ind_tbl_pa = lif->rss_ind_tbl_z->iova;
1127 if (lif->rss_ind_tbl_nrxqcqs != lif->nrxqcqs) {
1128 lif->rss_ind_tbl_nrxqcqs = lif->nrxqcqs;
1130 /* Fill indirection table with 'default' values */
1131 for (i = 0; i < tbl_sz; i++)
1132 lif->rss_ind_tbl[i] = i % lif->nrxqcqs;
1135 return ionic_lif_rss_config(lif, IONIC_RSS_OFFLOAD_ALL,
1136 toeplitz_symmetric_key, NULL);
1140 ionic_lif_rss_teardown(struct ionic_lif *lif)
1142 if (!lif->rss_ind_tbl)
1145 if (lif->rss_ind_tbl_z) {
1146 /* Disable RSS on the NIC */
1147 ionic_lif_rss_config(lif, 0x0, NULL, NULL);
1149 lif->rss_ind_tbl = NULL;
1150 lif->rss_ind_tbl_pa = 0;
1151 rte_memzone_free(lif->rss_ind_tbl_z);
1152 lif->rss_ind_tbl_z = NULL;
1157 ionic_lif_txq_deinit(struct ionic_tx_qcq *txq)
1159 txq->flags &= ~IONIC_QCQ_F_INITED;
1163 ionic_lif_rxq_deinit(struct ionic_rx_qcq *rxq)
1165 rxq->flags &= ~IONIC_QCQ_F_INITED;
1169 ionic_lif_adminq_deinit(struct ionic_lif *lif)
1171 lif->adminqcq->flags &= ~IONIC_QCQ_F_INITED;
1175 ionic_lif_notifyq_deinit(struct ionic_lif *lif)
1177 struct ionic_notify_qcq *nqcq = lif->notifyqcq;
1178 struct ionic_dev *idev = &lif->adapter->idev;
1180 if (!(nqcq->flags & IONIC_QCQ_F_INITED))
1183 ionic_intr_mask(idev->intr_ctrl, nqcq->intr.index,
1184 IONIC_INTR_MASK_SET);
1186 nqcq->flags &= ~IONIC_QCQ_F_INITED;
1189 /* This acts like ionic_napi */
1191 ionic_qcq_service(struct ionic_qcq *qcq, int budget, ionic_cq_cb cb,
1194 struct ionic_cq *cq = &qcq->cq;
1197 work_done = ionic_cq_service(cq, budget, cb, cb_arg);
1203 ionic_link_status_check(struct ionic_lif *lif)
1205 struct ionic_adapter *adapter = lif->adapter;
1208 lif->state &= ~IONIC_LIF_F_LINK_CHECK_NEEDED;
1213 link_up = (lif->info->status.link_status == IONIC_PORT_OPER_STATUS_UP);
1215 if ((link_up && adapter->link_up) ||
1216 (!link_up && !adapter->link_up))
1220 adapter->link_speed =
1221 rte_le_to_cpu_32(lif->info->status.link_speed);
1222 IONIC_PRINT(DEBUG, "Link up - %d Gbps",
1223 adapter->link_speed);
1225 IONIC_PRINT(DEBUG, "Link down");
1228 adapter->link_up = link_up;
1229 ionic_dev_link_update(lif->eth_dev, 0);
1233 ionic_lif_handle_fw_down(struct ionic_lif *lif)
1235 if (lif->state & IONIC_LIF_F_FW_RESET)
1238 lif->state |= IONIC_LIF_F_FW_RESET;
1240 if (lif->state & IONIC_LIF_F_UP) {
1242 "Surprise FW stop, stopping %s\n", lif->name);
1243 ionic_lif_stop(lif);
1246 IONIC_PRINT(NOTICE, "FW down, %s stopped", lif->name);
1250 ionic_notifyq_cb(struct ionic_cq *cq, uint16_t cq_desc_index, void *cb_arg)
1252 union ionic_notifyq_comp *cq_desc_base = cq->base;
1253 union ionic_notifyq_comp *cq_desc = &cq_desc_base[cq_desc_index];
1254 struct ionic_lif *lif = cb_arg;
1256 IONIC_PRINT(DEBUG, "Notifyq callback eid = %jd ecode = %d",
1257 cq_desc->event.eid, cq_desc->event.ecode);
1259 /* Have we run out of new completions to process? */
1260 if (!(cq_desc->event.eid > lif->last_eid))
1263 lif->last_eid = cq_desc->event.eid;
1265 switch (cq_desc->event.ecode) {
1266 case IONIC_EVENT_LINK_CHANGE:
1268 "Notifyq IONIC_EVENT_LINK_CHANGE %s "
1269 "eid=%jd link_status=%d link_speed=%d",
1272 cq_desc->link_change.link_status,
1273 cq_desc->link_change.link_speed);
1275 lif->state |= IONIC_LIF_F_LINK_CHECK_NEEDED;
1278 case IONIC_EVENT_RESET:
1280 "Notifyq IONIC_EVENT_RESET %s "
1281 "eid=%jd, reset_code=%d state=%d",
1284 cq_desc->reset.reset_code,
1285 cq_desc->reset.state);
1286 ionic_lif_handle_fw_down(lif);
1290 IONIC_PRINT(WARNING, "Notifyq bad event ecode=%d eid=%jd",
1291 cq_desc->event.ecode, cq_desc->event.eid);
1299 ionic_notifyq_handler(struct ionic_lif *lif, int budget)
1301 struct ionic_dev *idev = &lif->adapter->idev;
1302 struct ionic_notify_qcq *nqcq = lif->notifyqcq;
1305 if (!(nqcq->flags & IONIC_QCQ_F_INITED)) {
1306 IONIC_PRINT(DEBUG, "Notifyq not yet initialized");
1310 ionic_intr_mask(idev->intr_ctrl, nqcq->intr.index,
1311 IONIC_INTR_MASK_SET);
1313 work_done = ionic_qcq_service(&nqcq->qcq, budget,
1314 ionic_notifyq_cb, lif);
1316 if (lif->state & IONIC_LIF_F_LINK_CHECK_NEEDED)
1317 ionic_link_status_check(lif);
1319 ionic_intr_credits(idev->intr_ctrl, nqcq->intr.index,
1320 work_done, IONIC_INTR_CRED_RESET_COALESCE);
1322 ionic_intr_mask(idev->intr_ctrl, nqcq->intr.index,
1323 IONIC_INTR_MASK_CLEAR);
1329 ionic_lif_adminq_init(struct ionic_lif *lif)
1331 struct ionic_dev *idev = &lif->adapter->idev;
1332 struct ionic_admin_qcq *aqcq = lif->adminqcq;
1333 struct ionic_queue *q = &aqcq->qcq.q;
1334 struct ionic_q_init_comp comp;
1337 ionic_dev_cmd_adminq_init(idev, &aqcq->qcq);
1338 err = ionic_dev_cmd_wait_check(idev, IONIC_DEVCMD_TIMEOUT);
1342 ionic_dev_cmd_comp(idev, &comp);
1344 q->hw_type = comp.hw_type;
1345 q->hw_index = rte_le_to_cpu_32(comp.hw_index);
1346 q->db = ionic_db_map(lif, q);
1348 IONIC_PRINT(DEBUG, "adminq->hw_type %d", q->hw_type);
1349 IONIC_PRINT(DEBUG, "adminq->hw_index %d", q->hw_index);
1350 IONIC_PRINT(DEBUG, "adminq->db %p", q->db);
1352 aqcq->flags |= IONIC_QCQ_F_INITED;
1358 ionic_lif_notifyq_init(struct ionic_lif *lif)
1360 struct ionic_dev *idev = &lif->adapter->idev;
1361 struct ionic_notify_qcq *nqcq = lif->notifyqcq;
1362 struct ionic_queue *q = &nqcq->qcq.q;
1365 struct ionic_admin_ctx ctx = {
1366 .pending_work = true,
1368 .opcode = IONIC_CMD_Q_INIT,
1370 .ver = lif->qtype_info[q->type].version,
1371 .index = rte_cpu_to_le_32(q->index),
1372 .intr_index = rte_cpu_to_le_16(nqcq->intr.index),
1373 .flags = rte_cpu_to_le_16(IONIC_QINIT_F_IRQ |
1375 .ring_size = rte_log2_u32(q->num_descs),
1376 .ring_base = rte_cpu_to_le_64(q->base_pa),
1380 IONIC_PRINT(DEBUG, "notifyq_init.index %d", q->index);
1381 IONIC_PRINT(DEBUG, "notifyq_init.ring_base 0x%" PRIx64 "", q->base_pa);
1382 IONIC_PRINT(DEBUG, "notifyq_init.ring_size %d",
1383 ctx.cmd.q_init.ring_size);
1384 IONIC_PRINT(DEBUG, "notifyq_init.ver %u", ctx.cmd.q_init.ver);
1386 err = ionic_adminq_post_wait(lif, &ctx);
1390 q->hw_type = ctx.comp.q_init.hw_type;
1391 q->hw_index = rte_le_to_cpu_32(ctx.comp.q_init.hw_index);
1394 IONIC_PRINT(DEBUG, "notifyq->hw_type %d", q->hw_type);
1395 IONIC_PRINT(DEBUG, "notifyq->hw_index %d", q->hw_index);
1396 IONIC_PRINT(DEBUG, "notifyq->db %p", q->db);
1398 ionic_intr_mask(idev->intr_ctrl, nqcq->intr.index,
1399 IONIC_INTR_MASK_CLEAR);
1401 nqcq->flags |= IONIC_QCQ_F_INITED;
1407 ionic_lif_set_features(struct ionic_lif *lif)
1409 struct ionic_admin_ctx ctx = {
1410 .pending_work = true,
1411 .cmd.lif_setattr = {
1412 .opcode = IONIC_CMD_LIF_SETATTR,
1413 .attr = IONIC_LIF_ATTR_FEATURES,
1414 .features = rte_cpu_to_le_64(lif->features),
1419 err = ionic_adminq_post_wait(lif, &ctx);
1423 lif->hw_features = rte_le_to_cpu_64(ctx.cmd.lif_setattr.features &
1424 ctx.comp.lif_setattr.features);
1426 if (lif->hw_features & IONIC_ETH_HW_VLAN_TX_TAG)
1427 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_VLAN_TX_TAG");
1428 if (lif->hw_features & IONIC_ETH_HW_VLAN_RX_STRIP)
1429 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_VLAN_RX_STRIP");
1430 if (lif->hw_features & IONIC_ETH_HW_VLAN_RX_FILTER)
1431 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_VLAN_RX_FILTER");
1432 if (lif->hw_features & IONIC_ETH_HW_RX_HASH)
1433 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_RX_HASH");
1434 if (lif->hw_features & IONIC_ETH_HW_TX_SG)
1435 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TX_SG");
1436 if (lif->hw_features & IONIC_ETH_HW_RX_SG)
1437 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_RX_SG");
1438 if (lif->hw_features & IONIC_ETH_HW_TX_CSUM)
1439 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TX_CSUM");
1440 if (lif->hw_features & IONIC_ETH_HW_RX_CSUM)
1441 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_RX_CSUM");
1442 if (lif->hw_features & IONIC_ETH_HW_TSO)
1443 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TSO");
1444 if (lif->hw_features & IONIC_ETH_HW_TSO_IPV6)
1445 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TSO_IPV6");
1446 if (lif->hw_features & IONIC_ETH_HW_TSO_ECN)
1447 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TSO_ECN");
1448 if (lif->hw_features & IONIC_ETH_HW_TSO_GRE)
1449 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TSO_GRE");
1450 if (lif->hw_features & IONIC_ETH_HW_TSO_GRE_CSUM)
1451 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TSO_GRE_CSUM");
1452 if (lif->hw_features & IONIC_ETH_HW_TSO_IPXIP4)
1453 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TSO_IPXIP4");
1454 if (lif->hw_features & IONIC_ETH_HW_TSO_IPXIP6)
1455 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TSO_IPXIP6");
1456 if (lif->hw_features & IONIC_ETH_HW_TSO_UDP)
1457 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TSO_UDP");
1458 if (lif->hw_features & IONIC_ETH_HW_TSO_UDP_CSUM)
1459 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TSO_UDP_CSUM");
1465 ionic_lif_txq_init(struct ionic_tx_qcq *txq)
1467 struct ionic_qcq *qcq = &txq->qcq;
1468 struct ionic_queue *q = &qcq->q;
1469 struct ionic_lif *lif = qcq->lif;
1470 struct ionic_cq *cq = &qcq->cq;
1471 struct ionic_admin_ctx ctx = {
1472 .pending_work = true,
1474 .opcode = IONIC_CMD_Q_INIT,
1476 .ver = lif->qtype_info[q->type].version,
1477 .index = rte_cpu_to_le_32(q->index),
1478 .flags = rte_cpu_to_le_16(IONIC_QINIT_F_SG |
1480 .intr_index = rte_cpu_to_le_16(IONIC_INTR_NONE),
1481 .ring_size = rte_log2_u32(q->num_descs),
1482 .ring_base = rte_cpu_to_le_64(q->base_pa),
1483 .cq_ring_base = rte_cpu_to_le_64(cq->base_pa),
1484 .sg_ring_base = rte_cpu_to_le_64(q->sg_base_pa),
1489 IONIC_PRINT(DEBUG, "txq_init.index %d", q->index);
1490 IONIC_PRINT(DEBUG, "txq_init.ring_base 0x%" PRIx64 "", q->base_pa);
1491 IONIC_PRINT(DEBUG, "txq_init.ring_size %d",
1492 ctx.cmd.q_init.ring_size);
1493 IONIC_PRINT(DEBUG, "txq_init.ver %u", ctx.cmd.q_init.ver);
1495 err = ionic_adminq_post_wait(lif, &ctx);
1499 q->hw_type = ctx.comp.q_init.hw_type;
1500 q->hw_index = rte_le_to_cpu_32(ctx.comp.q_init.hw_index);
1501 q->db = ionic_db_map(lif, q);
1503 IONIC_PRINT(DEBUG, "txq->hw_type %d", q->hw_type);
1504 IONIC_PRINT(DEBUG, "txq->hw_index %d", q->hw_index);
1505 IONIC_PRINT(DEBUG, "txq->db %p", q->db);
1507 txq->flags |= IONIC_QCQ_F_INITED;
1513 ionic_lif_rxq_init(struct ionic_rx_qcq *rxq)
1515 struct ionic_qcq *qcq = &rxq->qcq;
1516 struct ionic_queue *q = &qcq->q;
1517 struct ionic_lif *lif = qcq->lif;
1518 struct ionic_cq *cq = &qcq->cq;
1519 struct ionic_admin_ctx ctx = {
1520 .pending_work = true,
1522 .opcode = IONIC_CMD_Q_INIT,
1524 .ver = lif->qtype_info[q->type].version,
1525 .index = rte_cpu_to_le_32(q->index),
1526 .flags = rte_cpu_to_le_16(IONIC_QINIT_F_SG |
1528 .intr_index = rte_cpu_to_le_16(IONIC_INTR_NONE),
1529 .ring_size = rte_log2_u32(q->num_descs),
1530 .ring_base = rte_cpu_to_le_64(q->base_pa),
1531 .cq_ring_base = rte_cpu_to_le_64(cq->base_pa),
1532 .sg_ring_base = rte_cpu_to_le_64(q->sg_base_pa),
1537 IONIC_PRINT(DEBUG, "rxq_init.index %d", q->index);
1538 IONIC_PRINT(DEBUG, "rxq_init.ring_base 0x%" PRIx64 "", q->base_pa);
1539 IONIC_PRINT(DEBUG, "rxq_init.ring_size %d",
1540 ctx.cmd.q_init.ring_size);
1541 IONIC_PRINT(DEBUG, "rxq_init.ver %u", ctx.cmd.q_init.ver);
1543 err = ionic_adminq_post_wait(lif, &ctx);
1547 q->hw_type = ctx.comp.q_init.hw_type;
1548 q->hw_index = rte_le_to_cpu_32(ctx.comp.q_init.hw_index);
1549 q->db = ionic_db_map(lif, q);
1551 rxq->flags |= IONIC_QCQ_F_INITED;
1553 IONIC_PRINT(DEBUG, "rxq->hw_type %d", q->hw_type);
1554 IONIC_PRINT(DEBUG, "rxq->hw_index %d", q->hw_index);
1555 IONIC_PRINT(DEBUG, "rxq->db %p", q->db);
1561 ionic_station_set(struct ionic_lif *lif)
1563 struct ionic_admin_ctx ctx = {
1564 .pending_work = true,
1565 .cmd.lif_getattr = {
1566 .opcode = IONIC_CMD_LIF_GETATTR,
1567 .attr = IONIC_LIF_ATTR_MAC,
1574 err = ionic_adminq_post_wait(lif, &ctx);
1578 memcpy(lif->mac_addr, ctx.comp.lif_getattr.mac, RTE_ETHER_ADDR_LEN);
1584 ionic_lif_set_name(struct ionic_lif *lif)
1586 struct ionic_admin_ctx ctx = {
1587 .pending_work = true,
1588 .cmd.lif_setattr = {
1589 .opcode = IONIC_CMD_LIF_SETATTR,
1590 .attr = IONIC_LIF_ATTR_NAME,
1594 memcpy(ctx.cmd.lif_setattr.name, lif->name,
1595 sizeof(ctx.cmd.lif_setattr.name) - 1);
1597 ionic_adminq_post_wait(lif, &ctx);
1601 ionic_lif_init(struct ionic_lif *lif)
1603 struct ionic_dev *idev = &lif->adapter->idev;
1604 struct ionic_q_init_comp comp;
1607 memset(&lif->stats_base, 0, sizeof(lif->stats_base));
1609 ionic_dev_cmd_lif_init(idev, lif->info_pa);
1610 err = ionic_dev_cmd_wait_check(idev, IONIC_DEVCMD_TIMEOUT);
1611 ionic_dev_cmd_comp(idev, &comp);
1615 lif->hw_index = rte_cpu_to_le_16(comp.hw_index);
1617 err = ionic_lif_adminq_init(lif);
1621 err = ionic_lif_notifyq_init(lif);
1623 goto err_out_adminq_deinit;
1626 * Configure initial feature set
1627 * This will be updated later by the dev_configure() step
1629 lif->features = IONIC_ETH_HW_RX_HASH | IONIC_ETH_HW_VLAN_RX_FILTER;
1631 err = ionic_lif_set_features(lif);
1633 goto err_out_notifyq_deinit;
1635 err = ionic_rx_filters_init(lif);
1637 goto err_out_notifyq_deinit;
1639 err = ionic_station_set(lif);
1641 goto err_out_rx_filter_deinit;
1643 ionic_lif_set_name(lif);
1645 lif->state |= IONIC_LIF_F_INITED;
1649 err_out_rx_filter_deinit:
1650 ionic_rx_filters_deinit(lif);
1652 err_out_notifyq_deinit:
1653 ionic_lif_notifyq_deinit(lif);
1655 err_out_adminq_deinit:
1656 ionic_lif_adminq_deinit(lif);
1662 ionic_lif_deinit(struct ionic_lif *lif)
1664 if (!(lif->state & IONIC_LIF_F_INITED))
1667 ionic_rx_filters_deinit(lif);
1668 ionic_lif_rss_teardown(lif);
1669 ionic_lif_notifyq_deinit(lif);
1670 ionic_lif_adminq_deinit(lif);
1672 lif->state &= ~IONIC_LIF_F_INITED;
1676 ionic_lif_configure_vlan_offload(struct ionic_lif *lif, int mask)
1678 struct rte_eth_dev *eth_dev = lif->eth_dev;
1679 struct rte_eth_rxmode *rxmode = ð_dev->data->dev_conf.rxmode;
1682 * IONIC_ETH_HW_VLAN_RX_FILTER cannot be turned off, so
1683 * set DEV_RX_OFFLOAD_VLAN_FILTER and ignore ETH_VLAN_FILTER_MASK
1685 rxmode->offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
1687 if (mask & ETH_VLAN_STRIP_MASK) {
1688 if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_STRIP)
1689 lif->features |= IONIC_ETH_HW_VLAN_RX_STRIP;
1691 lif->features &= ~IONIC_ETH_HW_VLAN_RX_STRIP;
1696 ionic_lif_configure(struct ionic_lif *lif)
1698 struct rte_eth_rxmode *rxmode = &lif->eth_dev->data->dev_conf.rxmode;
1699 struct rte_eth_txmode *txmode = &lif->eth_dev->data->dev_conf.txmode;
1700 struct ionic_identity *ident = &lif->adapter->ident;
1701 union ionic_lif_config *cfg = &ident->lif.eth.config;
1702 uint32_t ntxqs_per_lif =
1703 rte_le_to_cpu_32(cfg->queue_count[IONIC_QTYPE_TXQ]);
1704 uint32_t nrxqs_per_lif =
1705 rte_le_to_cpu_32(cfg->queue_count[IONIC_QTYPE_RXQ]);
1706 uint32_t nrxqs = lif->eth_dev->data->nb_rx_queues;
1707 uint32_t ntxqs = lif->eth_dev->data->nb_tx_queues;
1709 lif->port_id = lif->eth_dev->data->port_id;
1711 IONIC_PRINT(DEBUG, "Configuring LIF on port %u",
1715 nrxqs_per_lif = RTE_MIN(nrxqs_per_lif, nrxqs);
1718 ntxqs_per_lif = RTE_MIN(ntxqs_per_lif, ntxqs);
1720 lif->nrxqcqs = nrxqs_per_lif;
1721 lif->ntxqcqs = ntxqs_per_lif;
1723 /* Update the LIF configuration based on the eth_dev */
1726 * NB: While it is true that RSS_HASH is always enabled on ionic,
1727 * setting this flag unconditionally causes problems in DTS.
1728 * rxmode->offloads |= DEV_RX_OFFLOAD_RSS_HASH;
1733 if (rxmode->offloads & DEV_RX_OFFLOAD_IPV4_CKSUM ||
1734 rxmode->offloads & DEV_RX_OFFLOAD_UDP_CKSUM ||
1735 rxmode->offloads & DEV_RX_OFFLOAD_TCP_CKSUM)
1736 lif->features |= IONIC_ETH_HW_RX_CSUM;
1738 lif->features &= ~IONIC_ETH_HW_RX_CSUM;
1740 if (rxmode->offloads & DEV_RX_OFFLOAD_SCATTER) {
1741 lif->features |= IONIC_ETH_HW_RX_SG;
1742 lif->eth_dev->data->scattered_rx = 1;
1744 lif->features &= ~IONIC_ETH_HW_RX_SG;
1745 lif->eth_dev->data->scattered_rx = 0;
1748 /* Covers VLAN_STRIP */
1749 ionic_lif_configure_vlan_offload(lif, ETH_VLAN_STRIP_MASK);
1753 if (txmode->offloads & DEV_TX_OFFLOAD_IPV4_CKSUM ||
1754 txmode->offloads & DEV_TX_OFFLOAD_UDP_CKSUM ||
1755 txmode->offloads & DEV_TX_OFFLOAD_TCP_CKSUM ||
1756 txmode->offloads & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM ||
1757 txmode->offloads & DEV_TX_OFFLOAD_OUTER_UDP_CKSUM)
1758 lif->features |= IONIC_ETH_HW_TX_CSUM;
1760 lif->features &= ~IONIC_ETH_HW_TX_CSUM;
1762 if (txmode->offloads & DEV_TX_OFFLOAD_VLAN_INSERT)
1763 lif->features |= IONIC_ETH_HW_VLAN_TX_TAG;
1765 lif->features &= ~IONIC_ETH_HW_VLAN_TX_TAG;
1767 if (txmode->offloads & DEV_TX_OFFLOAD_MULTI_SEGS)
1768 lif->features |= IONIC_ETH_HW_TX_SG;
1770 lif->features &= ~IONIC_ETH_HW_TX_SG;
1772 if (txmode->offloads & DEV_TX_OFFLOAD_TCP_TSO) {
1773 lif->features |= IONIC_ETH_HW_TSO;
1774 lif->features |= IONIC_ETH_HW_TSO_IPV6;
1775 lif->features |= IONIC_ETH_HW_TSO_ECN;
1777 lif->features &= ~IONIC_ETH_HW_TSO;
1778 lif->features &= ~IONIC_ETH_HW_TSO_IPV6;
1779 lif->features &= ~IONIC_ETH_HW_TSO_ECN;
1784 ionic_lif_start(struct ionic_lif *lif)
1790 err = ionic_lif_rss_setup(lif);
1794 if (!lif->rx_mode) {
1795 IONIC_PRINT(DEBUG, "Setting RX mode on %s",
1798 rx_mode = IONIC_RX_MODE_F_UNICAST;
1799 rx_mode |= IONIC_RX_MODE_F_MULTICAST;
1800 rx_mode |= IONIC_RX_MODE_F_BROADCAST;
1802 ionic_set_rx_mode(lif, rx_mode);
1805 IONIC_PRINT(DEBUG, "Starting %u RX queues and %u TX queues "
1807 lif->nrxqcqs, lif->ntxqcqs, lif->port_id);
1809 for (i = 0; i < lif->nrxqcqs; i++) {
1810 struct ionic_rx_qcq *rxq = lif->rxqcqs[i];
1811 if (!(rxq->flags & IONIC_QCQ_F_DEFERRED)) {
1812 err = ionic_dev_rx_queue_start(lif->eth_dev, i);
1819 for (i = 0; i < lif->ntxqcqs; i++) {
1820 struct ionic_tx_qcq *txq = lif->txqcqs[i];
1821 if (!(txq->flags & IONIC_QCQ_F_DEFERRED)) {
1822 err = ionic_dev_tx_queue_start(lif->eth_dev, i);
1829 /* Carrier ON here */
1830 lif->state |= IONIC_LIF_F_UP;
1832 ionic_link_status_check(lif);
1838 ionic_lif_identify(struct ionic_adapter *adapter)
1840 struct ionic_dev *idev = &adapter->idev;
1841 struct ionic_identity *ident = &adapter->ident;
1842 union ionic_lif_config *cfg = &ident->lif.eth.config;
1843 uint32_t lif_words = RTE_DIM(ident->lif.words);
1844 uint32_t cmd_words = RTE_DIM(idev->dev_cmd->data);
1848 ionic_dev_cmd_lif_identify(idev, IONIC_LIF_TYPE_CLASSIC,
1849 IONIC_IDENTITY_VERSION_1);
1850 err = ionic_dev_cmd_wait_check(idev, IONIC_DEVCMD_TIMEOUT);
1854 nwords = RTE_MIN(lif_words, cmd_words);
1855 for (i = 0; i < nwords; i++)
1856 ident->lif.words[i] = ioread32(&idev->dev_cmd->data[i]);
1858 IONIC_PRINT(INFO, "capabilities 0x%" PRIx64 " ",
1859 rte_le_to_cpu_64(ident->lif.capabilities));
1861 IONIC_PRINT(INFO, "eth.max_ucast_filters 0x%" PRIx32 " ",
1862 rte_le_to_cpu_32(ident->lif.eth.max_ucast_filters));
1863 IONIC_PRINT(INFO, "eth.max_mcast_filters 0x%" PRIx32 " ",
1864 rte_le_to_cpu_32(ident->lif.eth.max_mcast_filters));
1866 IONIC_PRINT(INFO, "eth.features 0x%" PRIx64 " ",
1867 rte_le_to_cpu_64(cfg->features));
1868 IONIC_PRINT(INFO, "eth.queue_count[IONIC_QTYPE_ADMINQ] 0x%" PRIx32 " ",
1869 rte_le_to_cpu_32(cfg->queue_count[IONIC_QTYPE_ADMINQ]));
1870 IONIC_PRINT(INFO, "eth.queue_count[IONIC_QTYPE_NOTIFYQ] 0x%" PRIx32 " ",
1871 rte_le_to_cpu_32(cfg->queue_count[IONIC_QTYPE_NOTIFYQ]));
1872 IONIC_PRINT(INFO, "eth.queue_count[IONIC_QTYPE_RXQ] 0x%" PRIx32 " ",
1873 rte_le_to_cpu_32(cfg->queue_count[IONIC_QTYPE_RXQ]));
1874 IONIC_PRINT(INFO, "eth.queue_count[IONIC_QTYPE_TXQ] 0x%" PRIx32 " ",
1875 rte_le_to_cpu_32(cfg->queue_count[IONIC_QTYPE_TXQ]));
1881 ionic_lifs_size(struct ionic_adapter *adapter)
1883 struct ionic_identity *ident = &adapter->ident;
1884 union ionic_lif_config *cfg = &ident->lif.eth.config;
1885 uint32_t nintrs, dev_nintrs = rte_le_to_cpu_32(ident->dev.nintrs);
1887 adapter->max_ntxqs_per_lif =
1888 rte_le_to_cpu_32(cfg->queue_count[IONIC_QTYPE_TXQ]);
1889 adapter->max_nrxqs_per_lif =
1890 rte_le_to_cpu_32(cfg->queue_count[IONIC_QTYPE_RXQ]);
1892 nintrs = 1 /* notifyq */;
1894 if (nintrs > dev_nintrs) {
1896 "At most %d intr supported, minimum req'd is %u",
1897 dev_nintrs, nintrs);
1901 adapter->nintrs = nintrs;