net/atlantic: remove unnecessary cast
[dpdk.git] / drivers / net / atlantic / atl_ethdev.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2018 Aquantia Corporation
3  */
4
5 #include <rte_string_fns.h>
6 #include <rte_ethdev_pci.h>
7 #include <rte_alarm.h>
8
9 #include "atl_ethdev.h"
10 #include "atl_common.h"
11 #include "atl_hw_regs.h"
12 #include "atl_logs.h"
13 #include "hw_atl/hw_atl_llh.h"
14 #include "hw_atl/hw_atl_b0.h"
15 #include "hw_atl/hw_atl_b0_internal.h"
16
17 static int eth_atl_dev_init(struct rte_eth_dev *eth_dev);
18 static int eth_atl_dev_uninit(struct rte_eth_dev *eth_dev);
19
20 static int  atl_dev_configure(struct rte_eth_dev *dev);
21 static int  atl_dev_start(struct rte_eth_dev *dev);
22 static void atl_dev_stop(struct rte_eth_dev *dev);
23 static int  atl_dev_set_link_up(struct rte_eth_dev *dev);
24 static int  atl_dev_set_link_down(struct rte_eth_dev *dev);
25 static void atl_dev_close(struct rte_eth_dev *dev);
26 static int  atl_dev_reset(struct rte_eth_dev *dev);
27 static void atl_dev_promiscuous_enable(struct rte_eth_dev *dev);
28 static void atl_dev_promiscuous_disable(struct rte_eth_dev *dev);
29 static void atl_dev_allmulticast_enable(struct rte_eth_dev *dev);
30 static void atl_dev_allmulticast_disable(struct rte_eth_dev *dev);
31 static int  atl_dev_link_update(struct rte_eth_dev *dev, int wait);
32
33 static int atl_dev_xstats_get_names(struct rte_eth_dev *dev __rte_unused,
34                                     struct rte_eth_xstat_name *xstats_names,
35                                     unsigned int size);
36
37 static int atl_dev_stats_get(struct rte_eth_dev *dev,
38                                 struct rte_eth_stats *stats);
39
40 static int atl_dev_xstats_get(struct rte_eth_dev *dev,
41                               struct rte_eth_xstat *stats, unsigned int n);
42
43 static void atl_dev_stats_reset(struct rte_eth_dev *dev);
44
45 static int atl_fw_version_get(struct rte_eth_dev *dev, char *fw_version,
46                               size_t fw_size);
47
48 static void atl_dev_info_get(struct rte_eth_dev *dev,
49                                struct rte_eth_dev_info *dev_info);
50
51 static const uint32_t *atl_dev_supported_ptypes_get(struct rte_eth_dev *dev);
52
53 static int atl_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu);
54
55 /* VLAN stuff */
56 static int atl_vlan_filter_set(struct rte_eth_dev *dev,
57                 uint16_t vlan_id, int on);
58
59 static int atl_vlan_offload_set(struct rte_eth_dev *dev, int mask);
60
61 static void atl_vlan_strip_queue_set(struct rte_eth_dev *dev,
62                                      uint16_t queue_id, int on);
63
64 static int atl_vlan_tpid_set(struct rte_eth_dev *dev,
65                              enum rte_vlan_type vlan_type, uint16_t tpid);
66
67 /* EEPROM */
68 static int atl_dev_get_eeprom_length(struct rte_eth_dev *dev);
69 static int atl_dev_get_eeprom(struct rte_eth_dev *dev,
70                               struct rte_dev_eeprom_info *eeprom);
71 static int atl_dev_set_eeprom(struct rte_eth_dev *dev,
72                               struct rte_dev_eeprom_info *eeprom);
73
74 /* Regs */
75 static int atl_dev_get_regs(struct rte_eth_dev *dev,
76                             struct rte_dev_reg_info *regs);
77
78 /* Flow control */
79 static int atl_flow_ctrl_get(struct rte_eth_dev *dev,
80                                struct rte_eth_fc_conf *fc_conf);
81 static int atl_flow_ctrl_set(struct rte_eth_dev *dev,
82                                struct rte_eth_fc_conf *fc_conf);
83
84 static void atl_dev_link_status_print(struct rte_eth_dev *dev);
85
86 /* Interrupts */
87 static int atl_dev_rxq_interrupt_setup(struct rte_eth_dev *dev);
88 static int atl_dev_lsc_interrupt_setup(struct rte_eth_dev *dev, uint8_t on);
89 static int atl_dev_interrupt_get_status(struct rte_eth_dev *dev);
90 static int atl_dev_interrupt_action(struct rte_eth_dev *dev,
91                                     struct rte_intr_handle *handle);
92 static void atl_dev_interrupt_handler(void *param);
93
94
95 static int atl_add_mac_addr(struct rte_eth_dev *dev,
96                             struct rte_ether_addr *mac_addr,
97                             uint32_t index, uint32_t pool);
98 static void atl_remove_mac_addr(struct rte_eth_dev *dev, uint32_t index);
99 static int atl_set_default_mac_addr(struct rte_eth_dev *dev,
100                                            struct rte_ether_addr *mac_addr);
101
102 static int atl_dev_set_mc_addr_list(struct rte_eth_dev *dev,
103                                     struct rte_ether_addr *mc_addr_set,
104                                     uint32_t nb_mc_addr);
105
106 /* RSS */
107 static int atl_reta_update(struct rte_eth_dev *dev,
108                              struct rte_eth_rss_reta_entry64 *reta_conf,
109                              uint16_t reta_size);
110 static int atl_reta_query(struct rte_eth_dev *dev,
111                             struct rte_eth_rss_reta_entry64 *reta_conf,
112                             uint16_t reta_size);
113 static int atl_rss_hash_update(struct rte_eth_dev *dev,
114                                  struct rte_eth_rss_conf *rss_conf);
115 static int atl_rss_hash_conf_get(struct rte_eth_dev *dev,
116                                    struct rte_eth_rss_conf *rss_conf);
117
118
119 static int eth_atl_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
120         struct rte_pci_device *pci_dev);
121 static int eth_atl_pci_remove(struct rte_pci_device *pci_dev);
122
123 static void atl_dev_info_get(struct rte_eth_dev *dev,
124                                 struct rte_eth_dev_info *dev_info);
125
126 int atl_logtype_init;
127 int atl_logtype_driver;
128
129 /*
130  * The set of PCI devices this driver supports
131  */
132 static const struct rte_pci_id pci_id_atl_map[] = {
133         { RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_0001) },
134         { RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_D100) },
135         { RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_D107) },
136         { RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_D108) },
137         { RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_D109) },
138
139         { RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_AQC100) },
140         { RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_AQC107) },
141         { RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_AQC108) },
142         { RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_AQC109) },
143         { RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_AQC111) },
144         { RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_AQC112) },
145
146         { RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_AQC100S) },
147         { RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_AQC107S) },
148         { RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_AQC108S) },
149         { RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_AQC109S) },
150         { RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_AQC111S) },
151         { RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_AQC112S) },
152
153         { RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_AQC111E) },
154         { RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_AQC112E) },
155         { .vendor_id = 0, /* sentinel */ },
156 };
157
158 static struct rte_pci_driver rte_atl_pmd = {
159         .id_table = pci_id_atl_map,
160         .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC |
161                      RTE_PCI_DRV_IOVA_AS_VA,
162         .probe = eth_atl_pci_probe,
163         .remove = eth_atl_pci_remove,
164 };
165
166 #define ATL_RX_OFFLOADS (DEV_RX_OFFLOAD_VLAN_STRIP \
167                         | DEV_RX_OFFLOAD_IPV4_CKSUM \
168                         | DEV_RX_OFFLOAD_UDP_CKSUM \
169                         | DEV_RX_OFFLOAD_TCP_CKSUM \
170                         | DEV_RX_OFFLOAD_JUMBO_FRAME \
171                         | DEV_RX_OFFLOAD_MACSEC_STRIP \
172                         | DEV_RX_OFFLOAD_VLAN_FILTER)
173
174 #define ATL_TX_OFFLOADS (DEV_TX_OFFLOAD_VLAN_INSERT \
175                         | DEV_TX_OFFLOAD_IPV4_CKSUM \
176                         | DEV_TX_OFFLOAD_UDP_CKSUM \
177                         | DEV_TX_OFFLOAD_TCP_CKSUM \
178                         | DEV_TX_OFFLOAD_TCP_TSO \
179                         | DEV_TX_OFFLOAD_MACSEC_INSERT \
180                         | DEV_TX_OFFLOAD_MULTI_SEGS)
181
182 #define SFP_EEPROM_SIZE 0x100
183
184 static const struct rte_eth_desc_lim rx_desc_lim = {
185         .nb_max = ATL_MAX_RING_DESC,
186         .nb_min = ATL_MIN_RING_DESC,
187         .nb_align = ATL_RXD_ALIGN,
188 };
189
190 static const struct rte_eth_desc_lim tx_desc_lim = {
191         .nb_max = ATL_MAX_RING_DESC,
192         .nb_min = ATL_MIN_RING_DESC,
193         .nb_align = ATL_TXD_ALIGN,
194         .nb_seg_max = ATL_TX_MAX_SEG,
195         .nb_mtu_seg_max = ATL_TX_MAX_SEG,
196 };
197
198 enum atl_xstats_type {
199         XSTATS_TYPE_MSM = 0,
200         XSTATS_TYPE_MACSEC,
201 };
202
203 #define ATL_XSTATS_FIELD(name) { \
204         #name, \
205         offsetof(struct aq_stats_s, name), \
206         XSTATS_TYPE_MSM \
207 }
208
209 #define ATL_MACSEC_XSTATS_FIELD(name) { \
210         #name, \
211         offsetof(struct macsec_stats, name), \
212         XSTATS_TYPE_MACSEC \
213 }
214
215 struct atl_xstats_tbl_s {
216         const char *name;
217         unsigned int offset;
218         enum atl_xstats_type type;
219 };
220
221 static struct atl_xstats_tbl_s atl_xstats_tbl[] = {
222         ATL_XSTATS_FIELD(uprc),
223         ATL_XSTATS_FIELD(mprc),
224         ATL_XSTATS_FIELD(bprc),
225         ATL_XSTATS_FIELD(erpt),
226         ATL_XSTATS_FIELD(uptc),
227         ATL_XSTATS_FIELD(mptc),
228         ATL_XSTATS_FIELD(bptc),
229         ATL_XSTATS_FIELD(erpr),
230         ATL_XSTATS_FIELD(ubrc),
231         ATL_XSTATS_FIELD(ubtc),
232         ATL_XSTATS_FIELD(mbrc),
233         ATL_XSTATS_FIELD(mbtc),
234         ATL_XSTATS_FIELD(bbrc),
235         ATL_XSTATS_FIELD(bbtc),
236         /* Ingress Common Counters */
237         ATL_MACSEC_XSTATS_FIELD(in_ctl_pkts),
238         ATL_MACSEC_XSTATS_FIELD(in_tagged_miss_pkts),
239         ATL_MACSEC_XSTATS_FIELD(in_untagged_miss_pkts),
240         ATL_MACSEC_XSTATS_FIELD(in_notag_pkts),
241         ATL_MACSEC_XSTATS_FIELD(in_untagged_pkts),
242         ATL_MACSEC_XSTATS_FIELD(in_bad_tag_pkts),
243         ATL_MACSEC_XSTATS_FIELD(in_no_sci_pkts),
244         ATL_MACSEC_XSTATS_FIELD(in_unknown_sci_pkts),
245         /* Ingress SA Counters */
246         ATL_MACSEC_XSTATS_FIELD(in_untagged_hit_pkts),
247         ATL_MACSEC_XSTATS_FIELD(in_not_using_sa),
248         ATL_MACSEC_XSTATS_FIELD(in_unused_sa),
249         ATL_MACSEC_XSTATS_FIELD(in_not_valid_pkts),
250         ATL_MACSEC_XSTATS_FIELD(in_invalid_pkts),
251         ATL_MACSEC_XSTATS_FIELD(in_ok_pkts),
252         ATL_MACSEC_XSTATS_FIELD(in_unchecked_pkts),
253         ATL_MACSEC_XSTATS_FIELD(in_validated_octets),
254         ATL_MACSEC_XSTATS_FIELD(in_decrypted_octets),
255         /* Egress Common Counters */
256         ATL_MACSEC_XSTATS_FIELD(out_ctl_pkts),
257         ATL_MACSEC_XSTATS_FIELD(out_unknown_sa_pkts),
258         ATL_MACSEC_XSTATS_FIELD(out_untagged_pkts),
259         ATL_MACSEC_XSTATS_FIELD(out_too_long),
260         /* Egress SC Counters */
261         ATL_MACSEC_XSTATS_FIELD(out_sc_protected_pkts),
262         ATL_MACSEC_XSTATS_FIELD(out_sc_encrypted_pkts),
263         /* Egress SA Counters */
264         ATL_MACSEC_XSTATS_FIELD(out_sa_hit_drop_redirect),
265         ATL_MACSEC_XSTATS_FIELD(out_sa_protected2_pkts),
266         ATL_MACSEC_XSTATS_FIELD(out_sa_protected_pkts),
267         ATL_MACSEC_XSTATS_FIELD(out_sa_encrypted_pkts),
268 };
269
270 static const struct eth_dev_ops atl_eth_dev_ops = {
271         .dev_configure        = atl_dev_configure,
272         .dev_start            = atl_dev_start,
273         .dev_stop             = atl_dev_stop,
274         .dev_set_link_up      = atl_dev_set_link_up,
275         .dev_set_link_down    = atl_dev_set_link_down,
276         .dev_close            = atl_dev_close,
277         .dev_reset            = atl_dev_reset,
278
279         /* PROMISC */
280         .promiscuous_enable   = atl_dev_promiscuous_enable,
281         .promiscuous_disable  = atl_dev_promiscuous_disable,
282         .allmulticast_enable  = atl_dev_allmulticast_enable,
283         .allmulticast_disable = atl_dev_allmulticast_disable,
284
285         /* Link */
286         .link_update          = atl_dev_link_update,
287
288         .get_reg              = atl_dev_get_regs,
289
290         /* Stats */
291         .stats_get            = atl_dev_stats_get,
292         .xstats_get           = atl_dev_xstats_get,
293         .xstats_get_names     = atl_dev_xstats_get_names,
294         .stats_reset          = atl_dev_stats_reset,
295         .xstats_reset         = atl_dev_stats_reset,
296
297         .fw_version_get       = atl_fw_version_get,
298         .dev_infos_get        = atl_dev_info_get,
299         .dev_supported_ptypes_get = atl_dev_supported_ptypes_get,
300
301         .mtu_set              = atl_dev_mtu_set,
302
303         /* VLAN */
304         .vlan_filter_set      = atl_vlan_filter_set,
305         .vlan_offload_set     = atl_vlan_offload_set,
306         .vlan_tpid_set        = atl_vlan_tpid_set,
307         .vlan_strip_queue_set = atl_vlan_strip_queue_set,
308
309         /* Queue Control */
310         .rx_queue_start       = atl_rx_queue_start,
311         .rx_queue_stop        = atl_rx_queue_stop,
312         .rx_queue_setup       = atl_rx_queue_setup,
313         .rx_queue_release     = atl_rx_queue_release,
314
315         .tx_queue_start       = atl_tx_queue_start,
316         .tx_queue_stop        = atl_tx_queue_stop,
317         .tx_queue_setup       = atl_tx_queue_setup,
318         .tx_queue_release     = atl_tx_queue_release,
319
320         .rx_queue_intr_enable = atl_dev_rx_queue_intr_enable,
321         .rx_queue_intr_disable = atl_dev_rx_queue_intr_disable,
322
323         .rx_queue_count       = atl_rx_queue_count,
324         .rx_descriptor_status = atl_dev_rx_descriptor_status,
325         .tx_descriptor_status = atl_dev_tx_descriptor_status,
326
327         /* EEPROM */
328         .get_eeprom_length    = atl_dev_get_eeprom_length,
329         .get_eeprom           = atl_dev_get_eeprom,
330         .set_eeprom           = atl_dev_set_eeprom,
331
332         /* Flow Control */
333         .flow_ctrl_get        = atl_flow_ctrl_get,
334         .flow_ctrl_set        = atl_flow_ctrl_set,
335
336         /* MAC */
337         .mac_addr_add         = atl_add_mac_addr,
338         .mac_addr_remove      = atl_remove_mac_addr,
339         .mac_addr_set         = atl_set_default_mac_addr,
340         .set_mc_addr_list     = atl_dev_set_mc_addr_list,
341         .rxq_info_get         = atl_rxq_info_get,
342         .txq_info_get         = atl_txq_info_get,
343
344         .reta_update          = atl_reta_update,
345         .reta_query           = atl_reta_query,
346         .rss_hash_update      = atl_rss_hash_update,
347         .rss_hash_conf_get    = atl_rss_hash_conf_get,
348 };
349
350 static inline int32_t
351 atl_reset_hw(struct aq_hw_s *hw)
352 {
353         return hw_atl_b0_hw_reset(hw);
354 }
355
356 static inline void
357 atl_enable_intr(struct rte_eth_dev *dev)
358 {
359         struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
360
361         hw_atl_itr_irq_msk_setlsw_set(hw, 0xffffffff);
362 }
363
364 static void
365 atl_disable_intr(struct aq_hw_s *hw)
366 {
367         PMD_INIT_FUNC_TRACE();
368         hw_atl_itr_irq_msk_clearlsw_set(hw, 0xffffffff);
369 }
370
371 static int
372 eth_atl_dev_init(struct rte_eth_dev *eth_dev)
373 {
374         struct atl_adapter *adapter = eth_dev->data->dev_private;
375         struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
376         struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
377         struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
378         int err = 0;
379
380         PMD_INIT_FUNC_TRACE();
381
382         eth_dev->dev_ops = &atl_eth_dev_ops;
383         eth_dev->rx_pkt_burst = &atl_recv_pkts;
384         eth_dev->tx_pkt_burst = &atl_xmit_pkts;
385         eth_dev->tx_pkt_prepare = &atl_prep_pkts;
386
387         /* For secondary processes, the primary process has done all the work */
388         if (rte_eal_process_type() != RTE_PROC_PRIMARY)
389                 return 0;
390
391         /* Vendor and Device ID need to be set before init of shared code */
392         hw->device_id = pci_dev->id.device_id;
393         hw->vendor_id = pci_dev->id.vendor_id;
394         hw->mmio = (void *)pci_dev->mem_resource[0].addr;
395
396         /* Hardware configuration - hardcode */
397         adapter->hw_cfg.is_lro = false;
398         adapter->hw_cfg.wol = false;
399         adapter->hw_cfg.is_rss = false;
400         adapter->hw_cfg.num_rss_queues = HW_ATL_B0_RSS_MAX;
401
402         adapter->hw_cfg.link_speed_msk = AQ_NIC_RATE_10G |
403                           AQ_NIC_RATE_5G |
404                           AQ_NIC_RATE_2G5 |
405                           AQ_NIC_RATE_1G |
406                           AQ_NIC_RATE_100M;
407
408         adapter->hw_cfg.flow_control = (AQ_NIC_FC_RX | AQ_NIC_FC_TX);
409         adapter->hw_cfg.aq_rss.indirection_table_size =
410                 HW_ATL_B0_RSS_REDIRECTION_MAX;
411
412         hw->aq_nic_cfg = &adapter->hw_cfg;
413
414         /* disable interrupt */
415         atl_disable_intr(hw);
416
417         /* Allocate memory for storing MAC addresses */
418         eth_dev->data->mac_addrs = rte_zmalloc("atlantic",
419                                         RTE_ETHER_ADDR_LEN, 0);
420         if (eth_dev->data->mac_addrs == NULL) {
421                 PMD_INIT_LOG(ERR, "MAC Malloc failed");
422                 return -ENOMEM;
423         }
424
425         err = hw_atl_utils_initfw(hw, &hw->aq_fw_ops);
426         if (err)
427                 return err;
428
429         /* Copy the permanent MAC address */
430         if (hw->aq_fw_ops->get_mac_permanent(hw,
431                         eth_dev->data->mac_addrs->addr_bytes) != 0)
432                 return -EINVAL;
433
434         /* Reset the hw statistics */
435         atl_dev_stats_reset(eth_dev);
436
437         rte_intr_callback_register(intr_handle,
438                                    atl_dev_interrupt_handler, eth_dev);
439
440         /* enable uio/vfio intr/eventfd mapping */
441         rte_intr_enable(intr_handle);
442
443         /* enable support intr */
444         atl_enable_intr(eth_dev);
445
446         return err;
447 }
448
449 static int
450 eth_atl_dev_uninit(struct rte_eth_dev *eth_dev)
451 {
452         struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
453         struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
454         struct aq_hw_s *hw;
455
456         PMD_INIT_FUNC_TRACE();
457
458         if (rte_eal_process_type() != RTE_PROC_PRIMARY)
459                 return -EPERM;
460
461         hw = ATL_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
462
463         if (hw->adapter_stopped == 0)
464                 atl_dev_close(eth_dev);
465
466         eth_dev->dev_ops = NULL;
467         eth_dev->rx_pkt_burst = NULL;
468         eth_dev->tx_pkt_burst = NULL;
469
470         /* disable uio intr before callback unregister */
471         rte_intr_disable(intr_handle);
472         rte_intr_callback_unregister(intr_handle,
473                                      atl_dev_interrupt_handler, eth_dev);
474
475         rte_free(eth_dev->data->mac_addrs);
476         eth_dev->data->mac_addrs = NULL;
477
478         return 0;
479 }
480
481 static int
482 eth_atl_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
483         struct rte_pci_device *pci_dev)
484 {
485         return rte_eth_dev_pci_generic_probe(pci_dev,
486                 sizeof(struct atl_adapter), eth_atl_dev_init);
487 }
488
489 static int
490 eth_atl_pci_remove(struct rte_pci_device *pci_dev)
491 {
492         return rte_eth_dev_pci_generic_remove(pci_dev, eth_atl_dev_uninit);
493 }
494
495 static int
496 atl_dev_configure(struct rte_eth_dev *dev)
497 {
498         struct atl_interrupt *intr =
499                 ATL_DEV_PRIVATE_TO_INTR(dev->data->dev_private);
500
501         PMD_INIT_FUNC_TRACE();
502
503         /* set flag to update link status after init */
504         intr->flags |= ATL_FLAG_NEED_LINK_UPDATE;
505
506         return 0;
507 }
508
509 /*
510  * Configure device link speed and setup link.
511  * It returns 0 on success.
512  */
513 static int
514 atl_dev_start(struct rte_eth_dev *dev)
515 {
516         struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
517         struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
518         struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
519         uint32_t intr_vector = 0;
520         int status;
521         int err;
522
523         PMD_INIT_FUNC_TRACE();
524
525         /* set adapter started */
526         hw->adapter_stopped = 0;
527
528         if (dev->data->dev_conf.link_speeds & ETH_LINK_SPEED_FIXED) {
529                 PMD_INIT_LOG(ERR,
530                 "Invalid link_speeds for port %u, fix speed not supported",
531                                 dev->data->port_id);
532                 return -EINVAL;
533         }
534
535         /* disable uio/vfio intr/eventfd mapping */
536         rte_intr_disable(intr_handle);
537
538         /* reinitialize adapter
539          * this calls reset and start
540          */
541         status = atl_reset_hw(hw);
542         if (status != 0)
543                 return -EIO;
544
545         err = hw_atl_b0_hw_init(hw, dev->data->mac_addrs->addr_bytes);
546
547         hw_atl_b0_hw_start(hw);
548         /* check and configure queue intr-vector mapping */
549         if ((rte_intr_cap_multiple(intr_handle) ||
550             !RTE_ETH_DEV_SRIOV(dev).active) &&
551             dev->data->dev_conf.intr_conf.rxq != 0) {
552                 intr_vector = dev->data->nb_rx_queues;
553                 if (intr_vector > ATL_MAX_INTR_QUEUE_NUM) {
554                         PMD_INIT_LOG(ERR, "At most %d intr queues supported",
555                                         ATL_MAX_INTR_QUEUE_NUM);
556                         return -ENOTSUP;
557                 }
558                 if (rte_intr_efd_enable(intr_handle, intr_vector)) {
559                         PMD_INIT_LOG(ERR, "rte_intr_efd_enable failed");
560                         return -1;
561                 }
562         }
563
564         if (rte_intr_dp_is_en(intr_handle) && !intr_handle->intr_vec) {
565                 intr_handle->intr_vec = rte_zmalloc("intr_vec",
566                                     dev->data->nb_rx_queues * sizeof(int), 0);
567                 if (intr_handle->intr_vec == NULL) {
568                         PMD_INIT_LOG(ERR, "Failed to allocate %d rx_queues"
569                                      " intr_vec", dev->data->nb_rx_queues);
570                         return -ENOMEM;
571                 }
572         }
573
574         /* initialize transmission unit */
575         atl_tx_init(dev);
576
577         /* This can fail when allocating mbufs for descriptor rings */
578         err = atl_rx_init(dev);
579         if (err) {
580                 PMD_INIT_LOG(ERR, "Unable to initialize RX hardware");
581                 goto error;
582         }
583
584         PMD_INIT_LOG(DEBUG, "FW version: %u.%u.%u",
585                 hw->fw_ver_actual >> 24,
586                 (hw->fw_ver_actual >> 16) & 0xFF,
587                 hw->fw_ver_actual & 0xFFFF);
588         PMD_INIT_LOG(DEBUG, "Driver version: %s", ATL_PMD_DRIVER_VERSION);
589
590         err = atl_start_queues(dev);
591         if (err < 0) {
592                 PMD_INIT_LOG(ERR, "Unable to start rxtx queues");
593                 goto error;
594         }
595
596         err = atl_dev_set_link_up(dev);
597
598         err = hw->aq_fw_ops->update_link_status(hw);
599
600         if (err)
601                 goto error;
602
603         dev->data->dev_link.link_status = hw->aq_link_status.mbps != 0;
604
605         if (rte_intr_allow_others(intr_handle)) {
606                 /* check if lsc interrupt is enabled */
607                 if (dev->data->dev_conf.intr_conf.lsc != 0)
608                         atl_dev_lsc_interrupt_setup(dev, true);
609                 else
610                         atl_dev_lsc_interrupt_setup(dev, false);
611         } else {
612                 rte_intr_callback_unregister(intr_handle,
613                                              atl_dev_interrupt_handler, dev);
614                 if (dev->data->dev_conf.intr_conf.lsc != 0)
615                         PMD_INIT_LOG(INFO, "lsc won't enable because of"
616                                      " no intr multiplex");
617         }
618
619         /* check if rxq interrupt is enabled */
620         if (dev->data->dev_conf.intr_conf.rxq != 0 &&
621             rte_intr_dp_is_en(intr_handle))
622                 atl_dev_rxq_interrupt_setup(dev);
623
624         /* enable uio/vfio intr/eventfd mapping */
625         rte_intr_enable(intr_handle);
626
627         /* resume enabled intr since hw reset */
628         atl_enable_intr(dev);
629
630         return 0;
631
632 error:
633         atl_stop_queues(dev);
634         return -EIO;
635 }
636
637 /*
638  * Stop device: disable rx and tx functions to allow for reconfiguring.
639  */
640 static void
641 atl_dev_stop(struct rte_eth_dev *dev)
642 {
643         struct rte_eth_link link;
644         struct aq_hw_s *hw =
645                 ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
646         struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
647         struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
648
649         PMD_INIT_FUNC_TRACE();
650
651         /* disable interrupts */
652         atl_disable_intr(hw);
653
654         /* reset the NIC */
655         atl_reset_hw(hw);
656         hw->adapter_stopped = 1;
657
658         atl_stop_queues(dev);
659
660         /* Clear stored conf */
661         dev->data->scattered_rx = 0;
662         dev->data->lro = 0;
663
664         /* Clear recorded link status */
665         memset(&link, 0, sizeof(link));
666         rte_eth_linkstatus_set(dev, &link);
667
668         if (!rte_intr_allow_others(intr_handle))
669                 /* resume to the default handler */
670                 rte_intr_callback_register(intr_handle,
671                                            atl_dev_interrupt_handler,
672                                            (void *)dev);
673
674         /* Clean datapath event and queue/vec mapping */
675         rte_intr_efd_disable(intr_handle);
676         if (intr_handle->intr_vec != NULL) {
677                 rte_free(intr_handle->intr_vec);
678                 intr_handle->intr_vec = NULL;
679         }
680 }
681
682 /*
683  * Set device link up: enable tx.
684  */
685 static int
686 atl_dev_set_link_up(struct rte_eth_dev *dev)
687 {
688         struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
689         uint32_t link_speeds = dev->data->dev_conf.link_speeds;
690         uint32_t speed_mask = 0;
691
692         if (link_speeds == ETH_LINK_SPEED_AUTONEG) {
693                 speed_mask = hw->aq_nic_cfg->link_speed_msk;
694         } else {
695                 if (link_speeds & ETH_LINK_SPEED_10G)
696                         speed_mask |= AQ_NIC_RATE_10G;
697                 if (link_speeds & ETH_LINK_SPEED_5G)
698                         speed_mask |= AQ_NIC_RATE_5G;
699                 if (link_speeds & ETH_LINK_SPEED_1G)
700                         speed_mask |= AQ_NIC_RATE_1G;
701                 if (link_speeds & ETH_LINK_SPEED_2_5G)
702                         speed_mask |=  AQ_NIC_RATE_2G5;
703                 if (link_speeds & ETH_LINK_SPEED_100M)
704                         speed_mask |= AQ_NIC_RATE_100M;
705         }
706
707         return hw->aq_fw_ops->set_link_speed(hw, speed_mask);
708 }
709
710 /*
711  * Set device link down: disable tx.
712  */
713 static int
714 atl_dev_set_link_down(struct rte_eth_dev *dev)
715 {
716         struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
717
718         return hw->aq_fw_ops->set_link_speed(hw, 0);
719 }
720
721 /*
722  * Reset and stop device.
723  */
724 static void
725 atl_dev_close(struct rte_eth_dev *dev)
726 {
727         PMD_INIT_FUNC_TRACE();
728
729         atl_dev_stop(dev);
730
731         atl_free_queues(dev);
732 }
733
734 static int
735 atl_dev_reset(struct rte_eth_dev *dev)
736 {
737         int ret;
738
739         ret = eth_atl_dev_uninit(dev);
740         if (ret)
741                 return ret;
742
743         ret = eth_atl_dev_init(dev);
744
745         return ret;
746 }
747
748 static int
749 atl_dev_configure_macsec(struct rte_eth_dev *dev)
750 {
751         struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
752         struct aq_hw_cfg_s *cf = ATL_DEV_PRIVATE_TO_CFG(dev->data->dev_private);
753         struct aq_macsec_config *aqcfg = &cf->aq_macsec;
754         struct macsec_msg_fw_request msg_macsec;
755         struct macsec_msg_fw_response response;
756
757         if (!aqcfg->common.macsec_enabled ||
758             hw->aq_fw_ops->send_macsec_req == NULL)
759                 return 0;
760
761         memset(&msg_macsec, 0, sizeof(msg_macsec));
762
763         /* Creating set of sc/sa structures from parameters provided by DPDK */
764
765         /* Configure macsec */
766         msg_macsec.msg_type = macsec_cfg_msg;
767         msg_macsec.cfg.enabled = aqcfg->common.macsec_enabled;
768         msg_macsec.cfg.interrupts_enabled = 1;
769
770         hw->aq_fw_ops->send_macsec_req(hw, &msg_macsec, &response);
771
772         if (response.result)
773                 return -1;
774
775         memset(&msg_macsec, 0, sizeof(msg_macsec));
776
777         /* Configure TX SC */
778
779         msg_macsec.msg_type = macsec_add_tx_sc_msg;
780         msg_macsec.txsc.index = 0; /* TXSC always one (??) */
781         msg_macsec.txsc.protect = aqcfg->common.encryption_enabled;
782
783         /* MAC addr for TX */
784         msg_macsec.txsc.mac_sa[0] = rte_bswap32(aqcfg->txsc.mac[1]);
785         msg_macsec.txsc.mac_sa[1] = rte_bswap32(aqcfg->txsc.mac[0]);
786         msg_macsec.txsc.sa_mask = 0x3f;
787
788         msg_macsec.txsc.da_mask = 0;
789         msg_macsec.txsc.tci = 0x0B;
790         msg_macsec.txsc.curr_an = 0; /* SA index which currently used */
791
792         /*
793          * Creating SCI (Secure Channel Identifier).
794          * SCI constructed from Source MAC and Port identifier
795          */
796         uint32_t sci_hi_part = (msg_macsec.txsc.mac_sa[1] << 16) |
797                                (msg_macsec.txsc.mac_sa[0] >> 16);
798         uint32_t sci_low_part = (msg_macsec.txsc.mac_sa[0] << 16);
799
800         uint32_t port_identifier = 1;
801
802         msg_macsec.txsc.sci[1] = sci_hi_part;
803         msg_macsec.txsc.sci[0] = sci_low_part | port_identifier;
804
805         hw->aq_fw_ops->send_macsec_req(hw, &msg_macsec, &response);
806
807         if (response.result)
808                 return -1;
809
810         memset(&msg_macsec, 0, sizeof(msg_macsec));
811
812         /* Configure RX SC */
813
814         msg_macsec.msg_type = macsec_add_rx_sc_msg;
815         msg_macsec.rxsc.index = aqcfg->rxsc.pi;
816         msg_macsec.rxsc.replay_protect =
817                 aqcfg->common.replay_protection_enabled;
818         msg_macsec.rxsc.anti_replay_window = 0;
819
820         /* MAC addr for RX */
821         msg_macsec.rxsc.mac_da[0] = rte_bswap32(aqcfg->rxsc.mac[1]);
822         msg_macsec.rxsc.mac_da[1] = rte_bswap32(aqcfg->rxsc.mac[0]);
823         msg_macsec.rxsc.da_mask = 0;//0x3f;
824
825         msg_macsec.rxsc.sa_mask = 0;
826
827         hw->aq_fw_ops->send_macsec_req(hw, &msg_macsec, &response);
828
829         if (response.result)
830                 return -1;
831
832         memset(&msg_macsec, 0, sizeof(msg_macsec));
833
834         /* Configure RX SC */
835
836         msg_macsec.msg_type = macsec_add_tx_sa_msg;
837         msg_macsec.txsa.index = aqcfg->txsa.idx;
838         msg_macsec.txsa.next_pn = aqcfg->txsa.pn;
839
840         msg_macsec.txsa.key[0] = rte_bswap32(aqcfg->txsa.key[3]);
841         msg_macsec.txsa.key[1] = rte_bswap32(aqcfg->txsa.key[2]);
842         msg_macsec.txsa.key[2] = rte_bswap32(aqcfg->txsa.key[1]);
843         msg_macsec.txsa.key[3] = rte_bswap32(aqcfg->txsa.key[0]);
844
845         hw->aq_fw_ops->send_macsec_req(hw, &msg_macsec, &response);
846
847         if (response.result)
848                 return -1;
849
850         memset(&msg_macsec, 0, sizeof(msg_macsec));
851
852         /* Configure RX SA */
853
854         msg_macsec.msg_type = macsec_add_rx_sa_msg;
855         msg_macsec.rxsa.index = aqcfg->rxsa.idx;
856         msg_macsec.rxsa.next_pn = aqcfg->rxsa.pn;
857
858         msg_macsec.rxsa.key[0] = rte_bswap32(aqcfg->rxsa.key[3]);
859         msg_macsec.rxsa.key[1] = rte_bswap32(aqcfg->rxsa.key[2]);
860         msg_macsec.rxsa.key[2] = rte_bswap32(aqcfg->rxsa.key[1]);
861         msg_macsec.rxsa.key[3] = rte_bswap32(aqcfg->rxsa.key[0]);
862
863         hw->aq_fw_ops->send_macsec_req(hw, &msg_macsec, &response);
864
865         if (response.result)
866                 return -1;
867
868         return 0;
869 }
870
871 int atl_macsec_enable(struct rte_eth_dev *dev,
872                       uint8_t encr, uint8_t repl_prot)
873 {
874         struct aq_hw_cfg_s *cfg =
875                 ATL_DEV_PRIVATE_TO_CFG(dev->data->dev_private);
876
877         cfg->aq_macsec.common.macsec_enabled = 1;
878         cfg->aq_macsec.common.encryption_enabled = encr;
879         cfg->aq_macsec.common.replay_protection_enabled = repl_prot;
880
881         return 0;
882 }
883
884 int atl_macsec_disable(struct rte_eth_dev *dev)
885 {
886         struct aq_hw_cfg_s *cfg =
887                 ATL_DEV_PRIVATE_TO_CFG(dev->data->dev_private);
888
889         cfg->aq_macsec.common.macsec_enabled = 0;
890
891         return 0;
892 }
893
894 int atl_macsec_config_txsc(struct rte_eth_dev *dev, uint8_t *mac)
895 {
896         struct aq_hw_cfg_s *cfg =
897                 ATL_DEV_PRIVATE_TO_CFG(dev->data->dev_private);
898
899         memset(&cfg->aq_macsec.txsc.mac, 0, sizeof(cfg->aq_macsec.txsc.mac));
900         memcpy((uint8_t *)&cfg->aq_macsec.txsc.mac + 2, mac,
901                 RTE_ETHER_ADDR_LEN);
902
903         return 0;
904 }
905
906 int atl_macsec_config_rxsc(struct rte_eth_dev *dev,
907                            uint8_t *mac, uint16_t pi)
908 {
909         struct aq_hw_cfg_s *cfg =
910                 ATL_DEV_PRIVATE_TO_CFG(dev->data->dev_private);
911
912         memset(&cfg->aq_macsec.rxsc.mac, 0, sizeof(cfg->aq_macsec.rxsc.mac));
913         memcpy((uint8_t *)&cfg->aq_macsec.rxsc.mac + 2, mac,
914                 RTE_ETHER_ADDR_LEN);
915         cfg->aq_macsec.rxsc.pi = pi;
916
917         return 0;
918 }
919
920 int atl_macsec_select_txsa(struct rte_eth_dev *dev,
921                            uint8_t idx, uint8_t an,
922                            uint32_t pn, uint8_t *key)
923 {
924         struct aq_hw_cfg_s *cfg =
925                 ATL_DEV_PRIVATE_TO_CFG(dev->data->dev_private);
926
927         cfg->aq_macsec.txsa.idx = idx;
928         cfg->aq_macsec.txsa.pn = pn;
929         cfg->aq_macsec.txsa.an = an;
930
931         memcpy(&cfg->aq_macsec.txsa.key, key, 16);
932         return 0;
933 }
934
935 int atl_macsec_select_rxsa(struct rte_eth_dev *dev,
936                            uint8_t idx, uint8_t an,
937                            uint32_t pn, uint8_t *key)
938 {
939         struct aq_hw_cfg_s *cfg =
940                 ATL_DEV_PRIVATE_TO_CFG(dev->data->dev_private);
941
942         cfg->aq_macsec.rxsa.idx = idx;
943         cfg->aq_macsec.rxsa.pn = pn;
944         cfg->aq_macsec.rxsa.an = an;
945
946         memcpy(&cfg->aq_macsec.rxsa.key, key, 16);
947         return 0;
948 }
949
950 static int
951 atl_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
952 {
953         struct atl_adapter *adapter = ATL_DEV_TO_ADAPTER(dev);
954         struct aq_hw_s *hw = &adapter->hw;
955         struct atl_sw_stats *swstats = &adapter->sw_stats;
956         unsigned int i;
957
958         hw->aq_fw_ops->update_stats(hw);
959
960         /* Fill out the rte_eth_stats statistics structure */
961         stats->ipackets = hw->curr_stats.dma_pkt_rc;
962         stats->ibytes = hw->curr_stats.dma_oct_rc;
963         stats->imissed = hw->curr_stats.dpc;
964         stats->ierrors = hw->curr_stats.erpt;
965
966         stats->opackets = hw->curr_stats.dma_pkt_tc;
967         stats->obytes = hw->curr_stats.dma_oct_tc;
968         stats->oerrors = 0;
969
970         stats->rx_nombuf = swstats->rx_nombuf;
971
972         for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {
973                 stats->q_ipackets[i] = swstats->q_ipackets[i];
974                 stats->q_opackets[i] = swstats->q_opackets[i];
975                 stats->q_ibytes[i] = swstats->q_ibytes[i];
976                 stats->q_obytes[i] = swstats->q_obytes[i];
977                 stats->q_errors[i] = swstats->q_errors[i];
978         }
979         return 0;
980 }
981
982 static void
983 atl_dev_stats_reset(struct rte_eth_dev *dev)
984 {
985         struct atl_adapter *adapter = ATL_DEV_TO_ADAPTER(dev);
986         struct aq_hw_s *hw = &adapter->hw;
987
988         hw->aq_fw_ops->update_stats(hw);
989
990         /* Reset software totals */
991         memset(&hw->curr_stats, 0, sizeof(hw->curr_stats));
992
993         memset(&adapter->sw_stats, 0, sizeof(adapter->sw_stats));
994 }
995
996 static int
997 atl_dev_xstats_get_names(struct rte_eth_dev *dev __rte_unused,
998                          struct rte_eth_xstat_name *xstats_names,
999                          unsigned int size)
1000 {
1001         unsigned int i;
1002
1003         if (!xstats_names)
1004                 return RTE_DIM(atl_xstats_tbl);
1005
1006         for (i = 0; i < size && i < RTE_DIM(atl_xstats_tbl); i++)
1007                 strlcpy(xstats_names[i].name, atl_xstats_tbl[i].name,
1008                         RTE_ETH_XSTATS_NAME_SIZE);
1009
1010         return i;
1011 }
1012
1013 static int
1014 atl_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *stats,
1015                    unsigned int n)
1016 {
1017         struct atl_adapter *adapter = dev->data->dev_private;
1018         struct aq_hw_s *hw = &adapter->hw;
1019         struct get_stats req = { 0 };
1020         struct macsec_msg_fw_request msg = { 0 };
1021         struct macsec_msg_fw_response resp = { 0 };
1022         int err = -1;
1023         unsigned int i;
1024
1025         if (!stats)
1026                 return 0;
1027
1028         if (hw->aq_fw_ops->send_macsec_req != NULL) {
1029                 req.ingress_sa_index = 0xff;
1030                 req.egress_sc_index = 0xff;
1031                 req.egress_sa_index = 0xff;
1032
1033                 msg.msg_type = macsec_get_stats_msg;
1034                 msg.stats = req;
1035
1036                 err = hw->aq_fw_ops->send_macsec_req(hw, &msg, &resp);
1037         }
1038
1039         for (i = 0; i < n && i < RTE_DIM(atl_xstats_tbl); i++) {
1040                 stats[i].id = i;
1041
1042                 switch (atl_xstats_tbl[i].type) {
1043                 case XSTATS_TYPE_MSM:
1044                         stats[i].value = *(u64 *)((uint8_t *)&hw->curr_stats +
1045                                          atl_xstats_tbl[i].offset);
1046                         break;
1047                 case XSTATS_TYPE_MACSEC:
1048                         if (err)
1049                                 goto done;
1050                         stats[i].value = *(u64 *)((uint8_t *)&resp.stats +
1051                                          atl_xstats_tbl[i].offset);
1052                         break;
1053                 }
1054         }
1055 done:
1056         return i;
1057 }
1058
1059 static int
1060 atl_fw_version_get(struct rte_eth_dev *dev, char *fw_version, size_t fw_size)
1061 {
1062         struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1063         uint32_t fw_ver = 0;
1064         unsigned int ret = 0;
1065
1066         ret = hw_atl_utils_get_fw_version(hw, &fw_ver);
1067         if (ret)
1068                 return -EIO;
1069
1070         ret = snprintf(fw_version, fw_size, "%u.%u.%u", fw_ver >> 24,
1071                        (fw_ver >> 16) & 0xFFU, fw_ver & 0xFFFFU);
1072
1073         ret += 1; /* add string null-terminator */
1074
1075         if (fw_size < ret)
1076                 return ret;
1077
1078         return 0;
1079 }
1080
1081 static void
1082 atl_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
1083 {
1084         struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
1085
1086         dev_info->max_rx_queues = AQ_HW_MAX_RX_QUEUES;
1087         dev_info->max_tx_queues = AQ_HW_MAX_TX_QUEUES;
1088
1089         dev_info->min_rx_bufsize = 1024;
1090         dev_info->max_rx_pktlen = HW_ATL_B0_MTU_JUMBO;
1091         dev_info->max_mac_addrs = HW_ATL_B0_MAC_MAX;
1092         dev_info->max_vfs = pci_dev->max_vfs;
1093
1094         dev_info->max_hash_mac_addrs = 0;
1095         dev_info->max_vmdq_pools = 0;
1096         dev_info->vmdq_queue_num = 0;
1097
1098         dev_info->rx_offload_capa = ATL_RX_OFFLOADS;
1099
1100         dev_info->tx_offload_capa = ATL_TX_OFFLOADS;
1101
1102
1103         dev_info->default_rxconf = (struct rte_eth_rxconf) {
1104                 .rx_free_thresh = ATL_DEFAULT_RX_FREE_THRESH,
1105         };
1106
1107         dev_info->default_txconf = (struct rte_eth_txconf) {
1108                 .tx_free_thresh = ATL_DEFAULT_TX_FREE_THRESH,
1109         };
1110
1111         dev_info->rx_desc_lim = rx_desc_lim;
1112         dev_info->tx_desc_lim = tx_desc_lim;
1113
1114         dev_info->hash_key_size = HW_ATL_B0_RSS_HASHKEY_BITS / 8;
1115         dev_info->reta_size = HW_ATL_B0_RSS_REDIRECTION_MAX;
1116         dev_info->flow_type_rss_offloads = ATL_RSS_OFFLOAD_ALL;
1117
1118         dev_info->speed_capa = ETH_LINK_SPEED_1G | ETH_LINK_SPEED_10G;
1119         dev_info->speed_capa |= ETH_LINK_SPEED_100M;
1120         dev_info->speed_capa |= ETH_LINK_SPEED_2_5G;
1121         dev_info->speed_capa |= ETH_LINK_SPEED_5G;
1122 }
1123
1124 static const uint32_t *
1125 atl_dev_supported_ptypes_get(struct rte_eth_dev *dev)
1126 {
1127         static const uint32_t ptypes[] = {
1128                 RTE_PTYPE_L2_ETHER,
1129                 RTE_PTYPE_L2_ETHER_ARP,
1130                 RTE_PTYPE_L2_ETHER_VLAN,
1131                 RTE_PTYPE_L3_IPV4,
1132                 RTE_PTYPE_L3_IPV6,
1133                 RTE_PTYPE_L4_TCP,
1134                 RTE_PTYPE_L4_UDP,
1135                 RTE_PTYPE_L4_SCTP,
1136                 RTE_PTYPE_L4_ICMP,
1137                 RTE_PTYPE_UNKNOWN
1138         };
1139
1140         if (dev->rx_pkt_burst == atl_recv_pkts)
1141                 return ptypes;
1142
1143         return NULL;
1144 }
1145
1146 static void
1147 atl_dev_delayed_handler(void *param)
1148 {
1149         struct rte_eth_dev *dev = (struct rte_eth_dev *)param;
1150
1151         atl_dev_configure_macsec(dev);
1152 }
1153
1154
1155 /* return 0 means link status changed, -1 means not changed */
1156 static int
1157 atl_dev_link_update(struct rte_eth_dev *dev, int wait __rte_unused)
1158 {
1159         struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1160         struct rte_eth_link link, old;
1161         u32 fc = AQ_NIC_FC_OFF;
1162         int err = 0;
1163
1164         link.link_status = ETH_LINK_DOWN;
1165         link.link_speed = 0;
1166         link.link_duplex = ETH_LINK_FULL_DUPLEX;
1167         link.link_autoneg = hw->is_autoneg ? ETH_LINK_AUTONEG : ETH_LINK_FIXED;
1168         memset(&old, 0, sizeof(old));
1169
1170         /* load old link status */
1171         rte_eth_linkstatus_get(dev, &old);
1172
1173         /* read current link status */
1174         err = hw->aq_fw_ops->update_link_status(hw);
1175
1176         if (err)
1177                 return 0;
1178
1179         if (hw->aq_link_status.mbps == 0) {
1180                 /* write default (down) link status */
1181                 rte_eth_linkstatus_set(dev, &link);
1182                 if (link.link_status == old.link_status)
1183                         return -1;
1184                 return 0;
1185         }
1186
1187         link.link_status = ETH_LINK_UP;
1188         link.link_duplex = ETH_LINK_FULL_DUPLEX;
1189         link.link_speed = hw->aq_link_status.mbps;
1190
1191         rte_eth_linkstatus_set(dev, &link);
1192
1193         if (link.link_status == old.link_status)
1194                 return -1;
1195
1196         /* Driver has to update flow control settings on RX block
1197          * on any link event.
1198          * We should query FW whether it negotiated FC.
1199          */
1200         if (hw->aq_fw_ops->get_flow_control) {
1201                 hw->aq_fw_ops->get_flow_control(hw, &fc);
1202                 hw_atl_b0_set_fc(hw, fc, 0U);
1203         }
1204
1205         if (rte_eal_alarm_set(1000 * 1000,
1206                               atl_dev_delayed_handler, (void *)dev) < 0)
1207                 PMD_DRV_LOG(ERR, "rte_eal_alarm_set fail");
1208
1209         return 0;
1210 }
1211
1212 static void
1213 atl_dev_promiscuous_enable(struct rte_eth_dev *dev)
1214 {
1215         struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1216
1217         hw_atl_rpfl2promiscuous_mode_en_set(hw, true);
1218 }
1219
1220 static void
1221 atl_dev_promiscuous_disable(struct rte_eth_dev *dev)
1222 {
1223         struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1224
1225         hw_atl_rpfl2promiscuous_mode_en_set(hw, false);
1226 }
1227
1228 static void
1229 atl_dev_allmulticast_enable(struct rte_eth_dev *dev)
1230 {
1231         struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1232
1233         hw_atl_rpfl2_accept_all_mc_packets_set(hw, true);
1234 }
1235
1236 static void
1237 atl_dev_allmulticast_disable(struct rte_eth_dev *dev)
1238 {
1239         struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1240
1241         if (dev->data->promiscuous == 1)
1242                 return; /* must remain in all_multicast mode */
1243
1244         hw_atl_rpfl2_accept_all_mc_packets_set(hw, false);
1245 }
1246
1247 /**
1248  * It clears the interrupt causes and enables the interrupt.
1249  * It will be called once only during nic initialized.
1250  *
1251  * @param dev
1252  *  Pointer to struct rte_eth_dev.
1253  * @param on
1254  *  Enable or Disable.
1255  *
1256  * @return
1257  *  - On success, zero.
1258  *  - On failure, a negative value.
1259  */
1260
1261 static int
1262 atl_dev_lsc_interrupt_setup(struct rte_eth_dev *dev, uint8_t on __rte_unused)
1263 {
1264         atl_dev_link_status_print(dev);
1265         return 0;
1266 }
1267
1268 static int
1269 atl_dev_rxq_interrupt_setup(struct rte_eth_dev *dev __rte_unused)
1270 {
1271         return 0;
1272 }
1273
1274
1275 static int
1276 atl_dev_interrupt_get_status(struct rte_eth_dev *dev)
1277 {
1278         struct atl_interrupt *intr =
1279                 ATL_DEV_PRIVATE_TO_INTR(dev->data->dev_private);
1280         struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1281         u64 cause = 0;
1282
1283         hw_atl_b0_hw_irq_read(hw, &cause);
1284
1285         atl_disable_intr(hw);
1286
1287         if (cause & BIT(ATL_IRQ_CAUSE_LINK))
1288                 intr->flags |= ATL_FLAG_NEED_LINK_UPDATE;
1289
1290         return 0;
1291 }
1292
1293 /**
1294  * It gets and then prints the link status.
1295  *
1296  * @param dev
1297  *  Pointer to struct rte_eth_dev.
1298  *
1299  * @return
1300  *  - On success, zero.
1301  *  - On failure, a negative value.
1302  */
1303 static void
1304 atl_dev_link_status_print(struct rte_eth_dev *dev)
1305 {
1306         struct rte_eth_link link;
1307
1308         memset(&link, 0, sizeof(link));
1309         rte_eth_linkstatus_get(dev, &link);
1310         if (link.link_status) {
1311                 PMD_DRV_LOG(INFO, "Port %d: Link Up - speed %u Mbps - %s",
1312                                         (int)(dev->data->port_id),
1313                                         (unsigned int)link.link_speed,
1314                         link.link_duplex == ETH_LINK_FULL_DUPLEX ?
1315                                         "full-duplex" : "half-duplex");
1316         } else {
1317                 PMD_DRV_LOG(INFO, " Port %d: Link Down",
1318                                 (int)(dev->data->port_id));
1319         }
1320
1321
1322 #ifdef DEBUG
1323 {
1324         struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
1325
1326         PMD_DRV_LOG(DEBUG, "PCI Address: " PCI_PRI_FMT,
1327                                 pci_dev->addr.domain,
1328                                 pci_dev->addr.bus,
1329                                 pci_dev->addr.devid,
1330                                 pci_dev->addr.function);
1331 }
1332 #endif
1333
1334         PMD_DRV_LOG(INFO, "Link speed:%d", link.link_speed);
1335 }
1336
1337 /*
1338  * It executes link_update after knowing an interrupt occurred.
1339  *
1340  * @param dev
1341  *  Pointer to struct rte_eth_dev.
1342  *
1343  * @return
1344  *  - On success, zero.
1345  *  - On failure, a negative value.
1346  */
1347 static int
1348 atl_dev_interrupt_action(struct rte_eth_dev *dev,
1349                            struct rte_intr_handle *intr_handle)
1350 {
1351         struct atl_interrupt *intr =
1352                 ATL_DEV_PRIVATE_TO_INTR(dev->data->dev_private);
1353         struct atl_adapter *adapter = dev->data->dev_private;
1354         struct aq_hw_s *hw = &adapter->hw;
1355
1356         if (!(intr->flags & ATL_FLAG_NEED_LINK_UPDATE))
1357                 goto done;
1358
1359         intr->flags &= ~ATL_FLAG_NEED_LINK_UPDATE;
1360
1361         /* Notify userapp if link status changed */
1362         if (!atl_dev_link_update(dev, 0)) {
1363                 atl_dev_link_status_print(dev);
1364                 _rte_eth_dev_callback_process(dev,
1365                         RTE_ETH_EVENT_INTR_LSC, NULL);
1366         } else {
1367                 if (hw->aq_fw_ops->send_macsec_req == NULL)
1368                         goto done;
1369
1370                 /* Check macsec Keys expired */
1371                 struct get_stats req = { 0 };
1372                 struct macsec_msg_fw_request msg = { 0 };
1373                 struct macsec_msg_fw_response resp = { 0 };
1374
1375                 req.ingress_sa_index = 0x0;
1376                 req.egress_sc_index = 0x0;
1377                 req.egress_sa_index = 0x0;
1378                 msg.msg_type = macsec_get_stats_msg;
1379                 msg.stats = req;
1380
1381                 int err = hw->aq_fw_ops->send_macsec_req(hw, &msg, &resp);
1382                 if (err) {
1383                         PMD_DRV_LOG(ERR, "send_macsec_req fail");
1384                         goto done;
1385                 }
1386                 if (resp.stats.egress_threshold_expired ||
1387                     resp.stats.ingress_threshold_expired ||
1388                     resp.stats.egress_expired ||
1389                     resp.stats.ingress_expired) {
1390                         PMD_DRV_LOG(INFO, "RTE_ETH_EVENT_MACSEC");
1391                         _rte_eth_dev_callback_process(dev,
1392                                 RTE_ETH_EVENT_MACSEC, NULL);
1393                 }
1394         }
1395 done:
1396         atl_enable_intr(dev);
1397         rte_intr_enable(intr_handle);
1398
1399         return 0;
1400 }
1401
1402 /**
1403  * Interrupt handler triggered by NIC  for handling
1404  * specific interrupt.
1405  *
1406  * @param handle
1407  *  Pointer to interrupt handle.
1408  * @param param
1409  *  The address of parameter (struct rte_eth_dev *) regsitered before.
1410  *
1411  * @return
1412  *  void
1413  */
1414 static void
1415 atl_dev_interrupt_handler(void *param)
1416 {
1417         struct rte_eth_dev *dev = (struct rte_eth_dev *)param;
1418
1419         atl_dev_interrupt_get_status(dev);
1420         atl_dev_interrupt_action(dev, dev->intr_handle);
1421 }
1422
1423
1424 static int
1425 atl_dev_get_eeprom_length(struct rte_eth_dev *dev __rte_unused)
1426 {
1427         return SFP_EEPROM_SIZE;
1428 }
1429
1430 int atl_dev_get_eeprom(struct rte_eth_dev *dev,
1431                        struct rte_dev_eeprom_info *eeprom)
1432 {
1433         struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1434         uint32_t dev_addr = SMBUS_DEVICE_ID;
1435
1436         if (hw->aq_fw_ops->get_eeprom == NULL)
1437                 return -ENOTSUP;
1438
1439         if (eeprom->length + eeprom->offset > SFP_EEPROM_SIZE ||
1440             eeprom->data == NULL)
1441                 return -EINVAL;
1442
1443         if (eeprom->magic > 0x7F)
1444                 return -EINVAL;
1445
1446         if (eeprom->magic)
1447                 dev_addr = eeprom->magic;
1448
1449         return hw->aq_fw_ops->get_eeprom(hw, dev_addr, eeprom->data,
1450                                          eeprom->length, eeprom->offset);
1451 }
1452
1453 int atl_dev_set_eeprom(struct rte_eth_dev *dev,
1454                        struct rte_dev_eeprom_info *eeprom)
1455 {
1456         struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1457         uint32_t dev_addr = SMBUS_DEVICE_ID;
1458
1459         if (hw->aq_fw_ops->set_eeprom == NULL)
1460                 return -ENOTSUP;
1461
1462         if (eeprom->length + eeprom->offset > SFP_EEPROM_SIZE ||
1463             eeprom->data == NULL)
1464                 return -EINVAL;
1465
1466         if (eeprom->magic > 0x7F)
1467                 return -EINVAL;
1468
1469         if (eeprom->magic)
1470                 dev_addr = eeprom->magic;
1471
1472         return hw->aq_fw_ops->set_eeprom(hw, dev_addr, eeprom->data,
1473                                          eeprom->length, eeprom->offset);
1474 }
1475
1476 static int
1477 atl_dev_get_regs(struct rte_eth_dev *dev, struct rte_dev_reg_info *regs)
1478 {
1479         struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1480         u32 mif_id;
1481         int err;
1482
1483         if (regs->data == NULL) {
1484                 regs->length = hw_atl_utils_hw_get_reg_length();
1485                 regs->width = sizeof(u32);
1486                 return 0;
1487         }
1488
1489         /* Only full register dump is supported */
1490         if (regs->length && regs->length != hw_atl_utils_hw_get_reg_length())
1491                 return -ENOTSUP;
1492
1493         err = hw_atl_utils_hw_get_regs(hw, regs->data);
1494
1495         /* Device version */
1496         mif_id = hw_atl_reg_glb_mif_id_get(hw);
1497         regs->version = mif_id & 0xFFU;
1498
1499         return err;
1500 }
1501
1502 static int
1503 atl_flow_ctrl_get(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
1504 {
1505         struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1506         u32 fc = AQ_NIC_FC_OFF;
1507
1508         if (hw->aq_fw_ops->get_flow_control == NULL)
1509                 return -ENOTSUP;
1510
1511         hw->aq_fw_ops->get_flow_control(hw, &fc);
1512
1513         if (fc == AQ_NIC_FC_OFF)
1514                 fc_conf->mode = RTE_FC_NONE;
1515         else if (fc & (AQ_NIC_FC_RX | AQ_NIC_FC_TX))
1516                 fc_conf->mode = RTE_FC_FULL;
1517         else if (fc & AQ_NIC_FC_RX)
1518                 fc_conf->mode = RTE_FC_RX_PAUSE;
1519         else if (fc & AQ_NIC_FC_RX)
1520                 fc_conf->mode = RTE_FC_TX_PAUSE;
1521
1522         return 0;
1523 }
1524
1525 static int
1526 atl_flow_ctrl_set(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
1527 {
1528         struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1529         uint32_t old_flow_control = hw->aq_nic_cfg->flow_control;
1530
1531
1532         if (hw->aq_fw_ops->set_flow_control == NULL)
1533                 return -ENOTSUP;
1534
1535         if (fc_conf->mode == RTE_FC_NONE)
1536                 hw->aq_nic_cfg->flow_control = AQ_NIC_FC_OFF;
1537         else if (fc_conf->mode == RTE_FC_RX_PAUSE)
1538                 hw->aq_nic_cfg->flow_control = AQ_NIC_FC_RX;
1539         else if (fc_conf->mode == RTE_FC_TX_PAUSE)
1540                 hw->aq_nic_cfg->flow_control = AQ_NIC_FC_TX;
1541         else if (fc_conf->mode == RTE_FC_FULL)
1542                 hw->aq_nic_cfg->flow_control = (AQ_NIC_FC_RX | AQ_NIC_FC_TX);
1543
1544         if (old_flow_control != hw->aq_nic_cfg->flow_control)
1545                 return hw->aq_fw_ops->set_flow_control(hw);
1546
1547         return 0;
1548 }
1549
1550 static int
1551 atl_update_mac_addr(struct rte_eth_dev *dev, uint32_t index,
1552                     u8 *mac_addr, bool enable)
1553 {
1554         struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1555         unsigned int h = 0U;
1556         unsigned int l = 0U;
1557         int err;
1558
1559         if (mac_addr) {
1560                 h = (mac_addr[0] << 8) | (mac_addr[1]);
1561                 l = (mac_addr[2] << 24) | (mac_addr[3] << 16) |
1562                         (mac_addr[4] << 8) | mac_addr[5];
1563         }
1564
1565         hw_atl_rpfl2_uc_flr_en_set(hw, 0U, index);
1566         hw_atl_rpfl2unicast_dest_addresslsw_set(hw, l, index);
1567         hw_atl_rpfl2unicast_dest_addressmsw_set(hw, h, index);
1568
1569         if (enable)
1570                 hw_atl_rpfl2_uc_flr_en_set(hw, 1U, index);
1571
1572         err = aq_hw_err_from_flags(hw);
1573
1574         return err;
1575 }
1576
1577 static int
1578 atl_add_mac_addr(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr,
1579                         uint32_t index __rte_unused, uint32_t pool __rte_unused)
1580 {
1581         if (rte_is_zero_ether_addr(mac_addr)) {
1582                 PMD_DRV_LOG(ERR, "Invalid Ethernet Address");
1583                 return -EINVAL;
1584         }
1585
1586         return atl_update_mac_addr(dev, index, (u8 *)mac_addr, true);
1587 }
1588
1589 static void
1590 atl_remove_mac_addr(struct rte_eth_dev *dev, uint32_t index)
1591 {
1592         atl_update_mac_addr(dev, index, NULL, false);
1593 }
1594
1595 static int
1596 atl_set_default_mac_addr(struct rte_eth_dev *dev, struct rte_ether_addr *addr)
1597 {
1598         atl_remove_mac_addr(dev, 0);
1599         atl_add_mac_addr(dev, addr, 0, 0);
1600         return 0;
1601 }
1602
1603 static int
1604 atl_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
1605 {
1606         struct rte_eth_dev_info dev_info;
1607         uint32_t frame_size = mtu + RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN;
1608
1609         atl_dev_info_get(dev, &dev_info);
1610
1611         if (mtu < RTE_ETHER_MIN_MTU || frame_size > dev_info.max_rx_pktlen)
1612                 return -EINVAL;
1613
1614         /* update max frame size */
1615         dev->data->dev_conf.rxmode.max_rx_pkt_len = frame_size;
1616
1617         return 0;
1618 }
1619
1620 static int
1621 atl_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)
1622 {
1623         struct aq_hw_cfg_s *cfg =
1624                 ATL_DEV_PRIVATE_TO_CFG(dev->data->dev_private);
1625         struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1626         int err = 0;
1627         int i = 0;
1628
1629         PMD_INIT_FUNC_TRACE();
1630
1631         for (i = 0; i < HW_ATL_B0_MAX_VLAN_IDS; i++) {
1632                 if (cfg->vlan_filter[i] == vlan_id) {
1633                         if (!on) {
1634                                 /* Disable VLAN filter. */
1635                                 hw_atl_rpf_vlan_flr_en_set(hw, 0U, i);
1636
1637                                 /* Clear VLAN filter entry */
1638                                 cfg->vlan_filter[i] = 0;
1639                         }
1640                         break;
1641                 }
1642         }
1643
1644         /* VLAN_ID was not found. So, nothing to delete. */
1645         if (i == HW_ATL_B0_MAX_VLAN_IDS && !on)
1646                 goto exit;
1647
1648         /* VLAN_ID already exist, or already removed above. Nothing to do. */
1649         if (i != HW_ATL_B0_MAX_VLAN_IDS)
1650                 goto exit;
1651
1652         /* Try to found free VLAN filter to add new VLAN_ID */
1653         for (i = 0; i < HW_ATL_B0_MAX_VLAN_IDS; i++) {
1654                 if (cfg->vlan_filter[i] == 0)
1655                         break;
1656         }
1657
1658         if (i == HW_ATL_B0_MAX_VLAN_IDS) {
1659                 /* We have no free VLAN filter to add new VLAN_ID*/
1660                 err = -ENOMEM;
1661                 goto exit;
1662         }
1663
1664         cfg->vlan_filter[i] = vlan_id;
1665         hw_atl_rpf_vlan_flr_act_set(hw, 1U, i);
1666         hw_atl_rpf_vlan_id_flr_set(hw, vlan_id, i);
1667         hw_atl_rpf_vlan_flr_en_set(hw, 1U, i);
1668
1669 exit:
1670         /* Enable VLAN promisc mode if vlan_filter empty  */
1671         for (i = 0; i < HW_ATL_B0_MAX_VLAN_IDS; i++) {
1672                 if (cfg->vlan_filter[i] != 0)
1673                         break;
1674         }
1675
1676         hw_atl_rpf_vlan_prom_mode_en_set(hw, i == HW_ATL_B0_MAX_VLAN_IDS);
1677
1678         return err;
1679 }
1680
1681 static int
1682 atl_enable_vlan_filter(struct rte_eth_dev *dev, int en)
1683 {
1684         struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1685         struct aq_hw_cfg_s *cfg =
1686                 ATL_DEV_PRIVATE_TO_CFG(dev->data->dev_private);
1687         int i;
1688
1689         PMD_INIT_FUNC_TRACE();
1690
1691         for (i = 0; i < HW_ATL_B0_MAX_VLAN_IDS; i++) {
1692                 if (cfg->vlan_filter[i])
1693                         hw_atl_rpf_vlan_flr_en_set(hw, en, i);
1694         }
1695         return 0;
1696 }
1697
1698 static int
1699 atl_vlan_offload_set(struct rte_eth_dev *dev, int mask)
1700 {
1701         struct aq_hw_cfg_s *cfg =
1702                 ATL_DEV_PRIVATE_TO_CFG(dev->data->dev_private);
1703         struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1704         int ret = 0;
1705         int i;
1706
1707         PMD_INIT_FUNC_TRACE();
1708
1709         ret = atl_enable_vlan_filter(dev, mask & ETH_VLAN_FILTER_MASK);
1710
1711         cfg->vlan_strip = !!(mask & ETH_VLAN_STRIP_MASK);
1712
1713         for (i = 0; i < dev->data->nb_rx_queues; i++)
1714                 hw_atl_rpo_rx_desc_vlan_stripping_set(hw, cfg->vlan_strip, i);
1715
1716         if (mask & ETH_VLAN_EXTEND_MASK)
1717                 ret = -ENOTSUP;
1718
1719         return ret;
1720 }
1721
1722 static int
1723 atl_vlan_tpid_set(struct rte_eth_dev *dev, enum rte_vlan_type vlan_type,
1724                   uint16_t tpid)
1725 {
1726         struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1727         int err = 0;
1728
1729         PMD_INIT_FUNC_TRACE();
1730
1731         switch (vlan_type) {
1732         case ETH_VLAN_TYPE_INNER:
1733                 hw_atl_rpf_vlan_inner_etht_set(hw, tpid);
1734                 break;
1735         case ETH_VLAN_TYPE_OUTER:
1736                 hw_atl_rpf_vlan_outer_etht_set(hw, tpid);
1737                 break;
1738         default:
1739                 PMD_DRV_LOG(ERR, "Unsupported VLAN type");
1740                 err = -ENOTSUP;
1741         }
1742
1743         return err;
1744 }
1745
1746 static void
1747 atl_vlan_strip_queue_set(struct rte_eth_dev *dev, uint16_t queue_id, int on)
1748 {
1749         struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1750
1751         PMD_INIT_FUNC_TRACE();
1752
1753         if (queue_id > dev->data->nb_rx_queues) {
1754                 PMD_DRV_LOG(ERR, "Invalid queue id");
1755                 return;
1756         }
1757
1758         hw_atl_rpo_rx_desc_vlan_stripping_set(hw, on, queue_id);
1759 }
1760
1761 static int
1762 atl_dev_set_mc_addr_list(struct rte_eth_dev *dev,
1763                           struct rte_ether_addr *mc_addr_set,
1764                           uint32_t nb_mc_addr)
1765 {
1766         struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1767         u32 i;
1768
1769         if (nb_mc_addr > AQ_HW_MULTICAST_ADDRESS_MAX - HW_ATL_B0_MAC_MIN)
1770                 return -EINVAL;
1771
1772         /* Update whole uc filters table */
1773         for (i = 0; i < AQ_HW_MULTICAST_ADDRESS_MAX - HW_ATL_B0_MAC_MIN; i++) {
1774                 u8 *mac_addr = NULL;
1775                 u32 l = 0, h = 0;
1776
1777                 if (i < nb_mc_addr) {
1778                         mac_addr = mc_addr_set[i].addr_bytes;
1779                         l = (mac_addr[2] << 24) | (mac_addr[3] << 16) |
1780                                 (mac_addr[4] << 8) | mac_addr[5];
1781                         h = (mac_addr[0] << 8) | mac_addr[1];
1782                 }
1783
1784                 hw_atl_rpfl2_uc_flr_en_set(hw, 0U, HW_ATL_B0_MAC_MIN + i);
1785                 hw_atl_rpfl2unicast_dest_addresslsw_set(hw, l,
1786                                                         HW_ATL_B0_MAC_MIN + i);
1787                 hw_atl_rpfl2unicast_dest_addressmsw_set(hw, h,
1788                                                         HW_ATL_B0_MAC_MIN + i);
1789                 hw_atl_rpfl2_uc_flr_en_set(hw, !!mac_addr,
1790                                            HW_ATL_B0_MAC_MIN + i);
1791         }
1792
1793         return 0;
1794 }
1795
1796 static int
1797 atl_reta_update(struct rte_eth_dev *dev,
1798                    struct rte_eth_rss_reta_entry64 *reta_conf,
1799                    uint16_t reta_size)
1800 {
1801         int i;
1802         struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1803         struct aq_hw_cfg_s *cf = ATL_DEV_PRIVATE_TO_CFG(dev->data->dev_private);
1804
1805         for (i = 0; i < reta_size && i < cf->aq_rss.indirection_table_size; i++)
1806                 cf->aq_rss.indirection_table[i] = min(reta_conf->reta[i],
1807                                         dev->data->nb_rx_queues - 1);
1808
1809         hw_atl_b0_hw_rss_set(hw, &cf->aq_rss);
1810         return 0;
1811 }
1812
1813 static int
1814 atl_reta_query(struct rte_eth_dev *dev,
1815                     struct rte_eth_rss_reta_entry64 *reta_conf,
1816                     uint16_t reta_size)
1817 {
1818         int i;
1819         struct aq_hw_cfg_s *cf = ATL_DEV_PRIVATE_TO_CFG(dev->data->dev_private);
1820
1821         for (i = 0; i < reta_size && i < cf->aq_rss.indirection_table_size; i++)
1822                 reta_conf->reta[i] = cf->aq_rss.indirection_table[i];
1823         reta_conf->mask = ~0U;
1824         return 0;
1825 }
1826
1827 static int
1828 atl_rss_hash_update(struct rte_eth_dev *dev,
1829                                  struct rte_eth_rss_conf *rss_conf)
1830 {
1831         struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1832         struct aq_hw_cfg_s *cfg =
1833                 ATL_DEV_PRIVATE_TO_CFG(dev->data->dev_private);
1834         static u8 def_rss_key[40] = {
1835                 0x1e, 0xad, 0x71, 0x87, 0x65, 0xfc, 0x26, 0x7d,
1836                 0x0d, 0x45, 0x67, 0x74, 0xcd, 0x06, 0x1a, 0x18,
1837                 0xb6, 0xc1, 0xf0, 0xc7, 0xbb, 0x18, 0xbe, 0xf8,
1838                 0x19, 0x13, 0x4b, 0xa9, 0xd0, 0x3e, 0xfe, 0x70,
1839                 0x25, 0x03, 0xab, 0x50, 0x6a, 0x8b, 0x82, 0x0c
1840         };
1841
1842         cfg->is_rss = !!rss_conf->rss_hf;
1843         if (rss_conf->rss_key) {
1844                 memcpy(cfg->aq_rss.hash_secret_key, rss_conf->rss_key,
1845                        rss_conf->rss_key_len);
1846                 cfg->aq_rss.hash_secret_key_size = rss_conf->rss_key_len;
1847         } else {
1848                 memcpy(cfg->aq_rss.hash_secret_key, def_rss_key,
1849                        sizeof(def_rss_key));
1850                 cfg->aq_rss.hash_secret_key_size = sizeof(def_rss_key);
1851         }
1852
1853         hw_atl_b0_hw_rss_set(hw, &cfg->aq_rss);
1854         hw_atl_b0_hw_rss_hash_set(hw, &cfg->aq_rss);
1855         return 0;
1856 }
1857
1858 static int
1859 atl_rss_hash_conf_get(struct rte_eth_dev *dev,
1860                                  struct rte_eth_rss_conf *rss_conf)
1861 {
1862         struct aq_hw_cfg_s *cfg =
1863                 ATL_DEV_PRIVATE_TO_CFG(dev->data->dev_private);
1864
1865         rss_conf->rss_hf = cfg->is_rss ? ATL_RSS_OFFLOAD_ALL : 0;
1866         if (rss_conf->rss_key) {
1867                 rss_conf->rss_key_len = cfg->aq_rss.hash_secret_key_size;
1868                 memcpy(rss_conf->rss_key, cfg->aq_rss.hash_secret_key,
1869                        rss_conf->rss_key_len);
1870         }
1871
1872         return 0;
1873 }
1874
1875 static bool
1876 is_device_supported(struct rte_eth_dev *dev, struct rte_pci_driver *drv)
1877 {
1878         if (strcmp(dev->device->driver->name, drv->driver.name))
1879                 return false;
1880
1881         return true;
1882 }
1883
1884 bool
1885 is_atlantic_supported(struct rte_eth_dev *dev)
1886 {
1887         return is_device_supported(dev, &rte_atl_pmd);
1888 }
1889
1890 RTE_PMD_REGISTER_PCI(net_atlantic, rte_atl_pmd);
1891 RTE_PMD_REGISTER_PCI_TABLE(net_atlantic, pci_id_atl_map);
1892 RTE_PMD_REGISTER_KMOD_DEP(net_atlantic, "* igb_uio | uio_pci_generic");
1893
1894 RTE_INIT(atl_init_log)
1895 {
1896         atl_logtype_init = rte_log_register("pmd.net.atlantic.init");
1897         if (atl_logtype_init >= 0)
1898                 rte_log_set_level(atl_logtype_init, RTE_LOG_NOTICE);
1899         atl_logtype_driver = rte_log_register("pmd.net.atlantic.driver");
1900         if (atl_logtype_driver >= 0)
1901                 rte_log_set_level(atl_logtype_driver, RTE_LOG_NOTICE);
1902 }