GNU Linux-libre 6.8.9-gnu
[releases.git] / drivers / net / ethernet / marvell / prestera / prestera_rxtx.c
1 // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
2 /* Copyright (c) 2019-2020 Marvell International Ltd. All rights reserved */
3
4 #include <linux/bitfield.h>
5 #include <linux/dmapool.h>
6 #include <linux/etherdevice.h>
7 #include <linux/if_vlan.h>
8 #include <linux/platform_device.h>
9
10 #include "prestera_dsa.h"
11 #include "prestera.h"
12 #include "prestera_hw.h"
13 #include "prestera_rxtx.h"
14 #include "prestera_devlink.h"
15
16 #define PRESTERA_SDMA_WAIT_MUL          10
17
18 struct prestera_sdma_desc {
19         __le32 word1;
20         __le32 word2;
21         __le32 buff;
22         __le32 next;
23 } __packed __aligned(16);
24
25 #define PRESTERA_SDMA_BUFF_SIZE_MAX     1544
26
27 #define PRESTERA_SDMA_RX_DESC_PKT_LEN(desc) \
28         ((le32_to_cpu((desc)->word2) >> 16) & GENMASK(13, 0))
29
30 #define PRESTERA_SDMA_RX_DESC_OWNER(desc) \
31         ((le32_to_cpu((desc)->word1) & BIT(31)) >> 31)
32
33 #define PRESTERA_SDMA_RX_DESC_IS_RCVD(desc) \
34         (PRESTERA_SDMA_RX_DESC_OWNER(desc) == PRESTERA_SDMA_RX_DESC_CPU_OWN)
35
36 #define PRESTERA_SDMA_RX_DESC_CPU_OWN   0
37 #define PRESTERA_SDMA_RX_DESC_DMA_OWN   1
38
39 #define PRESTERA_SDMA_RX_QUEUE_NUM      8
40
41 #define PRESTERA_SDMA_RX_DESC_PER_Q     1000
42
43 #define PRESTERA_SDMA_TX_DESC_PER_Q     1000
44 #define PRESTERA_SDMA_TX_MAX_BURST      64
45
46 #define PRESTERA_SDMA_TX_DESC_OWNER(desc) \
47         ((le32_to_cpu((desc)->word1) & BIT(31)) >> 31)
48
49 #define PRESTERA_SDMA_TX_DESC_CPU_OWN   0
50 #define PRESTERA_SDMA_TX_DESC_DMA_OWN   1U
51
52 #define PRESTERA_SDMA_TX_DESC_IS_SENT(desc) \
53         (PRESTERA_SDMA_TX_DESC_OWNER(desc) == PRESTERA_SDMA_TX_DESC_CPU_OWN)
54
55 #define PRESTERA_SDMA_TX_DESC_LAST      BIT(20)
56 #define PRESTERA_SDMA_TX_DESC_FIRST     BIT(21)
57 #define PRESTERA_SDMA_TX_DESC_CALC_CRC  BIT(12)
58
59 #define PRESTERA_SDMA_TX_DESC_SINGLE    \
60         (PRESTERA_SDMA_TX_DESC_FIRST | PRESTERA_SDMA_TX_DESC_LAST)
61
62 #define PRESTERA_SDMA_TX_DESC_INIT      \
63         (PRESTERA_SDMA_TX_DESC_SINGLE | PRESTERA_SDMA_TX_DESC_CALC_CRC)
64
65 #define PRESTERA_SDMA_RX_INTR_MASK_REG          0x2814
66 #define PRESTERA_SDMA_RX_QUEUE_STATUS_REG       0x2680
67 #define PRESTERA_SDMA_RX_QUEUE_DESC_REG(n)      (0x260C + (n) * 16)
68
69 #define PRESTERA_SDMA_TX_QUEUE_DESC_REG         0x26C0
70 #define PRESTERA_SDMA_TX_QUEUE_START_REG        0x2868
71
72 struct prestera_sdma_buf {
73         struct prestera_sdma_desc *desc;
74         dma_addr_t desc_dma;
75         struct sk_buff *skb;
76         dma_addr_t buf_dma;
77         bool is_used;
78 };
79
80 struct prestera_rx_ring {
81         struct prestera_sdma_buf *bufs;
82         int next_rx;
83 };
84
85 struct prestera_tx_ring {
86         struct prestera_sdma_buf *bufs;
87         int next_tx;
88         int max_burst;
89         int burst;
90 };
91
92 struct prestera_sdma {
93         struct prestera_rx_ring rx_ring[PRESTERA_SDMA_RX_QUEUE_NUM];
94         struct prestera_tx_ring tx_ring;
95         struct prestera_switch *sw;
96         struct dma_pool *desc_pool;
97         struct work_struct tx_work;
98         struct napi_struct rx_napi;
99         struct net_device napi_dev;
100         u32 map_addr;
101         u64 dma_mask;
102         /* protect SDMA with concurrent access from multiple CPUs */
103         spinlock_t tx_lock;
104 };
105
106 struct prestera_rxtx {
107         struct prestera_sdma sdma;
108 };
109
110 static int prestera_sdma_buf_init(struct prestera_sdma *sdma,
111                                   struct prestera_sdma_buf *buf)
112 {
113         struct prestera_sdma_desc *desc;
114         dma_addr_t dma;
115
116         desc = dma_pool_alloc(sdma->desc_pool, GFP_DMA | GFP_KERNEL, &dma);
117         if (!desc)
118                 return -ENOMEM;
119
120         buf->buf_dma = DMA_MAPPING_ERROR;
121         buf->desc_dma = dma;
122         buf->desc = desc;
123         buf->skb = NULL;
124
125         return 0;
126 }
127
128 static u32 prestera_sdma_map(struct prestera_sdma *sdma, dma_addr_t pa)
129 {
130         return sdma->map_addr + pa;
131 }
132
133 static void prestera_sdma_rx_desc_init(struct prestera_sdma *sdma,
134                                        struct prestera_sdma_desc *desc,
135                                        dma_addr_t buf)
136 {
137         u32 word = le32_to_cpu(desc->word2);
138
139         u32p_replace_bits(&word, PRESTERA_SDMA_BUFF_SIZE_MAX, GENMASK(15, 0));
140         desc->word2 = cpu_to_le32(word);
141
142         desc->buff = cpu_to_le32(prestera_sdma_map(sdma, buf));
143
144         /* make sure buffer is set before reset the descriptor */
145         wmb();
146
147         desc->word1 = cpu_to_le32(0xA0000000);
148 }
149
150 static void prestera_sdma_rx_desc_set_next(struct prestera_sdma *sdma,
151                                            struct prestera_sdma_desc *desc,
152                                            dma_addr_t next)
153 {
154         desc->next = cpu_to_le32(prestera_sdma_map(sdma, next));
155 }
156
157 static int prestera_sdma_rx_skb_alloc(struct prestera_sdma *sdma,
158                                       struct prestera_sdma_buf *buf)
159 {
160         struct device *dev = sdma->sw->dev->dev;
161         struct sk_buff *skb;
162         dma_addr_t dma;
163
164         skb = alloc_skb(PRESTERA_SDMA_BUFF_SIZE_MAX, GFP_DMA | GFP_ATOMIC);
165         if (!skb)
166                 return -ENOMEM;
167
168         dma = dma_map_single(dev, skb->data, skb->len, DMA_FROM_DEVICE);
169         if (dma_mapping_error(dev, dma))
170                 goto err_dma_map;
171
172         if (buf->skb)
173                 dma_unmap_single(dev, buf->buf_dma, buf->skb->len,
174                                  DMA_FROM_DEVICE);
175
176         buf->buf_dma = dma;
177         buf->skb = skb;
178
179         return 0;
180
181 err_dma_map:
182         kfree_skb(skb);
183
184         return -ENOMEM;
185 }
186
187 static struct sk_buff *prestera_sdma_rx_skb_get(struct prestera_sdma *sdma,
188                                                 struct prestera_sdma_buf *buf)
189 {
190         dma_addr_t buf_dma = buf->buf_dma;
191         struct sk_buff *skb = buf->skb;
192         u32 len = skb->len;
193         int err;
194
195         err = prestera_sdma_rx_skb_alloc(sdma, buf);
196         if (err) {
197                 buf->buf_dma = buf_dma;
198                 buf->skb = skb;
199
200                 skb = alloc_skb(skb->len, GFP_ATOMIC);
201                 if (skb) {
202                         skb_put(skb, len);
203                         skb_copy_from_linear_data(buf->skb, skb->data, len);
204                 }
205         }
206
207         prestera_sdma_rx_desc_init(sdma, buf->desc, buf->buf_dma);
208
209         return skb;
210 }
211
212 static int prestera_rxtx_process_skb(struct prestera_sdma *sdma,
213                                      struct sk_buff *skb)
214 {
215         struct prestera_port *port;
216         struct prestera_dsa dsa;
217         u32 hw_port, dev_id;
218         u8 cpu_code;
219         int err;
220
221         skb_pull(skb, ETH_HLEN);
222
223         /* ethertype field is part of the dsa header */
224         err = prestera_dsa_parse(&dsa, skb->data - ETH_TLEN);
225         if (err)
226                 return err;
227
228         dev_id = dsa.hw_dev_num;
229         hw_port = dsa.port_num;
230
231         port = prestera_port_find_by_hwid(sdma->sw, dev_id, hw_port);
232         if (unlikely(!port)) {
233                 dev_warn_ratelimited(prestera_dev(sdma->sw), "received pkt for non-existent port(%u, %u)\n",
234                                      dev_id, hw_port);
235                 return -ENOENT;
236         }
237
238         if (unlikely(!pskb_may_pull(skb, PRESTERA_DSA_HLEN)))
239                 return -EINVAL;
240
241         /* remove DSA tag and update checksum */
242         skb_pull_rcsum(skb, PRESTERA_DSA_HLEN);
243
244         memmove(skb->data - ETH_HLEN, skb->data - ETH_HLEN - PRESTERA_DSA_HLEN,
245                 ETH_ALEN * 2);
246
247         skb_push(skb, ETH_HLEN);
248
249         skb->protocol = eth_type_trans(skb, port->dev);
250
251         if (dsa.vlan.is_tagged) {
252                 u16 tci = dsa.vlan.vid & VLAN_VID_MASK;
253
254                 tci |= dsa.vlan.vpt << VLAN_PRIO_SHIFT;
255                 if (dsa.vlan.cfi_bit)
256                         tci |= VLAN_CFI_MASK;
257
258                 __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), tci);
259         }
260
261         cpu_code = dsa.cpu_code;
262         prestera_devlink_trap_report(port, skb, cpu_code);
263
264         return 0;
265 }
266
267 static int prestera_sdma_next_rx_buf_idx(int buf_idx)
268 {
269         return (buf_idx + 1) % PRESTERA_SDMA_RX_DESC_PER_Q;
270 }
271
272 static int prestera_sdma_rx_poll(struct napi_struct *napi, int budget)
273 {
274         int qnum = PRESTERA_SDMA_RX_QUEUE_NUM;
275         unsigned int rxq_done_map = 0;
276         struct prestera_sdma *sdma;
277         struct list_head rx_list;
278         unsigned int qmask;
279         int pkts_done = 0;
280         int q;
281
282         qnum = PRESTERA_SDMA_RX_QUEUE_NUM;
283         qmask = GENMASK(qnum - 1, 0);
284
285         INIT_LIST_HEAD(&rx_list);
286
287         sdma = container_of(napi, struct prestera_sdma, rx_napi);
288
289         while (pkts_done < budget && rxq_done_map != qmask) {
290                 for (q = 0; q < qnum && pkts_done < budget; q++) {
291                         struct prestera_rx_ring *ring = &sdma->rx_ring[q];
292                         struct prestera_sdma_desc *desc;
293                         struct prestera_sdma_buf *buf;
294                         int buf_idx = ring->next_rx;
295                         struct sk_buff *skb;
296
297                         buf = &ring->bufs[buf_idx];
298                         desc = buf->desc;
299
300                         if (PRESTERA_SDMA_RX_DESC_IS_RCVD(desc)) {
301                                 rxq_done_map &= ~BIT(q);
302                         } else {
303                                 rxq_done_map |= BIT(q);
304                                 continue;
305                         }
306
307                         pkts_done++;
308
309                         __skb_trim(buf->skb, PRESTERA_SDMA_RX_DESC_PKT_LEN(desc));
310
311                         skb = prestera_sdma_rx_skb_get(sdma, buf);
312                         if (!skb)
313                                 goto rx_next_buf;
314
315                         if (unlikely(prestera_rxtx_process_skb(sdma, skb)))
316                                 goto rx_next_buf;
317
318                         list_add_tail(&skb->list, &rx_list);
319 rx_next_buf:
320                         ring->next_rx = prestera_sdma_next_rx_buf_idx(buf_idx);
321                 }
322         }
323
324         if (pkts_done < budget && napi_complete_done(napi, pkts_done))
325                 prestera_write(sdma->sw, PRESTERA_SDMA_RX_INTR_MASK_REG,
326                                GENMASK(9, 2));
327
328         netif_receive_skb_list(&rx_list);
329
330         return pkts_done;
331 }
332
333 static void prestera_sdma_rx_fini(struct prestera_sdma *sdma)
334 {
335         int qnum = PRESTERA_SDMA_RX_QUEUE_NUM;
336         int q, b;
337
338         /* disable all rx queues */
339         prestera_write(sdma->sw, PRESTERA_SDMA_RX_QUEUE_STATUS_REG,
340                        GENMASK(15, 8));
341
342         for (q = 0; q < qnum; q++) {
343                 struct prestera_rx_ring *ring = &sdma->rx_ring[q];
344
345                 if (!ring->bufs)
346                         break;
347
348                 for (b = 0; b < PRESTERA_SDMA_RX_DESC_PER_Q; b++) {
349                         struct prestera_sdma_buf *buf = &ring->bufs[b];
350
351                         if (buf->desc_dma)
352                                 dma_pool_free(sdma->desc_pool, buf->desc,
353                                               buf->desc_dma);
354
355                         if (!buf->skb)
356                                 continue;
357
358                         if (buf->buf_dma != DMA_MAPPING_ERROR)
359                                 dma_unmap_single(sdma->sw->dev->dev,
360                                                  buf->buf_dma, buf->skb->len,
361                                                  DMA_FROM_DEVICE);
362                         kfree_skb(buf->skb);
363                 }
364         }
365 }
366
367 static int prestera_sdma_rx_init(struct prestera_sdma *sdma)
368 {
369         int bnum = PRESTERA_SDMA_RX_DESC_PER_Q;
370         int qnum = PRESTERA_SDMA_RX_QUEUE_NUM;
371         int err;
372         int q;
373
374         /* disable all rx queues */
375         prestera_write(sdma->sw, PRESTERA_SDMA_RX_QUEUE_STATUS_REG,
376                        GENMASK(15, 8));
377
378         for (q = 0; q < qnum; q++) {
379                 struct prestera_sdma_buf *head, *tail, *next, *prev;
380                 struct prestera_rx_ring *ring = &sdma->rx_ring[q];
381
382                 ring->bufs = kmalloc_array(bnum, sizeof(*head), GFP_KERNEL);
383                 if (!ring->bufs)
384                         return -ENOMEM;
385
386                 ring->next_rx = 0;
387
388                 tail = &ring->bufs[bnum - 1];
389                 head = &ring->bufs[0];
390                 next = head;
391                 prev = next;
392
393                 do {
394                         err = prestera_sdma_buf_init(sdma, next);
395                         if (err)
396                                 return err;
397
398                         err = prestera_sdma_rx_skb_alloc(sdma, next);
399                         if (err)
400                                 return err;
401
402                         prestera_sdma_rx_desc_init(sdma, next->desc,
403                                                    next->buf_dma);
404
405                         prestera_sdma_rx_desc_set_next(sdma, prev->desc,
406                                                        next->desc_dma);
407
408                         prev = next;
409                         next++;
410                 } while (prev != tail);
411
412                 /* join tail with head to make a circular list */
413                 prestera_sdma_rx_desc_set_next(sdma, tail->desc, head->desc_dma);
414
415                 prestera_write(sdma->sw, PRESTERA_SDMA_RX_QUEUE_DESC_REG(q),
416                                prestera_sdma_map(sdma, head->desc_dma));
417         }
418
419         /* make sure all rx descs are filled before enabling all rx queues */
420         wmb();
421
422         prestera_write(sdma->sw, PRESTERA_SDMA_RX_QUEUE_STATUS_REG,
423                        GENMASK(7, 0));
424
425         return 0;
426 }
427
428 static void prestera_sdma_tx_desc_init(struct prestera_sdma *sdma,
429                                        struct prestera_sdma_desc *desc)
430 {
431         desc->word1 = cpu_to_le32(PRESTERA_SDMA_TX_DESC_INIT);
432         desc->word2 = 0;
433 }
434
435 static void prestera_sdma_tx_desc_set_next(struct prestera_sdma *sdma,
436                                            struct prestera_sdma_desc *desc,
437                                            dma_addr_t next)
438 {
439         desc->next = cpu_to_le32(prestera_sdma_map(sdma, next));
440 }
441
442 static void prestera_sdma_tx_desc_set_buf(struct prestera_sdma *sdma,
443                                           struct prestera_sdma_desc *desc,
444                                           dma_addr_t buf, size_t len)
445 {
446         u32 word = le32_to_cpu(desc->word2);
447
448         u32p_replace_bits(&word, len + ETH_FCS_LEN, GENMASK(30, 16));
449
450         desc->buff = cpu_to_le32(prestera_sdma_map(sdma, buf));
451         desc->word2 = cpu_to_le32(word);
452 }
453
454 static void prestera_sdma_tx_desc_xmit(struct prestera_sdma_desc *desc)
455 {
456         u32 word = le32_to_cpu(desc->word1);
457
458         word |= PRESTERA_SDMA_TX_DESC_DMA_OWN << 31;
459
460         /* make sure everything is written before enable xmit */
461         wmb();
462
463         desc->word1 = cpu_to_le32(word);
464 }
465
466 static int prestera_sdma_tx_buf_map(struct prestera_sdma *sdma,
467                                     struct prestera_sdma_buf *buf,
468                                     struct sk_buff *skb)
469 {
470         struct device *dma_dev = sdma->sw->dev->dev;
471         dma_addr_t dma;
472
473         dma = dma_map_single(dma_dev, skb->data, skb->len, DMA_TO_DEVICE);
474         if (dma_mapping_error(dma_dev, dma))
475                 return -ENOMEM;
476
477         buf->buf_dma = dma;
478         buf->skb = skb;
479
480         return 0;
481 }
482
483 static void prestera_sdma_tx_buf_unmap(struct prestera_sdma *sdma,
484                                        struct prestera_sdma_buf *buf)
485 {
486         struct device *dma_dev = sdma->sw->dev->dev;
487
488         dma_unmap_single(dma_dev, buf->buf_dma, buf->skb->len, DMA_TO_DEVICE);
489 }
490
491 static void prestera_sdma_tx_recycle_work_fn(struct work_struct *work)
492 {
493         int bnum = PRESTERA_SDMA_TX_DESC_PER_Q;
494         struct prestera_tx_ring *tx_ring;
495         struct prestera_sdma *sdma;
496         int b;
497
498         sdma = container_of(work, struct prestera_sdma, tx_work);
499
500         tx_ring = &sdma->tx_ring;
501
502         for (b = 0; b < bnum; b++) {
503                 struct prestera_sdma_buf *buf = &tx_ring->bufs[b];
504
505                 if (!buf->is_used)
506                         continue;
507
508                 if (!PRESTERA_SDMA_TX_DESC_IS_SENT(buf->desc))
509                         continue;
510
511                 prestera_sdma_tx_buf_unmap(sdma, buf);
512                 dev_consume_skb_any(buf->skb);
513                 buf->skb = NULL;
514
515                 /* make sure everything is cleaned up */
516                 wmb();
517
518                 buf->is_used = false;
519         }
520 }
521
522 static int prestera_sdma_tx_init(struct prestera_sdma *sdma)
523 {
524         struct prestera_sdma_buf *head, *tail, *next, *prev;
525         struct prestera_tx_ring *tx_ring = &sdma->tx_ring;
526         int bnum = PRESTERA_SDMA_TX_DESC_PER_Q;
527         int err;
528
529         INIT_WORK(&sdma->tx_work, prestera_sdma_tx_recycle_work_fn);
530         spin_lock_init(&sdma->tx_lock);
531
532         tx_ring->bufs = kmalloc_array(bnum, sizeof(*head), GFP_KERNEL);
533         if (!tx_ring->bufs)
534                 return -ENOMEM;
535
536         tail = &tx_ring->bufs[bnum - 1];
537         head = &tx_ring->bufs[0];
538         next = head;
539         prev = next;
540
541         tx_ring->max_burst = PRESTERA_SDMA_TX_MAX_BURST;
542         tx_ring->burst = tx_ring->max_burst;
543         tx_ring->next_tx = 0;
544
545         do {
546                 err = prestera_sdma_buf_init(sdma, next);
547                 if (err)
548                         return err;
549
550                 next->is_used = false;
551
552                 prestera_sdma_tx_desc_init(sdma, next->desc);
553
554                 prestera_sdma_tx_desc_set_next(sdma, prev->desc,
555                                                next->desc_dma);
556
557                 prev = next;
558                 next++;
559         } while (prev != tail);
560
561         /* join tail with head to make a circular list */
562         prestera_sdma_tx_desc_set_next(sdma, tail->desc, head->desc_dma);
563
564         /* make sure descriptors are written */
565         wmb();
566
567         prestera_write(sdma->sw, PRESTERA_SDMA_TX_QUEUE_DESC_REG,
568                        prestera_sdma_map(sdma, head->desc_dma));
569
570         return 0;
571 }
572
573 static void prestera_sdma_tx_fini(struct prestera_sdma *sdma)
574 {
575         struct prestera_tx_ring *ring = &sdma->tx_ring;
576         int bnum = PRESTERA_SDMA_TX_DESC_PER_Q;
577         int b;
578
579         cancel_work_sync(&sdma->tx_work);
580
581         if (!ring->bufs)
582                 return;
583
584         for (b = 0; b < bnum; b++) {
585                 struct prestera_sdma_buf *buf = &ring->bufs[b];
586
587                 if (buf->desc)
588                         dma_pool_free(sdma->desc_pool, buf->desc,
589                                       buf->desc_dma);
590
591                 if (!buf->skb)
592                         continue;
593
594                 dma_unmap_single(sdma->sw->dev->dev, buf->buf_dma,
595                                  buf->skb->len, DMA_TO_DEVICE);
596
597                 dev_consume_skb_any(buf->skb);
598         }
599 }
600
601 static void prestera_rxtx_handle_event(struct prestera_switch *sw,
602                                        struct prestera_event *evt,
603                                        void *arg)
604 {
605         struct prestera_sdma *sdma = arg;
606
607         if (evt->id != PRESTERA_RXTX_EVENT_RCV_PKT)
608                 return;
609
610         prestera_write(sdma->sw, PRESTERA_SDMA_RX_INTR_MASK_REG, 0);
611         napi_schedule(&sdma->rx_napi);
612 }
613
614 static int prestera_sdma_switch_init(struct prestera_switch *sw)
615 {
616         struct prestera_sdma *sdma = &sw->rxtx->sdma;
617         struct device *dev = sw->dev->dev;
618         struct prestera_rxtx_params p;
619         int err;
620
621         p.use_sdma = true;
622
623         err = prestera_hw_rxtx_init(sw, &p);
624         if (err) {
625                 dev_err(dev, "failed to init rxtx by hw\n");
626                 return err;
627         }
628
629         sdma->dma_mask = dma_get_mask(dev);
630         sdma->map_addr = p.map_addr;
631         sdma->sw = sw;
632
633         sdma->desc_pool = dma_pool_create("desc_pool", dev,
634                                           sizeof(struct prestera_sdma_desc),
635                                           16, 0);
636         if (!sdma->desc_pool)
637                 return -ENOMEM;
638
639         err = prestera_sdma_rx_init(sdma);
640         if (err) {
641                 dev_err(dev, "failed to init rx ring\n");
642                 goto err_rx_init;
643         }
644
645         err = prestera_sdma_tx_init(sdma);
646         if (err) {
647                 dev_err(dev, "failed to init tx ring\n");
648                 goto err_tx_init;
649         }
650
651         err = prestera_hw_event_handler_register(sw, PRESTERA_EVENT_TYPE_RXTX,
652                                                  prestera_rxtx_handle_event,
653                                                  sdma);
654         if (err)
655                 goto err_evt_register;
656
657         init_dummy_netdev(&sdma->napi_dev);
658
659         netif_napi_add(&sdma->napi_dev, &sdma->rx_napi, prestera_sdma_rx_poll);
660         napi_enable(&sdma->rx_napi);
661
662         return 0;
663
664 err_evt_register:
665 err_tx_init:
666         prestera_sdma_tx_fini(sdma);
667 err_rx_init:
668         prestera_sdma_rx_fini(sdma);
669
670         dma_pool_destroy(sdma->desc_pool);
671         return err;
672 }
673
674 static void prestera_sdma_switch_fini(struct prestera_switch *sw)
675 {
676         struct prestera_sdma *sdma = &sw->rxtx->sdma;
677
678         napi_disable(&sdma->rx_napi);
679         netif_napi_del(&sdma->rx_napi);
680         prestera_hw_event_handler_unregister(sw, PRESTERA_EVENT_TYPE_RXTX,
681                                              prestera_rxtx_handle_event);
682         prestera_sdma_tx_fini(sdma);
683         prestera_sdma_rx_fini(sdma);
684         dma_pool_destroy(sdma->desc_pool);
685 }
686
687 static bool prestera_sdma_is_ready(struct prestera_sdma *sdma)
688 {
689         return !(prestera_read(sdma->sw, PRESTERA_SDMA_TX_QUEUE_START_REG) & 1);
690 }
691
692 static int prestera_sdma_tx_wait(struct prestera_sdma *sdma,
693                                  struct prestera_tx_ring *tx_ring)
694 {
695         int tx_wait_num = PRESTERA_SDMA_WAIT_MUL * tx_ring->max_burst;
696
697         do {
698                 if (prestera_sdma_is_ready(sdma))
699                         return 0;
700
701                 udelay(1);
702         } while (--tx_wait_num);
703
704         return -EBUSY;
705 }
706
707 static void prestera_sdma_tx_start(struct prestera_sdma *sdma)
708 {
709         prestera_write(sdma->sw, PRESTERA_SDMA_TX_QUEUE_START_REG, 1);
710         schedule_work(&sdma->tx_work);
711 }
712
713 static netdev_tx_t prestera_sdma_xmit(struct prestera_sdma *sdma,
714                                       struct sk_buff *skb)
715 {
716         struct device *dma_dev = sdma->sw->dev->dev;
717         struct net_device *dev = skb->dev;
718         struct prestera_tx_ring *tx_ring;
719         struct prestera_sdma_buf *buf;
720         int err;
721
722         spin_lock(&sdma->tx_lock);
723
724         tx_ring = &sdma->tx_ring;
725
726         buf = &tx_ring->bufs[tx_ring->next_tx];
727         if (buf->is_used) {
728                 schedule_work(&sdma->tx_work);
729                 goto drop_skb;
730         }
731
732         if (unlikely(eth_skb_pad(skb)))
733                 goto drop_skb_nofree;
734
735         err = prestera_sdma_tx_buf_map(sdma, buf, skb);
736         if (err)
737                 goto drop_skb;
738
739         prestera_sdma_tx_desc_set_buf(sdma, buf->desc, buf->buf_dma, skb->len);
740
741         dma_sync_single_for_device(dma_dev, buf->buf_dma, skb->len,
742                                    DMA_TO_DEVICE);
743
744         if (tx_ring->burst) {
745                 tx_ring->burst--;
746         } else {
747                 tx_ring->burst = tx_ring->max_burst;
748
749                 err = prestera_sdma_tx_wait(sdma, tx_ring);
750                 if (err)
751                         goto drop_skb_unmap;
752         }
753
754         tx_ring->next_tx = (tx_ring->next_tx + 1) % PRESTERA_SDMA_TX_DESC_PER_Q;
755         prestera_sdma_tx_desc_xmit(buf->desc);
756         buf->is_used = true;
757
758         prestera_sdma_tx_start(sdma);
759
760         goto tx_done;
761
762 drop_skb_unmap:
763         prestera_sdma_tx_buf_unmap(sdma, buf);
764 drop_skb:
765         dev_consume_skb_any(skb);
766 drop_skb_nofree:
767         dev->stats.tx_dropped++;
768 tx_done:
769         spin_unlock(&sdma->tx_lock);
770         return NETDEV_TX_OK;
771 }
772
773 int prestera_rxtx_switch_init(struct prestera_switch *sw)
774 {
775         struct prestera_rxtx *rxtx;
776         int err;
777
778         rxtx = kzalloc(sizeof(*rxtx), GFP_KERNEL);
779         if (!rxtx)
780                 return -ENOMEM;
781
782         sw->rxtx = rxtx;
783
784         err = prestera_sdma_switch_init(sw);
785         if (err)
786                 kfree(rxtx);
787
788         return err;
789 }
790
791 void prestera_rxtx_switch_fini(struct prestera_switch *sw)
792 {
793         prestera_sdma_switch_fini(sw);
794         kfree(sw->rxtx);
795 }
796
797 int prestera_rxtx_port_init(struct prestera_port *port)
798 {
799         port->dev->needed_headroom = PRESTERA_DSA_HLEN;
800         return 0;
801 }
802
803 netdev_tx_t prestera_rxtx_xmit(struct prestera_port *port, struct sk_buff *skb)
804 {
805         struct prestera_dsa dsa;
806
807         dsa.hw_dev_num = port->dev_id;
808         dsa.port_num = port->hw_id;
809
810         if (skb_cow_head(skb, PRESTERA_DSA_HLEN) < 0)
811                 return NET_XMIT_DROP;
812
813         skb_push(skb, PRESTERA_DSA_HLEN);
814         memmove(skb->data, skb->data + PRESTERA_DSA_HLEN, 2 * ETH_ALEN);
815
816         if (prestera_dsa_build(&dsa, skb->data + 2 * ETH_ALEN) != 0)
817                 return NET_XMIT_DROP;
818
819         return prestera_sdma_xmit(&port->sw->rxtx->sdma, skb);
820 }