xref: /linux/drivers/net/ethernet/aquantia/atlantic/aq_hw.h (revision 0c58c35f02c2e99bb10137b32e8ec96dcbdcc705)
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 
21753f4783SDavid VomLehn /* NIC H/W capabilities */
22753f4783SDavid VomLehn struct aq_hw_caps_s {
23753f4783SDavid VomLehn 	u64 hw_features;
24753f4783SDavid VomLehn 	u64 link_speed_msk;
25753f4783SDavid VomLehn 	unsigned int hw_priv_flags;
264948293fSIgor Russkikh 	u32 media_type;
27753f4783SDavid VomLehn 	u32 rxds;
28753f4783SDavid VomLehn 	u32 txds;
29753f4783SDavid VomLehn 	u32 txhwb_alignment;
30753f4783SDavid VomLehn 	u32 irq_mask;
31753f4783SDavid VomLehn 	u32 vecs;
32753f4783SDavid VomLehn 	u32 mtu;
33753f4783SDavid VomLehn 	u32 mac_regs_count;
3476c19c6cSIgor Russkikh 	u32 hw_alive_check_addr;
35753f4783SDavid VomLehn 	u8 msix_irqs;
36753f4783SDavid VomLehn 	u8 tcs;
37753f4783SDavid VomLehn 	u8 rxd_alignment;
38753f4783SDavid VomLehn 	u8 rxd_size;
39753f4783SDavid VomLehn 	u8 txd_alignment;
40753f4783SDavid VomLehn 	u8 txd_size;
41753f4783SDavid VomLehn 	u8 tx_rings;
42753f4783SDavid VomLehn 	u8 rx_rings;
43753f4783SDavid VomLehn 	bool flow_control;
44753f4783SDavid VomLehn 	bool is_64_dma;
45753f4783SDavid VomLehn 	u32 fw_ver_expected;
46753f4783SDavid VomLehn };
47753f4783SDavid VomLehn 
48753f4783SDavid VomLehn struct aq_hw_link_status_s {
49753f4783SDavid VomLehn 	unsigned int mbps;
50753f4783SDavid VomLehn };
51753f4783SDavid VomLehn 
52be08d839SIgor Russkikh struct aq_stats_s {
53be08d839SIgor Russkikh 	u64 uprc;
54be08d839SIgor Russkikh 	u64 mprc;
55be08d839SIgor Russkikh 	u64 bprc;
56be08d839SIgor Russkikh 	u64 erpt;
57be08d839SIgor Russkikh 	u64 uptc;
58be08d839SIgor Russkikh 	u64 mptc;
59be08d839SIgor Russkikh 	u64 bptc;
60be08d839SIgor Russkikh 	u64 erpr;
61be08d839SIgor Russkikh 	u64 mbtc;
62be08d839SIgor Russkikh 	u64 bbtc;
63be08d839SIgor Russkikh 	u64 mbrc;
64be08d839SIgor Russkikh 	u64 bbrc;
65be08d839SIgor Russkikh 	u64 ubrc;
66be08d839SIgor Russkikh 	u64 ubtc;
67be08d839SIgor Russkikh 	u64 dpc;
68be08d839SIgor Russkikh 	u64 dma_pkt_rc;
69be08d839SIgor Russkikh 	u64 dma_pkt_tc;
70be08d839SIgor Russkikh 	u64 dma_oct_rc;
71be08d839SIgor Russkikh 	u64 dma_oct_tc;
72be08d839SIgor Russkikh };
73be08d839SIgor Russkikh 
74753f4783SDavid VomLehn #define AQ_HW_IRQ_INVALID 0U
75753f4783SDavid VomLehn #define AQ_HW_IRQ_LEGACY  1U
76753f4783SDavid VomLehn #define AQ_HW_IRQ_MSI     2U
77753f4783SDavid VomLehn #define AQ_HW_IRQ_MSIX    3U
78753f4783SDavid VomLehn 
79753f4783SDavid VomLehn #define AQ_HW_POWER_STATE_D0   0U
80753f4783SDavid VomLehn #define AQ_HW_POWER_STATE_D3   3U
81753f4783SDavid VomLehn 
82753f4783SDavid VomLehn #define AQ_HW_FLAG_STARTED     0x00000004U
83753f4783SDavid VomLehn #define AQ_HW_FLAG_STOPPING    0x00000008U
84753f4783SDavid VomLehn #define AQ_HW_FLAG_RESETTING   0x00000010U
85753f4783SDavid VomLehn #define AQ_HW_FLAG_CLOSING     0x00000020U
86753f4783SDavid VomLehn #define AQ_HW_LINK_DOWN        0x04000000U
87753f4783SDavid VomLehn #define AQ_HW_FLAG_ERR_UNPLUG  0x40000000U
88753f4783SDavid VomLehn #define AQ_HW_FLAG_ERR_HW      0x80000000U
89753f4783SDavid VomLehn 
90753f4783SDavid VomLehn #define AQ_HW_FLAG_ERRORS      (AQ_HW_FLAG_ERR_HW | AQ_HW_FLAG_ERR_UNPLUG)
91753f4783SDavid VomLehn 
92db550615SIgor Russkikh #define AQ_NIC_FLAGS_IS_NOT_READY (AQ_NIC_FLAG_STOPPING | \
93db550615SIgor Russkikh 			AQ_NIC_FLAG_RESETTING | AQ_NIC_FLAG_CLOSING | \
94db550615SIgor Russkikh 			AQ_NIC_FLAG_ERR_UNPLUG | AQ_NIC_FLAG_ERR_HW)
95db550615SIgor Russkikh 
96db550615SIgor Russkikh #define AQ_NIC_FLAGS_IS_NOT_TX_READY (AQ_NIC_FLAGS_IS_NOT_READY | \
97db550615SIgor Russkikh 					AQ_NIC_LINK_DOWN)
98db550615SIgor Russkikh 
994948293fSIgor Russkikh #define AQ_HW_MEDIA_TYPE_TP    1U
1004948293fSIgor Russkikh #define AQ_HW_MEDIA_TYPE_FIBRE 2U
1014948293fSIgor Russkikh 
102753f4783SDavid VomLehn struct aq_hw_s {
10378f5193dSIgor Russkikh 	atomic_t flags;
104753f4783SDavid VomLehn 	struct aq_nic_cfg_s *aq_nic_cfg;
105*0c58c35fSIgor Russkikh 	const struct aq_fw_ops *aq_fw_ops;
106753f4783SDavid VomLehn 	void __iomem *mmio;
107753f4783SDavid VomLehn 	struct aq_hw_link_status_s aq_link_status;
1081a713f87SIgor Russkikh 	struct hw_aq_atl_utils_mbox mbox;
1091a713f87SIgor Russkikh 	struct hw_atl_stats_s last_stats;
1101a713f87SIgor Russkikh 	struct aq_stats_s curr_stats;
1111a713f87SIgor Russkikh 	u64 speed;
1121a713f87SIgor Russkikh 	u32 itr_tx;
1131a713f87SIgor Russkikh 	u32 itr_rx;
1141a713f87SIgor Russkikh 	unsigned int chip_features;
1151a713f87SIgor Russkikh 	u32 fw_ver_actual;
1161a713f87SIgor Russkikh 	atomic_t dpc;
1171a713f87SIgor Russkikh 	u32 mbox_addr;
1181a713f87SIgor Russkikh 	u32 rpc_addr;
1191a713f87SIgor Russkikh 	u32 rpc_tid;
1201a713f87SIgor Russkikh 	struct hw_aq_atl_utils_fw_rpc rpc;
121753f4783SDavid VomLehn };
122753f4783SDavid VomLehn 
123753f4783SDavid VomLehn struct aq_ring_s;
124753f4783SDavid VomLehn struct aq_ring_param_s;
125753f4783SDavid VomLehn struct sk_buff;
126753f4783SDavid VomLehn 
127753f4783SDavid VomLehn struct aq_hw_ops {
128753f4783SDavid VomLehn 
129753f4783SDavid VomLehn 	int (*hw_ring_tx_xmit)(struct aq_hw_s *self, struct aq_ring_s *aq_ring,
130753f4783SDavid VomLehn 			       unsigned int frags);
131753f4783SDavid VomLehn 
132753f4783SDavid VomLehn 	int (*hw_ring_rx_receive)(struct aq_hw_s *self,
133753f4783SDavid VomLehn 				  struct aq_ring_s *aq_ring);
134753f4783SDavid VomLehn 
135753f4783SDavid VomLehn 	int (*hw_ring_rx_fill)(struct aq_hw_s *self, struct aq_ring_s *aq_ring,
136753f4783SDavid VomLehn 			       unsigned int sw_tail_old);
137753f4783SDavid VomLehn 
138753f4783SDavid VomLehn 	int (*hw_ring_tx_head_update)(struct aq_hw_s *self,
139753f4783SDavid VomLehn 				      struct aq_ring_s *aq_ring);
140753f4783SDavid VomLehn 
141753f4783SDavid VomLehn 	int (*hw_set_mac_address)(struct aq_hw_s *self, u8 *mac_addr);
142753f4783SDavid VomLehn 
143753f4783SDavid VomLehn 	int (*hw_reset)(struct aq_hw_s *self);
144753f4783SDavid VomLehn 
1451a713f87SIgor Russkikh 	int (*hw_init)(struct aq_hw_s *self, u8 *mac_addr);
146753f4783SDavid VomLehn 
147753f4783SDavid VomLehn 	int (*hw_start)(struct aq_hw_s *self);
148753f4783SDavid VomLehn 
149753f4783SDavid VomLehn 	int (*hw_stop)(struct aq_hw_s *self);
150753f4783SDavid VomLehn 
151753f4783SDavid VomLehn 	int (*hw_ring_tx_init)(struct aq_hw_s *self, struct aq_ring_s *aq_ring,
152753f4783SDavid VomLehn 			       struct aq_ring_param_s *aq_ring_param);
153753f4783SDavid VomLehn 
154753f4783SDavid VomLehn 	int (*hw_ring_tx_start)(struct aq_hw_s *self,
155753f4783SDavid VomLehn 				struct aq_ring_s *aq_ring);
156753f4783SDavid VomLehn 
157753f4783SDavid VomLehn 	int (*hw_ring_tx_stop)(struct aq_hw_s *self,
158753f4783SDavid VomLehn 			       struct aq_ring_s *aq_ring);
159753f4783SDavid VomLehn 
160753f4783SDavid VomLehn 	int (*hw_ring_rx_init)(struct aq_hw_s *self,
161753f4783SDavid VomLehn 			       struct aq_ring_s *aq_ring,
162753f4783SDavid VomLehn 			       struct aq_ring_param_s *aq_ring_param);
163753f4783SDavid VomLehn 
164753f4783SDavid VomLehn 	int (*hw_ring_rx_start)(struct aq_hw_s *self,
165753f4783SDavid VomLehn 				struct aq_ring_s *aq_ring);
166753f4783SDavid VomLehn 
167753f4783SDavid VomLehn 	int (*hw_ring_rx_stop)(struct aq_hw_s *self,
168753f4783SDavid VomLehn 			       struct aq_ring_s *aq_ring);
169753f4783SDavid VomLehn 
170753f4783SDavid VomLehn 	int (*hw_irq_enable)(struct aq_hw_s *self, u64 mask);
171753f4783SDavid VomLehn 
172753f4783SDavid VomLehn 	int (*hw_irq_disable)(struct aq_hw_s *self, u64 mask);
173753f4783SDavid VomLehn 
174753f4783SDavid VomLehn 	int (*hw_irq_read)(struct aq_hw_s *self, u64 *mask);
175753f4783SDavid VomLehn 
176753f4783SDavid VomLehn 	int (*hw_packet_filter_set)(struct aq_hw_s *self,
177753f4783SDavid VomLehn 				    unsigned int packet_filter);
178753f4783SDavid VomLehn 
179753f4783SDavid VomLehn 	int (*hw_multicast_list_set)(struct aq_hw_s *self,
180753f4783SDavid VomLehn 				     u8 ar_mac[AQ_CFG_MULTICAST_ADDRESS_MAX]
181753f4783SDavid VomLehn 				     [ETH_ALEN],
182753f4783SDavid VomLehn 				     u32 count);
183753f4783SDavid VomLehn 
184b82ee71aSIgor Russkikh 	int (*hw_interrupt_moderation_set)(struct aq_hw_s *self);
185753f4783SDavid VomLehn 
186753f4783SDavid VomLehn 	int (*hw_rss_set)(struct aq_hw_s *self,
187753f4783SDavid VomLehn 			  struct aq_rss_parameters *rss_params);
188753f4783SDavid VomLehn 
189753f4783SDavid VomLehn 	int (*hw_rss_hash_set)(struct aq_hw_s *self,
190753f4783SDavid VomLehn 			       struct aq_rss_parameters *rss_params);
191753f4783SDavid VomLehn 
192753f4783SDavid VomLehn 	int (*hw_get_regs)(struct aq_hw_s *self,
1934cbc9f92SIgor Russkikh 			   const struct aq_hw_caps_s *aq_hw_caps,
1944cbc9f92SIgor Russkikh 			   u32 *regs_buff);
195753f4783SDavid VomLehn 
196be08d839SIgor Russkikh 	struct aq_stats_s *(*hw_get_hw_stats)(struct aq_hw_s *self);
197753f4783SDavid VomLehn 
198753f4783SDavid VomLehn 	int (*hw_get_fw_version)(struct aq_hw_s *self, u32 *fw_version);
199753f4783SDavid VomLehn 
200753f4783SDavid VomLehn 	int (*hw_deinit)(struct aq_hw_s *self);
201753f4783SDavid VomLehn 
202753f4783SDavid VomLehn 	int (*hw_set_power)(struct aq_hw_s *self, unsigned int power_state);
203753f4783SDavid VomLehn };
204753f4783SDavid VomLehn 
205*0c58c35fSIgor Russkikh struct aq_fw_ops {
206*0c58c35fSIgor Russkikh 	int (*init)(struct aq_hw_s *self);
207*0c58c35fSIgor Russkikh 
208*0c58c35fSIgor Russkikh 	int (*reset)(struct aq_hw_s *self);
209*0c58c35fSIgor Russkikh 
210*0c58c35fSIgor Russkikh 	int (*get_mac_permanent)(struct aq_hw_s *self, u8 *mac);
211*0c58c35fSIgor Russkikh 
212*0c58c35fSIgor Russkikh 	int (*set_link_speed)(struct aq_hw_s *self, u32 speed);
213*0c58c35fSIgor Russkikh 
214*0c58c35fSIgor Russkikh 	int (*set_state)(struct aq_hw_s *self, enum hal_atl_utils_fw_state_e state);
215*0c58c35fSIgor Russkikh 
216*0c58c35fSIgor Russkikh 	int (*update_link_status)(struct aq_hw_s *self);
217*0c58c35fSIgor Russkikh 
218*0c58c35fSIgor Russkikh 	int (*update_stats)(struct aq_hw_s *self);
219*0c58c35fSIgor Russkikh };
220*0c58c35fSIgor Russkikh 
221753f4783SDavid VomLehn #endif /* AQ_HW_H */
222