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