xref: /dpdk/drivers/net/fm10k/fm10k_ethdev.c (revision d6f923ba)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2013-2016 Intel Corporation
3  */
4 
5 #include <rte_ethdev_driver.h>
6 #include <rte_ethdev_pci.h>
7 #include <rte_malloc.h>
8 #include <rte_memzone.h>
9 #include <rte_string_fns.h>
10 #include <rte_dev.h>
11 #include <rte_spinlock.h>
12 #include <rte_kvargs.h>
13 
14 #include "fm10k.h"
15 #include "base/fm10k_api.h"
16 
17 /* Default delay to acquire mailbox lock */
18 #define FM10K_MBXLOCK_DELAY_US 20
19 #define UINT64_LOWER_32BITS_MASK 0x00000000ffffffffULL
20 
21 #define MAIN_VSI_POOL_NUMBER 0
22 
23 /* Max try times to acquire switch status */
24 #define MAX_QUERY_SWITCH_STATE_TIMES 10
25 /* Wait interval to get switch status */
26 #define WAIT_SWITCH_MSG_US    100000
27 /* A period of quiescence for switch */
28 #define FM10K_SWITCH_QUIESCE_US 100000
29 /* Number of chars per uint32 type */
30 #define CHARS_PER_UINT32 (sizeof(uint32_t))
31 #define BIT_MASK_PER_UINT32 ((1 << CHARS_PER_UINT32) - 1)
32 
33 /* default 1:1 map from queue ID to interrupt vector ID */
34 #define Q2V(pci_dev, queue_id) ((pci_dev)->intr_handle.intr_vec[queue_id])
35 
36 /* First 64 Logical ports for PF/VMDQ, second 64 for Flow director */
37 #define MAX_LPORT_NUM    128
38 #define GLORT_FD_Q_BASE  0x40
39 #define GLORT_PF_MASK    0xFFC0
40 #define GLORT_FD_MASK    GLORT_PF_MASK
41 #define GLORT_FD_INDEX   GLORT_FD_Q_BASE
42 
43 int fm10k_logtype_init;
44 int fm10k_logtype_driver;
45 
46 #ifdef RTE_LIBRTE_FM10K_DEBUG_RX
47 int fm10k_logtype_rx;
48 #endif
49 #ifdef RTE_LIBRTE_FM10K_DEBUG_TX
50 int fm10k_logtype_tx;
51 #endif
52 #ifdef RTE_LIBRTE_FM10K_DEBUG_TX_FREE
53 int fm10k_logtype_tx_free;
54 #endif
55 
56 static void fm10k_close_mbx_service(struct fm10k_hw *hw);
57 static int fm10k_dev_promiscuous_enable(struct rte_eth_dev *dev);
58 static int fm10k_dev_promiscuous_disable(struct rte_eth_dev *dev);
59 static int fm10k_dev_allmulticast_enable(struct rte_eth_dev *dev);
60 static int fm10k_dev_allmulticast_disable(struct rte_eth_dev *dev);
61 static inline int fm10k_glort_valid(struct fm10k_hw *hw);
62 static int
63 fm10k_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on);
64 static void fm10k_MAC_filter_set(struct rte_eth_dev *dev,
65 	const u8 *mac, bool add, uint32_t pool);
66 static void fm10k_tx_queue_release(void *queue);
67 static void fm10k_rx_queue_release(void *queue);
68 static void fm10k_set_rx_function(struct rte_eth_dev *dev);
69 static void fm10k_set_tx_function(struct rte_eth_dev *dev);
70 static int fm10k_check_ftag(struct rte_devargs *devargs);
71 static int fm10k_link_update(struct rte_eth_dev *dev, int wait_to_complete);
72 
73 static int fm10k_dev_infos_get(struct rte_eth_dev *dev,
74 			       struct rte_eth_dev_info *dev_info);
75 static uint64_t fm10k_get_rx_queue_offloads_capa(struct rte_eth_dev *dev);
76 static uint64_t fm10k_get_rx_port_offloads_capa(struct rte_eth_dev *dev);
77 static uint64_t fm10k_get_tx_queue_offloads_capa(struct rte_eth_dev *dev);
78 static uint64_t fm10k_get_tx_port_offloads_capa(struct rte_eth_dev *dev);
79 
80 struct fm10k_xstats_name_off {
81 	char name[RTE_ETH_XSTATS_NAME_SIZE];
82 	unsigned offset;
83 };
84 
85 static const struct fm10k_xstats_name_off fm10k_hw_stats_strings[] = {
86 	{"completion_timeout_count", offsetof(struct fm10k_hw_stats, timeout)},
87 	{"unsupported_requests_count", offsetof(struct fm10k_hw_stats, ur)},
88 	{"completer_abort_count", offsetof(struct fm10k_hw_stats, ca)},
89 	{"unsupported_message_count", offsetof(struct fm10k_hw_stats, um)},
90 	{"checksum_error_count", offsetof(struct fm10k_hw_stats, xec)},
91 	{"vlan_dropped", offsetof(struct fm10k_hw_stats, vlan_drop)},
92 	{"loopback_dropped", offsetof(struct fm10k_hw_stats, loopback_drop)},
93 	{"rx_mbuf_allocation_errors", offsetof(struct fm10k_hw_stats,
94 		nodesc_drop)},
95 };
96 
97 #define FM10K_NB_HW_XSTATS (sizeof(fm10k_hw_stats_strings) / \
98 		sizeof(fm10k_hw_stats_strings[0]))
99 
100 static const struct fm10k_xstats_name_off fm10k_hw_stats_rx_q_strings[] = {
101 	{"packets", offsetof(struct fm10k_hw_stats_q, rx_packets)},
102 	{"bytes", offsetof(struct fm10k_hw_stats_q, rx_bytes)},
103 	{"dropped", offsetof(struct fm10k_hw_stats_q, rx_drops)},
104 };
105 
106 #define FM10K_NB_RX_Q_XSTATS (sizeof(fm10k_hw_stats_rx_q_strings) / \
107 		sizeof(fm10k_hw_stats_rx_q_strings[0]))
108 
109 static const struct fm10k_xstats_name_off fm10k_hw_stats_tx_q_strings[] = {
110 	{"packets", offsetof(struct fm10k_hw_stats_q, tx_packets)},
111 	{"bytes", offsetof(struct fm10k_hw_stats_q, tx_bytes)},
112 };
113 
114 #define FM10K_NB_TX_Q_XSTATS (sizeof(fm10k_hw_stats_tx_q_strings) / \
115 		sizeof(fm10k_hw_stats_tx_q_strings[0]))
116 
117 #define FM10K_NB_XSTATS (FM10K_NB_HW_XSTATS + FM10K_MAX_QUEUES_PF * \
118 		(FM10K_NB_RX_Q_XSTATS + FM10K_NB_TX_Q_XSTATS))
119 static int
120 fm10k_dev_rxq_interrupt_setup(struct rte_eth_dev *dev);
121 
122 static void
123 fm10k_mbx_initlock(struct fm10k_hw *hw)
124 {
125 	rte_spinlock_init(FM10K_DEV_PRIVATE_TO_MBXLOCK(hw->back));
126 }
127 
128 static void
129 fm10k_mbx_lock(struct fm10k_hw *hw)
130 {
131 	while (!rte_spinlock_trylock(FM10K_DEV_PRIVATE_TO_MBXLOCK(hw->back)))
132 		rte_delay_us(FM10K_MBXLOCK_DELAY_US);
133 }
134 
135 static void
136 fm10k_mbx_unlock(struct fm10k_hw *hw)
137 {
138 	rte_spinlock_unlock(FM10K_DEV_PRIVATE_TO_MBXLOCK(hw->back));
139 }
140 
141 /* Stubs needed for linkage when vPMD is disabled */
142 __rte_weak int
143 fm10k_rx_vec_condition_check(__rte_unused struct rte_eth_dev *dev)
144 {
145 	return -1;
146 }
147 
148 __rte_weak uint16_t
149 fm10k_recv_pkts_vec(
150 	__rte_unused void *rx_queue,
151 	__rte_unused struct rte_mbuf **rx_pkts,
152 	__rte_unused uint16_t nb_pkts)
153 {
154 	return 0;
155 }
156 
157 __rte_weak uint16_t
158 fm10k_recv_scattered_pkts_vec(
159 		__rte_unused void *rx_queue,
160 		__rte_unused struct rte_mbuf **rx_pkts,
161 		__rte_unused uint16_t nb_pkts)
162 {
163 	return 0;
164 }
165 
166 __rte_weak int
167 fm10k_rxq_vec_setup(__rte_unused struct fm10k_rx_queue *rxq)
168 
169 {
170 	return -1;
171 }
172 
173 __rte_weak void
174 fm10k_rx_queue_release_mbufs_vec(
175 		__rte_unused struct fm10k_rx_queue *rxq)
176 {
177 	return;
178 }
179 
180 __rte_weak void
181 fm10k_txq_vec_setup(__rte_unused struct fm10k_tx_queue *txq)
182 {
183 	return;
184 }
185 
186 __rte_weak int
187 fm10k_tx_vec_condition_check(__rte_unused struct fm10k_tx_queue *txq)
188 {
189 	return -1;
190 }
191 
192 __rte_weak uint16_t
193 fm10k_xmit_fixed_burst_vec(__rte_unused void *tx_queue,
194 			   __rte_unused struct rte_mbuf **tx_pkts,
195 			   __rte_unused uint16_t nb_pkts)
196 {
197 	return 0;
198 }
199 
200 /*
201  * reset queue to initial state, allocate software buffers used when starting
202  * device.
203  * return 0 on success
204  * return -ENOMEM if buffers cannot be allocated
205  * return -EINVAL if buffers do not satisfy alignment condition
206  */
207 static inline int
208 rx_queue_reset(struct fm10k_rx_queue *q)
209 {
210 	static const union fm10k_rx_desc zero = {{0} };
211 	uint64_t dma_addr;
212 	int i, diag;
213 	PMD_INIT_FUNC_TRACE();
214 
215 	diag = rte_mempool_get_bulk(q->mp, (void **)q->sw_ring, q->nb_desc);
216 	if (diag != 0)
217 		return -ENOMEM;
218 
219 	for (i = 0; i < q->nb_desc; ++i) {
220 		fm10k_pktmbuf_reset(q->sw_ring[i], q->port_id);
221 		if (!fm10k_addr_alignment_valid(q->sw_ring[i])) {
222 			rte_mempool_put_bulk(q->mp, (void **)q->sw_ring,
223 						q->nb_desc);
224 			return -EINVAL;
225 		}
226 		dma_addr = MBUF_DMA_ADDR_DEFAULT(q->sw_ring[i]);
227 		q->hw_ring[i].q.pkt_addr = dma_addr;
228 		q->hw_ring[i].q.hdr_addr = dma_addr;
229 	}
230 
231 	/* initialize extra software ring entries. Space for these extra
232 	 * entries is always allocated.
233 	 */
234 	memset(&q->fake_mbuf, 0x0, sizeof(q->fake_mbuf));
235 	for (i = 0; i < q->nb_fake_desc; ++i) {
236 		q->sw_ring[q->nb_desc + i] = &q->fake_mbuf;
237 		q->hw_ring[q->nb_desc + i] = zero;
238 	}
239 
240 	q->next_dd = 0;
241 	q->next_alloc = 0;
242 	q->next_trigger = q->alloc_thresh - 1;
243 	FM10K_PCI_REG_WRITE(q->tail_ptr, q->nb_desc - 1);
244 	q->rxrearm_start = 0;
245 	q->rxrearm_nb = 0;
246 
247 	return 0;
248 }
249 
250 /*
251  * clean queue, descriptor rings, free software buffers used when stopping
252  * device.
253  */
254 static inline void
255 rx_queue_clean(struct fm10k_rx_queue *q)
256 {
257 	union fm10k_rx_desc zero = {.q = {0, 0, 0, 0} };
258 	uint32_t i;
259 	PMD_INIT_FUNC_TRACE();
260 
261 	/* zero descriptor rings */
262 	for (i = 0; i < q->nb_desc; ++i)
263 		q->hw_ring[i] = zero;
264 
265 	/* zero faked descriptors */
266 	for (i = 0; i < q->nb_fake_desc; ++i)
267 		q->hw_ring[q->nb_desc + i] = zero;
268 
269 	/* vPMD driver has a different way of releasing mbufs. */
270 	if (q->rx_using_sse) {
271 		fm10k_rx_queue_release_mbufs_vec(q);
272 		return;
273 	}
274 
275 	/* free software buffers */
276 	for (i = 0; i < q->nb_desc; ++i) {
277 		if (q->sw_ring[i]) {
278 			rte_pktmbuf_free_seg(q->sw_ring[i]);
279 			q->sw_ring[i] = NULL;
280 		}
281 	}
282 }
283 
284 /*
285  * free all queue memory used when releasing the queue (i.e. configure)
286  */
287 static inline void
288 rx_queue_free(struct fm10k_rx_queue *q)
289 {
290 	PMD_INIT_FUNC_TRACE();
291 	if (q) {
292 		PMD_INIT_LOG(DEBUG, "Freeing rx queue %p", q);
293 		rx_queue_clean(q);
294 		if (q->sw_ring) {
295 			rte_free(q->sw_ring);
296 			q->sw_ring = NULL;
297 		}
298 		rte_free(q);
299 		q = NULL;
300 	}
301 }
302 
303 /*
304  * disable RX queue, wait unitl HW finished necessary flush operation
305  */
306 static inline int
307 rx_queue_disable(struct fm10k_hw *hw, uint16_t qnum)
308 {
309 	uint32_t reg, i;
310 
311 	reg = FM10K_READ_REG(hw, FM10K_RXQCTL(qnum));
312 	FM10K_WRITE_REG(hw, FM10K_RXQCTL(qnum),
313 			reg & ~FM10K_RXQCTL_ENABLE);
314 
315 	/* Wait 100us at most */
316 	for (i = 0; i < FM10K_QUEUE_DISABLE_TIMEOUT; i++) {
317 		rte_delay_us(1);
318 		reg = FM10K_READ_REG(hw, FM10K_RXQCTL(qnum));
319 		if (!(reg & FM10K_RXQCTL_ENABLE))
320 			break;
321 	}
322 
323 	if (i == FM10K_QUEUE_DISABLE_TIMEOUT)
324 		return -1;
325 
326 	return 0;
327 }
328 
329 /*
330  * reset queue to initial state, allocate software buffers used when starting
331  * device
332  */
333 static inline void
334 tx_queue_reset(struct fm10k_tx_queue *q)
335 {
336 	PMD_INIT_FUNC_TRACE();
337 	q->last_free = 0;
338 	q->next_free = 0;
339 	q->nb_used = 0;
340 	q->nb_free = q->nb_desc - 1;
341 	fifo_reset(&q->rs_tracker, (q->nb_desc + 1) / q->rs_thresh);
342 	FM10K_PCI_REG_WRITE(q->tail_ptr, 0);
343 }
344 
345 /*
346  * clean queue, descriptor rings, free software buffers used when stopping
347  * device
348  */
349 static inline void
350 tx_queue_clean(struct fm10k_tx_queue *q)
351 {
352 	struct fm10k_tx_desc zero = {0, 0, 0, 0, 0, 0};
353 	uint32_t i;
354 	PMD_INIT_FUNC_TRACE();
355 
356 	/* zero descriptor rings */
357 	for (i = 0; i < q->nb_desc; ++i)
358 		q->hw_ring[i] = zero;
359 
360 	/* free software buffers */
361 	for (i = 0; i < q->nb_desc; ++i) {
362 		if (q->sw_ring[i]) {
363 			rte_pktmbuf_free_seg(q->sw_ring[i]);
364 			q->sw_ring[i] = NULL;
365 		}
366 	}
367 }
368 
369 /*
370  * free all queue memory used when releasing the queue (i.e. configure)
371  */
372 static inline void
373 tx_queue_free(struct fm10k_tx_queue *q)
374 {
375 	PMD_INIT_FUNC_TRACE();
376 	if (q) {
377 		PMD_INIT_LOG(DEBUG, "Freeing tx queue %p", q);
378 		tx_queue_clean(q);
379 		if (q->rs_tracker.list) {
380 			rte_free(q->rs_tracker.list);
381 			q->rs_tracker.list = NULL;
382 		}
383 		if (q->sw_ring) {
384 			rte_free(q->sw_ring);
385 			q->sw_ring = NULL;
386 		}
387 		rte_free(q);
388 		q = NULL;
389 	}
390 }
391 
392 /*
393  * disable TX queue, wait unitl HW finished necessary flush operation
394  */
395 static inline int
396 tx_queue_disable(struct fm10k_hw *hw, uint16_t qnum)
397 {
398 	uint32_t reg, i;
399 
400 	reg = FM10K_READ_REG(hw, FM10K_TXDCTL(qnum));
401 	FM10K_WRITE_REG(hw, FM10K_TXDCTL(qnum),
402 			reg & ~FM10K_TXDCTL_ENABLE);
403 
404 	/* Wait 100us at most */
405 	for (i = 0; i < FM10K_QUEUE_DISABLE_TIMEOUT; i++) {
406 		rte_delay_us(1);
407 		reg = FM10K_READ_REG(hw, FM10K_TXDCTL(qnum));
408 		if (!(reg & FM10K_TXDCTL_ENABLE))
409 			break;
410 	}
411 
412 	if (i == FM10K_QUEUE_DISABLE_TIMEOUT)
413 		return -1;
414 
415 	return 0;
416 }
417 
418 static int
419 fm10k_check_mq_mode(struct rte_eth_dev *dev)
420 {
421 	enum rte_eth_rx_mq_mode rx_mq_mode = dev->data->dev_conf.rxmode.mq_mode;
422 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
423 	struct rte_eth_vmdq_rx_conf *vmdq_conf;
424 	uint16_t nb_rx_q = dev->data->nb_rx_queues;
425 
426 	vmdq_conf = &dev->data->dev_conf.rx_adv_conf.vmdq_rx_conf;
427 
428 	if (rx_mq_mode & ETH_MQ_RX_DCB_FLAG) {
429 		PMD_INIT_LOG(ERR, "DCB mode is not supported.");
430 		return -EINVAL;
431 	}
432 
433 	if (!(rx_mq_mode & ETH_MQ_RX_VMDQ_FLAG))
434 		return 0;
435 
436 	if (hw->mac.type == fm10k_mac_vf) {
437 		PMD_INIT_LOG(ERR, "VMDQ mode is not supported in VF.");
438 		return -EINVAL;
439 	}
440 
441 	/* Check VMDQ queue pool number */
442 	if (vmdq_conf->nb_queue_pools >
443 			sizeof(vmdq_conf->pool_map[0].pools) * CHAR_BIT ||
444 			vmdq_conf->nb_queue_pools > nb_rx_q) {
445 		PMD_INIT_LOG(ERR, "Too many of queue pools: %d",
446 			vmdq_conf->nb_queue_pools);
447 		return -EINVAL;
448 	}
449 
450 	return 0;
451 }
452 
453 static const struct fm10k_txq_ops def_txq_ops = {
454 	.reset = tx_queue_reset,
455 };
456 
457 static int
458 fm10k_dev_configure(struct rte_eth_dev *dev)
459 {
460 	int ret;
461 
462 	PMD_INIT_FUNC_TRACE();
463 
464 	if (dev->data->dev_conf.rxmode.mq_mode & ETH_MQ_RX_RSS_FLAG)
465 		dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
466 
467 	/* multipe queue mode checking */
468 	ret  = fm10k_check_mq_mode(dev);
469 	if (ret != 0) {
470 		PMD_DRV_LOG(ERR, "fm10k_check_mq_mode fails with %d.",
471 			    ret);
472 		return ret;
473 	}
474 
475 	dev->data->scattered_rx = 0;
476 
477 	return 0;
478 }
479 
480 static void
481 fm10k_dev_vmdq_rx_configure(struct rte_eth_dev *dev)
482 {
483 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
484 	struct rte_eth_vmdq_rx_conf *vmdq_conf;
485 	uint32_t i;
486 
487 	vmdq_conf = &dev->data->dev_conf.rx_adv_conf.vmdq_rx_conf;
488 
489 	for (i = 0; i < vmdq_conf->nb_pool_maps; i++) {
490 		if (!vmdq_conf->pool_map[i].pools)
491 			continue;
492 		fm10k_mbx_lock(hw);
493 		fm10k_update_vlan(hw, vmdq_conf->pool_map[i].vlan_id, 0, true);
494 		fm10k_mbx_unlock(hw);
495 	}
496 }
497 
498 static void
499 fm10k_dev_pf_main_vsi_reset(struct rte_eth_dev *dev)
500 {
501 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
502 
503 	/* Add default mac address */
504 	fm10k_MAC_filter_set(dev, hw->mac.addr, true,
505 		MAIN_VSI_POOL_NUMBER);
506 }
507 
508 static void
509 fm10k_dev_rss_configure(struct rte_eth_dev *dev)
510 {
511 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
512 	struct rte_eth_conf *dev_conf = &dev->data->dev_conf;
513 	uint32_t mrqc, *key, i, reta, j;
514 	uint64_t hf;
515 
516 #define RSS_KEY_SIZE 40
517 	static uint8_t rss_intel_key[RSS_KEY_SIZE] = {
518 		0x6D, 0x5A, 0x56, 0xDA, 0x25, 0x5B, 0x0E, 0xC2,
519 		0x41, 0x67, 0x25, 0x3D, 0x43, 0xA3, 0x8F, 0xB0,
520 		0xD0, 0xCA, 0x2B, 0xCB, 0xAE, 0x7B, 0x30, 0xB4,
521 		0x77, 0xCB, 0x2D, 0xA3, 0x80, 0x30, 0xF2, 0x0C,
522 		0x6A, 0x42, 0xB7, 0x3B, 0xBE, 0xAC, 0x01, 0xFA,
523 	};
524 
525 	if (dev_conf->rxmode.mq_mode != ETH_MQ_RX_RSS ||
526 		dev_conf->rx_adv_conf.rss_conf.rss_hf == 0) {
527 		FM10K_WRITE_REG(hw, FM10K_MRQC(0), 0);
528 		return;
529 	}
530 
531 	/* random key is rss_intel_key (default) or user provided (rss_key) */
532 	if (dev_conf->rx_adv_conf.rss_conf.rss_key == NULL)
533 		key = (uint32_t *)rss_intel_key;
534 	else
535 		key = (uint32_t *)dev_conf->rx_adv_conf.rss_conf.rss_key;
536 
537 	/* Now fill our hash function seeds, 4 bytes at a time */
538 	for (i = 0; i < RSS_KEY_SIZE / sizeof(*key); ++i)
539 		FM10K_WRITE_REG(hw, FM10K_RSSRK(0, i), key[i]);
540 
541 	/*
542 	 * Fill in redirection table
543 	 * The byte-swap is needed because NIC registers are in
544 	 * little-endian order.
545 	 */
546 	reta = 0;
547 	for (i = 0, j = 0; i < FM10K_MAX_RSS_INDICES; i++, j++) {
548 		if (j == dev->data->nb_rx_queues)
549 			j = 0;
550 		reta = (reta << CHAR_BIT) | j;
551 		if ((i & 3) == 3)
552 			FM10K_WRITE_REG(hw, FM10K_RETA(0, i >> 2),
553 					rte_bswap32(reta));
554 	}
555 
556 	/*
557 	 * Generate RSS hash based on packet types, TCP/UDP
558 	 * port numbers and/or IPv4/v6 src and dst addresses
559 	 */
560 	hf = dev_conf->rx_adv_conf.rss_conf.rss_hf;
561 	mrqc = 0;
562 	mrqc |= (hf & ETH_RSS_IPV4)              ? FM10K_MRQC_IPV4     : 0;
563 	mrqc |= (hf & ETH_RSS_IPV6)              ? FM10K_MRQC_IPV6     : 0;
564 	mrqc |= (hf & ETH_RSS_IPV6_EX)           ? FM10K_MRQC_IPV6     : 0;
565 	mrqc |= (hf & ETH_RSS_NONFRAG_IPV4_TCP)  ? FM10K_MRQC_TCP_IPV4 : 0;
566 	mrqc |= (hf & ETH_RSS_NONFRAG_IPV6_TCP)  ? FM10K_MRQC_TCP_IPV6 : 0;
567 	mrqc |= (hf & ETH_RSS_IPV6_TCP_EX)       ? FM10K_MRQC_TCP_IPV6 : 0;
568 	mrqc |= (hf & ETH_RSS_NONFRAG_IPV4_UDP)  ? FM10K_MRQC_UDP_IPV4 : 0;
569 	mrqc |= (hf & ETH_RSS_NONFRAG_IPV6_UDP)  ? FM10K_MRQC_UDP_IPV6 : 0;
570 	mrqc |= (hf & ETH_RSS_IPV6_UDP_EX)       ? FM10K_MRQC_UDP_IPV6 : 0;
571 
572 	if (mrqc == 0) {
573 		PMD_INIT_LOG(ERR, "Specified RSS mode 0x%"PRIx64"is not"
574 			"supported", hf);
575 		return;
576 	}
577 
578 	FM10K_WRITE_REG(hw, FM10K_MRQC(0), mrqc);
579 }
580 
581 static void
582 fm10k_dev_logic_port_update(struct rte_eth_dev *dev, uint16_t nb_lport_new)
583 {
584 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
585 	uint32_t i;
586 
587 	for (i = 0; i < nb_lport_new; i++) {
588 		/* Set unicast mode by default. App can change
589 		 * to other mode in other API func.
590 		 */
591 		fm10k_mbx_lock(hw);
592 		hw->mac.ops.update_xcast_mode(hw, hw->mac.dglort_map + i,
593 			FM10K_XCAST_MODE_NONE);
594 		fm10k_mbx_unlock(hw);
595 	}
596 }
597 
598 static void
599 fm10k_dev_mq_rx_configure(struct rte_eth_dev *dev)
600 {
601 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
602 	struct rte_eth_vmdq_rx_conf *vmdq_conf;
603 	struct rte_eth_conf *dev_conf = &dev->data->dev_conf;
604 	struct fm10k_macvlan_filter_info *macvlan;
605 	uint16_t nb_queue_pools = 0; /* pool number in configuration */
606 	uint16_t nb_lport_new;
607 
608 	macvlan = FM10K_DEV_PRIVATE_TO_MACVLAN(dev->data->dev_private);
609 	vmdq_conf = &dev->data->dev_conf.rx_adv_conf.vmdq_rx_conf;
610 
611 	fm10k_dev_rss_configure(dev);
612 
613 	/* only PF supports VMDQ */
614 	if (hw->mac.type != fm10k_mac_pf)
615 		return;
616 
617 	if (dev_conf->rxmode.mq_mode & ETH_MQ_RX_VMDQ_FLAG)
618 		nb_queue_pools = vmdq_conf->nb_queue_pools;
619 
620 	/* no pool number change, no need to update logic port and VLAN/MAC */
621 	if (macvlan->nb_queue_pools == nb_queue_pools)
622 		return;
623 
624 	nb_lport_new = nb_queue_pools ? nb_queue_pools : 1;
625 	fm10k_dev_logic_port_update(dev, nb_lport_new);
626 
627 	/* reset MAC/VLAN as it's based on VMDQ or PF main VSI */
628 	memset(dev->data->mac_addrs, 0,
629 		RTE_ETHER_ADDR_LEN * FM10K_MAX_MACADDR_NUM);
630 	rte_ether_addr_copy((const struct rte_ether_addr *)hw->mac.addr,
631 		&dev->data->mac_addrs[0]);
632 	memset(macvlan, 0, sizeof(*macvlan));
633 	macvlan->nb_queue_pools = nb_queue_pools;
634 
635 	if (nb_queue_pools)
636 		fm10k_dev_vmdq_rx_configure(dev);
637 	else
638 		fm10k_dev_pf_main_vsi_reset(dev);
639 }
640 
641 static int
642 fm10k_dev_tx_init(struct rte_eth_dev *dev)
643 {
644 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
645 	int i, ret;
646 	struct fm10k_tx_queue *txq;
647 	uint64_t base_addr;
648 	uint32_t size;
649 
650 	/* Disable TXINT to avoid possible interrupt */
651 	for (i = 0; i < hw->mac.max_queues; i++)
652 		FM10K_WRITE_REG(hw, FM10K_TXINT(i),
653 				3 << FM10K_TXINT_TIMER_SHIFT);
654 
655 	/* Setup TX queue */
656 	for (i = 0; i < dev->data->nb_tx_queues; ++i) {
657 		txq = dev->data->tx_queues[i];
658 		base_addr = txq->hw_ring_phys_addr;
659 		size = txq->nb_desc * sizeof(struct fm10k_tx_desc);
660 
661 		/* disable queue to avoid issues while updating state */
662 		ret = tx_queue_disable(hw, i);
663 		if (ret) {
664 			PMD_INIT_LOG(ERR, "failed to disable queue %d", i);
665 			return -1;
666 		}
667 		/* Enable use of FTAG bit in TX descriptor, PFVTCTL
668 		 * register is read-only for VF.
669 		 */
670 		if (fm10k_check_ftag(dev->device->devargs)) {
671 			if (hw->mac.type == fm10k_mac_pf) {
672 				FM10K_WRITE_REG(hw, FM10K_PFVTCTL(i),
673 						FM10K_PFVTCTL_FTAG_DESC_ENABLE);
674 				PMD_INIT_LOG(DEBUG, "FTAG mode is enabled");
675 			} else {
676 				PMD_INIT_LOG(ERR, "VF FTAG is not supported.");
677 				return -ENOTSUP;
678 			}
679 		}
680 
681 		/* set location and size for descriptor ring */
682 		FM10K_WRITE_REG(hw, FM10K_TDBAL(i),
683 				base_addr & UINT64_LOWER_32BITS_MASK);
684 		FM10K_WRITE_REG(hw, FM10K_TDBAH(i),
685 				base_addr >> (CHAR_BIT * sizeof(uint32_t)));
686 		FM10K_WRITE_REG(hw, FM10K_TDLEN(i), size);
687 
688 		/* assign default SGLORT for each TX queue by PF */
689 		if (hw->mac.type == fm10k_mac_pf)
690 			FM10K_WRITE_REG(hw, FM10K_TX_SGLORT(i), hw->mac.dglort_map);
691 	}
692 
693 	/* set up vector or scalar TX function as appropriate */
694 	fm10k_set_tx_function(dev);
695 
696 	return 0;
697 }
698 
699 static int
700 fm10k_dev_rx_init(struct rte_eth_dev *dev)
701 {
702 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
703 	struct fm10k_macvlan_filter_info *macvlan;
704 	struct rte_pci_device *pdev = RTE_ETH_DEV_TO_PCI(dev);
705 	struct rte_intr_handle *intr_handle = &pdev->intr_handle;
706 	int i, ret;
707 	struct fm10k_rx_queue *rxq;
708 	uint64_t base_addr;
709 	uint32_t size;
710 	uint32_t rxdctl = FM10K_RXDCTL_WRITE_BACK_MIN_DELAY;
711 	uint32_t logic_port = hw->mac.dglort_map;
712 	uint16_t buf_size;
713 	uint16_t queue_stride = 0;
714 
715 	/* enable RXINT for interrupt mode */
716 	i = 0;
717 	if (rte_intr_dp_is_en(intr_handle)) {
718 		for (; i < dev->data->nb_rx_queues; i++) {
719 			FM10K_WRITE_REG(hw, FM10K_RXINT(i), Q2V(pdev, i));
720 			if (hw->mac.type == fm10k_mac_pf)
721 				FM10K_WRITE_REG(hw, FM10K_ITR(Q2V(pdev, i)),
722 					FM10K_ITR_AUTOMASK |
723 					FM10K_ITR_MASK_CLEAR);
724 			else
725 				FM10K_WRITE_REG(hw, FM10K_VFITR(Q2V(pdev, i)),
726 					FM10K_ITR_AUTOMASK |
727 					FM10K_ITR_MASK_CLEAR);
728 		}
729 	}
730 	/* Disable other RXINT to avoid possible interrupt */
731 	for (; i < hw->mac.max_queues; i++)
732 		FM10K_WRITE_REG(hw, FM10K_RXINT(i),
733 			3 << FM10K_RXINT_TIMER_SHIFT);
734 
735 	/* Setup RX queues */
736 	for (i = 0; i < dev->data->nb_rx_queues; ++i) {
737 		rxq = dev->data->rx_queues[i];
738 		base_addr = rxq->hw_ring_phys_addr;
739 		size = rxq->nb_desc * sizeof(union fm10k_rx_desc);
740 
741 		/* disable queue to avoid issues while updating state */
742 		ret = rx_queue_disable(hw, i);
743 		if (ret) {
744 			PMD_INIT_LOG(ERR, "failed to disable queue %d", i);
745 			return -1;
746 		}
747 
748 		/* Setup the Base and Length of the Rx Descriptor Ring */
749 		FM10K_WRITE_REG(hw, FM10K_RDBAL(i),
750 				base_addr & UINT64_LOWER_32BITS_MASK);
751 		FM10K_WRITE_REG(hw, FM10K_RDBAH(i),
752 				base_addr >> (CHAR_BIT * sizeof(uint32_t)));
753 		FM10K_WRITE_REG(hw, FM10K_RDLEN(i), size);
754 
755 		/* Configure the Rx buffer size for one buff without split */
756 		buf_size = (uint16_t)(rte_pktmbuf_data_room_size(rxq->mp) -
757 			RTE_PKTMBUF_HEADROOM);
758 		/* As RX buffer is aligned to 512B within mbuf, some bytes are
759 		 * reserved for this purpose, and the worst case could be 511B.
760 		 * But SRR reg assumes all buffers have the same size. In order
761 		 * to fill the gap, we'll have to consider the worst case and
762 		 * assume 512B is reserved. If we don't do so, it's possible
763 		 * for HW to overwrite data to next mbuf.
764 		 */
765 		buf_size -= FM10K_RX_DATABUF_ALIGN;
766 
767 		FM10K_WRITE_REG(hw, FM10K_SRRCTL(i),
768 				(buf_size >> FM10K_SRRCTL_BSIZEPKT_SHIFT) |
769 				FM10K_SRRCTL_LOOPBACK_SUPPRESS);
770 
771 		/* It adds dual VLAN length for supporting dual VLAN */
772 		if ((dev->data->dev_conf.rxmode.max_rx_pkt_len +
773 				2 * FM10K_VLAN_TAG_SIZE) > buf_size ||
774 			rxq->offloads & DEV_RX_OFFLOAD_SCATTER) {
775 			uint32_t reg;
776 			dev->data->scattered_rx = 1;
777 			reg = FM10K_READ_REG(hw, FM10K_SRRCTL(i));
778 			reg |= FM10K_SRRCTL_BUFFER_CHAINING_EN;
779 			FM10K_WRITE_REG(hw, FM10K_SRRCTL(i), reg);
780 		}
781 
782 		/* Enable drop on empty, it's RO for VF */
783 		if (hw->mac.type == fm10k_mac_pf && rxq->drop_en)
784 			rxdctl |= FM10K_RXDCTL_DROP_ON_EMPTY;
785 
786 		FM10K_WRITE_REG(hw, FM10K_RXDCTL(i), rxdctl);
787 		FM10K_WRITE_FLUSH(hw);
788 	}
789 
790 	/* Configure VMDQ/RSS if applicable */
791 	fm10k_dev_mq_rx_configure(dev);
792 
793 	/* Decide the best RX function */
794 	fm10k_set_rx_function(dev);
795 
796 	/* update RX_SGLORT for loopback suppress*/
797 	if (hw->mac.type != fm10k_mac_pf)
798 		return 0;
799 	macvlan = FM10K_DEV_PRIVATE_TO_MACVLAN(dev->data->dev_private);
800 	if (macvlan->nb_queue_pools)
801 		queue_stride = dev->data->nb_rx_queues / macvlan->nb_queue_pools;
802 	for (i = 0; i < dev->data->nb_rx_queues; ++i) {
803 		if (i && queue_stride && !(i % queue_stride))
804 			logic_port++;
805 		FM10K_WRITE_REG(hw, FM10K_RX_SGLORT(i), logic_port);
806 	}
807 
808 	return 0;
809 }
810 
811 static int
812 fm10k_dev_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id)
813 {
814 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
815 	int err;
816 	uint32_t reg;
817 	struct fm10k_rx_queue *rxq;
818 
819 	PMD_INIT_FUNC_TRACE();
820 
821 	rxq = dev->data->rx_queues[rx_queue_id];
822 	err = rx_queue_reset(rxq);
823 	if (err == -ENOMEM) {
824 		PMD_INIT_LOG(ERR, "Failed to alloc memory : %d", err);
825 		return err;
826 	} else if (err == -EINVAL) {
827 		PMD_INIT_LOG(ERR, "Invalid buffer address alignment :"
828 			" %d", err);
829 		return err;
830 	}
831 
832 	/* Setup the HW Rx Head and Tail Descriptor Pointers
833 	 * Note: this must be done AFTER the queue is enabled on real
834 	 * hardware, but BEFORE the queue is enabled when using the
835 	 * emulation platform. Do it in both places for now and remove
836 	 * this comment and the following two register writes when the
837 	 * emulation platform is no longer being used.
838 	 */
839 	FM10K_WRITE_REG(hw, FM10K_RDH(rx_queue_id), 0);
840 	FM10K_WRITE_REG(hw, FM10K_RDT(rx_queue_id), rxq->nb_desc - 1);
841 
842 	/* Set PF ownership flag for PF devices */
843 	reg = FM10K_READ_REG(hw, FM10K_RXQCTL(rx_queue_id));
844 	if (hw->mac.type == fm10k_mac_pf)
845 		reg |= FM10K_RXQCTL_PF;
846 	reg |= FM10K_RXQCTL_ENABLE;
847 	/* enable RX queue */
848 	FM10K_WRITE_REG(hw, FM10K_RXQCTL(rx_queue_id), reg);
849 	FM10K_WRITE_FLUSH(hw);
850 
851 	/* Setup the HW Rx Head and Tail Descriptor Pointers
852 	 * Note: this must be done AFTER the queue is enabled
853 	 */
854 	FM10K_WRITE_REG(hw, FM10K_RDH(rx_queue_id), 0);
855 	FM10K_WRITE_REG(hw, FM10K_RDT(rx_queue_id), rxq->nb_desc - 1);
856 	dev->data->rx_queue_state[rx_queue_id] = RTE_ETH_QUEUE_STATE_STARTED;
857 
858 	return 0;
859 }
860 
861 static int
862 fm10k_dev_rx_queue_stop(struct rte_eth_dev *dev, uint16_t rx_queue_id)
863 {
864 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
865 
866 	PMD_INIT_FUNC_TRACE();
867 
868 	/* Disable RX queue */
869 	rx_queue_disable(hw, rx_queue_id);
870 
871 	/* Free mbuf and clean HW ring */
872 	rx_queue_clean(dev->data->rx_queues[rx_queue_id]);
873 	dev->data->rx_queue_state[rx_queue_id] = RTE_ETH_QUEUE_STATE_STOPPED;
874 
875 	return 0;
876 }
877 
878 static int
879 fm10k_dev_tx_queue_start(struct rte_eth_dev *dev, uint16_t tx_queue_id)
880 {
881 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
882 	/** @todo - this should be defined in the shared code */
883 #define FM10K_TXDCTL_WRITE_BACK_MIN_DELAY	0x00010000
884 	uint32_t txdctl = FM10K_TXDCTL_WRITE_BACK_MIN_DELAY;
885 	struct fm10k_tx_queue *q = dev->data->tx_queues[tx_queue_id];
886 
887 	PMD_INIT_FUNC_TRACE();
888 
889 	q->ops->reset(q);
890 
891 	/* reset head and tail pointers */
892 	FM10K_WRITE_REG(hw, FM10K_TDH(tx_queue_id), 0);
893 	FM10K_WRITE_REG(hw, FM10K_TDT(tx_queue_id), 0);
894 
895 	/* enable TX queue */
896 	FM10K_WRITE_REG(hw, FM10K_TXDCTL(tx_queue_id),
897 				FM10K_TXDCTL_ENABLE | txdctl);
898 	FM10K_WRITE_FLUSH(hw);
899 	dev->data->tx_queue_state[tx_queue_id] = RTE_ETH_QUEUE_STATE_STARTED;
900 
901 	return 0;
902 }
903 
904 static int
905 fm10k_dev_tx_queue_stop(struct rte_eth_dev *dev, uint16_t tx_queue_id)
906 {
907 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
908 
909 	PMD_INIT_FUNC_TRACE();
910 
911 	tx_queue_disable(hw, tx_queue_id);
912 	tx_queue_clean(dev->data->tx_queues[tx_queue_id]);
913 	dev->data->tx_queue_state[tx_queue_id] = RTE_ETH_QUEUE_STATE_STOPPED;
914 
915 	return 0;
916 }
917 
918 static inline int fm10k_glort_valid(struct fm10k_hw *hw)
919 {
920 	return ((hw->mac.dglort_map & FM10K_DGLORTMAP_NONE)
921 		!= FM10K_DGLORTMAP_NONE);
922 }
923 
924 static int
925 fm10k_dev_promiscuous_enable(struct rte_eth_dev *dev)
926 {
927 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
928 	int status;
929 
930 	PMD_INIT_FUNC_TRACE();
931 
932 	/* Return if it didn't acquire valid glort range */
933 	if ((hw->mac.type == fm10k_mac_pf) && !fm10k_glort_valid(hw))
934 		return 0;
935 
936 	fm10k_mbx_lock(hw);
937 	status = hw->mac.ops.update_xcast_mode(hw, hw->mac.dglort_map,
938 				FM10K_XCAST_MODE_PROMISC);
939 	fm10k_mbx_unlock(hw);
940 
941 	if (status != FM10K_SUCCESS) {
942 		PMD_INIT_LOG(ERR, "Failed to enable promiscuous mode");
943 		return -EAGAIN;
944 	}
945 
946 	return 0;
947 }
948 
949 static int
950 fm10k_dev_promiscuous_disable(struct rte_eth_dev *dev)
951 {
952 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
953 	uint8_t mode;
954 	int status;
955 
956 	PMD_INIT_FUNC_TRACE();
957 
958 	/* Return if it didn't acquire valid glort range */
959 	if ((hw->mac.type == fm10k_mac_pf) && !fm10k_glort_valid(hw))
960 		return 0;
961 
962 	if (dev->data->all_multicast == 1)
963 		mode = FM10K_XCAST_MODE_ALLMULTI;
964 	else
965 		mode = FM10K_XCAST_MODE_NONE;
966 
967 	fm10k_mbx_lock(hw);
968 	status = hw->mac.ops.update_xcast_mode(hw, hw->mac.dglort_map,
969 				mode);
970 	fm10k_mbx_unlock(hw);
971 
972 	if (status != FM10K_SUCCESS) {
973 		PMD_INIT_LOG(ERR, "Failed to disable promiscuous mode");
974 		return -EAGAIN;
975 	}
976 
977 	return 0;
978 }
979 
980 static int
981 fm10k_dev_allmulticast_enable(struct rte_eth_dev *dev)
982 {
983 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
984 	int status;
985 
986 	PMD_INIT_FUNC_TRACE();
987 
988 	/* Return if it didn't acquire valid glort range */
989 	if ((hw->mac.type == fm10k_mac_pf) && !fm10k_glort_valid(hw))
990 		return 0;
991 
992 	/* If promiscuous mode is enabled, it doesn't make sense to enable
993 	 * allmulticast and disable promiscuous since fm10k only can select
994 	 * one of the modes.
995 	 */
996 	if (dev->data->promiscuous) {
997 		PMD_INIT_LOG(INFO, "Promiscuous mode is enabled, "\
998 			"needn't enable allmulticast");
999 		return 0;
1000 	}
1001 
1002 	fm10k_mbx_lock(hw);
1003 	status = hw->mac.ops.update_xcast_mode(hw, hw->mac.dglort_map,
1004 				FM10K_XCAST_MODE_ALLMULTI);
1005 	fm10k_mbx_unlock(hw);
1006 
1007 	if (status != FM10K_SUCCESS) {
1008 		PMD_INIT_LOG(ERR, "Failed to enable allmulticast mode");
1009 		return -EAGAIN;
1010 	}
1011 
1012 	return 0;
1013 }
1014 
1015 static int
1016 fm10k_dev_allmulticast_disable(struct rte_eth_dev *dev)
1017 {
1018 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1019 	int status;
1020 
1021 	PMD_INIT_FUNC_TRACE();
1022 
1023 	/* Return if it didn't acquire valid glort range */
1024 	if ((hw->mac.type == fm10k_mac_pf) && !fm10k_glort_valid(hw))
1025 		return 0;
1026 
1027 	if (dev->data->promiscuous) {
1028 		PMD_INIT_LOG(ERR, "Failed to disable allmulticast mode "\
1029 			"since promisc mode is enabled");
1030 		return -EINVAL;
1031 	}
1032 
1033 	fm10k_mbx_lock(hw);
1034 	/* Change mode to unicast mode */
1035 	status = hw->mac.ops.update_xcast_mode(hw, hw->mac.dglort_map,
1036 				FM10K_XCAST_MODE_NONE);
1037 	fm10k_mbx_unlock(hw);
1038 
1039 	if (status != FM10K_SUCCESS) {
1040 		PMD_INIT_LOG(ERR, "Failed to disable allmulticast mode");
1041 		return -EAGAIN;
1042 	}
1043 
1044 	return 0;
1045 }
1046 
1047 static void
1048 fm10k_dev_dglort_map_configure(struct rte_eth_dev *dev)
1049 {
1050 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1051 	uint32_t dglortdec, pool_len, rss_len, i, dglortmask;
1052 	uint16_t nb_queue_pools;
1053 	struct fm10k_macvlan_filter_info *macvlan;
1054 
1055 	macvlan = FM10K_DEV_PRIVATE_TO_MACVLAN(dev->data->dev_private);
1056 	nb_queue_pools = macvlan->nb_queue_pools;
1057 	pool_len = nb_queue_pools ? rte_fls_u32(nb_queue_pools - 1) : 0;
1058 	rss_len = rte_fls_u32(dev->data->nb_rx_queues - 1) - pool_len;
1059 
1060 	/* GLORT 0x0-0x3F are used by PF and VMDQ,  0x40-0x7F used by FD */
1061 	dglortdec = (rss_len << FM10K_DGLORTDEC_RSSLENGTH_SHIFT) | pool_len;
1062 	dglortmask = (GLORT_PF_MASK << FM10K_DGLORTMAP_MASK_SHIFT) |
1063 			hw->mac.dglort_map;
1064 	FM10K_WRITE_REG(hw, FM10K_DGLORTMAP(0), dglortmask);
1065 	/* Configure VMDQ/RSS DGlort Decoder */
1066 	FM10K_WRITE_REG(hw, FM10K_DGLORTDEC(0), dglortdec);
1067 
1068 	/* Flow Director configurations, only queue number is valid. */
1069 	dglortdec = rte_fls_u32(dev->data->nb_rx_queues - 1);
1070 	dglortmask = (GLORT_FD_MASK << FM10K_DGLORTMAP_MASK_SHIFT) |
1071 			(hw->mac.dglort_map + GLORT_FD_Q_BASE);
1072 	FM10K_WRITE_REG(hw, FM10K_DGLORTMAP(1), dglortmask);
1073 	FM10K_WRITE_REG(hw, FM10K_DGLORTDEC(1), dglortdec);
1074 
1075 	/* Invalidate all other GLORT entries */
1076 	for (i = 2; i < FM10K_DGLORT_COUNT; i++)
1077 		FM10K_WRITE_REG(hw, FM10K_DGLORTMAP(i),
1078 				FM10K_DGLORTMAP_NONE);
1079 }
1080 
1081 #define BSIZEPKT_ROUNDUP ((1 << FM10K_SRRCTL_BSIZEPKT_SHIFT) - 1)
1082 static int
1083 fm10k_dev_start(struct rte_eth_dev *dev)
1084 {
1085 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1086 	int i, diag;
1087 
1088 	PMD_INIT_FUNC_TRACE();
1089 
1090 	/* stop, init, then start the hw */
1091 	diag = fm10k_stop_hw(hw);
1092 	if (diag != FM10K_SUCCESS) {
1093 		PMD_INIT_LOG(ERR, "Hardware stop failed: %d", diag);
1094 		return -EIO;
1095 	}
1096 
1097 	diag = fm10k_init_hw(hw);
1098 	if (diag != FM10K_SUCCESS) {
1099 		PMD_INIT_LOG(ERR, "Hardware init failed: %d", diag);
1100 		return -EIO;
1101 	}
1102 
1103 	diag = fm10k_start_hw(hw);
1104 	if (diag != FM10K_SUCCESS) {
1105 		PMD_INIT_LOG(ERR, "Hardware start failed: %d", diag);
1106 		return -EIO;
1107 	}
1108 
1109 	diag = fm10k_dev_tx_init(dev);
1110 	if (diag) {
1111 		PMD_INIT_LOG(ERR, "TX init failed: %d", diag);
1112 		return diag;
1113 	}
1114 
1115 	if (fm10k_dev_rxq_interrupt_setup(dev))
1116 		return -EIO;
1117 
1118 	diag = fm10k_dev_rx_init(dev);
1119 	if (diag) {
1120 		PMD_INIT_LOG(ERR, "RX init failed: %d", diag);
1121 		return diag;
1122 	}
1123 
1124 	if (hw->mac.type == fm10k_mac_pf)
1125 		fm10k_dev_dglort_map_configure(dev);
1126 
1127 	for (i = 0; i < dev->data->nb_rx_queues; i++) {
1128 		struct fm10k_rx_queue *rxq;
1129 		rxq = dev->data->rx_queues[i];
1130 
1131 		if (rxq->rx_deferred_start)
1132 			continue;
1133 		diag = fm10k_dev_rx_queue_start(dev, i);
1134 		if (diag != 0) {
1135 			int j;
1136 			for (j = 0; j < i; ++j)
1137 				rx_queue_clean(dev->data->rx_queues[j]);
1138 			return diag;
1139 		}
1140 	}
1141 
1142 	for (i = 0; i < dev->data->nb_tx_queues; i++) {
1143 		struct fm10k_tx_queue *txq;
1144 		txq = dev->data->tx_queues[i];
1145 
1146 		if (txq->tx_deferred_start)
1147 			continue;
1148 		diag = fm10k_dev_tx_queue_start(dev, i);
1149 		if (diag != 0) {
1150 			int j;
1151 			for (j = 0; j < i; ++j)
1152 				tx_queue_clean(dev->data->tx_queues[j]);
1153 			for (j = 0; j < dev->data->nb_rx_queues; ++j)
1154 				rx_queue_clean(dev->data->rx_queues[j]);
1155 			return diag;
1156 		}
1157 	}
1158 
1159 	/* Update default vlan when not in VMDQ mode */
1160 	if (!(dev->data->dev_conf.rxmode.mq_mode & ETH_MQ_RX_VMDQ_FLAG))
1161 		fm10k_vlan_filter_set(dev, hw->mac.default_vid, true);
1162 
1163 	fm10k_link_update(dev, 0);
1164 
1165 	return 0;
1166 }
1167 
1168 static void
1169 fm10k_dev_stop(struct rte_eth_dev *dev)
1170 {
1171 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1172 	struct rte_pci_device *pdev = RTE_ETH_DEV_TO_PCI(dev);
1173 	struct rte_intr_handle *intr_handle = &pdev->intr_handle;
1174 	int i;
1175 
1176 	PMD_INIT_FUNC_TRACE();
1177 
1178 	if (dev->data->tx_queues)
1179 		for (i = 0; i < dev->data->nb_tx_queues; i++)
1180 			fm10k_dev_tx_queue_stop(dev, i);
1181 
1182 	if (dev->data->rx_queues)
1183 		for (i = 0; i < dev->data->nb_rx_queues; i++)
1184 			fm10k_dev_rx_queue_stop(dev, i);
1185 
1186 	/* Disable datapath event */
1187 	if (rte_intr_dp_is_en(intr_handle)) {
1188 		for (i = 0; i < dev->data->nb_rx_queues; i++) {
1189 			FM10K_WRITE_REG(hw, FM10K_RXINT(i),
1190 				3 << FM10K_RXINT_TIMER_SHIFT);
1191 			if (hw->mac.type == fm10k_mac_pf)
1192 				FM10K_WRITE_REG(hw, FM10K_ITR(Q2V(pdev, i)),
1193 					FM10K_ITR_MASK_SET);
1194 			else
1195 				FM10K_WRITE_REG(hw, FM10K_VFITR(Q2V(pdev, i)),
1196 					FM10K_ITR_MASK_SET);
1197 		}
1198 	}
1199 	/* Clean datapath event and queue/vec mapping */
1200 	rte_intr_efd_disable(intr_handle);
1201 	rte_free(intr_handle->intr_vec);
1202 	intr_handle->intr_vec = NULL;
1203 }
1204 
1205 static void
1206 fm10k_dev_queue_release(struct rte_eth_dev *dev)
1207 {
1208 	int i;
1209 
1210 	PMD_INIT_FUNC_TRACE();
1211 
1212 	if (dev->data->tx_queues) {
1213 		for (i = 0; i < dev->data->nb_tx_queues; i++) {
1214 			struct fm10k_tx_queue *txq = dev->data->tx_queues[i];
1215 
1216 			tx_queue_free(txq);
1217 		}
1218 	}
1219 
1220 	if (dev->data->rx_queues) {
1221 		for (i = 0; i < dev->data->nb_rx_queues; i++)
1222 			fm10k_rx_queue_release(dev->data->rx_queues[i]);
1223 	}
1224 }
1225 
1226 static int
1227 fm10k_link_update(struct rte_eth_dev *dev,
1228 	__rte_unused int wait_to_complete)
1229 {
1230 	struct fm10k_dev_info *dev_info =
1231 		FM10K_DEV_PRIVATE_TO_INFO(dev->data->dev_private);
1232 	PMD_INIT_FUNC_TRACE();
1233 
1234 	dev->data->dev_link.link_speed  = ETH_SPEED_NUM_50G;
1235 	dev->data->dev_link.link_duplex = ETH_LINK_FULL_DUPLEX;
1236 	dev->data->dev_link.link_status =
1237 		dev_info->sm_down ? ETH_LINK_DOWN : ETH_LINK_UP;
1238 	dev->data->dev_link.link_autoneg = ETH_LINK_FIXED;
1239 
1240 	return 0;
1241 }
1242 
1243 static int fm10k_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
1244 	struct rte_eth_xstat_name *xstats_names, __rte_unused unsigned limit)
1245 {
1246 	unsigned i, q;
1247 	unsigned count = 0;
1248 
1249 	if (xstats_names != NULL) {
1250 		/* Note: limit checked in rte_eth_xstats_names() */
1251 
1252 		/* Global stats */
1253 		for (i = 0; i < FM10K_NB_HW_XSTATS; i++) {
1254 			snprintf(xstats_names[count].name,
1255 				sizeof(xstats_names[count].name),
1256 				"%s", fm10k_hw_stats_strings[count].name);
1257 			count++;
1258 		}
1259 
1260 		/* PF queue stats */
1261 		for (q = 0; q < FM10K_MAX_QUEUES_PF; q++) {
1262 			for (i = 0; i < FM10K_NB_RX_Q_XSTATS; i++) {
1263 				snprintf(xstats_names[count].name,
1264 					sizeof(xstats_names[count].name),
1265 					"rx_q%u_%s", q,
1266 					fm10k_hw_stats_rx_q_strings[i].name);
1267 				count++;
1268 			}
1269 			for (i = 0; i < FM10K_NB_TX_Q_XSTATS; i++) {
1270 				snprintf(xstats_names[count].name,
1271 					sizeof(xstats_names[count].name),
1272 					"tx_q%u_%s", q,
1273 					fm10k_hw_stats_tx_q_strings[i].name);
1274 				count++;
1275 			}
1276 		}
1277 	}
1278 	return FM10K_NB_XSTATS;
1279 }
1280 
1281 static int
1282 fm10k_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
1283 		 unsigned n)
1284 {
1285 	struct fm10k_hw_stats *hw_stats =
1286 		FM10K_DEV_PRIVATE_TO_STATS(dev->data->dev_private);
1287 	unsigned i, q, count = 0;
1288 
1289 	if (n < FM10K_NB_XSTATS)
1290 		return FM10K_NB_XSTATS;
1291 
1292 	/* Global stats */
1293 	for (i = 0; i < FM10K_NB_HW_XSTATS; i++) {
1294 		xstats[count].value = *(uint64_t *)(((char *)hw_stats) +
1295 			fm10k_hw_stats_strings[count].offset);
1296 		xstats[count].id = count;
1297 		count++;
1298 	}
1299 
1300 	/* PF queue stats */
1301 	for (q = 0; q < FM10K_MAX_QUEUES_PF; q++) {
1302 		for (i = 0; i < FM10K_NB_RX_Q_XSTATS; i++) {
1303 			xstats[count].value =
1304 				*(uint64_t *)(((char *)&hw_stats->q[q]) +
1305 				fm10k_hw_stats_rx_q_strings[i].offset);
1306 			xstats[count].id = count;
1307 			count++;
1308 		}
1309 		for (i = 0; i < FM10K_NB_TX_Q_XSTATS; i++) {
1310 			xstats[count].value =
1311 				*(uint64_t *)(((char *)&hw_stats->q[q]) +
1312 				fm10k_hw_stats_tx_q_strings[i].offset);
1313 			xstats[count].id = count;
1314 			count++;
1315 		}
1316 	}
1317 
1318 	return FM10K_NB_XSTATS;
1319 }
1320 
1321 static int
1322 fm10k_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
1323 {
1324 	uint64_t ipackets, opackets, ibytes, obytes, imissed;
1325 	struct fm10k_hw *hw =
1326 		FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1327 	struct fm10k_hw_stats *hw_stats =
1328 		FM10K_DEV_PRIVATE_TO_STATS(dev->data->dev_private);
1329 	int i;
1330 
1331 	PMD_INIT_FUNC_TRACE();
1332 
1333 	fm10k_update_hw_stats(hw, hw_stats);
1334 
1335 	ipackets = opackets = ibytes = obytes = imissed = 0;
1336 	for (i = 0; (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) &&
1337 		(i < hw->mac.max_queues); ++i) {
1338 		stats->q_ipackets[i] = hw_stats->q[i].rx_packets.count;
1339 		stats->q_opackets[i] = hw_stats->q[i].tx_packets.count;
1340 		stats->q_ibytes[i]   = hw_stats->q[i].rx_bytes.count;
1341 		stats->q_obytes[i]   = hw_stats->q[i].tx_bytes.count;
1342 		stats->q_errors[i]   = hw_stats->q[i].rx_drops.count;
1343 		ipackets += stats->q_ipackets[i];
1344 		opackets += stats->q_opackets[i];
1345 		ibytes   += stats->q_ibytes[i];
1346 		obytes   += stats->q_obytes[i];
1347 		imissed  += stats->q_errors[i];
1348 	}
1349 	stats->ipackets = ipackets;
1350 	stats->opackets = opackets;
1351 	stats->ibytes = ibytes;
1352 	stats->obytes = obytes;
1353 	stats->imissed = imissed;
1354 	return 0;
1355 }
1356 
1357 static int
1358 fm10k_stats_reset(struct rte_eth_dev *dev)
1359 {
1360 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1361 	struct fm10k_hw_stats *hw_stats =
1362 		FM10K_DEV_PRIVATE_TO_STATS(dev->data->dev_private);
1363 
1364 	PMD_INIT_FUNC_TRACE();
1365 
1366 	memset(hw_stats, 0, sizeof(*hw_stats));
1367 	fm10k_rebind_hw_stats(hw, hw_stats);
1368 
1369 	return 0;
1370 }
1371 
1372 static int
1373 fm10k_dev_infos_get(struct rte_eth_dev *dev,
1374 	struct rte_eth_dev_info *dev_info)
1375 {
1376 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1377 	struct rte_pci_device *pdev = RTE_ETH_DEV_TO_PCI(dev);
1378 
1379 	PMD_INIT_FUNC_TRACE();
1380 
1381 	dev_info->min_rx_bufsize     = FM10K_MIN_RX_BUF_SIZE;
1382 	dev_info->max_rx_pktlen      = FM10K_MAX_PKT_SIZE;
1383 	dev_info->max_rx_queues      = hw->mac.max_queues;
1384 	dev_info->max_tx_queues      = hw->mac.max_queues;
1385 	dev_info->max_mac_addrs      = FM10K_MAX_MACADDR_NUM;
1386 	dev_info->max_hash_mac_addrs = 0;
1387 	dev_info->max_vfs            = pdev->max_vfs;
1388 	dev_info->vmdq_pool_base     = 0;
1389 	dev_info->vmdq_queue_base    = 0;
1390 	dev_info->max_vmdq_pools     = ETH_32_POOLS;
1391 	dev_info->vmdq_queue_num     = FM10K_MAX_QUEUES_PF;
1392 	dev_info->rx_queue_offload_capa = fm10k_get_rx_queue_offloads_capa(dev);
1393 	dev_info->rx_offload_capa = fm10k_get_rx_port_offloads_capa(dev) |
1394 				    dev_info->rx_queue_offload_capa;
1395 	dev_info->tx_queue_offload_capa = fm10k_get_tx_queue_offloads_capa(dev);
1396 	dev_info->tx_offload_capa = fm10k_get_tx_port_offloads_capa(dev) |
1397 				    dev_info->tx_queue_offload_capa;
1398 
1399 	dev_info->hash_key_size = FM10K_RSSRK_SIZE * sizeof(uint32_t);
1400 	dev_info->reta_size = FM10K_MAX_RSS_INDICES;
1401 	dev_info->flow_type_rss_offloads = ETH_RSS_IPV4 |
1402 					ETH_RSS_IPV6 |
1403 					ETH_RSS_IPV6_EX |
1404 					ETH_RSS_NONFRAG_IPV4_TCP |
1405 					ETH_RSS_NONFRAG_IPV6_TCP |
1406 					ETH_RSS_IPV6_TCP_EX |
1407 					ETH_RSS_NONFRAG_IPV4_UDP |
1408 					ETH_RSS_NONFRAG_IPV6_UDP |
1409 					ETH_RSS_IPV6_UDP_EX;
1410 
1411 	dev_info->default_rxconf = (struct rte_eth_rxconf) {
1412 		.rx_thresh = {
1413 			.pthresh = FM10K_DEFAULT_RX_PTHRESH,
1414 			.hthresh = FM10K_DEFAULT_RX_HTHRESH,
1415 			.wthresh = FM10K_DEFAULT_RX_WTHRESH,
1416 		},
1417 		.rx_free_thresh = FM10K_RX_FREE_THRESH_DEFAULT(0),
1418 		.rx_drop_en = 0,
1419 		.offloads = 0,
1420 	};
1421 
1422 	dev_info->default_txconf = (struct rte_eth_txconf) {
1423 		.tx_thresh = {
1424 			.pthresh = FM10K_DEFAULT_TX_PTHRESH,
1425 			.hthresh = FM10K_DEFAULT_TX_HTHRESH,
1426 			.wthresh = FM10K_DEFAULT_TX_WTHRESH,
1427 		},
1428 		.tx_free_thresh = FM10K_TX_FREE_THRESH_DEFAULT(0),
1429 		.tx_rs_thresh = FM10K_TX_RS_THRESH_DEFAULT(0),
1430 		.offloads = 0,
1431 	};
1432 
1433 	dev_info->rx_desc_lim = (struct rte_eth_desc_lim) {
1434 		.nb_max = FM10K_MAX_RX_DESC,
1435 		.nb_min = FM10K_MIN_RX_DESC,
1436 		.nb_align = FM10K_MULT_RX_DESC,
1437 	};
1438 
1439 	dev_info->tx_desc_lim = (struct rte_eth_desc_lim) {
1440 		.nb_max = FM10K_MAX_TX_DESC,
1441 		.nb_min = FM10K_MIN_TX_DESC,
1442 		.nb_align = FM10K_MULT_TX_DESC,
1443 		.nb_seg_max = FM10K_TX_MAX_SEG,
1444 		.nb_mtu_seg_max = FM10K_TX_MAX_MTU_SEG,
1445 	};
1446 
1447 	dev_info->speed_capa = ETH_LINK_SPEED_1G | ETH_LINK_SPEED_2_5G |
1448 			ETH_LINK_SPEED_10G | ETH_LINK_SPEED_25G |
1449 			ETH_LINK_SPEED_40G | ETH_LINK_SPEED_100G;
1450 
1451 	return 0;
1452 }
1453 
1454 #ifdef RTE_LIBRTE_FM10K_RX_OLFLAGS_ENABLE
1455 static const uint32_t *
1456 fm10k_dev_supported_ptypes_get(struct rte_eth_dev *dev)
1457 {
1458 	if (dev->rx_pkt_burst == fm10k_recv_pkts ||
1459 	    dev->rx_pkt_burst == fm10k_recv_scattered_pkts) {
1460 		static uint32_t ptypes[] = {
1461 			/* refers to rx_desc_to_ol_flags() */
1462 			RTE_PTYPE_L2_ETHER,
1463 			RTE_PTYPE_L3_IPV4,
1464 			RTE_PTYPE_L3_IPV4_EXT,
1465 			RTE_PTYPE_L3_IPV6,
1466 			RTE_PTYPE_L3_IPV6_EXT,
1467 			RTE_PTYPE_L4_TCP,
1468 			RTE_PTYPE_L4_UDP,
1469 			RTE_PTYPE_UNKNOWN
1470 		};
1471 
1472 		return ptypes;
1473 	} else if (dev->rx_pkt_burst == fm10k_recv_pkts_vec ||
1474 		   dev->rx_pkt_burst == fm10k_recv_scattered_pkts_vec) {
1475 		static uint32_t ptypes_vec[] = {
1476 			/* refers to fm10k_desc_to_pktype_v() */
1477 			RTE_PTYPE_L3_IPV4,
1478 			RTE_PTYPE_L3_IPV4_EXT,
1479 			RTE_PTYPE_L3_IPV6,
1480 			RTE_PTYPE_L3_IPV6_EXT,
1481 			RTE_PTYPE_L4_TCP,
1482 			RTE_PTYPE_L4_UDP,
1483 			RTE_PTYPE_TUNNEL_GENEVE,
1484 			RTE_PTYPE_TUNNEL_NVGRE,
1485 			RTE_PTYPE_TUNNEL_VXLAN,
1486 			RTE_PTYPE_TUNNEL_GRE,
1487 			RTE_PTYPE_UNKNOWN
1488 		};
1489 
1490 		return ptypes_vec;
1491 	}
1492 
1493 	return NULL;
1494 }
1495 #else
1496 static const uint32_t *
1497 fm10k_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)
1498 {
1499 	return NULL;
1500 }
1501 #endif
1502 
1503 static int
1504 fm10k_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)
1505 {
1506 	s32 result;
1507 	uint16_t mac_num = 0;
1508 	uint32_t vid_idx, vid_bit, mac_index;
1509 	struct fm10k_hw *hw;
1510 	struct fm10k_macvlan_filter_info *macvlan;
1511 	struct rte_eth_dev_data *data = dev->data;
1512 
1513 	hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1514 	macvlan = FM10K_DEV_PRIVATE_TO_MACVLAN(dev->data->dev_private);
1515 
1516 	if (macvlan->nb_queue_pools > 0) { /* VMDQ mode */
1517 		PMD_INIT_LOG(ERR, "Cannot change VLAN filter in VMDQ mode");
1518 		return -EINVAL;
1519 	}
1520 
1521 	if (vlan_id > ETH_VLAN_ID_MAX) {
1522 		PMD_INIT_LOG(ERR, "Invalid vlan_id: must be < 4096");
1523 		return -EINVAL;
1524 	}
1525 
1526 	vid_idx = FM10K_VFTA_IDX(vlan_id);
1527 	vid_bit = FM10K_VFTA_BIT(vlan_id);
1528 	/* this VLAN ID is already in the VLAN filter table, return SUCCESS */
1529 	if (on && (macvlan->vfta[vid_idx] & vid_bit))
1530 		return 0;
1531 	/* this VLAN ID is NOT in the VLAN filter table, cannot remove */
1532 	if (!on && !(macvlan->vfta[vid_idx] & vid_bit)) {
1533 		PMD_INIT_LOG(ERR, "Invalid vlan_id: not existing "
1534 			"in the VLAN filter table");
1535 		return -EINVAL;
1536 	}
1537 
1538 	fm10k_mbx_lock(hw);
1539 	result = fm10k_update_vlan(hw, vlan_id, 0, on);
1540 	fm10k_mbx_unlock(hw);
1541 	if (result != FM10K_SUCCESS) {
1542 		PMD_INIT_LOG(ERR, "VLAN update failed: %d", result);
1543 		return -EIO;
1544 	}
1545 
1546 	for (mac_index = 0; (mac_index < FM10K_MAX_MACADDR_NUM) &&
1547 			(result == FM10K_SUCCESS); mac_index++) {
1548 		if (rte_is_zero_ether_addr(&data->mac_addrs[mac_index]))
1549 			continue;
1550 		if (mac_num > macvlan->mac_num - 1) {
1551 			PMD_INIT_LOG(ERR, "MAC address number "
1552 					"not match");
1553 			break;
1554 		}
1555 		fm10k_mbx_lock(hw);
1556 		result = fm10k_update_uc_addr(hw, hw->mac.dglort_map,
1557 			data->mac_addrs[mac_index].addr_bytes,
1558 			vlan_id, on, 0);
1559 		fm10k_mbx_unlock(hw);
1560 		mac_num++;
1561 	}
1562 	if (result != FM10K_SUCCESS) {
1563 		PMD_INIT_LOG(ERR, "MAC address update failed: %d", result);
1564 		return -EIO;
1565 	}
1566 
1567 	if (on) {
1568 		macvlan->vlan_num++;
1569 		macvlan->vfta[vid_idx] |= vid_bit;
1570 	} else {
1571 		macvlan->vlan_num--;
1572 		macvlan->vfta[vid_idx] &= ~vid_bit;
1573 	}
1574 	return 0;
1575 }
1576 
1577 static int
1578 fm10k_vlan_offload_set(struct rte_eth_dev *dev, int mask)
1579 {
1580 	if (mask & ETH_VLAN_STRIP_MASK) {
1581 		if (!(dev->data->dev_conf.rxmode.offloads &
1582 			DEV_RX_OFFLOAD_VLAN_STRIP))
1583 			PMD_INIT_LOG(ERR, "VLAN stripping is "
1584 					"always on in fm10k");
1585 	}
1586 
1587 	if (mask & ETH_VLAN_EXTEND_MASK) {
1588 		if (dev->data->dev_conf.rxmode.offloads &
1589 			DEV_RX_OFFLOAD_VLAN_EXTEND)
1590 			PMD_INIT_LOG(ERR, "VLAN QinQ is not "
1591 					"supported in fm10k");
1592 	}
1593 
1594 	if (mask & ETH_VLAN_FILTER_MASK) {
1595 		if (!(dev->data->dev_conf.rxmode.offloads &
1596 			DEV_RX_OFFLOAD_VLAN_FILTER))
1597 			PMD_INIT_LOG(ERR, "VLAN filter is always on in fm10k");
1598 	}
1599 
1600 	return 0;
1601 }
1602 
1603 /* Add/Remove a MAC address, and update filters to main VSI */
1604 static void fm10k_MAC_filter_set_main_vsi(struct rte_eth_dev *dev,
1605 		const u8 *mac, bool add, uint32_t pool)
1606 {
1607 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1608 	struct fm10k_macvlan_filter_info *macvlan;
1609 	uint32_t i, j, k;
1610 
1611 	macvlan = FM10K_DEV_PRIVATE_TO_MACVLAN(dev->data->dev_private);
1612 
1613 	if (pool != MAIN_VSI_POOL_NUMBER) {
1614 		PMD_DRV_LOG(ERR, "VMDQ not enabled, can't set "
1615 			"mac to pool %u", pool);
1616 		return;
1617 	}
1618 	for (i = 0, j = 0; j < FM10K_VFTA_SIZE; j++) {
1619 		if (!macvlan->vfta[j])
1620 			continue;
1621 		for (k = 0; k < FM10K_UINT32_BIT_SIZE; k++) {
1622 			if (!(macvlan->vfta[j] & (1 << k)))
1623 				continue;
1624 			if (i + 1 > macvlan->vlan_num) {
1625 				PMD_INIT_LOG(ERR, "vlan number not match");
1626 				return;
1627 			}
1628 			fm10k_mbx_lock(hw);
1629 			fm10k_update_uc_addr(hw, hw->mac.dglort_map, mac,
1630 				j * FM10K_UINT32_BIT_SIZE + k, add, 0);
1631 			fm10k_mbx_unlock(hw);
1632 			i++;
1633 		}
1634 	}
1635 }
1636 
1637 /* Add/Remove a MAC address, and update filters to VMDQ */
1638 static void fm10k_MAC_filter_set_vmdq(struct rte_eth_dev *dev,
1639 		const u8 *mac, bool add, uint32_t pool)
1640 {
1641 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1642 	struct fm10k_macvlan_filter_info *macvlan;
1643 	struct rte_eth_vmdq_rx_conf *vmdq_conf;
1644 	uint32_t i;
1645 
1646 	macvlan = FM10K_DEV_PRIVATE_TO_MACVLAN(dev->data->dev_private);
1647 	vmdq_conf = &dev->data->dev_conf.rx_adv_conf.vmdq_rx_conf;
1648 
1649 	if (pool > macvlan->nb_queue_pools) {
1650 		PMD_DRV_LOG(ERR, "Pool number %u invalid."
1651 			" Max pool is %u",
1652 			pool, macvlan->nb_queue_pools);
1653 		return;
1654 	}
1655 	for (i = 0; i < vmdq_conf->nb_pool_maps; i++) {
1656 		if (!(vmdq_conf->pool_map[i].pools & (1UL << pool)))
1657 			continue;
1658 		fm10k_mbx_lock(hw);
1659 		fm10k_update_uc_addr(hw, hw->mac.dglort_map + pool, mac,
1660 			vmdq_conf->pool_map[i].vlan_id, add, 0);
1661 		fm10k_mbx_unlock(hw);
1662 	}
1663 }
1664 
1665 /* Add/Remove a MAC address, and update filters */
1666 static void fm10k_MAC_filter_set(struct rte_eth_dev *dev,
1667 		const u8 *mac, bool add, uint32_t pool)
1668 {
1669 	struct fm10k_macvlan_filter_info *macvlan;
1670 
1671 	macvlan = FM10K_DEV_PRIVATE_TO_MACVLAN(dev->data->dev_private);
1672 
1673 	if (macvlan->nb_queue_pools > 0) /* VMDQ mode */
1674 		fm10k_MAC_filter_set_vmdq(dev, mac, add, pool);
1675 	else
1676 		fm10k_MAC_filter_set_main_vsi(dev, mac, add, pool);
1677 
1678 	if (add)
1679 		macvlan->mac_num++;
1680 	else
1681 		macvlan->mac_num--;
1682 }
1683 
1684 /* Add a MAC address, and update filters */
1685 static int
1686 fm10k_macaddr_add(struct rte_eth_dev *dev,
1687 		struct rte_ether_addr *mac_addr,
1688 		uint32_t index,
1689 		uint32_t pool)
1690 {
1691 	struct fm10k_macvlan_filter_info *macvlan;
1692 
1693 	macvlan = FM10K_DEV_PRIVATE_TO_MACVLAN(dev->data->dev_private);
1694 	fm10k_MAC_filter_set(dev, mac_addr->addr_bytes, TRUE, pool);
1695 	macvlan->mac_vmdq_id[index] = pool;
1696 	return 0;
1697 }
1698 
1699 /* Remove a MAC address, and update filters */
1700 static void
1701 fm10k_macaddr_remove(struct rte_eth_dev *dev, uint32_t index)
1702 {
1703 	struct rte_eth_dev_data *data = dev->data;
1704 	struct fm10k_macvlan_filter_info *macvlan;
1705 
1706 	macvlan = FM10K_DEV_PRIVATE_TO_MACVLAN(dev->data->dev_private);
1707 	fm10k_MAC_filter_set(dev, data->mac_addrs[index].addr_bytes,
1708 			FALSE, macvlan->mac_vmdq_id[index]);
1709 	macvlan->mac_vmdq_id[index] = 0;
1710 }
1711 
1712 static inline int
1713 check_nb_desc(uint16_t min, uint16_t max, uint16_t mult, uint16_t request)
1714 {
1715 	if ((request < min) || (request > max) || ((request % mult) != 0))
1716 		return -1;
1717 	else
1718 		return 0;
1719 }
1720 
1721 
1722 static inline int
1723 check_thresh(uint16_t min, uint16_t max, uint16_t div, uint16_t request)
1724 {
1725 	if ((request < min) || (request > max) || ((div % request) != 0))
1726 		return -1;
1727 	else
1728 		return 0;
1729 }
1730 
1731 static inline int
1732 handle_rxconf(struct fm10k_rx_queue *q, const struct rte_eth_rxconf *conf)
1733 {
1734 	uint16_t rx_free_thresh;
1735 
1736 	if (conf->rx_free_thresh == 0)
1737 		rx_free_thresh = FM10K_RX_FREE_THRESH_DEFAULT(q);
1738 	else
1739 		rx_free_thresh = conf->rx_free_thresh;
1740 
1741 	/* make sure the requested threshold satisfies the constraints */
1742 	if (check_thresh(FM10K_RX_FREE_THRESH_MIN(q),
1743 			FM10K_RX_FREE_THRESH_MAX(q),
1744 			FM10K_RX_FREE_THRESH_DIV(q),
1745 			rx_free_thresh)) {
1746 		PMD_INIT_LOG(ERR, "rx_free_thresh (%u) must be "
1747 			"less than or equal to %u, "
1748 			"greater than or equal to %u, "
1749 			"and a divisor of %u",
1750 			rx_free_thresh, FM10K_RX_FREE_THRESH_MAX(q),
1751 			FM10K_RX_FREE_THRESH_MIN(q),
1752 			FM10K_RX_FREE_THRESH_DIV(q));
1753 		return -EINVAL;
1754 	}
1755 
1756 	q->alloc_thresh = rx_free_thresh;
1757 	q->drop_en = conf->rx_drop_en;
1758 	q->rx_deferred_start = conf->rx_deferred_start;
1759 
1760 	return 0;
1761 }
1762 
1763 /*
1764  * Hardware requires specific alignment for Rx packet buffers. At
1765  * least one of the following two conditions must be satisfied.
1766  *  1. Address is 512B aligned
1767  *  2. Address is 8B aligned and buffer does not cross 4K boundary.
1768  *
1769  * As such, the driver may need to adjust the DMA address within the
1770  * buffer by up to 512B.
1771  *
1772  * return 1 if the element size is valid, otherwise return 0.
1773  */
1774 static int
1775 mempool_element_size_valid(struct rte_mempool *mp)
1776 {
1777 	uint32_t min_size;
1778 
1779 	/* elt_size includes mbuf header and headroom */
1780 	min_size = mp->elt_size - sizeof(struct rte_mbuf) -
1781 			RTE_PKTMBUF_HEADROOM;
1782 
1783 	/* account for up to 512B of alignment */
1784 	min_size -= FM10K_RX_DATABUF_ALIGN;
1785 
1786 	/* sanity check for overflow */
1787 	if (min_size > mp->elt_size)
1788 		return 0;
1789 
1790 	/* size is valid */
1791 	return 1;
1792 }
1793 
1794 static uint64_t fm10k_get_rx_queue_offloads_capa(struct rte_eth_dev *dev)
1795 {
1796 	RTE_SET_USED(dev);
1797 
1798 	return (uint64_t)(DEV_RX_OFFLOAD_SCATTER);
1799 }
1800 
1801 static uint64_t fm10k_get_rx_port_offloads_capa(struct rte_eth_dev *dev)
1802 {
1803 	RTE_SET_USED(dev);
1804 
1805 	return  (uint64_t)(DEV_RX_OFFLOAD_VLAN_STRIP  |
1806 			   DEV_RX_OFFLOAD_VLAN_FILTER |
1807 			   DEV_RX_OFFLOAD_IPV4_CKSUM  |
1808 			   DEV_RX_OFFLOAD_UDP_CKSUM   |
1809 			   DEV_RX_OFFLOAD_TCP_CKSUM   |
1810 			   DEV_RX_OFFLOAD_JUMBO_FRAME |
1811 			   DEV_RX_OFFLOAD_HEADER_SPLIT |
1812 			   DEV_RX_OFFLOAD_RSS_HASH);
1813 }
1814 
1815 static int
1816 fm10k_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_id,
1817 	uint16_t nb_desc, unsigned int socket_id,
1818 	const struct rte_eth_rxconf *conf, struct rte_mempool *mp)
1819 {
1820 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1821 	struct fm10k_dev_info *dev_info =
1822 		FM10K_DEV_PRIVATE_TO_INFO(dev->data->dev_private);
1823 	struct fm10k_rx_queue *q;
1824 	const struct rte_memzone *mz;
1825 	uint64_t offloads;
1826 
1827 	PMD_INIT_FUNC_TRACE();
1828 
1829 	offloads = conf->offloads | dev->data->dev_conf.rxmode.offloads;
1830 
1831 	/* make sure the mempool element size can account for alignment. */
1832 	if (!mempool_element_size_valid(mp)) {
1833 		PMD_INIT_LOG(ERR, "Error : Mempool element size is too small");
1834 		return -EINVAL;
1835 	}
1836 
1837 	/* make sure a valid number of descriptors have been requested */
1838 	if (check_nb_desc(FM10K_MIN_RX_DESC, FM10K_MAX_RX_DESC,
1839 				FM10K_MULT_RX_DESC, nb_desc)) {
1840 		PMD_INIT_LOG(ERR, "Number of Rx descriptors (%u) must be "
1841 			"less than or equal to %"PRIu32", "
1842 			"greater than or equal to %u, "
1843 			"and a multiple of %u",
1844 			nb_desc, (uint32_t)FM10K_MAX_RX_DESC, FM10K_MIN_RX_DESC,
1845 			FM10K_MULT_RX_DESC);
1846 		return -EINVAL;
1847 	}
1848 
1849 	/*
1850 	 * if this queue existed already, free the associated memory. The
1851 	 * queue cannot be reused in case we need to allocate memory on
1852 	 * different socket than was previously used.
1853 	 */
1854 	if (dev->data->rx_queues[queue_id] != NULL) {
1855 		rx_queue_free(dev->data->rx_queues[queue_id]);
1856 		dev->data->rx_queues[queue_id] = NULL;
1857 	}
1858 
1859 	/* allocate memory for the queue structure */
1860 	q = rte_zmalloc_socket("fm10k", sizeof(*q), RTE_CACHE_LINE_SIZE,
1861 				socket_id);
1862 	if (q == NULL) {
1863 		PMD_INIT_LOG(ERR, "Cannot allocate queue structure");
1864 		return -ENOMEM;
1865 	}
1866 
1867 	/* setup queue */
1868 	q->mp = mp;
1869 	q->nb_desc = nb_desc;
1870 	q->nb_fake_desc = FM10K_MULT_RX_DESC;
1871 	q->port_id = dev->data->port_id;
1872 	q->queue_id = queue_id;
1873 	q->tail_ptr = (volatile uint32_t *)
1874 		&((uint32_t *)hw->hw_addr)[FM10K_RDT(queue_id)];
1875 	q->offloads = offloads;
1876 	if (handle_rxconf(q, conf))
1877 		return -EINVAL;
1878 
1879 	/* allocate memory for the software ring */
1880 	q->sw_ring = rte_zmalloc_socket("fm10k sw ring",
1881 			(nb_desc + q->nb_fake_desc) * sizeof(struct rte_mbuf *),
1882 			RTE_CACHE_LINE_SIZE, socket_id);
1883 	if (q->sw_ring == NULL) {
1884 		PMD_INIT_LOG(ERR, "Cannot allocate software ring");
1885 		rte_free(q);
1886 		return -ENOMEM;
1887 	}
1888 
1889 	/*
1890 	 * allocate memory for the hardware descriptor ring. A memzone large
1891 	 * enough to hold the maximum ring size is requested to allow for
1892 	 * resizing in later calls to the queue setup function.
1893 	 */
1894 	mz = rte_eth_dma_zone_reserve(dev, "rx_ring", queue_id,
1895 				      FM10K_MAX_RX_RING_SZ, FM10K_ALIGN_RX_DESC,
1896 				      socket_id);
1897 	if (mz == NULL) {
1898 		PMD_INIT_LOG(ERR, "Cannot allocate hardware ring");
1899 		rte_free(q->sw_ring);
1900 		rte_free(q);
1901 		return -ENOMEM;
1902 	}
1903 	q->hw_ring = mz->addr;
1904 	q->hw_ring_phys_addr = mz->iova;
1905 
1906 	/* Check if number of descs satisfied Vector requirement */
1907 	if (!rte_is_power_of_2(nb_desc)) {
1908 		PMD_INIT_LOG(DEBUG, "queue[%d] doesn't meet Vector Rx "
1909 				    "preconditions - canceling the feature for "
1910 				    "the whole port[%d]",
1911 			     q->queue_id, q->port_id);
1912 		dev_info->rx_vec_allowed = false;
1913 	} else
1914 		fm10k_rxq_vec_setup(q);
1915 
1916 	dev->data->rx_queues[queue_id] = q;
1917 	return 0;
1918 }
1919 
1920 static void
1921 fm10k_rx_queue_release(void *queue)
1922 {
1923 	PMD_INIT_FUNC_TRACE();
1924 
1925 	rx_queue_free(queue);
1926 }
1927 
1928 static inline int
1929 handle_txconf(struct fm10k_tx_queue *q, const struct rte_eth_txconf *conf)
1930 {
1931 	uint16_t tx_free_thresh;
1932 	uint16_t tx_rs_thresh;
1933 
1934 	/* constraint MACROs require that tx_free_thresh is configured
1935 	 * before tx_rs_thresh */
1936 	if (conf->tx_free_thresh == 0)
1937 		tx_free_thresh = FM10K_TX_FREE_THRESH_DEFAULT(q);
1938 	else
1939 		tx_free_thresh = conf->tx_free_thresh;
1940 
1941 	/* make sure the requested threshold satisfies the constraints */
1942 	if (check_thresh(FM10K_TX_FREE_THRESH_MIN(q),
1943 			FM10K_TX_FREE_THRESH_MAX(q),
1944 			FM10K_TX_FREE_THRESH_DIV(q),
1945 			tx_free_thresh)) {
1946 		PMD_INIT_LOG(ERR, "tx_free_thresh (%u) must be "
1947 			"less than or equal to %u, "
1948 			"greater than or equal to %u, "
1949 			"and a divisor of %u",
1950 			tx_free_thresh, FM10K_TX_FREE_THRESH_MAX(q),
1951 			FM10K_TX_FREE_THRESH_MIN(q),
1952 			FM10K_TX_FREE_THRESH_DIV(q));
1953 		return -EINVAL;
1954 	}
1955 
1956 	q->free_thresh = tx_free_thresh;
1957 
1958 	if (conf->tx_rs_thresh == 0)
1959 		tx_rs_thresh = FM10K_TX_RS_THRESH_DEFAULT(q);
1960 	else
1961 		tx_rs_thresh = conf->tx_rs_thresh;
1962 
1963 	q->tx_deferred_start = conf->tx_deferred_start;
1964 
1965 	/* make sure the requested threshold satisfies the constraints */
1966 	if (check_thresh(FM10K_TX_RS_THRESH_MIN(q),
1967 			FM10K_TX_RS_THRESH_MAX(q),
1968 			FM10K_TX_RS_THRESH_DIV(q),
1969 			tx_rs_thresh)) {
1970 		PMD_INIT_LOG(ERR, "tx_rs_thresh (%u) must be "
1971 			"less than or equal to %u, "
1972 			"greater than or equal to %u, "
1973 			"and a divisor of %u",
1974 			tx_rs_thresh, FM10K_TX_RS_THRESH_MAX(q),
1975 			FM10K_TX_RS_THRESH_MIN(q),
1976 			FM10K_TX_RS_THRESH_DIV(q));
1977 		return -EINVAL;
1978 	}
1979 
1980 	q->rs_thresh = tx_rs_thresh;
1981 
1982 	return 0;
1983 }
1984 
1985 static uint64_t fm10k_get_tx_queue_offloads_capa(struct rte_eth_dev *dev)
1986 {
1987 	RTE_SET_USED(dev);
1988 
1989 	return 0;
1990 }
1991 
1992 static uint64_t fm10k_get_tx_port_offloads_capa(struct rte_eth_dev *dev)
1993 {
1994 	RTE_SET_USED(dev);
1995 
1996 	return (uint64_t)(DEV_TX_OFFLOAD_VLAN_INSERT |
1997 			  DEV_TX_OFFLOAD_MULTI_SEGS  |
1998 			  DEV_TX_OFFLOAD_IPV4_CKSUM  |
1999 			  DEV_TX_OFFLOAD_UDP_CKSUM   |
2000 			  DEV_TX_OFFLOAD_TCP_CKSUM   |
2001 			  DEV_TX_OFFLOAD_TCP_TSO);
2002 }
2003 
2004 static int
2005 fm10k_tx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_id,
2006 	uint16_t nb_desc, unsigned int socket_id,
2007 	const struct rte_eth_txconf *conf)
2008 {
2009 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
2010 	struct fm10k_tx_queue *q;
2011 	const struct rte_memzone *mz;
2012 	uint64_t offloads;
2013 
2014 	PMD_INIT_FUNC_TRACE();
2015 
2016 	offloads = conf->offloads | dev->data->dev_conf.txmode.offloads;
2017 
2018 	/* make sure a valid number of descriptors have been requested */
2019 	if (check_nb_desc(FM10K_MIN_TX_DESC, FM10K_MAX_TX_DESC,
2020 				FM10K_MULT_TX_DESC, nb_desc)) {
2021 		PMD_INIT_LOG(ERR, "Number of Tx descriptors (%u) must be "
2022 			"less than or equal to %"PRIu32", "
2023 			"greater than or equal to %u, "
2024 			"and a multiple of %u",
2025 			nb_desc, (uint32_t)FM10K_MAX_TX_DESC, FM10K_MIN_TX_DESC,
2026 			FM10K_MULT_TX_DESC);
2027 		return -EINVAL;
2028 	}
2029 
2030 	/*
2031 	 * if this queue existed already, free the associated memory. The
2032 	 * queue cannot be reused in case we need to allocate memory on
2033 	 * different socket than was previously used.
2034 	 */
2035 	if (dev->data->tx_queues[queue_id] != NULL) {
2036 		struct fm10k_tx_queue *txq = dev->data->tx_queues[queue_id];
2037 
2038 		tx_queue_free(txq);
2039 		dev->data->tx_queues[queue_id] = NULL;
2040 	}
2041 
2042 	/* allocate memory for the queue structure */
2043 	q = rte_zmalloc_socket("fm10k", sizeof(*q), RTE_CACHE_LINE_SIZE,
2044 				socket_id);
2045 	if (q == NULL) {
2046 		PMD_INIT_LOG(ERR, "Cannot allocate queue structure");
2047 		return -ENOMEM;
2048 	}
2049 
2050 	/* setup queue */
2051 	q->nb_desc = nb_desc;
2052 	q->port_id = dev->data->port_id;
2053 	q->queue_id = queue_id;
2054 	q->offloads = offloads;
2055 	q->ops = &def_txq_ops;
2056 	q->tail_ptr = (volatile uint32_t *)
2057 		&((uint32_t *)hw->hw_addr)[FM10K_TDT(queue_id)];
2058 	if (handle_txconf(q, conf))
2059 		return -EINVAL;
2060 
2061 	/* allocate memory for the software ring */
2062 	q->sw_ring = rte_zmalloc_socket("fm10k sw ring",
2063 					nb_desc * sizeof(struct rte_mbuf *),
2064 					RTE_CACHE_LINE_SIZE, socket_id);
2065 	if (q->sw_ring == NULL) {
2066 		PMD_INIT_LOG(ERR, "Cannot allocate software ring");
2067 		rte_free(q);
2068 		return -ENOMEM;
2069 	}
2070 
2071 	/*
2072 	 * allocate memory for the hardware descriptor ring. A memzone large
2073 	 * enough to hold the maximum ring size is requested to allow for
2074 	 * resizing in later calls to the queue setup function.
2075 	 */
2076 	mz = rte_eth_dma_zone_reserve(dev, "tx_ring", queue_id,
2077 				      FM10K_MAX_TX_RING_SZ, FM10K_ALIGN_TX_DESC,
2078 				      socket_id);
2079 	if (mz == NULL) {
2080 		PMD_INIT_LOG(ERR, "Cannot allocate hardware ring");
2081 		rte_free(q->sw_ring);
2082 		rte_free(q);
2083 		return -ENOMEM;
2084 	}
2085 	q->hw_ring = mz->addr;
2086 	q->hw_ring_phys_addr = mz->iova;
2087 
2088 	/*
2089 	 * allocate memory for the RS bit tracker. Enough slots to hold the
2090 	 * descriptor index for each RS bit needing to be set are required.
2091 	 */
2092 	q->rs_tracker.list = rte_zmalloc_socket("fm10k rs tracker",
2093 				((nb_desc + 1) / q->rs_thresh) *
2094 				sizeof(uint16_t),
2095 				RTE_CACHE_LINE_SIZE, socket_id);
2096 	if (q->rs_tracker.list == NULL) {
2097 		PMD_INIT_LOG(ERR, "Cannot allocate RS bit tracker");
2098 		rte_free(q->sw_ring);
2099 		rte_free(q);
2100 		return -ENOMEM;
2101 	}
2102 
2103 	dev->data->tx_queues[queue_id] = q;
2104 	return 0;
2105 }
2106 
2107 static void
2108 fm10k_tx_queue_release(void *queue)
2109 {
2110 	struct fm10k_tx_queue *q = queue;
2111 	PMD_INIT_FUNC_TRACE();
2112 
2113 	tx_queue_free(q);
2114 }
2115 
2116 static int
2117 fm10k_reta_update(struct rte_eth_dev *dev,
2118 			struct rte_eth_rss_reta_entry64 *reta_conf,
2119 			uint16_t reta_size)
2120 {
2121 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
2122 	uint16_t i, j, idx, shift;
2123 	uint8_t mask;
2124 	uint32_t reta;
2125 
2126 	PMD_INIT_FUNC_TRACE();
2127 
2128 	if (reta_size > FM10K_MAX_RSS_INDICES) {
2129 		PMD_INIT_LOG(ERR, "The size of hash lookup table configured "
2130 			"(%d) doesn't match the number hardware can supported "
2131 			"(%d)", reta_size, FM10K_MAX_RSS_INDICES);
2132 		return -EINVAL;
2133 	}
2134 
2135 	/*
2136 	 * Update Redirection Table RETA[n], n=0..31. The redirection table has
2137 	 * 128-entries in 32 registers
2138 	 */
2139 	for (i = 0; i < FM10K_MAX_RSS_INDICES; i += CHARS_PER_UINT32) {
2140 		idx = i / RTE_RETA_GROUP_SIZE;
2141 		shift = i % RTE_RETA_GROUP_SIZE;
2142 		mask = (uint8_t)((reta_conf[idx].mask >> shift) &
2143 				BIT_MASK_PER_UINT32);
2144 		if (mask == 0)
2145 			continue;
2146 
2147 		reta = 0;
2148 		if (mask != BIT_MASK_PER_UINT32)
2149 			reta = FM10K_READ_REG(hw, FM10K_RETA(0, i >> 2));
2150 
2151 		for (j = 0; j < CHARS_PER_UINT32; j++) {
2152 			if (mask & (0x1 << j)) {
2153 				if (mask != 0xF)
2154 					reta &= ~(UINT8_MAX << CHAR_BIT * j);
2155 				reta |= reta_conf[idx].reta[shift + j] <<
2156 						(CHAR_BIT * j);
2157 			}
2158 		}
2159 		FM10K_WRITE_REG(hw, FM10K_RETA(0, i >> 2), reta);
2160 	}
2161 
2162 	return 0;
2163 }
2164 
2165 static int
2166 fm10k_reta_query(struct rte_eth_dev *dev,
2167 			struct rte_eth_rss_reta_entry64 *reta_conf,
2168 			uint16_t reta_size)
2169 {
2170 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
2171 	uint16_t i, j, idx, shift;
2172 	uint8_t mask;
2173 	uint32_t reta;
2174 
2175 	PMD_INIT_FUNC_TRACE();
2176 
2177 	if (reta_size < FM10K_MAX_RSS_INDICES) {
2178 		PMD_INIT_LOG(ERR, "The size of hash lookup table configured "
2179 			"(%d) doesn't match the number hardware can supported "
2180 			"(%d)", reta_size, FM10K_MAX_RSS_INDICES);
2181 		return -EINVAL;
2182 	}
2183 
2184 	/*
2185 	 * Read Redirection Table RETA[n], n=0..31. The redirection table has
2186 	 * 128-entries in 32 registers
2187 	 */
2188 	for (i = 0; i < FM10K_MAX_RSS_INDICES; i += CHARS_PER_UINT32) {
2189 		idx = i / RTE_RETA_GROUP_SIZE;
2190 		shift = i % RTE_RETA_GROUP_SIZE;
2191 		mask = (uint8_t)((reta_conf[idx].mask >> shift) &
2192 				BIT_MASK_PER_UINT32);
2193 		if (mask == 0)
2194 			continue;
2195 
2196 		reta = FM10K_READ_REG(hw, FM10K_RETA(0, i >> 2));
2197 		for (j = 0; j < CHARS_PER_UINT32; j++) {
2198 			if (mask & (0x1 << j))
2199 				reta_conf[idx].reta[shift + j] = ((reta >>
2200 					CHAR_BIT * j) & UINT8_MAX);
2201 		}
2202 	}
2203 
2204 	return 0;
2205 }
2206 
2207 static int
2208 fm10k_rss_hash_update(struct rte_eth_dev *dev,
2209 	struct rte_eth_rss_conf *rss_conf)
2210 {
2211 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
2212 	uint32_t *key = (uint32_t *)rss_conf->rss_key;
2213 	uint32_t mrqc;
2214 	uint64_t hf = rss_conf->rss_hf;
2215 	int i;
2216 
2217 	PMD_INIT_FUNC_TRACE();
2218 
2219 	if (key && (rss_conf->rss_key_len < FM10K_RSSRK_SIZE *
2220 				FM10K_RSSRK_ENTRIES_PER_REG))
2221 		return -EINVAL;
2222 
2223 	if (hf == 0)
2224 		return -EINVAL;
2225 
2226 	mrqc = 0;
2227 	mrqc |= (hf & ETH_RSS_IPV4)              ? FM10K_MRQC_IPV4     : 0;
2228 	mrqc |= (hf & ETH_RSS_IPV6)              ? FM10K_MRQC_IPV6     : 0;
2229 	mrqc |= (hf & ETH_RSS_IPV6_EX)           ? FM10K_MRQC_IPV6     : 0;
2230 	mrqc |= (hf & ETH_RSS_NONFRAG_IPV4_TCP)  ? FM10K_MRQC_TCP_IPV4 : 0;
2231 	mrqc |= (hf & ETH_RSS_NONFRAG_IPV6_TCP)  ? FM10K_MRQC_TCP_IPV6 : 0;
2232 	mrqc |= (hf & ETH_RSS_IPV6_TCP_EX)       ? FM10K_MRQC_TCP_IPV6 : 0;
2233 	mrqc |= (hf & ETH_RSS_NONFRAG_IPV4_UDP)  ? FM10K_MRQC_UDP_IPV4 : 0;
2234 	mrqc |= (hf & ETH_RSS_NONFRAG_IPV6_UDP)  ? FM10K_MRQC_UDP_IPV6 : 0;
2235 	mrqc |= (hf & ETH_RSS_IPV6_UDP_EX)       ? FM10K_MRQC_UDP_IPV6 : 0;
2236 
2237 	/* If the mapping doesn't fit any supported, return */
2238 	if (mrqc == 0)
2239 		return -EINVAL;
2240 
2241 	if (key != NULL)
2242 		for (i = 0; i < FM10K_RSSRK_SIZE; ++i)
2243 			FM10K_WRITE_REG(hw, FM10K_RSSRK(0, i), key[i]);
2244 
2245 	FM10K_WRITE_REG(hw, FM10K_MRQC(0), mrqc);
2246 
2247 	return 0;
2248 }
2249 
2250 static int
2251 fm10k_rss_hash_conf_get(struct rte_eth_dev *dev,
2252 	struct rte_eth_rss_conf *rss_conf)
2253 {
2254 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
2255 	uint32_t *key = (uint32_t *)rss_conf->rss_key;
2256 	uint32_t mrqc;
2257 	uint64_t hf;
2258 	int i;
2259 
2260 	PMD_INIT_FUNC_TRACE();
2261 
2262 	if (key && (rss_conf->rss_key_len < FM10K_RSSRK_SIZE *
2263 				FM10K_RSSRK_ENTRIES_PER_REG))
2264 		return -EINVAL;
2265 
2266 	if (key != NULL)
2267 		for (i = 0; i < FM10K_RSSRK_SIZE; ++i)
2268 			key[i] = FM10K_READ_REG(hw, FM10K_RSSRK(0, i));
2269 
2270 	mrqc = FM10K_READ_REG(hw, FM10K_MRQC(0));
2271 	hf = 0;
2272 	hf |= (mrqc & FM10K_MRQC_IPV4)     ? ETH_RSS_IPV4              : 0;
2273 	hf |= (mrqc & FM10K_MRQC_IPV6)     ? ETH_RSS_IPV6              : 0;
2274 	hf |= (mrqc & FM10K_MRQC_IPV6)     ? ETH_RSS_IPV6_EX           : 0;
2275 	hf |= (mrqc & FM10K_MRQC_TCP_IPV4) ? ETH_RSS_NONFRAG_IPV4_TCP  : 0;
2276 	hf |= (mrqc & FM10K_MRQC_TCP_IPV6) ? ETH_RSS_NONFRAG_IPV6_TCP  : 0;
2277 	hf |= (mrqc & FM10K_MRQC_TCP_IPV6) ? ETH_RSS_IPV6_TCP_EX       : 0;
2278 	hf |= (mrqc & FM10K_MRQC_UDP_IPV4) ? ETH_RSS_NONFRAG_IPV4_UDP  : 0;
2279 	hf |= (mrqc & FM10K_MRQC_UDP_IPV6) ? ETH_RSS_NONFRAG_IPV6_UDP  : 0;
2280 	hf |= (mrqc & FM10K_MRQC_UDP_IPV6) ? ETH_RSS_IPV6_UDP_EX       : 0;
2281 
2282 	rss_conf->rss_hf = hf;
2283 
2284 	return 0;
2285 }
2286 
2287 static void
2288 fm10k_dev_enable_intr_pf(struct rte_eth_dev *dev)
2289 {
2290 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
2291 	uint32_t int_map = FM10K_INT_MAP_IMMEDIATE;
2292 
2293 	/* Bind all local non-queue interrupt to vector 0 */
2294 	int_map |= FM10K_MISC_VEC_ID;
2295 
2296 	FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_mailbox), int_map);
2297 	FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_pcie_fault), int_map);
2298 	FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_switch_up_down), int_map);
2299 	FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_switch_event), int_map);
2300 	FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_sram), int_map);
2301 	FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_vflr), int_map);
2302 
2303 	/* Enable misc causes */
2304 	FM10K_WRITE_REG(hw, FM10K_EIMR, FM10K_EIMR_ENABLE(PCA_FAULT) |
2305 				FM10K_EIMR_ENABLE(THI_FAULT) |
2306 				FM10K_EIMR_ENABLE(FUM_FAULT) |
2307 				FM10K_EIMR_ENABLE(MAILBOX) |
2308 				FM10K_EIMR_ENABLE(SWITCHREADY) |
2309 				FM10K_EIMR_ENABLE(SWITCHNOTREADY) |
2310 				FM10K_EIMR_ENABLE(SRAMERROR) |
2311 				FM10K_EIMR_ENABLE(VFLR));
2312 
2313 	/* Enable ITR 0 */
2314 	FM10K_WRITE_REG(hw, FM10K_ITR(0), FM10K_ITR_AUTOMASK |
2315 					FM10K_ITR_MASK_CLEAR);
2316 	FM10K_WRITE_FLUSH(hw);
2317 }
2318 
2319 static void
2320 fm10k_dev_disable_intr_pf(struct rte_eth_dev *dev)
2321 {
2322 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
2323 	uint32_t int_map = FM10K_INT_MAP_DISABLE;
2324 
2325 	int_map |= FM10K_MISC_VEC_ID;
2326 
2327 	FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_mailbox), int_map);
2328 	FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_pcie_fault), int_map);
2329 	FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_switch_up_down), int_map);
2330 	FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_switch_event), int_map);
2331 	FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_sram), int_map);
2332 	FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_vflr), int_map);
2333 
2334 	/* Disable misc causes */
2335 	FM10K_WRITE_REG(hw, FM10K_EIMR, FM10K_EIMR_DISABLE(PCA_FAULT) |
2336 				FM10K_EIMR_DISABLE(THI_FAULT) |
2337 				FM10K_EIMR_DISABLE(FUM_FAULT) |
2338 				FM10K_EIMR_DISABLE(MAILBOX) |
2339 				FM10K_EIMR_DISABLE(SWITCHREADY) |
2340 				FM10K_EIMR_DISABLE(SWITCHNOTREADY) |
2341 				FM10K_EIMR_DISABLE(SRAMERROR) |
2342 				FM10K_EIMR_DISABLE(VFLR));
2343 
2344 	/* Disable ITR 0 */
2345 	FM10K_WRITE_REG(hw, FM10K_ITR(0), FM10K_ITR_MASK_SET);
2346 	FM10K_WRITE_FLUSH(hw);
2347 }
2348 
2349 static void
2350 fm10k_dev_enable_intr_vf(struct rte_eth_dev *dev)
2351 {
2352 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
2353 	uint32_t int_map = FM10K_INT_MAP_IMMEDIATE;
2354 
2355 	/* Bind all local non-queue interrupt to vector 0 */
2356 	int_map |= FM10K_MISC_VEC_ID;
2357 
2358 	/* Only INT 0 available, other 15 are reserved. */
2359 	FM10K_WRITE_REG(hw, FM10K_VFINT_MAP, int_map);
2360 
2361 	/* Enable ITR 0 */
2362 	FM10K_WRITE_REG(hw, FM10K_VFITR(0), FM10K_ITR_AUTOMASK |
2363 					FM10K_ITR_MASK_CLEAR);
2364 	FM10K_WRITE_FLUSH(hw);
2365 }
2366 
2367 static void
2368 fm10k_dev_disable_intr_vf(struct rte_eth_dev *dev)
2369 {
2370 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
2371 	uint32_t int_map = FM10K_INT_MAP_DISABLE;
2372 
2373 	int_map |= FM10K_MISC_VEC_ID;
2374 
2375 	/* Only INT 0 available, other 15 are reserved. */
2376 	FM10K_WRITE_REG(hw, FM10K_VFINT_MAP, int_map);
2377 
2378 	/* Disable ITR 0 */
2379 	FM10K_WRITE_REG(hw, FM10K_VFITR(0), FM10K_ITR_MASK_SET);
2380 	FM10K_WRITE_FLUSH(hw);
2381 }
2382 
2383 static int
2384 fm10k_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
2385 {
2386 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
2387 	struct rte_pci_device *pdev = RTE_ETH_DEV_TO_PCI(dev);
2388 
2389 	/* Enable ITR */
2390 	if (hw->mac.type == fm10k_mac_pf)
2391 		FM10K_WRITE_REG(hw, FM10K_ITR(Q2V(pdev, queue_id)),
2392 			FM10K_ITR_AUTOMASK | FM10K_ITR_MASK_CLEAR);
2393 	else
2394 		FM10K_WRITE_REG(hw, FM10K_VFITR(Q2V(pdev, queue_id)),
2395 			FM10K_ITR_AUTOMASK | FM10K_ITR_MASK_CLEAR);
2396 	rte_intr_ack(&pdev->intr_handle);
2397 	return 0;
2398 }
2399 
2400 static int
2401 fm10k_dev_rx_queue_intr_disable(struct rte_eth_dev *dev, uint16_t queue_id)
2402 {
2403 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
2404 	struct rte_pci_device *pdev = RTE_ETH_DEV_TO_PCI(dev);
2405 
2406 	/* Disable ITR */
2407 	if (hw->mac.type == fm10k_mac_pf)
2408 		FM10K_WRITE_REG(hw, FM10K_ITR(Q2V(pdev, queue_id)),
2409 			FM10K_ITR_MASK_SET);
2410 	else
2411 		FM10K_WRITE_REG(hw, FM10K_VFITR(Q2V(pdev, queue_id)),
2412 			FM10K_ITR_MASK_SET);
2413 	return 0;
2414 }
2415 
2416 static int
2417 fm10k_dev_rxq_interrupt_setup(struct rte_eth_dev *dev)
2418 {
2419 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
2420 	struct rte_pci_device *pdev = RTE_ETH_DEV_TO_PCI(dev);
2421 	struct rte_intr_handle *intr_handle = &pdev->intr_handle;
2422 	uint32_t intr_vector, vec;
2423 	uint16_t queue_id;
2424 	int result = 0;
2425 
2426 	/* fm10k needs one separate interrupt for mailbox,
2427 	 * so only drivers which support multiple interrupt vectors
2428 	 * e.g. vfio-pci can work for fm10k interrupt mode
2429 	 */
2430 	if (!rte_intr_cap_multiple(intr_handle) ||
2431 			dev->data->dev_conf.intr_conf.rxq == 0)
2432 		return result;
2433 
2434 	intr_vector = dev->data->nb_rx_queues;
2435 
2436 	/* disable interrupt first */
2437 	rte_intr_disable(intr_handle);
2438 	if (hw->mac.type == fm10k_mac_pf)
2439 		fm10k_dev_disable_intr_pf(dev);
2440 	else
2441 		fm10k_dev_disable_intr_vf(dev);
2442 
2443 	if (rte_intr_efd_enable(intr_handle, intr_vector)) {
2444 		PMD_INIT_LOG(ERR, "Failed to init event fd");
2445 		result = -EIO;
2446 	}
2447 
2448 	if (rte_intr_dp_is_en(intr_handle) && !result) {
2449 		intr_handle->intr_vec =	rte_zmalloc("intr_vec",
2450 			dev->data->nb_rx_queues * sizeof(int), 0);
2451 		if (intr_handle->intr_vec) {
2452 			for (queue_id = 0, vec = FM10K_RX_VEC_START;
2453 					queue_id < dev->data->nb_rx_queues;
2454 					queue_id++) {
2455 				intr_handle->intr_vec[queue_id] = vec;
2456 				if (vec < intr_handle->nb_efd - 1
2457 						+ FM10K_RX_VEC_START)
2458 					vec++;
2459 			}
2460 		} else {
2461 			PMD_INIT_LOG(ERR, "Failed to allocate %d rx_queues"
2462 				" intr_vec", dev->data->nb_rx_queues);
2463 			rte_intr_efd_disable(intr_handle);
2464 			result = -ENOMEM;
2465 		}
2466 	}
2467 
2468 	if (hw->mac.type == fm10k_mac_pf)
2469 		fm10k_dev_enable_intr_pf(dev);
2470 	else
2471 		fm10k_dev_enable_intr_vf(dev);
2472 	rte_intr_enable(intr_handle);
2473 	hw->mac.ops.update_int_moderator(hw);
2474 	return result;
2475 }
2476 
2477 static int
2478 fm10k_dev_handle_fault(struct fm10k_hw *hw, uint32_t eicr)
2479 {
2480 	struct fm10k_fault fault;
2481 	int err;
2482 	const char *estr = "Unknown error";
2483 
2484 	/* Process PCA fault */
2485 	if (eicr & FM10K_EICR_PCA_FAULT) {
2486 		err = fm10k_get_fault(hw, FM10K_PCA_FAULT, &fault);
2487 		if (err)
2488 			goto error;
2489 		switch (fault.type) {
2490 		case PCA_NO_FAULT:
2491 			estr = "PCA_NO_FAULT"; break;
2492 		case PCA_UNMAPPED_ADDR:
2493 			estr = "PCA_UNMAPPED_ADDR"; break;
2494 		case PCA_BAD_QACCESS_PF:
2495 			estr = "PCA_BAD_QACCESS_PF"; break;
2496 		case PCA_BAD_QACCESS_VF:
2497 			estr = "PCA_BAD_QACCESS_VF"; break;
2498 		case PCA_MALICIOUS_REQ:
2499 			estr = "PCA_MALICIOUS_REQ"; break;
2500 		case PCA_POISONED_TLP:
2501 			estr = "PCA_POISONED_TLP"; break;
2502 		case PCA_TLP_ABORT:
2503 			estr = "PCA_TLP_ABORT"; break;
2504 		default:
2505 			goto error;
2506 		}
2507 		PMD_INIT_LOG(ERR, "%s: %s(%d) Addr:0x%"PRIx64" Spec: 0x%x",
2508 			estr, fault.func ? "VF" : "PF", fault.func,
2509 			fault.address, fault.specinfo);
2510 	}
2511 
2512 	/* Process THI fault */
2513 	if (eicr & FM10K_EICR_THI_FAULT) {
2514 		err = fm10k_get_fault(hw, FM10K_THI_FAULT, &fault);
2515 		if (err)
2516 			goto error;
2517 		switch (fault.type) {
2518 		case THI_NO_FAULT:
2519 			estr = "THI_NO_FAULT"; break;
2520 		case THI_MAL_DIS_Q_FAULT:
2521 			estr = "THI_MAL_DIS_Q_FAULT"; break;
2522 		default:
2523 			goto error;
2524 		}
2525 		PMD_INIT_LOG(ERR, "%s: %s(%d) Addr:0x%"PRIx64" Spec: 0x%x",
2526 			estr, fault.func ? "VF" : "PF", fault.func,
2527 			fault.address, fault.specinfo);
2528 	}
2529 
2530 	/* Process FUM fault */
2531 	if (eicr & FM10K_EICR_FUM_FAULT) {
2532 		err = fm10k_get_fault(hw, FM10K_FUM_FAULT, &fault);
2533 		if (err)
2534 			goto error;
2535 		switch (fault.type) {
2536 		case FUM_NO_FAULT:
2537 			estr = "FUM_NO_FAULT"; break;
2538 		case FUM_UNMAPPED_ADDR:
2539 			estr = "FUM_UNMAPPED_ADDR"; break;
2540 		case FUM_POISONED_TLP:
2541 			estr = "FUM_POISONED_TLP"; break;
2542 		case FUM_BAD_VF_QACCESS:
2543 			estr = "FUM_BAD_VF_QACCESS"; break;
2544 		case FUM_ADD_DECODE_ERR:
2545 			estr = "FUM_ADD_DECODE_ERR"; break;
2546 		case FUM_RO_ERROR:
2547 			estr = "FUM_RO_ERROR"; break;
2548 		case FUM_QPRC_CRC_ERROR:
2549 			estr = "FUM_QPRC_CRC_ERROR"; break;
2550 		case FUM_CSR_TIMEOUT:
2551 			estr = "FUM_CSR_TIMEOUT"; break;
2552 		case FUM_INVALID_TYPE:
2553 			estr = "FUM_INVALID_TYPE"; break;
2554 		case FUM_INVALID_LENGTH:
2555 			estr = "FUM_INVALID_LENGTH"; break;
2556 		case FUM_INVALID_BE:
2557 			estr = "FUM_INVALID_BE"; break;
2558 		case FUM_INVALID_ALIGN:
2559 			estr = "FUM_INVALID_ALIGN"; break;
2560 		default:
2561 			goto error;
2562 		}
2563 		PMD_INIT_LOG(ERR, "%s: %s(%d) Addr:0x%"PRIx64" Spec: 0x%x",
2564 			estr, fault.func ? "VF" : "PF", fault.func,
2565 			fault.address, fault.specinfo);
2566 	}
2567 
2568 	return 0;
2569 error:
2570 	PMD_INIT_LOG(ERR, "Failed to handle fault event.");
2571 	return err;
2572 }
2573 
2574 /**
2575  * PF interrupt handler triggered by NIC for handling specific interrupt.
2576  *
2577  * @param handle
2578  *  Pointer to interrupt handle.
2579  * @param param
2580  *  The address of parameter (struct rte_eth_dev *) regsitered before.
2581  *
2582  * @return
2583  *  void
2584  */
2585 static void
2586 fm10k_dev_interrupt_handler_pf(void *param)
2587 {
2588 	struct rte_eth_dev *dev = (struct rte_eth_dev *)param;
2589 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
2590 	uint32_t cause, status;
2591 	struct fm10k_dev_info *dev_info =
2592 		FM10K_DEV_PRIVATE_TO_INFO(dev->data->dev_private);
2593 	int status_mbx;
2594 	s32 err;
2595 
2596 	if (hw->mac.type != fm10k_mac_pf)
2597 		return;
2598 
2599 	cause = FM10K_READ_REG(hw, FM10K_EICR);
2600 
2601 	/* Handle PCI fault cases */
2602 	if (cause & FM10K_EICR_FAULT_MASK) {
2603 		PMD_INIT_LOG(ERR, "INT: find fault!");
2604 		fm10k_dev_handle_fault(hw, cause);
2605 	}
2606 
2607 	/* Handle switch up/down */
2608 	if (cause & FM10K_EICR_SWITCHNOTREADY)
2609 		PMD_INIT_LOG(ERR, "INT: Switch is not ready");
2610 
2611 	if (cause & FM10K_EICR_SWITCHREADY) {
2612 		PMD_INIT_LOG(INFO, "INT: Switch is ready");
2613 		if (dev_info->sm_down == 1) {
2614 			fm10k_mbx_lock(hw);
2615 
2616 			/* For recreating logical ports */
2617 			status_mbx = hw->mac.ops.update_lport_state(hw,
2618 					hw->mac.dglort_map, MAX_LPORT_NUM, 1);
2619 			if (status_mbx == FM10K_SUCCESS)
2620 				PMD_INIT_LOG(INFO,
2621 					"INT: Recreated Logical port");
2622 			else
2623 				PMD_INIT_LOG(INFO,
2624 					"INT: Logical ports weren't recreated");
2625 
2626 			status_mbx = hw->mac.ops.update_xcast_mode(hw,
2627 				hw->mac.dglort_map, FM10K_XCAST_MODE_NONE);
2628 			if (status_mbx != FM10K_SUCCESS)
2629 				PMD_INIT_LOG(ERR, "Failed to set XCAST mode");
2630 
2631 			fm10k_mbx_unlock(hw);
2632 
2633 			/* first clear the internal SW recording structure */
2634 			if (!(dev->data->dev_conf.rxmode.mq_mode &
2635 						ETH_MQ_RX_VMDQ_FLAG))
2636 				fm10k_vlan_filter_set(dev, hw->mac.default_vid,
2637 					false);
2638 
2639 			fm10k_MAC_filter_set(dev, hw->mac.addr, false,
2640 					MAIN_VSI_POOL_NUMBER);
2641 
2642 			/*
2643 			 * Add default mac address and vlan for the logical
2644 			 * ports that have been created, leave to the
2645 			 * application to fully recover Rx filtering.
2646 			 */
2647 			fm10k_MAC_filter_set(dev, hw->mac.addr, true,
2648 					MAIN_VSI_POOL_NUMBER);
2649 
2650 			if (!(dev->data->dev_conf.rxmode.mq_mode &
2651 						ETH_MQ_RX_VMDQ_FLAG))
2652 				fm10k_vlan_filter_set(dev, hw->mac.default_vid,
2653 					true);
2654 
2655 			dev_info->sm_down = 0;
2656 			_rte_eth_dev_callback_process(dev,
2657 					RTE_ETH_EVENT_INTR_LSC,
2658 					NULL);
2659 		}
2660 	}
2661 
2662 	/* Handle mailbox message */
2663 	fm10k_mbx_lock(hw);
2664 	err = hw->mbx.ops.process(hw, &hw->mbx);
2665 	fm10k_mbx_unlock(hw);
2666 
2667 	if (err == FM10K_ERR_RESET_REQUESTED) {
2668 		PMD_INIT_LOG(INFO, "INT: Switch is down");
2669 		dev_info->sm_down = 1;
2670 		_rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC,
2671 				NULL);
2672 	}
2673 
2674 	/* Handle SRAM error */
2675 	if (cause & FM10K_EICR_SRAMERROR) {
2676 		PMD_INIT_LOG(ERR, "INT: SRAM error on PEP");
2677 
2678 		status = FM10K_READ_REG(hw, FM10K_SRAM_IP);
2679 		/* Write to clear pending bits */
2680 		FM10K_WRITE_REG(hw, FM10K_SRAM_IP, status);
2681 
2682 		/* Todo: print out error message after shared code  updates */
2683 	}
2684 
2685 	/* Clear these 3 events if having any */
2686 	cause &= FM10K_EICR_SWITCHNOTREADY | FM10K_EICR_MAILBOX |
2687 		 FM10K_EICR_SWITCHREADY;
2688 	if (cause)
2689 		FM10K_WRITE_REG(hw, FM10K_EICR, cause);
2690 
2691 	/* Re-enable interrupt from device side */
2692 	FM10K_WRITE_REG(hw, FM10K_ITR(0), FM10K_ITR_AUTOMASK |
2693 					FM10K_ITR_MASK_CLEAR);
2694 	/* Re-enable interrupt from host side */
2695 	rte_intr_ack(dev->intr_handle);
2696 }
2697 
2698 /**
2699  * VF interrupt handler triggered by NIC for handling specific interrupt.
2700  *
2701  * @param handle
2702  *  Pointer to interrupt handle.
2703  * @param param
2704  *  The address of parameter (struct rte_eth_dev *) regsitered before.
2705  *
2706  * @return
2707  *  void
2708  */
2709 static void
2710 fm10k_dev_interrupt_handler_vf(void *param)
2711 {
2712 	struct rte_eth_dev *dev = (struct rte_eth_dev *)param;
2713 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
2714 	struct fm10k_mbx_info *mbx = &hw->mbx;
2715 	struct fm10k_dev_info *dev_info =
2716 		FM10K_DEV_PRIVATE_TO_INFO(dev->data->dev_private);
2717 	const enum fm10k_mbx_state state = mbx->state;
2718 	int status_mbx;
2719 
2720 	if (hw->mac.type != fm10k_mac_vf)
2721 		return;
2722 
2723 	/* Handle mailbox message if lock is acquired */
2724 	fm10k_mbx_lock(hw);
2725 	hw->mbx.ops.process(hw, &hw->mbx);
2726 	fm10k_mbx_unlock(hw);
2727 
2728 	if (state == FM10K_STATE_OPEN && mbx->state == FM10K_STATE_CONNECT) {
2729 		PMD_INIT_LOG(INFO, "INT: Switch has gone down");
2730 
2731 		fm10k_mbx_lock(hw);
2732 		hw->mac.ops.update_lport_state(hw, hw->mac.dglort_map,
2733 				MAX_LPORT_NUM, 1);
2734 		fm10k_mbx_unlock(hw);
2735 
2736 		/* Setting reset flag */
2737 		dev_info->sm_down = 1;
2738 		_rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC,
2739 				NULL);
2740 	}
2741 
2742 	if (dev_info->sm_down == 1 &&
2743 			hw->mac.dglort_map == FM10K_DGLORTMAP_ZERO) {
2744 		PMD_INIT_LOG(INFO, "INT: Switch has gone up");
2745 		fm10k_mbx_lock(hw);
2746 		status_mbx = hw->mac.ops.update_xcast_mode(hw,
2747 				hw->mac.dglort_map, FM10K_XCAST_MODE_NONE);
2748 		if (status_mbx != FM10K_SUCCESS)
2749 			PMD_INIT_LOG(ERR, "Failed to set XCAST mode");
2750 		fm10k_mbx_unlock(hw);
2751 
2752 		/* first clear the internal SW recording structure */
2753 		fm10k_vlan_filter_set(dev, hw->mac.default_vid, false);
2754 		fm10k_MAC_filter_set(dev, hw->mac.addr, false,
2755 				MAIN_VSI_POOL_NUMBER);
2756 
2757 		/*
2758 		 * Add default mac address and vlan for the logical ports that
2759 		 * have been created, leave to the application to fully recover
2760 		 * Rx filtering.
2761 		 */
2762 		fm10k_MAC_filter_set(dev, hw->mac.addr, true,
2763 				MAIN_VSI_POOL_NUMBER);
2764 		fm10k_vlan_filter_set(dev, hw->mac.default_vid, true);
2765 
2766 		dev_info->sm_down = 0;
2767 		_rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC,
2768 				NULL);
2769 	}
2770 
2771 	/* Re-enable interrupt from device side */
2772 	FM10K_WRITE_REG(hw, FM10K_VFITR(0), FM10K_ITR_AUTOMASK |
2773 					FM10K_ITR_MASK_CLEAR);
2774 	/* Re-enable interrupt from host side */
2775 	rte_intr_ack(dev->intr_handle);
2776 }
2777 
2778 /* Mailbox message handler in VF */
2779 static const struct fm10k_msg_data fm10k_msgdata_vf[] = {
2780 	FM10K_TLV_MSG_TEST_HANDLER(fm10k_tlv_msg_test),
2781 	FM10K_VF_MSG_MAC_VLAN_HANDLER(fm10k_msg_mac_vlan_vf),
2782 	FM10K_VF_MSG_LPORT_STATE_HANDLER(fm10k_msg_lport_state_vf),
2783 	FM10K_TLV_MSG_ERROR_HANDLER(fm10k_tlv_msg_error),
2784 };
2785 
2786 static int
2787 fm10k_setup_mbx_service(struct fm10k_hw *hw)
2788 {
2789 	int err = 0;
2790 
2791 	/* Initialize mailbox lock */
2792 	fm10k_mbx_initlock(hw);
2793 
2794 	/* Replace default message handler with new ones */
2795 	if (hw->mac.type == fm10k_mac_vf)
2796 		err = hw->mbx.ops.register_handlers(&hw->mbx, fm10k_msgdata_vf);
2797 
2798 	if (err) {
2799 		PMD_INIT_LOG(ERR, "Failed to register mailbox handler.err:%d",
2800 				err);
2801 		return err;
2802 	}
2803 	/* Connect to SM for PF device or PF for VF device */
2804 	return hw->mbx.ops.connect(hw, &hw->mbx);
2805 }
2806 
2807 static void
2808 fm10k_close_mbx_service(struct fm10k_hw *hw)
2809 {
2810 	/* Disconnect from SM for PF device or PF for VF device */
2811 	hw->mbx.ops.disconnect(hw, &hw->mbx);
2812 }
2813 
2814 static void
2815 fm10k_dev_close(struct rte_eth_dev *dev)
2816 {
2817 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
2818 	struct rte_pci_device *pdev = RTE_ETH_DEV_TO_PCI(dev);
2819 	struct rte_intr_handle *intr_handle = &pdev->intr_handle;
2820 
2821 	PMD_INIT_FUNC_TRACE();
2822 
2823 	fm10k_mbx_lock(hw);
2824 	hw->mac.ops.update_lport_state(hw, hw->mac.dglort_map,
2825 		MAX_LPORT_NUM, false);
2826 	fm10k_mbx_unlock(hw);
2827 
2828 	/* allow 100ms for device to quiesce */
2829 	rte_delay_us(FM10K_SWITCH_QUIESCE_US);
2830 
2831 	/* Stop mailbox service first */
2832 	fm10k_close_mbx_service(hw);
2833 	fm10k_dev_stop(dev);
2834 	fm10k_dev_queue_release(dev);
2835 	fm10k_stop_hw(hw);
2836 
2837 	dev->dev_ops = NULL;
2838 	dev->rx_pkt_burst = NULL;
2839 	dev->tx_pkt_burst = NULL;
2840 
2841 	/* disable uio/vfio intr */
2842 	rte_intr_disable(intr_handle);
2843 
2844 	/*PF/VF has different interrupt handling mechanism */
2845 	if (hw->mac.type == fm10k_mac_pf) {
2846 		/* disable interrupt */
2847 		fm10k_dev_disable_intr_pf(dev);
2848 
2849 		/* unregister callback func to eal lib */
2850 		rte_intr_callback_unregister(intr_handle,
2851 			fm10k_dev_interrupt_handler_pf, (void *)dev);
2852 	} else {
2853 		/* disable interrupt */
2854 		fm10k_dev_disable_intr_vf(dev);
2855 
2856 		rte_intr_callback_unregister(intr_handle,
2857 			fm10k_dev_interrupt_handler_vf, (void *)dev);
2858 	}
2859 }
2860 
2861 static const struct eth_dev_ops fm10k_eth_dev_ops = {
2862 	.dev_configure		= fm10k_dev_configure,
2863 	.dev_start		= fm10k_dev_start,
2864 	.dev_stop		= fm10k_dev_stop,
2865 	.dev_close		= fm10k_dev_close,
2866 	.promiscuous_enable     = fm10k_dev_promiscuous_enable,
2867 	.promiscuous_disable    = fm10k_dev_promiscuous_disable,
2868 	.allmulticast_enable    = fm10k_dev_allmulticast_enable,
2869 	.allmulticast_disable   = fm10k_dev_allmulticast_disable,
2870 	.stats_get		= fm10k_stats_get,
2871 	.xstats_get		= fm10k_xstats_get,
2872 	.xstats_get_names	= fm10k_xstats_get_names,
2873 	.stats_reset		= fm10k_stats_reset,
2874 	.xstats_reset		= fm10k_stats_reset,
2875 	.link_update		= fm10k_link_update,
2876 	.dev_infos_get		= fm10k_dev_infos_get,
2877 	.dev_supported_ptypes_get = fm10k_dev_supported_ptypes_get,
2878 	.vlan_filter_set	= fm10k_vlan_filter_set,
2879 	.vlan_offload_set	= fm10k_vlan_offload_set,
2880 	.mac_addr_add		= fm10k_macaddr_add,
2881 	.mac_addr_remove	= fm10k_macaddr_remove,
2882 	.rx_queue_start		= fm10k_dev_rx_queue_start,
2883 	.rx_queue_stop		= fm10k_dev_rx_queue_stop,
2884 	.tx_queue_start		= fm10k_dev_tx_queue_start,
2885 	.tx_queue_stop		= fm10k_dev_tx_queue_stop,
2886 	.rx_queue_setup		= fm10k_rx_queue_setup,
2887 	.rx_queue_release	= fm10k_rx_queue_release,
2888 	.tx_queue_setup		= fm10k_tx_queue_setup,
2889 	.tx_queue_release	= fm10k_tx_queue_release,
2890 	.rx_queue_count		= fm10k_dev_rx_queue_count,
2891 	.rx_descriptor_done	= fm10k_dev_rx_descriptor_done,
2892 	.rx_descriptor_status = fm10k_dev_rx_descriptor_status,
2893 	.tx_descriptor_status = fm10k_dev_tx_descriptor_status,
2894 	.rx_queue_intr_enable	= fm10k_dev_rx_queue_intr_enable,
2895 	.rx_queue_intr_disable	= fm10k_dev_rx_queue_intr_disable,
2896 	.reta_update		= fm10k_reta_update,
2897 	.reta_query		= fm10k_reta_query,
2898 	.rss_hash_update	= fm10k_rss_hash_update,
2899 	.rss_hash_conf_get	= fm10k_rss_hash_conf_get,
2900 };
2901 
2902 static int ftag_check_handler(__rte_unused const char *key,
2903 		const char *value, __rte_unused void *opaque)
2904 {
2905 	if (strcmp(value, "1"))
2906 		return -1;
2907 
2908 	return 0;
2909 }
2910 
2911 static int
2912 fm10k_check_ftag(struct rte_devargs *devargs)
2913 {
2914 	struct rte_kvargs *kvlist;
2915 	const char *ftag_key = "enable_ftag";
2916 
2917 	if (devargs == NULL)
2918 		return 0;
2919 
2920 	kvlist = rte_kvargs_parse(devargs->args, NULL);
2921 	if (kvlist == NULL)
2922 		return 0;
2923 
2924 	if (!rte_kvargs_count(kvlist, ftag_key)) {
2925 		rte_kvargs_free(kvlist);
2926 		return 0;
2927 	}
2928 	/* FTAG is enabled when there's key-value pair: enable_ftag=1 */
2929 	if (rte_kvargs_process(kvlist, ftag_key,
2930 				ftag_check_handler, NULL) < 0) {
2931 		rte_kvargs_free(kvlist);
2932 		return 0;
2933 	}
2934 	rte_kvargs_free(kvlist);
2935 
2936 	return 1;
2937 }
2938 
2939 static uint16_t
2940 fm10k_xmit_pkts_vec(void *tx_queue, struct rte_mbuf **tx_pkts,
2941 		    uint16_t nb_pkts)
2942 {
2943 	uint16_t nb_tx = 0;
2944 	struct fm10k_tx_queue *txq = (struct fm10k_tx_queue *)tx_queue;
2945 
2946 	while (nb_pkts) {
2947 		uint16_t ret, num;
2948 
2949 		num = (uint16_t)RTE_MIN(nb_pkts, txq->rs_thresh);
2950 		ret = fm10k_xmit_fixed_burst_vec(tx_queue, &tx_pkts[nb_tx],
2951 						 num);
2952 		nb_tx += ret;
2953 		nb_pkts -= ret;
2954 		if (ret < num)
2955 			break;
2956 	}
2957 
2958 	return nb_tx;
2959 }
2960 
2961 static void __attribute__((cold))
2962 fm10k_set_tx_function(struct rte_eth_dev *dev)
2963 {
2964 	struct fm10k_tx_queue *txq;
2965 	int i;
2966 	int use_sse = 1;
2967 	uint16_t tx_ftag_en = 0;
2968 
2969 	if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
2970 		/* primary process has set the ftag flag and offloads */
2971 		txq = dev->data->tx_queues[0];
2972 		if (fm10k_tx_vec_condition_check(txq)) {
2973 			dev->tx_pkt_burst = fm10k_xmit_pkts;
2974 			dev->tx_pkt_prepare = fm10k_prep_pkts;
2975 			PMD_INIT_LOG(DEBUG, "Use regular Tx func");
2976 		} else {
2977 			PMD_INIT_LOG(DEBUG, "Use vector Tx func");
2978 			dev->tx_pkt_burst = fm10k_xmit_pkts_vec;
2979 			dev->tx_pkt_prepare = NULL;
2980 		}
2981 		return;
2982 	}
2983 
2984 	if (fm10k_check_ftag(dev->device->devargs))
2985 		tx_ftag_en = 1;
2986 
2987 	for (i = 0; i < dev->data->nb_tx_queues; i++) {
2988 		txq = dev->data->tx_queues[i];
2989 		txq->tx_ftag_en = tx_ftag_en;
2990 		/* Check if Vector Tx is satisfied */
2991 		if (fm10k_tx_vec_condition_check(txq))
2992 			use_sse = 0;
2993 	}
2994 
2995 	if (use_sse) {
2996 		PMD_INIT_LOG(DEBUG, "Use vector Tx func");
2997 		for (i = 0; i < dev->data->nb_tx_queues; i++) {
2998 			txq = dev->data->tx_queues[i];
2999 			fm10k_txq_vec_setup(txq);
3000 		}
3001 		dev->tx_pkt_burst = fm10k_xmit_pkts_vec;
3002 		dev->tx_pkt_prepare = NULL;
3003 	} else {
3004 		dev->tx_pkt_burst = fm10k_xmit_pkts;
3005 		dev->tx_pkt_prepare = fm10k_prep_pkts;
3006 		PMD_INIT_LOG(DEBUG, "Use regular Tx func");
3007 	}
3008 }
3009 
3010 static void __attribute__((cold))
3011 fm10k_set_rx_function(struct rte_eth_dev *dev)
3012 {
3013 	struct fm10k_dev_info *dev_info =
3014 		FM10K_DEV_PRIVATE_TO_INFO(dev->data->dev_private);
3015 	uint16_t i, rx_using_sse;
3016 	uint16_t rx_ftag_en = 0;
3017 
3018 	if (fm10k_check_ftag(dev->device->devargs))
3019 		rx_ftag_en = 1;
3020 
3021 	/* In order to allow Vector Rx there are a few configuration
3022 	 * conditions to be met.
3023 	 */
3024 	if (!fm10k_rx_vec_condition_check(dev) &&
3025 			dev_info->rx_vec_allowed && !rx_ftag_en) {
3026 		if (dev->data->scattered_rx)
3027 			dev->rx_pkt_burst = fm10k_recv_scattered_pkts_vec;
3028 		else
3029 			dev->rx_pkt_burst = fm10k_recv_pkts_vec;
3030 	} else if (dev->data->scattered_rx)
3031 		dev->rx_pkt_burst = fm10k_recv_scattered_pkts;
3032 	else
3033 		dev->rx_pkt_burst = fm10k_recv_pkts;
3034 
3035 	rx_using_sse =
3036 		(dev->rx_pkt_burst == fm10k_recv_scattered_pkts_vec ||
3037 		dev->rx_pkt_burst == fm10k_recv_pkts_vec);
3038 
3039 	if (rx_using_sse)
3040 		PMD_INIT_LOG(DEBUG, "Use vector Rx func");
3041 	else
3042 		PMD_INIT_LOG(DEBUG, "Use regular Rx func");
3043 
3044 	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
3045 		return;
3046 
3047 	for (i = 0; i < dev->data->nb_rx_queues; i++) {
3048 		struct fm10k_rx_queue *rxq = dev->data->rx_queues[i];
3049 
3050 		rxq->rx_using_sse = rx_using_sse;
3051 		rxq->rx_ftag_en = rx_ftag_en;
3052 	}
3053 }
3054 
3055 static void
3056 fm10k_params_init(struct rte_eth_dev *dev)
3057 {
3058 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
3059 	struct fm10k_dev_info *info =
3060 		FM10K_DEV_PRIVATE_TO_INFO(dev->data->dev_private);
3061 
3062 	/* Inialize bus info. Normally we would call fm10k_get_bus_info(), but
3063 	 * there is no way to get link status without reading BAR4.  Until this
3064 	 * works, assume we have maximum bandwidth.
3065 	 * @todo - fix bus info
3066 	 */
3067 	hw->bus_caps.speed = fm10k_bus_speed_8000;
3068 	hw->bus_caps.width = fm10k_bus_width_pcie_x8;
3069 	hw->bus_caps.payload = fm10k_bus_payload_512;
3070 	hw->bus.speed = fm10k_bus_speed_8000;
3071 	hw->bus.width = fm10k_bus_width_pcie_x8;
3072 	hw->bus.payload = fm10k_bus_payload_256;
3073 
3074 	info->rx_vec_allowed = true;
3075 	info->sm_down = false;
3076 }
3077 
3078 static int
3079 eth_fm10k_dev_init(struct rte_eth_dev *dev)
3080 {
3081 	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
3082 	struct rte_pci_device *pdev = RTE_ETH_DEV_TO_PCI(dev);
3083 	struct rte_intr_handle *intr_handle = &pdev->intr_handle;
3084 	int diag, i;
3085 	struct fm10k_macvlan_filter_info *macvlan;
3086 
3087 	PMD_INIT_FUNC_TRACE();
3088 
3089 	dev->dev_ops = &fm10k_eth_dev_ops;
3090 	dev->rx_pkt_burst = &fm10k_recv_pkts;
3091 	dev->tx_pkt_burst = &fm10k_xmit_pkts;
3092 	dev->tx_pkt_prepare = &fm10k_prep_pkts;
3093 
3094 	/*
3095 	 * Primary process does the whole initialization, for secondary
3096 	 * processes, we just select the same Rx and Tx function as primary.
3097 	 */
3098 	if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
3099 		fm10k_set_rx_function(dev);
3100 		fm10k_set_tx_function(dev);
3101 		return 0;
3102 	}
3103 
3104 	rte_eth_copy_pci_info(dev, pdev);
3105 
3106 	macvlan = FM10K_DEV_PRIVATE_TO_MACVLAN(dev->data->dev_private);
3107 	memset(macvlan, 0, sizeof(*macvlan));
3108 	/* Vendor and Device ID need to be set before init of shared code */
3109 	memset(hw, 0, sizeof(*hw));
3110 	hw->device_id = pdev->id.device_id;
3111 	hw->vendor_id = pdev->id.vendor_id;
3112 	hw->subsystem_device_id = pdev->id.subsystem_device_id;
3113 	hw->subsystem_vendor_id = pdev->id.subsystem_vendor_id;
3114 	hw->revision_id = 0;
3115 	hw->hw_addr = (void *)pdev->mem_resource[0].addr;
3116 	if (hw->hw_addr == NULL) {
3117 		PMD_INIT_LOG(ERR, "Bad mem resource."
3118 			" Try to blacklist unused devices.");
3119 		return -EIO;
3120 	}
3121 
3122 	/* Store fm10k_adapter pointer */
3123 	hw->back = dev->data->dev_private;
3124 
3125 	/* Initialize the shared code */
3126 	diag = fm10k_init_shared_code(hw);
3127 	if (diag != FM10K_SUCCESS) {
3128 		PMD_INIT_LOG(ERR, "Shared code init failed: %d", diag);
3129 		return -EIO;
3130 	}
3131 
3132 	/* Initialize parameters */
3133 	fm10k_params_init(dev);
3134 
3135 	/* Initialize the hw */
3136 	diag = fm10k_init_hw(hw);
3137 	if (diag != FM10K_SUCCESS) {
3138 		PMD_INIT_LOG(ERR, "Hardware init failed: %d", diag);
3139 		return -EIO;
3140 	}
3141 
3142 	/* Initialize MAC address(es) */
3143 	dev->data->mac_addrs = rte_zmalloc("fm10k",
3144 			RTE_ETHER_ADDR_LEN * FM10K_MAX_MACADDR_NUM, 0);
3145 	if (dev->data->mac_addrs == NULL) {
3146 		PMD_INIT_LOG(ERR, "Cannot allocate memory for MAC addresses");
3147 		return -ENOMEM;
3148 	}
3149 
3150 	diag = fm10k_read_mac_addr(hw);
3151 
3152 	rte_ether_addr_copy((const struct rte_ether_addr *)hw->mac.addr,
3153 			&dev->data->mac_addrs[0]);
3154 
3155 	if (diag != FM10K_SUCCESS ||
3156 		!rte_is_valid_assigned_ether_addr(dev->data->mac_addrs)) {
3157 
3158 		/* Generate a random addr */
3159 		rte_eth_random_addr(hw->mac.addr);
3160 		memcpy(hw->mac.perm_addr, hw->mac.addr, ETH_ALEN);
3161 		rte_ether_addr_copy((const struct rte_ether_addr *)hw->mac.addr,
3162 		&dev->data->mac_addrs[0]);
3163 	}
3164 
3165 	/* Pass the information to the rte_eth_dev_close() that it should also
3166 	 * release the private port resources.
3167 	 */
3168 	dev->data->dev_flags |= RTE_ETH_DEV_CLOSE_REMOVE;
3169 
3170 	/* Reset the hw statistics */
3171 	diag = fm10k_stats_reset(dev);
3172 	if (diag != 0) {
3173 		PMD_INIT_LOG(ERR, "Stats reset failed: %d", diag);
3174 		return diag;
3175 	}
3176 
3177 	/* Reset the hw */
3178 	diag = fm10k_reset_hw(hw);
3179 	if (diag != FM10K_SUCCESS) {
3180 		PMD_INIT_LOG(ERR, "Hardware reset failed: %d", diag);
3181 		return -EIO;
3182 	}
3183 
3184 	/* Setup mailbox service */
3185 	diag = fm10k_setup_mbx_service(hw);
3186 	if (diag != FM10K_SUCCESS) {
3187 		PMD_INIT_LOG(ERR, "Failed to setup mailbox: %d", diag);
3188 		return -EIO;
3189 	}
3190 
3191 	/*PF/VF has different interrupt handling mechanism */
3192 	if (hw->mac.type == fm10k_mac_pf) {
3193 		/* register callback func to eal lib */
3194 		rte_intr_callback_register(intr_handle,
3195 			fm10k_dev_interrupt_handler_pf, (void *)dev);
3196 
3197 		/* enable MISC interrupt */
3198 		fm10k_dev_enable_intr_pf(dev);
3199 	} else { /* VF */
3200 		rte_intr_callback_register(intr_handle,
3201 			fm10k_dev_interrupt_handler_vf, (void *)dev);
3202 
3203 		fm10k_dev_enable_intr_vf(dev);
3204 	}
3205 
3206 	/* Enable intr after callback registered */
3207 	rte_intr_enable(intr_handle);
3208 
3209 	hw->mac.ops.update_int_moderator(hw);
3210 
3211 	/* Make sure Switch Manager is ready before going forward. */
3212 	if (hw->mac.type == fm10k_mac_pf) {
3213 		bool switch_ready = false;
3214 
3215 		for (i = 0; i < MAX_QUERY_SWITCH_STATE_TIMES; i++) {
3216 			fm10k_mbx_lock(hw);
3217 			hw->mac.ops.get_host_state(hw, &switch_ready);
3218 			fm10k_mbx_unlock(hw);
3219 			if (switch_ready == true)
3220 				break;
3221 			/* Delay some time to acquire async LPORT_MAP info. */
3222 			rte_delay_us(WAIT_SWITCH_MSG_US);
3223 		}
3224 
3225 		if (switch_ready == false) {
3226 			PMD_INIT_LOG(ERR, "switch is not ready");
3227 			return -1;
3228 		}
3229 	}
3230 
3231 	/*
3232 	 * Below function will trigger operations on mailbox, acquire lock to
3233 	 * avoid race condition from interrupt handler. Operations on mailbox
3234 	 * FIFO will trigger interrupt to PF/SM, in which interrupt handler
3235 	 * will handle and generate an interrupt to our side. Then,  FIFO in
3236 	 * mailbox will be touched.
3237 	 */
3238 	fm10k_mbx_lock(hw);
3239 	/* Enable port first */
3240 	hw->mac.ops.update_lport_state(hw, hw->mac.dglort_map,
3241 					MAX_LPORT_NUM, 1);
3242 
3243 	/* Set unicast mode by default. App can change to other mode in other
3244 	 * API func.
3245 	 */
3246 	hw->mac.ops.update_xcast_mode(hw, hw->mac.dglort_map,
3247 					FM10K_XCAST_MODE_NONE);
3248 
3249 	fm10k_mbx_unlock(hw);
3250 
3251 	/* Make sure default VID is ready before going forward. */
3252 	if (hw->mac.type == fm10k_mac_pf) {
3253 		for (i = 0; i < MAX_QUERY_SWITCH_STATE_TIMES; i++) {
3254 			if (hw->mac.default_vid)
3255 				break;
3256 			/* Delay some time to acquire async port VLAN info. */
3257 			rte_delay_us(WAIT_SWITCH_MSG_US);
3258 		}
3259 
3260 		if (!hw->mac.default_vid) {
3261 			PMD_INIT_LOG(ERR, "default VID is not ready");
3262 			return -1;
3263 		}
3264 	}
3265 
3266 	/* Add default mac address */
3267 	fm10k_MAC_filter_set(dev, hw->mac.addr, true,
3268 		MAIN_VSI_POOL_NUMBER);
3269 
3270 	return 0;
3271 }
3272 
3273 static int
3274 eth_fm10k_dev_uninit(struct rte_eth_dev *dev)
3275 {
3276 	PMD_INIT_FUNC_TRACE();
3277 
3278 	/* only uninitialize in the primary process */
3279 	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
3280 		return 0;
3281 
3282 	/* safe to close dev here */
3283 	fm10k_dev_close(dev);
3284 
3285 	return 0;
3286 }
3287 
3288 static int eth_fm10k_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
3289 	struct rte_pci_device *pci_dev)
3290 {
3291 	return rte_eth_dev_pci_generic_probe(pci_dev,
3292 		sizeof(struct fm10k_adapter), eth_fm10k_dev_init);
3293 }
3294 
3295 static int eth_fm10k_pci_remove(struct rte_pci_device *pci_dev)
3296 {
3297 	return rte_eth_dev_pci_generic_remove(pci_dev, eth_fm10k_dev_uninit);
3298 }
3299 
3300 /*
3301  * The set of PCI devices this driver supports. This driver will enable both PF
3302  * and SRIOV-VF devices.
3303  */
3304 static const struct rte_pci_id pci_id_fm10k_map[] = {
3305 	{ RTE_PCI_DEVICE(FM10K_INTEL_VENDOR_ID, FM10K_DEV_ID_PF) },
3306 	{ RTE_PCI_DEVICE(FM10K_INTEL_VENDOR_ID, FM10K_DEV_ID_SDI_FM10420_QDA2) },
3307 	{ RTE_PCI_DEVICE(FM10K_INTEL_VENDOR_ID, FM10K_DEV_ID_VF) },
3308 	{ .vendor_id = 0, /* sentinel */ },
3309 };
3310 
3311 static struct rte_pci_driver rte_pmd_fm10k = {
3312 	.id_table = pci_id_fm10k_map,
3313 	.drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC,
3314 	.probe = eth_fm10k_pci_probe,
3315 	.remove = eth_fm10k_pci_remove,
3316 };
3317 
3318 RTE_PMD_REGISTER_PCI(net_fm10k, rte_pmd_fm10k);
3319 RTE_PMD_REGISTER_PCI_TABLE(net_fm10k, pci_id_fm10k_map);
3320 RTE_PMD_REGISTER_KMOD_DEP(net_fm10k, "* igb_uio | uio_pci_generic | vfio-pci");
3321 
3322 RTE_INIT(fm10k_init_log)
3323 {
3324 	fm10k_logtype_init = rte_log_register("pmd.net.fm10k.init");
3325 	if (fm10k_logtype_init >= 0)
3326 		rte_log_set_level(fm10k_logtype_init, RTE_LOG_NOTICE);
3327 	fm10k_logtype_driver = rte_log_register("pmd.net.fm10k.driver");
3328 	if (fm10k_logtype_driver >= 0)
3329 		rte_log_set_level(fm10k_logtype_driver, RTE_LOG_NOTICE);
3330 
3331 #ifdef RTE_LIBRTE_FM10K_DEBUG_RX
3332 	fm10k_logtype_rx = rte_log_register("pmd.net.fm10k.rx");
3333 	if (fm10k_logtype_rx >= 0)
3334 		rte_log_set_level(fm10k_logtype_rx, RTE_LOG_DEBUG);
3335 #endif
3336 
3337 #ifdef RTE_LIBRTE_FM10K_DEBUG_TX
3338 	fm10k_logtype_tx = rte_log_register("pmd.net.fm10k.tx");
3339 	if (fm10k_logtype_tx >= 0)
3340 		rte_log_set_level(fm10k_logtype_tx, RTE_LOG_DEBUG);
3341 #endif
3342 
3343 #ifdef RTE_LIBRTE_FM10K_DEBUG_TX_FREE
3344 	fm10k_logtype_tx_free = rte_log_register("pmd.net.fm10k.tx_free");
3345 	if (fm10k_logtype_tx_free >= 0)
3346 		rte_log_set_level(fm10k_logtype_tx_free, RTE_LOG_DEBUG);
3347 #endif
3348 }
3349