0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035 #include <linux/skbuff.h>
0036 #include <linux/netdevice.h>
0037 #include <linux/etherdevice.h>
0038 #include <linux/if_vlan.h>
0039 #include <linux/ip.h>
0040 #include <linux/dma-mapping.h>
0041 #include <linux/jiffies.h>
0042 #include <linux/prefetch.h>
0043 #include <linux/export.h>
0044 #include <net/xfrm.h>
0045 #include <net/ipv6.h>
0046 #include <net/tcp.h>
0047 #include <net/busy_poll.h>
0048 #ifdef CONFIG_CHELSIO_T4_FCOE
0049 #include <scsi/fc/fc_fcoe.h>
0050 #endif
0051 #include "cxgb4.h"
0052 #include "t4_regs.h"
0053 #include "t4_values.h"
0054 #include "t4_msg.h"
0055 #include "t4fw_api.h"
0056 #include "cxgb4_ptp.h"
0057 #include "cxgb4_uld.h"
0058 #include "cxgb4_tc_mqprio.h"
0059 #include "sched.h"
0060
0061
0062
0063
0064
0065 #if PAGE_SHIFT >= 16
0066 # define FL_PG_ORDER 0
0067 #else
0068 # define FL_PG_ORDER (16 - PAGE_SHIFT)
0069 #endif
0070
0071
0072 #define RX_COPY_THRES 256
0073 #define RX_PULL_LEN 128
0074
0075
0076
0077
0078
0079 #define RX_PKT_SKB_LEN 512
0080
0081
0082
0083
0084
0085
0086
0087
0088 #define MAX_TX_RECLAIM 32
0089
0090
0091
0092
0093
0094 #define MAX_RX_REFILL 16U
0095
0096
0097
0098
0099
0100 #define RX_QCHECK_PERIOD (HZ / 2)
0101
0102
0103
0104
0105 #define TX_QCHECK_PERIOD (HZ / 2)
0106
0107
0108
0109
0110 #define MAX_TIMER_TX_RECLAIM 100
0111
0112
0113
0114
0115 #define NOMEM_TMR_IDX (SGE_NTIMERS - 1)
0116
0117
0118
0119
0120
0121 #define TXQ_STOP_THRES (SGE_MAX_WR_LEN / sizeof(struct tx_desc))
0122
0123
0124
0125
0126
0127 #define MAX_IMM_TX_PKT_LEN 256
0128
0129
0130
0131
0132 #define MAX_CTRL_WR_LEN SGE_MAX_WR_LEN
0133
0134 struct rx_sw_desc {
0135 struct page *page;
0136 dma_addr_t dma_addr;
0137 };
0138
0139
0140
0141
0142
0143
0144
0145 #define FL_MTU_SMALL 1500
0146 #define FL_MTU_LARGE 9000
0147
0148 static inline unsigned int fl_mtu_bufsize(struct adapter *adapter,
0149 unsigned int mtu)
0150 {
0151 struct sge *s = &adapter->sge;
0152
0153 return ALIGN(s->pktshift + ETH_HLEN + VLAN_HLEN + mtu, s->fl_align);
0154 }
0155
0156 #define FL_MTU_SMALL_BUFSIZE(adapter) fl_mtu_bufsize(adapter, FL_MTU_SMALL)
0157 #define FL_MTU_LARGE_BUFSIZE(adapter) fl_mtu_bufsize(adapter, FL_MTU_LARGE)
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169 enum {
0170 RX_BUF_FLAGS = 0x1f,
0171 RX_BUF_SIZE = 0x0f,
0172 RX_UNMAPPED_BUF = 0x10,
0173
0174
0175
0176
0177
0178
0179
0180
0181 RX_SMALL_PG_BUF = 0x0,
0182 RX_LARGE_PG_BUF = 0x1,
0183
0184 RX_SMALL_MTU_BUF = 0x2,
0185 RX_LARGE_MTU_BUF = 0x3,
0186 };
0187
0188 static int timer_pkt_quota[] = {1, 1, 2, 3, 4, 5};
0189 #define MIN_NAPI_WORK 1
0190
0191 static inline dma_addr_t get_buf_addr(const struct rx_sw_desc *d)
0192 {
0193 return d->dma_addr & ~(dma_addr_t)RX_BUF_FLAGS;
0194 }
0195
0196 static inline bool is_buf_mapped(const struct rx_sw_desc *d)
0197 {
0198 return !(d->dma_addr & RX_UNMAPPED_BUF);
0199 }
0200
0201
0202
0203
0204
0205
0206
0207
0208 static inline unsigned int txq_avail(const struct sge_txq *q)
0209 {
0210 return q->size - 1 - q->in_use;
0211 }
0212
0213
0214
0215
0216
0217
0218
0219
0220
0221 static inline unsigned int fl_cap(const struct sge_fl *fl)
0222 {
0223 return fl->size - 8;
0224 }
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235 static inline bool fl_starving(const struct adapter *adapter,
0236 const struct sge_fl *fl)
0237 {
0238 const struct sge *s = &adapter->sge;
0239
0240 return fl->avail - fl->pend_cred <= s->fl_starve_thres;
0241 }
0242
0243 int cxgb4_map_skb(struct device *dev, const struct sk_buff *skb,
0244 dma_addr_t *addr)
0245 {
0246 const skb_frag_t *fp, *end;
0247 const struct skb_shared_info *si;
0248
0249 *addr = dma_map_single(dev, skb->data, skb_headlen(skb), DMA_TO_DEVICE);
0250 if (dma_mapping_error(dev, *addr))
0251 goto out_err;
0252
0253 si = skb_shinfo(skb);
0254 end = &si->frags[si->nr_frags];
0255
0256 for (fp = si->frags; fp < end; fp++) {
0257 *++addr = skb_frag_dma_map(dev, fp, 0, skb_frag_size(fp),
0258 DMA_TO_DEVICE);
0259 if (dma_mapping_error(dev, *addr))
0260 goto unwind;
0261 }
0262 return 0;
0263
0264 unwind:
0265 while (fp-- > si->frags)
0266 dma_unmap_page(dev, *--addr, skb_frag_size(fp), DMA_TO_DEVICE);
0267
0268 dma_unmap_single(dev, addr[-1], skb_headlen(skb), DMA_TO_DEVICE);
0269 out_err:
0270 return -ENOMEM;
0271 }
0272 EXPORT_SYMBOL(cxgb4_map_skb);
0273
0274 static void unmap_skb(struct device *dev, const struct sk_buff *skb,
0275 const dma_addr_t *addr)
0276 {
0277 const skb_frag_t *fp, *end;
0278 const struct skb_shared_info *si;
0279
0280 dma_unmap_single(dev, *addr++, skb_headlen(skb), DMA_TO_DEVICE);
0281
0282 si = skb_shinfo(skb);
0283 end = &si->frags[si->nr_frags];
0284 for (fp = si->frags; fp < end; fp++)
0285 dma_unmap_page(dev, *addr++, skb_frag_size(fp), DMA_TO_DEVICE);
0286 }
0287
0288 #ifdef CONFIG_NEED_DMA_MAP_STATE
0289
0290
0291
0292
0293
0294
0295
0296
0297 static void deferred_unmap_destructor(struct sk_buff *skb)
0298 {
0299 unmap_skb(skb->dev->dev.parent, skb, (dma_addr_t *)skb->head);
0300 }
0301 #endif
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313 void free_tx_desc(struct adapter *adap, struct sge_txq *q,
0314 unsigned int n, bool unmap)
0315 {
0316 unsigned int cidx = q->cidx;
0317 struct tx_sw_desc *d;
0318
0319 d = &q->sdesc[cidx];
0320 while (n--) {
0321 if (d->skb) {
0322 if (unmap && d->addr[0]) {
0323 unmap_skb(adap->pdev_dev, d->skb, d->addr);
0324 memset(d->addr, 0, sizeof(d->addr));
0325 }
0326 dev_consume_skb_any(d->skb);
0327 d->skb = NULL;
0328 }
0329 ++d;
0330 if (++cidx == q->size) {
0331 cidx = 0;
0332 d = q->sdesc;
0333 }
0334 }
0335 q->cidx = cidx;
0336 }
0337
0338
0339
0340
0341 static inline int reclaimable(const struct sge_txq *q)
0342 {
0343 int hw_cidx = ntohs(READ_ONCE(q->stat->cidx));
0344 hw_cidx -= q->cidx;
0345 return hw_cidx < 0 ? hw_cidx + q->size : hw_cidx;
0346 }
0347
0348
0349
0350
0351
0352
0353
0354
0355
0356
0357
0358
0359 static inline int reclaim_completed_tx(struct adapter *adap, struct sge_txq *q,
0360 int maxreclaim, bool unmap)
0361 {
0362 int reclaim = reclaimable(q);
0363
0364 if (reclaim) {
0365
0366
0367
0368
0369 if (maxreclaim < 0)
0370 maxreclaim = MAX_TX_RECLAIM;
0371 if (reclaim > maxreclaim)
0372 reclaim = maxreclaim;
0373
0374 free_tx_desc(adap, q, reclaim, unmap);
0375 q->in_use -= reclaim;
0376 }
0377
0378 return reclaim;
0379 }
0380
0381
0382
0383
0384
0385
0386
0387
0388
0389
0390
0391 void cxgb4_reclaim_completed_tx(struct adapter *adap, struct sge_txq *q,
0392 bool unmap)
0393 {
0394 (void)reclaim_completed_tx(adap, q, -1, unmap);
0395 }
0396 EXPORT_SYMBOL(cxgb4_reclaim_completed_tx);
0397
0398 static inline int get_buf_size(struct adapter *adapter,
0399 const struct rx_sw_desc *d)
0400 {
0401 struct sge *s = &adapter->sge;
0402 unsigned int rx_buf_size_idx = d->dma_addr & RX_BUF_SIZE;
0403 int buf_size;
0404
0405 switch (rx_buf_size_idx) {
0406 case RX_SMALL_PG_BUF:
0407 buf_size = PAGE_SIZE;
0408 break;
0409
0410 case RX_LARGE_PG_BUF:
0411 buf_size = PAGE_SIZE << s->fl_pg_order;
0412 break;
0413
0414 case RX_SMALL_MTU_BUF:
0415 buf_size = FL_MTU_SMALL_BUFSIZE(adapter);
0416 break;
0417
0418 case RX_LARGE_MTU_BUF:
0419 buf_size = FL_MTU_LARGE_BUFSIZE(adapter);
0420 break;
0421
0422 default:
0423 BUG();
0424 }
0425
0426 return buf_size;
0427 }
0428
0429
0430
0431
0432
0433
0434
0435
0436
0437
0438 static void free_rx_bufs(struct adapter *adap, struct sge_fl *q, int n)
0439 {
0440 while (n--) {
0441 struct rx_sw_desc *d = &q->sdesc[q->cidx];
0442
0443 if (is_buf_mapped(d))
0444 dma_unmap_page(adap->pdev_dev, get_buf_addr(d),
0445 get_buf_size(adap, d),
0446 DMA_FROM_DEVICE);
0447 put_page(d->page);
0448 d->page = NULL;
0449 if (++q->cidx == q->size)
0450 q->cidx = 0;
0451 q->avail--;
0452 }
0453 }
0454
0455
0456
0457
0458
0459
0460
0461
0462
0463
0464
0465
0466 static void unmap_rx_buf(struct adapter *adap, struct sge_fl *q)
0467 {
0468 struct rx_sw_desc *d = &q->sdesc[q->cidx];
0469
0470 if (is_buf_mapped(d))
0471 dma_unmap_page(adap->pdev_dev, get_buf_addr(d),
0472 get_buf_size(adap, d), DMA_FROM_DEVICE);
0473 d->page = NULL;
0474 if (++q->cidx == q->size)
0475 q->cidx = 0;
0476 q->avail--;
0477 }
0478
0479 static inline void ring_fl_db(struct adapter *adap, struct sge_fl *q)
0480 {
0481 if (q->pend_cred >= 8) {
0482 u32 val = adap->params.arch.sge_fl_db;
0483
0484 if (is_t4(adap->params.chip))
0485 val |= PIDX_V(q->pend_cred / 8);
0486 else
0487 val |= PIDX_T5_V(q->pend_cred / 8);
0488
0489
0490
0491
0492 wmb();
0493
0494
0495
0496
0497
0498 if (unlikely(q->bar2_addr == NULL)) {
0499 t4_write_reg(adap, MYPF_REG(SGE_PF_KDOORBELL_A),
0500 val | QID_V(q->cntxt_id));
0501 } else {
0502 writel(val | QID_V(q->bar2_qid),
0503 q->bar2_addr + SGE_UDB_KDOORBELL);
0504
0505
0506
0507
0508 wmb();
0509 }
0510 q->pend_cred &= 7;
0511 }
0512 }
0513
0514 static inline void set_rx_sw_desc(struct rx_sw_desc *sd, struct page *pg,
0515 dma_addr_t mapping)
0516 {
0517 sd->page = pg;
0518 sd->dma_addr = mapping;
0519 }
0520
0521
0522
0523
0524
0525
0526
0527
0528
0529
0530
0531
0532
0533
0534
0535 static unsigned int refill_fl(struct adapter *adap, struct sge_fl *q, int n,
0536 gfp_t gfp)
0537 {
0538 struct sge *s = &adap->sge;
0539 struct page *pg;
0540 dma_addr_t mapping;
0541 unsigned int cred = q->avail;
0542 __be64 *d = &q->desc[q->pidx];
0543 struct rx_sw_desc *sd = &q->sdesc[q->pidx];
0544 int node;
0545
0546 #ifdef CONFIG_DEBUG_FS
0547 if (test_bit(q->cntxt_id - adap->sge.egr_start, adap->sge.blocked_fl))
0548 goto out;
0549 #endif
0550
0551 gfp |= __GFP_NOWARN;
0552 node = dev_to_node(adap->pdev_dev);
0553
0554 if (s->fl_pg_order == 0)
0555 goto alloc_small_pages;
0556
0557
0558
0559
0560 while (n) {
0561 pg = alloc_pages_node(node, gfp | __GFP_COMP, s->fl_pg_order);
0562 if (unlikely(!pg)) {
0563 q->large_alloc_failed++;
0564 break;
0565 }
0566
0567 mapping = dma_map_page(adap->pdev_dev, pg, 0,
0568 PAGE_SIZE << s->fl_pg_order,
0569 DMA_FROM_DEVICE);
0570 if (unlikely(dma_mapping_error(adap->pdev_dev, mapping))) {
0571 __free_pages(pg, s->fl_pg_order);
0572 q->mapping_err++;
0573 goto out;
0574 }
0575 mapping |= RX_LARGE_PG_BUF;
0576 *d++ = cpu_to_be64(mapping);
0577
0578 set_rx_sw_desc(sd, pg, mapping);
0579 sd++;
0580
0581 q->avail++;
0582 if (++q->pidx == q->size) {
0583 q->pidx = 0;
0584 sd = q->sdesc;
0585 d = q->desc;
0586 }
0587 n--;
0588 }
0589
0590 alloc_small_pages:
0591 while (n--) {
0592 pg = alloc_pages_node(node, gfp, 0);
0593 if (unlikely(!pg)) {
0594 q->alloc_failed++;
0595 break;
0596 }
0597
0598 mapping = dma_map_page(adap->pdev_dev, pg, 0, PAGE_SIZE,
0599 DMA_FROM_DEVICE);
0600 if (unlikely(dma_mapping_error(adap->pdev_dev, mapping))) {
0601 put_page(pg);
0602 q->mapping_err++;
0603 goto out;
0604 }
0605 *d++ = cpu_to_be64(mapping);
0606
0607 set_rx_sw_desc(sd, pg, mapping);
0608 sd++;
0609
0610 q->avail++;
0611 if (++q->pidx == q->size) {
0612 q->pidx = 0;
0613 sd = q->sdesc;
0614 d = q->desc;
0615 }
0616 }
0617
0618 out: cred = q->avail - cred;
0619 q->pend_cred += cred;
0620 ring_fl_db(adap, q);
0621
0622 if (unlikely(fl_starving(adap, q))) {
0623 smp_wmb();
0624 q->low++;
0625 set_bit(q->cntxt_id - adap->sge.egr_start,
0626 adap->sge.starving_fl);
0627 }
0628
0629 return cred;
0630 }
0631
0632 static inline void __refill_fl(struct adapter *adap, struct sge_fl *fl)
0633 {
0634 refill_fl(adap, fl, min(MAX_RX_REFILL, fl_cap(fl) - fl->avail),
0635 GFP_ATOMIC);
0636 }
0637
0638
0639
0640
0641
0642
0643
0644
0645
0646
0647
0648
0649
0650
0651
0652
0653
0654
0655
0656
0657 static void *alloc_ring(struct device *dev, size_t nelem, size_t elem_size,
0658 size_t sw_size, dma_addr_t *phys, void *metadata,
0659 size_t stat_size, int node)
0660 {
0661 size_t len = nelem * elem_size + stat_size;
0662 void *s = NULL;
0663 void *p = dma_alloc_coherent(dev, len, phys, GFP_KERNEL);
0664
0665 if (!p)
0666 return NULL;
0667 if (sw_size) {
0668 s = kcalloc_node(sw_size, nelem, GFP_KERNEL, node);
0669
0670 if (!s) {
0671 dma_free_coherent(dev, len, p, *phys);
0672 return NULL;
0673 }
0674 }
0675 if (metadata)
0676 *(void **)metadata = s;
0677 return p;
0678 }
0679
0680
0681
0682
0683
0684
0685
0686
0687 static inline unsigned int sgl_len(unsigned int n)
0688 {
0689
0690
0691
0692
0693
0694
0695
0696
0697
0698
0699
0700
0701
0702
0703
0704
0705 n--;
0706 return (3 * n) / 2 + (n & 1) + 2;
0707 }
0708
0709
0710
0711
0712
0713
0714
0715
0716 static inline unsigned int flits_to_desc(unsigned int n)
0717 {
0718 BUG_ON(n > SGE_MAX_WR_LEN / 8);
0719 return DIV_ROUND_UP(n, 8);
0720 }
0721
0722
0723
0724
0725
0726
0727
0728
0729
0730 static inline int is_eth_imm(const struct sk_buff *skb, unsigned int chip_ver)
0731 {
0732 int hdrlen = 0;
0733
0734 if (skb->encapsulation && skb_shinfo(skb)->gso_size &&
0735 chip_ver > CHELSIO_T5) {
0736 hdrlen = sizeof(struct cpl_tx_tnl_lso);
0737 hdrlen += sizeof(struct cpl_tx_pkt_core);
0738 } else if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4) {
0739 return 0;
0740 } else {
0741 hdrlen = skb_shinfo(skb)->gso_size ?
0742 sizeof(struct cpl_tx_pkt_lso_core) : 0;
0743 hdrlen += sizeof(struct cpl_tx_pkt);
0744 }
0745 if (skb->len <= MAX_IMM_TX_PKT_LEN - hdrlen)
0746 return hdrlen;
0747 return 0;
0748 }
0749
0750
0751
0752
0753
0754
0755
0756
0757
0758 static inline unsigned int calc_tx_flits(const struct sk_buff *skb,
0759 unsigned int chip_ver)
0760 {
0761 unsigned int flits;
0762 int hdrlen = is_eth_imm(skb, chip_ver);
0763
0764
0765
0766
0767
0768
0769 if (hdrlen)
0770 return DIV_ROUND_UP(skb->len + hdrlen, sizeof(__be64));
0771
0772
0773
0774
0775
0776
0777
0778
0779
0780 flits = sgl_len(skb_shinfo(skb)->nr_frags + 1);
0781 if (skb_shinfo(skb)->gso_size) {
0782 if (skb->encapsulation && chip_ver > CHELSIO_T5) {
0783 hdrlen = sizeof(struct fw_eth_tx_pkt_wr) +
0784 sizeof(struct cpl_tx_tnl_lso);
0785 } else if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4) {
0786 u32 pkt_hdrlen;
0787
0788 pkt_hdrlen = eth_get_headlen(skb->dev, skb->data,
0789 skb_headlen(skb));
0790 hdrlen = sizeof(struct fw_eth_tx_eo_wr) +
0791 round_up(pkt_hdrlen, 16);
0792 } else {
0793 hdrlen = sizeof(struct fw_eth_tx_pkt_wr) +
0794 sizeof(struct cpl_tx_pkt_lso_core);
0795 }
0796
0797 hdrlen += sizeof(struct cpl_tx_pkt_core);
0798 flits += (hdrlen / sizeof(__be64));
0799 } else {
0800 flits += (sizeof(struct fw_eth_tx_pkt_wr) +
0801 sizeof(struct cpl_tx_pkt_core)) / sizeof(__be64);
0802 }
0803 return flits;
0804 }
0805
0806
0807
0808
0809
0810
0811
0812
0813
0814 static inline unsigned int calc_tx_descs(const struct sk_buff *skb,
0815 unsigned int chip_ver)
0816 {
0817 return flits_to_desc(calc_tx_flits(skb, chip_ver));
0818 }
0819
0820
0821
0822
0823
0824
0825
0826
0827
0828
0829
0830
0831
0832
0833
0834
0835
0836
0837 void cxgb4_write_sgl(const struct sk_buff *skb, struct sge_txq *q,
0838 struct ulptx_sgl *sgl, u64 *end, unsigned int start,
0839 const dma_addr_t *addr)
0840 {
0841 unsigned int i, len;
0842 struct ulptx_sge_pair *to;
0843 const struct skb_shared_info *si = skb_shinfo(skb);
0844 unsigned int nfrags = si->nr_frags;
0845 struct ulptx_sge_pair buf[MAX_SKB_FRAGS / 2 + 1];
0846
0847 len = skb_headlen(skb) - start;
0848 if (likely(len)) {
0849 sgl->len0 = htonl(len);
0850 sgl->addr0 = cpu_to_be64(addr[0] + start);
0851 nfrags++;
0852 } else {
0853 sgl->len0 = htonl(skb_frag_size(&si->frags[0]));
0854 sgl->addr0 = cpu_to_be64(addr[1]);
0855 }
0856
0857 sgl->cmd_nsge = htonl(ULPTX_CMD_V(ULP_TX_SC_DSGL) |
0858 ULPTX_NSGE_V(nfrags));
0859 if (likely(--nfrags == 0))
0860 return;
0861
0862
0863
0864
0865
0866 to = (u8 *)end > (u8 *)q->stat ? buf : sgl->sge;
0867
0868 for (i = (nfrags != si->nr_frags); nfrags >= 2; nfrags -= 2, to++) {
0869 to->len[0] = cpu_to_be32(skb_frag_size(&si->frags[i]));
0870 to->len[1] = cpu_to_be32(skb_frag_size(&si->frags[++i]));
0871 to->addr[0] = cpu_to_be64(addr[i]);
0872 to->addr[1] = cpu_to_be64(addr[++i]);
0873 }
0874 if (nfrags) {
0875 to->len[0] = cpu_to_be32(skb_frag_size(&si->frags[i]));
0876 to->len[1] = cpu_to_be32(0);
0877 to->addr[0] = cpu_to_be64(addr[i + 1]);
0878 }
0879 if (unlikely((u8 *)end > (u8 *)q->stat)) {
0880 unsigned int part0 = (u8 *)q->stat - (u8 *)sgl->sge, part1;
0881
0882 if (likely(part0))
0883 memcpy(sgl->sge, buf, part0);
0884 part1 = (u8 *)end - (u8 *)q->stat;
0885 memcpy(q->desc, (u8 *)buf + part0, part1);
0886 end = (void *)q->desc + part1;
0887 }
0888 if ((uintptr_t)end & 8)
0889 *end = 0;
0890 }
0891 EXPORT_SYMBOL(cxgb4_write_sgl);
0892
0893
0894
0895
0896
0897
0898
0899
0900
0901
0902
0903
0904
0905
0906 void cxgb4_write_partial_sgl(const struct sk_buff *skb, struct sge_txq *q,
0907 struct ulptx_sgl *sgl, u64 *end,
0908 const dma_addr_t *addr, u32 start, u32 len)
0909 {
0910 struct ulptx_sge_pair buf[MAX_SKB_FRAGS / 2 + 1] = {0}, *to;
0911 u32 frag_size, skb_linear_data_len = skb_headlen(skb);
0912 struct skb_shared_info *si = skb_shinfo(skb);
0913 u8 i = 0, frag_idx = 0, nfrags = 0;
0914 skb_frag_t *frag;
0915
0916
0917
0918
0919 if (unlikely(start < skb_linear_data_len)) {
0920 frag_size = min(len, skb_linear_data_len - start);
0921 sgl->len0 = htonl(frag_size);
0922 sgl->addr0 = cpu_to_be64(addr[0] + start);
0923 len -= frag_size;
0924 nfrags++;
0925 } else {
0926 start -= skb_linear_data_len;
0927 frag = &si->frags[frag_idx];
0928 frag_size = skb_frag_size(frag);
0929
0930 while (start >= frag_size) {
0931 start -= frag_size;
0932 frag_idx++;
0933 frag = &si->frags[frag_idx];
0934 frag_size = skb_frag_size(frag);
0935 }
0936
0937 frag_size = min(len, skb_frag_size(frag) - start);
0938 sgl->len0 = cpu_to_be32(frag_size);
0939 sgl->addr0 = cpu_to_be64(addr[frag_idx + 1] + start);
0940 len -= frag_size;
0941 nfrags++;
0942 frag_idx++;
0943 }
0944
0945
0946
0947
0948 if (!len)
0949 goto done;
0950
0951
0952
0953
0954
0955 to = (u8 *)end > (u8 *)q->stat ? buf : sgl->sge;
0956
0957
0958
0959
0960
0961 while (len) {
0962 frag_size = min(len, skb_frag_size(&si->frags[frag_idx]));
0963 to->len[i & 1] = cpu_to_be32(frag_size);
0964 to->addr[i & 1] = cpu_to_be64(addr[frag_idx + 1]);
0965 if (i && (i & 1))
0966 to++;
0967 nfrags++;
0968 frag_idx++;
0969 i++;
0970 len -= frag_size;
0971 }
0972
0973
0974
0975
0976 if (i & 1)
0977 to->len[1] = cpu_to_be32(0);
0978
0979
0980
0981
0982 if (unlikely((u8 *)end > (u8 *)q->stat)) {
0983 u32 part0 = (u8 *)q->stat - (u8 *)sgl->sge, part1;
0984
0985 if (likely(part0))
0986 memcpy(sgl->sge, buf, part0);
0987 part1 = (u8 *)end - (u8 *)q->stat;
0988 memcpy(q->desc, (u8 *)buf + part0, part1);
0989 end = (void *)q->desc + part1;
0990 }
0991
0992
0993 if ((uintptr_t)end & 8)
0994 *end = 0;
0995 done:
0996 sgl->cmd_nsge = htonl(ULPTX_CMD_V(ULP_TX_SC_DSGL) |
0997 ULPTX_NSGE_V(nfrags));
0998 }
0999 EXPORT_SYMBOL(cxgb4_write_partial_sgl);
1000
1001
1002
1003
1004
1005 static 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
1025 inline 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 }
1092 EXPORT_SYMBOL(cxgb4_ring_tx_db);
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105 void 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 }
1128 EXPORT_SYMBOL(cxgb4_inline_tx_skb);
1129
1130 static 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
1158 static 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 {
1184 nocsum:
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
1232 static void eth_txq_stop(struct sge_eth_txq *q)
1233 {
1234 netif_tx_stop_queue(q->txq);
1235 q->q.stops++;
1236 }
1237
1238 static 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
1247 static inline int
1248 cxgb_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
1281 enum 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
1317 static 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
1377 static 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
1418 int 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
1450 static 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
1475 static 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
1501 static 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_tcp_all_headers(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
1738 out_free:
1739 dev_kfree_skb_any(skb);
1740 return NETDEV_TX_OK;
1741 }
1742
1743
1744 enum {
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
1767 static 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
1785 static 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
1823 static 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
2092 out_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
2108 static 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
2120 static 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
2130 void 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
2151 static 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
2157 static 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
2167 static 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
2172 static 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
2200 static 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
2262 static 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
2344 write_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
2393 out_unlock:
2394 spin_unlock(&eohw_txq->lock);
2395 return ret;
2396 }
2397
2398 static 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
2432 static 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
2468 out_unlock:
2469 spin_unlock_bh(&eosw_txq->lock);
2470 out_free:
2471 dev_kfree_skb_any(skb);
2472 return NETDEV_TX_OK;
2473 }
2474
2475 netdev_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
2499 static 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
2537 int 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
2626 out_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
2638 static 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
2653 static 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
2665 int 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
2749 static 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
2790 static 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;
2831 ringdb:
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
2844 int 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
2864 static 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
2885 static 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
2907 static 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
2923 static 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
2948 static 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
3069 static 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
3096 static 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
3113 static 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
3125 static inline unsigned int is_ctrl_pkt(const struct sk_buff *skb)
3126 {
3127 return skb->queue_mapping & 1;
3128 }
3129
3130 static 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
3164 int 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
3182 int cxgb4_ofld_send(struct net_device *dev, struct sk_buff *skb)
3183 {
3184 return t4_ofld_send(netdev2adap(dev), skb);
3185 }
3186 EXPORT_SYMBOL(cxgb4_ofld_send);
3187
3188 static 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
3220 static 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
3260 int 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 }
3283 EXPORT_SYMBOL(cxgb4_immdata_send);
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294 static 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
3312 int cxgb4_crypto_send(struct net_device *dev, struct sk_buff *skb)
3313 {
3314 return t4_crypto_send(netdev2adap(dev), skb);
3315 }
3316 EXPORT_SYMBOL(cxgb4_crypto_send);
3317
3318 static 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
3346 struct 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 }
3374 out: return skb;
3375 }
3376 EXPORT_SYMBOL(cxgb4_pktgl_to_skb);
3377
3378
3379
3380
3381
3382
3383
3384
3385 static 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
3398 static 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
3430 static 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
3443 static 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
3488 enum {
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
3502 static 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
3537 static 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
3562 static 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
3590 static 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
3642 static 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
3675 int 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
3829 static 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
3854 static 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
3866 static 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
3889 static 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
3988 static 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
4037 void 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
4069 int 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
4140 out_done:
4141 return 0;
4142 }
4143
4144
4145
4146
4147 irqreturn_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
4159 static 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
4204 static 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
4219 static 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
4237 irq_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
4246 static 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
4279 done:
4280 mod_timer(&s->rx_timer, jiffies + RX_QCHECK_PERIOD);
4281 }
4282
4283 static 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
4354 static 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
4373 int 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
4548 fl_nomem:
4549 ret = -ENOMEM;
4550 err:
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
4566 static 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
4590 int 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
4683 int 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
4741 int 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
4753 static 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
4809 int 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
4832 int 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
4852 void 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
4864 void 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
4899 void 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
4907 void 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
4924 void 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
5008 void 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
5023 void 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
5077 static 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
5174 int 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 }