xref: /linux/drivers/net/ethernet/aquantia/atlantic/aq_hw.h (revision 9a8cac4b4dae9d5717d4e5f38e0a5ce41de501ee)
1753f4783SDavid VomLehn /*
2753f4783SDavid VomLehn  * aQuantia Corporation Network Driver
3753f4783SDavid VomLehn  * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved
4753f4783SDavid VomLehn  *
5753f4783SDavid VomLehn  * This program is free software; you can redistribute it and/or modify it
6753f4783SDavid VomLehn  * under the terms and conditions of the GNU General Public License,
7753f4783SDavid VomLehn  * version 2, as published by the Free Software Foundation.
8753f4783SDavid VomLehn  */
9753f4783SDavid VomLehn 
101a713f87SIgor Russkikh /* File aq_hw.h: Declaration of abstract interface for NIC hardware specific
11753f4783SDavid VomLehn  * functions.
12753f4783SDavid VomLehn  */
13753f4783SDavid VomLehn 
14753f4783SDavid VomLehn #ifndef AQ_HW_H
15753f4783SDavid VomLehn #define AQ_HW_H
16753f4783SDavid VomLehn 
17753f4783SDavid VomLehn #include "aq_common.h"
18db550615SIgor Russkikh #include "aq_rss.h"
191a713f87SIgor Russkikh #include "hw_atl/hw_atl_utils.h"
20753f4783SDavid VomLehn 
2154bcb3d1SDmitry Bogdanov #define AQ_RX_FIRST_LOC_FVLANID     0U
2254bcb3d1SDmitry Bogdanov #define AQ_RX_LAST_LOC_FVLANID	   15U
23*9a8cac4bSDmitry Bogdanov #define AQ_RX_FIRST_LOC_FETHERT    16U
24*9a8cac4bSDmitry Bogdanov #define AQ_RX_LAST_LOC_FETHERT	   31U
25a6ed6f22SDmitry Bogdanov #define AQ_RX_FIRST_LOC_FL3L4	   32U
26a6ed6f22SDmitry Bogdanov #define AQ_RX_LAST_LOC_FL3L4	   39U
27a6ed6f22SDmitry Bogdanov #define AQ_RX_MAX_RXNFC_LOC	   AQ_RX_LAST_LOC_FL3L4
2854bcb3d1SDmitry Bogdanov #define AQ_VLAN_MAX_FILTERS   \
2954bcb3d1SDmitry Bogdanov 			(AQ_RX_LAST_LOC_FVLANID - AQ_RX_FIRST_LOC_FVLANID + 1U)
30a6ed6f22SDmitry Bogdanov 
31753f4783SDavid VomLehn /* NIC H/W capabilities */
32753f4783SDavid VomLehn struct aq_hw_caps_s {
33753f4783SDavid VomLehn 	u64 hw_features;
34753f4783SDavid VomLehn 	u64 link_speed_msk;
35753f4783SDavid VomLehn 	unsigned int hw_priv_flags;
364948293fSIgor Russkikh 	u32 media_type;
37c1af5427SAnton Mikaev 	u32 rxds_max;
38c1af5427SAnton Mikaev 	u32 txds_max;
39c1af5427SAnton Mikaev 	u32 rxds_min;
40c1af5427SAnton Mikaev 	u32 txds_min;
41753f4783SDavid VomLehn 	u32 txhwb_alignment;
42753f4783SDavid VomLehn 	u32 irq_mask;
43753f4783SDavid VomLehn 	u32 vecs;
44753f4783SDavid VomLehn 	u32 mtu;
45753f4783SDavid VomLehn 	u32 mac_regs_count;
4676c19c6cSIgor Russkikh 	u32 hw_alive_check_addr;
47753f4783SDavid VomLehn 	u8 msix_irqs;
48753f4783SDavid VomLehn 	u8 tcs;
49753f4783SDavid VomLehn 	u8 rxd_alignment;
50753f4783SDavid VomLehn 	u8 rxd_size;
51753f4783SDavid VomLehn 	u8 txd_alignment;
52753f4783SDavid VomLehn 	u8 txd_size;
53753f4783SDavid VomLehn 	u8 tx_rings;
54753f4783SDavid VomLehn 	u8 rx_rings;
55753f4783SDavid VomLehn 	bool flow_control;
56753f4783SDavid VomLehn 	bool is_64_dma;
57753f4783SDavid VomLehn };
58753f4783SDavid VomLehn 
59753f4783SDavid VomLehn struct aq_hw_link_status_s {
60753f4783SDavid VomLehn 	unsigned int mbps;
61753f4783SDavid VomLehn };
62753f4783SDavid VomLehn 
63be08d839SIgor Russkikh struct aq_stats_s {
64be08d839SIgor Russkikh 	u64 uprc;
65be08d839SIgor Russkikh 	u64 mprc;
66be08d839SIgor Russkikh 	u64 bprc;
67be08d839SIgor Russkikh 	u64 erpt;
68be08d839SIgor Russkikh 	u64 uptc;
69be08d839SIgor Russkikh 	u64 mptc;
70be08d839SIgor Russkikh 	u64 bptc;
71be08d839SIgor Russkikh 	u64 erpr;
72be08d839SIgor Russkikh 	u64 mbtc;
73be08d839SIgor Russkikh 	u64 bbtc;
74be08d839SIgor Russkikh 	u64 mbrc;
75be08d839SIgor Russkikh 	u64 bbrc;
76be08d839SIgor Russkikh 	u64 ubrc;
77be08d839SIgor Russkikh 	u64 ubtc;
78be08d839SIgor Russkikh 	u64 dpc;
79be08d839SIgor Russkikh 	u64 dma_pkt_rc;
80be08d839SIgor Russkikh 	u64 dma_pkt_tc;
81be08d839SIgor Russkikh 	u64 dma_oct_rc;
82be08d839SIgor Russkikh 	u64 dma_oct_tc;
83be08d839SIgor Russkikh };
84be08d839SIgor Russkikh 
85753f4783SDavid VomLehn #define AQ_HW_IRQ_INVALID 0U
86753f4783SDavid VomLehn #define AQ_HW_IRQ_LEGACY  1U
87753f4783SDavid VomLehn #define AQ_HW_IRQ_MSI     2U
88753f4783SDavid VomLehn #define AQ_HW_IRQ_MSIX    3U
89753f4783SDavid VomLehn 
90753f4783SDavid VomLehn #define AQ_HW_POWER_STATE_D0   0U
91753f4783SDavid VomLehn #define AQ_HW_POWER_STATE_D3   3U
92753f4783SDavid VomLehn 
93753f4783SDavid VomLehn #define AQ_HW_FLAG_STARTED     0x00000004U
94753f4783SDavid VomLehn #define AQ_HW_FLAG_STOPPING    0x00000008U
95753f4783SDavid VomLehn #define AQ_HW_FLAG_RESETTING   0x00000010U
96753f4783SDavid VomLehn #define AQ_HW_FLAG_CLOSING     0x00000020U
97753f4783SDavid VomLehn #define AQ_HW_LINK_DOWN        0x04000000U
98753f4783SDavid VomLehn #define AQ_HW_FLAG_ERR_UNPLUG  0x40000000U
99753f4783SDavid VomLehn #define AQ_HW_FLAG_ERR_HW      0x80000000U
100753f4783SDavid VomLehn 
101753f4783SDavid VomLehn #define AQ_HW_FLAG_ERRORS      (AQ_HW_FLAG_ERR_HW | AQ_HW_FLAG_ERR_UNPLUG)
102753f4783SDavid VomLehn 
103db550615SIgor Russkikh #define AQ_NIC_FLAGS_IS_NOT_READY (AQ_NIC_FLAG_STOPPING | \
104db550615SIgor Russkikh 			AQ_NIC_FLAG_RESETTING | AQ_NIC_FLAG_CLOSING | \
105db550615SIgor Russkikh 			AQ_NIC_FLAG_ERR_UNPLUG | AQ_NIC_FLAG_ERR_HW)
106db550615SIgor Russkikh 
107db550615SIgor Russkikh #define AQ_NIC_FLAGS_IS_NOT_TX_READY (AQ_NIC_FLAGS_IS_NOT_READY | \
108db550615SIgor Russkikh 					AQ_NIC_LINK_DOWN)
109db550615SIgor Russkikh 
1104948293fSIgor Russkikh #define AQ_HW_MEDIA_TYPE_TP    1U
1114948293fSIgor Russkikh #define AQ_HW_MEDIA_TYPE_FIBRE 2U
1124948293fSIgor Russkikh 
113c1af5427SAnton Mikaev #define AQ_HW_TXD_MULTIPLE 8U
114c1af5427SAnton Mikaev #define AQ_HW_RXD_MULTIPLE 8U
115c1af5427SAnton Mikaev 
11694b3b542SIgor Russkikh #define AQ_HW_MULTICAST_ADDRESS_MAX     32U
11794b3b542SIgor Russkikh 
118753f4783SDavid VomLehn struct aq_hw_s {
11978f5193dSIgor Russkikh 	atomic_t flags;
120c8c82eb3SIgor Russkikh 	u8 rbl_enabled:1;
121753f4783SDavid VomLehn 	struct aq_nic_cfg_s *aq_nic_cfg;
1220c58c35fSIgor Russkikh 	const struct aq_fw_ops *aq_fw_ops;
123753f4783SDavid VomLehn 	void __iomem *mmio;
124753f4783SDavid VomLehn 	struct aq_hw_link_status_s aq_link_status;
1258f60f762SNikita Danilov 	struct hw_atl_utils_mbox mbox;
1261a713f87SIgor Russkikh 	struct hw_atl_stats_s last_stats;
1271a713f87SIgor Russkikh 	struct aq_stats_s curr_stats;
1281a713f87SIgor Russkikh 	u64 speed;
1291a713f87SIgor Russkikh 	u32 itr_tx;
1301a713f87SIgor Russkikh 	u32 itr_rx;
1311a713f87SIgor Russkikh 	unsigned int chip_features;
1321a713f87SIgor Russkikh 	u32 fw_ver_actual;
1331a713f87SIgor Russkikh 	atomic_t dpc;
1341a713f87SIgor Russkikh 	u32 mbox_addr;
1351a713f87SIgor Russkikh 	u32 rpc_addr;
1361a713f87SIgor Russkikh 	u32 rpc_tid;
1378f60f762SNikita Danilov 	struct hw_atl_utils_fw_rpc rpc;
138753f4783SDavid VomLehn };
139753f4783SDavid VomLehn 
140753f4783SDavid VomLehn struct aq_ring_s;
141753f4783SDavid VomLehn struct aq_ring_param_s;
142753f4783SDavid VomLehn struct sk_buff;
143a6ed6f22SDmitry Bogdanov struct aq_rx_filter_l3l4;
144753f4783SDavid VomLehn 
145753f4783SDavid VomLehn struct aq_hw_ops {
146753f4783SDavid VomLehn 
147753f4783SDavid VomLehn 	int (*hw_ring_tx_xmit)(struct aq_hw_s *self, struct aq_ring_s *aq_ring,
148753f4783SDavid VomLehn 			       unsigned int frags);
149753f4783SDavid VomLehn 
150753f4783SDavid VomLehn 	int (*hw_ring_rx_receive)(struct aq_hw_s *self,
151753f4783SDavid VomLehn 				  struct aq_ring_s *aq_ring);
152753f4783SDavid VomLehn 
153753f4783SDavid VomLehn 	int (*hw_ring_rx_fill)(struct aq_hw_s *self, struct aq_ring_s *aq_ring,
154753f4783SDavid VomLehn 			       unsigned int sw_tail_old);
155753f4783SDavid VomLehn 
156753f4783SDavid VomLehn 	int (*hw_ring_tx_head_update)(struct aq_hw_s *self,
157753f4783SDavid VomLehn 				      struct aq_ring_s *aq_ring);
158753f4783SDavid VomLehn 
159753f4783SDavid VomLehn 	int (*hw_set_mac_address)(struct aq_hw_s *self, u8 *mac_addr);
160753f4783SDavid VomLehn 
161753f4783SDavid VomLehn 	int (*hw_reset)(struct aq_hw_s *self);
162753f4783SDavid VomLehn 
1631a713f87SIgor Russkikh 	int (*hw_init)(struct aq_hw_s *self, u8 *mac_addr);
164753f4783SDavid VomLehn 
165753f4783SDavid VomLehn 	int (*hw_start)(struct aq_hw_s *self);
166753f4783SDavid VomLehn 
167753f4783SDavid VomLehn 	int (*hw_stop)(struct aq_hw_s *self);
168753f4783SDavid VomLehn 
169753f4783SDavid VomLehn 	int (*hw_ring_tx_init)(struct aq_hw_s *self, struct aq_ring_s *aq_ring,
170753f4783SDavid VomLehn 			       struct aq_ring_param_s *aq_ring_param);
171753f4783SDavid VomLehn 
172753f4783SDavid VomLehn 	int (*hw_ring_tx_start)(struct aq_hw_s *self,
173753f4783SDavid VomLehn 				struct aq_ring_s *aq_ring);
174753f4783SDavid VomLehn 
175753f4783SDavid VomLehn 	int (*hw_ring_tx_stop)(struct aq_hw_s *self,
176753f4783SDavid VomLehn 			       struct aq_ring_s *aq_ring);
177753f4783SDavid VomLehn 
178753f4783SDavid VomLehn 	int (*hw_ring_rx_init)(struct aq_hw_s *self,
179753f4783SDavid VomLehn 			       struct aq_ring_s *aq_ring,
180753f4783SDavid VomLehn 			       struct aq_ring_param_s *aq_ring_param);
181753f4783SDavid VomLehn 
182753f4783SDavid VomLehn 	int (*hw_ring_rx_start)(struct aq_hw_s *self,
183753f4783SDavid VomLehn 				struct aq_ring_s *aq_ring);
184753f4783SDavid VomLehn 
185753f4783SDavid VomLehn 	int (*hw_ring_rx_stop)(struct aq_hw_s *self,
186753f4783SDavid VomLehn 			       struct aq_ring_s *aq_ring);
187753f4783SDavid VomLehn 
188753f4783SDavid VomLehn 	int (*hw_irq_enable)(struct aq_hw_s *self, u64 mask);
189753f4783SDavid VomLehn 
190753f4783SDavid VomLehn 	int (*hw_irq_disable)(struct aq_hw_s *self, u64 mask);
191753f4783SDavid VomLehn 
192753f4783SDavid VomLehn 	int (*hw_irq_read)(struct aq_hw_s *self, u64 *mask);
193753f4783SDavid VomLehn 
194753f4783SDavid VomLehn 	int (*hw_packet_filter_set)(struct aq_hw_s *self,
195753f4783SDavid VomLehn 				    unsigned int packet_filter);
196753f4783SDavid VomLehn 
197a6ed6f22SDmitry Bogdanov 	int (*hw_filter_l3l4_set)(struct aq_hw_s *self,
198a6ed6f22SDmitry Bogdanov 				  struct aq_rx_filter_l3l4 *data);
199a6ed6f22SDmitry Bogdanov 
200a6ed6f22SDmitry Bogdanov 	int (*hw_filter_l3l4_clear)(struct aq_hw_s *self,
201a6ed6f22SDmitry Bogdanov 				    struct aq_rx_filter_l3l4 *data);
202a6ed6f22SDmitry Bogdanov 
203*9a8cac4bSDmitry Bogdanov 	int (*hw_filter_l2_set)(struct aq_hw_s *self,
204*9a8cac4bSDmitry Bogdanov 				struct aq_rx_filter_l2 *data);
205*9a8cac4bSDmitry Bogdanov 
206*9a8cac4bSDmitry Bogdanov 	int (*hw_filter_l2_clear)(struct aq_hw_s *self,
207*9a8cac4bSDmitry Bogdanov 				  struct aq_rx_filter_l2 *data);
208*9a8cac4bSDmitry Bogdanov 
20954bcb3d1SDmitry Bogdanov 	int (*hw_filter_vlan_set)(struct aq_hw_s *self,
21054bcb3d1SDmitry Bogdanov 				  struct aq_rx_filter_vlan *aq_vlans);
21154bcb3d1SDmitry Bogdanov 
21254bcb3d1SDmitry Bogdanov 	int (*hw_filter_vlan_ctrl)(struct aq_hw_s *self, bool enable);
21354bcb3d1SDmitry Bogdanov 
214753f4783SDavid VomLehn 	int (*hw_multicast_list_set)(struct aq_hw_s *self,
21594b3b542SIgor Russkikh 				     u8 ar_mac[AQ_HW_MULTICAST_ADDRESS_MAX]
216753f4783SDavid VomLehn 				     [ETH_ALEN],
217753f4783SDavid VomLehn 				     u32 count);
218753f4783SDavid VomLehn 
219b82ee71aSIgor Russkikh 	int (*hw_interrupt_moderation_set)(struct aq_hw_s *self);
220753f4783SDavid VomLehn 
221753f4783SDavid VomLehn 	int (*hw_rss_set)(struct aq_hw_s *self,
222753f4783SDavid VomLehn 			  struct aq_rss_parameters *rss_params);
223753f4783SDavid VomLehn 
224753f4783SDavid VomLehn 	int (*hw_rss_hash_set)(struct aq_hw_s *self,
225753f4783SDavid VomLehn 			       struct aq_rss_parameters *rss_params);
226753f4783SDavid VomLehn 
227753f4783SDavid VomLehn 	int (*hw_get_regs)(struct aq_hw_s *self,
2284cbc9f92SIgor Russkikh 			   const struct aq_hw_caps_s *aq_hw_caps,
2294cbc9f92SIgor Russkikh 			   u32 *regs_buff);
230753f4783SDavid VomLehn 
231be08d839SIgor Russkikh 	struct aq_stats_s *(*hw_get_hw_stats)(struct aq_hw_s *self);
232753f4783SDavid VomLehn 
233753f4783SDavid VomLehn 	int (*hw_get_fw_version)(struct aq_hw_s *self, u32 *fw_version);
234753f4783SDavid VomLehn 
235bbb67a44SDmitry Bogdanov 	int (*hw_set_offload)(struct aq_hw_s *self,
236bbb67a44SDmitry Bogdanov 			      struct aq_nic_cfg_s *aq_nic_cfg);
237bbb67a44SDmitry Bogdanov 
23835e8e8b4SIgor Russkikh 	int (*hw_set_fc)(struct aq_hw_s *self, u32 fc, u32 tc);
239753f4783SDavid VomLehn };
240753f4783SDavid VomLehn 
2410c58c35fSIgor Russkikh struct aq_fw_ops {
2420c58c35fSIgor Russkikh 	int (*init)(struct aq_hw_s *self);
2430c58c35fSIgor Russkikh 
24444e00dd8SIgor Russkikh 	int (*deinit)(struct aq_hw_s *self);
24544e00dd8SIgor Russkikh 
2460c58c35fSIgor Russkikh 	int (*reset)(struct aq_hw_s *self);
2470c58c35fSIgor Russkikh 
248b8d68b62SAnton Mikaev 	int (*renegotiate)(struct aq_hw_s *self);
249b8d68b62SAnton Mikaev 
2500c58c35fSIgor Russkikh 	int (*get_mac_permanent)(struct aq_hw_s *self, u8 *mac);
2510c58c35fSIgor Russkikh 
2520c58c35fSIgor Russkikh 	int (*set_link_speed)(struct aq_hw_s *self, u32 speed);
2530c58c35fSIgor Russkikh 
25444e00dd8SIgor Russkikh 	int (*set_state)(struct aq_hw_s *self,
25544e00dd8SIgor Russkikh 			 enum hal_atl_utils_fw_state_e state);
2560c58c35fSIgor Russkikh 
2570c58c35fSIgor Russkikh 	int (*update_link_status)(struct aq_hw_s *self);
2580c58c35fSIgor Russkikh 
2590c58c35fSIgor Russkikh 	int (*update_stats)(struct aq_hw_s *self);
26044e00dd8SIgor Russkikh 
26135e8e8b4SIgor Russkikh 	u32 (*get_flow_control)(struct aq_hw_s *self, u32 *fcmode);
26235e8e8b4SIgor Russkikh 
26344e00dd8SIgor Russkikh 	int (*set_flow_control)(struct aq_hw_s *self);
264a0da96c0SYana Esina 
265a0da96c0SYana Esina 	int (*set_power)(struct aq_hw_s *self, unsigned int power_state,
266a0da96c0SYana Esina 			 u8 *mac);
26792ab6407SYana Esina 
26892ab6407SYana Esina 	int (*set_eee_rate)(struct aq_hw_s *self, u32 speed);
26992ab6407SYana Esina 
27092ab6407SYana Esina 	int (*get_eee_rate)(struct aq_hw_s *self, u32 *rate,
27192ab6407SYana Esina 			    u32 *supported_rates);
2720c58c35fSIgor Russkikh };
2730c58c35fSIgor Russkikh 
274753f4783SDavid VomLehn #endif /* AQ_HW_H */
275