]>
Commit | Line | Data |
---|---|---|
ef57c40f JS |
1 | // SPDX-License-Identifier: GPL-2.0+ |
2 | // Copyright (c) 2016-2017 Hisilicon Limited. | |
38caee9d S |
3 | |
4 | #ifndef __HNAE3_H | |
5 | #define __HNAE3_H | |
6 | ||
7 | /* Names used in this framework: | |
8 | * ae handle (handle): | |
9 | * a set of queues provided by AE | |
10 | * ring buffer queue (rbq): | |
11 | * the channel between upper layer and the AE, can do tx and rx | |
12 | * ring: | |
13 | * a tx or rx channel within a rbq | |
14 | * ring description (desc): | |
15 | * an element in the ring with packet information | |
16 | * buffer: | |
17 | * a memory region referred by desc with the full packet payload | |
18 | * | |
19 | * "num" means a static number set as a parameter, "count" mean a dynamic | |
20 | * number set while running | |
21 | * "cb" means control block | |
22 | */ | |
23 | ||
24 | #include <linux/acpi.h> | |
cacde272 | 25 | #include <linux/dcbnl.h> |
38caee9d S |
26 | #include <linux/delay.h> |
27 | #include <linux/device.h> | |
28 | #include <linux/module.h> | |
29 | #include <linux/netdevice.h> | |
30 | #include <linux/pci.h> | |
31 | #include <linux/types.h> | |
32 | ||
4786ad87 XW |
33 | #define HNAE3_MOD_VERSION "1.0" |
34 | ||
38caee9d S |
35 | /* Device IDs */ |
36 | #define HNAE3_DEV_ID_GE 0xA220 | |
37 | #define HNAE3_DEV_ID_25GE 0xA221 | |
38 | #define HNAE3_DEV_ID_25GE_RDMA 0xA222 | |
39 | #define HNAE3_DEV_ID_25GE_RDMA_MACSEC 0xA223 | |
40 | #define HNAE3_DEV_ID_50GE_RDMA 0xA224 | |
41 | #define HNAE3_DEV_ID_50GE_RDMA_MACSEC 0xA225 | |
42 | #define HNAE3_DEV_ID_100G_RDMA_MACSEC 0xA226 | |
43 | #define HNAE3_DEV_ID_100G_VF 0xA22E | |
44 | #define HNAE3_DEV_ID_100G_RDMA_DCB_PFC_VF 0xA22F | |
45 | ||
46 | #define HNAE3_CLASS_NAME_SIZE 16 | |
47 | ||
48 | #define HNAE3_DEV_INITED_B 0x0 | |
e92a0843 | 49 | #define HNAE3_DEV_SUPPORT_ROCE_B 0x1 |
2daf4a65 | 50 | #define HNAE3_DEV_SUPPORT_DCB_B 0x2 |
b46e2efa PL |
51 | #define HNAE3_KNIC_CLIENT_INITED_B 0x3 |
52 | #define HNAE3_UNIC_CLIENT_INITED_B 0x4 | |
53 | #define HNAE3_ROCE_CLIENT_INITED_B 0x5 | |
10a954bc | 54 | #define HNAE3_DEV_SUPPORT_FD_B 0x6 |
73f88b00 | 55 | #define HNAE3_DEV_SUPPORT_GRO_B 0x7 |
2daf4a65 YL |
56 | |
57 | #define HNAE3_DEV_SUPPORT_ROCE_DCB_BITS (BIT(HNAE3_DEV_SUPPORT_DCB_B) |\ | |
58 | BIT(HNAE3_DEV_SUPPORT_ROCE_B)) | |
e92a0843 YL |
59 | |
60 | #define hnae3_dev_roce_supported(hdev) \ | |
ccc23ef3 | 61 | hnae3_get_bit(hdev->ae_dev->flag, HNAE3_DEV_SUPPORT_ROCE_B) |
38caee9d | 62 | |
2daf4a65 | 63 | #define hnae3_dev_dcb_supported(hdev) \ |
ccc23ef3 | 64 | hnae3_get_bit(hdev->ae_dev->flag, HNAE3_DEV_SUPPORT_DCB_B) |
2daf4a65 | 65 | |
10a954bc JS |
66 | #define hnae3_dev_fd_supported(hdev) \ |
67 | hnae3_get_bit((hdev)->ae_dev->flag, HNAE3_DEV_SUPPORT_FD_B) | |
68 | ||
73f88b00 PL |
69 | #define hnae3_dev_gro_supported(hdev) \ |
70 | hnae3_get_bit((hdev)->ae_dev->flag, HNAE3_DEV_SUPPORT_GRO_B) | |
71 | ||
38caee9d S |
72 | #define ring_ptr_move_fw(ring, p) \ |
73 | ((ring)->p = ((ring)->p + 1) % (ring)->desc_num) | |
74 | #define ring_ptr_move_bw(ring, p) \ | |
75 | ((ring)->p = ((ring)->p - 1 + (ring)->desc_num) % (ring)->desc_num) | |
76 | ||
77 | enum hns_desc_type { | |
78 | DESC_TYPE_SKB, | |
79 | DESC_TYPE_PAGE, | |
80 | }; | |
81 | ||
82 | struct hnae3_handle; | |
83 | ||
84 | struct hnae3_queue { | |
85 | void __iomem *io_base; | |
86 | struct hnae3_ae_algo *ae_algo; | |
87 | struct hnae3_handle *handle; | |
88 | int tqp_index; /* index in a handle */ | |
89 | u32 buf_size; /* size for hnae_desc->addr, preset by AE */ | |
90 | u16 desc_num; /* total number of desc */ | |
91 | }; | |
92 | ||
93 | /*hnae3 loop mode*/ | |
94 | enum hnae3_loop { | |
67b8c316 | 95 | HNAE3_LOOP_APP, |
86957272 FL |
96 | HNAE3_LOOP_SERIAL_SERDES, |
97 | HNAE3_LOOP_PARALLEL_SERDES, | |
e05cfaaf FL |
98 | HNAE3_LOOP_PHY, |
99 | HNAE3_LOOP_NONE, | |
38caee9d S |
100 | }; |
101 | ||
102 | enum hnae3_client_type { | |
103 | HNAE3_CLIENT_KNIC, | |
104 | HNAE3_CLIENT_UNIC, | |
105 | HNAE3_CLIENT_ROCE, | |
106 | }; | |
107 | ||
108 | enum hnae3_dev_type { | |
109 | HNAE3_DEV_KNIC, | |
110 | HNAE3_DEV_UNIC, | |
111 | }; | |
112 | ||
113 | /* mac media type */ | |
114 | enum hnae3_media_type { | |
115 | HNAE3_MEDIA_TYPE_UNKNOWN, | |
116 | HNAE3_MEDIA_TYPE_FIBER, | |
117 | HNAE3_MEDIA_TYPE_COPPER, | |
118 | HNAE3_MEDIA_TYPE_BACKPLANE, | |
b31482c6 | 119 | HNAE3_MEDIA_TYPE_NONE, |
38caee9d S |
120 | }; |
121 | ||
4ed340ab L |
122 | enum hnae3_reset_notify_type { |
123 | HNAE3_UP_CLIENT, | |
124 | HNAE3_DOWN_CLIENT, | |
125 | HNAE3_INIT_CLIENT, | |
126 | HNAE3_UNINIT_CLIENT, | |
127 | }; | |
128 | ||
129 | enum hnae3_reset_type { | |
4aef908d | 130 | HNAE3_VF_RESET, |
1343c2f2 | 131 | HNAE3_VF_FUNC_RESET, |
7885e906 | 132 | HNAE3_VF_PF_FUNC_RESET, |
bb2edc2e | 133 | HNAE3_VF_FULL_RESET, |
26977990 | 134 | HNAE3_FLR_RESET, |
4ed340ab L |
135 | HNAE3_FUNC_RESET, |
136 | HNAE3_CORE_RESET, | |
137 | HNAE3_GLOBAL_RESET, | |
138 | HNAE3_IMP_RESET, | |
00029070 | 139 | HNAE3_UNKNOWN_RESET, |
4ed340ab L |
140 | HNAE3_NONE_RESET, |
141 | }; | |
142 | ||
26977990 HT |
143 | enum hnae3_flr_state { |
144 | HNAE3_FLR_DOWN, | |
145 | HNAE3_FLR_DONE, | |
146 | }; | |
147 | ||
38caee9d S |
148 | struct hnae3_vector_info { |
149 | u8 __iomem *io_addr; | |
150 | int vector; | |
151 | }; | |
152 | ||
153 | #define HNAE3_RING_TYPE_B 0 | |
154 | #define HNAE3_RING_TYPE_TX 0 | |
155 | #define HNAE3_RING_TYPE_RX 1 | |
f230c6c5 FL |
156 | #define HNAE3_RING_GL_IDX_S 0 |
157 | #define HNAE3_RING_GL_IDX_M GENMASK(1, 0) | |
158 | #define HNAE3_RING_GL_RX 0 | |
159 | #define HNAE3_RING_GL_TX 1 | |
38caee9d S |
160 | |
161 | struct hnae3_ring_chain_node { | |
162 | struct hnae3_ring_chain_node *next; | |
163 | u32 tqp_index; | |
164 | u32 flag; | |
f230c6c5 | 165 | u32 int_gl_idx; |
38caee9d S |
166 | }; |
167 | ||
168 | #define HNAE3_IS_TX_RING(node) \ | |
169 | (((node)->flag & (1 << HNAE3_RING_TYPE_B)) == HNAE3_RING_TYPE_TX) | |
170 | ||
171 | struct hnae3_client_ops { | |
172 | int (*init_instance)(struct hnae3_handle *handle); | |
173 | void (*uninit_instance)(struct hnae3_handle *handle, bool reset); | |
174 | void (*link_status_change)(struct hnae3_handle *handle, bool state); | |
cacde272 | 175 | int (*setup_tc)(struct hnae3_handle *handle, u8 tc); |
4ed340ab L |
176 | int (*reset_notify)(struct hnae3_handle *handle, |
177 | enum hnae3_reset_notify_type type); | |
225c02eb | 178 | enum hnae3_reset_type (*process_hw_error)(struct hnae3_handle *handle); |
38caee9d S |
179 | }; |
180 | ||
181 | #define HNAE3_CLIENT_NAME_LENGTH 16 | |
182 | struct hnae3_client { | |
183 | char name[HNAE3_CLIENT_NAME_LENGTH]; | |
38caee9d S |
184 | unsigned long state; |
185 | enum hnae3_client_type type; | |
186 | const struct hnae3_client_ops *ops; | |
187 | struct list_head node; | |
188 | }; | |
189 | ||
190 | struct hnae3_ae_dev { | |
191 | struct pci_dev *pdev; | |
192 | const struct hnae3_ae_ops *ops; | |
193 | struct list_head node; | |
194 | u32 flag; | |
195 | enum hnae3_dev_type dev_type; | |
7ce98982 | 196 | enum hnae3_reset_type reset_type; |
38caee9d S |
197 | void *priv; |
198 | }; | |
199 | ||
200 | /* This struct defines the operation on the handle. | |
201 | * | |
202 | * init_ae_dev(): (mandatory) | |
203 | * Get PF configure from pci_dev and initialize PF hardware | |
204 | * uninit_ae_dev() | |
205 | * Disable PF device and release PF resource | |
206 | * register_client | |
207 | * Register client to ae_dev | |
208 | * unregister_client() | |
209 | * Unregister client from ae_dev | |
210 | * start() | |
211 | * Enable the hardware | |
212 | * stop() | |
213 | * Disable the hardware | |
337460de YL |
214 | * start_client() |
215 | * Inform the hclge that client has been started | |
216 | * stop_client() | |
217 | * Inform the hclge that client has been stopped | |
38caee9d S |
218 | * get_status() |
219 | * Get the carrier state of the back channel of the handle, 1 for ok, 0 for | |
220 | * non-ok | |
221 | * get_ksettings_an_result() | |
222 | * Get negotiation status,speed and duplex | |
223 | * update_speed_duplex_h() | |
224 | * Update hardware speed and duplex | |
225 | * get_media_type() | |
226 | * Get media type of MAC | |
227 | * adjust_link() | |
228 | * Adjust link status | |
229 | * set_loopback() | |
230 | * Set loopback | |
231 | * set_promisc_mode | |
232 | * Set promisc mode | |
233 | * set_mtu() | |
234 | * set mtu | |
235 | * get_pauseparam() | |
236 | * get tx and rx of pause frame use | |
237 | * set_pauseparam() | |
238 | * set tx and rx of pause frame use | |
239 | * set_autoneg() | |
240 | * set auto autonegotiation of pause frame use | |
241 | * get_autoneg() | |
242 | * get auto autonegotiation of pause frame use | |
243 | * get_coalesce_usecs() | |
244 | * get usecs to delay a TX interrupt after a packet is sent | |
245 | * get_rx_max_coalesced_frames() | |
246 | * get Maximum number of packets to be sent before a TX interrupt. | |
247 | * set_coalesce_usecs() | |
248 | * set usecs to delay a TX interrupt after a packet is sent | |
249 | * set_coalesce_frames() | |
250 | * set Maximum number of packets to be sent before a TX interrupt. | |
251 | * get_mac_addr() | |
252 | * get mac address | |
253 | * set_mac_addr() | |
254 | * set mac address | |
255 | * add_uc_addr | |
256 | * Add unicast addr to mac table | |
257 | * rm_uc_addr | |
258 | * Remove unicast addr from mac table | |
259 | * set_mc_addr() | |
260 | * Set multicast address | |
261 | * add_mc_addr | |
262 | * Add multicast address to mac table | |
263 | * rm_mc_addr | |
264 | * Remove multicast address from mac table | |
265 | * update_stats() | |
266 | * Update Old network device statistics | |
267 | * get_ethtool_stats() | |
268 | * Get ethtool network device statistics | |
269 | * get_strings() | |
270 | * Get a set of strings that describe the requested objects | |
271 | * get_sset_count() | |
272 | * Get number of strings that @get_strings will write | |
273 | * update_led_status() | |
274 | * Update the led status | |
275 | * set_led_id() | |
276 | * Set led id | |
277 | * get_regs() | |
278 | * Get regs dump | |
279 | * get_regs_len() | |
280 | * Get the len of the regs dump | |
281 | * get_rss_key_size() | |
282 | * Get rss key size | |
283 | * get_rss_indir_size() | |
284 | * Get rss indirection table size | |
285 | * get_rss() | |
286 | * Get rss table | |
287 | * set_rss() | |
288 | * Set rss table | |
289 | * get_tc_size() | |
290 | * Get tc size of handle | |
291 | * get_vector() | |
292 | * Get vector number and vector information | |
7412200c YL |
293 | * put_vector() |
294 | * Put the vector in hdev | |
38caee9d S |
295 | * map_ring_to_vector() |
296 | * Map rings to vector | |
297 | * unmap_ring_from_vector() | |
298 | * Unmap rings from vector | |
38caee9d S |
299 | * reset_queue() |
300 | * Reset queue | |
301 | * get_fw_version() | |
302 | * Get firmware version | |
303 | * get_mdix_mode() | |
304 | * Get media typr of phy | |
d818396d JS |
305 | * enable_vlan_filter() |
306 | * Enable vlan filter | |
38caee9d S |
307 | * set_vlan_filter() |
308 | * Set vlan filter config of Ports | |
309 | * set_vf_vlan_filter() | |
310 | * Set vlan filter config of vf | |
5f9a7732 PL |
311 | * enable_hw_strip_rxvtag() |
312 | * Enable/disable hardware strip vlan tag of packets received | |
38caee9d S |
313 | */ |
314 | struct hnae3_ae_ops { | |
315 | int (*init_ae_dev)(struct hnae3_ae_dev *ae_dev); | |
316 | void (*uninit_ae_dev)(struct hnae3_ae_dev *ae_dev); | |
26977990 HT |
317 | void (*flr_prepare)(struct hnae3_ae_dev *ae_dev); |
318 | void (*flr_done)(struct hnae3_ae_dev *ae_dev); | |
38caee9d S |
319 | int (*init_client_instance)(struct hnae3_client *client, |
320 | struct hnae3_ae_dev *ae_dev); | |
321 | void (*uninit_client_instance)(struct hnae3_client *client, | |
322 | struct hnae3_ae_dev *ae_dev); | |
323 | int (*start)(struct hnae3_handle *handle); | |
324 | void (*stop)(struct hnae3_handle *handle); | |
337460de YL |
325 | int (*client_start)(struct hnae3_handle *handle); |
326 | void (*client_stop)(struct hnae3_handle *handle); | |
38caee9d S |
327 | int (*get_status)(struct hnae3_handle *handle); |
328 | void (*get_ksettings_an_result)(struct hnae3_handle *handle, | |
329 | u8 *auto_neg, u32 *speed, u8 *duplex); | |
330 | ||
331 | int (*update_speed_duplex_h)(struct hnae3_handle *handle); | |
332 | int (*cfg_mac_speed_dup_h)(struct hnae3_handle *handle, int speed, | |
333 | u8 duplex); | |
334 | ||
335 | void (*get_media_type)(struct hnae3_handle *handle, u8 *media_type); | |
336 | void (*adjust_link)(struct hnae3_handle *handle, int speed, int duplex); | |
337 | int (*set_loopback)(struct hnae3_handle *handle, | |
338 | enum hnae3_loop loop_mode, bool en); | |
339 | ||
abe62a63 HT |
340 | int (*set_promisc_mode)(struct hnae3_handle *handle, bool en_uc_pmc, |
341 | bool en_mc_pmc); | |
38caee9d S |
342 | int (*set_mtu)(struct hnae3_handle *handle, int new_mtu); |
343 | ||
344 | void (*get_pauseparam)(struct hnae3_handle *handle, | |
345 | u32 *auto_neg, u32 *rx_en, u32 *tx_en); | |
346 | int (*set_pauseparam)(struct hnae3_handle *handle, | |
347 | u32 auto_neg, u32 rx_en, u32 tx_en); | |
348 | ||
349 | int (*set_autoneg)(struct hnae3_handle *handle, bool enable); | |
350 | int (*get_autoneg)(struct hnae3_handle *handle); | |
351 | ||
352 | void (*get_coalesce_usecs)(struct hnae3_handle *handle, | |
353 | u32 *tx_usecs, u32 *rx_usecs); | |
354 | void (*get_rx_max_coalesced_frames)(struct hnae3_handle *handle, | |
355 | u32 *tx_frames, u32 *rx_frames); | |
356 | int (*set_coalesce_usecs)(struct hnae3_handle *handle, u32 timeout); | |
357 | int (*set_coalesce_frames)(struct hnae3_handle *handle, | |
358 | u32 coalesce_frames); | |
359 | void (*get_coalesce_range)(struct hnae3_handle *handle, | |
360 | u32 *tx_frames_low, u32 *rx_frames_low, | |
361 | u32 *tx_frames_high, u32 *rx_frames_high, | |
362 | u32 *tx_usecs_low, u32 *rx_usecs_low, | |
363 | u32 *tx_usecs_high, u32 *rx_usecs_high); | |
364 | ||
365 | void (*get_mac_addr)(struct hnae3_handle *handle, u8 *p); | |
3cbf5e2d FL |
366 | int (*set_mac_addr)(struct hnae3_handle *handle, void *p, |
367 | bool is_first); | |
a185d723 XW |
368 | int (*do_ioctl)(struct hnae3_handle *handle, |
369 | struct ifreq *ifr, int cmd); | |
38caee9d S |
370 | int (*add_uc_addr)(struct hnae3_handle *handle, |
371 | const unsigned char *addr); | |
372 | int (*rm_uc_addr)(struct hnae3_handle *handle, | |
373 | const unsigned char *addr); | |
374 | int (*set_mc_addr)(struct hnae3_handle *handle, void *addr); | |
375 | int (*add_mc_addr)(struct hnae3_handle *handle, | |
376 | const unsigned char *addr); | |
377 | int (*rm_mc_addr)(struct hnae3_handle *handle, | |
378 | const unsigned char *addr); | |
38caee9d S |
379 | void (*set_tso_stats)(struct hnae3_handle *handle, int enable); |
380 | void (*update_stats)(struct hnae3_handle *handle, | |
381 | struct net_device_stats *net_stats); | |
382 | void (*get_stats)(struct hnae3_handle *handle, u64 *data); | |
383 | ||
384 | void (*get_strings)(struct hnae3_handle *handle, | |
385 | u32 stringset, u8 *data); | |
386 | int (*get_sset_count)(struct hnae3_handle *handle, int stringset); | |
387 | ||
db2a3e43 FL |
388 | void (*get_regs)(struct hnae3_handle *handle, u32 *version, |
389 | void *data); | |
38caee9d S |
390 | int (*get_regs_len)(struct hnae3_handle *handle); |
391 | ||
392 | u32 (*get_rss_key_size)(struct hnae3_handle *handle); | |
393 | u32 (*get_rss_indir_size)(struct hnae3_handle *handle); | |
394 | int (*get_rss)(struct hnae3_handle *handle, u32 *indir, u8 *key, | |
395 | u8 *hfunc); | |
396 | int (*set_rss)(struct hnae3_handle *handle, const u32 *indir, | |
397 | const u8 *key, const u8 hfunc); | |
f7db940a L |
398 | int (*set_rss_tuple)(struct hnae3_handle *handle, |
399 | struct ethtool_rxnfc *cmd); | |
07d29954 L |
400 | int (*get_rss_tuple)(struct hnae3_handle *handle, |
401 | struct ethtool_rxnfc *cmd); | |
38caee9d S |
402 | |
403 | int (*get_tc_size)(struct hnae3_handle *handle); | |
404 | ||
405 | int (*get_vector)(struct hnae3_handle *handle, u16 vector_num, | |
406 | struct hnae3_vector_info *vector_info); | |
7412200c | 407 | int (*put_vector)(struct hnae3_handle *handle, int vector_num); |
38caee9d S |
408 | int (*map_ring_to_vector)(struct hnae3_handle *handle, |
409 | int vector_num, | |
410 | struct hnae3_ring_chain_node *vr_chain); | |
411 | int (*unmap_ring_from_vector)(struct hnae3_handle *handle, | |
412 | int vector_num, | |
413 | struct hnae3_ring_chain_node *vr_chain); | |
414 | ||
abe62a63 | 415 | int (*reset_queue)(struct hnae3_handle *handle, u16 queue_id); |
38caee9d S |
416 | u32 (*get_fw_version)(struct hnae3_handle *handle); |
417 | void (*get_mdix_mode)(struct hnae3_handle *handle, | |
418 | u8 *tp_mdix_ctrl, u8 *tp_mdix); | |
419 | ||
d818396d | 420 | void (*enable_vlan_filter)(struct hnae3_handle *handle, bool enable); |
38caee9d S |
421 | int (*set_vlan_filter)(struct hnae3_handle *handle, __be16 proto, |
422 | u16 vlan_id, bool is_kill); | |
423 | int (*set_vf_vlan_filter)(struct hnae3_handle *handle, int vfid, | |
424 | u16 vlan, u8 qos, __be16 proto); | |
5f9a7732 | 425 | int (*enable_hw_strip_rxvtag)(struct hnae3_handle *handle, bool enable); |
538d8ba0 | 426 | void (*reset_event)(struct pci_dev *pdev, struct hnae3_handle *handle); |
2c883d73 HT |
427 | void (*set_default_reset_request)(struct hnae3_ae_dev *ae_dev, |
428 | enum hnae3_reset_type rst_type); | |
4f645a90 PL |
429 | void (*get_channels)(struct hnae3_handle *handle, |
430 | struct ethtool_channels *ch); | |
f1f779ce | 431 | void (*get_tqps_and_rss_info)(struct hnae3_handle *h, |
08ca3d58 | 432 | u16 *alloc_tqps, u16 *max_rss_size); |
f1f779ce | 433 | int (*set_channels)(struct hnae3_handle *handle, u32 new_tqps_num); |
a2cfbadb PL |
434 | void (*get_flowctrl_adv)(struct hnae3_handle *handle, |
435 | u32 *flowctrl_adv); | |
d9a0884e JS |
436 | int (*set_led_id)(struct hnae3_handle *handle, |
437 | enum ethtool_phys_id_state status); | |
d92ceae9 FL |
438 | void (*get_link_mode)(struct hnae3_handle *handle, |
439 | unsigned long *supported, | |
440 | unsigned long *advertising); | |
3ca8e27c JS |
441 | int (*add_fd_entry)(struct hnae3_handle *handle, |
442 | struct ethtool_rxnfc *cmd); | |
443 | int (*del_fd_entry)(struct hnae3_handle *handle, | |
444 | struct ethtool_rxnfc *cmd); | |
7ce98982 JS |
445 | void (*del_all_fd_entries)(struct hnae3_handle *handle, |
446 | bool clear_list); | |
295043a7 JS |
447 | int (*get_fd_rule_cnt)(struct hnae3_handle *handle, |
448 | struct ethtool_rxnfc *cmd); | |
449 | int (*get_fd_rule_info)(struct hnae3_handle *handle, | |
450 | struct ethtool_rxnfc *cmd); | |
451 | int (*get_fd_all_rules)(struct hnae3_handle *handle, | |
452 | struct ethtool_rxnfc *cmd, u32 *rule_locs); | |
7ce98982 | 453 | int (*restore_fd_rules)(struct hnae3_handle *handle); |
d1f04a80 | 454 | void (*enable_fd)(struct hnae3_handle *handle, bool enable); |
bf4fd28d | 455 | int (*dbg_run_cmd)(struct hnae3_handle *handle, char *cmd_buf); |
af72a21f | 456 | pci_ers_result_t (*handle_hw_ras_error)(struct hnae3_ae_dev *ae_dev); |
225c02eb HT |
457 | bool (*get_hw_reset_stat)(struct hnae3_handle *handle); |
458 | bool (*ae_dev_resetting)(struct hnae3_handle *handle); | |
459 | unsigned long (*ae_dev_reset_cnt)(struct hnae3_handle *handle); | |
89d6386f | 460 | u16 (*get_global_queue_id)(struct hnae3_handle *handle, u16 queue_id); |
fad0e9d8 | 461 | void (*set_timer_task)(struct hnae3_handle *handle, bool enable); |
38caee9d S |
462 | }; |
463 | ||
cacde272 YL |
464 | struct hnae3_dcb_ops { |
465 | /* IEEE 802.1Qaz std */ | |
466 | int (*ieee_getets)(struct hnae3_handle *, struct ieee_ets *); | |
467 | int (*ieee_setets)(struct hnae3_handle *, struct ieee_ets *); | |
468 | int (*ieee_getpfc)(struct hnae3_handle *, struct ieee_pfc *); | |
469 | int (*ieee_setpfc)(struct hnae3_handle *, struct ieee_pfc *); | |
470 | ||
471 | /* DCBX configuration */ | |
472 | u8 (*getdcbx)(struct hnae3_handle *); | |
473 | u8 (*setdcbx)(struct hnae3_handle *, u8); | |
474 | ||
475 | int (*map_update)(struct hnae3_handle *); | |
30d240df | 476 | int (*setup_tc)(struct hnae3_handle *, u8, u8 *); |
cacde272 YL |
477 | }; |
478 | ||
38caee9d S |
479 | struct hnae3_ae_algo { |
480 | const struct hnae3_ae_ops *ops; | |
481 | struct list_head node; | |
38caee9d S |
482 | const struct pci_device_id *pdev_id_table; |
483 | }; | |
484 | ||
485 | #define HNAE3_INT_NAME_LEN (IFNAMSIZ + 16) | |
486 | #define HNAE3_ITR_COUNTDOWN_START 100 | |
487 | ||
488 | struct hnae3_tc_info { | |
489 | u16 tqp_offset; /* TQP offset from base TQP */ | |
490 | u16 tqp_count; /* Total TQPs */ | |
38caee9d S |
491 | u8 tc; /* TC index */ |
492 | bool enable; /* If this TC is enable or not */ | |
493 | }; | |
494 | ||
495 | #define HNAE3_MAX_TC 8 | |
c5795c53 | 496 | #define HNAE3_MAX_USER_PRIO 8 |
38caee9d S |
497 | struct hnae3_knic_private_info { |
498 | struct net_device *netdev; /* Set by KNIC client when init instance */ | |
499 | u16 rss_size; /* Allocated RSS queues */ | |
500 | u16 rx_buf_len; | |
501 | u16 num_desc; | |
502 | ||
503 | u8 num_tc; /* Total number of enabled TCs */ | |
c5795c53 | 504 | u8 prio_tc[HNAE3_MAX_USER_PRIO]; /* TC indexed by prio */ |
38caee9d S |
505 | struct hnae3_tc_info tc_info[HNAE3_MAX_TC]; /* Idx of array is HW TC */ |
506 | ||
507 | u16 num_tqps; /* total number of TQPs in this handle */ | |
508 | struct hnae3_queue **tqp; /* array base of all TQPs in this instance */ | |
cacde272 | 509 | const struct hnae3_dcb_ops *dcb_ops; |
5b08994a FL |
510 | |
511 | u16 int_rl_setting; | |
8e4c877d | 512 | enum pkt_hash_types rss_type; |
38caee9d S |
513 | }; |
514 | ||
515 | struct hnae3_roce_private_info { | |
516 | struct net_device *netdev; | |
517 | void __iomem *roce_io_base; | |
518 | int base_vector; | |
519 | int num_vectors; | |
225c02eb HT |
520 | |
521 | /* The below attributes defined for RoCE client, hnae3 gives | |
522 | * initial values to them, and RoCE client can modify and use | |
523 | * them. | |
524 | */ | |
525 | unsigned long reset_state; | |
526 | unsigned long instance_state; | |
527 | unsigned long state; | |
38caee9d S |
528 | }; |
529 | ||
530 | struct hnae3_unic_private_info { | |
531 | struct net_device *netdev; | |
532 | u16 rx_buf_len; | |
533 | u16 num_desc; | |
534 | u16 num_tqps; /* total number of tqps in this handle */ | |
535 | struct hnae3_queue **tqp; /* array base of all TQPs of this instance */ | |
536 | }; | |
537 | ||
67b8c316 | 538 | #define HNAE3_SUPPORT_APP_LOOPBACK BIT(0) |
a9c89a3f | 539 | #define HNAE3_SUPPORT_PHY_LOOPBACK BIT(1) |
86957272 | 540 | #define HNAE3_SUPPORT_SERDES_SERIAL_LOOPBACK BIT(2) |
a9c89a3f | 541 | #define HNAE3_SUPPORT_VF BIT(3) |
86957272 | 542 | #define HNAE3_SUPPORT_SERDES_PARALLEL_LOOPBACK BIT(4) |
38caee9d | 543 | |
1e3653db JS |
544 | #define HNAE3_USER_UPE BIT(0) /* unicast promisc enabled by user */ |
545 | #define HNAE3_USER_MPE BIT(1) /* mulitcast promisc enabled by user */ | |
546 | #define HNAE3_BPE BIT(2) /* broadcast promisc enable */ | |
547 | #define HNAE3_OVERFLOW_UPE BIT(3) /* unicast mac vlan overflow */ | |
548 | #define HNAE3_OVERFLOW_MPE BIT(4) /* multicast mac vlan overflow */ | |
549 | #define HNAE3_VLAN_FLTR BIT(5) /* enable vlan filter */ | |
550 | #define HNAE3_UPE (HNAE3_USER_UPE | HNAE3_OVERFLOW_UPE) | |
551 | #define HNAE3_MPE (HNAE3_USER_MPE | HNAE3_OVERFLOW_MPE) | |
552 | ||
38caee9d S |
553 | struct hnae3_handle { |
554 | struct hnae3_client *client; | |
555 | struct pci_dev *pdev; | |
556 | void *priv; | |
557 | struct hnae3_ae_algo *ae_algo; /* the class who provides this handle */ | |
558 | u64 flags; /* Indicate the capabilities for this handle*/ | |
559 | ||
560 | union { | |
561 | struct net_device *netdev; /* first member */ | |
562 | struct hnae3_knic_private_info kinfo; | |
563 | struct hnae3_unic_private_info uinfo; | |
564 | struct hnae3_roce_private_info rinfo; | |
565 | }; | |
566 | ||
567 | u32 numa_node_mask; /* for multi-chip support */ | |
1e3653db JS |
568 | |
569 | u8 netdev_flags; | |
a9556d8c | 570 | struct dentry *hnae3_dbgfs; |
38caee9d S |
571 | }; |
572 | ||
ccc23ef3 | 573 | #define hnae3_set_field(origin, mask, shift, val) \ |
38caee9d S |
574 | do { \ |
575 | (origin) &= (~(mask)); \ | |
576 | (origin) |= ((val) << (shift)) & (mask); \ | |
577 | } while (0) | |
ccc23ef3 | 578 | #define hnae3_get_field(origin, mask, shift) (((origin) & (mask)) >> (shift)) |
38caee9d | 579 | |
ccc23ef3 PL |
580 | #define hnae3_set_bit(origin, shift, val) \ |
581 | hnae3_set_field((origin), (0x1 << (shift)), (shift), (val)) | |
582 | #define hnae3_get_bit(origin, shift) \ | |
583 | hnae3_get_field((origin), (0x1 << (shift)), (shift)) | |
38caee9d | 584 | |
17901db4 | 585 | int hnae3_register_ae_dev(struct hnae3_ae_dev *ae_dev); |
38caee9d S |
586 | void hnae3_unregister_ae_dev(struct hnae3_ae_dev *ae_dev); |
587 | ||
588 | void hnae3_unregister_ae_algo(struct hnae3_ae_algo *ae_algo); | |
a4d090cc | 589 | void hnae3_register_ae_algo(struct hnae3_ae_algo *ae_algo); |
38caee9d S |
590 | |
591 | void hnae3_unregister_client(struct hnae3_client *client); | |
592 | int hnae3_register_client(struct hnae3_client *client); | |
8ed41eeb JS |
593 | |
594 | void hnae3_set_client_init_flag(struct hnae3_client *client, | |
595 | struct hnae3_ae_dev *ae_dev, int inited); | |
38caee9d | 596 | #endif |