Commit | Line | Data |
---|---|---|
6fe6611f | 1 | /* |
2 | * Copyright (c) 2014-2015 Hisilicon Limited. | |
3 | * | |
4 | * This program is free software; you can redistribute it and/or modify | |
5 | * it under the terms of the GNU General Public License as published by | |
6 | * the Free Software Foundation; either version 2 of the License, or | |
7 | * (at your option) any later version. | |
8 | */ | |
9 | ||
10 | #ifndef __HNAE_H | |
11 | #define __HNAE_H | |
12 | ||
13 | /* Names used in this framework: | |
14 | * ae handle (handle): | |
15 | * a set of queues provided by AE | |
16 | * ring buffer queue (rbq): | |
17 | * the channel between upper layer and the AE, can do tx and rx | |
18 | * ring: | |
19 | * a tx or rx channel within a rbq | |
20 | * ring description (desc): | |
21 | * an element in the ring with packet information | |
22 | * buffer: | |
23 | * a memory region referred by desc with the full packet payload | |
24 | * | |
25 | * "num" means a static number set as a parameter, "count" mean a dynamic | |
26 | * number set while running | |
27 | * "cb" means control block | |
28 | */ | |
29 | ||
652d39b0 | 30 | #include <linux/acpi.h> |
6fe6611f | 31 | #include <linux/delay.h> |
32 | #include <linux/device.h> | |
33 | #include <linux/module.h> | |
34 | #include <linux/netdevice.h> | |
35 | #include <linux/notifier.h> | |
99dcc7df | 36 | #include <linux/phy.h> |
6fe6611f | 37 | #include <linux/types.h> |
38 | ||
13ac695e | 39 | #define HNAE_DRIVER_VERSION "2.0" |
6fe6611f | 40 | #define HNAE_DRIVER_NAME "hns" |
41 | #define HNAE_COPYRIGHT "Copyright(c) 2015 Huawei Corporation." | |
42 | #define HNAE_DRIVER_STRING "Hisilicon Network Subsystem Driver" | |
43 | #define HNAE_DEFAULT_DEVICE_DESCR "Hisilicon Network Subsystem" | |
44 | ||
45 | #ifdef DEBUG | |
46 | ||
47 | #ifndef assert | |
48 | #define assert(expr) \ | |
49 | do { \ | |
50 | if (!(expr)) { \ | |
51 | pr_err("Assertion failed! %s, %s, %s, line %d\n", \ | |
52 | #expr, __FILE__, __func__, __LINE__); \ | |
53 | } \ | |
54 | } while (0) | |
55 | #endif | |
56 | ||
57 | #else | |
58 | ||
59 | #ifndef assert | |
60 | #define assert(expr) | |
61 | #endif | |
62 | ||
63 | #endif | |
64 | ||
65 | #define AE_VERSION_1 ('6' << 16 | '6' << 8 | '0') | |
66 | #define AE_VERSION_2 ('1' << 24 | '6' << 16 | '1' << 8 | '0') | |
13ac695e | 67 | #define AE_IS_VER1(ver) ((ver) == AE_VERSION_1) |
6fe6611f | 68 | #define AE_NAME_SIZE 16 |
69 | ||
70 | /* some said the RX and TX RCB format should not be the same in the future. But | |
71 | * it is the same now... | |
72 | */ | |
73 | #define RCB_REG_BASEADDR_L 0x00 /* P660 support only 32bit accessing */ | |
74 | #define RCB_REG_BASEADDR_H 0x04 | |
75 | #define RCB_REG_BD_NUM 0x08 | |
76 | #define RCB_REG_BD_LEN 0x0C | |
77 | #define RCB_REG_PKTLINE 0x10 | |
78 | #define RCB_REG_TAIL 0x18 | |
79 | #define RCB_REG_HEAD 0x1C | |
80 | #define RCB_REG_FBDNUM 0x20 | |
81 | #define RCB_REG_OFFSET 0x24 /* pkt num to be handled */ | |
82 | #define RCB_REG_PKTNUM_RECORD 0x2C /* total pkt received */ | |
83 | ||
84 | #define HNS_RX_HEAD_SIZE 256 | |
85 | ||
86 | #define HNAE_AE_REGISTER 0x1 | |
87 | ||
88 | #define RCB_RING_NAME_LEN 16 | |
89 | ||
90 | enum hnae_led_state { | |
91 | HNAE_LED_INACTIVE, | |
92 | HNAE_LED_ACTIVE, | |
93 | HNAE_LED_ON, | |
94 | HNAE_LED_OFF | |
95 | }; | |
96 | ||
97 | #define HNS_RX_FLAG_VLAN_PRESENT 0x1 | |
98 | #define HNS_RX_FLAG_L3ID_IPV4 0x0 | |
99 | #define HNS_RX_FLAG_L3ID_IPV6 0x1 | |
100 | #define HNS_RX_FLAG_L4ID_UDP 0x0 | |
101 | #define HNS_RX_FLAG_L4ID_TCP 0x1 | |
102 | ||
103 | #define HNS_TXD_ASID_S 0 | |
104 | #define HNS_TXD_ASID_M (0xff << HNS_TXD_ASID_S) | |
105 | #define HNS_TXD_BUFNUM_S 8 | |
106 | #define HNS_TXD_BUFNUM_M (0x3 << HNS_TXD_BUFNUM_S) | |
107 | #define HNS_TXD_PORTID_S 10 | |
108 | #define HNS_TXD_PORTID_M (0x7 << HNS_TXD_PORTID_S) | |
109 | ||
110 | #define HNS_TXD_RA_B 8 | |
111 | #define HNS_TXD_RI_B 9 | |
112 | #define HNS_TXD_L4CS_B 10 | |
113 | #define HNS_TXD_L3CS_B 11 | |
114 | #define HNS_TXD_FE_B 12 | |
115 | #define HNS_TXD_VLD_B 13 | |
116 | #define HNS_TXD_IPOFFSET_S 14 | |
117 | #define HNS_TXD_IPOFFSET_M (0xff << HNS_TXD_IPOFFSET_S) | |
118 | ||
119 | #define HNS_RXD_IPOFFSET_S 0 | |
120 | #define HNS_RXD_IPOFFSET_M (0xff << HNS_TXD_IPOFFSET_S) | |
121 | #define HNS_RXD_BUFNUM_S 8 | |
122 | #define HNS_RXD_BUFNUM_M (0x3 << HNS_RXD_BUFNUM_S) | |
123 | #define HNS_RXD_PORTID_S 10 | |
124 | #define HNS_RXD_PORTID_M (0x7 << HNS_RXD_PORTID_S) | |
125 | #define HNS_RXD_DMAC_S 13 | |
126 | #define HNS_RXD_DMAC_M (0x3 << HNS_RXD_DMAC_S) | |
127 | #define HNS_RXD_VLAN_S 15 | |
128 | #define HNS_RXD_VLAN_M (0x3 << HNS_RXD_VLAN_S) | |
129 | #define HNS_RXD_L3ID_S 17 | |
130 | #define HNS_RXD_L3ID_M (0xf << HNS_RXD_L3ID_S) | |
131 | #define HNS_RXD_L4ID_S 21 | |
132 | #define HNS_RXD_L4ID_M (0xf << HNS_RXD_L4ID_S) | |
133 | #define HNS_RXD_FE_B 25 | |
134 | #define HNS_RXD_FRAG_B 26 | |
135 | #define HNS_RXD_VLD_B 27 | |
136 | #define HNS_RXD_L2E_B 28 | |
137 | #define HNS_RXD_L3E_B 29 | |
138 | #define HNS_RXD_L4E_B 30 | |
139 | #define HNS_RXD_DROP_B 31 | |
140 | ||
141 | #define HNS_RXD_VLANID_S 8 | |
142 | #define HNS_RXD_VLANID_M (0xfff << HNS_RXD_VLANID_S) | |
143 | #define HNS_RXD_CFI_B 20 | |
144 | #define HNS_RXD_PRI_S 21 | |
145 | #define HNS_RXD_PRI_M (0x7 << HNS_RXD_PRI_S) | |
146 | #define HNS_RXD_ASID_S 24 | |
147 | #define HNS_RXD_ASID_M (0xff << HNS_RXD_ASID_S) | |
148 | ||
13ac695e S |
149 | #define HNSV2_TXD_BUFNUM_S 0 |
150 | #define HNSV2_TXD_BUFNUM_M (0x7 << HNSV2_TXD_BUFNUM_S) | |
f8a1a636 SL |
151 | #define HNSV2_TXD_PORTID_S 4 |
152 | #define HNSV2_TXD_PORTID_M (0X7 << HNSV2_TXD_PORTID_S) | |
13ac695e S |
153 | #define HNSV2_TXD_RI_B 1 |
154 | #define HNSV2_TXD_L4CS_B 2 | |
155 | #define HNSV2_TXD_L3CS_B 3 | |
156 | #define HNSV2_TXD_FE_B 4 | |
157 | #define HNSV2_TXD_VLD_B 5 | |
158 | ||
159 | #define HNSV2_TXD_TSE_B 0 | |
160 | #define HNSV2_TXD_VLAN_EN_B 1 | |
161 | #define HNSV2_TXD_SNAP_B 2 | |
162 | #define HNSV2_TXD_IPV6_B 3 | |
163 | #define HNSV2_TXD_SCTP_B 4 | |
164 | ||
6fe6611f | 165 | /* hardware spec ring buffer format */ |
166 | struct __packed hnae_desc { | |
167 | __le64 addr; | |
168 | union { | |
169 | struct { | |
13ac695e S |
170 | union { |
171 | __le16 asid_bufnum_pid; | |
172 | __le16 asid; | |
173 | }; | |
6fe6611f | 174 | __le16 send_size; |
13ac695e S |
175 | union { |
176 | __le32 flag_ipoffset; | |
177 | struct { | |
178 | __u8 bn_pid; | |
179 | __u8 ra_ri_cs_fe_vld; | |
180 | __u8 ip_offset; | |
181 | __u8 tse_vlan_snap_v6_sctp_nth; | |
182 | }; | |
183 | }; | |
184 | __le16 mss; | |
185 | __u8 l4_len; | |
186 | __u8 reserved1; | |
187 | __le16 paylen; | |
188 | __u8 vmid; | |
189 | __u8 qid; | |
190 | __le32 reserved2[2]; | |
6fe6611f | 191 | } tx; |
192 | ||
193 | struct { | |
194 | __le32 ipoff_bnum_pid_flag; | |
195 | __le16 pkt_len; | |
196 | __le16 size; | |
13ac695e S |
197 | union { |
198 | __le32 vlan_pri_asid; | |
199 | struct { | |
200 | __le16 asid; | |
201 | __le16 vlan_cfi_pri; | |
202 | }; | |
203 | }; | |
204 | __le32 rss_hash; | |
205 | __le32 reserved_1[2]; | |
6fe6611f | 206 | } rx; |
207 | }; | |
208 | }; | |
209 | ||
210 | struct hnae_desc_cb { | |
211 | dma_addr_t dma; /* dma address of this desc */ | |
212 | void *buf; /* cpu addr for a desc */ | |
213 | ||
214 | /* priv data for the desc, e.g. skb when use with ip stack*/ | |
215 | void *priv; | |
216 | u16 page_offset; | |
217 | u16 reuse_flag; | |
218 | ||
219 | u16 length; /* length of the buffer */ | |
220 | ||
221 | /* desc type, used by the ring user to mark the type of the priv data */ | |
222 | u16 type; | |
223 | }; | |
224 | ||
225 | #define setflags(flags, bits) ((flags) |= (bits)) | |
226 | #define unsetflags(flags, bits) ((flags) &= ~(bits)) | |
227 | ||
228 | /* hnae_ring->flags fields */ | |
229 | #define RINGF_DIR 0x1 /* TX or RX ring, set if TX */ | |
230 | #define is_tx_ring(ring) ((ring)->flags & RINGF_DIR) | |
231 | #define is_rx_ring(ring) (!is_tx_ring(ring)) | |
232 | #define ring_to_dma_dir(ring) (is_tx_ring(ring) ? \ | |
233 | DMA_TO_DEVICE : DMA_FROM_DEVICE) | |
234 | ||
235 | struct ring_stats { | |
236 | u64 io_err_cnt; | |
237 | u64 sw_err_cnt; | |
238 | u64 seg_pkt_cnt; | |
239 | union { | |
240 | struct { | |
241 | u64 tx_pkts; | |
242 | u64 tx_bytes; | |
243 | u64 tx_err_cnt; | |
244 | u64 restart_queue; | |
245 | u64 tx_busy; | |
246 | }; | |
247 | struct { | |
248 | u64 rx_pkts; | |
249 | u64 rx_bytes; | |
250 | u64 rx_err_cnt; | |
251 | u64 reuse_pg_cnt; | |
252 | u64 err_pkt_len; | |
253 | u64 non_vld_descs; | |
254 | u64 err_bd_num; | |
255 | u64 l2_err; | |
256 | u64 l3l4_csum_err; | |
257 | }; | |
258 | }; | |
259 | }; | |
260 | ||
261 | struct hnae_queue; | |
262 | ||
263 | struct hnae_ring { | |
264 | u8 __iomem *io_base; /* base io address for the ring */ | |
265 | struct hnae_desc *desc; /* dma map address space */ | |
266 | struct hnae_desc_cb *desc_cb; | |
267 | struct hnae_queue *q; | |
268 | int irq; | |
269 | char ring_name[RCB_RING_NAME_LEN]; | |
270 | ||
271 | /* statistic */ | |
272 | struct ring_stats stats; | |
273 | ||
274 | dma_addr_t desc_dma_addr; | |
275 | u32 buf_size; /* size for hnae_desc->addr, preset by AE */ | |
276 | u16 desc_num; /* total number of desc */ | |
277 | u16 max_desc_num_per_pkt; | |
278 | u16 max_raw_data_sz_per_desc; | |
279 | u16 max_pkt_size; | |
280 | int next_to_use; /* idx of next spare desc */ | |
281 | ||
282 | /* idx of lastest sent desc, the ring is empty when equal to | |
283 | * next_to_use | |
284 | */ | |
285 | int next_to_clean; | |
286 | ||
287 | int flags; /* ring attribute */ | |
288 | int irq_init_flag; | |
289 | }; | |
290 | ||
291 | #define ring_ptr_move_fw(ring, p) \ | |
292 | ((ring)->p = ((ring)->p + 1) % (ring)->desc_num) | |
293 | #define ring_ptr_move_bw(ring, p) \ | |
294 | ((ring)->p = ((ring)->p - 1 + (ring)->desc_num) % (ring)->desc_num) | |
295 | ||
296 | enum hns_desc_type { | |
297 | DESC_TYPE_SKB, | |
298 | DESC_TYPE_PAGE, | |
299 | }; | |
300 | ||
301 | #define assert_is_ring_idx(ring, idx) \ | |
302 | assert((idx) >= 0 && (idx) < (ring)->desc_num) | |
303 | ||
304 | /* the distance between [begin, end) in a ring buffer | |
305 | * note: there is a unuse slot between the begin and the end | |
306 | */ | |
307 | static inline int ring_dist(struct hnae_ring *ring, int begin, int end) | |
308 | { | |
309 | assert_is_ring_idx(ring, begin); | |
310 | assert_is_ring_idx(ring, end); | |
311 | ||
312 | return (end - begin + ring->desc_num) % ring->desc_num; | |
313 | } | |
314 | ||
315 | static inline int ring_space(struct hnae_ring *ring) | |
316 | { | |
317 | return ring->desc_num - | |
318 | ring_dist(ring, ring->next_to_clean, ring->next_to_use) - 1; | |
319 | } | |
320 | ||
321 | static inline int is_ring_empty(struct hnae_ring *ring) | |
322 | { | |
323 | assert_is_ring_idx(ring, ring->next_to_use); | |
324 | assert_is_ring_idx(ring, ring->next_to_clean); | |
325 | ||
326 | return ring->next_to_use == ring->next_to_clean; | |
327 | } | |
328 | ||
329 | #define hnae_buf_size(_ring) ((_ring)->buf_size) | |
330 | #define hnae_page_order(_ring) (get_order(hnae_buf_size(_ring))) | |
331 | #define hnae_page_size(_ring) (PAGE_SIZE << hnae_page_order(_ring)) | |
332 | ||
333 | struct hnae_handle; | |
334 | ||
335 | /* allocate and dma map space for hnae desc */ | |
336 | struct hnae_buf_ops { | |
337 | int (*alloc_buffer)(struct hnae_ring *ring, struct hnae_desc_cb *cb); | |
338 | void (*free_buffer)(struct hnae_ring *ring, struct hnae_desc_cb *cb); | |
339 | int (*map_buffer)(struct hnae_ring *ring, struct hnae_desc_cb *cb); | |
340 | void (*unmap_buffer)(struct hnae_ring *ring, struct hnae_desc_cb *cb); | |
341 | }; | |
342 | ||
343 | struct hnae_queue { | |
344 | void __iomem *io_base; | |
345 | phys_addr_t phy_base; | |
346 | struct hnae_ae_dev *dev; /* the device who use this queue */ | |
9cbe9fd5 | 347 | struct hnae_ring rx_ring ____cacheline_internodealigned_in_smp; |
348 | struct hnae_ring tx_ring ____cacheline_internodealigned_in_smp; | |
6fe6611f | 349 | struct hnae_handle *handle; |
350 | }; | |
351 | ||
352 | /*hnae loop mode*/ | |
353 | enum hnae_loop { | |
354 | MAC_INTERNALLOOP_MAC = 0, | |
355 | MAC_INTERNALLOOP_SERDES, | |
356 | MAC_INTERNALLOOP_PHY, | |
357 | MAC_LOOP_NONE, | |
358 | }; | |
359 | ||
360 | /*hnae port type*/ | |
361 | enum hnae_port_type { | |
362 | HNAE_PORT_SERVICE = 0, | |
363 | HNAE_PORT_DEBUG | |
364 | }; | |
365 | ||
366 | /* This struct defines the operation on the handle. | |
367 | * | |
368 | * get_handle(): (mandatory) | |
369 | * Get a handle from AE according to its name and options. | |
370 | * the AE driver should manage the space used by handle and its queues while | |
371 | * the HNAE framework will allocate desc and desc_cb for all rings in the | |
372 | * queues. | |
373 | * put_handle(): | |
374 | * Release the handle. | |
375 | * start(): | |
376 | * Enable the hardware, include all queues | |
377 | * stop(): | |
378 | * Disable the hardware | |
379 | * set_opts(): (mandatory) | |
380 | * Set options to the AE | |
381 | * get_opts(): (mandatory) | |
382 | * Get options from the AE | |
383 | * get_status(): | |
384 | * Get the carrier state of the back channel of the handle, 1 for ok, 0 for | |
385 | * non-ok | |
386 | * toggle_ring_irq(): (mandatory) | |
387 | * Set the ring irq to be enabled(0) or disable(1) | |
388 | * toggle_queue_status(): (mandatory) | |
389 | * Set the queue to be enabled(1) or disable(0), this will not change the | |
390 | * ring irq state | |
391 | * adjust_link() | |
392 | * adjust link status | |
393 | * set_loopback() | |
394 | * set loopback | |
395 | * get_ring_bdnum_limit() | |
396 | * get ring bd number limit | |
397 | * get_pauseparam() | |
398 | * get tx and rx of pause frame use | |
399 | * set_autoneg() | |
400 | * set auto autonegotiation of pause frame use | |
401 | * get_autoneg() | |
402 | * get auto autonegotiation of pause frame use | |
403 | * set_pauseparam() | |
404 | * set tx and rx of pause frame use | |
405 | * get_coalesce_usecs() | |
406 | * get usecs to delay a TX interrupt after a packet is sent | |
407 | * get_rx_max_coalesced_frames() | |
408 | * get Maximum number of packets to be sent before a TX interrupt. | |
409 | * set_coalesce_usecs() | |
410 | * set usecs to delay a TX interrupt after a packet is sent | |
411 | * set_coalesce_frames() | |
412 | * set Maximum number of packets to be sent before a TX interrupt. | |
413 | * get_ringnum() | |
414 | * get RX/TX ring number | |
415 | * get_max_ringnum() | |
416 | * get RX/TX ring maximum number | |
417 | * get_mac_addr() | |
418 | * get mac address | |
419 | * set_mac_addr() | |
420 | * set mac address | |
421 | * set_mc_addr() | |
422 | * set multicast mode | |
423 | * set_mtu() | |
424 | * set mtu | |
425 | * update_stats() | |
426 | * update Old network device statistics | |
427 | * get_ethtool_stats() | |
428 | * get ethtool network device statistics | |
429 | * get_strings() | |
430 | * get a set of strings that describe the requested objects | |
431 | * get_sset_count() | |
432 | * get number of strings that @get_strings will write | |
433 | * update_led_status() | |
434 | * update the led status | |
435 | * set_led_id() | |
436 | * set led id | |
437 | * get_regs() | |
438 | * get regs dump | |
439 | * get_regs_len() | |
440 | * get the len of the regs dump | |
441 | */ | |
442 | struct hnae_ae_ops { | |
443 | struct hnae_handle *(*get_handle)(struct hnae_ae_dev *dev, | |
444 | u32 port_id); | |
445 | void (*put_handle)(struct hnae_handle *handle); | |
446 | void (*init_queue)(struct hnae_queue *q); | |
447 | void (*fini_queue)(struct hnae_queue *q); | |
448 | int (*start)(struct hnae_handle *handle); | |
449 | void (*stop)(struct hnae_handle *handle); | |
450 | void (*reset)(struct hnae_handle *handle); | |
451 | int (*set_opts)(struct hnae_handle *handle, int type, void *opts); | |
452 | int (*get_opts)(struct hnae_handle *handle, int type, void **opts); | |
453 | int (*get_status)(struct hnae_handle *handle); | |
454 | int (*get_info)(struct hnae_handle *handle, | |
455 | u8 *auto_neg, u16 *speed, u8 *duplex); | |
456 | void (*toggle_ring_irq)(struct hnae_ring *ring, u32 val); | |
457 | void (*toggle_queue_status)(struct hnae_queue *queue, u32 val); | |
458 | void (*adjust_link)(struct hnae_handle *handle, int speed, int duplex); | |
459 | int (*set_loopback)(struct hnae_handle *handle, | |
460 | enum hnae_loop loop_mode, int en); | |
461 | void (*get_ring_bdnum_limit)(struct hnae_queue *queue, | |
462 | u32 *uplimit); | |
463 | void (*get_pauseparam)(struct hnae_handle *handle, | |
464 | u32 *auto_neg, u32 *rx_en, u32 *tx_en); | |
465 | int (*set_autoneg)(struct hnae_handle *handle, u8 enable); | |
466 | int (*get_autoneg)(struct hnae_handle *handle); | |
467 | int (*set_pauseparam)(struct hnae_handle *handle, | |
468 | u32 auto_neg, u32 rx_en, u32 tx_en); | |
469 | void (*get_coalesce_usecs)(struct hnae_handle *handle, | |
470 | u32 *tx_usecs, u32 *rx_usecs); | |
471 | void (*get_rx_max_coalesced_frames)(struct hnae_handle *handle, | |
472 | u32 *tx_frames, u32 *rx_frames); | |
9832ce4c | 473 | int (*set_coalesce_usecs)(struct hnae_handle *handle, u32 timeout); |
6fe6611f | 474 | int (*set_coalesce_frames)(struct hnae_handle *handle, |
475 | u32 coalesce_frames); | |
4568637f | 476 | void (*set_promisc_mode)(struct hnae_handle *handle, u32 en); |
6fe6611f | 477 | int (*get_mac_addr)(struct hnae_handle *handle, void **p); |
478 | int (*set_mac_addr)(struct hnae_handle *handle, void *p); | |
479 | int (*set_mc_addr)(struct hnae_handle *handle, void *addr); | |
480 | int (*set_mtu)(struct hnae_handle *handle, int new_mtu); | |
64353af6 | 481 | void (*set_tso_stats)(struct hnae_handle *handle, int enable); |
6fe6611f | 482 | void (*update_stats)(struct hnae_handle *handle, |
483 | struct net_device_stats *net_stats); | |
484 | void (*get_stats)(struct hnae_handle *handle, u64 *data); | |
485 | void (*get_strings)(struct hnae_handle *handle, | |
486 | u32 stringset, u8 *data); | |
487 | int (*get_sset_count)(struct hnae_handle *handle, int stringset); | |
488 | void (*update_led_status)(struct hnae_handle *handle); | |
489 | int (*set_led_id)(struct hnae_handle *handle, | |
490 | enum hnae_led_state status); | |
491 | void (*get_regs)(struct hnae_handle *handle, void *data); | |
492 | int (*get_regs_len)(struct hnae_handle *handle); | |
6bc0ce7d S |
493 | u32 (*get_rss_key_size)(struct hnae_handle *handle); |
494 | u32 (*get_rss_indir_size)(struct hnae_handle *handle); | |
495 | int (*get_rss)(struct hnae_handle *handle, u32 *indir, u8 *key, | |
496 | u8 *hfunc); | |
497 | int (*set_rss)(struct hnae_handle *handle, const u32 *indir, | |
498 | const u8 *key, const u8 hfunc); | |
6fe6611f | 499 | }; |
500 | ||
501 | struct hnae_ae_dev { | |
502 | struct device cls_dev; /* the class dev */ | |
503 | struct device *dev; /* the presented dev */ | |
504 | struct hnae_ae_ops *ops; | |
505 | struct list_head node; | |
506 | struct module *owner; /* the module who provides this dev */ | |
507 | int id; | |
508 | char name[AE_NAME_SIZE]; | |
509 | struct list_head handle_list; | |
510 | spinlock_t lock; /* lock to protect the handle_list */ | |
511 | }; | |
512 | ||
513 | struct hnae_handle { | |
514 | struct device *owner_dev; /* the device which make use of this handle */ | |
515 | struct hnae_ae_dev *dev; /* the device who provides this handle */ | |
652d39b0 | 516 | struct phy_device *phy_dev; |
6fe6611f | 517 | phy_interface_t phy_if; |
518 | u32 if_support; | |
519 | int q_num; | |
520 | int vf_id; | |
521 | u32 eport_id; | |
f8a1a636 | 522 | u32 dport_id; /* v2 tx bd should fill the dport_id */ |
6fe6611f | 523 | enum hnae_port_type port_type; |
524 | struct list_head node; /* list to hnae_ae_dev->handle_list */ | |
525 | struct hnae_buf_ops *bops; /* operation for the buffer */ | |
526 | struct hnae_queue **qs; /* array base of all queues */ | |
527 | }; | |
528 | ||
529 | #define ring_to_dev(ring) ((ring)->q->dev->dev) | |
530 | ||
48189d6a | 531 | struct hnae_handle *hnae_get_handle(struct device *owner_dev, |
7b2acae6 | 532 | const struct fwnode_handle *fwnode, |
48189d6a | 533 | u32 port_id, |
534 | struct hnae_buf_ops *bops); | |
535 | ||
6fe6611f | 536 | void hnae_put_handle(struct hnae_handle *handle); |
537 | int hnae_ae_register(struct hnae_ae_dev *dev, struct module *owner); | |
538 | void hnae_ae_unregister(struct hnae_ae_dev *dev); | |
539 | ||
540 | int hnae_register_notifier(struct notifier_block *nb); | |
541 | void hnae_unregister_notifier(struct notifier_block *nb); | |
542 | int hnae_reinit_handle(struct hnae_handle *handle); | |
543 | ||
544 | #define hnae_queue_xmit(q, buf_num) writel_relaxed(buf_num, \ | |
545 | (q)->tx_ring.io_base + RCB_REG_TAIL) | |
546 | ||
547 | #ifndef assert | |
548 | #define assert(cond) | |
549 | #endif | |
550 | ||
551 | static inline int hnae_reserve_buffer_map(struct hnae_ring *ring, | |
552 | struct hnae_desc_cb *cb) | |
553 | { | |
554 | struct hnae_buf_ops *bops = ring->q->handle->bops; | |
555 | int ret; | |
556 | ||
557 | ret = bops->alloc_buffer(ring, cb); | |
558 | if (ret) | |
559 | goto out; | |
560 | ||
561 | ret = bops->map_buffer(ring, cb); | |
562 | if (ret) | |
563 | goto out_with_buf; | |
564 | ||
565 | return 0; | |
566 | ||
567 | out_with_buf: | |
568 | bops->free_buffer(ring, cb); | |
569 | out: | |
570 | return ret; | |
571 | } | |
572 | ||
573 | static inline int hnae_alloc_buffer_attach(struct hnae_ring *ring, int i) | |
574 | { | |
575 | int ret = hnae_reserve_buffer_map(ring, &ring->desc_cb[i]); | |
576 | ||
577 | if (ret) | |
578 | return ret; | |
579 | ||
580 | ring->desc[i].addr = (__le64)ring->desc_cb[i].dma; | |
581 | ||
582 | return 0; | |
583 | } | |
584 | ||
585 | static inline void hnae_buffer_detach(struct hnae_ring *ring, int i) | |
586 | { | |
587 | ring->q->handle->bops->unmap_buffer(ring, &ring->desc_cb[i]); | |
588 | ring->desc[i].addr = 0; | |
589 | } | |
590 | ||
591 | static inline void hnae_free_buffer_detach(struct hnae_ring *ring, int i) | |
592 | { | |
593 | struct hnae_buf_ops *bops = ring->q->handle->bops; | |
594 | struct hnae_desc_cb *cb = &ring->desc_cb[i]; | |
595 | ||
596 | if (!ring->desc_cb[i].dma) | |
597 | return; | |
598 | ||
599 | hnae_buffer_detach(ring, i); | |
600 | bops->free_buffer(ring, cb); | |
601 | } | |
602 | ||
603 | /* detach a in-used buffer and replace with a reserved one */ | |
604 | static inline void hnae_replace_buffer(struct hnae_ring *ring, int i, | |
605 | struct hnae_desc_cb *res_cb) | |
606 | { | |
607 | struct hnae_buf_ops *bops = ring->q->handle->bops; | |
6fe6611f | 608 | |
609 | bops->unmap_buffer(ring, &ring->desc_cb[i]); | |
610 | ring->desc_cb[i] = *res_cb; | |
6fe6611f | 611 | ring->desc[i].addr = (__le64)ring->desc_cb[i].dma; |
612 | ring->desc[i].rx.ipoff_bnum_pid_flag = 0; | |
613 | } | |
614 | ||
615 | static inline void hnae_reuse_buffer(struct hnae_ring *ring, int i) | |
616 | { | |
617 | ring->desc_cb[i].reuse_flag = 0; | |
618 | ring->desc[i].addr = (__le64)(ring->desc_cb[i].dma | |
619 | + ring->desc_cb[i].page_offset); | |
620 | ring->desc[i].rx.ipoff_bnum_pid_flag = 0; | |
621 | } | |
622 | ||
623 | #define hnae_set_field(origin, mask, shift, val) \ | |
624 | do { \ | |
625 | (origin) &= (~(mask)); \ | |
626 | (origin) |= ((val) << (shift)) & (mask); \ | |
627 | } while (0) | |
628 | ||
629 | #define hnae_set_bit(origin, shift, val) \ | |
630 | hnae_set_field((origin), (0x1 << (shift)), (shift), (val)) | |
631 | ||
632 | #define hnae_get_field(origin, mask, shift) (((origin) & (mask)) >> (shift)) | |
633 | ||
634 | #define hnae_get_bit(origin, shift) \ | |
635 | hnae_get_field((origin), (0x1 << (shift)), (shift)) | |
636 | ||
637 | #endif |