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