blob: 972c4e03bbab4d37eb4b19ea256b8977bf30204e [file] [log] [blame]
developerfd40db22021-04-29 10:08:25 +08001/* Copyright 2016 MediaTek Inc.
2 * Author: Nelson Chang <nelson.chang@mediatek.com>
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 version 2 as
6 * published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 */
13#include "raether.h"
14#include "raether_rss.h"
15#include "raether_hwlro.h"
16#include "ra_mac.h"
17
18static struct proc_dir_entry *proc_rss_ring1, *proc_rss_ring2, *proc_rss_ring3;
19
20int fe_rss_4ring_init(struct net_device *dev)
21{
22 struct END_DEVICE *ei_local = netdev_priv(dev);
23 int skb_size;
24 int i, j;
25
26 skb_size = SKB_DATA_ALIGN(MAX_RX_LENGTH + NET_IP_ALIGN) +
27 SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
28
29 /* Initial RX Ring 1 ~ 3 */
30 for (i = 1; i < MAX_RX_RING_NUM; i++) {
31 ei_local->rx_ring[i] =
32 dma_alloc_coherent(dev->dev.parent,
33 NUM_RSS_RX_DESC *
34 sizeof(struct PDMA_rxdesc),
35 &ei_local->phy_rx_ring[i],
36 GFP_ATOMIC | __GFP_ZERO);
37 for (j = 0; j < NUM_RSS_RX_DESC; j++) {
38 ei_local->netrx_skb_data[i][j] =
39 raeth_alloc_skb_data(skb_size, GFP_KERNEL);
40
41 if (!ei_local->netrx_skb_data[i][j]) {
42 pr_info("rx skbuff buffer allocation failed!\n");
43 goto no_rx_mem;
44 }
45
46 memset(&ei_local->rx_ring[i][j], 0,
47 sizeof(struct PDMA_rxdesc));
48 ei_local->rx_ring[i][j].rxd_info2.DDONE_bit = 0;
49 ei_local->rx_ring[i][j].rxd_info2.LS0 = 0;
50 ei_local->rx_ring[i][j].rxd_info2.PLEN0 =
51 SET_ADMA_RX_LEN0(MAX_RX_LENGTH);
52 ei_local->rx_ring[i][j].rxd_info1.PDP0 =
53 dma_map_single(dev->dev.parent,
54 ei_local->netrx_skb_data[i][j] +
55 NET_SKB_PAD,
56 MAX_RX_LENGTH, DMA_FROM_DEVICE);
57 if (unlikely
58 (dma_mapping_error
59 (dev->dev.parent,
60 ei_local->rx_ring[i][j].rxd_info1.PDP0))) {
61 pr_info("[%s]dma_map_single() failed...\n",
62 __func__);
63 goto no_rx_mem;
64 }
65 }
66 pr_info("\nphy_rx_ring[%d] = 0x%08x, rx_ring[%d] = 0x%p\n",
67 i, (unsigned int)ei_local->phy_rx_ring[i],
68 i, (void __iomem *)ei_local->rx_ring[i]);
69 }
70
71 sys_reg_write(RX_BASE_PTR3, phys_to_bus((u32)ei_local->phy_rx_ring[3]));
72 sys_reg_write(RX_MAX_CNT3, cpu_to_le32((u32)NUM_RSS_RX_DESC));
73 sys_reg_write(RX_CALC_IDX3, cpu_to_le32((u32)(NUM_RSS_RX_DESC - 1)));
74 sys_reg_write(PDMA_RST_CFG, PST_DRX_IDX3);
75 sys_reg_write(RX_BASE_PTR2, phys_to_bus((u32)ei_local->phy_rx_ring[2]));
76 sys_reg_write(RX_MAX_CNT2, cpu_to_le32((u32)NUM_RSS_RX_DESC));
77 sys_reg_write(RX_CALC_IDX2, cpu_to_le32((u32)(NUM_RSS_RX_DESC - 1)));
78 sys_reg_write(PDMA_RST_CFG, PST_DRX_IDX2);
79 sys_reg_write(RX_BASE_PTR1, phys_to_bus((u32)ei_local->phy_rx_ring[1]));
80 sys_reg_write(RX_MAX_CNT1, cpu_to_le32((u32)NUM_RSS_RX_DESC));
81 sys_reg_write(RX_CALC_IDX1, cpu_to_le32((u32)(NUM_RSS_RX_DESC - 1)));
82 sys_reg_write(PDMA_RST_CFG, PST_DRX_IDX1);
83
84 /* 1. Set RX ring1~3 to pse modes */
85 SET_PDMA_RXRING_MODE(ADMA_RX_RING1, PDMA_RX_PSE_MODE);
86 SET_PDMA_RXRING_MODE(ADMA_RX_RING2, PDMA_RX_PSE_MODE);
87 SET_PDMA_RXRING_MODE(ADMA_RX_RING3, PDMA_RX_PSE_MODE);
88
89 /* 2. Enable non-lro multiple rx */
90 SET_PDMA_NON_LRO_MULTI_EN(1); /* MRX EN */
91
92 /*Hash Type*/
93 SET_PDMA_RSS_IPV4_TYPE(7);
94 SET_PDMA_RSS_IPV6_TYPE(7);
95 /* 3. Select the size of indirection table */
96 SET_PDMA_RSS_CR_VALUE(ADMA_RSS_INDR_TABLE_DW0, 0x39393939);
97 SET_PDMA_RSS_CR_VALUE(ADMA_RSS_INDR_TABLE_DW1, 0x93939393);
98 SET_PDMA_RSS_CR_VALUE(ADMA_RSS_INDR_TABLE_DW2, 0x39399393);
99 SET_PDMA_RSS_CR_VALUE(ADMA_RSS_INDR_TABLE_DW3, 0x93933939);
100 SET_PDMA_RSS_CR_VALUE(ADMA_RSS_INDR_TABLE_DW4, 0x39393939);
101 SET_PDMA_RSS_CR_VALUE(ADMA_RSS_INDR_TABLE_DW5, 0x93939393);
102 SET_PDMA_RSS_CR_VALUE(ADMA_RSS_INDR_TABLE_DW6, 0x39399393);
103 SET_PDMA_RSS_CR_VALUE(ADMA_RSS_INDR_TABLE_DW7, 0x93933939);
104 /* 4. Pause */
105 SET_PDMA_RSS_CFG_REQ(1);
106
107 /* 5. Enable RSS */
108 SET_PDMA_RSS_EN(1);
109
110 /* 6. Release pause */
111 SET_PDMA_RSS_CFG_REQ(0);
112
113 return 0;
114
115no_rx_mem:
116 return -ENOMEM;
117}
118
119void fe_rss_4ring_deinit(struct net_device *dev)
120{
121 struct END_DEVICE *ei_local = netdev_priv(dev);
122 int i, j;
123
124 for (i = 1; i < MAX_RX_RING_NUM; i++) {
125 /* free RX Ring */
126 dma_free_coherent(dev->dev.parent,
127 NUM_RSS_RX_DESC * sizeof(struct PDMA_rxdesc),
128 ei_local->rx_ring[i],
129 ei_local->phy_rx_ring[i]);
130 /* free RX data */
131 for (j = 0; j < NUM_RSS_RX_DESC; j++) {
132 raeth_free_skb_data(ei_local->netrx_skb_data[i][j]);
133 ei_local->netrx_skb_data[i][j] = NULL;
134 }
135 }
136}
137
138int fe_rss_2ring_init(struct net_device *dev)
139{
140 struct END_DEVICE *ei_local = netdev_priv(dev);
141 int skb_size;
142 int i, j;
143
144 skb_size = SKB_DATA_ALIGN(MAX_RX_LENGTH + NET_IP_ALIGN) +
145 SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
146
147 for (i = 1; i < MAX_RX_RING_NUM_2RING; i++) {
148 ei_local->rx_ring[i] =
149 dma_alloc_coherent(dev->dev.parent,
150 NUM_RSS_RX_DESC *
151 sizeof(struct PDMA_rxdesc),
152 &ei_local->phy_rx_ring[i],
153 GFP_ATOMIC | __GFP_ZERO);
154 for (j = 0; j < NUM_RSS_RX_DESC; j++) {
155 ei_local->netrx_skb_data[i][j] =
156 raeth_alloc_skb_data(skb_size, GFP_KERNEL);
157
158 if (!ei_local->netrx_skb_data[i][j]) {
159 pr_info("rx skbuff buffer allocation failed!\n");
160 goto no_rx_mem;
161 }
162
163 memset(&ei_local->rx_ring[i][j], 0,
164 sizeof(struct PDMA_rxdesc));
165 ei_local->rx_ring[i][j].rxd_info2.DDONE_bit = 0;
166 ei_local->rx_ring[i][j].rxd_info2.LS0 = 0;
167 ei_local->rx_ring[i][j].rxd_info2.PLEN0 =
168 SET_ADMA_RX_LEN0(MAX_RX_LENGTH);
169 ei_local->rx_ring[i][j].rxd_info1.PDP0 =
170 dma_map_single(dev->dev.parent,
171 ei_local->netrx_skb_data[i][j] +
172 NET_SKB_PAD,
173 MAX_RX_LENGTH, DMA_FROM_DEVICE);
174 if (unlikely
175 (dma_mapping_error
176 (dev->dev.parent,
177 ei_local->rx_ring[i][j].rxd_info1.PDP0))) {
178 pr_info("[%s]dma_map_single() failed...\n",
179 __func__);
180 goto no_rx_mem;
181 }
182 }
183 pr_info("\nphy_rx_ring[%d] = 0x%08x, rx_ring[%d] = 0x%p\n",
184 i, (unsigned int)ei_local->phy_rx_ring[i],
185 i, (void __iomem *)ei_local->rx_ring[i]);
186 }
187
188 sys_reg_write(RX_BASE_PTR1, phys_to_bus((u32)ei_local->phy_rx_ring[1]));
189 sys_reg_write(RX_MAX_CNT1, cpu_to_le32((u32)NUM_RSS_RX_DESC));
190 sys_reg_write(RX_CALC_IDX1, cpu_to_le32((u32)(NUM_RSS_RX_DESC - 1)));
191 sys_reg_write(PDMA_RST_CFG, PST_DRX_IDX1);
192
193 /* 1. Set RX ring1~3 to pse modes */
194 SET_PDMA_RXRING_MODE(ADMA_RX_RING1, PDMA_RX_PSE_MODE);
195
196 /* 2. Enable non-lro multiple rx */
197 SET_PDMA_NON_LRO_MULTI_EN(1); /* MRX EN */
198
199 /*Hash Type*/
200 SET_PDMA_RSS_IPV4_TYPE(7);
201 SET_PDMA_RSS_IPV6_TYPE(7);
202 /* 3. Select the size of indirection table */
203 SET_PDMA_RSS_CR_VALUE(ADMA_RSS_INDR_TABLE_DW0, 0x44444444);
204 SET_PDMA_RSS_CR_VALUE(ADMA_RSS_INDR_TABLE_DW1, 0x44444444);
205 SET_PDMA_RSS_CR_VALUE(ADMA_RSS_INDR_TABLE_DW2, 0x44444444);
206 SET_PDMA_RSS_CR_VALUE(ADMA_RSS_INDR_TABLE_DW3, 0x44444444);
207 SET_PDMA_RSS_CR_VALUE(ADMA_RSS_INDR_TABLE_DW4, 0x44444444);
208 SET_PDMA_RSS_CR_VALUE(ADMA_RSS_INDR_TABLE_DW5, 0x44444444);
209 SET_PDMA_RSS_CR_VALUE(ADMA_RSS_INDR_TABLE_DW6, 0x44444444);
210 SET_PDMA_RSS_CR_VALUE(ADMA_RSS_INDR_TABLE_DW7, 0x44444444);
211 /* 4. Pause */
212 SET_PDMA_RSS_CFG_REQ(1);
213
214 /* 5. Enable RSS */
215 SET_PDMA_RSS_EN(1);
216
217 /* 6. Release pause */
218 SET_PDMA_RSS_CFG_REQ(0);
219
220 return 0;
221
222no_rx_mem:
223 return -ENOMEM;
224}
225
226void fe_rss_2ring_deinit(struct net_device *dev)
227{
228 struct END_DEVICE *ei_local = netdev_priv(dev);
229 int i, j;
230
231 for (i = 1; i < MAX_RX_RING_NUM_2RING; i++) {
232 /* free RX Ring */
233 dma_free_coherent(dev->dev.parent,
234 NUM_RSS_RX_DESC * sizeof(struct PDMA_rxdesc),
235 ei_local->rx_ring[i],
236 ei_local->phy_rx_ring[i]);
237 /* free RX data */
238 for (j = 0; j < NUM_RSS_RX_DESC; j++) {
239 raeth_free_skb_data(ei_local->netrx_skb_data[i][j]);
240 ei_local->netrx_skb_data[i][j] = NULL;
241 }
242 }
243}
244
245static inline void hw_rss_rx_desc_init(struct END_DEVICE *ei_local,
246 struct PDMA_rxdesc *rx_ring,
247 unsigned int rx_ring_no,
248 dma_addr_t dma_addr)
249{
250 rx_ring->rxd_info2.PLEN0 = MAX_RX_LENGTH;
251 rx_ring->rxd_info1.PDP0 = dma_addr;
252 rx_ring->rxd_info2.LS0 = 0;
253 rx_ring->rxd_info2.DDONE_bit = 0;
254}
255
256static inline void __iomem *get_rx_cal_idx_reg(unsigned int rx_ring_no)
257{
258 return (void __iomem *)(RAETH_RX_CALC_IDX0 + (rx_ring_no << 4));
259}
260
261int fe_rss0_recv(struct net_device *dev,
262 struct napi_struct *napi,
263 int budget)
264{
265 struct END_DEVICE *ei_local = netdev_priv(dev);
266 struct PSEUDO_ADAPTER *p_ad = netdev_priv(ei_local->pseudo_dev);
267 struct sk_buff *rx_skb;
268 struct PDMA_rxdesc *rx_ring, *rx_ring_next;
269 void *rx_data, *rx_data_next, *new_data;
270 unsigned int length = 0;
271 unsigned int rx_ring_no = 0, rx_ring_no_next = 0;
272 unsigned int rx_dma_owner_idx, rx_dma_owner_idx_next;
273 unsigned int rx_dma_owner_lro[MAX_RX_RING_NUM];
274 unsigned int skb_size, map_size;
275 /* void __iomem *rx_calc_idx_reg; */
276 int rx_processed = 0;
277
278 /* get cpu owner indexes of rx rings */
279 rx_dma_owner_lro[0] = (ei_local->rx_calc_idx[0] + 1) % num_rx_desc;
280
281 rx_ring_no = 0;
282 rx_dma_owner_idx = rx_dma_owner_lro[rx_ring_no];
283 rx_ring = &ei_local->rx_ring[rx_ring_no][rx_dma_owner_idx];
284 rx_data = ei_local->netrx_skb_data[rx_ring_no][rx_dma_owner_idx];
285 /* rx_calc_idx_reg = get_rx_cal_idx_reg(rx_ring_no); */
286
287 for (;;) {
288 dma_addr_t dma_addr;
289
290 if ((rx_processed++ > budget) ||
291 (rx_ring->rxd_info2.DDONE_bit == 0))
292 break;
293
294 /* prefetch the next handling RXD */
295
296 rx_dma_owner_lro[rx_ring_no] =
297 (rx_dma_owner_idx + 1) % num_rx_desc;
298 skb_size =
299 SKB_DATA_ALIGN(MAX_RX_LENGTH + NET_IP_ALIGN +
300 NET_SKB_PAD) +
301 SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
302 map_size = MAX_RX_LENGTH;
303
304 /* rx_ring_no_next = get_rss_rx_ring(ei_local, rx_dma_owner_lro, group); */
305 rx_ring_no_next = rx_ring_no;
306 rx_dma_owner_idx_next = rx_dma_owner_lro[rx_ring_no_next];
307
308 rx_ring_next =
309 &ei_local->rx_ring
310 [rx_ring_no_next][rx_dma_owner_idx_next];
311 rx_data_next =
312 ei_local->netrx_skb_data
313 [rx_ring_no_next][rx_dma_owner_idx_next];
314 prefetch(rx_ring_next);
315
316 /* We have to check the free memory size is big enough
317 * before pass the packet to cpu
318 */
319 new_data = raeth_alloc_skb_data(skb_size, GFP_ATOMIC);
320
321 if (unlikely(!new_data)) {
322 pr_info("skb not available...\n");
323 goto skb_err;
324 }
325
326 dma_addr = dma_map_single(dev->dev.parent,
327 new_data + NET_SKB_PAD,
328 map_size,
329 DMA_FROM_DEVICE);
330
331 if (unlikely(dma_mapping_error(dev->dev.parent, dma_addr))) {
332 pr_info("[%s]dma_map_single() failed...\n", __func__);
333 raeth_free_skb_data(new_data);
334 goto skb_err;
335 }
336
337 rx_skb = raeth_build_skb(rx_data, skb_size);
338
339 if (unlikely(!rx_skb)) {
340 put_page(virt_to_head_page(rx_data));
341 pr_info("build_skb failed\n");
342 goto skb_err;
343 }
344 skb_reserve(rx_skb, NET_SKB_PAD + NET_IP_ALIGN);
345
346 length = rx_ring->rxd_info2.PLEN0;
347 dma_unmap_single(dev->dev.parent,
348 rx_ring->rxd_info1.PDP0,
349 length, DMA_FROM_DEVICE);
350
351 prefetch(rx_skb->data);
352
353 /* skb processing */
354 skb_put(rx_skb, length);
355
356 /* rx packet from GE2 */
357 if (rx_ring->rxd_info4.SP == 2) {
358 if (ei_local->pseudo_dev) {
359 rx_skb->dev = ei_local->pseudo_dev;
360 rx_skb->protocol =
361 eth_type_trans(rx_skb,
362 ei_local->pseudo_dev);
363 } else {
364 pr_info
365 ("pseudo_dev is still not initialize ");
366 pr_info
367 ("but receive packet from GMAC2\n");
368 }
369 } else {
370 rx_skb->dev = dev;
371 rx_skb->protocol = eth_type_trans(rx_skb, dev);
372 }
373
374 /* rx checksum offload */
375 if (likely(rx_ring->rxd_info4.L4VLD))
376 rx_skb->ip_summed = CHECKSUM_UNNECESSARY;
377 else
378 rx_skb->ip_summed = CHECKSUM_NONE;
379
380#if defined(CONFIG_RA_HW_NAT) || defined(CONFIG_RA_HW_NAT_MODULE)
381 if (ppe_hook_rx_eth) {
382 if (IS_SPACE_AVAILABLE_HEAD(rx_skb)) {
383 *(uint32_t *)(FOE_INFO_START_ADDR_HEAD(rx_skb)) =
384 *(uint32_t *)&rx_ring->rxd_info4;
385 FOE_ALG_HEAD(rx_skb) = 0;
386 FOE_MAGIC_TAG_HEAD(rx_skb) = FOE_MAGIC_GE;
387 FOE_TAG_PROTECT_HEAD(rx_skb) = TAG_PROTECT;
388 }
389 if (IS_SPACE_AVAILABLE_TAIL(rx_skb)) {
390 *(uint32_t *)(FOE_INFO_START_ADDR_TAIL(rx_skb) + 2) =
391 *(uint32_t *)&rx_ring->rxd_info4;
392 FOE_ALG_TAIL(rx_skb) = 0;
393 FOE_MAGIC_TAG_TAIL(rx_skb) = FOE_MAGIC_GE;
394 FOE_TAG_PROTECT_TAIL(rx_skb) = TAG_PROTECT;
395 }
396 }
397#endif
398 if (ei_local->features & FE_HW_VLAN_RX) {
399 if (rx_ring->rxd_info2.TAG)
400 __vlan_hwaccel_put_tag(rx_skb,
401 htons(ETH_P_8021Q),
402 rx_ring->rxd_info3.VID);
403 }
404/* ra_sw_nat_hook_rx return 1 --> continue
405 * ra_sw_nat_hook_rx return 0 --> FWD & without netif_rx
406 */
407#if defined(CONFIG_RA_HW_NAT) || defined(CONFIG_RA_HW_NAT_MODULE)
408 if ((!ppe_hook_rx_eth) ||
409 (ppe_hook_rx_eth && ppe_hook_rx_eth(rx_skb))) {
410#endif
411 if (ei_local->features & FE_INT_NAPI) {
412 /* napi_gro_receive(napi, rx_skb); */
413 netif_receive_skb(rx_skb);
414 } else {
415 netif_rx(rx_skb);
416 }
417
418#if defined(CONFIG_RA_HW_NAT) || defined(CONFIG_RA_HW_NAT_MODULE)
419 }
420#endif
421
422 if (rx_ring->rxd_info4.SP == 2) {
423 p_ad->stat.rx_packets++;
424 p_ad->stat.rx_bytes += length;
425 } else {
426 ei_local->stat.rx_packets++;
427 ei_local->stat.rx_bytes += length;
428 }
429
430 /* Init RX desc. */
431 hw_rss_rx_desc_init(ei_local,
432 rx_ring,
433 rx_ring_no,
434 dma_addr);
435 ei_local->netrx_skb_data[rx_ring_no][rx_dma_owner_idx] =
436 new_data;
437
438 /* make sure that all changes to the dma ring are flushed before
439 * we continue
440 */
441 wmb();
442 sys_reg_write(RAETH_RX_CALC_IDX0, rx_dma_owner_idx);
443 ei_local->rx_calc_idx[rx_ring_no] = rx_dma_owner_idx;
444
445 /* use prefetched variable */
446 rx_dma_owner_idx = rx_dma_owner_idx_next;
447 rx_ring_no = rx_ring_no_next;
448 rx_ring = rx_ring_next;
449 rx_data = rx_data_next;
450 /* rx_calc_idx_reg = get_rx_cal_idx_reg(rx_ring_no); */
451 } /* for */
452
453 return rx_processed;
454
455skb_err:
456 /* rx packet from GE2 */
457 if (rx_ring->rxd_info4.SP == 2)
458 p_ad->stat.rx_dropped++;
459 else
460 ei_local->stat.rx_dropped++;
461
462 /* Discard the rx packet */
463 hw_rss_rx_desc_init(ei_local,
464 rx_ring,
465 rx_ring_no,
466 rx_ring->rxd_info1.PDP0);
467 sys_reg_write(RAETH_RX_CALC_IDX0, rx_dma_owner_idx);
468 ei_local->rx_calc_idx[rx_ring_no] = rx_dma_owner_idx;
469
470 return (budget + 1);
471}
472
473int fe_rss1_recv(struct net_device *dev,
474 struct napi_struct *napi,
475 int budget)
476{
477 struct END_DEVICE *ei_local = netdev_priv(dev);
478 struct PSEUDO_ADAPTER *p_ad = netdev_priv(ei_local->pseudo_dev);
479 struct sk_buff *rx_skb;
480 struct PDMA_rxdesc *rx_ring, *rx_ring_next;
481 void *rx_data, *rx_data_next, *new_data;
482 unsigned int length = 0;
483 unsigned int rx_ring_no = 0, rx_ring_no_next = 0;
484 unsigned int rx_dma_owner_idx, rx_dma_owner_idx_next;
485 unsigned int rx_dma_owner_lro[MAX_RX_RING_NUM];
486 unsigned int skb_size, map_size;
487 /* void __iomem *rx_calc_idx_reg; */
488 int rx_processed = 0;
489
490 /* get cpu owner indexes of rx rings */
491 rx_dma_owner_lro[1] = (ei_local->rx_calc_idx[1] + 1) % NUM_RSS_RX_DESC;
492
493 rx_ring_no = 1;
494 rx_dma_owner_idx = rx_dma_owner_lro[rx_ring_no];
495 rx_ring = &ei_local->rx_ring[rx_ring_no][rx_dma_owner_idx];
496 rx_data = ei_local->netrx_skb_data[rx_ring_no][rx_dma_owner_idx];
497 /* rx_calc_idx_reg = get_rx_cal_idx_reg(rx_ring_no); */
498
499 for (;;) {
500 dma_addr_t dma_addr;
501
502 if ((rx_processed++ > budget) ||
503 (rx_ring->rxd_info2.DDONE_bit == 0))
504 break;
505
506 /* prefetch the next handling RXD */
507
508 rx_dma_owner_lro[rx_ring_no] =
509 (rx_dma_owner_idx + 1) % NUM_RSS_RX_DESC;
510 skb_size =
511 SKB_DATA_ALIGN(MAX_RX_LENGTH + NET_IP_ALIGN +
512 NET_SKB_PAD) +
513 SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
514 map_size = MAX_RX_LENGTH;
515
516 /* rx_ring_no_next = get_rss_rx_ring(ei_local, rx_dma_owner_lro, group); */
517 rx_ring_no_next = rx_ring_no;
518 rx_dma_owner_idx_next = rx_dma_owner_lro[rx_ring_no_next];
519
520 rx_ring_next =
521 &ei_local->rx_ring
522 [rx_ring_no_next][rx_dma_owner_idx_next];
523 rx_data_next =
524 ei_local->netrx_skb_data
525 [rx_ring_no_next][rx_dma_owner_idx_next];
526 prefetch(rx_ring_next);
527
528 /* We have to check the free memory size is big enough
529 * before pass the packet to cpu
530 */
531 new_data = raeth_alloc_skb_data(skb_size, GFP_ATOMIC);
532
533 if (unlikely(!new_data)) {
534 pr_info("skb not available...\n");
535 goto skb_err;
536 }
537
538 dma_addr = dma_map_single(dev->dev.parent,
539 new_data + NET_SKB_PAD,
540 map_size,
541 DMA_FROM_DEVICE);
542
543 if (unlikely(dma_mapping_error(dev->dev.parent, dma_addr))) {
544 pr_info("[%s]dma_map_single() failed...\n", __func__);
545 raeth_free_skb_data(new_data);
546 goto skb_err;
547 }
548
549 rx_skb = raeth_build_skb(rx_data, skb_size);
550
551 if (unlikely(!rx_skb)) {
552 put_page(virt_to_head_page(rx_data));
553 pr_info("build_skb failed\n");
554 goto skb_err;
555 }
556 skb_reserve(rx_skb, NET_SKB_PAD + NET_IP_ALIGN);
557
558 length = rx_ring->rxd_info2.PLEN0;
559 dma_unmap_single(dev->dev.parent,
560 rx_ring->rxd_info1.PDP0,
561 length, DMA_FROM_DEVICE);
562
563 prefetch(rx_skb->data);
564
565 /* skb processing */
566 skb_put(rx_skb, length);
567
568 /* rx packet from GE2 */
569 if (rx_ring->rxd_info4.SP == 2) {
570 if (ei_local->pseudo_dev) {
571 rx_skb->dev = ei_local->pseudo_dev;
572 rx_skb->protocol =
573 eth_type_trans(rx_skb,
574 ei_local->pseudo_dev);
575 } else {
576 pr_info
577 ("pseudo_dev is still not initialize ");
578 pr_info
579 ("but receive packet from GMAC2\n");
580 }
581 } else {
582 rx_skb->dev = dev;
583 rx_skb->protocol = eth_type_trans(rx_skb, dev);
584 }
585
586 /* rx checksum offload */
587 if (likely(rx_ring->rxd_info4.L4VLD))
588 rx_skb->ip_summed = CHECKSUM_UNNECESSARY;
589 else
590 rx_skb->ip_summed = CHECKSUM_NONE;
591
592#if defined(CONFIG_RA_HW_NAT) || defined(CONFIG_RA_HW_NAT_MODULE)
593 if (ppe_hook_rx_eth) {
594 *(uint32_t *)(FOE_INFO_START_ADDR_HEAD(rx_skb)) =
595 *(uint32_t *)&rx_ring->rxd_info4;
596 *(uint32_t *)(FOE_INFO_START_ADDR_TAIL(rx_skb) + 2) =
597 *(uint32_t *)&rx_ring->rxd_info4;
598 FOE_ALG_HEAD(rx_skb) = 0;
599 FOE_ALG_TAIL(rx_skb) = 0;
600 FOE_MAGIC_TAG_HEAD(rx_skb) = FOE_MAGIC_GE;
601 FOE_MAGIC_TAG_TAIL(rx_skb) = FOE_MAGIC_GE;
602 FOE_TAG_PROTECT_HEAD(rx_skb) = TAG_PROTECT;
603 FOE_TAG_PROTECT_TAIL(rx_skb) = TAG_PROTECT;
604 }
605#endif
606 if (ei_local->features & FE_HW_VLAN_RX) {
607 if (rx_ring->rxd_info2.TAG)
608 __vlan_hwaccel_put_tag(rx_skb,
609 htons(ETH_P_8021Q),
610 rx_ring->rxd_info3.VID);
611 }
612/* ra_sw_nat_hook_rx return 1 --> continue
613 * ra_sw_nat_hook_rx return 0 --> FWD & without netif_rx
614 */
615#if defined(CONFIG_RA_HW_NAT) || defined(CONFIG_RA_HW_NAT_MODULE)
616 if ((!ppe_hook_rx_eth) ||
617 (ppe_hook_rx_eth && ppe_hook_rx_eth(rx_skb))) {
618#endif
619 if (ei_local->features & FE_INT_NAPI) {
620 /* napi_gro_receive(napi, rx_skb); */
621 netif_receive_skb(rx_skb);
622 } else {
623 netif_rx(rx_skb);
624 }
625
626#if defined(CONFIG_RA_HW_NAT) || defined(CONFIG_RA_HW_NAT_MODULE)
627 }
628#endif
629
630 if (rx_ring->rxd_info4.SP == 2) {
631 p_ad->stat.rx_packets++;
632 p_ad->stat.rx_bytes += length;
633 } else {
634 ei_local->stat.rx_packets++;
635 ei_local->stat.rx_bytes += length;
636 }
637
638 /* Init RX desc. */
639 hw_rss_rx_desc_init(ei_local,
640 rx_ring,
641 rx_ring_no,
642 dma_addr);
643 ei_local->netrx_skb_data[rx_ring_no][rx_dma_owner_idx] =
644 new_data;
645
646 /* make sure that all changes to the dma ring are flushed before
647 * we continue
648 */
649 wmb();
650 sys_reg_write(RAETH_RX_CALC_IDX1, rx_dma_owner_idx);
651 ei_local->rx_calc_idx[rx_ring_no] = rx_dma_owner_idx;
652
653 /* use prefetched variable */
654 rx_dma_owner_idx = rx_dma_owner_idx_next;
655 rx_ring_no = rx_ring_no_next;
656 rx_ring = rx_ring_next;
657 rx_data = rx_data_next;
658 /* rx_calc_idx_reg = get_rx_cal_idx_reg(rx_ring_no); */
659 } /* for */
660
661 return rx_processed;
662
663skb_err:
664 /* rx packet from GE2 */
665 if (rx_ring->rxd_info4.SP == 2)
666 p_ad->stat.rx_dropped++;
667 else
668 ei_local->stat.rx_dropped++;
669
670 /* Discard the rx packet */
671 hw_rss_rx_desc_init(ei_local,
672 rx_ring,
673 rx_ring_no,
674 rx_ring->rxd_info1.PDP0);
675 sys_reg_write(RAETH_RX_CALC_IDX1, rx_dma_owner_idx);
676 ei_local->rx_calc_idx[rx_ring_no] = rx_dma_owner_idx;
677
678 return (budget + 1);
679}
680
681int fe_rss2_recv(struct net_device *dev,
682 struct napi_struct *napi,
683 int budget)
684{
685 struct END_DEVICE *ei_local = netdev_priv(dev);
686 struct PSEUDO_ADAPTER *p_ad = netdev_priv(ei_local->pseudo_dev);
687 struct sk_buff *rx_skb;
688 struct PDMA_rxdesc *rx_ring, *rx_ring_next;
689 void *rx_data, *rx_data_next, *new_data;
690 unsigned int length = 0;
691 unsigned int rx_ring_no = 0, rx_ring_no_next = 0;
692 unsigned int rx_dma_owner_idx, rx_dma_owner_idx_next;
693 unsigned int rx_dma_owner_lro[MAX_RX_RING_NUM];
694 unsigned int skb_size, map_size;
695 /* void __iomem *rx_calc_idx_reg; */
696 int rx_processed = 0;
697
698 /* get cpu owner indexes of rx rings */
699 rx_dma_owner_lro[2] = (ei_local->rx_calc_idx[2] + 1) % NUM_RSS_RX_DESC;
700
701 rx_ring_no = 2;
702 rx_dma_owner_idx = rx_dma_owner_lro[rx_ring_no];
703 rx_ring = &ei_local->rx_ring[rx_ring_no][rx_dma_owner_idx];
704 rx_data = ei_local->netrx_skb_data[rx_ring_no][rx_dma_owner_idx];
705 /* rx_calc_idx_reg = get_rx_cal_idx_reg(rx_ring_no); */
706
707 for (;;) {
708 dma_addr_t dma_addr;
709
710 if ((rx_processed++ > budget) ||
711 (rx_ring->rxd_info2.DDONE_bit == 0))
712 break;
713
714 /* prefetch the next handling RXD */
715
716 rx_dma_owner_lro[rx_ring_no] =
717 (rx_dma_owner_idx + 1) % NUM_RSS_RX_DESC;
718 skb_size =
719 SKB_DATA_ALIGN(MAX_RX_LENGTH + NET_IP_ALIGN +
720 NET_SKB_PAD) +
721 SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
722 map_size = MAX_RX_LENGTH;
723
724 /* rx_ring_no_next = get_rss_rx_ring(ei_local, rx_dma_owner_lro, group); */
725 rx_ring_no_next = rx_ring_no;
726 rx_dma_owner_idx_next = rx_dma_owner_lro[rx_ring_no_next];
727
728 rx_ring_next =
729 &ei_local->rx_ring
730 [rx_ring_no_next][rx_dma_owner_idx_next];
731 rx_data_next =
732 ei_local->netrx_skb_data
733 [rx_ring_no_next][rx_dma_owner_idx_next];
734 prefetch(rx_ring_next);
735
736 /* We have to check the free memory size is big enough
737 * before pass the packet to cpu
738 */
739 new_data = raeth_alloc_skb_data(skb_size, GFP_ATOMIC);
740
741 if (unlikely(!new_data)) {
742 pr_info("skb not available...\n");
743 goto skb_err;
744 }
745
746 dma_addr = dma_map_single(dev->dev.parent,
747 new_data + NET_SKB_PAD,
748 map_size,
749 DMA_FROM_DEVICE);
750
751 if (unlikely(dma_mapping_error(dev->dev.parent, dma_addr))) {
752 pr_info("[%s]dma_map_single() failed...\n", __func__);
753 raeth_free_skb_data(new_data);
754 goto skb_err;
755 }
756
757 rx_skb = raeth_build_skb(rx_data, skb_size);
758
759 if (unlikely(!rx_skb)) {
760 put_page(virt_to_head_page(rx_data));
761 pr_info("build_skb failed\n");
762 goto skb_err;
763 }
764 skb_reserve(rx_skb, NET_SKB_PAD + NET_IP_ALIGN);
765
766 length = rx_ring->rxd_info2.PLEN0;
767 dma_unmap_single(dev->dev.parent,
768 rx_ring->rxd_info1.PDP0,
769 length, DMA_FROM_DEVICE);
770
771 prefetch(rx_skb->data);
772
773 /* skb processing */
774 skb_put(rx_skb, length);
775
776 /* rx packet from GE2 */
777 if (rx_ring->rxd_info4.SP == 2) {
778 if (ei_local->pseudo_dev) {
779 rx_skb->dev = ei_local->pseudo_dev;
780 rx_skb->protocol =
781 eth_type_trans(rx_skb,
782 ei_local->pseudo_dev);
783 } else {
784 pr_info
785 ("pseudo_dev is still not initialize ");
786 pr_info
787 ("but receive packet from GMAC2\n");
788 }
789 } else {
790 rx_skb->dev = dev;
791 rx_skb->protocol = eth_type_trans(rx_skb, dev);
792 }
793
794 /* rx checksum offload */
795 if (likely(rx_ring->rxd_info4.L4VLD))
796 rx_skb->ip_summed = CHECKSUM_UNNECESSARY;
797 else
798 rx_skb->ip_summed = CHECKSUM_NONE;
799
800#if defined(CONFIG_RA_HW_NAT) || defined(CONFIG_RA_HW_NAT_MODULE)
801 if (ppe_hook_rx_eth) {
802 *(uint32_t *)(FOE_INFO_START_ADDR_HEAD(rx_skb)) =
803 *(uint32_t *)&rx_ring->rxd_info4;
804 *(uint32_t *)(FOE_INFO_START_ADDR_TAIL(rx_skb) + 2) =
805 *(uint32_t *)&rx_ring->rxd_info4;
806 FOE_ALG_HEAD(rx_skb) = 0;
807 FOE_ALG_TAIL(rx_skb) = 0;
808 FOE_MAGIC_TAG_HEAD(rx_skb) = FOE_MAGIC_GE;
809 FOE_MAGIC_TAG_TAIL(rx_skb) = FOE_MAGIC_GE;
810 FOE_TAG_PROTECT_HEAD(rx_skb) = TAG_PROTECT;
811 FOE_TAG_PROTECT_TAIL(rx_skb) = TAG_PROTECT;
812 }
813#endif
814 if (ei_local->features & FE_HW_VLAN_RX) {
815 if (rx_ring->rxd_info2.TAG)
816 __vlan_hwaccel_put_tag(rx_skb,
817 htons(ETH_P_8021Q),
818 rx_ring->rxd_info3.VID);
819 }
820/* ra_sw_nat_hook_rx return 1 --> continue
821 * ra_sw_nat_hook_rx return 0 --> FWD & without netif_rx
822 */
823#if defined(CONFIG_RA_HW_NAT) || defined(CONFIG_RA_HW_NAT_MODULE)
824 if ((!ppe_hook_rx_eth) ||
825 (ppe_hook_rx_eth && ppe_hook_rx_eth(rx_skb))) {
826#endif
827 if (ei_local->features & FE_INT_NAPI) {
828 /* napi_gro_receive(napi, rx_skb); */
829 netif_receive_skb(rx_skb);
830 } else {
831 netif_rx(rx_skb);
832 }
833
834#if defined(CONFIG_RA_HW_NAT) || defined(CONFIG_RA_HW_NAT_MODULE)
835 }
836#endif
837
838 if (rx_ring->rxd_info4.SP == 2) {
839 p_ad->stat.rx_packets++;
840 p_ad->stat.rx_bytes += length;
841 } else {
842 ei_local->stat.rx_packets++;
843 ei_local->stat.rx_bytes += length;
844 }
845
846 /* Init RX desc. */
847 hw_rss_rx_desc_init(ei_local,
848 rx_ring,
849 rx_ring_no,
850 dma_addr);
851 ei_local->netrx_skb_data[rx_ring_no][rx_dma_owner_idx] =
852 new_data;
853
854 /* make sure that all changes to the dma ring are flushed before
855 * we continue
856 */
857 wmb();
858
859 sys_reg_write(RAETH_RX_CALC_IDX2, rx_dma_owner_idx);
860 ei_local->rx_calc_idx[rx_ring_no] = rx_dma_owner_idx;
861
862 /* use prefetched variable */
863 rx_dma_owner_idx = rx_dma_owner_idx_next;
864 rx_ring_no = rx_ring_no_next;
865 rx_ring = rx_ring_next;
866 rx_data = rx_data_next;
867 /* rx_calc_idx_reg = get_rx_cal_idx_reg(rx_ring_no); */
868 } /* for */
869
870 return rx_processed;
871
872skb_err:
873 /* rx packet from GE2 */
874 if (rx_ring->rxd_info4.SP == 2)
875 p_ad->stat.rx_dropped++;
876 else
877 ei_local->stat.rx_dropped++;
878
879 /* Discard the rx packet */
880 hw_rss_rx_desc_init(ei_local,
881 rx_ring,
882 rx_ring_no,
883 rx_ring->rxd_info1.PDP0);
884 sys_reg_write(RAETH_RX_CALC_IDX2, rx_dma_owner_idx);
885 ei_local->rx_calc_idx[rx_ring_no] = rx_dma_owner_idx;
886
887 return (budget + 1);
888}
889
890int fe_rss3_recv(struct net_device *dev,
891 struct napi_struct *napi,
892 int budget)
893{
894 struct END_DEVICE *ei_local = netdev_priv(dev);
895 struct PSEUDO_ADAPTER *p_ad = netdev_priv(ei_local->pseudo_dev);
896 struct sk_buff *rx_skb;
897 struct PDMA_rxdesc *rx_ring, *rx_ring_next;
898 void *rx_data, *rx_data_next, *new_data;
899 unsigned int length = 0;
900 unsigned int rx_ring_no = 0, rx_ring_no_next = 0;
901 unsigned int rx_dma_owner_idx, rx_dma_owner_idx_next;
902 unsigned int rx_dma_owner_lro[MAX_RX_RING_NUM];
903 unsigned int skb_size, map_size;
904 /* void __iomem *rx_calc_idx_reg; */
905 int rx_processed = 0;
906
907 /* get cpu owner indexes of rx rings */
908 rx_dma_owner_lro[3] = (ei_local->rx_calc_idx[3] + 1) % NUM_RSS_RX_DESC;
909 rx_ring_no = 3;
910 rx_dma_owner_idx = rx_dma_owner_lro[rx_ring_no];
911 rx_ring = &ei_local->rx_ring[rx_ring_no][rx_dma_owner_idx];
912 rx_data = ei_local->netrx_skb_data[rx_ring_no][rx_dma_owner_idx];
913 /* rx_calc_idx_reg = get_rx_cal_idx_reg(rx_ring_no); */
914
915 for (;;) {
916 dma_addr_t dma_addr;
917
918 if ((rx_processed++ > budget) ||
919 (rx_ring->rxd_info2.DDONE_bit == 0))
920 break;
921
922 /* prefetch the next handling RXD */
923
924 rx_dma_owner_lro[rx_ring_no] =
925 (rx_dma_owner_idx + 1) % NUM_RSS_RX_DESC;
926 skb_size =
927 SKB_DATA_ALIGN(MAX_RX_LENGTH + NET_IP_ALIGN +
928 NET_SKB_PAD) +
929 SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
930 map_size = MAX_RX_LENGTH;
931
932 /* rx_ring_no_next = get_rss_rx_ring(ei_local, rx_dma_owner_lro, group); */
933 rx_ring_no_next = rx_ring_no;
934 rx_dma_owner_idx_next = rx_dma_owner_lro[rx_ring_no_next];
935
936 rx_ring_next =
937 &ei_local->rx_ring
938 [rx_ring_no_next][rx_dma_owner_idx_next];
939 rx_data_next =
940 ei_local->netrx_skb_data
941 [rx_ring_no_next][rx_dma_owner_idx_next];
942 prefetch(rx_ring_next);
943
944 /* We have to check the free memory size is big enough
945 * before pass the packet to cpu
946 */
947 new_data = raeth_alloc_skb_data(skb_size, GFP_ATOMIC);
948
949 if (unlikely(!new_data)) {
950 pr_info("skb not available...\n");
951 goto skb_err;
952 }
953
954 dma_addr = dma_map_single(dev->dev.parent,
955 new_data + NET_SKB_PAD,
956 map_size,
957 DMA_FROM_DEVICE);
958
959 if (unlikely(dma_mapping_error(dev->dev.parent, dma_addr))) {
960 pr_info("[%s]dma_map_single() failed...\n", __func__);
961 raeth_free_skb_data(new_data);
962 goto skb_err;
963 }
964
965 rx_skb = raeth_build_skb(rx_data, skb_size);
966
967 if (unlikely(!rx_skb)) {
968 put_page(virt_to_head_page(rx_data));
969 pr_info("build_skb failed\n");
970 goto skb_err;
971 }
972 skb_reserve(rx_skb, NET_SKB_PAD + NET_IP_ALIGN);
973
974 length = rx_ring->rxd_info2.PLEN0;
975 dma_unmap_single(dev->dev.parent,
976 rx_ring->rxd_info1.PDP0,
977 length, DMA_FROM_DEVICE);
978
979 prefetch(rx_skb->data);
980
981 /* skb processing */
982 skb_put(rx_skb, length);
983
984 /* rx packet from GE2 */
985 if (rx_ring->rxd_info4.SP == 2) {
986 if (ei_local->pseudo_dev) {
987 rx_skb->dev = ei_local->pseudo_dev;
988 rx_skb->protocol =
989 eth_type_trans(rx_skb,
990 ei_local->pseudo_dev);
991 } else {
992 pr_info
993 ("pseudo_dev is still not initialize ");
994 pr_info
995 ("but receive packet from GMAC2\n");
996 }
997 } else {
998 rx_skb->dev = dev;
999 rx_skb->protocol = eth_type_trans(rx_skb, dev);
1000 }
1001
1002 /* rx checksum offload */
1003 if (likely(rx_ring->rxd_info4.L4VLD))
1004 rx_skb->ip_summed = CHECKSUM_UNNECESSARY;
1005 else
1006 rx_skb->ip_summed = CHECKSUM_NONE;
1007
1008#if defined(CONFIG_RA_HW_NAT) || defined(CONFIG_RA_HW_NAT_MODULE)
1009 if (ppe_hook_rx_eth) {
1010 *(uint32_t *)(FOE_INFO_START_ADDR_HEAD(rx_skb)) =
1011 *(uint32_t *)&rx_ring->rxd_info4;
1012 *(uint32_t *)(FOE_INFO_START_ADDR_TAIL(rx_skb) + 2) =
1013 *(uint32_t *)&rx_ring->rxd_info4;
1014 FOE_ALG_HEAD(rx_skb) = 0;
1015 FOE_ALG_TAIL(rx_skb) = 0;
1016 FOE_MAGIC_TAG_HEAD(rx_skb) = FOE_MAGIC_GE;
1017 FOE_MAGIC_TAG_TAIL(rx_skb) = FOE_MAGIC_GE;
1018 FOE_TAG_PROTECT_HEAD(rx_skb) = TAG_PROTECT;
1019 FOE_TAG_PROTECT_TAIL(rx_skb) = TAG_PROTECT;
1020 }
1021#endif
1022 if (ei_local->features & FE_HW_VLAN_RX) {
1023 if (rx_ring->rxd_info2.TAG)
1024 __vlan_hwaccel_put_tag(rx_skb,
1025 htons(ETH_P_8021Q),
1026 rx_ring->rxd_info3.VID);
1027 }
1028/* ra_sw_nat_hook_rx return 1 --> continue
1029 * ra_sw_nat_hook_rx return 0 --> FWD & without netif_rx
1030 */
1031#if defined(CONFIG_RA_HW_NAT) || defined(CONFIG_RA_HW_NAT_MODULE)
1032 if ((!ppe_hook_rx_eth) ||
1033 (ppe_hook_rx_eth && ppe_hook_rx_eth(rx_skb))) {
1034#endif
1035 if (ei_local->features & FE_INT_NAPI) {
1036 /* napi_gro_receive(napi, rx_skb); */
1037 netif_receive_skb(rx_skb);
1038 } else {
1039 netif_rx(rx_skb);
1040 }
1041
1042#if defined(CONFIG_RA_HW_NAT) || defined(CONFIG_RA_HW_NAT_MODULE)
1043 }
1044#endif
1045
1046 if (rx_ring->rxd_info4.SP == 2) {
1047 p_ad->stat.rx_packets++;
1048 p_ad->stat.rx_bytes += length;
1049 } else {
1050 ei_local->stat.rx_packets++;
1051 ei_local->stat.rx_bytes += length;
1052 }
1053
1054 /* Init RX desc. */
1055 hw_rss_rx_desc_init(ei_local,
1056 rx_ring,
1057 rx_ring_no,
1058 dma_addr);
1059 ei_local->netrx_skb_data[rx_ring_no][rx_dma_owner_idx] =
1060 new_data;
1061
1062 /* make sure that all changes to the dma ring are flushed before
1063 * we continue
1064 */
1065 wmb();
1066
1067 sys_reg_write(RAETH_RX_CALC_IDX3, rx_dma_owner_idx);
1068 ei_local->rx_calc_idx[rx_ring_no] = rx_dma_owner_idx;
1069
1070 /* use prefetched variable */
1071 rx_dma_owner_idx = rx_dma_owner_idx_next;
1072 rx_ring_no = rx_ring_no_next;
1073 rx_ring = rx_ring_next;
1074 rx_data = rx_data_next;
1075 /* rx_calc_idx_reg = get_rx_cal_idx_reg(rx_ring_no); */
1076 } /* for */
1077
1078 return rx_processed;
1079
1080skb_err:
1081 /* rx packet from GE2 */
1082 if (rx_ring->rxd_info4.SP == 2)
1083 p_ad->stat.rx_dropped++;
1084 else
1085 ei_local->stat.rx_dropped++;
1086
1087 /* Discard the rx packet */
1088 hw_rss_rx_desc_init(ei_local,
1089 rx_ring,
1090 rx_ring_no,
1091 rx_ring->rxd_info1.PDP0);
1092 sys_reg_write(RAETH_RX_CALC_IDX3, rx_dma_owner_idx);
1093 ei_local->rx_calc_idx[rx_ring_no] = rx_dma_owner_idx;
1094
1095 return (budget + 1);
1096}
1097
1098int rx_rss_ring_read(struct seq_file *seq, void *v,
1099 struct PDMA_rxdesc *rx_ring_p)
1100{
1101 struct PDMA_rxdesc *rx_ring;
1102 int i = 0;
1103
1104 rx_ring =
1105 kmalloc(sizeof(struct PDMA_rxdesc) * NUM_RSS_RX_DESC, GFP_KERNEL);
1106 if (!rx_ring) {
1107 seq_puts(seq, " allocate temp rx_ring fail.\n");
1108 return 0;
1109 }
1110
1111 for (i = 0; i < NUM_RSS_RX_DESC; i++)
1112 memcpy(&rx_ring[i], &rx_ring_p[i], sizeof(struct PDMA_rxdesc));
1113
1114 for (i = 0; i < NUM_RSS_RX_DESC; i++) {
1115 seq_printf(seq, "%d: %08x %08x %08x %08x\n", i,
1116 *(int *)&rx_ring[i].rxd_info1,
1117 *(int *)&rx_ring[i].rxd_info2,
1118 *(int *)&rx_ring[i].rxd_info3,
1119 *(int *)&rx_ring[i].rxd_info4);
1120 }
1121
1122 kfree(rx_ring);
1123 return 0;
1124}
1125
1126int rss_ring1_read(struct seq_file *seq, void *v)
1127{
1128 struct END_DEVICE *ei_local = netdev_priv(dev_raether);
1129
1130 rx_rss_ring_read(seq, v, ei_local->rx_ring[1]);
1131
1132 return 0;
1133}
1134
1135int rss_ring2_read(struct seq_file *seq, void *v)
1136{
1137 struct END_DEVICE *ei_local = netdev_priv(dev_raether);
1138
1139 rx_rss_ring_read(seq, v, ei_local->rx_ring[2]);
1140
1141 return 0;
1142}
1143
1144int rss_ring3_read(struct seq_file *seq, void *v)
1145{
1146 struct END_DEVICE *ei_local = netdev_priv(dev_raether);
1147
1148 rx_rss_ring_read(seq, v, ei_local->rx_ring[3]);
1149
1150 return 0;
1151}
1152
1153static int rx_ring1_open(struct inode *inode, struct file *file)
1154{
1155 return single_open(file, rss_ring1_read, NULL);
1156}
1157
1158static int rx_ring2_open(struct inode *inode, struct file *file)
1159{
1160 return single_open(file, rss_ring2_read, NULL);
1161}
1162
1163static int rx_ring3_open(struct inode *inode, struct file *file)
1164{
1165 return single_open(file, rss_ring3_read, NULL);
1166}
1167
1168static const struct file_operations rss_ring1_fops = {
1169 .owner = THIS_MODULE,
1170 .open = rx_ring1_open,
1171 .read = seq_read,
1172 .llseek = seq_lseek,
1173 .release = single_release
1174};
1175
1176static const struct file_operations rss_ring2_fops = {
1177 .owner = THIS_MODULE,
1178 .open = rx_ring2_open,
1179 .read = seq_read,
1180 .llseek = seq_lseek,
1181 .release = single_release
1182};
1183
1184static const struct file_operations rss_ring3_fops = {
1185 .owner = THIS_MODULE,
1186 .open = rx_ring3_open,
1187 .read = seq_read,
1188 .llseek = seq_lseek,
1189 .release = single_release
1190};
1191
1192int rss_debug_proc_init(struct proc_dir_entry *proc_reg_dir)
1193{
1194 proc_rss_ring1 =
1195 proc_create(PROCREG_RXRING1, 0, proc_reg_dir, &rss_ring1_fops);
1196 if (!proc_rss_ring1)
1197 pr_info("!! FAIL to create %s PROC !!\n", PROCREG_RXRING1);
1198
1199 proc_rss_ring2 =
1200 proc_create(PROCREG_RXRING2, 0, proc_reg_dir, &rss_ring2_fops);
1201 if (!proc_rss_ring2)
1202 pr_info("!! FAIL to create %s PROC !!\n", PROCREG_RXRING2);
1203
1204 proc_rss_ring3 =
1205 proc_create(PROCREG_RXRING3, 0, proc_reg_dir, &rss_ring3_fops);
1206 if (!proc_rss_ring3)
1207 pr_info("!! FAIL to create %s PROC !!\n", PROCREG_RXRING3);
1208
1209 return 0;
1210}
1211EXPORT_SYMBOL(rss_debug_proc_init);
1212
1213void rss_debug_proc_exit(struct proc_dir_entry *proc_reg_dir)
1214{
1215 if (proc_rss_ring1)
1216 remove_proc_entry(PROCREG_RXRING1, proc_reg_dir);
1217 if (proc_rss_ring2)
1218 remove_proc_entry(PROCREG_RXRING2, proc_reg_dir);
1219 if (proc_rss_ring3)
1220 remove_proc_entry(PROCREG_RXRING3, proc_reg_dir);
1221}
1222EXPORT_SYMBOL(rss_debug_proc_exit);