xref: /dpdk/drivers/net/atlantic/atl_ethdev.c (revision 14ad4f01845331a0ae98c681efa3086eeed3343a)
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 }
1903