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