1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35#include <linux/skbuff.h>
36#include <linux/netdevice.h>
37#include <linux/etherdevice.h>
38#include <linux/if_vlan.h>
39#include <linux/ip.h>
40#include <linux/dma-mapping.h>
41#include <linux/jiffies.h>
42#include <linux/prefetch.h>
43#include <linux/export.h>
44#include <net/xfrm.h>
45#include <net/ipv6.h>
46#include <net/tcp.h>
47#include <net/busy_poll.h>
48#ifdef CONFIG_CHELSIO_T4_FCOE
49#include <scsi/fc/fc_fcoe.h>
50#endif
51#include "cxgb4.h"
52#include "t4_regs.h"
53#include "t4_values.h"
54#include "t4_msg.h"
55#include "t4fw_api.h"
56#include "cxgb4_ptp.h"
57#include "cxgb4_uld.h"
58#include "cxgb4_tc_mqprio.h"
59#include "sched.h"
60
61
62
63
64
65#if PAGE_SHIFT >= 16
66# define FL_PG_ORDER 0
67#else
68# define FL_PG_ORDER (16 - PAGE_SHIFT)
69#endif
70
71
72#define RX_COPY_THRES 256
73#define RX_PULL_LEN 128
74
75
76
77
78
79#define RX_PKT_SKB_LEN 512
80
81
82
83
84
85
86
87
88#define MAX_TX_RECLAIM 32
89
90
91
92
93
94#define MAX_RX_REFILL 16U
95
96
97
98
99
100#define RX_QCHECK_PERIOD (HZ / 2)
101
102
103
104
105#define TX_QCHECK_PERIOD (HZ / 2)
106
107
108
109
110#define MAX_TIMER_TX_RECLAIM 100
111
112
113
114
115#define NOMEM_TMR_IDX (SGE_NTIMERS - 1)
116
117
118
119
120
121#define TXQ_STOP_THRES (SGE_MAX_WR_LEN / sizeof(struct tx_desc))
122
123
124
125
126
127#define MAX_IMM_TX_PKT_LEN 256
128
129
130
131
132#define MAX_CTRL_WR_LEN SGE_MAX_WR_LEN
133
134struct rx_sw_desc {
135 struct page *page;
136 dma_addr_t dma_addr;
137};
138
139
140
141
142
143
144
145#define FL_MTU_SMALL 1500
146#define FL_MTU_LARGE 9000
147
148static inline unsigned int fl_mtu_bufsize(struct adapter *adapter,
149 unsigned int mtu)
150{
151 struct sge *s = &adapter->sge;
152
153 return ALIGN(s->pktshift + ETH_HLEN + VLAN_HLEN + mtu, s->fl_align);
154}
155
156#define FL_MTU_SMALL_BUFSIZE(adapter) fl_mtu_bufsize(adapter, FL_MTU_SMALL)
157#define FL_MTU_LARGE_BUFSIZE(adapter) fl_mtu_bufsize(adapter, FL_MTU_LARGE)
158
159
160
161
162
163
164
165
166
167
168
169enum {
170 RX_BUF_FLAGS = 0x1f,
171 RX_BUF_SIZE = 0x0f,
172 RX_UNMAPPED_BUF = 0x10,
173
174
175
176
177
178
179
180
181 RX_SMALL_PG_BUF = 0x0,
182 RX_LARGE_PG_BUF = 0x1,
183
184 RX_SMALL_MTU_BUF = 0x2,
185 RX_LARGE_MTU_BUF = 0x3,
186};
187
188static int timer_pkt_quota[] = {1, 1, 2, 3, 4, 5};
189#define MIN_NAPI_WORK 1
190
191static inline dma_addr_t get_buf_addr(const struct rx_sw_desc *d)
192{
193 return d->dma_addr & ~(dma_addr_t)RX_BUF_FLAGS;
194}
195
196static inline bool is_buf_mapped(const struct rx_sw_desc *d)
197{
198 return !(d->dma_addr & RX_UNMAPPED_BUF);
199}
200
201
202
203
204
205
206
207
208static inline unsigned int txq_avail(const struct sge_txq *q)
209{
210 return q->size - 1 - q->in_use;
211}
212
213
214
215
216
217
218
219
220
221static inline unsigned int fl_cap(const struct sge_fl *fl)
222{
223 return fl->size - 8;
224}
225
226
227
228
229
230
231
232
233
234
235static inline bool fl_starving(const struct adapter *adapter,
236 const struct sge_fl *fl)
237{
238 const struct sge *s = &adapter->sge;
239
240 return fl->avail - fl->pend_cred <= s->fl_starve_thres;
241}
242
243int cxgb4_map_skb(struct device *dev, const struct sk_buff *skb,
244 dma_addr_t *addr)
245{
246 const skb_frag_t *fp, *end;
247 const struct skb_shared_info *si;
248
249 *addr = dma_map_single(dev, skb->data, skb_headlen(skb), DMA_TO_DEVICE);
250 if (dma_mapping_error(dev, *addr))
251 goto out_err;
252
253 si = skb_shinfo(skb);
254 end = &si->frags[si->nr_frags];
255
256 for (fp = si->frags; fp < end; fp++) {
257 *++addr = skb_frag_dma_map(dev, fp, 0, skb_frag_size(fp),
258 DMA_TO_DEVICE);
259 if (dma_mapping_error(dev, *addr))
260 goto unwind;
261 }
262 return 0;
263
264unwind:
265 while (fp-- > si->frags)
266 dma_unmap_page(dev, *--addr, skb_frag_size(fp), DMA_TO_DEVICE);
267
268 dma_unmap_single(dev, addr[-1], skb_headlen(skb), DMA_TO_DEVICE);
269out_err:
270 return -ENOMEM;
271}
272EXPORT_SYMBOL(cxgb4_map_skb);
273
274static void unmap_skb(struct device *dev, const struct sk_buff *skb,
275 const dma_addr_t *addr)
276{
277 const skb_frag_t *fp, *end;
278 const struct skb_shared_info *si;
279
280 dma_unmap_single(dev, *addr++, skb_headlen(skb), DMA_TO_DEVICE);
281
282 si = skb_shinfo(skb);
283 end = &si->frags[si->nr_frags];
284 for (fp = si->frags; fp < end; fp++)
285 dma_unmap_page(dev, *addr++, skb_frag_size(fp), DMA_TO_DEVICE);
286}
287
288#ifdef CONFIG_NEED_DMA_MAP_STATE
289
290
291
292
293
294
295
296
297static void deferred_unmap_destructor(struct sk_buff *skb)
298{
299 unmap_skb(skb->dev->dev.parent, skb, (dma_addr_t *)skb->head);
300}
301#endif
302
303
304
305
306
307
308
309
310
311
312
313void free_tx_desc(struct adapter *adap, struct sge_txq *q,
314 unsigned int n, bool unmap)
315{
316 unsigned int cidx = q->cidx;
317 struct tx_sw_desc *d;
318
319 d = &q->sdesc[cidx];
320 while (n--) {
321 if (d->skb) {
322 if (unmap && d->addr[0]) {
323 unmap_skb(adap->pdev_dev, d->skb, d->addr);
324 memset(d->addr, 0, sizeof(d->addr));
325 }
326 dev_consume_skb_any(d->skb);
327 d->skb = NULL;
328 }
329 ++d;
330 if (++cidx == q->size) {
331 cidx = 0;
332 d = q->sdesc;
333 }
334 }
335 q->cidx = cidx;
336}
337
338
339
340
341static inline int reclaimable(const struct sge_txq *q)
342{
343 int hw_cidx = ntohs(READ_ONCE(q->stat->cidx));
344 hw_cidx -= q->cidx;
345 return hw_cidx < 0 ? hw_cidx + q->size : hw_cidx;
346}
347
348
349
350
351
352
353
354
355
356
357
358
359static inline int reclaim_completed_tx(struct adapter *adap, struct sge_txq *q,
360 int maxreclaim, bool unmap)
361{
362 int reclaim = reclaimable(q);
363
364 if (reclaim) {
365
366
367
368
369 if (maxreclaim < 0)
370 maxreclaim = MAX_TX_RECLAIM;
371 if (reclaim > maxreclaim)
372 reclaim = maxreclaim;
373
374 free_tx_desc(adap, q, reclaim, unmap);
375 q->in_use -= reclaim;
376 }
377
378 return reclaim;
379}
380
381
382
383
384
385
386
387
388
389
390
391void cxgb4_reclaim_completed_tx(struct adapter *adap, struct sge_txq *q,
392 bool unmap)
393{
394 (void)reclaim_completed_tx(adap, q, -1, unmap);
395}
396EXPORT_SYMBOL(cxgb4_reclaim_completed_tx);
397
398static inline int get_buf_size(struct adapter *adapter,
399 const struct rx_sw_desc *d)
400{
401 struct sge *s = &adapter->sge;
402 unsigned int rx_buf_size_idx = d->dma_addr & RX_BUF_SIZE;
403 int buf_size;
404
405 switch (rx_buf_size_idx) {
406 case RX_SMALL_PG_BUF:
407 buf_size = PAGE_SIZE;
408 break;
409
410 case RX_LARGE_PG_BUF:
411 buf_size = PAGE_SIZE << s->fl_pg_order;
412 break;
413
414 case RX_SMALL_MTU_BUF:
415 buf_size = FL_MTU_SMALL_BUFSIZE(adapter);
416 break;
417
418 case RX_LARGE_MTU_BUF:
419 buf_size = FL_MTU_LARGE_BUFSIZE(adapter);
420 break;
421
422 default:
423 BUG();
424 }
425
426 return buf_size;
427}
428
429
430
431
432
433
434
435
436
437
438static void free_rx_bufs(struct adapter *adap, struct sge_fl *q, int n)
439{
440 while (n--) {
441 struct rx_sw_desc *d = &q->sdesc[q->cidx];
442
443 if (is_buf_mapped(d))
444 dma_unmap_page(adap->pdev_dev, get_buf_addr(d),
445 get_buf_size(adap, d),
446 DMA_FROM_DEVICE);
447 put_page(d->page);
448 d->page = NULL;
449 if (++q->cidx == q->size)
450 q->cidx = 0;
451 q->avail--;
452 }
453}
454
455
456
457
458
459
460
461
462
463
464
465
466static void unmap_rx_buf(struct adapter *adap, struct sge_fl *q)
467{
468 struct rx_sw_desc *d = &q->sdesc[q->cidx];
469
470 if (is_buf_mapped(d))
471 dma_unmap_page(adap->pdev_dev, get_buf_addr(d),
472 get_buf_size(adap, d), DMA_FROM_DEVICE);
473 d->page = NULL;
474 if (++q->cidx == q->size)
475 q->cidx = 0;
476 q->avail--;
477}
478
479static inline void ring_fl_db(struct adapter *adap, struct sge_fl *q)
480{
481 if (q->pend_cred >= 8) {
482 u32 val = adap->params.arch.sge_fl_db;
483
484 if (is_t4(adap->params.chip))
485 val |= PIDX_V(q->pend_cred / 8);
486 else
487 val |= PIDX_T5_V(q->pend_cred / 8);
488
489
490
491
492 wmb();
493
494
495
496
497
498 if (unlikely(q->bar2_addr == NULL)) {
499 t4_write_reg(adap, MYPF_REG(SGE_PF_KDOORBELL_A),
500 val | QID_V(q->cntxt_id));
501 } else {
502 writel(val | QID_V(q->bar2_qid),
503 q->bar2_addr + SGE_UDB_KDOORBELL);
504
505
506
507
508 wmb();
509 }
510 q->pend_cred &= 7;
511 }
512}
513
514static inline void set_rx_sw_desc(struct rx_sw_desc *sd, struct page *pg,
515 dma_addr_t mapping)
516{
517 sd->page = pg;
518 sd->dma_addr = mapping;
519}
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535static unsigned int refill_fl(struct adapter *adap, struct sge_fl *q, int n,
536 gfp_t gfp)
537{
538 struct sge *s = &adap->sge;
539 struct page *pg;
540 dma_addr_t mapping;
541 unsigned int cred = q->avail;
542 __be64 *d = &q->desc[q->pidx];
543 struct rx_sw_desc *sd = &q->sdesc[q->pidx];
544 int node;
545
546#ifdef CONFIG_DEBUG_FS
547 if (test_bit(q->cntxt_id - adap->sge.egr_start, adap->sge.blocked_fl))
548 goto out;
549#endif
550
551 gfp |= __GFP_NOWARN;
552 node = dev_to_node(adap->pdev_dev);
553
554 if (s->fl_pg_order == 0)
555 goto alloc_small_pages;
556
557
558
559
560 while (n) {
561 pg = alloc_pages_node(node, gfp | __GFP_COMP, s->fl_pg_order);
562 if (unlikely(!pg)) {
563 q->large_alloc_failed++;
564 break;
565 }
566
567 mapping = dma_map_page(adap->pdev_dev, pg, 0,
568 PAGE_SIZE << s->fl_pg_order,
569 DMA_FROM_DEVICE);
570 if (unlikely(dma_mapping_error(adap->pdev_dev, mapping))) {
571 __free_pages(pg, s->fl_pg_order);
572 q->mapping_err++;
573 goto out;
574 }
575 mapping |= RX_LARGE_PG_BUF;
576 *d++ = cpu_to_be64(mapping);
577
578 set_rx_sw_desc(sd, pg, mapping);
579 sd++;
580
581 q->avail++;
582 if (++q->pidx == q->size) {
583 q->pidx = 0;
584 sd = q->sdesc;
585 d = q->desc;
586 }
587 n--;
588 }
589
590alloc_small_pages:
591 while (n--) {
592 pg = alloc_pages_node(node, gfp, 0);
593 if (unlikely(!pg)) {
594 q->alloc_failed++;
595 break;
596 }
597
598 mapping = dma_map_page(adap->pdev_dev, pg, 0, PAGE_SIZE,
599 DMA_FROM_DEVICE);
600 if (unlikely(dma_mapping_error(adap->pdev_dev, mapping))) {
601 put_page(pg);
602 q->mapping_err++;
603 goto out;
604 }
605 *d++ = cpu_to_be64(mapping);
606
607 set_rx_sw_desc(sd, pg, mapping);
608 sd++;
609
610 q->avail++;
611 if (++q->pidx == q->size) {
612 q->pidx = 0;
613 sd = q->sdesc;
614 d = q->desc;
615 }
616 }
617
618out: cred = q->avail - cred;
619 q->pend_cred += cred;
620 ring_fl_db(adap, q);
621
622 if (unlikely(fl_starving(adap, q))) {
623 smp_wmb();
624 q->low++;
625 set_bit(q->cntxt_id - adap->sge.egr_start,
626 adap->sge.starving_fl);
627 }
628
629 return cred;
630}
631
632static inline void __refill_fl(struct adapter *adap, struct sge_fl *fl)
633{
634 refill_fl(adap, fl, min(MAX_RX_REFILL, fl_cap(fl) - fl->avail),
635 GFP_ATOMIC);
636}
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657static void *alloc_ring(struct device *dev, size_t nelem, size_t elem_size,
658 size_t sw_size, dma_addr_t *phys, void *metadata,
659 size_t stat_size, int node)
660{
661 size_t len = nelem * elem_size + stat_size;
662 void *s = NULL;
663 void *p = dma_alloc_coherent(dev, len, phys, GFP_KERNEL);
664
665 if (!p)
666 return NULL;
667 if (sw_size) {
668 s = kcalloc_node(sw_size, nelem, GFP_KERNEL, node);
669
670 if (!s) {
671 dma_free_coherent(dev, len, p, *phys);
672 return NULL;
673 }
674 }
675 if (metadata)
676 *(void **)metadata = s;
677 return p;
678}
679
680
681
682
683
684
685
686
687static inline unsigned int sgl_len(unsigned int n)
688{
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705 n--;
706 return (3 * n) / 2 + (n & 1) + 2;
707}
708
709
710
711
712
713
714
715
716static inline unsigned int flits_to_desc(unsigned int n)
717{
718 BUG_ON(n > SGE_MAX_WR_LEN / 8);
719 return DIV_ROUND_UP(n, 8);
720}
721
722
723
724
725
726
727
728
729
730static inline int is_eth_imm(const struct sk_buff *skb, unsigned int chip_ver)
731{
732 int hdrlen = 0;
733
734 if (skb->encapsulation && skb_shinfo(skb)->gso_size &&
735 chip_ver > CHELSIO_T5) {
736 hdrlen = sizeof(struct cpl_tx_tnl_lso);
737 hdrlen += sizeof(struct cpl_tx_pkt_core);
738 } else if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4) {
739 return 0;
740 } else {
741 hdrlen = skb_shinfo(skb)->gso_size ?
742 sizeof(struct cpl_tx_pkt_lso_core) : 0;
743 hdrlen += sizeof(struct cpl_tx_pkt);
744 }
745 if (skb->len <= MAX_IMM_TX_PKT_LEN - hdrlen)
746 return hdrlen;
747 return 0;
748}
749
750
751
752
753
754
755
756
757
758static inline unsigned int calc_tx_flits(const struct sk_buff *skb,
759 unsigned int chip_ver)
760{
761 unsigned int flits;
762 int hdrlen = is_eth_imm(skb, chip_ver);
763
764
765
766
767
768
769 if (hdrlen)
770 return DIV_ROUND_UP(skb->len + hdrlen, sizeof(__be64));
771
772
773
774
775
776
777
778
779
780 flits = sgl_len(skb_shinfo(skb)->nr_frags + 1);
781 if (skb_shinfo(skb)->gso_size) {
782 if (skb->encapsulation && chip_ver > CHELSIO_T5) {
783 hdrlen = sizeof(struct fw_eth_tx_pkt_wr) +
784 sizeof(struct cpl_tx_tnl_lso);
785 } else if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4) {
786 u32 pkt_hdrlen;
787
788 pkt_hdrlen = eth_get_headlen(skb->dev, skb->data,
789 skb_headlen(skb));
790 hdrlen = sizeof(struct fw_eth_tx_eo_wr) +
791 round_up(pkt_hdrlen, 16);
792 } else {
793 hdrlen = sizeof(struct fw_eth_tx_pkt_wr) +
794 sizeof(struct cpl_tx_pkt_lso_core);
795 }
796
797 hdrlen += sizeof(struct cpl_tx_pkt_core);
798 flits += (hdrlen / sizeof(__be64));
799 } else {
800 flits += (sizeof(struct fw_eth_tx_pkt_wr) +
801 sizeof(struct cpl_tx_pkt_core)) / sizeof(__be64);
802 }
803 return flits;
804}
805
806
807
808
809
810
811
812
813
814static inline unsigned int calc_tx_descs(const struct sk_buff *skb,
815 unsigned int chip_ver)
816{
817 return flits_to_desc(calc_tx_flits(skb, chip_ver));
818}
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837void cxgb4_write_sgl(const struct sk_buff *skb, struct sge_txq *q,
838 struct ulptx_sgl *sgl, u64 *end, unsigned int start,
839 const dma_addr_t *addr)
840{
841 unsigned int i, len;
842 struct ulptx_sge_pair *to;
843 const struct skb_shared_info *si = skb_shinfo(skb);
844 unsigned int nfrags = si->nr_frags;
845 struct ulptx_sge_pair buf[MAX_SKB_FRAGS / 2 + 1];
846
847 len = skb_headlen(skb) - start;
848 if (likely(len)) {
849 sgl->len0 = htonl(len);
850 sgl->addr0 = cpu_to_be64(addr[0] + start);
851 nfrags++;
852 } else {
853 sgl->len0 = htonl(skb_frag_size(&si->frags[0]));
854 sgl->addr0 = cpu_to_be64(addr[1]);
855 }
856
857 sgl->cmd_nsge = htonl(ULPTX_CMD_V(ULP_TX_SC_DSGL) |
858 ULPTX_NSGE_V(nfrags));
859 if (likely(--nfrags == 0))
860 return;
861
862
863
864
865
866 to = (u8 *)end > (u8 *)q->stat ? buf : sgl->sge;
867
868 for (i = (nfrags != si->nr_frags); nfrags >= 2; nfrags -= 2, to++) {
869 to->len[0] = cpu_to_be32(skb_frag_size(&si->frags[i]));
870 to->len[1] = cpu_to_be32(skb_frag_size(&si->frags[++i]));
871 to->addr[0] = cpu_to_be64(addr[i]);
872 to->addr[1] = cpu_to_be64(addr[++i]);
873 }
874 if (nfrags) {
875 to->len[0] = cpu_to_be32(skb_frag_size(&si->frags[i]));
876 to->len[1] = cpu_to_be32(0);
877 to->addr[0] = cpu_to_be64(addr[i + 1]);
878 }
879 if (unlikely((u8 *)end > (u8 *)q->stat)) {
880 unsigned int part0 = (u8 *)q->stat - (u8 *)sgl->sge, part1;
881
882 if (likely(part0))
883 memcpy(sgl->sge, buf, part0);
884 part1 = (u8 *)end - (u8 *)q->stat;
885 memcpy(q->desc, (u8 *)buf + part0, part1);
886 end = (void *)q->desc + part1;
887 }
888 if ((uintptr_t)end & 8)
889 *end = 0;
890}
891EXPORT_SYMBOL(cxgb4_write_sgl);
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906void cxgb4_write_partial_sgl(const struct sk_buff *skb, struct sge_txq *q,
907 struct ulptx_sgl *sgl, u64 *end,
908 const dma_addr_t *addr, u32 start, u32 len)
909{
910 struct ulptx_sge_pair buf[MAX_SKB_FRAGS / 2 + 1] = {0}, *to;
911 u32 frag_size, skb_linear_data_len = skb_headlen(skb);
912 struct skb_shared_info *si = skb_shinfo(skb);
913 u8 i = 0, frag_idx = 0, nfrags = 0;
914 skb_frag_t *frag;
915
916
917
918
919 if (unlikely(start < skb_linear_data_len)) {
920 frag_size = min(len, skb_linear_data_len - start);
921 sgl->len0 = htonl(frag_size);
922 sgl->addr0 = cpu_to_be64(addr[0] + start);
923 len -= frag_size;
924 nfrags++;
925 } else {
926 start -= skb_linear_data_len;
927 frag = &si->frags[frag_idx];
928 frag_size = skb_frag_size(frag);
929
930 while (start >= frag_size) {
931 start -= frag_size;
932 frag_idx++;
933 frag = &si->frags[frag_idx];
934 frag_size = skb_frag_size(frag);
935 }
936
937 frag_size = min(len, skb_frag_size(frag) - start);
938 sgl->len0 = cpu_to_be32(frag_size);
939 sgl->addr0 = cpu_to_be64(addr[frag_idx + 1] + start);
940 len -= frag_size;
941 nfrags++;
942 frag_idx++;
943 }
944
945
946
947
948 if (!len)
949 goto done;
950
951
952
953
954
955 to = (u8 *)end > (u8 *)q->stat ? buf : sgl->sge;
956
957
958
959
960
961 while (len) {
962 frag_size = min(len, skb_frag_size(&si->frags[frag_idx]));
963 to->len[i & 1] = cpu_to_be32(frag_size);
964 to->addr[i & 1] = cpu_to_be64(addr[frag_idx + 1]);
965 if (i && (i & 1))
966 to++;
967 nfrags++;
968 frag_idx++;
969 i++;
970 len -= frag_size;
971 }
972
973
974
975
976 if (i & 1)
977 to->len[1] = cpu_to_be32(0);
978
979
980
981
982 if (unlikely((u8 *)end > (u8 *)q->stat)) {
983 u32 part0 = (u8 *)q->stat - (u8 *)sgl->sge, part1;
984
985 if (likely(part0))
986 memcpy(sgl->sge, buf, part0);
987 part1 = (u8 *)end - (u8 *)q->stat;
988 memcpy(q->desc, (u8 *)buf + part0, part1);
989 end = (void *)q->desc + part1;
990 }
991
992
993 if ((uintptr_t)end & 8)
994 *end = 0;
995done:
996 sgl->cmd_nsge = htonl(ULPTX_CMD_V(ULP_TX_SC_DSGL) |
997 ULPTX_NSGE_V(nfrags));
998}
999EXPORT_SYMBOL(cxgb4_write_partial_sgl);
1000
1001
1002
1003
1004
1005static void cxgb_pio_copy(u64 __iomem *dst, u64 *src)
1006{
1007 int count = 8;
1008
1009 while (count) {
1010 writeq(*src, dst);
1011 src++;
1012 dst++;
1013 count--;
1014 }
1015}
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025inline void cxgb4_ring_tx_db(struct adapter *adap, struct sge_txq *q, int n)
1026{
1027
1028
1029
1030 wmb();
1031
1032
1033
1034
1035 if (unlikely(q->bar2_addr == NULL)) {
1036 u32 val = PIDX_V(n);
1037 unsigned long flags;
1038
1039
1040
1041
1042 spin_lock_irqsave(&q->db_lock, flags);
1043 if (!q->db_disabled)
1044 t4_write_reg(adap, MYPF_REG(SGE_PF_KDOORBELL_A),
1045 QID_V(q->cntxt_id) | val);
1046 else
1047 q->db_pidx_inc += n;
1048 q->db_pidx = q->pidx;
1049 spin_unlock_irqrestore(&q->db_lock, flags);
1050 } else {
1051 u32 val = PIDX_T5_V(n);
1052
1053
1054
1055
1056
1057
1058
1059 WARN_ON(val & DBPRIO_F);
1060
1061
1062
1063
1064
1065 if (n == 1 && q->bar2_qid == 0) {
1066 int index = (q->pidx
1067 ? (q->pidx - 1)
1068 : (q->size - 1));
1069 u64 *wr = (u64 *)&q->desc[index];
1070
1071 cxgb_pio_copy((u64 __iomem *)
1072 (q->bar2_addr + SGE_UDB_WCDOORBELL),
1073 wr);
1074 } else {
1075 writel(val | QID_V(q->bar2_qid),
1076 q->bar2_addr + SGE_UDB_KDOORBELL);
1077 }
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089 wmb();
1090 }
1091}
1092EXPORT_SYMBOL(cxgb4_ring_tx_db);
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105void cxgb4_inline_tx_skb(const struct sk_buff *skb,
1106 const struct sge_txq *q, void *pos)
1107{
1108 int left = (void *)q->stat - pos;
1109 u64 *p;
1110
1111 if (likely(skb->len <= left)) {
1112 if (likely(!skb->data_len))
1113 skb_copy_from_linear_data(skb, pos, skb->len);
1114 else
1115 skb_copy_bits(skb, 0, pos, skb->len);
1116 pos += skb->len;
1117 } else {
1118 skb_copy_bits(skb, 0, pos, left);
1119 skb_copy_bits(skb, left, q->desc, skb->len - left);
1120 pos = (void *)q->desc + (skb->len - left);
1121 }
1122
1123
1124 p = PTR_ALIGN(pos, 8);
1125 if ((uintptr_t)p & 8)
1126 *p = 0;
1127}
1128EXPORT_SYMBOL(cxgb4_inline_tx_skb);
1129
1130static void *inline_tx_skb_header(const struct sk_buff *skb,
1131 const struct sge_txq *q, void *pos,
1132 int length)
1133{
1134 u64 *p;
1135 int left = (void *)q->stat - pos;
1136
1137 if (likely(length <= left)) {
1138 memcpy(pos, skb->data, length);
1139 pos += length;
1140 } else {
1141 memcpy(pos, skb->data, left);
1142 memcpy(q->desc, skb->data + left, length - left);
1143 pos = (void *)q->desc + (length - left);
1144 }
1145
1146 p = PTR_ALIGN(pos, 8);
1147 if ((uintptr_t)p & 8) {
1148 *p = 0;
1149 return p + 1;
1150 }
1151 return p;
1152}
1153
1154
1155
1156
1157
1158static u64 hwcsum(enum chip_type chip, const struct sk_buff *skb)
1159{
1160 int csum_type;
1161 bool inner_hdr_csum = false;
1162 u16 proto, ver;
1163
1164 if (skb->encapsulation &&
1165 (CHELSIO_CHIP_VERSION(chip) > CHELSIO_T5))
1166 inner_hdr_csum = true;
1167
1168 if (inner_hdr_csum) {
1169 ver = inner_ip_hdr(skb)->version;
1170 proto = (ver == 4) ? inner_ip_hdr(skb)->protocol :
1171 inner_ipv6_hdr(skb)->nexthdr;
1172 } else {
1173 ver = ip_hdr(skb)->version;
1174 proto = (ver == 4) ? ip_hdr(skb)->protocol :
1175 ipv6_hdr(skb)->nexthdr;
1176 }
1177
1178 if (ver == 4) {
1179 if (proto == IPPROTO_TCP)
1180 csum_type = TX_CSUM_TCPIP;
1181 else if (proto == IPPROTO_UDP)
1182 csum_type = TX_CSUM_UDPIP;
1183 else {
1184nocsum:
1185
1186
1187
1188 return TXPKT_L4CSUM_DIS_F;
1189 }
1190 } else {
1191
1192
1193
1194 if (proto == IPPROTO_TCP)
1195 csum_type = TX_CSUM_TCPIP6;
1196 else if (proto == IPPROTO_UDP)
1197 csum_type = TX_CSUM_UDPIP6;
1198 else
1199 goto nocsum;
1200 }
1201
1202 if (likely(csum_type >= TX_CSUM_TCPIP)) {
1203 int eth_hdr_len, l4_len;
1204 u64 hdr_len;
1205
1206 if (inner_hdr_csum) {
1207
1208
1209
1210 l4_len = skb_inner_network_header_len(skb);
1211 eth_hdr_len = skb_inner_network_offset(skb) - ETH_HLEN;
1212 } else {
1213 l4_len = skb_network_header_len(skb);
1214 eth_hdr_len = skb_network_offset(skb) - ETH_HLEN;
1215 }
1216 hdr_len = TXPKT_IPHDR_LEN_V(l4_len);
1217
1218 if (CHELSIO_CHIP_VERSION(chip) <= CHELSIO_T5)
1219 hdr_len |= TXPKT_ETHHDR_LEN_V(eth_hdr_len);
1220 else
1221 hdr_len |= T6_TXPKT_ETHHDR_LEN_V(eth_hdr_len);
1222 return TXPKT_CSUM_TYPE_V(csum_type) | hdr_len;
1223 } else {
1224 int start = skb_transport_offset(skb);
1225
1226 return TXPKT_CSUM_TYPE_V(csum_type) |
1227 TXPKT_CSUM_START_V(start) |
1228 TXPKT_CSUM_LOC_V(start + skb->csum_offset);
1229 }
1230}
1231
1232static void eth_txq_stop(struct sge_eth_txq *q)
1233{
1234 netif_tx_stop_queue(q->txq);
1235 q->q.stops++;
1236}
1237
1238static inline void txq_advance(struct sge_txq *q, unsigned int n)
1239{
1240 q->in_use += n;
1241 q->pidx += n;
1242 if (q->pidx >= q->size)
1243 q->pidx -= q->size;
1244}
1245
1246#ifdef CONFIG_CHELSIO_T4_FCOE
1247static inline int
1248cxgb_fcoe_offload(struct sk_buff *skb, struct adapter *adap,
1249 const struct port_info *pi, u64 *cntrl)
1250{
1251 const struct cxgb_fcoe *fcoe = &pi->fcoe;
1252
1253 if (!(fcoe->flags & CXGB_FCOE_ENABLED))
1254 return 0;
1255
1256 if (skb->protocol != htons(ETH_P_FCOE))
1257 return 0;
1258
1259 skb_reset_mac_header(skb);
1260 skb->mac_len = sizeof(struct ethhdr);
1261
1262 skb_set_network_header(skb, skb->mac_len);
1263 skb_set_transport_header(skb, skb->mac_len + sizeof(struct fcoe_hdr));
1264
1265 if (!cxgb_fcoe_sof_eof_supported(adap, skb))
1266 return -ENOTSUPP;
1267
1268
1269 *cntrl = TXPKT_CSUM_TYPE_V(TX_CSUM_FCOE) |
1270 TXPKT_L4CSUM_DIS_F | TXPKT_IPCSUM_DIS_F |
1271 TXPKT_CSUM_START_V(CXGB_FCOE_TXPKT_CSUM_START) |
1272 TXPKT_CSUM_END_V(CXGB_FCOE_TXPKT_CSUM_END) |
1273 TXPKT_CSUM_LOC_V(CXGB_FCOE_TXPKT_CSUM_END);
1274 return 0;
1275}
1276#endif
1277
1278
1279
1280
1281enum cpl_tx_tnl_lso_type cxgb_encap_offload_supported(struct sk_buff *skb)
1282{
1283 u8 l4_hdr = 0;
1284 enum cpl_tx_tnl_lso_type tnl_type = TX_TNL_TYPE_OPAQUE;
1285 struct port_info *pi = netdev_priv(skb->dev);
1286 struct adapter *adapter = pi->adapter;
1287
1288 if (skb->inner_protocol_type != ENCAP_TYPE_ETHER ||
1289 skb->inner_protocol != htons(ETH_P_TEB))
1290 return tnl_type;
1291
1292 switch (vlan_get_protocol(skb)) {
1293 case htons(ETH_P_IP):
1294 l4_hdr = ip_hdr(skb)->protocol;
1295 break;
1296 case htons(ETH_P_IPV6):
1297 l4_hdr = ipv6_hdr(skb)->nexthdr;
1298 break;
1299 default:
1300 return tnl_type;
1301 }
1302
1303 switch (l4_hdr) {
1304 case IPPROTO_UDP:
1305 if (adapter->vxlan_port == udp_hdr(skb)->dest)
1306 tnl_type = TX_TNL_TYPE_VXLAN;
1307 else if (adapter->geneve_port == udp_hdr(skb)->dest)
1308 tnl_type = TX_TNL_TYPE_GENEVE;
1309 break;
1310 default:
1311 return tnl_type;
1312 }
1313
1314 return tnl_type;
1315}
1316
1317static inline void t6_fill_tnl_lso(struct sk_buff *skb,
1318 struct cpl_tx_tnl_lso *tnl_lso,
1319 enum cpl_tx_tnl_lso_type tnl_type)
1320{
1321 u32 val;
1322 int in_eth_xtra_len;
1323 int l3hdr_len = skb_network_header_len(skb);
1324 int eth_xtra_len = skb_network_offset(skb) - ETH_HLEN;
1325 const struct skb_shared_info *ssi = skb_shinfo(skb);
1326 bool v6 = (ip_hdr(skb)->version == 6);
1327
1328 val = CPL_TX_TNL_LSO_OPCODE_V(CPL_TX_TNL_LSO) |
1329 CPL_TX_TNL_LSO_FIRST_F |
1330 CPL_TX_TNL_LSO_LAST_F |
1331 (v6 ? CPL_TX_TNL_LSO_IPV6OUT_F : 0) |
1332 CPL_TX_TNL_LSO_ETHHDRLENOUT_V(eth_xtra_len / 4) |
1333 CPL_TX_TNL_LSO_IPHDRLENOUT_V(l3hdr_len / 4) |
1334 (v6 ? 0 : CPL_TX_TNL_LSO_IPHDRCHKOUT_F) |
1335 CPL_TX_TNL_LSO_IPLENSETOUT_F |
1336 (v6 ? 0 : CPL_TX_TNL_LSO_IPIDINCOUT_F);
1337 tnl_lso->op_to_IpIdSplitOut = htonl(val);
1338
1339 tnl_lso->IpIdOffsetOut = 0;
1340
1341
1342 val = skb_inner_mac_header(skb) - skb_mac_header(skb);
1343 in_eth_xtra_len = skb_inner_network_header(skb) -
1344 skb_inner_mac_header(skb) - ETH_HLEN;
1345
1346 switch (tnl_type) {
1347 case TX_TNL_TYPE_VXLAN:
1348 case TX_TNL_TYPE_GENEVE:
1349 tnl_lso->UdpLenSetOut_to_TnlHdrLen =
1350 htons(CPL_TX_TNL_LSO_UDPCHKCLROUT_F |
1351 CPL_TX_TNL_LSO_UDPLENSETOUT_F);
1352 break;
1353 default:
1354 tnl_lso->UdpLenSetOut_to_TnlHdrLen = 0;
1355 break;
1356 }
1357
1358 tnl_lso->UdpLenSetOut_to_TnlHdrLen |=
1359 htons(CPL_TX_TNL_LSO_TNLHDRLEN_V(val) |
1360 CPL_TX_TNL_LSO_TNLTYPE_V(tnl_type));
1361
1362 tnl_lso->r1 = 0;
1363
1364 val = CPL_TX_TNL_LSO_ETHHDRLEN_V(in_eth_xtra_len / 4) |
1365 CPL_TX_TNL_LSO_IPV6_V(inner_ip_hdr(skb)->version == 6) |
1366 CPL_TX_TNL_LSO_IPHDRLEN_V(skb_inner_network_header_len(skb) / 4) |
1367 CPL_TX_TNL_LSO_TCPHDRLEN_V(inner_tcp_hdrlen(skb) / 4);
1368 tnl_lso->Flow_to_TcpHdrLen = htonl(val);
1369
1370 tnl_lso->IpIdOffset = htons(0);
1371
1372 tnl_lso->IpIdSplit_to_Mss = htons(CPL_TX_TNL_LSO_MSS_V(ssi->gso_size));
1373 tnl_lso->TCPSeqOffset = htonl(0);
1374 tnl_lso->EthLenOffset_Size = htonl(CPL_TX_TNL_LSO_SIZE_V(skb->len));
1375}
1376
1377static inline void *write_tso_wr(struct adapter *adap, struct sk_buff *skb,
1378 struct cpl_tx_pkt_lso_core *lso)
1379{
1380 int eth_xtra_len = skb_network_offset(skb) - ETH_HLEN;
1381 int l3hdr_len = skb_network_header_len(skb);
1382 const struct skb_shared_info *ssi;
1383 bool ipv6 = false;
1384
1385 ssi = skb_shinfo(skb);
1386 if (ssi->gso_type & SKB_GSO_TCPV6)
1387 ipv6 = true;
1388
1389 lso->lso_ctrl = htonl(LSO_OPCODE_V(CPL_TX_PKT_LSO) |
1390 LSO_FIRST_SLICE_F | LSO_LAST_SLICE_F |
1391 LSO_IPV6_V(ipv6) |
1392 LSO_ETHHDR_LEN_V(eth_xtra_len / 4) |
1393 LSO_IPHDR_LEN_V(l3hdr_len / 4) |
1394 LSO_TCPHDR_LEN_V(tcp_hdr(skb)->doff));
1395 lso->ipid_ofst = htons(0);
1396 lso->mss = htons(ssi->gso_size);
1397 lso->seqno_offset = htonl(0);
1398 if (is_t4(adap->params.chip))
1399 lso->len = htonl(skb->len);
1400 else
1401 lso->len = htonl(LSO_T5_XFER_SIZE_V(skb->len));
1402
1403 return (void *)(lso + 1);
1404}
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418int t4_sge_eth_txq_egress_update(struct adapter *adap, struct sge_eth_txq *eq,
1419 int maxreclaim)
1420{
1421 unsigned int reclaimed, hw_cidx;
1422 struct sge_txq *q = &eq->q;
1423 int hw_in_use;
1424
1425 if (!q->in_use || !__netif_tx_trylock(eq->txq))
1426 return 0;
1427
1428
1429 reclaimed = reclaim_completed_tx(adap, &eq->q, maxreclaim, true);
1430
1431 hw_cidx = ntohs(READ_ONCE(q->stat->cidx));
1432 hw_in_use = q->pidx - hw_cidx;
1433 if (hw_in_use < 0)
1434 hw_in_use += q->size;
1435
1436
1437
1438
1439
1440
1441 if (netif_tx_queue_stopped(eq->txq) && hw_in_use < (q->size / 2)) {
1442 netif_tx_wake_queue(eq->txq);
1443 eq->q.restarts++;
1444 }
1445
1446 __netif_tx_unlock(eq->txq);
1447 return reclaimed;
1448}
1449
1450static inline int cxgb4_validate_skb(struct sk_buff *skb,
1451 struct net_device *dev,
1452 u32 min_pkt_len)
1453{
1454 u32 max_pkt_len;
1455
1456
1457
1458
1459
1460 if (unlikely(skb->len < min_pkt_len))
1461 return -EINVAL;
1462
1463
1464 max_pkt_len = ETH_HLEN + dev->mtu;
1465
1466 if (skb_vlan_tagged(skb))
1467 max_pkt_len += VLAN_HLEN;
1468
1469 if (!skb_shinfo(skb)->gso_size && (unlikely(skb->len > max_pkt_len)))
1470 return -EINVAL;
1471
1472 return 0;
1473}
1474
1475static void *write_eo_udp_wr(struct sk_buff *skb, struct fw_eth_tx_eo_wr *wr,
1476 u32 hdr_len)
1477{
1478 wr->u.udpseg.type = FW_ETH_TX_EO_TYPE_UDPSEG;
1479 wr->u.udpseg.ethlen = skb_network_offset(skb);
1480 wr->u.udpseg.iplen = cpu_to_be16(skb_network_header_len(skb));
1481 wr->u.udpseg.udplen = sizeof(struct udphdr);
1482 wr->u.udpseg.rtplen = 0;
1483 wr->u.udpseg.r4 = 0;
1484 if (skb_shinfo(skb)->gso_size)
1485 wr->u.udpseg.mss = cpu_to_be16(skb_shinfo(skb)->gso_size);
1486 else
1487 wr->u.udpseg.mss = cpu_to_be16(skb->len - hdr_len);
1488 wr->u.udpseg.schedpktsize = wr->u.udpseg.mss;
1489 wr->u.udpseg.plen = cpu_to_be32(skb->len - hdr_len);
1490
1491 return (void *)(wr + 1);
1492}
1493
1494
1495
1496
1497
1498
1499
1500
1501static netdev_tx_t cxgb4_eth_xmit(struct sk_buff *skb, struct net_device *dev)
1502{
1503 enum cpl_tx_tnl_lso_type tnl_type = TX_TNL_TYPE_OPAQUE;
1504 bool ptp_enabled = is_ptp_enabled(skb, dev);
1505 unsigned int last_desc, flits, ndesc;
1506 u32 wr_mid, ctrl0, op, sgl_off = 0;
1507 const struct skb_shared_info *ssi;
1508 int len, qidx, credits, ret, left;
1509 struct tx_sw_desc *sgl_sdesc;
1510 struct fw_eth_tx_eo_wr *eowr;
1511 struct fw_eth_tx_pkt_wr *wr;
1512 struct cpl_tx_pkt_core *cpl;
1513 const struct port_info *pi;
1514 bool immediate = false;
1515 u64 cntrl, *end, *sgl;
1516 struct sge_eth_txq *q;
1517 unsigned int chip_ver;
1518 struct adapter *adap;
1519
1520 ret = cxgb4_validate_skb(skb, dev, ETH_HLEN);
1521 if (ret)
1522 goto out_free;
1523
1524 pi = netdev_priv(dev);
1525 adap = pi->adapter;
1526 ssi = skb_shinfo(skb);
1527#if IS_ENABLED(CONFIG_CHELSIO_IPSEC_INLINE)
1528 if (xfrm_offload(skb) && !ssi->gso_size)
1529 return adap->uld[CXGB4_ULD_IPSEC].tx_handler(skb, dev);
1530#endif
1531
1532#if IS_ENABLED(CONFIG_CHELSIO_TLS_DEVICE)
1533 if (cxgb4_is_ktls_skb(skb) &&
1534 (skb->len - (skb_transport_offset(skb) + tcp_hdrlen(skb))))
1535 return adap->uld[CXGB4_ULD_KTLS].tx_handler(skb, dev);
1536#endif
1537
1538 qidx = skb_get_queue_mapping(skb);
1539 if (ptp_enabled) {
1540 if (!(adap->ptp_tx_skb)) {
1541 skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
1542 adap->ptp_tx_skb = skb_get(skb);
1543 } else {
1544 goto out_free;
1545 }
1546 q = &adap->sge.ptptxq;
1547 } else {
1548 q = &adap->sge.ethtxq[qidx + pi->first_qset];
1549 }
1550 skb_tx_timestamp(skb);
1551
1552 reclaim_completed_tx(adap, &q->q, -1, true);
1553 cntrl = TXPKT_L4CSUM_DIS_F | TXPKT_IPCSUM_DIS_F;
1554
1555#ifdef CONFIG_CHELSIO_T4_FCOE
1556 ret = cxgb_fcoe_offload(skb, adap, pi, &cntrl);
1557 if (unlikely(ret == -EOPNOTSUPP))
1558 goto out_free;
1559#endif
1560
1561 chip_ver = CHELSIO_CHIP_VERSION(adap->params.chip);
1562 flits = calc_tx_flits(skb, chip_ver);
1563 ndesc = flits_to_desc(flits);
1564 credits = txq_avail(&q->q) - ndesc;
1565
1566 if (unlikely(credits < 0)) {
1567 eth_txq_stop(q);
1568 dev_err(adap->pdev_dev,
1569 "%s: Tx ring %u full while queue awake!\n",
1570 dev->name, qidx);
1571 return NETDEV_TX_BUSY;
1572 }
1573
1574 if (is_eth_imm(skb, chip_ver))
1575 immediate = true;
1576
1577 if (skb->encapsulation && chip_ver > CHELSIO_T5)
1578 tnl_type = cxgb_encap_offload_supported(skb);
1579
1580 last_desc = q->q.pidx + ndesc - 1;
1581 if (last_desc >= q->q.size)
1582 last_desc -= q->q.size;
1583 sgl_sdesc = &q->q.sdesc[last_desc];
1584
1585 if (!immediate &&
1586 unlikely(cxgb4_map_skb(adap->pdev_dev, skb, sgl_sdesc->addr) < 0)) {
1587 memset(sgl_sdesc->addr, 0, sizeof(sgl_sdesc->addr));
1588 q->mapping_err++;
1589 goto out_free;
1590 }
1591
1592 wr_mid = FW_WR_LEN16_V(DIV_ROUND_UP(flits, 2));
1593 if (unlikely(credits < ETHTXQ_STOP_THRES)) {
1594
1595
1596
1597
1598
1599
1600
1601
1602 eth_txq_stop(q);
1603 if (chip_ver > CHELSIO_T5)
1604 wr_mid |= FW_WR_EQUEQ_F | FW_WR_EQUIQ_F;
1605 }
1606
1607 wr = (void *)&q->q.desc[q->q.pidx];
1608 eowr = (void *)&q->q.desc[q->q.pidx];
1609 wr->equiq_to_len16 = htonl(wr_mid);
1610 wr->r3 = cpu_to_be64(0);
1611 if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4)
1612 end = (u64 *)eowr + flits;
1613 else
1614 end = (u64 *)wr + flits;
1615
1616 len = immediate ? skb->len : 0;
1617 len += sizeof(*cpl);
1618 if (ssi->gso_size && !(ssi->gso_type & SKB_GSO_UDP_L4)) {
1619 struct cpl_tx_pkt_lso_core *lso = (void *)(wr + 1);
1620 struct cpl_tx_tnl_lso *tnl_lso = (void *)(wr + 1);
1621
1622 if (tnl_type)
1623 len += sizeof(*tnl_lso);
1624 else
1625 len += sizeof(*lso);
1626
1627 wr->op_immdlen = htonl(FW_WR_OP_V(FW_ETH_TX_PKT_WR) |
1628 FW_WR_IMMDLEN_V(len));
1629 if (tnl_type) {
1630 struct iphdr *iph = ip_hdr(skb);
1631
1632 t6_fill_tnl_lso(skb, tnl_lso, tnl_type);
1633 cpl = (void *)(tnl_lso + 1);
1634
1635
1636
1637 if (iph->version == 4) {
1638 iph->check = 0;
1639 iph->tot_len = 0;
1640 iph->check = ~ip_fast_csum((u8 *)iph, iph->ihl);
1641 }
1642 if (skb->ip_summed == CHECKSUM_PARTIAL)
1643 cntrl = hwcsum(adap->params.chip, skb);
1644 } else {
1645 cpl = write_tso_wr(adap, skb, lso);
1646 cntrl = hwcsum(adap->params.chip, skb);
1647 }
1648 sgl = (u64 *)(cpl + 1);
1649 q->tso++;
1650 q->tx_cso += ssi->gso_segs;
1651 } else if (ssi->gso_size) {
1652 u64 *start;
1653 u32 hdrlen;
1654
1655 hdrlen = eth_get_headlen(dev, skb->data, skb_headlen(skb));
1656 len += hdrlen;
1657 wr->op_immdlen = cpu_to_be32(FW_WR_OP_V(FW_ETH_TX_EO_WR) |
1658 FW_ETH_TX_EO_WR_IMMDLEN_V(len));
1659 cpl = write_eo_udp_wr(skb, eowr, hdrlen);
1660 cntrl = hwcsum(adap->params.chip, skb);
1661
1662 start = (u64 *)(cpl + 1);
1663 sgl = (u64 *)inline_tx_skb_header(skb, &q->q, (void *)start,
1664 hdrlen);
1665 if (unlikely(start > sgl)) {
1666 left = (u8 *)end - (u8 *)q->q.stat;
1667 end = (void *)q->q.desc + left;
1668 }
1669 sgl_off = hdrlen;
1670 q->uso++;
1671 q->tx_cso += ssi->gso_segs;
1672 } else {
1673 if (ptp_enabled)
1674 op = FW_PTP_TX_PKT_WR;
1675 else
1676 op = FW_ETH_TX_PKT_WR;
1677 wr->op_immdlen = htonl(FW_WR_OP_V(op) |
1678 FW_WR_IMMDLEN_V(len));
1679 cpl = (void *)(wr + 1);
1680 sgl = (u64 *)(cpl + 1);
1681 if (skb->ip_summed == CHECKSUM_PARTIAL) {
1682 cntrl = hwcsum(adap->params.chip, skb) |
1683 TXPKT_IPCSUM_DIS_F;
1684 q->tx_cso++;
1685 }
1686 }
1687
1688 if (unlikely((u8 *)sgl >= (u8 *)q->q.stat)) {
1689
1690
1691
1692
1693 left = (u8 *)end - (u8 *)q->q.stat;
1694 end = (void *)q->q.desc + left;
1695 sgl = (void *)q->q.desc;
1696 }
1697
1698 if (skb_vlan_tag_present(skb)) {
1699 q->vlan_ins++;
1700 cntrl |= TXPKT_VLAN_VLD_F | TXPKT_VLAN_V(skb_vlan_tag_get(skb));
1701#ifdef CONFIG_CHELSIO_T4_FCOE
1702 if (skb->protocol == htons(ETH_P_FCOE))
1703 cntrl |= TXPKT_VLAN_V(
1704 ((skb->priority & 0x7) << VLAN_PRIO_SHIFT));
1705#endif
1706 }
1707
1708 ctrl0 = TXPKT_OPCODE_V(CPL_TX_PKT_XT) | TXPKT_INTF_V(pi->tx_chan) |
1709 TXPKT_PF_V(adap->pf);
1710 if (ptp_enabled)
1711 ctrl0 |= TXPKT_TSTAMP_F;
1712#ifdef CONFIG_CHELSIO_T4_DCB
1713 if (is_t4(adap->params.chip))
1714 ctrl0 |= TXPKT_OVLAN_IDX_V(q->dcb_prio);
1715 else
1716 ctrl0 |= TXPKT_T5_OVLAN_IDX_V(q->dcb_prio);
1717#endif
1718 cpl->ctrl0 = htonl(ctrl0);
1719 cpl->pack = htons(0);
1720 cpl->len = htons(skb->len);
1721 cpl->ctrl1 = cpu_to_be64(cntrl);
1722
1723 if (immediate) {
1724 cxgb4_inline_tx_skb(skb, &q->q, sgl);
1725 dev_consume_skb_any(skb);
1726 } else {
1727 cxgb4_write_sgl(skb, &q->q, (void *)sgl, end, sgl_off,
1728 sgl_sdesc->addr);
1729 skb_orphan(skb);
1730 sgl_sdesc->skb = skb;
1731 }
1732
1733 txq_advance(&q->q, ndesc);
1734
1735 cxgb4_ring_tx_db(adap, &q->q, ndesc);
1736 return NETDEV_TX_OK;
1737
1738out_free:
1739 dev_kfree_skb_any(skb);
1740 return NETDEV_TX_OK;
1741}
1742
1743
1744enum {
1745
1746
1747
1748
1749
1750
1751 EQ_UNIT = SGE_EQ_IDXSIZE,
1752 FL_PER_EQ_UNIT = EQ_UNIT / sizeof(__be64),
1753 TXD_PER_EQ_UNIT = EQ_UNIT / sizeof(__be64),
1754
1755 T4VF_ETHTXQ_MAX_HDR = (sizeof(struct fw_eth_tx_pkt_vm_wr) +
1756 sizeof(struct cpl_tx_pkt_lso_core) +
1757 sizeof(struct cpl_tx_pkt_core)) / sizeof(__be64),
1758};
1759
1760
1761
1762
1763
1764
1765
1766
1767static inline int t4vf_is_eth_imm(const struct sk_buff *skb)
1768{
1769
1770
1771
1772
1773
1774
1775 return false;
1776}
1777
1778
1779
1780
1781
1782
1783
1784
1785static inline unsigned int t4vf_calc_tx_flits(const struct sk_buff *skb)
1786{
1787 unsigned int flits;
1788
1789
1790
1791
1792
1793 if (t4vf_is_eth_imm(skb))
1794 return DIV_ROUND_UP(skb->len + sizeof(struct cpl_tx_pkt),
1795 sizeof(__be64));
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805 flits = sgl_len(skb_shinfo(skb)->nr_frags + 1);
1806 if (skb_shinfo(skb)->gso_size)
1807 flits += (sizeof(struct fw_eth_tx_pkt_vm_wr) +
1808 sizeof(struct cpl_tx_pkt_lso_core) +
1809 sizeof(struct cpl_tx_pkt_core)) / sizeof(__be64);
1810 else
1811 flits += (sizeof(struct fw_eth_tx_pkt_vm_wr) +
1812 sizeof(struct cpl_tx_pkt_core)) / sizeof(__be64);
1813 return flits;
1814}
1815
1816
1817
1818
1819
1820
1821
1822
1823static netdev_tx_t cxgb4_vf_eth_xmit(struct sk_buff *skb,
1824 struct net_device *dev)
1825{
1826 unsigned int last_desc, flits, ndesc;
1827 const struct skb_shared_info *ssi;
1828 struct fw_eth_tx_pkt_vm_wr *wr;
1829 struct tx_sw_desc *sgl_sdesc;
1830 struct cpl_tx_pkt_core *cpl;
1831 const struct port_info *pi;
1832 struct sge_eth_txq *txq;
1833 struct adapter *adapter;
1834 int qidx, credits, ret;
1835 size_t fw_hdr_copy_len;
1836 unsigned int chip_ver;
1837 u64 cntrl, *end;
1838 u32 wr_mid;
1839
1840
1841
1842
1843
1844
1845 BUILD_BUG_ON(sizeof(wr->firmware) !=
1846 (sizeof(wr->ethmacdst) + sizeof(wr->ethmacsrc) +
1847 sizeof(wr->ethtype) + sizeof(wr->vlantci)));
1848 fw_hdr_copy_len = sizeof(wr->firmware);
1849 ret = cxgb4_validate_skb(skb, dev, fw_hdr_copy_len);
1850 if (ret)
1851 goto out_free;
1852
1853
1854 pi = netdev_priv(dev);
1855 adapter = pi->adapter;
1856 qidx = skb_get_queue_mapping(skb);
1857 WARN_ON(qidx >= pi->nqsets);
1858 txq = &adapter->sge.ethtxq[pi->first_qset + qidx];
1859
1860
1861
1862
1863 reclaim_completed_tx(adapter, &txq->q, -1, true);
1864
1865
1866
1867
1868
1869 flits = t4vf_calc_tx_flits(skb);
1870 ndesc = flits_to_desc(flits);
1871 credits = txq_avail(&txq->q) - ndesc;
1872
1873 if (unlikely(credits < 0)) {
1874
1875
1876
1877
1878
1879 eth_txq_stop(txq);
1880 dev_err(adapter->pdev_dev,
1881 "%s: TX ring %u full while queue awake!\n",
1882 dev->name, qidx);
1883 return NETDEV_TX_BUSY;
1884 }
1885
1886 last_desc = txq->q.pidx + ndesc - 1;
1887 if (last_desc >= txq->q.size)
1888 last_desc -= txq->q.size;
1889 sgl_sdesc = &txq->q.sdesc[last_desc];
1890
1891 if (!t4vf_is_eth_imm(skb) &&
1892 unlikely(cxgb4_map_skb(adapter->pdev_dev, skb,
1893 sgl_sdesc->addr) < 0)) {
1894
1895
1896
1897
1898 memset(sgl_sdesc->addr, 0, sizeof(sgl_sdesc->addr));
1899 txq->mapping_err++;
1900 goto out_free;
1901 }
1902
1903 chip_ver = CHELSIO_CHIP_VERSION(adapter->params.chip);
1904 wr_mid = FW_WR_LEN16_V(DIV_ROUND_UP(flits, 2));
1905 if (unlikely(credits < ETHTXQ_STOP_THRES)) {
1906
1907
1908
1909
1910
1911
1912
1913
1914 eth_txq_stop(txq);
1915 if (chip_ver > CHELSIO_T5)
1916 wr_mid |= FW_WR_EQUEQ_F | FW_WR_EQUIQ_F;
1917 }
1918
1919
1920
1921
1922
1923
1924 WARN_ON(DIV_ROUND_UP(T4VF_ETHTXQ_MAX_HDR, TXD_PER_EQ_UNIT) > 1);
1925 wr = (void *)&txq->q.desc[txq->q.pidx];
1926 wr->equiq_to_len16 = cpu_to_be32(wr_mid);
1927 wr->r3[0] = cpu_to_be32(0);
1928 wr->r3[1] = cpu_to_be32(0);
1929 skb_copy_from_linear_data(skb, &wr->firmware, fw_hdr_copy_len);
1930 end = (u64 *)wr + flits;
1931
1932
1933
1934
1935
1936 ssi = skb_shinfo(skb);
1937 if (ssi->gso_size) {
1938 struct cpl_tx_pkt_lso_core *lso = (void *)(wr + 1);
1939 bool v6 = (ssi->gso_type & SKB_GSO_TCPV6) != 0;
1940 int l3hdr_len = skb_network_header_len(skb);
1941 int eth_xtra_len = skb_network_offset(skb) - ETH_HLEN;
1942
1943 wr->op_immdlen =
1944 cpu_to_be32(FW_WR_OP_V(FW_ETH_TX_PKT_VM_WR) |
1945 FW_WR_IMMDLEN_V(sizeof(*lso) +
1946 sizeof(*cpl)));
1947
1948 lso->lso_ctrl =
1949 cpu_to_be32(LSO_OPCODE_V(CPL_TX_PKT_LSO) |
1950 LSO_FIRST_SLICE_F |
1951 LSO_LAST_SLICE_F |
1952 LSO_IPV6_V(v6) |
1953 LSO_ETHHDR_LEN_V(eth_xtra_len / 4) |
1954 LSO_IPHDR_LEN_V(l3hdr_len / 4) |
1955 LSO_TCPHDR_LEN_V(tcp_hdr(skb)->doff));
1956 lso->ipid_ofst = cpu_to_be16(0);
1957 lso->mss = cpu_to_be16(ssi->gso_size);
1958 lso->seqno_offset = cpu_to_be32(0);
1959 if (is_t4(adapter->params.chip))
1960 lso->len = cpu_to_be32(skb->len);
1961 else
1962 lso->len = cpu_to_be32(LSO_T5_XFER_SIZE_V(skb->len));
1963
1964
1965
1966
1967 cpl = (void *)(lso + 1);
1968
1969 if (chip_ver <= CHELSIO_T5)
1970 cntrl = TXPKT_ETHHDR_LEN_V(eth_xtra_len);
1971 else
1972 cntrl = T6_TXPKT_ETHHDR_LEN_V(eth_xtra_len);
1973
1974 cntrl |= TXPKT_CSUM_TYPE_V(v6 ?
1975 TX_CSUM_TCPIP6 : TX_CSUM_TCPIP) |
1976 TXPKT_IPHDR_LEN_V(l3hdr_len);
1977 txq->tso++;
1978 txq->tx_cso += ssi->gso_segs;
1979 } else {
1980 int len;
1981
1982 len = (t4vf_is_eth_imm(skb)
1983 ? skb->len + sizeof(*cpl)
1984 : sizeof(*cpl));
1985 wr->op_immdlen =
1986 cpu_to_be32(FW_WR_OP_V(FW_ETH_TX_PKT_VM_WR) |
1987 FW_WR_IMMDLEN_V(len));
1988
1989
1990
1991
1992 cpl = (void *)(wr + 1);
1993 if (skb->ip_summed == CHECKSUM_PARTIAL) {
1994 cntrl = hwcsum(adapter->params.chip, skb) |
1995 TXPKT_IPCSUM_DIS_F;
1996 txq->tx_cso++;
1997 } else {
1998 cntrl = TXPKT_L4CSUM_DIS_F | TXPKT_IPCSUM_DIS_F;
1999 }
2000 }
2001
2002
2003
2004
2005 if (skb_vlan_tag_present(skb)) {
2006 txq->vlan_ins++;
2007 cntrl |= TXPKT_VLAN_VLD_F | TXPKT_VLAN_V(skb_vlan_tag_get(skb));
2008 }
2009
2010
2011 cpl->ctrl0 = cpu_to_be32(TXPKT_OPCODE_V(CPL_TX_PKT_XT) |
2012 TXPKT_INTF_V(pi->port_id) |
2013 TXPKT_PF_V(0));
2014 cpl->pack = cpu_to_be16(0);
2015 cpl->len = cpu_to_be16(skb->len);
2016 cpl->ctrl1 = cpu_to_be64(cntrl);
2017
2018
2019
2020
2021 if (t4vf_is_eth_imm(skb)) {
2022
2023
2024
2025 cxgb4_inline_tx_skb(skb, &txq->q, cpl + 1);
2026 dev_consume_skb_any(skb);
2027 } else {
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064 struct ulptx_sgl *sgl = (struct ulptx_sgl *)(cpl + 1);
2065 struct sge_txq *tq = &txq->q;
2066
2067
2068
2069
2070
2071
2072
2073 if (unlikely((void *)sgl == (void *)tq->stat)) {
2074 sgl = (void *)tq->desc;
2075 end = (void *)((void *)tq->desc +
2076 ((void *)end - (void *)tq->stat));
2077 }
2078
2079 cxgb4_write_sgl(skb, tq, sgl, end, 0, sgl_sdesc->addr);
2080 skb_orphan(skb);
2081 sgl_sdesc->skb = skb;
2082 }
2083
2084
2085
2086
2087 txq_advance(&txq->q, ndesc);
2088
2089 cxgb4_ring_tx_db(adapter, &txq->q, ndesc);
2090 return NETDEV_TX_OK;
2091
2092out_free:
2093
2094
2095
2096 dev_kfree_skb_any(skb);
2097 return NETDEV_TX_OK;
2098}
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108static inline void reclaim_completed_tx_imm(struct sge_txq *q)
2109{
2110 int hw_cidx = ntohs(READ_ONCE(q->stat->cidx));
2111 int reclaim = hw_cidx - q->cidx;
2112
2113 if (reclaim < 0)
2114 reclaim += q->size;
2115
2116 q->in_use -= reclaim;
2117 q->cidx = hw_cidx;
2118}
2119
2120static inline void eosw_txq_advance_index(u32 *idx, u32 n, u32 max)
2121{
2122 u32 val = *idx + n;
2123
2124 if (val >= max)
2125 val -= max;
2126
2127 *idx = val;
2128}
2129
2130void cxgb4_eosw_txq_free_desc(struct adapter *adap,
2131 struct sge_eosw_txq *eosw_txq, u32 ndesc)
2132{
2133 struct tx_sw_desc *d;
2134
2135 d = &eosw_txq->desc[eosw_txq->last_cidx];
2136 while (ndesc--) {
2137 if (d->skb) {
2138 if (d->addr[0]) {
2139 unmap_skb(adap->pdev_dev, d->skb, d->addr);
2140 memset(d->addr, 0, sizeof(d->addr));
2141 }
2142 dev_consume_skb_any(d->skb);
2143 d->skb = NULL;
2144 }
2145 eosw_txq_advance_index(&eosw_txq->last_cidx, 1,
2146 eosw_txq->ndesc);
2147 d = &eosw_txq->desc[eosw_txq->last_cidx];
2148 }
2149}
2150
2151static inline void eosw_txq_advance(struct sge_eosw_txq *eosw_txq, u32 n)
2152{
2153 eosw_txq_advance_index(&eosw_txq->pidx, n, eosw_txq->ndesc);
2154 eosw_txq->inuse += n;
2155}
2156
2157static inline int eosw_txq_enqueue(struct sge_eosw_txq *eosw_txq,
2158 struct sk_buff *skb)
2159{
2160 if (eosw_txq->inuse == eosw_txq->ndesc)
2161 return -ENOMEM;
2162
2163 eosw_txq->desc[eosw_txq->pidx].skb = skb;
2164 return 0;
2165}
2166
2167static inline struct sk_buff *eosw_txq_peek(struct sge_eosw_txq *eosw_txq)
2168{
2169 return eosw_txq->desc[eosw_txq->last_pidx].skb;
2170}
2171
2172static inline u8 ethofld_calc_tx_flits(struct adapter *adap,
2173 struct sk_buff *skb, u32 hdr_len)
2174{
2175 u8 flits, nsgl = 0;
2176 u32 wrlen;
2177
2178 wrlen = sizeof(struct fw_eth_tx_eo_wr) + sizeof(struct cpl_tx_pkt_core);
2179 if (skb_shinfo(skb)->gso_size &&
2180 !(skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4))
2181 wrlen += sizeof(struct cpl_tx_pkt_lso_core);
2182
2183 wrlen += roundup(hdr_len, 16);
2184
2185
2186 flits = DIV_ROUND_UP(wrlen, 8);
2187
2188 if (skb_shinfo(skb)->nr_frags > 0) {
2189 if (skb_headlen(skb) - hdr_len)
2190 nsgl = sgl_len(skb_shinfo(skb)->nr_frags + 1);
2191 else
2192 nsgl = sgl_len(skb_shinfo(skb)->nr_frags);
2193 } else if (skb->len - hdr_len) {
2194 nsgl = sgl_len(1);
2195 }
2196
2197 return flits + nsgl;
2198}
2199
2200static void *write_eo_wr(struct adapter *adap, struct sge_eosw_txq *eosw_txq,
2201 struct sk_buff *skb, struct fw_eth_tx_eo_wr *wr,
2202 u32 hdr_len, u32 wrlen)
2203{
2204 const struct skb_shared_info *ssi = skb_shinfo(skb);
2205 struct cpl_tx_pkt_core *cpl;
2206 u32 immd_len, wrlen16;
2207 bool compl = false;
2208 u8 ver, proto;
2209
2210 ver = ip_hdr(skb)->version;
2211 proto = (ver == 6) ? ipv6_hdr(skb)->nexthdr : ip_hdr(skb)->protocol;
2212
2213 wrlen16 = DIV_ROUND_UP(wrlen, 16);
2214 immd_len = sizeof(struct cpl_tx_pkt_core);
2215 if (skb_shinfo(skb)->gso_size &&
2216 !(skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4))
2217 immd_len += sizeof(struct cpl_tx_pkt_lso_core);
2218 immd_len += hdr_len;
2219
2220 if (!eosw_txq->ncompl ||
2221 (eosw_txq->last_compl + wrlen16) >=
2222 (adap->params.ofldq_wr_cred / 2)) {
2223 compl = true;
2224 eosw_txq->ncompl++;
2225 eosw_txq->last_compl = 0;
2226 }
2227
2228 wr->op_immdlen = cpu_to_be32(FW_WR_OP_V(FW_ETH_TX_EO_WR) |
2229 FW_ETH_TX_EO_WR_IMMDLEN_V(immd_len) |
2230 FW_WR_COMPL_V(compl));
2231 wr->equiq_to_len16 = cpu_to_be32(FW_WR_LEN16_V(wrlen16) |
2232 FW_WR_FLOWID_V(eosw_txq->hwtid));
2233 wr->r3 = 0;
2234 if (proto == IPPROTO_UDP) {
2235 cpl = write_eo_udp_wr(skb, wr, hdr_len);
2236 } else {
2237 wr->u.tcpseg.type = FW_ETH_TX_EO_TYPE_TCPSEG;
2238 wr->u.tcpseg.ethlen = skb_network_offset(skb);
2239 wr->u.tcpseg.iplen = cpu_to_be16(skb_network_header_len(skb));
2240 wr->u.tcpseg.tcplen = tcp_hdrlen(skb);
2241 wr->u.tcpseg.tsclk_tsoff = 0;
2242 wr->u.tcpseg.r4 = 0;
2243 wr->u.tcpseg.r5 = 0;
2244 wr->u.tcpseg.plen = cpu_to_be32(skb->len - hdr_len);
2245
2246 if (ssi->gso_size) {
2247 struct cpl_tx_pkt_lso_core *lso = (void *)(wr + 1);
2248
2249 wr->u.tcpseg.mss = cpu_to_be16(ssi->gso_size);
2250 cpl = write_tso_wr(adap, skb, lso);
2251 } else {
2252 wr->u.tcpseg.mss = cpu_to_be16(0xffff);
2253 cpl = (void *)(wr + 1);
2254 }
2255 }
2256
2257 eosw_txq->cred -= wrlen16;
2258 eosw_txq->last_compl += wrlen16;
2259 return cpl;
2260}
2261
2262static int ethofld_hard_xmit(struct net_device *dev,
2263 struct sge_eosw_txq *eosw_txq)
2264{
2265 struct port_info *pi = netdev2pinfo(dev);
2266 struct adapter *adap = netdev2adap(dev);
2267 u32 wrlen, wrlen16, hdr_len, data_len;
2268 enum sge_eosw_state next_state;
2269 u64 cntrl, *start, *end, *sgl;
2270 struct sge_eohw_txq *eohw_txq;
2271 struct cpl_tx_pkt_core *cpl;
2272 struct fw_eth_tx_eo_wr *wr;
2273 bool skip_eotx_wr = false;
2274 struct tx_sw_desc *d;
2275 struct sk_buff *skb;
2276 int left, ret = 0;
2277 u8 flits, ndesc;
2278
2279 eohw_txq = &adap->sge.eohw_txq[eosw_txq->hwqid];
2280 spin_lock(&eohw_txq->lock);
2281 reclaim_completed_tx_imm(&eohw_txq->q);
2282
2283 d = &eosw_txq->desc[eosw_txq->last_pidx];
2284 skb = d->skb;
2285 skb_tx_timestamp(skb);
2286
2287 wr = (struct fw_eth_tx_eo_wr *)&eohw_txq->q.desc[eohw_txq->q.pidx];
2288 if (unlikely(eosw_txq->state != CXGB4_EO_STATE_ACTIVE &&
2289 eosw_txq->last_pidx == eosw_txq->flowc_idx)) {
2290 hdr_len = skb->len;
2291 data_len = 0;
2292 flits = DIV_ROUND_UP(hdr_len, 8);
2293 if (eosw_txq->state == CXGB4_EO_STATE_FLOWC_OPEN_SEND)
2294 next_state = CXGB4_EO_STATE_FLOWC_OPEN_REPLY;
2295 else
2296 next_state = CXGB4_EO_STATE_FLOWC_CLOSE_REPLY;
2297 skip_eotx_wr = true;
2298 } else {
2299 hdr_len = eth_get_headlen(dev, skb->data, skb_headlen(skb));
2300 data_len = skb->len - hdr_len;
2301 flits = ethofld_calc_tx_flits(adap, skb, hdr_len);
2302 }
2303 ndesc = flits_to_desc(flits);
2304 wrlen = flits * 8;
2305 wrlen16 = DIV_ROUND_UP(wrlen, 16);
2306
2307 left = txq_avail(&eohw_txq->q) - ndesc;
2308
2309
2310
2311
2312
2313
2314
2315
2316 if (unlikely(left < 0 || wrlen16 > eosw_txq->cred)) {
2317 ret = -ENOMEM;
2318 goto out_unlock;
2319 }
2320
2321 if (unlikely(skip_eotx_wr)) {
2322 start = (u64 *)wr;
2323 eosw_txq->state = next_state;
2324 eosw_txq->cred -= wrlen16;
2325 eosw_txq->ncompl++;
2326 eosw_txq->last_compl = 0;
2327 goto write_wr_headers;
2328 }
2329
2330 cpl = write_eo_wr(adap, eosw_txq, skb, wr, hdr_len, wrlen);
2331 cntrl = hwcsum(adap->params.chip, skb);
2332 if (skb_vlan_tag_present(skb))
2333 cntrl |= TXPKT_VLAN_VLD_F | TXPKT_VLAN_V(skb_vlan_tag_get(skb));
2334
2335 cpl->ctrl0 = cpu_to_be32(TXPKT_OPCODE_V(CPL_TX_PKT_XT) |
2336 TXPKT_INTF_V(pi->tx_chan) |
2337 TXPKT_PF_V(adap->pf));
2338 cpl->pack = 0;
2339 cpl->len = cpu_to_be16(skb->len);
2340 cpl->ctrl1 = cpu_to_be64(cntrl);
2341
2342 start = (u64 *)(cpl + 1);
2343
2344write_wr_headers:
2345 sgl = (u64 *)inline_tx_skb_header(skb, &eohw_txq->q, (void *)start,
2346 hdr_len);
2347 if (data_len) {
2348 ret = cxgb4_map_skb(adap->pdev_dev, skb, d->addr);
2349 if (unlikely(ret)) {
2350 memset(d->addr, 0, sizeof(d->addr));
2351 eohw_txq->mapping_err++;
2352 goto out_unlock;
2353 }
2354
2355 end = (u64 *)wr + flits;
2356 if (unlikely(start > sgl)) {
2357 left = (u8 *)end - (u8 *)eohw_txq->q.stat;
2358 end = (void *)eohw_txq->q.desc + left;
2359 }
2360
2361 if (unlikely((u8 *)sgl >= (u8 *)eohw_txq->q.stat)) {
2362
2363
2364
2365
2366 left = (u8 *)end - (u8 *)eohw_txq->q.stat;
2367
2368 end = (void *)eohw_txq->q.desc + left;
2369 sgl = (void *)eohw_txq->q.desc;
2370 }
2371
2372 cxgb4_write_sgl(skb, &eohw_txq->q, (void *)sgl, end, hdr_len,
2373 d->addr);
2374 }
2375
2376 if (skb_shinfo(skb)->gso_size) {
2377 if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4)
2378 eohw_txq->uso++;
2379 else
2380 eohw_txq->tso++;
2381 eohw_txq->tx_cso += skb_shinfo(skb)->gso_segs;
2382 } else if (skb->ip_summed == CHECKSUM_PARTIAL) {
2383 eohw_txq->tx_cso++;
2384 }
2385
2386 if (skb_vlan_tag_present(skb))
2387 eohw_txq->vlan_ins++;
2388
2389 txq_advance(&eohw_txq->q, ndesc);
2390 cxgb4_ring_tx_db(adap, &eohw_txq->q, ndesc);
2391 eosw_txq_advance_index(&eosw_txq->last_pidx, 1, eosw_txq->ndesc);
2392
2393out_unlock:
2394 spin_unlock(&eohw_txq->lock);
2395 return ret;
2396}
2397
2398static void ethofld_xmit(struct net_device *dev, struct sge_eosw_txq *eosw_txq)
2399{
2400 struct sk_buff *skb;
2401 int pktcount, ret;
2402
2403 switch (eosw_txq->state) {
2404 case CXGB4_EO_STATE_ACTIVE:
2405 case CXGB4_EO_STATE_FLOWC_OPEN_SEND:
2406 case CXGB4_EO_STATE_FLOWC_CLOSE_SEND:
2407 pktcount = eosw_txq->pidx - eosw_txq->last_pidx;
2408 if (pktcount < 0)
2409 pktcount += eosw_txq->ndesc;
2410 break;
2411 case CXGB4_EO_STATE_FLOWC_OPEN_REPLY:
2412 case CXGB4_EO_STATE_FLOWC_CLOSE_REPLY:
2413 case CXGB4_EO_STATE_CLOSED:
2414 default:
2415 return;
2416 }
2417
2418 while (pktcount--) {
2419 skb = eosw_txq_peek(eosw_txq);
2420 if (!skb) {
2421 eosw_txq_advance_index(&eosw_txq->last_pidx, 1,
2422 eosw_txq->ndesc);
2423 continue;
2424 }
2425
2426 ret = ethofld_hard_xmit(dev, eosw_txq);
2427 if (ret)
2428 break;
2429 }
2430}
2431
2432static netdev_tx_t cxgb4_ethofld_xmit(struct sk_buff *skb,
2433 struct net_device *dev)
2434{
2435 struct cxgb4_tc_port_mqprio *tc_port_mqprio;
2436 struct port_info *pi = netdev2pinfo(dev);
2437 struct adapter *adap = netdev2adap(dev);
2438 struct sge_eosw_txq *eosw_txq;
2439 u32 qid;
2440 int ret;
2441
2442 ret = cxgb4_validate_skb(skb, dev, ETH_HLEN);
2443 if (ret)
2444 goto out_free;
2445
2446 tc_port_mqprio = &adap->tc_mqprio->port_mqprio[pi->port_id];
2447 qid = skb_get_queue_mapping(skb) - pi->nqsets;
2448 eosw_txq = &tc_port_mqprio->eosw_txq[qid];
2449 spin_lock_bh(&eosw_txq->lock);
2450 if (eosw_txq->state != CXGB4_EO_STATE_ACTIVE)
2451 goto out_unlock;
2452
2453 ret = eosw_txq_enqueue(eosw_txq, skb);
2454 if (ret)
2455 goto out_unlock;
2456
2457
2458
2459
2460
2461 skb_orphan(skb);
2462
2463 eosw_txq_advance(eosw_txq, 1);
2464 ethofld_xmit(dev, eosw_txq);
2465 spin_unlock_bh(&eosw_txq->lock);
2466 return NETDEV_TX_OK;
2467
2468out_unlock:
2469 spin_unlock_bh(&eosw_txq->lock);
2470out_free:
2471 dev_kfree_skb_any(skb);
2472 return NETDEV_TX_OK;
2473}
2474
2475netdev_tx_t t4_start_xmit(struct sk_buff *skb, struct net_device *dev)
2476{
2477 struct port_info *pi = netdev_priv(dev);
2478 u16 qid = skb_get_queue_mapping(skb);
2479
2480 if (unlikely(pi->eth_flags & PRIV_FLAG_PORT_TX_VM))
2481 return cxgb4_vf_eth_xmit(skb, dev);
2482
2483 if (unlikely(qid >= pi->nqsets))
2484 return cxgb4_ethofld_xmit(skb, dev);
2485
2486 if (is_ptp_enabled(skb, dev)) {
2487 struct adapter *adap = netdev2adap(dev);
2488 netdev_tx_t ret;
2489
2490 spin_lock(&adap->ptp_lock);
2491 ret = cxgb4_eth_xmit(skb, dev);
2492 spin_unlock(&adap->ptp_lock);
2493 return ret;
2494 }
2495
2496 return cxgb4_eth_xmit(skb, dev);
2497}
2498
2499static void eosw_txq_flush_pending_skbs(struct sge_eosw_txq *eosw_txq)
2500{
2501 int pktcount = eosw_txq->pidx - eosw_txq->last_pidx;
2502 int pidx = eosw_txq->pidx;
2503 struct sk_buff *skb;
2504
2505 if (!pktcount)
2506 return;
2507
2508 if (pktcount < 0)
2509 pktcount += eosw_txq->ndesc;
2510
2511 while (pktcount--) {
2512 pidx--;
2513 if (pidx < 0)
2514 pidx += eosw_txq->ndesc;
2515
2516 skb = eosw_txq->desc[pidx].skb;
2517 if (skb) {
2518 dev_consume_skb_any(skb);
2519 eosw_txq->desc[pidx].skb = NULL;
2520 eosw_txq->inuse--;
2521 }
2522 }
2523
2524 eosw_txq->pidx = eosw_txq->last_pidx + 1;
2525}
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537int cxgb4_ethofld_send_flowc(struct net_device *dev, u32 eotid, u32 tc)
2538{
2539 struct port_info *pi = netdev2pinfo(dev);
2540 struct adapter *adap = netdev2adap(dev);
2541 enum sge_eosw_state next_state;
2542 struct sge_eosw_txq *eosw_txq;
2543 u32 len, len16, nparams = 6;
2544 struct fw_flowc_wr *flowc;
2545 struct eotid_entry *entry;
2546 struct sge_ofld_rxq *rxq;
2547 struct sk_buff *skb;
2548 int ret = 0;
2549
2550 len = struct_size(flowc, mnemval, nparams);
2551 len16 = DIV_ROUND_UP(len, 16);
2552
2553 entry = cxgb4_lookup_eotid(&adap->tids, eotid);
2554 if (!entry)
2555 return -ENOMEM;
2556
2557 eosw_txq = (struct sge_eosw_txq *)entry->data;
2558 if (!eosw_txq)
2559 return -ENOMEM;
2560
2561 if (!(adap->flags & CXGB4_FW_OK)) {
2562
2563 complete(&eosw_txq->completion);
2564 return -EIO;
2565 }
2566
2567 skb = alloc_skb(len, GFP_KERNEL);
2568 if (!skb)
2569 return -ENOMEM;
2570
2571 spin_lock_bh(&eosw_txq->lock);
2572 if (tc != FW_SCHED_CLS_NONE) {
2573 if (eosw_txq->state != CXGB4_EO_STATE_CLOSED)
2574 goto out_free_skb;
2575
2576 next_state = CXGB4_EO_STATE_FLOWC_OPEN_SEND;
2577 } else {
2578 if (eosw_txq->state != CXGB4_EO_STATE_ACTIVE)
2579 goto out_free_skb;
2580
2581 next_state = CXGB4_EO_STATE_FLOWC_CLOSE_SEND;
2582 }
2583
2584 flowc = __skb_put(skb, len);
2585 memset(flowc, 0, len);
2586
2587 rxq = &adap->sge.eohw_rxq[eosw_txq->hwqid];
2588 flowc->flowid_len16 = cpu_to_be32(FW_WR_LEN16_V(len16) |
2589 FW_WR_FLOWID_V(eosw_txq->hwtid));
2590 flowc->op_to_nparams = cpu_to_be32(FW_WR_OP_V(FW_FLOWC_WR) |
2591 FW_FLOWC_WR_NPARAMS_V(nparams) |
2592 FW_WR_COMPL_V(1));
2593 flowc->mnemval[0].mnemonic = FW_FLOWC_MNEM_PFNVFN;
2594 flowc->mnemval[0].val = cpu_to_be32(FW_PFVF_CMD_PFN_V(adap->pf));
2595 flowc->mnemval[1].mnemonic = FW_FLOWC_MNEM_CH;
2596 flowc->mnemval[1].val = cpu_to_be32(pi->tx_chan);
2597 flowc->mnemval[2].mnemonic = FW_FLOWC_MNEM_PORT;
2598 flowc->mnemval[2].val = cpu_to_be32(pi->tx_chan);
2599 flowc->mnemval[3].mnemonic = FW_FLOWC_MNEM_IQID;
2600 flowc->mnemval[3].val = cpu_to_be32(rxq->rspq.abs_id);
2601 flowc->mnemval[4].mnemonic = FW_FLOWC_MNEM_SCHEDCLASS;
2602 flowc->mnemval[4].val = cpu_to_be32(tc);
2603 flowc->mnemval[5].mnemonic = FW_FLOWC_MNEM_EOSTATE;
2604 flowc->mnemval[5].val = cpu_to_be32(tc == FW_SCHED_CLS_NONE ?
2605 FW_FLOWC_MNEM_EOSTATE_CLOSING :
2606 FW_FLOWC_MNEM_EOSTATE_ESTABLISHED);
2607
2608
2609
2610
2611 if (tc == FW_SCHED_CLS_NONE)
2612 eosw_txq_flush_pending_skbs(eosw_txq);
2613
2614 ret = eosw_txq_enqueue(eosw_txq, skb);
2615 if (ret)
2616 goto out_free_skb;
2617
2618 eosw_txq->state = next_state;
2619 eosw_txq->flowc_idx = eosw_txq->pidx;
2620 eosw_txq_advance(eosw_txq, 1);
2621 ethofld_xmit(dev, eosw_txq);
2622
2623 spin_unlock_bh(&eosw_txq->lock);
2624 return 0;
2625
2626out_free_skb:
2627 dev_consume_skb_any(skb);
2628 spin_unlock_bh(&eosw_txq->lock);
2629 return ret;
2630}
2631
2632
2633
2634
2635
2636
2637
2638static inline int is_imm(const struct sk_buff *skb)
2639{
2640 return skb->len <= MAX_CTRL_WR_LEN;
2641}
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653static void ctrlq_check_stop(struct sge_ctrl_txq *q, struct fw_wr_hdr *wr)
2654{
2655 reclaim_completed_tx_imm(&q->q);
2656 if (unlikely(txq_avail(&q->q) < TXQ_STOP_THRES)) {
2657 wr->lo |= htonl(FW_WR_EQUEQ_F | FW_WR_EQUIQ_F);
2658 q->q.stops++;
2659 q->full = 1;
2660 }
2661}
2662
2663#define CXGB4_SELFTEST_LB_STR "CHELSIO_SELFTEST"
2664
2665int cxgb4_selftest_lb_pkt(struct net_device *netdev)
2666{
2667 struct port_info *pi = netdev_priv(netdev);
2668 struct adapter *adap = pi->adapter;
2669 struct cxgb4_ethtool_lb_test *lb;
2670 int ret, i = 0, pkt_len, credits;
2671 struct fw_eth_tx_pkt_wr *wr;
2672 struct cpl_tx_pkt_core *cpl;
2673 u32 ctrl0, ndesc, flits;
2674 struct sge_eth_txq *q;
2675 u8 *sgl;
2676
2677 pkt_len = ETH_HLEN + sizeof(CXGB4_SELFTEST_LB_STR);
2678
2679 flits = DIV_ROUND_UP(pkt_len + sizeof(*cpl) + sizeof(*wr),
2680 sizeof(__be64));
2681 ndesc = flits_to_desc(flits);
2682
2683 lb = &pi->ethtool_lb;
2684 lb->loopback = 1;
2685
2686 q = &adap->sge.ethtxq[pi->first_qset];
2687 __netif_tx_lock(q->txq, smp_processor_id());
2688
2689 reclaim_completed_tx(adap, &q->q, -1, true);
2690 credits = txq_avail(&q->q) - ndesc;
2691 if (unlikely(credits < 0)) {
2692 __netif_tx_unlock(q->txq);
2693 return -ENOMEM;
2694 }
2695
2696 wr = (void *)&q->q.desc[q->q.pidx];
2697 memset(wr, 0, sizeof(struct tx_desc));
2698
2699 wr->op_immdlen = htonl(FW_WR_OP_V(FW_ETH_TX_PKT_WR) |
2700 FW_WR_IMMDLEN_V(pkt_len +
2701 sizeof(*cpl)));
2702 wr->equiq_to_len16 = htonl(FW_WR_LEN16_V(DIV_ROUND_UP(flits, 2)));
2703 wr->r3 = cpu_to_be64(0);
2704
2705 cpl = (void *)(wr + 1);
2706 sgl = (u8 *)(cpl + 1);
2707
2708 ctrl0 = TXPKT_OPCODE_V(CPL_TX_PKT_XT) | TXPKT_PF_V(adap->pf) |
2709 TXPKT_INTF_V(pi->tx_chan + 4);
2710
2711 cpl->ctrl0 = htonl(ctrl0);
2712 cpl->pack = htons(0);
2713 cpl->len = htons(pkt_len);
2714 cpl->ctrl1 = cpu_to_be64(TXPKT_L4CSUM_DIS_F | TXPKT_IPCSUM_DIS_F);
2715
2716 eth_broadcast_addr(sgl);
2717 i += ETH_ALEN;
2718 ether_addr_copy(&sgl[i], netdev->dev_addr);
2719 i += ETH_ALEN;
2720
2721 snprintf(&sgl[i], sizeof(CXGB4_SELFTEST_LB_STR), "%s",
2722 CXGB4_SELFTEST_LB_STR);
2723
2724 init_completion(&lb->completion);
2725 txq_advance(&q->q, ndesc);
2726 cxgb4_ring_tx_db(adap, &q->q, ndesc);
2727 __netif_tx_unlock(q->txq);
2728
2729
2730 ret = wait_for_completion_timeout(&lb->completion, 10 * HZ);
2731 if (!ret)
2732 ret = -ETIMEDOUT;
2733 else
2734 ret = lb->result;
2735
2736 lb->loopback = 0;
2737
2738 return ret;
2739}
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749static int ctrl_xmit(struct sge_ctrl_txq *q, struct sk_buff *skb)
2750{
2751 unsigned int ndesc;
2752 struct fw_wr_hdr *wr;
2753
2754 if (unlikely(!is_imm(skb))) {
2755 WARN_ON(1);
2756 dev_kfree_skb(skb);
2757 return NET_XMIT_DROP;
2758 }
2759
2760 ndesc = DIV_ROUND_UP(skb->len, sizeof(struct tx_desc));
2761 spin_lock(&q->sendq.lock);
2762
2763 if (unlikely(q->full)) {
2764 skb->priority = ndesc;
2765 __skb_queue_tail(&q->sendq, skb);
2766 spin_unlock(&q->sendq.lock);
2767 return NET_XMIT_CN;
2768 }
2769
2770 wr = (struct fw_wr_hdr *)&q->q.desc[q->q.pidx];
2771 cxgb4_inline_tx_skb(skb, &q->q, wr);
2772
2773 txq_advance(&q->q, ndesc);
2774 if (unlikely(txq_avail(&q->q) < TXQ_STOP_THRES))
2775 ctrlq_check_stop(q, wr);
2776
2777 cxgb4_ring_tx_db(q->adap, &q->q, ndesc);
2778 spin_unlock(&q->sendq.lock);
2779
2780 kfree_skb(skb);
2781 return NET_XMIT_SUCCESS;
2782}
2783
2784
2785
2786
2787
2788
2789
2790static void restart_ctrlq(struct tasklet_struct *t)
2791{
2792 struct sk_buff *skb;
2793 unsigned int written = 0;
2794 struct sge_ctrl_txq *q = from_tasklet(q, t, qresume_tsk);
2795
2796 spin_lock(&q->sendq.lock);
2797 reclaim_completed_tx_imm(&q->q);
2798 BUG_ON(txq_avail(&q->q) < TXQ_STOP_THRES);
2799
2800 while ((skb = __skb_dequeue(&q->sendq)) != NULL) {
2801 struct fw_wr_hdr *wr;
2802 unsigned int ndesc = skb->priority;
2803
2804 written += ndesc;
2805
2806
2807
2808 wr = (struct fw_wr_hdr *)&q->q.desc[q->q.pidx];
2809 txq_advance(&q->q, ndesc);
2810 spin_unlock(&q->sendq.lock);
2811
2812 cxgb4_inline_tx_skb(skb, &q->q, wr);
2813 kfree_skb(skb);
2814
2815 if (unlikely(txq_avail(&q->q) < TXQ_STOP_THRES)) {
2816 unsigned long old = q->q.stops;
2817
2818 ctrlq_check_stop(q, wr);
2819 if (q->q.stops != old) {
2820 spin_lock(&q->sendq.lock);
2821 goto ringdb;
2822 }
2823 }
2824 if (written > 16) {
2825 cxgb4_ring_tx_db(q->adap, &q->q, written);
2826 written = 0;
2827 }
2828 spin_lock(&q->sendq.lock);
2829 }
2830 q->full = 0;
2831ringdb:
2832 if (written)
2833 cxgb4_ring_tx_db(q->adap, &q->q, written);
2834 spin_unlock(&q->sendq.lock);
2835}
2836
2837
2838
2839
2840
2841
2842
2843
2844int t4_mgmt_tx(struct adapter *adap, struct sk_buff *skb)
2845{
2846 int ret;
2847
2848 local_bh_disable();
2849 ret = ctrl_xmit(&adap->sge.ctrlq[0], skb);
2850 local_bh_enable();
2851 return ret;
2852}
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864static inline int is_ofld_imm(const struct sk_buff *skb)
2865{
2866 struct work_request_hdr *req = (struct work_request_hdr *)skb->data;
2867 unsigned long opcode = FW_WR_OP_G(ntohl(req->wr_hi));
2868
2869 if (unlikely(opcode == FW_ULPTX_WR))
2870 return skb->len <= MAX_IMM_ULPTX_WR_LEN;
2871 else if (opcode == FW_CRYPTO_LOOKASIDE_WR)
2872 return skb->len <= SGE_MAX_WR_LEN;
2873 else
2874 return skb->len <= MAX_IMM_OFLD_TX_DATA_WR_LEN;
2875}
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885static inline unsigned int calc_tx_flits_ofld(const struct sk_buff *skb)
2886{
2887 unsigned int flits, cnt;
2888
2889 if (is_ofld_imm(skb))
2890 return DIV_ROUND_UP(skb->len, 8);
2891
2892 flits = skb_transport_offset(skb) / 8U;
2893 cnt = skb_shinfo(skb)->nr_frags;
2894 if (skb_tail_pointer(skb) != skb_transport_header(skb))
2895 cnt++;
2896 return flits + sgl_len(cnt);
2897}
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907static void txq_stop_maperr(struct sge_uld_txq *q)
2908{
2909 q->mapping_err++;
2910 q->q.stops++;
2911 set_bit(q->q.cntxt_id - q->adap->sge.egr_start,
2912 q->adap->sge.txq_maperr);
2913}
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923static void ofldtxq_stop(struct sge_uld_txq *q, struct fw_wr_hdr *wr)
2924{
2925 wr->lo |= htonl(FW_WR_EQUEQ_F | FW_WR_EQUIQ_F);
2926 q->q.stops++;
2927 q->full = 1;
2928}
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948static void service_ofldq(struct sge_uld_txq *q)
2949 __must_hold(&q->sendq.lock)
2950{
2951 u64 *pos, *before, *end;
2952 int credits;
2953 struct sk_buff *skb;
2954 struct sge_txq *txq;
2955 unsigned int left;
2956 unsigned int written = 0;
2957 unsigned int flits, ndesc;
2958
2959
2960
2961
2962
2963
2964
2965 if (q->service_ofldq_running)
2966 return;
2967 q->service_ofldq_running = true;
2968
2969 while ((skb = skb_peek(&q->sendq)) != NULL && !q->full) {
2970
2971
2972
2973
2974
2975
2976
2977 spin_unlock(&q->sendq.lock);
2978
2979 cxgb4_reclaim_completed_tx(q->adap, &q->q, false);
2980
2981 flits = skb->priority;
2982 ndesc = flits_to_desc(flits);
2983 credits = txq_avail(&q->q) - ndesc;
2984 BUG_ON(credits < 0);
2985 if (unlikely(credits < TXQ_STOP_THRES))
2986 ofldtxq_stop(q, (struct fw_wr_hdr *)skb->data);
2987
2988 pos = (u64 *)&q->q.desc[q->q.pidx];
2989 if (is_ofld_imm(skb))
2990 cxgb4_inline_tx_skb(skb, &q->q, pos);
2991 else if (cxgb4_map_skb(q->adap->pdev_dev, skb,
2992 (dma_addr_t *)skb->head)) {
2993 txq_stop_maperr(q);
2994 spin_lock(&q->sendq.lock);
2995 break;
2996 } else {
2997 int last_desc, hdr_len = skb_transport_offset(skb);
2998
2999
3000
3001
3002 before = (u64 *)pos;
3003 end = (u64 *)pos + flits;
3004 txq = &q->q;
3005 pos = (void *)inline_tx_skb_header(skb, &q->q,
3006 (void *)pos,
3007 hdr_len);
3008 if (before > (u64 *)pos) {
3009 left = (u8 *)end - (u8 *)txq->stat;
3010 end = (void *)txq->desc + left;
3011 }
3012
3013
3014
3015
3016
3017 if (pos == (u64 *)txq->stat) {
3018 left = (u8 *)end - (u8 *)txq->stat;
3019 end = (void *)txq->desc + left;
3020 pos = (void *)txq->desc;
3021 }
3022
3023 cxgb4_write_sgl(skb, &q->q, (void *)pos,
3024 end, hdr_len,
3025 (dma_addr_t *)skb->head);
3026#ifdef CONFIG_NEED_DMA_MAP_STATE
3027 skb->dev = q->adap->port[0];
3028 skb->destructor = deferred_unmap_destructor;
3029#endif
3030 last_desc = q->q.pidx + ndesc - 1;
3031 if (last_desc >= q->q.size)
3032 last_desc -= q->q.size;
3033 q->q.sdesc[last_desc].skb = skb;
3034 }
3035
3036 txq_advance(&q->q, ndesc);
3037 written += ndesc;
3038 if (unlikely(written > 32)) {
3039 cxgb4_ring_tx_db(q->adap, &q->q, written);
3040 written = 0;
3041 }
3042
3043
3044
3045
3046
3047
3048 spin_lock(&q->sendq.lock);
3049 __skb_unlink(skb, &q->sendq);
3050 if (is_ofld_imm(skb))
3051 kfree_skb(skb);
3052 }
3053 if (likely(written))
3054 cxgb4_ring_tx_db(q->adap, &q->q, written);
3055
3056
3057
3058
3059 q->service_ofldq_running = false;
3060}
3061
3062
3063
3064
3065
3066
3067
3068
3069static int ofld_xmit(struct sge_uld_txq *q, struct sk_buff *skb)
3070{
3071 skb->priority = calc_tx_flits_ofld(skb);
3072 spin_lock(&q->sendq.lock);
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082 __skb_queue_tail(&q->sendq, skb);
3083 if (q->sendq.qlen == 1)
3084 service_ofldq(q);
3085
3086 spin_unlock(&q->sendq.lock);
3087 return NET_XMIT_SUCCESS;
3088}
3089
3090
3091
3092
3093
3094
3095
3096static void restart_ofldq(struct tasklet_struct *t)
3097{
3098 struct sge_uld_txq *q = from_tasklet(q, t, qresume_tsk);
3099
3100 spin_lock(&q->sendq.lock);
3101 q->full = 0;
3102 service_ofldq(q);
3103 spin_unlock(&q->sendq.lock);
3104}
3105
3106
3107
3108
3109
3110
3111
3112
3113static inline unsigned int skb_txq(const struct sk_buff *skb)
3114{
3115 return skb->queue_mapping >> 1;
3116}
3117
3118
3119
3120
3121
3122
3123
3124
3125static inline unsigned int is_ctrl_pkt(const struct sk_buff *skb)
3126{
3127 return skb->queue_mapping & 1;
3128}
3129
3130static inline int uld_send(struct adapter *adap, struct sk_buff *skb,
3131 unsigned int tx_uld_type)
3132{
3133 struct sge_uld_txq_info *txq_info;
3134 struct sge_uld_txq *txq;
3135 unsigned int idx = skb_txq(skb);
3136
3137 if (unlikely(is_ctrl_pkt(skb))) {
3138
3139 if (adap->tids.nsftids)
3140 idx = 0;
3141 return ctrl_xmit(&adap->sge.ctrlq[idx], skb);
3142 }
3143
3144 txq_info = adap->sge.uld_txq_info[tx_uld_type];
3145 if (unlikely(!txq_info)) {
3146 WARN_ON(true);
3147 kfree_skb(skb);
3148 return NET_XMIT_DROP;
3149 }
3150
3151 txq = &txq_info->uldtxq[idx];
3152 return ofld_xmit(txq, skb);
3153}
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164int t4_ofld_send(struct adapter *adap, struct sk_buff *skb)
3165{
3166 int ret;
3167
3168 local_bh_disable();
3169 ret = uld_send(adap, skb, CXGB4_TX_OFLD);
3170 local_bh_enable();
3171 return ret;
3172}
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182int cxgb4_ofld_send(struct net_device *dev, struct sk_buff *skb)
3183{
3184 return t4_ofld_send(netdev2adap(dev), skb);
3185}
3186EXPORT_SYMBOL(cxgb4_ofld_send);
3187
3188static void *inline_tx_header(const void *src,
3189 const struct sge_txq *q,
3190 void *pos, int length)
3191{
3192 int left = (void *)q->stat - pos;
3193 u64 *p;
3194
3195 if (likely(length <= left)) {
3196 memcpy(pos, src, length);
3197 pos += length;
3198 } else {
3199 memcpy(pos, src, left);
3200 memcpy(q->desc, src + left, length - left);
3201 pos = (void *)q->desc + (length - left);
3202 }
3203
3204 p = PTR_ALIGN(pos, 8);
3205 if ((uintptr_t)p & 8) {
3206 *p = 0;
3207 return p + 1;
3208 }
3209 return p;
3210}
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220static int ofld_xmit_direct(struct sge_uld_txq *q, const void *src,
3221 unsigned int len)
3222{
3223 unsigned int ndesc;
3224 int credits;
3225 u64 *pos;
3226
3227
3228 if (len > MAX_IMM_OFLD_TX_DATA_WR_LEN) {
3229 WARN_ON(1);
3230 return NET_XMIT_DROP;
3231 }
3232
3233
3234
3235
3236
3237 if (!spin_trylock(&q->sendq.lock))
3238 return NET_XMIT_DROP;
3239
3240 if (q->full || !skb_queue_empty(&q->sendq) ||
3241 q->service_ofldq_running) {
3242 spin_unlock(&q->sendq.lock);
3243 return NET_XMIT_DROP;
3244 }
3245 ndesc = flits_to_desc(DIV_ROUND_UP(len, 8));
3246 credits = txq_avail(&q->q) - ndesc;
3247 pos = (u64 *)&q->q.desc[q->q.pidx];
3248
3249
3250 inline_tx_header(src, &q->q, pos, len);
3251 if (unlikely(credits < TXQ_STOP_THRES))
3252 ofldtxq_stop(q, (struct fw_wr_hdr *)pos);
3253 txq_advance(&q->q, ndesc);
3254 cxgb4_ring_tx_db(q->adap, &q->q, ndesc);
3255
3256 spin_unlock(&q->sendq.lock);
3257 return NET_XMIT_SUCCESS;
3258}
3259
3260int cxgb4_immdata_send(struct net_device *dev, unsigned int idx,
3261 const void *src, unsigned int len)
3262{
3263 struct sge_uld_txq_info *txq_info;
3264 struct sge_uld_txq *txq;
3265 struct adapter *adap;
3266 int ret;
3267
3268 adap = netdev2adap(dev);
3269
3270 local_bh_disable();
3271 txq_info = adap->sge.uld_txq_info[CXGB4_TX_OFLD];
3272 if (unlikely(!txq_info)) {
3273 WARN_ON(true);
3274 local_bh_enable();
3275 return NET_XMIT_DROP;
3276 }
3277 txq = &txq_info->uldtxq[idx];
3278
3279 ret = ofld_xmit_direct(txq, src, len);
3280 local_bh_enable();
3281 return net_xmit_eval(ret);
3282}
3283EXPORT_SYMBOL(cxgb4_immdata_send);
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294static int t4_crypto_send(struct adapter *adap, struct sk_buff *skb)
3295{
3296 int ret;
3297
3298 local_bh_disable();
3299 ret = uld_send(adap, skb, CXGB4_TX_CRYPTO);
3300 local_bh_enable();
3301 return ret;
3302}
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312int cxgb4_crypto_send(struct net_device *dev, struct sk_buff *skb)
3313{
3314 return t4_crypto_send(netdev2adap(dev), skb);
3315}
3316EXPORT_SYMBOL(cxgb4_crypto_send);
3317
3318static inline void copy_frags(struct sk_buff *skb,
3319 const struct pkt_gl *gl, unsigned int offset)
3320{
3321 int i;
3322
3323
3324 __skb_fill_page_desc(skb, 0, gl->frags[0].page,
3325 gl->frags[0].offset + offset,
3326 gl->frags[0].size - offset);
3327 skb_shinfo(skb)->nr_frags = gl->nfrags;
3328 for (i = 1; i < gl->nfrags; i++)
3329 __skb_fill_page_desc(skb, i, gl->frags[i].page,
3330 gl->frags[i].offset,
3331 gl->frags[i].size);
3332
3333
3334 get_page(gl->frags[gl->nfrags - 1].page);
3335}
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346struct sk_buff *cxgb4_pktgl_to_skb(const struct pkt_gl *gl,
3347 unsigned int skb_len, unsigned int pull_len)
3348{
3349 struct sk_buff *skb;
3350
3351
3352
3353
3354
3355
3356 if (gl->tot_len <= RX_COPY_THRES) {
3357 skb = dev_alloc_skb(gl->tot_len);
3358 if (unlikely(!skb))
3359 goto out;
3360 __skb_put(skb, gl->tot_len);
3361 skb_copy_to_linear_data(skb, gl->va, gl->tot_len);
3362 } else {
3363 skb = dev_alloc_skb(skb_len);
3364 if (unlikely(!skb))
3365 goto out;
3366 __skb_put(skb, pull_len);
3367 skb_copy_to_linear_data(skb, gl->va, pull_len);
3368
3369 copy_frags(skb, gl, pull_len);
3370 skb->len = gl->tot_len;
3371 skb->data_len = skb->len - pull_len;
3372 skb->truesize += skb->data_len;
3373 }
3374out: return skb;
3375}
3376EXPORT_SYMBOL(cxgb4_pktgl_to_skb);
3377
3378
3379
3380
3381
3382
3383
3384
3385static void t4_pktgl_free(const struct pkt_gl *gl)
3386{
3387 int n;
3388 const struct page_frag *p;
3389
3390 for (p = gl->frags, n = gl->nfrags - 1; n--; p++)
3391 put_page(p->page);
3392}
3393
3394
3395
3396
3397
3398static noinline int handle_trace_pkt(struct adapter *adap,
3399 const struct pkt_gl *gl)
3400{
3401 struct sk_buff *skb;
3402
3403 skb = cxgb4_pktgl_to_skb(gl, RX_PULL_LEN, RX_PULL_LEN);
3404 if (unlikely(!skb)) {
3405 t4_pktgl_free(gl);
3406 return 0;
3407 }
3408
3409 if (is_t4(adap->params.chip))
3410 __skb_pull(skb, sizeof(struct cpl_trace_pkt));
3411 else
3412 __skb_pull(skb, sizeof(struct cpl_t5_trace_pkt));
3413
3414 skb_reset_mac_header(skb);
3415 skb->protocol = htons(0xffff);
3416 skb->dev = adap->port[0];
3417 netif_receive_skb(skb);
3418 return 0;
3419}
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430static void cxgb4_sgetim_to_hwtstamp(struct adapter *adap,
3431 struct skb_shared_hwtstamps *hwtstamps,
3432 u64 sgetstamp)
3433{
3434 u64 ns;
3435 u64 tmp = (sgetstamp * 1000 * 1000 + adap->params.vpd.cclk / 2);
3436
3437 ns = div_u64(tmp, adap->params.vpd.cclk);
3438
3439 memset(hwtstamps, 0, sizeof(*hwtstamps));
3440 hwtstamps->hwtstamp = ns_to_ktime(ns);
3441}
3442
3443static void do_gro(struct sge_eth_rxq *rxq, const struct pkt_gl *gl,
3444 const struct cpl_rx_pkt *pkt, unsigned long tnl_hdr_len)
3445{
3446 struct adapter *adapter = rxq->rspq.adap;
3447 struct sge *s = &adapter->sge;
3448 struct port_info *pi;
3449 int ret;
3450 struct sk_buff *skb;
3451
3452 skb = napi_get_frags(&rxq->rspq.napi);
3453 if (unlikely(!skb)) {
3454 t4_pktgl_free(gl);
3455 rxq->stats.rx_drops++;
3456 return;
3457 }
3458
3459 copy_frags(skb, gl, s->pktshift);
3460 if (tnl_hdr_len)
3461 skb->csum_level = 1;
3462 skb->len = gl->tot_len - s->pktshift;
3463 skb->data_len = skb->len;
3464 skb->truesize += skb->data_len;
3465 skb->ip_summed = CHECKSUM_UNNECESSARY;
3466 skb_record_rx_queue(skb, rxq->rspq.idx);
3467 pi = netdev_priv(skb->dev);
3468 if (pi->rxtstamp)
3469 cxgb4_sgetim_to_hwtstamp(adapter, skb_hwtstamps(skb),
3470 gl->sgetstamp);
3471 if (rxq->rspq.netdev->features & NETIF_F_RXHASH)
3472 skb_set_hash(skb, (__force u32)pkt->rsshdr.hash_val,
3473 PKT_HASH_TYPE_L3);
3474
3475 if (unlikely(pkt->vlan_ex)) {
3476 __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), ntohs(pkt->vlan));
3477 rxq->stats.vlan_ex++;
3478 }
3479 ret = napi_gro_frags(&rxq->rspq.napi);
3480 if (ret == GRO_HELD)
3481 rxq->stats.lro_pkts++;
3482 else if (ret == GRO_MERGED || ret == GRO_MERGED_FREE)
3483 rxq->stats.lro_merged++;
3484 rxq->stats.pkts++;
3485 rxq->stats.rx_cso++;
3486}
3487
3488enum {
3489 RX_NON_PTP_PKT = 0,
3490 RX_PTP_PKT_SUC = 1,
3491 RX_PTP_PKT_ERR = 2
3492};
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502static noinline int t4_systim_to_hwstamp(struct adapter *adapter,
3503 struct sk_buff *skb)
3504{
3505 struct skb_shared_hwtstamps *hwtstamps;
3506 struct cpl_rx_mps_pkt *cpl = NULL;
3507 unsigned char *data;
3508 int offset;
3509
3510 cpl = (struct cpl_rx_mps_pkt *)skb->data;
3511 if (!(CPL_RX_MPS_PKT_TYPE_G(ntohl(cpl->op_to_r1_hi)) &
3512 X_CPL_RX_MPS_PKT_TYPE_PTP))
3513 return RX_PTP_PKT_ERR;
3514
3515 data = skb->data + sizeof(*cpl);
3516 skb_pull(skb, 2 * sizeof(u64) + sizeof(struct cpl_rx_mps_pkt));
3517 offset = ETH_HLEN + IPV4_HLEN(skb->data) + UDP_HLEN;
3518 if (skb->len < offset + OFF_PTP_SEQUENCE_ID + sizeof(short))
3519 return RX_PTP_PKT_ERR;
3520
3521 hwtstamps = skb_hwtstamps(skb);
3522 memset(hwtstamps, 0, sizeof(*hwtstamps));
3523 hwtstamps->hwtstamp = ns_to_ktime(get_unaligned_be64(data));
3524
3525 return RX_PTP_PKT_SUC;
3526}
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537static int t4_rx_hststamp(struct adapter *adapter, const __be64 *rsp,
3538 struct sge_eth_rxq *rxq, struct sk_buff *skb)
3539{
3540 int ret;
3541
3542 if (unlikely((*(u8 *)rsp == CPL_RX_MPS_PKT) &&
3543 !is_t4(adapter->params.chip))) {
3544 ret = t4_systim_to_hwstamp(adapter, skb);
3545 if (ret == RX_PTP_PKT_ERR) {
3546 kfree_skb(skb);
3547 rxq->stats.rx_drops++;
3548 }
3549 return ret;
3550 }
3551 return RX_NON_PTP_PKT;
3552}
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562static int t4_tx_hststamp(struct adapter *adapter, struct sk_buff *skb,
3563 struct net_device *dev)
3564{
3565 struct port_info *pi = netdev_priv(dev);
3566
3567 if (!is_t4(adapter->params.chip) && adapter->ptp_tx_skb) {
3568 cxgb4_ptp_read_hwstamp(adapter, pi);
3569 kfree_skb(skb);
3570 return 0;
3571 }
3572 return 1;
3573}
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590static void t4_tx_completion_handler(struct sge_rspq *rspq,
3591 const __be64 *rsp,
3592 const struct pkt_gl *gl)
3593{
3594 u8 opcode = ((const struct rss_header *)rsp)->opcode;
3595 struct port_info *pi = netdev_priv(rspq->netdev);
3596 struct adapter *adapter = rspq->adap;
3597 struct sge *s = &adapter->sge;
3598 struct sge_eth_txq *txq;
3599
3600
3601 rsp++;
3602
3603
3604
3605 if (unlikely(opcode == CPL_FW4_MSG &&
3606 ((const struct cpl_fw4_msg *)rsp)->type ==
3607 FW_TYPE_RSSCPL)) {
3608 rsp++;
3609 opcode = ((const struct rss_header *)rsp)->opcode;
3610 rsp++;
3611 }
3612
3613 if (unlikely(opcode != CPL_SGE_EGR_UPDATE)) {
3614 pr_info("%s: unexpected FW4/CPL %#x on Rx queue\n",
3615 __func__, opcode);
3616 return;
3617 }
3618
3619 txq = &s->ethtxq[pi->first_qset + rspq->idx];
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632 if (CHELSIO_CHIP_VERSION(adapter->params.chip) <= CHELSIO_T5) {
3633 struct cpl_sge_egr_update *egr;
3634
3635 egr = (struct cpl_sge_egr_update *)rsp;
3636 WRITE_ONCE(txq->q.stat->cidx, egr->cidx);
3637 }
3638
3639 t4_sge_eth_txq_egress_update(adapter, txq, -1);
3640}
3641
3642static int cxgb4_validate_lb_pkt(struct port_info *pi, const struct pkt_gl *si)
3643{
3644 struct adapter *adap = pi->adapter;
3645 struct cxgb4_ethtool_lb_test *lb;
3646 struct sge *s = &adap->sge;
3647 struct net_device *netdev;
3648 u8 *data;
3649 int i;
3650
3651 netdev = adap->port[pi->port_id];
3652 lb = &pi->ethtool_lb;
3653 data = si->va + s->pktshift;
3654
3655 i = ETH_ALEN;
3656 if (!ether_addr_equal(data + i, netdev->dev_addr))
3657 return -1;
3658
3659 i += ETH_ALEN;
3660 if (strcmp(&data[i], CXGB4_SELFTEST_LB_STR))
3661 lb->result = -EIO;
3662
3663 complete(&lb->completion);
3664 return 0;
3665}
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675int t4_ethrx_handler(struct sge_rspq *q, const __be64 *rsp,
3676 const struct pkt_gl *si)
3677{
3678 bool csum_ok;
3679 struct sk_buff *skb;
3680 const struct cpl_rx_pkt *pkt;
3681 struct sge_eth_rxq *rxq = container_of(q, struct sge_eth_rxq, rspq);
3682 struct adapter *adapter = q->adap;
3683 struct sge *s = &q->adap->sge;
3684 int cpl_trace_pkt = is_t4(q->adap->params.chip) ?
3685 CPL_TRACE_PKT : CPL_TRACE_PKT_T5;
3686 u16 err_vec, tnl_hdr_len = 0;
3687 struct port_info *pi;
3688 int ret = 0;
3689
3690 pi = netdev_priv(q->netdev);
3691
3692
3693
3694 if (unlikely((*(u8 *)rsp == CPL_FW4_MSG) ||
3695 (*(u8 *)rsp == CPL_SGE_EGR_UPDATE))) {
3696 t4_tx_completion_handler(q, rsp, si);
3697 return 0;
3698 }
3699
3700 if (unlikely(*(u8 *)rsp == cpl_trace_pkt))
3701 return handle_trace_pkt(q->adap, si);
3702
3703 pkt = (const struct cpl_rx_pkt *)rsp;
3704
3705 if (q->adap->params.tp.rx_pkt_encap) {
3706 err_vec = T6_COMPR_RXERR_VEC_G(be16_to_cpu(pkt->err_vec));
3707 tnl_hdr_len = T6_RX_TNLHDR_LEN_G(ntohs(pkt->err_vec));
3708 } else {
3709 err_vec = be16_to_cpu(pkt->err_vec);
3710 }
3711
3712 csum_ok = pkt->csum_calc && !err_vec &&
3713 (q->netdev->features & NETIF_F_RXCSUM);
3714
3715 if (err_vec)
3716 rxq->stats.bad_rx_pkts++;
3717
3718 if (unlikely(pi->ethtool_lb.loopback && pkt->iff >= NCHAN)) {
3719 ret = cxgb4_validate_lb_pkt(pi, si);
3720 if (!ret)
3721 return 0;
3722 }
3723
3724 if (((pkt->l2info & htonl(RXF_TCP_F)) ||
3725 tnl_hdr_len) &&
3726 (q->netdev->features & NETIF_F_GRO) && csum_ok && !pkt->ip_frag) {
3727 do_gro(rxq, si, pkt, tnl_hdr_len);
3728 return 0;
3729 }
3730
3731 skb = cxgb4_pktgl_to_skb(si, RX_PKT_SKB_LEN, RX_PULL_LEN);
3732 if (unlikely(!skb)) {
3733 t4_pktgl_free(si);
3734 rxq->stats.rx_drops++;
3735 return 0;
3736 }
3737
3738
3739 if (unlikely(pi->ptp_enable)) {
3740 ret = t4_rx_hststamp(adapter, rsp, rxq, skb);
3741 if (ret == RX_PTP_PKT_ERR)
3742 return 0;
3743 }
3744 if (likely(!ret))
3745 __skb_pull(skb, s->pktshift);
3746
3747
3748 if (unlikely(pi->ptp_enable && !ret &&
3749 (pkt->l2info & htonl(RXF_UDP_F)) &&
3750 cxgb4_ptp_is_ptp_rx(skb))) {
3751 if (!t4_tx_hststamp(adapter, skb, q->netdev))
3752 return 0;
3753 }
3754
3755 skb->protocol = eth_type_trans(skb, q->netdev);
3756 skb_record_rx_queue(skb, q->idx);
3757 if (skb->dev->features & NETIF_F_RXHASH)
3758 skb_set_hash(skb, (__force u32)pkt->rsshdr.hash_val,
3759 PKT_HASH_TYPE_L3);
3760
3761 rxq->stats.pkts++;
3762
3763 if (pi->rxtstamp)
3764 cxgb4_sgetim_to_hwtstamp(q->adap, skb_hwtstamps(skb),
3765 si->sgetstamp);
3766 if (csum_ok && (pkt->l2info & htonl(RXF_UDP_F | RXF_TCP_F))) {
3767 if (!pkt->ip_frag) {
3768 skb->ip_summed = CHECKSUM_UNNECESSARY;
3769 rxq->stats.rx_cso++;
3770 } else if (pkt->l2info & htonl(RXF_IP_F)) {
3771 __sum16 c = (__force __sum16)pkt->csum;
3772 skb->csum = csum_unfold(c);
3773
3774 if (tnl_hdr_len) {
3775 skb->ip_summed = CHECKSUM_UNNECESSARY;
3776 skb->csum_level = 1;
3777 } else {
3778 skb->ip_summed = CHECKSUM_COMPLETE;
3779 }
3780 rxq->stats.rx_cso++;
3781 }
3782 } else {
3783 skb_checksum_none_assert(skb);
3784#ifdef CONFIG_CHELSIO_T4_FCOE
3785#define CPL_RX_PKT_FLAGS (RXF_PSH_F | RXF_SYN_F | RXF_UDP_F | \
3786 RXF_TCP_F | RXF_IP_F | RXF_IP6_F | RXF_LRO_F)
3787
3788 if (!(pkt->l2info & cpu_to_be32(CPL_RX_PKT_FLAGS))) {
3789 if ((pkt->l2info & cpu_to_be32(RXF_FCOE_F)) &&
3790 (pi->fcoe.flags & CXGB_FCOE_ENABLED)) {
3791 if (q->adap->params.tp.rx_pkt_encap)
3792 csum_ok = err_vec &
3793 T6_COMPR_RXERR_SUM_F;
3794 else
3795 csum_ok = err_vec & RXERR_CSUM_F;
3796 if (!csum_ok)
3797 skb->ip_summed = CHECKSUM_UNNECESSARY;
3798 }
3799 }
3800
3801#undef CPL_RX_PKT_FLAGS
3802#endif
3803 }
3804
3805 if (unlikely(pkt->vlan_ex)) {
3806 __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), ntohs(pkt->vlan));
3807 rxq->stats.vlan_ex++;
3808 }
3809 skb_mark_napi_id(skb, &q->napi);
3810 netif_receive_skb(skb);
3811 return 0;
3812}
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829static void restore_rx_bufs(const struct pkt_gl *si, struct sge_fl *q,
3830 int frags)
3831{
3832 struct rx_sw_desc *d;
3833
3834 while (frags--) {
3835 if (q->cidx == 0)
3836 q->cidx = q->size - 1;
3837 else
3838 q->cidx--;
3839 d = &q->sdesc[q->cidx];
3840 d->page = si->frags[frags].page;
3841 d->dma_addr |= RX_UNMAPPED_BUF;
3842 q->avail++;
3843 }
3844}
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854static inline bool is_new_response(const struct rsp_ctrl *r,
3855 const struct sge_rspq *q)
3856{
3857 return (r->type_gen >> RSPD_GEN_S) == q->gen;
3858}
3859
3860
3861
3862
3863
3864
3865
3866static inline void rspq_next(struct sge_rspq *q)
3867{
3868 q->cur_desc = (void *)q->cur_desc + q->iqe_len;
3869 if (unlikely(++q->cidx == q->size)) {
3870 q->cidx = 0;
3871 q->gen ^= 1;
3872 q->cur_desc = q->desc;
3873 }
3874}
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889static int process_responses(struct sge_rspq *q, int budget)
3890{
3891 int ret, rsp_type;
3892 int budget_left = budget;
3893 const struct rsp_ctrl *rc;
3894 struct sge_eth_rxq *rxq = container_of(q, struct sge_eth_rxq, rspq);
3895 struct adapter *adapter = q->adap;
3896 struct sge *s = &adapter->sge;
3897
3898 while (likely(budget_left)) {
3899 rc = (void *)q->cur_desc + (q->iqe_len - sizeof(*rc));
3900 if (!is_new_response(rc, q)) {
3901 if (q->flush_handler)
3902 q->flush_handler(q);
3903 break;
3904 }
3905
3906 dma_rmb();
3907 rsp_type = RSPD_TYPE_G(rc->type_gen);
3908 if (likely(rsp_type == RSPD_TYPE_FLBUF_X)) {
3909 struct page_frag *fp;
3910 struct pkt_gl si;
3911 const struct rx_sw_desc *rsd;
3912 u32 len = ntohl(rc->pldbuflen_qid), bufsz, frags;
3913
3914 if (len & RSPD_NEWBUF_F) {
3915 if (likely(q->offset > 0)) {
3916 free_rx_bufs(q->adap, &rxq->fl, 1);
3917 q->offset = 0;
3918 }
3919 len = RSPD_LEN_G(len);
3920 }
3921 si.tot_len = len;
3922
3923
3924 for (frags = 0, fp = si.frags; ; frags++, fp++) {
3925 rsd = &rxq->fl.sdesc[rxq->fl.cidx];
3926 bufsz = get_buf_size(adapter, rsd);
3927 fp->page = rsd->page;
3928 fp->offset = q->offset;
3929 fp->size = min(bufsz, len);
3930 len -= fp->size;
3931 if (!len)
3932 break;
3933 unmap_rx_buf(q->adap, &rxq->fl);
3934 }
3935
3936 si.sgetstamp = SGE_TIMESTAMP_G(
3937 be64_to_cpu(rc->last_flit));
3938
3939
3940
3941
3942 dma_sync_single_for_cpu(q->adap->pdev_dev,
3943 get_buf_addr(rsd),
3944 fp->size, DMA_FROM_DEVICE);
3945
3946 si.va = page_address(si.frags[0].page) +
3947 si.frags[0].offset;
3948 prefetch(si.va);
3949
3950 si.nfrags = frags + 1;
3951 ret = q->handler(q, q->cur_desc, &si);
3952 if (likely(ret == 0))
3953 q->offset += ALIGN(fp->size, s->fl_align);
3954 else
3955 restore_rx_bufs(&si, &rxq->fl, frags);
3956 } else if (likely(rsp_type == RSPD_TYPE_CPL_X)) {
3957 ret = q->handler(q, q->cur_desc, NULL);
3958 } else {
3959 ret = q->handler(q, (const __be64 *)rc, CXGB4_MSG_AN);
3960 }
3961
3962 if (unlikely(ret)) {
3963
3964 q->next_intr_params = QINTR_TIMER_IDX_V(NOMEM_TMR_IDX);
3965 break;
3966 }
3967
3968 rspq_next(q);
3969 budget_left--;
3970 }
3971
3972 if (q->offset >= 0 && fl_cap(&rxq->fl) - rxq->fl.avail >= 16)
3973 __refill_fl(q->adap, &rxq->fl);
3974 return budget - budget_left;
3975}
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988static int napi_rx_handler(struct napi_struct *napi, int budget)
3989{
3990 unsigned int params;
3991 struct sge_rspq *q = container_of(napi, struct sge_rspq, napi);
3992 int work_done;
3993 u32 val;
3994
3995 work_done = process_responses(q, budget);
3996 if (likely(work_done < budget)) {
3997 int timer_index;
3998
3999 napi_complete_done(napi, work_done);
4000 timer_index = QINTR_TIMER_IDX_G(q->next_intr_params);
4001
4002 if (q->adaptive_rx) {
4003 if (work_done > max(timer_pkt_quota[timer_index],
4004 MIN_NAPI_WORK))
4005 timer_index = (timer_index + 1);
4006 else
4007 timer_index = timer_index - 1;
4008
4009 timer_index = clamp(timer_index, 0, SGE_TIMERREGS - 1);
4010 q->next_intr_params =
4011 QINTR_TIMER_IDX_V(timer_index) |
4012 QINTR_CNT_EN_V(0);
4013 params = q->next_intr_params;
4014 } else {
4015 params = q->next_intr_params;
4016 q->next_intr_params = q->intr_params;
4017 }
4018 } else
4019 params = QINTR_TIMER_IDX_V(7);
4020
4021 val = CIDXINC_V(work_done) | SEINTARM_V(params);
4022
4023
4024
4025
4026 if (unlikely(q->bar2_addr == NULL)) {
4027 t4_write_reg(q->adap, MYPF_REG(SGE_PF_GTS_A),
4028 val | INGRESSQID_V((u32)q->cntxt_id));
4029 } else {
4030 writel(val | INGRESSQID_V(q->bar2_qid),
4031 q->bar2_addr + SGE_UDB_GTS);
4032 wmb();
4033 }
4034 return work_done;
4035}
4036
4037void cxgb4_ethofld_restart(struct tasklet_struct *t)
4038{
4039 struct sge_eosw_txq *eosw_txq = from_tasklet(eosw_txq, t,
4040 qresume_tsk);
4041 int pktcount;
4042
4043 spin_lock(&eosw_txq->lock);
4044 pktcount = eosw_txq->cidx - eosw_txq->last_cidx;
4045 if (pktcount < 0)
4046 pktcount += eosw_txq->ndesc;
4047
4048 if (pktcount) {
4049 cxgb4_eosw_txq_free_desc(netdev2adap(eosw_txq->netdev),
4050 eosw_txq, pktcount);
4051 eosw_txq->inuse -= pktcount;
4052 }
4053
4054
4055
4056
4057 ethofld_xmit(eosw_txq->netdev, eosw_txq);
4058 spin_unlock(&eosw_txq->lock);
4059}
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069int cxgb4_ethofld_rx_handler(struct sge_rspq *q, const __be64 *rsp,
4070 const struct pkt_gl *si)
4071{
4072 u8 opcode = ((const struct rss_header *)rsp)->opcode;
4073
4074
4075 rsp++;
4076
4077 if (opcode == CPL_FW4_ACK) {
4078 const struct cpl_fw4_ack *cpl;
4079 struct sge_eosw_txq *eosw_txq;
4080 struct eotid_entry *entry;
4081 struct sk_buff *skb;
4082 u32 hdr_len, eotid;
4083 u8 flits, wrlen16;
4084 int credits;
4085
4086 cpl = (const struct cpl_fw4_ack *)rsp;
4087 eotid = CPL_FW4_ACK_FLOWID_G(ntohl(OPCODE_TID(cpl))) -
4088 q->adap->tids.eotid_base;
4089 entry = cxgb4_lookup_eotid(&q->adap->tids, eotid);
4090 if (!entry)
4091 goto out_done;
4092
4093 eosw_txq = (struct sge_eosw_txq *)entry->data;
4094 if (!eosw_txq)
4095 goto out_done;
4096
4097 spin_lock(&eosw_txq->lock);
4098 credits = cpl->credits;
4099 while (credits > 0) {
4100 skb = eosw_txq->desc[eosw_txq->cidx].skb;
4101 if (!skb)
4102 break;
4103
4104 if (unlikely((eosw_txq->state ==
4105 CXGB4_EO_STATE_FLOWC_OPEN_REPLY ||
4106 eosw_txq->state ==
4107 CXGB4_EO_STATE_FLOWC_CLOSE_REPLY) &&
4108 eosw_txq->cidx == eosw_txq->flowc_idx)) {
4109 flits = DIV_ROUND_UP(skb->len, 8);
4110 if (eosw_txq->state ==
4111 CXGB4_EO_STATE_FLOWC_OPEN_REPLY)
4112 eosw_txq->state = CXGB4_EO_STATE_ACTIVE;
4113 else
4114 eosw_txq->state = CXGB4_EO_STATE_CLOSED;
4115 complete(&eosw_txq->completion);
4116 } else {
4117 hdr_len = eth_get_headlen(eosw_txq->netdev,
4118 skb->data,
4119 skb_headlen(skb));
4120 flits = ethofld_calc_tx_flits(q->adap, skb,
4121 hdr_len);
4122 }
4123 eosw_txq_advance_index(&eosw_txq->cidx, 1,
4124 eosw_txq->ndesc);
4125 wrlen16 = DIV_ROUND_UP(flits * 8, 16);
4126 credits -= wrlen16;
4127 }
4128
4129 eosw_txq->cred += cpl->credits;
4130 eosw_txq->ncompl--;
4131
4132 spin_unlock(&eosw_txq->lock);
4133
4134
4135
4136
4137 tasklet_schedule(&eosw_txq->qresume_tsk);
4138 }
4139
4140out_done:
4141 return 0;
4142}
4143
4144
4145
4146
4147irqreturn_t t4_sge_intr_msix(int irq, void *cookie)
4148{
4149 struct sge_rspq *q = cookie;
4150
4151 napi_schedule(&q->napi);
4152 return IRQ_HANDLED;
4153}
4154
4155
4156
4157
4158
4159static unsigned int process_intrq(struct adapter *adap)
4160{
4161 unsigned int credits;
4162 const struct rsp_ctrl *rc;
4163 struct sge_rspq *q = &adap->sge.intrq;
4164 u32 val;
4165
4166 spin_lock(&adap->sge.intrq_lock);
4167 for (credits = 0; ; credits++) {
4168 rc = (void *)q->cur_desc + (q->iqe_len - sizeof(*rc));
4169 if (!is_new_response(rc, q))
4170 break;
4171
4172 dma_rmb();
4173 if (RSPD_TYPE_G(rc->type_gen) == RSPD_TYPE_INTR_X) {
4174 unsigned int qid = ntohl(rc->pldbuflen_qid);
4175
4176 qid -= adap->sge.ingr_start;
4177 napi_schedule(&adap->sge.ingr_map[qid]->napi);
4178 }
4179
4180 rspq_next(q);
4181 }
4182
4183 val = CIDXINC_V(credits) | SEINTARM_V(q->intr_params);
4184
4185
4186
4187
4188 if (unlikely(q->bar2_addr == NULL)) {
4189 t4_write_reg(adap, MYPF_REG(SGE_PF_GTS_A),
4190 val | INGRESSQID_V(q->cntxt_id));
4191 } else {
4192 writel(val | INGRESSQID_V(q->bar2_qid),
4193 q->bar2_addr + SGE_UDB_GTS);
4194 wmb();
4195 }
4196 spin_unlock(&adap->sge.intrq_lock);
4197 return credits;
4198}
4199
4200
4201
4202
4203
4204static irqreturn_t t4_intr_msi(int irq, void *cookie)
4205{
4206 struct adapter *adap = cookie;
4207
4208 if (adap->flags & CXGB4_MASTER_PF)
4209 t4_slow_intr_handler(adap);
4210 process_intrq(adap);
4211 return IRQ_HANDLED;
4212}
4213
4214
4215
4216
4217
4218
4219static irqreturn_t t4_intr_intx(int irq, void *cookie)
4220{
4221 struct adapter *adap = cookie;
4222
4223 t4_write_reg(adap, MYPF_REG(PCIE_PF_CLI_A), 0);
4224 if (((adap->flags & CXGB4_MASTER_PF) && t4_slow_intr_handler(adap)) |
4225 process_intrq(adap))
4226 return IRQ_HANDLED;
4227 return IRQ_NONE;
4228}
4229
4230
4231
4232
4233
4234
4235
4236
4237irq_handler_t t4_intr_handler(struct adapter *adap)
4238{
4239 if (adap->flags & CXGB4_USING_MSIX)
4240 return t4_sge_intr_msix;
4241 if (adap->flags & CXGB4_USING_MSI)
4242 return t4_intr_msi;
4243 return t4_intr_intx;
4244}
4245
4246static void sge_rx_timer_cb(struct timer_list *t)
4247{
4248 unsigned long m;
4249 unsigned int i;
4250 struct adapter *adap = from_timer(adap, t, sge.rx_timer);
4251 struct sge *s = &adap->sge;
4252
4253 for (i = 0; i < BITS_TO_LONGS(s->egr_sz); i++)
4254 for (m = s->starving_fl[i]; m; m &= m - 1) {
4255 struct sge_eth_rxq *rxq;
4256 unsigned int id = __ffs(m) + i * BITS_PER_LONG;
4257 struct sge_fl *fl = s->egr_map[id];
4258
4259 clear_bit(id, s->starving_fl);
4260 smp_mb__after_atomic();
4261
4262 if (fl_starving(adap, fl)) {
4263 rxq = container_of(fl, struct sge_eth_rxq, fl);
4264 if (napi_reschedule(&rxq->rspq.napi))
4265 fl->starving++;
4266 else
4267 set_bit(id, s->starving_fl);
4268 }
4269 }
4270
4271
4272
4273
4274 if (!(adap->flags & CXGB4_MASTER_PF))
4275 goto done;
4276
4277 t4_idma_monitor(adap, &s->idma_monitor, HZ, RX_QCHECK_PERIOD);
4278
4279done:
4280 mod_timer(&s->rx_timer, jiffies + RX_QCHECK_PERIOD);
4281}
4282
4283static void sge_tx_timer_cb(struct timer_list *t)
4284{
4285 struct adapter *adap = from_timer(adap, t, sge.tx_timer);
4286 struct sge *s = &adap->sge;
4287 unsigned long m, period;
4288 unsigned int i, budget;
4289
4290 for (i = 0; i < BITS_TO_LONGS(s->egr_sz); i++)
4291 for (m = s->txq_maperr[i]; m; m &= m - 1) {
4292 unsigned long id = __ffs(m) + i * BITS_PER_LONG;
4293 struct sge_uld_txq *txq = s->egr_map[id];
4294
4295 clear_bit(id, s->txq_maperr);
4296 tasklet_schedule(&txq->qresume_tsk);
4297 }
4298
4299 if (!is_t4(adap->params.chip)) {
4300 struct sge_eth_txq *q = &s->ptptxq;
4301 int avail;
4302
4303 spin_lock(&adap->ptp_lock);
4304 avail = reclaimable(&q->q);
4305
4306 if (avail) {
4307 free_tx_desc(adap, &q->q, avail, false);
4308 q->q.in_use -= avail;
4309 }
4310 spin_unlock(&adap->ptp_lock);
4311 }
4312
4313 budget = MAX_TIMER_TX_RECLAIM;
4314 i = s->ethtxq_rover;
4315 do {
4316 budget -= t4_sge_eth_txq_egress_update(adap, &s->ethtxq[i],
4317 budget);
4318 if (!budget)
4319 break;
4320
4321 if (++i >= s->ethqsets)
4322 i = 0;
4323 } while (i != s->ethtxq_rover);
4324 s->ethtxq_rover = i;
4325
4326 if (budget == 0) {
4327
4328
4329
4330 period = 2;
4331 } else {
4332
4333
4334
4335 period = TX_QCHECK_PERIOD;
4336 }
4337
4338 mod_timer(&s->tx_timer, jiffies + period);
4339}
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354static void __iomem *bar2_address(struct adapter *adapter,
4355 unsigned int qid,
4356 enum t4_bar2_qtype qtype,
4357 unsigned int *pbar2_qid)
4358{
4359 u64 bar2_qoffset;
4360 int ret;
4361
4362 ret = t4_bar2_sge_qregs(adapter, qid, qtype, 0,
4363 &bar2_qoffset, pbar2_qid);
4364 if (ret)
4365 return NULL;
4366
4367 return adapter->bar2 + bar2_qoffset;
4368}
4369
4370
4371
4372
4373int t4_sge_alloc_rxq(struct adapter *adap, struct sge_rspq *iq, bool fwevtq,
4374 struct net_device *dev, int intr_idx,
4375 struct sge_fl *fl, rspq_handler_t hnd,
4376 rspq_flush_handler_t flush_hnd, int cong)
4377{
4378 int ret, flsz = 0;
4379 struct fw_iq_cmd c;
4380 struct sge *s = &adap->sge;
4381 struct port_info *pi = netdev_priv(dev);
4382 int relaxed = !(adap->flags & CXGB4_ROOT_NO_RELAXED_ORDERING);
4383
4384
4385 iq->size = roundup(iq->size, 16);
4386
4387 iq->desc = alloc_ring(adap->pdev_dev, iq->size, iq->iqe_len, 0,
4388 &iq->phys_addr, NULL, 0,
4389 dev_to_node(adap->pdev_dev));
4390 if (!iq->desc)
4391 return -ENOMEM;
4392
4393 memset(&c, 0, sizeof(c));
4394 c.op_to_vfn = htonl(FW_CMD_OP_V(FW_IQ_CMD) | FW_CMD_REQUEST_F |
4395 FW_CMD_WRITE_F | FW_CMD_EXEC_F |
4396 FW_IQ_CMD_PFN_V(adap->pf) | FW_IQ_CMD_VFN_V(0));
4397 c.alloc_to_len16 = htonl(FW_IQ_CMD_ALLOC_F | FW_IQ_CMD_IQSTART_F |
4398 FW_LEN16(c));
4399 c.type_to_iqandstindex = htonl(FW_IQ_CMD_TYPE_V(FW_IQ_TYPE_FL_INT_CAP) |
4400 FW_IQ_CMD_IQASYNCH_V(fwevtq) | FW_IQ_CMD_VIID_V(pi->viid) |
4401 FW_IQ_CMD_IQANDST_V(intr_idx < 0) |
4402 FW_IQ_CMD_IQANUD_V(UPDATEDELIVERY_INTERRUPT_X) |
4403 FW_IQ_CMD_IQANDSTINDEX_V(intr_idx >= 0 ? intr_idx :
4404 -intr_idx - 1));
4405 c.iqdroprss_to_iqesize = htons(FW_IQ_CMD_IQPCIECH_V(pi->tx_chan) |
4406 FW_IQ_CMD_IQGTSMODE_F |
4407 FW_IQ_CMD_IQINTCNTTHRESH_V(iq->pktcnt_idx) |
4408 FW_IQ_CMD_IQESIZE_V(ilog2(iq->iqe_len) - 4));
4409 c.iqsize = htons(iq->size);
4410 c.iqaddr = cpu_to_be64(iq->phys_addr);
4411 if (cong >= 0)
4412 c.iqns_to_fl0congen = htonl(FW_IQ_CMD_IQFLINTCONGEN_F |
4413 FW_IQ_CMD_IQTYPE_V(cong ? FW_IQ_IQTYPE_NIC
4414 : FW_IQ_IQTYPE_OFLD));
4415
4416 if (fl) {
4417 unsigned int chip_ver =
4418 CHELSIO_CHIP_VERSION(adap->params.chip);
4419
4420
4421
4422
4423
4424
4425
4426
4427 if (fl->size < s->fl_starve_thres - 1 + 2 * 8)
4428 fl->size = s->fl_starve_thres - 1 + 2 * 8;
4429 fl->size = roundup(fl->size, 8);
4430 fl->desc = alloc_ring(adap->pdev_dev, fl->size, sizeof(__be64),
4431 sizeof(struct rx_sw_desc), &fl->addr,
4432 &fl->sdesc, s->stat_len,
4433 dev_to_node(adap->pdev_dev));
4434 if (!fl->desc)
4435 goto fl_nomem;
4436
4437 flsz = fl->size / 8 + s->stat_len / sizeof(struct tx_desc);
4438 c.iqns_to_fl0congen |= htonl(FW_IQ_CMD_FL0PACKEN_F |
4439 FW_IQ_CMD_FL0FETCHRO_V(relaxed) |
4440 FW_IQ_CMD_FL0DATARO_V(relaxed) |
4441 FW_IQ_CMD_FL0PADEN_F);
4442 if (cong >= 0)
4443 c.iqns_to_fl0congen |=
4444 htonl(FW_IQ_CMD_FL0CNGCHMAP_V(cong) |
4445 FW_IQ_CMD_FL0CONGCIF_F |
4446 FW_IQ_CMD_FL0CONGEN_F);
4447
4448
4449
4450
4451
4452
4453
4454
4455 c.fl0dcaen_to_fl0cidxfthresh =
4456 htons(FW_IQ_CMD_FL0FBMIN_V(chip_ver <= CHELSIO_T5 ?
4457 FETCHBURSTMIN_128B_X :
4458 FETCHBURSTMIN_64B_T6_X) |
4459 FW_IQ_CMD_FL0FBMAX_V((chip_ver <= CHELSIO_T5) ?
4460 FETCHBURSTMAX_512B_X :
4461 FETCHBURSTMAX_256B_X));
4462 c.fl0size = htons(flsz);
4463 c.fl0addr = cpu_to_be64(fl->addr);
4464 }
4465
4466 ret = t4_wr_mbox(adap, adap->mbox, &c, sizeof(c), &c);
4467 if (ret)
4468 goto err;
4469
4470 netif_napi_add(dev, &iq->napi, napi_rx_handler, 64);
4471 iq->cur_desc = iq->desc;
4472 iq->cidx = 0;
4473 iq->gen = 1;
4474 iq->next_intr_params = iq->intr_params;
4475 iq->cntxt_id = ntohs(c.iqid);
4476 iq->abs_id = ntohs(c.physiqid);
4477 iq->bar2_addr = bar2_address(adap,
4478 iq->cntxt_id,
4479 T4_BAR2_QTYPE_INGRESS,
4480 &iq->bar2_qid);
4481 iq->size--;
4482 iq->netdev = dev;
4483 iq->handler = hnd;
4484 iq->flush_handler = flush_hnd;
4485
4486 memset(&iq->lro_mgr, 0, sizeof(struct t4_lro_mgr));
4487 skb_queue_head_init(&iq->lro_mgr.lroq);
4488
4489
4490 iq->offset = fl ? 0 : -1;
4491
4492 adap->sge.ingr_map[iq->cntxt_id - adap->sge.ingr_start] = iq;
4493
4494 if (fl) {
4495 fl->cntxt_id = ntohs(c.fl0id);
4496 fl->avail = fl->pend_cred = 0;
4497 fl->pidx = fl->cidx = 0;
4498 fl->alloc_failed = fl->large_alloc_failed = fl->starving = 0;
4499 adap->sge.egr_map[fl->cntxt_id - adap->sge.egr_start] = fl;
4500
4501
4502
4503
4504 fl->bar2_addr = bar2_address(adap,
4505 fl->cntxt_id,
4506 T4_BAR2_QTYPE_EGRESS,
4507 &fl->bar2_qid);
4508 refill_fl(adap, fl, fl_cap(fl), GFP_KERNEL);
4509 }
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519 if (!is_t4(adap->params.chip) && cong >= 0) {
4520 u32 param, val, ch_map = 0;
4521 int i;
4522 u16 cng_ch_bits_log = adap->params.arch.cng_ch_bits_log;
4523
4524 param = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DMAQ) |
4525 FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_DMAQ_CONM_CTXT) |
4526 FW_PARAMS_PARAM_YZ_V(iq->cntxt_id));
4527 if (cong == 0) {
4528 val = CONMCTXT_CNGTPMODE_V(CONMCTXT_CNGTPMODE_QUEUE_X);
4529 } else {
4530 val =
4531 CONMCTXT_CNGTPMODE_V(CONMCTXT_CNGTPMODE_CHANNEL_X);
4532 for (i = 0; i < 4; i++) {
4533 if (cong & (1 << i))
4534 ch_map |= 1 << (i << cng_ch_bits_log);
4535 }
4536 val |= CONMCTXT_CNGCHMAP_V(ch_map);
4537 }
4538 ret = t4_set_params(adap, adap->mbox, adap->pf, 0, 1,
4539 ¶m, &val);
4540 if (ret)
4541 dev_warn(adap->pdev_dev, "Failed to set Congestion"
4542 " Manager Context for Ingress Queue %d: %d\n",
4543 iq->cntxt_id, -ret);
4544 }
4545
4546 return 0;
4547
4548fl_nomem:
4549 ret = -ENOMEM;
4550err:
4551 if (iq->desc) {
4552 dma_free_coherent(adap->pdev_dev, iq->size * iq->iqe_len,
4553 iq->desc, iq->phys_addr);
4554 iq->desc = NULL;
4555 }
4556 if (fl && fl->desc) {
4557 kfree(fl->sdesc);
4558 fl->sdesc = NULL;
4559 dma_free_coherent(adap->pdev_dev, flsz * sizeof(struct tx_desc),
4560 fl->desc, fl->addr);
4561 fl->desc = NULL;
4562 }
4563 return ret;
4564}
4565
4566static void init_txq(struct adapter *adap, struct sge_txq *q, unsigned int id)
4567{
4568 q->cntxt_id = id;
4569 q->bar2_addr = bar2_address(adap,
4570 q->cntxt_id,
4571 T4_BAR2_QTYPE_EGRESS,
4572 &q->bar2_qid);
4573 q->in_use = 0;
4574 q->cidx = q->pidx = 0;
4575 q->stops = q->restarts = 0;
4576 q->stat = (void *)&q->desc[q->size];
4577 spin_lock_init(&q->db_lock);
4578 adap->sge.egr_map[id - adap->sge.egr_start] = q;
4579}
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590int t4_sge_alloc_eth_txq(struct adapter *adap, struct sge_eth_txq *txq,
4591 struct net_device *dev, struct netdev_queue *netdevq,
4592 unsigned int iqid, u8 dbqt)
4593{
4594 unsigned int chip_ver = CHELSIO_CHIP_VERSION(adap->params.chip);
4595 struct port_info *pi = netdev_priv(dev);
4596 struct sge *s = &adap->sge;
4597 struct fw_eq_eth_cmd c;
4598 int ret, nentries;
4599
4600
4601 nentries = txq->q.size + s->stat_len / sizeof(struct tx_desc);
4602
4603 txq->q.desc = alloc_ring(adap->pdev_dev, txq->q.size,
4604 sizeof(struct tx_desc), sizeof(struct tx_sw_desc),
4605 &txq->q.phys_addr, &txq->q.sdesc, s->stat_len,
4606 netdev_queue_numa_node_read(netdevq));
4607 if (!txq->q.desc)
4608 return -ENOMEM;
4609
4610 memset(&c, 0, sizeof(c));
4611 c.op_to_vfn = htonl(FW_CMD_OP_V(FW_EQ_ETH_CMD) | FW_CMD_REQUEST_F |
4612 FW_CMD_WRITE_F | FW_CMD_EXEC_F |
4613 FW_EQ_ETH_CMD_PFN_V(adap->pf) |
4614 FW_EQ_ETH_CMD_VFN_V(0));
4615 c.alloc_to_len16 = htonl(FW_EQ_ETH_CMD_ALLOC_F |
4616 FW_EQ_ETH_CMD_EQSTART_F | FW_LEN16(c));
4617
4618
4619
4620
4621
4622
4623
4624 c.autoequiqe_to_viid = htonl(((chip_ver <= CHELSIO_T5) ?
4625 FW_EQ_ETH_CMD_AUTOEQUIQE_F :
4626 FW_EQ_ETH_CMD_AUTOEQUEQE_F) |
4627 FW_EQ_ETH_CMD_VIID_V(pi->viid));
4628
4629 c.fetchszm_to_iqid =
4630 htonl(FW_EQ_ETH_CMD_HOSTFCMODE_V((chip_ver <= CHELSIO_T5) ?
4631 HOSTFCMODE_INGRESS_QUEUE_X :
4632 HOSTFCMODE_STATUS_PAGE_X) |
4633 FW_EQ_ETH_CMD_PCIECHN_V(pi->tx_chan) |
4634 FW_EQ_ETH_CMD_FETCHRO_F | FW_EQ_ETH_CMD_IQID_V(iqid));
4635
4636
4637 c.dcaen_to_eqsize =
4638 htonl(FW_EQ_ETH_CMD_FBMIN_V(chip_ver <= CHELSIO_T5
4639 ? FETCHBURSTMIN_64B_X
4640 : FETCHBURSTMIN_64B_T6_X) |
4641 FW_EQ_ETH_CMD_FBMAX_V(FETCHBURSTMAX_512B_X) |
4642 FW_EQ_ETH_CMD_CIDXFTHRESH_V(CIDXFLUSHTHRESH_32_X) |
4643 FW_EQ_ETH_CMD_CIDXFTHRESHO_V(chip_ver == CHELSIO_T5) |
4644 FW_EQ_ETH_CMD_EQSIZE_V(nentries));
4645
4646 c.eqaddr = cpu_to_be64(txq->q.phys_addr);
4647
4648
4649
4650
4651
4652
4653
4654 if (dbqt)
4655 c.timeren_timerix =
4656 cpu_to_be32(FW_EQ_ETH_CMD_TIMEREN_F |
4657 FW_EQ_ETH_CMD_TIMERIX_V(txq->dbqtimerix));
4658
4659 ret = t4_wr_mbox(adap, adap->mbox, &c, sizeof(c), &c);
4660 if (ret) {
4661 kfree(txq->q.sdesc);
4662 txq->q.sdesc = NULL;
4663 dma_free_coherent(adap->pdev_dev,
4664 nentries * sizeof(struct tx_desc),
4665 txq->q.desc, txq->q.phys_addr);
4666 txq->q.desc = NULL;
4667 return ret;
4668 }
4669
4670 txq->q.q_type = CXGB4_TXQ_ETH;
4671 init_txq(adap, &txq->q, FW_EQ_ETH_CMD_EQID_G(ntohl(c.eqid_pkd)));
4672 txq->txq = netdevq;
4673 txq->tso = 0;
4674 txq->uso = 0;
4675 txq->tx_cso = 0;
4676 txq->vlan_ins = 0;
4677 txq->mapping_err = 0;
4678 txq->dbqt = dbqt;
4679
4680 return 0;
4681}
4682
4683int t4_sge_alloc_ctrl_txq(struct adapter *adap, struct sge_ctrl_txq *txq,
4684 struct net_device *dev, unsigned int iqid,
4685 unsigned int cmplqid)
4686{
4687 unsigned int chip_ver = CHELSIO_CHIP_VERSION(adap->params.chip);
4688 struct port_info *pi = netdev_priv(dev);
4689 struct sge *s = &adap->sge;
4690 struct fw_eq_ctrl_cmd c;
4691 int ret, nentries;
4692
4693
4694 nentries = txq->q.size + s->stat_len / sizeof(struct tx_desc);
4695
4696 txq->q.desc = alloc_ring(adap->pdev_dev, nentries,
4697 sizeof(struct tx_desc), 0, &txq->q.phys_addr,
4698 NULL, 0, dev_to_node(adap->pdev_dev));
4699 if (!txq->q.desc)
4700 return -ENOMEM;
4701
4702 c.op_to_vfn = htonl(FW_CMD_OP_V(FW_EQ_CTRL_CMD) | FW_CMD_REQUEST_F |
4703 FW_CMD_WRITE_F | FW_CMD_EXEC_F |
4704 FW_EQ_CTRL_CMD_PFN_V(adap->pf) |
4705 FW_EQ_CTRL_CMD_VFN_V(0));
4706 c.alloc_to_len16 = htonl(FW_EQ_CTRL_CMD_ALLOC_F |
4707 FW_EQ_CTRL_CMD_EQSTART_F | FW_LEN16(c));
4708 c.cmpliqid_eqid = htonl(FW_EQ_CTRL_CMD_CMPLIQID_V(cmplqid));
4709 c.physeqid_pkd = htonl(0);
4710 c.fetchszm_to_iqid =
4711 htonl(FW_EQ_CTRL_CMD_HOSTFCMODE_V(HOSTFCMODE_STATUS_PAGE_X) |
4712 FW_EQ_CTRL_CMD_PCIECHN_V(pi->tx_chan) |
4713 FW_EQ_CTRL_CMD_FETCHRO_F | FW_EQ_CTRL_CMD_IQID_V(iqid));
4714 c.dcaen_to_eqsize =
4715 htonl(FW_EQ_CTRL_CMD_FBMIN_V(chip_ver <= CHELSIO_T5
4716 ? FETCHBURSTMIN_64B_X
4717 : FETCHBURSTMIN_64B_T6_X) |
4718 FW_EQ_CTRL_CMD_FBMAX_V(FETCHBURSTMAX_512B_X) |
4719 FW_EQ_CTRL_CMD_CIDXFTHRESH_V(CIDXFLUSHTHRESH_32_X) |
4720 FW_EQ_CTRL_CMD_EQSIZE_V(nentries));
4721 c.eqaddr = cpu_to_be64(txq->q.phys_addr);
4722
4723 ret = t4_wr_mbox(adap, adap->mbox, &c, sizeof(c), &c);
4724 if (ret) {
4725 dma_free_coherent(adap->pdev_dev,
4726 nentries * sizeof(struct tx_desc),
4727 txq->q.desc, txq->q.phys_addr);
4728 txq->q.desc = NULL;
4729 return ret;
4730 }
4731
4732 txq->q.q_type = CXGB4_TXQ_CTRL;
4733 init_txq(adap, &txq->q, FW_EQ_CTRL_CMD_EQID_G(ntohl(c.cmpliqid_eqid)));
4734 txq->adap = adap;
4735 skb_queue_head_init(&txq->sendq);
4736 tasklet_setup(&txq->qresume_tsk, restart_ctrlq);
4737 txq->full = 0;
4738 return 0;
4739}
4740
4741int t4_sge_mod_ctrl_txq(struct adapter *adap, unsigned int eqid,
4742 unsigned int cmplqid)
4743{
4744 u32 param, val;
4745
4746 param = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DMAQ) |
4747 FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_DMAQ_EQ_CMPLIQID_CTRL) |
4748 FW_PARAMS_PARAM_YZ_V(eqid));
4749 val = cmplqid;
4750 return t4_set_params(adap, adap->mbox, adap->pf, 0, 1, ¶m, &val);
4751}
4752
4753static int t4_sge_alloc_ofld_txq(struct adapter *adap, struct sge_txq *q,
4754 struct net_device *dev, u32 cmd, u32 iqid)
4755{
4756 unsigned int chip_ver = CHELSIO_CHIP_VERSION(adap->params.chip);
4757 struct port_info *pi = netdev_priv(dev);
4758 struct sge *s = &adap->sge;
4759 struct fw_eq_ofld_cmd c;
4760 u32 fb_min, nentries;
4761 int ret;
4762
4763
4764 nentries = q->size + s->stat_len / sizeof(struct tx_desc);
4765 q->desc = alloc_ring(adap->pdev_dev, q->size, sizeof(struct tx_desc),
4766 sizeof(struct tx_sw_desc), &q->phys_addr,
4767 &q->sdesc, s->stat_len, NUMA_NO_NODE);
4768 if (!q->desc)
4769 return -ENOMEM;
4770
4771 if (chip_ver <= CHELSIO_T5)
4772 fb_min = FETCHBURSTMIN_64B_X;
4773 else
4774 fb_min = FETCHBURSTMIN_64B_T6_X;
4775
4776 memset(&c, 0, sizeof(c));
4777 c.op_to_vfn = htonl(FW_CMD_OP_V(cmd) | FW_CMD_REQUEST_F |
4778 FW_CMD_WRITE_F | FW_CMD_EXEC_F |
4779 FW_EQ_OFLD_CMD_PFN_V(adap->pf) |
4780 FW_EQ_OFLD_CMD_VFN_V(0));
4781 c.alloc_to_len16 = htonl(FW_EQ_OFLD_CMD_ALLOC_F |
4782 FW_EQ_OFLD_CMD_EQSTART_F | FW_LEN16(c));
4783 c.fetchszm_to_iqid =
4784 htonl(FW_EQ_OFLD_CMD_HOSTFCMODE_V(HOSTFCMODE_STATUS_PAGE_X) |
4785 FW_EQ_OFLD_CMD_PCIECHN_V(pi->tx_chan) |
4786 FW_EQ_OFLD_CMD_FETCHRO_F | FW_EQ_OFLD_CMD_IQID_V(iqid));
4787 c.dcaen_to_eqsize =
4788 htonl(FW_EQ_OFLD_CMD_FBMIN_V(fb_min) |
4789 FW_EQ_OFLD_CMD_FBMAX_V(FETCHBURSTMAX_512B_X) |
4790 FW_EQ_OFLD_CMD_CIDXFTHRESH_V(CIDXFLUSHTHRESH_32_X) |
4791 FW_EQ_OFLD_CMD_EQSIZE_V(nentries));
4792 c.eqaddr = cpu_to_be64(q->phys_addr);
4793
4794 ret = t4_wr_mbox(adap, adap->mbox, &c, sizeof(c), &c);
4795 if (ret) {
4796 kfree(q->sdesc);
4797 q->sdesc = NULL;
4798 dma_free_coherent(adap->pdev_dev,
4799 nentries * sizeof(struct tx_desc),
4800 q->desc, q->phys_addr);
4801 q->desc = NULL;
4802 return ret;
4803 }
4804
4805 init_txq(adap, q, FW_EQ_OFLD_CMD_EQID_G(ntohl(c.eqid_pkd)));
4806 return 0;
4807}
4808
4809int t4_sge_alloc_uld_txq(struct adapter *adap, struct sge_uld_txq *txq,
4810 struct net_device *dev, unsigned int iqid,
4811 unsigned int uld_type)
4812{
4813 u32 cmd = FW_EQ_OFLD_CMD;
4814 int ret;
4815
4816 if (unlikely(uld_type == CXGB4_TX_CRYPTO))
4817 cmd = FW_EQ_CTRL_CMD;
4818
4819 ret = t4_sge_alloc_ofld_txq(adap, &txq->q, dev, cmd, iqid);
4820 if (ret)
4821 return ret;
4822
4823 txq->q.q_type = CXGB4_TXQ_ULD;
4824 txq->adap = adap;
4825 skb_queue_head_init(&txq->sendq);
4826 tasklet_setup(&txq->qresume_tsk, restart_ofldq);
4827 txq->full = 0;
4828 txq->mapping_err = 0;
4829 return 0;
4830}
4831
4832int t4_sge_alloc_ethofld_txq(struct adapter *adap, struct sge_eohw_txq *txq,
4833 struct net_device *dev, u32 iqid)
4834{
4835 int ret;
4836
4837 ret = t4_sge_alloc_ofld_txq(adap, &txq->q, dev, FW_EQ_OFLD_CMD, iqid);
4838 if (ret)
4839 return ret;
4840
4841 txq->q.q_type = CXGB4_TXQ_ULD;
4842 spin_lock_init(&txq->lock);
4843 txq->adap = adap;
4844 txq->tso = 0;
4845 txq->uso = 0;
4846 txq->tx_cso = 0;
4847 txq->vlan_ins = 0;
4848 txq->mapping_err = 0;
4849 return 0;
4850}
4851
4852void free_txq(struct adapter *adap, struct sge_txq *q)
4853{
4854 struct sge *s = &adap->sge;
4855
4856 dma_free_coherent(adap->pdev_dev,
4857 q->size * sizeof(struct tx_desc) + s->stat_len,
4858 q->desc, q->phys_addr);
4859 q->cntxt_id = 0;
4860 q->sdesc = NULL;
4861 q->desc = NULL;
4862}
4863
4864void free_rspq_fl(struct adapter *adap, struct sge_rspq *rq,
4865 struct sge_fl *fl)
4866{
4867 struct sge *s = &adap->sge;
4868 unsigned int fl_id = fl ? fl->cntxt_id : 0xffff;
4869
4870 adap->sge.ingr_map[rq->cntxt_id - adap->sge.ingr_start] = NULL;
4871 t4_iq_free(adap, adap->mbox, adap->pf, 0, FW_IQ_TYPE_FL_INT_CAP,
4872 rq->cntxt_id, fl_id, 0xffff);
4873 dma_free_coherent(adap->pdev_dev, (rq->size + 1) * rq->iqe_len,
4874 rq->desc, rq->phys_addr);
4875 netif_napi_del(&rq->napi);
4876 rq->netdev = NULL;
4877 rq->cntxt_id = rq->abs_id = 0;
4878 rq->desc = NULL;
4879
4880 if (fl) {
4881 free_rx_bufs(adap, fl, fl->avail);
4882 dma_free_coherent(adap->pdev_dev, fl->size * 8 + s->stat_len,
4883 fl->desc, fl->addr);
4884 kfree(fl->sdesc);
4885 fl->sdesc = NULL;
4886 fl->cntxt_id = 0;
4887 fl->desc = NULL;
4888 }
4889}
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899void t4_free_ofld_rxqs(struct adapter *adap, int n, struct sge_ofld_rxq *q)
4900{
4901 for ( ; n; n--, q++)
4902 if (q->rspq.desc)
4903 free_rspq_fl(adap, &q->rspq,
4904 q->fl.size ? &q->fl : NULL);
4905}
4906
4907void t4_sge_free_ethofld_txq(struct adapter *adap, struct sge_eohw_txq *txq)
4908{
4909 if (txq->q.desc) {
4910 t4_ofld_eq_free(adap, adap->mbox, adap->pf, 0,
4911 txq->q.cntxt_id);
4912 free_tx_desc(adap, &txq->q, txq->q.in_use, false);
4913 kfree(txq->q.sdesc);
4914 free_txq(adap, &txq->q);
4915 }
4916}
4917
4918
4919
4920
4921
4922
4923
4924void t4_free_sge_resources(struct adapter *adap)
4925{
4926 int i;
4927 struct sge_eth_rxq *eq;
4928 struct sge_eth_txq *etq;
4929
4930
4931 for (i = 0; i < adap->sge.ethqsets; i++) {
4932 eq = &adap->sge.ethrxq[i];
4933 if (eq->rspq.desc)
4934 t4_iq_stop(adap, adap->mbox, adap->pf, 0,
4935 FW_IQ_TYPE_FL_INT_CAP,
4936 eq->rspq.cntxt_id,
4937 eq->fl.size ? eq->fl.cntxt_id : 0xffff,
4938 0xffff);
4939 }
4940
4941
4942 for (i = 0; i < adap->sge.ethqsets; i++) {
4943 eq = &adap->sge.ethrxq[i];
4944 if (eq->rspq.desc)
4945 free_rspq_fl(adap, &eq->rspq,
4946 eq->fl.size ? &eq->fl : NULL);
4947 if (eq->msix) {
4948 cxgb4_free_msix_idx_in_bmap(adap, eq->msix->idx);
4949 eq->msix = NULL;
4950 }
4951
4952 etq = &adap->sge.ethtxq[i];
4953 if (etq->q.desc) {
4954 t4_eth_eq_free(adap, adap->mbox, adap->pf, 0,
4955 etq->q.cntxt_id);
4956 __netif_tx_lock_bh(etq->txq);
4957 free_tx_desc(adap, &etq->q, etq->q.in_use, true);
4958 __netif_tx_unlock_bh(etq->txq);
4959 kfree(etq->q.sdesc);
4960 free_txq(adap, &etq->q);
4961 }
4962 }
4963
4964
4965 for (i = 0; i < ARRAY_SIZE(adap->sge.ctrlq); i++) {
4966 struct sge_ctrl_txq *cq = &adap->sge.ctrlq[i];
4967
4968 if (cq->q.desc) {
4969 tasklet_kill(&cq->qresume_tsk);
4970 t4_ctrl_eq_free(adap, adap->mbox, adap->pf, 0,
4971 cq->q.cntxt_id);
4972 __skb_queue_purge(&cq->sendq);
4973 free_txq(adap, &cq->q);
4974 }
4975 }
4976
4977 if (adap->sge.fw_evtq.desc) {
4978 free_rspq_fl(adap, &adap->sge.fw_evtq, NULL);
4979 if (adap->sge.fwevtq_msix_idx >= 0)
4980 cxgb4_free_msix_idx_in_bmap(adap,
4981 adap->sge.fwevtq_msix_idx);
4982 }
4983
4984 if (adap->sge.nd_msix_idx >= 0)
4985 cxgb4_free_msix_idx_in_bmap(adap, adap->sge.nd_msix_idx);
4986
4987 if (adap->sge.intrq.desc)
4988 free_rspq_fl(adap, &adap->sge.intrq, NULL);
4989
4990 if (!is_t4(adap->params.chip)) {
4991 etq = &adap->sge.ptptxq;
4992 if (etq->q.desc) {
4993 t4_eth_eq_free(adap, adap->mbox, adap->pf, 0,
4994 etq->q.cntxt_id);
4995 spin_lock_bh(&adap->ptp_lock);
4996 free_tx_desc(adap, &etq->q, etq->q.in_use, true);
4997 spin_unlock_bh(&adap->ptp_lock);
4998 kfree(etq->q.sdesc);
4999 free_txq(adap, &etq->q);
5000 }
5001 }
5002
5003
5004 memset(adap->sge.egr_map, 0,
5005 adap->sge.egr_sz * sizeof(*adap->sge.egr_map));
5006}
5007
5008void t4_sge_start(struct adapter *adap)
5009{
5010 adap->sge.ethtxq_rover = 0;
5011 mod_timer(&adap->sge.rx_timer, jiffies + RX_QCHECK_PERIOD);
5012 mod_timer(&adap->sge.tx_timer, jiffies + TX_QCHECK_PERIOD);
5013}
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023void t4_sge_stop(struct adapter *adap)
5024{
5025 int i;
5026 struct sge *s = &adap->sge;
5027
5028 if (s->rx_timer.function)
5029 del_timer_sync(&s->rx_timer);
5030 if (s->tx_timer.function)
5031 del_timer_sync(&s->tx_timer);
5032
5033 if (is_offload(adap)) {
5034 struct sge_uld_txq_info *txq_info;
5035
5036 txq_info = adap->sge.uld_txq_info[CXGB4_TX_OFLD];
5037 if (txq_info) {
5038 struct sge_uld_txq *txq = txq_info->uldtxq;
5039
5040 for_each_ofldtxq(&adap->sge, i) {
5041 if (txq->q.desc)
5042 tasklet_kill(&txq->qresume_tsk);
5043 }
5044 }
5045 }
5046
5047 if (is_pci_uld(adap)) {
5048 struct sge_uld_txq_info *txq_info;
5049
5050 txq_info = adap->sge.uld_txq_info[CXGB4_TX_CRYPTO];
5051 if (txq_info) {
5052 struct sge_uld_txq *txq = txq_info->uldtxq;
5053
5054 for_each_ofldtxq(&adap->sge, i) {
5055 if (txq->q.desc)
5056 tasklet_kill(&txq->qresume_tsk);
5057 }
5058 }
5059 }
5060
5061 for (i = 0; i < ARRAY_SIZE(s->ctrlq); i++) {
5062 struct sge_ctrl_txq *cq = &s->ctrlq[i];
5063
5064 if (cq->q.desc)
5065 tasklet_kill(&cq->qresume_tsk);
5066 }
5067}
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077static int t4_sge_init_soft(struct adapter *adap)
5078{
5079 struct sge *s = &adap->sge;
5080 u32 fl_small_pg, fl_large_pg, fl_small_mtu, fl_large_mtu;
5081 u32 timer_value_0_and_1, timer_value_2_and_3, timer_value_4_and_5;
5082 u32 ingress_rx_threshold;
5083
5084
5085
5086
5087
5088
5089 if ((t4_read_reg(adap, SGE_CONTROL_A) & RXPKTCPLMODE_F) !=
5090 RXPKTCPLMODE_V(RXPKTCPLMODE_SPLIT_X)) {
5091 dev_err(adap->pdev_dev, "bad SGE CPL MODE\n");
5092 return -EINVAL;
5093 }
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103 #define READ_FL_BUF(x) \
5104 t4_read_reg(adap, SGE_FL_BUFFER_SIZE0_A+(x)*sizeof(u32))
5105
5106 fl_small_pg = READ_FL_BUF(RX_SMALL_PG_BUF);
5107 fl_large_pg = READ_FL_BUF(RX_LARGE_PG_BUF);
5108 fl_small_mtu = READ_FL_BUF(RX_SMALL_MTU_BUF);
5109 fl_large_mtu = READ_FL_BUF(RX_LARGE_MTU_BUF);
5110
5111
5112
5113
5114 if (fl_large_pg <= fl_small_pg)
5115 fl_large_pg = 0;
5116
5117 #undef READ_FL_BUF
5118
5119
5120
5121
5122 if (fl_small_pg != PAGE_SIZE ||
5123 (fl_large_pg & (fl_large_pg-1)) != 0) {
5124 dev_err(adap->pdev_dev, "bad SGE FL page buffer sizes [%d, %d]\n",
5125 fl_small_pg, fl_large_pg);
5126 return -EINVAL;
5127 }
5128 if (fl_large_pg)
5129 s->fl_pg_order = ilog2(fl_large_pg) - PAGE_SHIFT;
5130
5131 if (fl_small_mtu < FL_MTU_SMALL_BUFSIZE(adap) ||
5132 fl_large_mtu < FL_MTU_LARGE_BUFSIZE(adap)) {
5133 dev_err(adap->pdev_dev, "bad SGE FL MTU sizes [%d, %d]\n",
5134 fl_small_mtu, fl_large_mtu);
5135 return -EINVAL;
5136 }
5137
5138
5139
5140
5141
5142 timer_value_0_and_1 = t4_read_reg(adap, SGE_TIMER_VALUE_0_AND_1_A);
5143 timer_value_2_and_3 = t4_read_reg(adap, SGE_TIMER_VALUE_2_AND_3_A);
5144 timer_value_4_and_5 = t4_read_reg(adap, SGE_TIMER_VALUE_4_AND_5_A);
5145 s->timer_val[0] = core_ticks_to_us(adap,
5146 TIMERVALUE0_G(timer_value_0_and_1));
5147 s->timer_val[1] = core_ticks_to_us(adap,
5148 TIMERVALUE1_G(timer_value_0_and_1));
5149 s->timer_val[2] = core_ticks_to_us(adap,
5150 TIMERVALUE2_G(timer_value_2_and_3));
5151 s->timer_val[3] = core_ticks_to_us(adap,
5152 TIMERVALUE3_G(timer_value_2_and_3));
5153 s->timer_val[4] = core_ticks_to_us(adap,
5154 TIMERVALUE4_G(timer_value_4_and_5));
5155 s->timer_val[5] = core_ticks_to_us(adap,
5156 TIMERVALUE5_G(timer_value_4_and_5));
5157
5158 ingress_rx_threshold = t4_read_reg(adap, SGE_INGRESS_RX_THRESHOLD_A);
5159 s->counter_val[0] = THRESHOLD_0_G(ingress_rx_threshold);
5160 s->counter_val[1] = THRESHOLD_1_G(ingress_rx_threshold);
5161 s->counter_val[2] = THRESHOLD_2_G(ingress_rx_threshold);
5162 s->counter_val[3] = THRESHOLD_3_G(ingress_rx_threshold);
5163
5164 return 0;
5165}
5166
5167
5168
5169
5170
5171
5172
5173
5174int t4_sge_init(struct adapter *adap)
5175{
5176 struct sge *s = &adap->sge;
5177 u32 sge_control, sge_conm_ctrl;
5178 int ret, egress_threshold;
5179
5180
5181
5182
5183
5184 sge_control = t4_read_reg(adap, SGE_CONTROL_A);
5185 s->pktshift = PKTSHIFT_G(sge_control);
5186 s->stat_len = (sge_control & EGRSTATUSPAGESIZE_F) ? 128 : 64;
5187
5188 s->fl_align = t4_fl_pkt_align(adap);
5189 ret = t4_sge_init_soft(adap);
5190 if (ret < 0)
5191 return ret;
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205 sge_conm_ctrl = t4_read_reg(adap, SGE_CONM_CTRL_A);
5206 switch (CHELSIO_CHIP_VERSION(adap->params.chip)) {
5207 case CHELSIO_T4:
5208 egress_threshold = EGRTHRESHOLD_G(sge_conm_ctrl);
5209 break;
5210 case CHELSIO_T5:
5211 egress_threshold = EGRTHRESHOLDPACKING_G(sge_conm_ctrl);
5212 break;
5213 case CHELSIO_T6:
5214 egress_threshold = T6_EGRTHRESHOLDPACKING_G(sge_conm_ctrl);
5215 break;
5216 default:
5217 dev_err(adap->pdev_dev, "Unsupported Chip version %d\n",
5218 CHELSIO_CHIP_VERSION(adap->params.chip));
5219 return -EINVAL;
5220 }
5221 s->fl_starve_thres = 2*egress_threshold + 1;
5222
5223 t4_idma_monitor_init(adap, &s->idma_monitor);
5224
5225
5226
5227
5228 timer_setup(&s->rx_timer, sge_rx_timer_cb, 0);
5229 timer_setup(&s->tx_timer, sge_tx_timer_cb, 0);
5230
5231 spin_lock_init(&s->intrq_lock);
5232
5233 return 0;
5234}
5235