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