net/ionic: remove unused interrupt free function
[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 static int
588 ionic_qcq_alloc(struct ionic_lif *lif, uint8_t type,
589                 uint32_t index,
590                 const char *base, uint32_t flags,
591                 uint32_t num_descs,
592                 uint32_t desc_size,
593                 uint32_t cq_desc_size,
594                 uint32_t sg_desc_size,
595                 struct ionic_qcq **qcq)
596 {
597         struct ionic_dev *idev = &lif->adapter->idev;
598         struct ionic_qcq *new;
599         uint32_t q_size, cq_size, sg_size, total_size;
600         void *q_base, *cq_base, *sg_base;
601         rte_iova_t q_base_pa = 0;
602         rte_iova_t cq_base_pa = 0;
603         rte_iova_t sg_base_pa = 0;
604         uint32_t socket_id = rte_socket_id();
605         int err;
606
607         *qcq = NULL;
608
609         q_size  = num_descs * desc_size;
610         cq_size = num_descs * cq_desc_size;
611         sg_size = num_descs * sg_desc_size;
612
613         total_size = RTE_ALIGN(q_size, PAGE_SIZE) +
614                 RTE_ALIGN(cq_size, PAGE_SIZE);
615         /*
616          * Note: aligning q_size/cq_size is not enough due to cq_base address
617          * aligning as q_base could be not aligned to the page.
618          * Adding PAGE_SIZE.
619          */
620         total_size += PAGE_SIZE;
621
622         if (flags & IONIC_QCQ_F_SG) {
623                 total_size += RTE_ALIGN(sg_size, PAGE_SIZE);
624                 total_size += PAGE_SIZE;
625         }
626
627         new = rte_zmalloc("ionic", sizeof(*new), 0);
628         if (!new) {
629                 IONIC_PRINT(ERR, "Cannot allocate queue structure");
630                 return -ENOMEM;
631         }
632
633         new->lif = lif;
634         new->flags = flags;
635
636         new->q.info = rte_zmalloc("ionic", sizeof(*new->q.info) * num_descs, 0);
637         if (!new->q.info) {
638                 IONIC_PRINT(ERR, "Cannot allocate queue info");
639                 err = -ENOMEM;
640                 goto err_out_free_qcq;
641         }
642
643         new->q.type = type;
644
645         err = ionic_q_init(lif, idev, &new->q, index, num_descs,
646                 desc_size, sg_desc_size);
647         if (err) {
648                 IONIC_PRINT(ERR, "Queue initialization failed");
649                 goto err_out_free_info;
650         }
651
652         err = ionic_cq_init(&new->cq, num_descs);
653         if (err) {
654                 IONIC_PRINT(ERR, "Completion queue initialization failed");
655                 goto err_out_free_info;
656         }
657
658         new->base_z = rte_eth_dma_zone_reserve(lif->eth_dev,
659                 base /* name */, index /* queue_idx */,
660                 total_size, IONIC_ALIGN, socket_id);
661
662         if (!new->base_z) {
663                 IONIC_PRINT(ERR, "Cannot reserve queue DMA memory");
664                 err = -ENOMEM;
665                 goto err_out_free_info;
666         }
667
668         new->base = new->base_z->addr;
669         new->base_pa = new->base_z->iova;
670         new->total_size = total_size;
671
672         q_base = new->base;
673         q_base_pa = new->base_pa;
674
675         cq_base = (void *)RTE_ALIGN((uintptr_t)q_base + q_size, PAGE_SIZE);
676         cq_base_pa = RTE_ALIGN(q_base_pa + q_size, PAGE_SIZE);
677
678         if (flags & IONIC_QCQ_F_SG) {
679                 sg_base = (void *)RTE_ALIGN((uintptr_t)cq_base + cq_size,
680                         PAGE_SIZE);
681                 sg_base_pa = RTE_ALIGN(cq_base_pa + cq_size, PAGE_SIZE);
682                 ionic_q_sg_map(&new->q, sg_base, sg_base_pa);
683         }
684
685         IONIC_PRINT(DEBUG, "Q-Base-PA = %#jx CQ-Base-PA = %#jx "
686                 "SG-base-PA = %#jx",
687                 q_base_pa, cq_base_pa, sg_base_pa);
688
689         ionic_q_map(&new->q, q_base, q_base_pa);
690         ionic_cq_map(&new->cq, cq_base, cq_base_pa);
691
692         *qcq = new;
693
694         return 0;
695
696 err_out_free_info:
697         rte_free(new->q.info);
698 err_out_free_qcq:
699         rte_free(new);
700
701         return err;
702 }
703
704 void
705 ionic_qcq_free(struct ionic_qcq *qcq)
706 {
707         if (qcq->base_z) {
708                 qcq->base = NULL;
709                 qcq->base_pa = 0;
710                 rte_memzone_free(qcq->base_z);
711                 qcq->base_z = NULL;
712         }
713
714         if (qcq->q.info) {
715                 rte_free(qcq->q.info);
716                 qcq->q.info = NULL;
717         }
718
719         rte_free(qcq);
720 }
721
722 int
723 ionic_rx_qcq_alloc(struct ionic_lif *lif, uint32_t index, uint16_t nrxq_descs,
724                 struct ionic_qcq **qcq)
725 {
726         uint32_t flags;
727         int err = -ENOMEM;
728
729         flags = IONIC_QCQ_F_SG;
730         err = ionic_qcq_alloc(lif, IONIC_QTYPE_RXQ, index, "rx", flags,
731                 nrxq_descs,
732                 sizeof(struct ionic_rxq_desc),
733                 sizeof(struct ionic_rxq_comp),
734                 sizeof(struct ionic_rxq_sg_desc),
735                 &lif->rxqcqs[index]);
736         if (err)
737                 return err;
738
739         *qcq = lif->rxqcqs[index];
740
741         return 0;
742 }
743
744 int
745 ionic_tx_qcq_alloc(struct ionic_lif *lif, uint32_t index, uint16_t ntxq_descs,
746                 struct ionic_qcq **qcq)
747 {
748         uint32_t flags;
749         int err = -ENOMEM;
750
751         flags = IONIC_QCQ_F_SG;
752         err = ionic_qcq_alloc(lif, IONIC_QTYPE_TXQ, index, "tx", flags,
753                 ntxq_descs,
754                 sizeof(struct ionic_txq_desc),
755                 sizeof(struct ionic_txq_comp),
756                 sizeof(struct ionic_txq_sg_desc_v1),
757                 &lif->txqcqs[index]);
758         if (err)
759                 return err;
760
761         *qcq = lif->txqcqs[index];
762
763         return 0;
764 }
765
766 static int
767 ionic_admin_qcq_alloc(struct ionic_lif *lif)
768 {
769         uint32_t flags;
770         int err = -ENOMEM;
771
772         flags = 0;
773         err = ionic_qcq_alloc(lif, IONIC_QTYPE_ADMINQ, 0, "admin", flags,
774                 IONIC_ADMINQ_LENGTH,
775                 sizeof(struct ionic_admin_cmd),
776                 sizeof(struct ionic_admin_comp),
777                 0,
778                 &lif->adminqcq);
779         if (err)
780                 return err;
781
782         return 0;
783 }
784
785 static int
786 ionic_notify_qcq_alloc(struct ionic_lif *lif)
787 {
788         struct ionic_qcq *nqcq;
789         struct ionic_dev *idev = &lif->adapter->idev;
790         uint32_t flags = 0;
791         int err = -ENOMEM;
792
793         err = ionic_qcq_alloc(lif, IONIC_QTYPE_NOTIFYQ, 0, "notify",
794                 flags,
795                 IONIC_NOTIFYQ_LENGTH,
796                 sizeof(struct ionic_notifyq_cmd),
797                 sizeof(union ionic_notifyq_comp),
798                 0,
799                 &nqcq);
800         if (err)
801                 return err;
802
803         err = ionic_intr_alloc(lif, &nqcq->intr);
804         if (err) {
805                 ionic_qcq_free(nqcq);
806                 return err;
807         }
808
809         ionic_intr_mask_assert(idev->intr_ctrl, nqcq->intr.index,
810                 IONIC_INTR_MASK_SET);
811
812         lif->notifyqcq = nqcq;
813
814         return 0;
815 }
816
817 static void *
818 ionic_bus_map_dbpage(struct ionic_adapter *adapter, int page_num)
819 {
820         char *vaddr = adapter->bars[IONIC_PCI_BAR_DBELL].vaddr;
821
822         if (adapter->num_bars <= IONIC_PCI_BAR_DBELL)
823                 return NULL;
824
825         return (void *)&vaddr[page_num << PAGE_SHIFT];
826 }
827
828 static void
829 ionic_lif_queue_identify(struct ionic_lif *lif)
830 {
831         struct ionic_adapter *adapter = lif->adapter;
832         struct ionic_dev *idev = &adapter->idev;
833         union ionic_q_identity *q_ident = &adapter->ident.txq;
834         uint32_t q_words = RTE_DIM(q_ident->words);
835         uint32_t cmd_words = RTE_DIM(idev->dev_cmd->data);
836         uint32_t i, nwords, qtype;
837         int err;
838
839         for (qtype = 0; qtype < RTE_DIM(ionic_qtype_vers); qtype++) {
840                 struct ionic_qtype_info *qti = &lif->qtype_info[qtype];
841
842                 /* Filter out the types this driver knows about */
843                 switch (qtype) {
844                 case IONIC_QTYPE_ADMINQ:
845                 case IONIC_QTYPE_NOTIFYQ:
846                 case IONIC_QTYPE_RXQ:
847                 case IONIC_QTYPE_TXQ:
848                         break;
849                 default:
850                         continue;
851                 }
852
853                 memset(qti, 0, sizeof(*qti));
854
855                 ionic_dev_cmd_queue_identify(idev, IONIC_LIF_TYPE_CLASSIC,
856                         qtype, ionic_qtype_vers[qtype]);
857                 err = ionic_dev_cmd_wait_check(idev, IONIC_DEVCMD_TIMEOUT);
858                 if (err == -EINVAL) {
859                         IONIC_PRINT(ERR, "qtype %d not supported\n", qtype);
860                         continue;
861                 } else if (err == -EIO) {
862                         IONIC_PRINT(ERR, "q_ident failed, older FW\n");
863                         return;
864                 } else if (err) {
865                         IONIC_PRINT(ERR, "q_ident failed, qtype %d: %d\n",
866                                 qtype, err);
867                         return;
868                 }
869
870                 nwords = RTE_MIN(q_words, cmd_words);
871                 for (i = 0; i < nwords; i++)
872                         q_ident->words[i] = ioread32(&idev->dev_cmd->data[i]);
873
874                 qti->version   = q_ident->version;
875                 qti->supported = q_ident->supported;
876                 qti->features  = rte_le_to_cpu_64(q_ident->features);
877                 qti->desc_sz   = rte_le_to_cpu_16(q_ident->desc_sz);
878                 qti->comp_sz   = rte_le_to_cpu_16(q_ident->comp_sz);
879                 qti->sg_desc_sz   = rte_le_to_cpu_16(q_ident->sg_desc_sz);
880                 qti->max_sg_elems = rte_le_to_cpu_16(q_ident->max_sg_elems);
881                 qti->sg_desc_stride =
882                         rte_le_to_cpu_16(q_ident->sg_desc_stride);
883
884                 IONIC_PRINT(DEBUG, " qtype[%d].version = %d",
885                         qtype, qti->version);
886                 IONIC_PRINT(DEBUG, " qtype[%d].supported = %#x",
887                         qtype, qti->supported);
888                 IONIC_PRINT(DEBUG, " qtype[%d].features = %#jx",
889                         qtype, qti->features);
890                 IONIC_PRINT(DEBUG, " qtype[%d].desc_sz = %d",
891                         qtype, qti->desc_sz);
892                 IONIC_PRINT(DEBUG, " qtype[%d].comp_sz = %d",
893                         qtype, qti->comp_sz);
894                 IONIC_PRINT(DEBUG, " qtype[%d].sg_desc_sz = %d",
895                         qtype, qti->sg_desc_sz);
896                 IONIC_PRINT(DEBUG, " qtype[%d].max_sg_elems = %d",
897                         qtype, qti->max_sg_elems);
898                 IONIC_PRINT(DEBUG, " qtype[%d].sg_desc_stride = %d",
899                         qtype, qti->sg_desc_stride);
900         }
901 }
902
903 int
904 ionic_lif_alloc(struct ionic_lif *lif)
905 {
906         struct ionic_adapter *adapter = lif->adapter;
907         uint32_t socket_id = rte_socket_id();
908         int err;
909
910         /*
911          * lif->name was zeroed on allocation.
912          * Copy (sizeof() - 1) bytes to ensure that it is NULL terminated.
913          */
914         memcpy(lif->name, lif->eth_dev->data->name, sizeof(lif->name) - 1);
915
916         IONIC_PRINT(DEBUG, "LIF: %s", lif->name);
917
918         ionic_lif_queue_identify(lif);
919
920         if (lif->qtype_info[IONIC_QTYPE_TXQ].version < 1) {
921                 IONIC_PRINT(ERR, "FW too old, please upgrade");
922                 return -ENXIO;
923         }
924
925         IONIC_PRINT(DEBUG, "Allocating Lif Info");
926
927         rte_spinlock_init(&lif->adminq_lock);
928         rte_spinlock_init(&lif->adminq_service_lock);
929
930         lif->kern_dbpage = ionic_bus_map_dbpage(adapter, 0);
931         if (!lif->kern_dbpage) {
932                 IONIC_PRINT(ERR, "Cannot map dbpage, aborting");
933                 return -ENOMEM;
934         }
935
936         lif->txqcqs = rte_zmalloc("ionic", sizeof(*lif->txqcqs) *
937                 adapter->max_ntxqs_per_lif, 0);
938
939         if (!lif->txqcqs) {
940                 IONIC_PRINT(ERR, "Cannot allocate tx queues array");
941                 return -ENOMEM;
942         }
943
944         lif->rxqcqs = rte_zmalloc("ionic", sizeof(*lif->rxqcqs) *
945                 adapter->max_nrxqs_per_lif, 0);
946
947         if (!lif->rxqcqs) {
948                 IONIC_PRINT(ERR, "Cannot allocate rx queues array");
949                 return -ENOMEM;
950         }
951
952         IONIC_PRINT(DEBUG, "Allocating Notify Queue");
953
954         err = ionic_notify_qcq_alloc(lif);
955         if (err) {
956                 IONIC_PRINT(ERR, "Cannot allocate notify queue");
957                 return err;
958         }
959
960         IONIC_PRINT(DEBUG, "Allocating Admin Queue");
961
962         err = ionic_admin_qcq_alloc(lif);
963         if (err) {
964                 IONIC_PRINT(ERR, "Cannot allocate admin queue");
965                 return err;
966         }
967
968         IONIC_PRINT(DEBUG, "Allocating Lif Info");
969
970         lif->info_sz = RTE_ALIGN(sizeof(*lif->info), PAGE_SIZE);
971
972         lif->info_z = rte_eth_dma_zone_reserve(lif->eth_dev,
973                 "lif_info", 0 /* queue_idx*/,
974                 lif->info_sz, IONIC_ALIGN, socket_id);
975         if (!lif->info_z) {
976                 IONIC_PRINT(ERR, "Cannot allocate lif info memory");
977                 return -ENOMEM;
978         }
979
980         lif->info = lif->info_z->addr;
981         lif->info_pa = lif->info_z->iova;
982
983         return 0;
984 }
985
986 void
987 ionic_lif_free(struct ionic_lif *lif)
988 {
989         if (lif->notifyqcq) {
990                 ionic_qcq_free(lif->notifyqcq);
991                 lif->notifyqcq = NULL;
992         }
993
994         if (lif->adminqcq) {
995                 ionic_qcq_free(lif->adminqcq);
996                 lif->adminqcq = NULL;
997         }
998
999         if (lif->txqcqs) {
1000                 rte_free(lif->txqcqs);
1001                 lif->txqcqs = NULL;
1002         }
1003
1004         if (lif->rxqcqs) {
1005                 rte_free(lif->rxqcqs);
1006                 lif->rxqcqs = NULL;
1007         }
1008
1009         if (lif->info) {
1010                 rte_memzone_free(lif->info_z);
1011                 lif->info = NULL;
1012         }
1013 }
1014
1015 void
1016 ionic_lif_free_queues(struct ionic_lif *lif)
1017 {
1018         uint32_t i;
1019
1020         for (i = 0; i < lif->ntxqcqs; i++) {
1021                 ionic_dev_tx_queue_release(lif->eth_dev->data->tx_queues[i]);
1022                 lif->eth_dev->data->tx_queues[i] = NULL;
1023         }
1024         for (i = 0; i < lif->nrxqcqs; i++) {
1025                 ionic_dev_rx_queue_release(lif->eth_dev->data->rx_queues[i]);
1026                 lif->eth_dev->data->rx_queues[i] = NULL;
1027         }
1028 }
1029
1030 int
1031 ionic_lif_rss_config(struct ionic_lif *lif,
1032                 const uint16_t types, const uint8_t *key, const uint32_t *indir)
1033 {
1034         struct ionic_adapter *adapter = lif->adapter;
1035         struct ionic_admin_ctx ctx = {
1036                 .pending_work = true,
1037                 .cmd.lif_setattr = {
1038                         .opcode = IONIC_CMD_LIF_SETATTR,
1039                         .attr = IONIC_LIF_ATTR_RSS,
1040                         .rss.types = rte_cpu_to_le_16(types),
1041                         .rss.addr = rte_cpu_to_le_64(lif->rss_ind_tbl_pa),
1042                 },
1043         };
1044         unsigned int i;
1045         uint16_t tbl_sz =
1046                 rte_le_to_cpu_16(adapter->ident.lif.eth.rss_ind_tbl_sz);
1047
1048         IONIC_PRINT_CALL();
1049
1050         lif->rss_types = types;
1051
1052         if (key)
1053                 memcpy(lif->rss_hash_key, key, IONIC_RSS_HASH_KEY_SIZE);
1054
1055         if (indir)
1056                 for (i = 0; i < tbl_sz; i++)
1057                         lif->rss_ind_tbl[i] = indir[i];
1058
1059         memcpy(ctx.cmd.lif_setattr.rss.key, lif->rss_hash_key,
1060                IONIC_RSS_HASH_KEY_SIZE);
1061
1062         return ionic_adminq_post_wait(lif, &ctx);
1063 }
1064
1065 static int
1066 ionic_lif_rss_setup(struct ionic_lif *lif)
1067 {
1068         struct ionic_adapter *adapter = lif->adapter;
1069         static const uint8_t toeplitz_symmetric_key[] = {
1070                 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A,
1071                 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A,
1072                 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A,
1073                 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A,
1074                 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A,
1075         };
1076         uint32_t i;
1077         uint16_t tbl_sz =
1078                 rte_le_to_cpu_16(adapter->ident.lif.eth.rss_ind_tbl_sz);
1079
1080         IONIC_PRINT_CALL();
1081
1082         if (!lif->rss_ind_tbl_z) {
1083                 lif->rss_ind_tbl_z = rte_eth_dma_zone_reserve(lif->eth_dev,
1084                                         "rss_ind_tbl", 0 /* queue_idx */,
1085                                         sizeof(*lif->rss_ind_tbl) * tbl_sz,
1086                                         IONIC_ALIGN, rte_socket_id());
1087                 if (!lif->rss_ind_tbl_z) {
1088                         IONIC_PRINT(ERR, "OOM");
1089                         return -ENOMEM;
1090                 }
1091
1092                 lif->rss_ind_tbl = lif->rss_ind_tbl_z->addr;
1093                 lif->rss_ind_tbl_pa = lif->rss_ind_tbl_z->iova;
1094         }
1095
1096         if (lif->rss_ind_tbl_nrxqcqs != lif->nrxqcqs) {
1097                 lif->rss_ind_tbl_nrxqcqs = lif->nrxqcqs;
1098
1099                 /* Fill indirection table with 'default' values */
1100                 for (i = 0; i < tbl_sz; i++)
1101                         lif->rss_ind_tbl[i] = i % lif->nrxqcqs;
1102         }
1103
1104         return ionic_lif_rss_config(lif, IONIC_RSS_OFFLOAD_ALL,
1105                         toeplitz_symmetric_key, NULL);
1106 }
1107
1108 static void
1109 ionic_lif_rss_teardown(struct ionic_lif *lif)
1110 {
1111         if (!lif->rss_ind_tbl)
1112                 return;
1113
1114         if (lif->rss_ind_tbl_z) {
1115                 /* Disable RSS on the NIC */
1116                 ionic_lif_rss_config(lif, 0x0, NULL, NULL);
1117
1118                 lif->rss_ind_tbl = NULL;
1119                 lif->rss_ind_tbl_pa = 0;
1120                 rte_memzone_free(lif->rss_ind_tbl_z);
1121                 lif->rss_ind_tbl_z = NULL;
1122         }
1123 }
1124
1125 static void
1126 ionic_lif_qcq_deinit(struct ionic_qcq *qcq)
1127 {
1128         qcq->flags &= ~IONIC_QCQ_F_INITED;
1129 }
1130
1131 void
1132 ionic_lif_txq_deinit(struct ionic_qcq *qcq)
1133 {
1134         ionic_lif_qcq_deinit(qcq);
1135 }
1136
1137 void
1138 ionic_lif_rxq_deinit(struct ionic_qcq *qcq)
1139 {
1140         ionic_lif_qcq_deinit(qcq);
1141 }
1142
1143 static void
1144 ionic_lif_notifyq_deinit(struct ionic_lif *lif)
1145 {
1146         struct ionic_qcq *nqcq = lif->notifyqcq;
1147         struct ionic_dev *idev = &lif->adapter->idev;
1148
1149         if (!(nqcq->flags & IONIC_QCQ_F_INITED))
1150                 return;
1151
1152         ionic_intr_mask(idev->intr_ctrl, nqcq->intr.index,
1153                 IONIC_INTR_MASK_SET);
1154
1155         nqcq->flags &= ~IONIC_QCQ_F_INITED;
1156 }
1157
1158 /* This acts like ionic_napi */
1159 int
1160 ionic_qcq_service(struct ionic_qcq *qcq, int budget, ionic_cq_cb cb,
1161                 void *cb_arg)
1162 {
1163         struct ionic_cq *cq = &qcq->cq;
1164         uint32_t work_done;
1165
1166         work_done = ionic_cq_service(cq, budget, cb, cb_arg);
1167
1168         return work_done;
1169 }
1170
1171 static void
1172 ionic_link_status_check(struct ionic_lif *lif)
1173 {
1174         struct ionic_adapter *adapter = lif->adapter;
1175         bool link_up;
1176
1177         lif->state &= ~IONIC_LIF_F_LINK_CHECK_NEEDED;
1178
1179         if (!lif->info)
1180                 return;
1181
1182         link_up = (lif->info->status.link_status == IONIC_PORT_OPER_STATUS_UP);
1183
1184         if ((link_up  && adapter->link_up) ||
1185             (!link_up && !adapter->link_up))
1186                 return;
1187
1188         if (link_up) {
1189                 adapter->link_speed =
1190                         rte_le_to_cpu_32(lif->info->status.link_speed);
1191                 IONIC_PRINT(DEBUG, "Link up - %d Gbps",
1192                         adapter->link_speed);
1193         } else {
1194                 IONIC_PRINT(DEBUG, "Link down");
1195         }
1196
1197         adapter->link_up = link_up;
1198         ionic_dev_link_update(lif->eth_dev, 0);
1199 }
1200
1201 static void
1202 ionic_lif_handle_fw_down(struct ionic_lif *lif)
1203 {
1204         if (lif->state & IONIC_LIF_F_FW_RESET)
1205                 return;
1206
1207         lif->state |= IONIC_LIF_F_FW_RESET;
1208
1209         if (lif->state & IONIC_LIF_F_UP) {
1210                 IONIC_PRINT(NOTICE,
1211                         "Surprise FW stop, stopping %s\n", lif->name);
1212                 ionic_lif_stop(lif);
1213         }
1214
1215         IONIC_PRINT(NOTICE, "FW down, %s stopped", lif->name);
1216 }
1217
1218 static bool
1219 ionic_notifyq_cb(struct ionic_cq *cq, uint32_t cq_desc_index, void *cb_arg)
1220 {
1221         union ionic_notifyq_comp *cq_desc_base = cq->base;
1222         union ionic_notifyq_comp *cq_desc = &cq_desc_base[cq_desc_index];
1223         struct ionic_lif *lif = cb_arg;
1224
1225         IONIC_PRINT(DEBUG, "Notifyq callback eid = %jd ecode = %d",
1226                 cq_desc->event.eid, cq_desc->event.ecode);
1227
1228         /* Have we run out of new completions to process? */
1229         if (!(cq_desc->event.eid > lif->last_eid))
1230                 return false;
1231
1232         lif->last_eid = cq_desc->event.eid;
1233
1234         switch (cq_desc->event.ecode) {
1235         case IONIC_EVENT_LINK_CHANGE:
1236                 IONIC_PRINT(DEBUG,
1237                         "Notifyq IONIC_EVENT_LINK_CHANGE %s "
1238                         "eid=%jd link_status=%d link_speed=%d",
1239                         lif->name,
1240                         cq_desc->event.eid,
1241                         cq_desc->link_change.link_status,
1242                         cq_desc->link_change.link_speed);
1243
1244                 lif->state |= IONIC_LIF_F_LINK_CHECK_NEEDED;
1245                 break;
1246
1247         case IONIC_EVENT_RESET:
1248                 IONIC_PRINT(NOTICE,
1249                         "Notifyq IONIC_EVENT_RESET %s "
1250                         "eid=%jd, reset_code=%d state=%d",
1251                         lif->name,
1252                         cq_desc->event.eid,
1253                         cq_desc->reset.reset_code,
1254                         cq_desc->reset.state);
1255                 ionic_lif_handle_fw_down(lif);
1256                 break;
1257
1258         default:
1259                 IONIC_PRINT(WARNING, "Notifyq bad event ecode=%d eid=%jd",
1260                         cq_desc->event.ecode, cq_desc->event.eid);
1261                 break;
1262         }
1263
1264         return true;
1265 }
1266
1267 int
1268 ionic_notifyq_handler(struct ionic_lif *lif, int budget)
1269 {
1270         struct ionic_dev *idev = &lif->adapter->idev;
1271         struct ionic_qcq *qcq = lif->notifyqcq;
1272         uint32_t work_done;
1273
1274         if (!(qcq->flags & IONIC_QCQ_F_INITED)) {
1275                 IONIC_PRINT(DEBUG, "Notifyq not yet initialized");
1276                 return -1;
1277         }
1278
1279         ionic_intr_mask(idev->intr_ctrl, qcq->intr.index,
1280                 IONIC_INTR_MASK_SET);
1281
1282         work_done = ionic_qcq_service(qcq, budget, ionic_notifyq_cb, lif);
1283
1284         if (lif->state & IONIC_LIF_F_LINK_CHECK_NEEDED)
1285                 ionic_link_status_check(lif);
1286
1287         ionic_intr_credits(idev->intr_ctrl, qcq->intr.index,
1288                 work_done, IONIC_INTR_CRED_RESET_COALESCE);
1289
1290         ionic_intr_mask(idev->intr_ctrl, qcq->intr.index,
1291                 IONIC_INTR_MASK_CLEAR);
1292
1293         return 0;
1294 }
1295
1296 static int
1297 ionic_lif_adminq_init(struct ionic_lif *lif)
1298 {
1299         struct ionic_dev *idev = &lif->adapter->idev;
1300         struct ionic_qcq *qcq = lif->adminqcq;
1301         struct ionic_queue *q = &qcq->q;
1302         struct ionic_q_init_comp comp;
1303         int err;
1304
1305         ionic_dev_cmd_adminq_init(idev, qcq);
1306         err = ionic_dev_cmd_wait_check(idev, IONIC_DEVCMD_TIMEOUT);
1307         if (err)
1308                 return err;
1309
1310         ionic_dev_cmd_comp(idev, &comp);
1311
1312         q->hw_type = comp.hw_type;
1313         q->hw_index = rte_le_to_cpu_32(comp.hw_index);
1314         q->db = ionic_db_map(lif, q);
1315
1316         IONIC_PRINT(DEBUG, "adminq->hw_type %d", q->hw_type);
1317         IONIC_PRINT(DEBUG, "adminq->hw_index %d", q->hw_index);
1318         IONIC_PRINT(DEBUG, "adminq->db %p", q->db);
1319
1320         qcq->flags |= IONIC_QCQ_F_INITED;
1321
1322         return 0;
1323 }
1324
1325 static int
1326 ionic_lif_notifyq_init(struct ionic_lif *lif)
1327 {
1328         struct ionic_dev *idev = &lif->adapter->idev;
1329         struct ionic_qcq *qcq = lif->notifyqcq;
1330         struct ionic_queue *q = &qcq->q;
1331         int err;
1332
1333         struct ionic_admin_ctx ctx = {
1334                 .pending_work = true,
1335                 .cmd.q_init = {
1336                         .opcode = IONIC_CMD_Q_INIT,
1337                         .type = q->type,
1338                         .ver = lif->qtype_info[q->type].version,
1339                         .index = rte_cpu_to_le_32(q->index),
1340                         .intr_index = rte_cpu_to_le_16(qcq->intr.index),
1341                         .flags = rte_cpu_to_le_16(IONIC_QINIT_F_IRQ |
1342                                                 IONIC_QINIT_F_ENA),
1343                         .ring_size = rte_log2_u32(q->num_descs),
1344                         .ring_base = rte_cpu_to_le_64(q->base_pa),
1345                 }
1346         };
1347
1348         IONIC_PRINT(DEBUG, "notifyq_init.index %d", q->index);
1349         IONIC_PRINT(DEBUG, "notifyq_init.ring_base 0x%" PRIx64 "", q->base_pa);
1350         IONIC_PRINT(DEBUG, "notifyq_init.ring_size %d",
1351                 ctx.cmd.q_init.ring_size);
1352         IONIC_PRINT(DEBUG, "notifyq_init.ver %u", ctx.cmd.q_init.ver);
1353
1354         err = ionic_adminq_post_wait(lif, &ctx);
1355         if (err)
1356                 return err;
1357
1358         q->hw_type = ctx.comp.q_init.hw_type;
1359         q->hw_index = rte_le_to_cpu_32(ctx.comp.q_init.hw_index);
1360         q->db = NULL;
1361
1362         IONIC_PRINT(DEBUG, "notifyq->hw_type %d", q->hw_type);
1363         IONIC_PRINT(DEBUG, "notifyq->hw_index %d", q->hw_index);
1364         IONIC_PRINT(DEBUG, "notifyq->db %p", q->db);
1365
1366         ionic_intr_mask(idev->intr_ctrl, qcq->intr.index,
1367                 IONIC_INTR_MASK_CLEAR);
1368
1369         qcq->flags |= IONIC_QCQ_F_INITED;
1370
1371         return 0;
1372 }
1373
1374 int
1375 ionic_lif_set_features(struct ionic_lif *lif)
1376 {
1377         struct ionic_admin_ctx ctx = {
1378                 .pending_work = true,
1379                 .cmd.lif_setattr = {
1380                         .opcode = IONIC_CMD_LIF_SETATTR,
1381                         .attr = IONIC_LIF_ATTR_FEATURES,
1382                         .features = rte_cpu_to_le_64(lif->features),
1383                 },
1384         };
1385         int err;
1386
1387         err = ionic_adminq_post_wait(lif, &ctx);
1388         if (err)
1389                 return err;
1390
1391         lif->hw_features = rte_le_to_cpu_64(ctx.cmd.lif_setattr.features &
1392                                                 ctx.comp.lif_setattr.features);
1393
1394         if (lif->hw_features & IONIC_ETH_HW_VLAN_TX_TAG)
1395                 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_VLAN_TX_TAG");
1396         if (lif->hw_features & IONIC_ETH_HW_VLAN_RX_STRIP)
1397                 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_VLAN_RX_STRIP");
1398         if (lif->hw_features & IONIC_ETH_HW_VLAN_RX_FILTER)
1399                 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_VLAN_RX_FILTER");
1400         if (lif->hw_features & IONIC_ETH_HW_RX_HASH)
1401                 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_RX_HASH");
1402         if (lif->hw_features & IONIC_ETH_HW_TX_SG)
1403                 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TX_SG");
1404         if (lif->hw_features & IONIC_ETH_HW_RX_SG)
1405                 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_RX_SG");
1406         if (lif->hw_features & IONIC_ETH_HW_TX_CSUM)
1407                 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TX_CSUM");
1408         if (lif->hw_features & IONIC_ETH_HW_RX_CSUM)
1409                 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_RX_CSUM");
1410         if (lif->hw_features & IONIC_ETH_HW_TSO)
1411                 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TSO");
1412         if (lif->hw_features & IONIC_ETH_HW_TSO_IPV6)
1413                 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TSO_IPV6");
1414         if (lif->hw_features & IONIC_ETH_HW_TSO_ECN)
1415                 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TSO_ECN");
1416         if (lif->hw_features & IONIC_ETH_HW_TSO_GRE)
1417                 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TSO_GRE");
1418         if (lif->hw_features & IONIC_ETH_HW_TSO_GRE_CSUM)
1419                 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TSO_GRE_CSUM");
1420         if (lif->hw_features & IONIC_ETH_HW_TSO_IPXIP4)
1421                 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TSO_IPXIP4");
1422         if (lif->hw_features & IONIC_ETH_HW_TSO_IPXIP6)
1423                 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TSO_IPXIP6");
1424         if (lif->hw_features & IONIC_ETH_HW_TSO_UDP)
1425                 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TSO_UDP");
1426         if (lif->hw_features & IONIC_ETH_HW_TSO_UDP_CSUM)
1427                 IONIC_PRINT(DEBUG, "feature IONIC_ETH_HW_TSO_UDP_CSUM");
1428
1429         return 0;
1430 }
1431
1432 int
1433 ionic_lif_txq_init(struct ionic_qcq *qcq)
1434 {
1435         struct ionic_queue *q = &qcq->q;
1436         struct ionic_lif *lif = qcq->lif;
1437         struct ionic_cq *cq = &qcq->cq;
1438         struct ionic_admin_ctx ctx = {
1439                 .pending_work = true,
1440                 .cmd.q_init = {
1441                         .opcode = IONIC_CMD_Q_INIT,
1442                         .type = q->type,
1443                         .ver = lif->qtype_info[q->type].version,
1444                         .index = rte_cpu_to_le_32(q->index),
1445                         .flags = rte_cpu_to_le_16(IONIC_QINIT_F_SG |
1446                                                 IONIC_QINIT_F_ENA),
1447                         .intr_index = rte_cpu_to_le_16(IONIC_INTR_NONE),
1448                         .ring_size = rte_log2_u32(q->num_descs),
1449                         .ring_base = rte_cpu_to_le_64(q->base_pa),
1450                         .cq_ring_base = rte_cpu_to_le_64(cq->base_pa),
1451                         .sg_ring_base = rte_cpu_to_le_64(q->sg_base_pa),
1452                 },
1453         };
1454         int err;
1455
1456         IONIC_PRINT(DEBUG, "txq_init.index %d", q->index);
1457         IONIC_PRINT(DEBUG, "txq_init.ring_base 0x%" PRIx64 "", q->base_pa);
1458         IONIC_PRINT(DEBUG, "txq_init.ring_size %d",
1459                 ctx.cmd.q_init.ring_size);
1460         IONIC_PRINT(DEBUG, "txq_init.ver %u", ctx.cmd.q_init.ver);
1461
1462         err = ionic_adminq_post_wait(qcq->lif, &ctx);
1463         if (err)
1464                 return err;
1465
1466         q->hw_type = ctx.comp.q_init.hw_type;
1467         q->hw_index = rte_le_to_cpu_32(ctx.comp.q_init.hw_index);
1468         q->db = ionic_db_map(lif, q);
1469
1470         IONIC_PRINT(DEBUG, "txq->hw_type %d", q->hw_type);
1471         IONIC_PRINT(DEBUG, "txq->hw_index %d", q->hw_index);
1472         IONIC_PRINT(DEBUG, "txq->db %p", q->db);
1473
1474         qcq->flags |= IONIC_QCQ_F_INITED;
1475
1476         return 0;
1477 }
1478
1479 int
1480 ionic_lif_rxq_init(struct ionic_qcq *qcq)
1481 {
1482         struct ionic_queue *q = &qcq->q;
1483         struct ionic_lif *lif = qcq->lif;
1484         struct ionic_cq *cq = &qcq->cq;
1485         struct ionic_admin_ctx ctx = {
1486                 .pending_work = true,
1487                 .cmd.q_init = {
1488                         .opcode = IONIC_CMD_Q_INIT,
1489                         .type = q->type,
1490                         .ver = lif->qtype_info[q->type].version,
1491                         .index = rte_cpu_to_le_32(q->index),
1492                         .flags = rte_cpu_to_le_16(IONIC_QINIT_F_SG |
1493                                                 IONIC_QINIT_F_ENA),
1494                         .intr_index = rte_cpu_to_le_16(IONIC_INTR_NONE),
1495                         .ring_size = rte_log2_u32(q->num_descs),
1496                         .ring_base = rte_cpu_to_le_64(q->base_pa),
1497                         .cq_ring_base = rte_cpu_to_le_64(cq->base_pa),
1498                         .sg_ring_base = rte_cpu_to_le_64(q->sg_base_pa),
1499                 },
1500         };
1501         int err;
1502
1503         IONIC_PRINT(DEBUG, "rxq_init.index %d", q->index);
1504         IONIC_PRINT(DEBUG, "rxq_init.ring_base 0x%" PRIx64 "", q->base_pa);
1505         IONIC_PRINT(DEBUG, "rxq_init.ring_size %d",
1506                 ctx.cmd.q_init.ring_size);
1507         IONIC_PRINT(DEBUG, "rxq_init.ver %u", ctx.cmd.q_init.ver);
1508
1509         err = ionic_adminq_post_wait(qcq->lif, &ctx);
1510         if (err)
1511                 return err;
1512
1513         q->hw_type = ctx.comp.q_init.hw_type;
1514         q->hw_index = rte_le_to_cpu_32(ctx.comp.q_init.hw_index);
1515         q->db = ionic_db_map(lif, q);
1516
1517         qcq->flags |= IONIC_QCQ_F_INITED;
1518
1519         IONIC_PRINT(DEBUG, "rxq->hw_type %d", q->hw_type);
1520         IONIC_PRINT(DEBUG, "rxq->hw_index %d", q->hw_index);
1521         IONIC_PRINT(DEBUG, "rxq->db %p", q->db);
1522
1523         return 0;
1524 }
1525
1526 static int
1527 ionic_station_set(struct ionic_lif *lif)
1528 {
1529         struct ionic_admin_ctx ctx = {
1530                 .pending_work = true,
1531                 .cmd.lif_getattr = {
1532                         .opcode = IONIC_CMD_LIF_GETATTR,
1533                         .attr = IONIC_LIF_ATTR_MAC,
1534                 },
1535         };
1536         int err;
1537
1538         IONIC_PRINT_CALL();
1539
1540         err = ionic_adminq_post_wait(lif, &ctx);
1541         if (err)
1542                 return err;
1543
1544         memcpy(lif->mac_addr, ctx.comp.lif_getattr.mac, RTE_ETHER_ADDR_LEN);
1545
1546         return 0;
1547 }
1548
1549 static void
1550 ionic_lif_set_name(struct ionic_lif *lif)
1551 {
1552         struct ionic_admin_ctx ctx = {
1553                 .pending_work = true,
1554                 .cmd.lif_setattr = {
1555                         .opcode = IONIC_CMD_LIF_SETATTR,
1556                         .attr = IONIC_LIF_ATTR_NAME,
1557                 },
1558         };
1559
1560         memcpy(ctx.cmd.lif_setattr.name, lif->name,
1561                 sizeof(ctx.cmd.lif_setattr.name) - 1);
1562
1563         ionic_adminq_post_wait(lif, &ctx);
1564 }
1565
1566 int
1567 ionic_lif_init(struct ionic_lif *lif)
1568 {
1569         struct ionic_dev *idev = &lif->adapter->idev;
1570         struct ionic_q_init_comp comp;
1571         int err;
1572
1573         memset(&lif->stats_base, 0, sizeof(lif->stats_base));
1574
1575         ionic_dev_cmd_lif_init(idev, lif->info_pa);
1576         err = ionic_dev_cmd_wait_check(idev, IONIC_DEVCMD_TIMEOUT);
1577         ionic_dev_cmd_comp(idev, &comp);
1578         if (err)
1579                 return err;
1580
1581         lif->hw_index = rte_cpu_to_le_16(comp.hw_index);
1582
1583         err = ionic_lif_adminq_init(lif);
1584         if (err)
1585                 return err;
1586
1587         err = ionic_lif_notifyq_init(lif);
1588         if (err)
1589                 goto err_out_adminq_deinit;
1590
1591         /*
1592          * Configure initial feature set
1593          * This will be updated later by the dev_configure() step
1594          */
1595         lif->features = IONIC_ETH_HW_RX_HASH | IONIC_ETH_HW_VLAN_RX_FILTER;
1596
1597         err = ionic_lif_set_features(lif);
1598         if (err)
1599                 goto err_out_notifyq_deinit;
1600
1601         err = ionic_rx_filters_init(lif);
1602         if (err)
1603                 goto err_out_notifyq_deinit;
1604
1605         err = ionic_station_set(lif);
1606         if (err)
1607                 goto err_out_rx_filter_deinit;
1608
1609         ionic_lif_set_name(lif);
1610
1611         lif->state |= IONIC_LIF_F_INITED;
1612
1613         return 0;
1614
1615 err_out_rx_filter_deinit:
1616         ionic_rx_filters_deinit(lif);
1617
1618 err_out_notifyq_deinit:
1619         ionic_lif_notifyq_deinit(lif);
1620
1621 err_out_adminq_deinit:
1622         ionic_lif_qcq_deinit(lif->adminqcq);
1623
1624         return err;
1625 }
1626
1627 void
1628 ionic_lif_deinit(struct ionic_lif *lif)
1629 {
1630         if (!(lif->state & IONIC_LIF_F_INITED))
1631                 return;
1632
1633         ionic_rx_filters_deinit(lif);
1634         ionic_lif_rss_teardown(lif);
1635         ionic_lif_notifyq_deinit(lif);
1636         ionic_lif_qcq_deinit(lif->adminqcq);
1637
1638         lif->state &= ~IONIC_LIF_F_INITED;
1639 }
1640
1641 void
1642 ionic_lif_configure_vlan_offload(struct ionic_lif *lif, int mask)
1643 {
1644         struct rte_eth_dev *eth_dev = lif->eth_dev;
1645         struct rte_eth_rxmode *rxmode = &eth_dev->data->dev_conf.rxmode;
1646
1647         /*
1648          * IONIC_ETH_HW_VLAN_RX_FILTER cannot be turned off, so
1649          * set DEV_RX_OFFLOAD_VLAN_FILTER and ignore ETH_VLAN_FILTER_MASK
1650          */
1651         rxmode->offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
1652
1653         if (mask & ETH_VLAN_STRIP_MASK) {
1654                 if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_STRIP)
1655                         lif->features |= IONIC_ETH_HW_VLAN_RX_STRIP;
1656                 else
1657                         lif->features &= ~IONIC_ETH_HW_VLAN_RX_STRIP;
1658         }
1659 }
1660
1661 void
1662 ionic_lif_configure(struct ionic_lif *lif)
1663 {
1664         struct rte_eth_rxmode *rxmode = &lif->eth_dev->data->dev_conf.rxmode;
1665         struct rte_eth_txmode *txmode = &lif->eth_dev->data->dev_conf.txmode;
1666         struct ionic_identity *ident = &lif->adapter->ident;
1667         union ionic_lif_config *cfg = &ident->lif.eth.config;
1668         uint32_t ntxqs_per_lif =
1669                 rte_le_to_cpu_32(cfg->queue_count[IONIC_QTYPE_TXQ]);
1670         uint32_t nrxqs_per_lif =
1671                 rte_le_to_cpu_32(cfg->queue_count[IONIC_QTYPE_RXQ]);
1672         uint32_t nrxqs = lif->eth_dev->data->nb_rx_queues;
1673         uint32_t ntxqs = lif->eth_dev->data->nb_tx_queues;
1674
1675         lif->port_id = lif->eth_dev->data->port_id;
1676
1677         IONIC_PRINT(DEBUG, "Configuring LIF on port %u",
1678                 lif->port_id);
1679
1680         if (nrxqs > 0)
1681                 nrxqs_per_lif = RTE_MIN(nrxqs_per_lif, nrxqs);
1682
1683         if (ntxqs > 0)
1684                 ntxqs_per_lif = RTE_MIN(ntxqs_per_lif, ntxqs);
1685
1686         lif->nrxqcqs = nrxqs_per_lif;
1687         lif->ntxqcqs = ntxqs_per_lif;
1688
1689         /* Update the LIF configuration based on the eth_dev */
1690
1691         /*
1692          * NB: While it is true that RSS_HASH is always enabled on ionic,
1693          *     setting this flag unconditionally causes problems in DTS.
1694          * rxmode->offloads |= DEV_RX_OFFLOAD_RSS_HASH;
1695          */
1696
1697         /* RX per-port */
1698
1699         if (rxmode->offloads & DEV_RX_OFFLOAD_IPV4_CKSUM ||
1700             rxmode->offloads & DEV_RX_OFFLOAD_UDP_CKSUM ||
1701             rxmode->offloads & DEV_RX_OFFLOAD_TCP_CKSUM)
1702                 lif->features |= IONIC_ETH_HW_RX_CSUM;
1703         else
1704                 lif->features &= ~IONIC_ETH_HW_RX_CSUM;
1705
1706         if (rxmode->offloads & DEV_RX_OFFLOAD_SCATTER) {
1707                 lif->features |= IONIC_ETH_HW_RX_SG;
1708                 lif->eth_dev->data->scattered_rx = 1;
1709         } else {
1710                 lif->features &= ~IONIC_ETH_HW_RX_SG;
1711                 lif->eth_dev->data->scattered_rx = 0;
1712         }
1713
1714         /* Covers VLAN_STRIP */
1715         ionic_lif_configure_vlan_offload(lif, ETH_VLAN_STRIP_MASK);
1716
1717         /* TX per-port */
1718
1719         if (txmode->offloads & DEV_TX_OFFLOAD_IPV4_CKSUM ||
1720             txmode->offloads & DEV_TX_OFFLOAD_UDP_CKSUM ||
1721             txmode->offloads & DEV_TX_OFFLOAD_TCP_CKSUM ||
1722             txmode->offloads & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM ||
1723             txmode->offloads & DEV_TX_OFFLOAD_OUTER_UDP_CKSUM)
1724                 lif->features |= IONIC_ETH_HW_TX_CSUM;
1725         else
1726                 lif->features &= ~IONIC_ETH_HW_TX_CSUM;
1727
1728         if (txmode->offloads & DEV_TX_OFFLOAD_VLAN_INSERT)
1729                 lif->features |= IONIC_ETH_HW_VLAN_TX_TAG;
1730         else
1731                 lif->features &= ~IONIC_ETH_HW_VLAN_TX_TAG;
1732
1733         if (txmode->offloads & DEV_TX_OFFLOAD_MULTI_SEGS)
1734                 lif->features |= IONIC_ETH_HW_TX_SG;
1735         else
1736                 lif->features &= ~IONIC_ETH_HW_TX_SG;
1737
1738         if (txmode->offloads & DEV_TX_OFFLOAD_TCP_TSO) {
1739                 lif->features |= IONIC_ETH_HW_TSO;
1740                 lif->features |= IONIC_ETH_HW_TSO_IPV6;
1741                 lif->features |= IONIC_ETH_HW_TSO_ECN;
1742         } else {
1743                 lif->features &= ~IONIC_ETH_HW_TSO;
1744                 lif->features &= ~IONIC_ETH_HW_TSO_IPV6;
1745                 lif->features &= ~IONIC_ETH_HW_TSO_ECN;
1746         }
1747 }
1748
1749 int
1750 ionic_lif_start(struct ionic_lif *lif)
1751 {
1752         uint32_t rx_mode;
1753         uint32_t i;
1754         int err;
1755
1756         err = ionic_lif_rss_setup(lif);
1757         if (err)
1758                 return err;
1759
1760         if (!lif->rx_mode) {
1761                 IONIC_PRINT(DEBUG, "Setting RX mode on %s",
1762                         lif->name);
1763
1764                 rx_mode  = IONIC_RX_MODE_F_UNICAST;
1765                 rx_mode |= IONIC_RX_MODE_F_MULTICAST;
1766                 rx_mode |= IONIC_RX_MODE_F_BROADCAST;
1767
1768                 ionic_set_rx_mode(lif, rx_mode);
1769         }
1770
1771         IONIC_PRINT(DEBUG, "Starting %u RX queues and %u TX queues "
1772                 "on port %u",
1773                 lif->nrxqcqs, lif->ntxqcqs, lif->port_id);
1774
1775         for (i = 0; i < lif->nrxqcqs; i++) {
1776                 struct ionic_qcq *rxq = lif->rxqcqs[i];
1777                 if (!(rxq->flags & IONIC_QCQ_F_DEFERRED)) {
1778                         err = ionic_dev_rx_queue_start(lif->eth_dev, i);
1779
1780                         if (err)
1781                                 return err;
1782                 }
1783         }
1784
1785         for (i = 0; i < lif->ntxqcqs; i++) {
1786                 struct ionic_qcq *txq = lif->txqcqs[i];
1787                 if (!(txq->flags & IONIC_QCQ_F_DEFERRED)) {
1788                         err = ionic_dev_tx_queue_start(lif->eth_dev, i);
1789
1790                         if (err)
1791                                 return err;
1792                 }
1793         }
1794
1795         /* Carrier ON here */
1796         lif->state |= IONIC_LIF_F_UP;
1797
1798         ionic_link_status_check(lif);
1799
1800         return 0;
1801 }
1802
1803 int
1804 ionic_lif_identify(struct ionic_adapter *adapter)
1805 {
1806         struct ionic_dev *idev = &adapter->idev;
1807         struct ionic_identity *ident = &adapter->ident;
1808         union ionic_lif_config *cfg = &ident->lif.eth.config;
1809         uint32_t lif_words = RTE_DIM(ident->lif.words);
1810         uint32_t cmd_words = RTE_DIM(idev->dev_cmd->data);
1811         uint32_t i, nwords;
1812         int err;
1813
1814         ionic_dev_cmd_lif_identify(idev, IONIC_LIF_TYPE_CLASSIC,
1815                 IONIC_IDENTITY_VERSION_1);
1816         err = ionic_dev_cmd_wait_check(idev, IONIC_DEVCMD_TIMEOUT);
1817         if (err)
1818                 return (err);
1819
1820         nwords = RTE_MIN(lif_words, cmd_words);
1821         for (i = 0; i < nwords; i++)
1822                 ident->lif.words[i] = ioread32(&idev->dev_cmd->data[i]);
1823
1824         IONIC_PRINT(INFO, "capabilities 0x%" PRIx64 " ",
1825                 rte_le_to_cpu_64(ident->lif.capabilities));
1826
1827         IONIC_PRINT(INFO, "eth.max_ucast_filters 0x%" PRIx32 " ",
1828                 rte_le_to_cpu_32(ident->lif.eth.max_ucast_filters));
1829         IONIC_PRINT(INFO, "eth.max_mcast_filters 0x%" PRIx32 " ",
1830                 rte_le_to_cpu_32(ident->lif.eth.max_mcast_filters));
1831
1832         IONIC_PRINT(INFO, "eth.features 0x%" PRIx64 " ",
1833                 rte_le_to_cpu_64(cfg->features));
1834         IONIC_PRINT(INFO, "eth.queue_count[IONIC_QTYPE_ADMINQ] 0x%" PRIx32 " ",
1835                 rte_le_to_cpu_32(cfg->queue_count[IONIC_QTYPE_ADMINQ]));
1836         IONIC_PRINT(INFO, "eth.queue_count[IONIC_QTYPE_NOTIFYQ] 0x%" PRIx32 " ",
1837                 rte_le_to_cpu_32(cfg->queue_count[IONIC_QTYPE_NOTIFYQ]));
1838         IONIC_PRINT(INFO, "eth.queue_count[IONIC_QTYPE_RXQ] 0x%" PRIx32 " ",
1839                 rte_le_to_cpu_32(cfg->queue_count[IONIC_QTYPE_RXQ]));
1840         IONIC_PRINT(INFO, "eth.queue_count[IONIC_QTYPE_TXQ] 0x%" PRIx32 " ",
1841                 rte_le_to_cpu_32(cfg->queue_count[IONIC_QTYPE_TXQ]));
1842
1843         return 0;
1844 }
1845
1846 int
1847 ionic_lifs_size(struct ionic_adapter *adapter)
1848 {
1849         struct ionic_identity *ident = &adapter->ident;
1850         union ionic_lif_config *cfg = &ident->lif.eth.config;
1851         uint32_t nintrs, dev_nintrs = rte_le_to_cpu_32(ident->dev.nintrs);
1852
1853         adapter->max_ntxqs_per_lif =
1854                 rte_le_to_cpu_32(cfg->queue_count[IONIC_QTYPE_TXQ]);
1855         adapter->max_nrxqs_per_lif =
1856                 rte_le_to_cpu_32(cfg->queue_count[IONIC_QTYPE_RXQ]);
1857
1858         nintrs = 1 /* notifyq */;
1859
1860         if (nintrs > dev_nintrs) {
1861                 IONIC_PRINT(ERR,
1862                         "At most %d intr supported, minimum req'd is %u",
1863                         dev_nintrs, nintrs);
1864                 return -ENOSPC;
1865         }
1866
1867         adapter->nintrs = nintrs;
1868
1869         return 0;
1870 }