1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32#include <linux/skbuff.h>
33#include <linux/netdevice.h>
34#include <linux/etherdevice.h>
35#include <linux/if_vlan.h>
36#include <linux/ip.h>
37#include <linux/tcp.h>
38#include <linux/dma-mapping.h>
39#include <linux/slab.h>
40#include <linux/prefetch.h>
41#include <net/arp.h>
42#include "common.h"
43#include "regs.h"
44#include "sge_defs.h"
45#include "t3_cpl.h"
46#include "firmware_exports.h"
47#include "cxgb3_offload.h"
48
49#define USE_GTS 0
50
51#define SGE_RX_SM_BUF_SIZE 1536
52
53#define SGE_RX_COPY_THRES 256
54#define SGE_RX_PULL_LEN 128
55
56#define SGE_PG_RSVD SMP_CACHE_BYTES
57
58
59
60
61
62#define FL0_PG_CHUNK_SIZE 2048
63#define FL0_PG_ORDER 0
64#define FL0_PG_ALLOC_SIZE (PAGE_SIZE << FL0_PG_ORDER)
65#define FL1_PG_CHUNK_SIZE (PAGE_SIZE > 8192 ? 16384 : 8192)
66#define FL1_PG_ORDER (PAGE_SIZE > 8192 ? 0 : 1)
67#define FL1_PG_ALLOC_SIZE (PAGE_SIZE << FL1_PG_ORDER)
68
69#define SGE_RX_DROP_THRES 16
70#define RX_RECLAIM_PERIOD (HZ/4)
71
72
73
74
75#define MAX_RX_REFILL 16U
76
77
78
79
80#define TX_RECLAIM_PERIOD (HZ / 4)
81#define TX_RECLAIM_TIMER_CHUNK 64U
82#define TX_RECLAIM_CHUNK 16U
83
84
85#define WR_LEN (WR_FLITS * 8)
86
87
88
89
90enum { TXQ_ETH, TXQ_OFLD, TXQ_CTRL };
91
92
93enum {
94 TXQ_RUNNING = 1 << 0,
95 TXQ_LAST_PKT_DB = 1 << 1,
96};
97
98struct tx_desc {
99 __be64 flit[TX_DESC_FLITS];
100};
101
102struct rx_desc {
103 __be32 addr_lo;
104 __be32 len_gen;
105 __be32 gen2;
106 __be32 addr_hi;
107};
108
109struct tx_sw_desc {
110 struct sk_buff *skb;
111 u8 eop;
112 u8 addr_idx;
113 u8 fragidx;
114 s8 sflit;
115};
116
117struct rx_sw_desc {
118 union {
119 struct sk_buff *skb;
120 struct fl_pg_chunk pg_chunk;
121 };
122 DEFINE_DMA_UNMAP_ADDR(dma_addr);
123};
124
125struct rsp_desc {
126 struct rss_header rss_hdr;
127 __be32 flags;
128 __be32 len_cq;
129 u8 imm_data[47];
130 u8 intr_gen;
131};
132
133
134
135
136
137struct deferred_unmap_info {
138 struct pci_dev *pdev;
139 dma_addr_t addr[MAX_SKB_FRAGS + 1];
140};
141
142
143
144
145
146
147
148
149
150static u8 flit_desc_map[] = {
151 0,
152#if SGE_NUM_GENBITS == 1
153 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
154 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
155 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
156 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4
157#elif SGE_NUM_GENBITS == 2
158 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
159 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
160 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
161 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
162#else
163# error "SGE_NUM_GENBITS must be 1 or 2"
164#endif
165};
166
167static inline struct sge_qset *fl_to_qset(const struct sge_fl *q, int qidx)
168{
169 return container_of(q, struct sge_qset, fl[qidx]);
170}
171
172static inline struct sge_qset *rspq_to_qset(const struct sge_rspq *q)
173{
174 return container_of(q, struct sge_qset, rspq);
175}
176
177static inline struct sge_qset *txq_to_qset(const struct sge_txq *q, int qidx)
178{
179 return container_of(q, struct sge_qset, txq[qidx]);
180}
181
182
183
184
185
186
187
188
189
190
191static inline void refill_rspq(struct adapter *adapter,
192 const struct sge_rspq *q, unsigned int credits)
193{
194 rmb();
195 t3_write_reg(adapter, A_SG_RSPQ_CREDIT_RETURN,
196 V_RSPQ(q->cntxt_id) | V_CREDITS(credits));
197}
198
199
200
201
202
203
204
205static inline int need_skb_unmap(void)
206{
207#ifdef CONFIG_NEED_DMA_MAP_STATE
208 return 1;
209#else
210 return 0;
211#endif
212}
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236static inline void unmap_skb(struct sk_buff *skb, struct sge_txq *q,
237 unsigned int cidx, struct pci_dev *pdev)
238{
239 const struct sg_ent *sgp;
240 struct tx_sw_desc *d = &q->sdesc[cidx];
241 int nfrags, frag_idx, curflit, j = d->addr_idx;
242
243 sgp = (struct sg_ent *)&q->desc[cidx].flit[d->sflit];
244 frag_idx = d->fragidx;
245
246 if (frag_idx == 0 && skb_headlen(skb)) {
247 pci_unmap_single(pdev, be64_to_cpu(sgp->addr[0]),
248 skb_headlen(skb), PCI_DMA_TODEVICE);
249 j = 1;
250 }
251
252 curflit = d->sflit + 1 + j;
253 nfrags = skb_shinfo(skb)->nr_frags;
254
255 while (frag_idx < nfrags && curflit < WR_FLITS) {
256 pci_unmap_page(pdev, be64_to_cpu(sgp->addr[j]),
257 skb_frag_size(&skb_shinfo(skb)->frags[frag_idx]),
258 PCI_DMA_TODEVICE);
259 j ^= 1;
260 if (j == 0) {
261 sgp++;
262 curflit++;
263 }
264 curflit++;
265 frag_idx++;
266 }
267
268 if (frag_idx < nfrags) {
269 d = cidx + 1 == q->size ? q->sdesc : d + 1;
270 d->fragidx = frag_idx;
271 d->addr_idx = j;
272 d->sflit = curflit - WR_FLITS - j;
273 }
274}
275
276
277
278
279
280
281
282
283
284
285static void free_tx_desc(struct adapter *adapter, struct sge_txq *q,
286 unsigned int n)
287{
288 struct tx_sw_desc *d;
289 struct pci_dev *pdev = adapter->pdev;
290 unsigned int cidx = q->cidx;
291
292 const int need_unmap = need_skb_unmap() &&
293 q->cntxt_id >= FW_TUNNEL_SGEEC_START;
294
295 d = &q->sdesc[cidx];
296 while (n--) {
297 if (d->skb) {
298 if (need_unmap)
299 unmap_skb(d->skb, q, cidx, pdev);
300 if (d->eop) {
301 kfree_skb(d->skb);
302 d->skb = NULL;
303 }
304 }
305 ++d;
306 if (++cidx == q->size) {
307 cidx = 0;
308 d = q->sdesc;
309 }
310 }
311 q->cidx = cidx;
312}
313
314
315
316
317
318
319
320
321
322
323
324static inline unsigned int reclaim_completed_tx(struct adapter *adapter,
325 struct sge_txq *q,
326 unsigned int chunk)
327{
328 unsigned int reclaim = q->processed - q->cleaned;
329
330 reclaim = min(chunk, reclaim);
331 if (reclaim) {
332 free_tx_desc(adapter, q, reclaim);
333 q->cleaned += reclaim;
334 q->in_use -= reclaim;
335 }
336 return q->processed - q->cleaned;
337}
338
339
340
341
342
343
344
345static inline int should_restart_tx(const struct sge_txq *q)
346{
347 unsigned int r = q->processed - q->cleaned;
348
349 return q->in_use - r < (q->size >> 1);
350}
351
352static void clear_rx_desc(struct pci_dev *pdev, const struct sge_fl *q,
353 struct rx_sw_desc *d)
354{
355 if (q->use_pages && d->pg_chunk.page) {
356 (*d->pg_chunk.p_cnt)--;
357 if (!*d->pg_chunk.p_cnt)
358 pci_unmap_page(pdev,
359 d->pg_chunk.mapping,
360 q->alloc_size, PCI_DMA_FROMDEVICE);
361
362 put_page(d->pg_chunk.page);
363 d->pg_chunk.page = NULL;
364 } else {
365 pci_unmap_single(pdev, dma_unmap_addr(d, dma_addr),
366 q->buf_size, PCI_DMA_FROMDEVICE);
367 kfree_skb(d->skb);
368 d->skb = NULL;
369 }
370}
371
372
373
374
375
376
377
378
379
380static void free_rx_bufs(struct pci_dev *pdev, struct sge_fl *q)
381{
382 unsigned int cidx = q->cidx;
383
384 while (q->credits--) {
385 struct rx_sw_desc *d = &q->sdesc[cidx];
386
387
388 clear_rx_desc(pdev, q, d);
389 if (++cidx == q->size)
390 cidx = 0;
391 }
392
393 if (q->pg_chunk.page) {
394 __free_pages(q->pg_chunk.page, q->order);
395 q->pg_chunk.page = NULL;
396 }
397}
398
399
400
401
402
403
404
405
406
407
408
409
410
411static inline int add_one_rx_buf(void *va, unsigned int len,
412 struct rx_desc *d, struct rx_sw_desc *sd,
413 unsigned int gen, struct pci_dev *pdev)
414{
415 dma_addr_t mapping;
416
417 mapping = pci_map_single(pdev, va, len, PCI_DMA_FROMDEVICE);
418 if (unlikely(pci_dma_mapping_error(pdev, mapping)))
419 return -ENOMEM;
420
421 dma_unmap_addr_set(sd, dma_addr, mapping);
422
423 d->addr_lo = cpu_to_be32(mapping);
424 d->addr_hi = cpu_to_be32((u64) mapping >> 32);
425 dma_wmb();
426 d->len_gen = cpu_to_be32(V_FLD_GEN1(gen));
427 d->gen2 = cpu_to_be32(V_FLD_GEN2(gen));
428 return 0;
429}
430
431static inline int add_one_rx_chunk(dma_addr_t mapping, struct rx_desc *d,
432 unsigned int gen)
433{
434 d->addr_lo = cpu_to_be32(mapping);
435 d->addr_hi = cpu_to_be32((u64) mapping >> 32);
436 dma_wmb();
437 d->len_gen = cpu_to_be32(V_FLD_GEN1(gen));
438 d->gen2 = cpu_to_be32(V_FLD_GEN2(gen));
439 return 0;
440}
441
442static int alloc_pg_chunk(struct adapter *adapter, struct sge_fl *q,
443 struct rx_sw_desc *sd, gfp_t gfp,
444 unsigned int order)
445{
446 if (!q->pg_chunk.page) {
447 dma_addr_t mapping;
448
449 q->pg_chunk.page = alloc_pages(gfp, order);
450 if (unlikely(!q->pg_chunk.page))
451 return -ENOMEM;
452 q->pg_chunk.va = page_address(q->pg_chunk.page);
453 q->pg_chunk.p_cnt = q->pg_chunk.va + (PAGE_SIZE << order) -
454 SGE_PG_RSVD;
455 q->pg_chunk.offset = 0;
456 mapping = pci_map_page(adapter->pdev, q->pg_chunk.page,
457 0, q->alloc_size, PCI_DMA_FROMDEVICE);
458 if (unlikely(pci_dma_mapping_error(adapter->pdev, mapping))) {
459 __free_pages(q->pg_chunk.page, order);
460 q->pg_chunk.page = NULL;
461 return -EIO;
462 }
463 q->pg_chunk.mapping = mapping;
464 }
465 sd->pg_chunk = q->pg_chunk;
466
467 prefetch(sd->pg_chunk.p_cnt);
468
469 q->pg_chunk.offset += q->buf_size;
470 if (q->pg_chunk.offset == (PAGE_SIZE << order))
471 q->pg_chunk.page = NULL;
472 else {
473 q->pg_chunk.va += q->buf_size;
474 get_page(q->pg_chunk.page);
475 }
476
477 if (sd->pg_chunk.offset == 0)
478 *sd->pg_chunk.p_cnt = 1;
479 else
480 *sd->pg_chunk.p_cnt += 1;
481
482 return 0;
483}
484
485static inline void ring_fl_db(struct adapter *adap, struct sge_fl *q)
486{
487 if (q->pend_cred >= q->credits / 4) {
488 q->pend_cred = 0;
489 wmb();
490 t3_write_reg(adap, A_SG_KDOORBELL, V_EGRCNTX(q->cntxt_id));
491 }
492}
493
494
495
496
497
498
499
500
501
502
503
504
505static int refill_fl(struct adapter *adap, struct sge_fl *q, int n, gfp_t gfp)
506{
507 struct rx_sw_desc *sd = &q->sdesc[q->pidx];
508 struct rx_desc *d = &q->desc[q->pidx];
509 unsigned int count = 0;
510
511 while (n--) {
512 dma_addr_t mapping;
513 int err;
514
515 if (q->use_pages) {
516 if (unlikely(alloc_pg_chunk(adap, q, sd, gfp,
517 q->order))) {
518nomem: q->alloc_failed++;
519 break;
520 }
521 mapping = sd->pg_chunk.mapping + sd->pg_chunk.offset;
522 dma_unmap_addr_set(sd, dma_addr, mapping);
523
524 add_one_rx_chunk(mapping, d, q->gen);
525 pci_dma_sync_single_for_device(adap->pdev, mapping,
526 q->buf_size - SGE_PG_RSVD,
527 PCI_DMA_FROMDEVICE);
528 } else {
529 void *buf_start;
530
531 struct sk_buff *skb = alloc_skb(q->buf_size, gfp);
532 if (!skb)
533 goto nomem;
534
535 sd->skb = skb;
536 buf_start = skb->data;
537 err = add_one_rx_buf(buf_start, q->buf_size, d, sd,
538 q->gen, adap->pdev);
539 if (unlikely(err)) {
540 clear_rx_desc(adap->pdev, q, sd);
541 break;
542 }
543 }
544
545 d++;
546 sd++;
547 if (++q->pidx == q->size) {
548 q->pidx = 0;
549 q->gen ^= 1;
550 sd = q->sdesc;
551 d = q->desc;
552 }
553 count++;
554 }
555
556 q->credits += count;
557 q->pend_cred += count;
558 ring_fl_db(adap, q);
559
560 return count;
561}
562
563static inline void __refill_fl(struct adapter *adap, struct sge_fl *fl)
564{
565 refill_fl(adap, fl, min(MAX_RX_REFILL, fl->size - fl->credits),
566 GFP_ATOMIC | __GFP_COMP);
567}
568
569
570
571
572
573
574
575
576
577
578static void recycle_rx_buf(struct adapter *adap, struct sge_fl *q,
579 unsigned int idx)
580{
581 struct rx_desc *from = &q->desc[idx];
582 struct rx_desc *to = &q->desc[q->pidx];
583
584 q->sdesc[q->pidx] = q->sdesc[idx];
585 to->addr_lo = from->addr_lo;
586 to->addr_hi = from->addr_hi;
587 dma_wmb();
588 to->len_gen = cpu_to_be32(V_FLD_GEN1(q->gen));
589 to->gen2 = cpu_to_be32(V_FLD_GEN2(q->gen));
590
591 if (++q->pidx == q->size) {
592 q->pidx = 0;
593 q->gen ^= 1;
594 }
595
596 q->credits++;
597 q->pend_cred++;
598 ring_fl_db(adap, q);
599}
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618static void *alloc_ring(struct pci_dev *pdev, size_t nelem, size_t elem_size,
619 size_t sw_size, dma_addr_t * phys, void *metadata)
620{
621 size_t len = nelem * elem_size;
622 void *s = NULL;
623 void *p = dma_zalloc_coherent(&pdev->dev, len, phys, GFP_KERNEL);
624
625 if (!p)
626 return NULL;
627 if (sw_size && metadata) {
628 s = kcalloc(nelem, sw_size, GFP_KERNEL);
629
630 if (!s) {
631 dma_free_coherent(&pdev->dev, len, p, *phys);
632 return NULL;
633 }
634 *(void **)metadata = s;
635 }
636 return p;
637}
638
639
640
641
642
643
644
645
646
647static void t3_reset_qset(struct sge_qset *q)
648{
649 if (q->adap &&
650 !(q->adap->flags & NAPI_INIT)) {
651 memset(q, 0, sizeof(*q));
652 return;
653 }
654
655 q->adap = NULL;
656 memset(&q->rspq, 0, sizeof(q->rspq));
657 memset(q->fl, 0, sizeof(struct sge_fl) * SGE_RXQ_PER_SET);
658 memset(q->txq, 0, sizeof(struct sge_txq) * SGE_TXQ_PER_SET);
659 q->txq_stopped = 0;
660 q->tx_reclaim_timer.function = NULL;
661 q->rx_reclaim_timer.function = NULL;
662 q->nomem = 0;
663 napi_free_frags(&q->napi);
664}
665
666
667
668
669
670
671
672
673
674
675
676static void t3_free_qset(struct adapter *adapter, struct sge_qset *q)
677{
678 int i;
679 struct pci_dev *pdev = adapter->pdev;
680
681 for (i = 0; i < SGE_RXQ_PER_SET; ++i)
682 if (q->fl[i].desc) {
683 spin_lock_irq(&adapter->sge.reg_lock);
684 t3_sge_disable_fl(adapter, q->fl[i].cntxt_id);
685 spin_unlock_irq(&adapter->sge.reg_lock);
686 free_rx_bufs(pdev, &q->fl[i]);
687 kfree(q->fl[i].sdesc);
688 dma_free_coherent(&pdev->dev,
689 q->fl[i].size *
690 sizeof(struct rx_desc), q->fl[i].desc,
691 q->fl[i].phys_addr);
692 }
693
694 for (i = 0; i < SGE_TXQ_PER_SET; ++i)
695 if (q->txq[i].desc) {
696 spin_lock_irq(&adapter->sge.reg_lock);
697 t3_sge_enable_ecntxt(adapter, q->txq[i].cntxt_id, 0);
698 spin_unlock_irq(&adapter->sge.reg_lock);
699 if (q->txq[i].sdesc) {
700 free_tx_desc(adapter, &q->txq[i],
701 q->txq[i].in_use);
702 kfree(q->txq[i].sdesc);
703 }
704 dma_free_coherent(&pdev->dev,
705 q->txq[i].size *
706 sizeof(struct tx_desc),
707 q->txq[i].desc, q->txq[i].phys_addr);
708 __skb_queue_purge(&q->txq[i].sendq);
709 }
710
711 if (q->rspq.desc) {
712 spin_lock_irq(&adapter->sge.reg_lock);
713 t3_sge_disable_rspcntxt(adapter, q->rspq.cntxt_id);
714 spin_unlock_irq(&adapter->sge.reg_lock);
715 dma_free_coherent(&pdev->dev,
716 q->rspq.size * sizeof(struct rsp_desc),
717 q->rspq.desc, q->rspq.phys_addr);
718 }
719
720 t3_reset_qset(q);
721}
722
723
724
725
726
727
728
729
730static void init_qset_cntxt(struct sge_qset *qs, unsigned int id)
731{
732 qs->rspq.cntxt_id = id;
733 qs->fl[0].cntxt_id = 2 * id;
734 qs->fl[1].cntxt_id = 2 * id + 1;
735 qs->txq[TXQ_ETH].cntxt_id = FW_TUNNEL_SGEEC_START + id;
736 qs->txq[TXQ_ETH].token = FW_TUNNEL_TID_START + id;
737 qs->txq[TXQ_OFLD].cntxt_id = FW_OFLD_SGEEC_START + id;
738 qs->txq[TXQ_CTRL].cntxt_id = FW_CTRL_SGEEC_START + id;
739 qs->txq[TXQ_CTRL].token = FW_CTRL_TID_START + id;
740}
741
742
743
744
745
746
747
748
749static inline unsigned int sgl_len(unsigned int n)
750{
751
752 return (3 * n) / 2 + (n & 1);
753}
754
755
756
757
758
759
760
761
762static inline unsigned int flits_to_desc(unsigned int n)
763{
764 BUG_ON(n >= ARRAY_SIZE(flit_desc_map));
765 return flit_desc_map[n];
766}
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783static struct sk_buff *get_packet(struct adapter *adap, struct sge_fl *fl,
784 unsigned int len, unsigned int drop_thres)
785{
786 struct sk_buff *skb = NULL;
787 struct rx_sw_desc *sd = &fl->sdesc[fl->cidx];
788
789 prefetch(sd->skb->data);
790 fl->credits--;
791
792 if (len <= SGE_RX_COPY_THRES) {
793 skb = alloc_skb(len, GFP_ATOMIC);
794 if (likely(skb != NULL)) {
795 __skb_put(skb, len);
796 pci_dma_sync_single_for_cpu(adap->pdev,
797 dma_unmap_addr(sd, dma_addr), len,
798 PCI_DMA_FROMDEVICE);
799 memcpy(skb->data, sd->skb->data, len);
800 pci_dma_sync_single_for_device(adap->pdev,
801 dma_unmap_addr(sd, dma_addr), len,
802 PCI_DMA_FROMDEVICE);
803 } else if (!drop_thres)
804 goto use_orig_buf;
805recycle:
806 recycle_rx_buf(adap, fl, fl->cidx);
807 return skb;
808 }
809
810 if (unlikely(fl->credits < drop_thres) &&
811 refill_fl(adap, fl, min(MAX_RX_REFILL, fl->size - fl->credits - 1),
812 GFP_ATOMIC | __GFP_COMP) == 0)
813 goto recycle;
814
815use_orig_buf:
816 pci_unmap_single(adap->pdev, dma_unmap_addr(sd, dma_addr),
817 fl->buf_size, PCI_DMA_FROMDEVICE);
818 skb = sd->skb;
819 skb_put(skb, len);
820 __refill_fl(adap, fl);
821 return skb;
822}
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842static struct sk_buff *get_packet_pg(struct adapter *adap, struct sge_fl *fl,
843 struct sge_rspq *q, unsigned int len,
844 unsigned int drop_thres)
845{
846 struct sk_buff *newskb, *skb;
847 struct rx_sw_desc *sd = &fl->sdesc[fl->cidx];
848
849 dma_addr_t dma_addr = dma_unmap_addr(sd, dma_addr);
850
851 newskb = skb = q->pg_skb;
852 if (!skb && (len <= SGE_RX_COPY_THRES)) {
853 newskb = alloc_skb(len, GFP_ATOMIC);
854 if (likely(newskb != NULL)) {
855 __skb_put(newskb, len);
856 pci_dma_sync_single_for_cpu(adap->pdev, dma_addr, len,
857 PCI_DMA_FROMDEVICE);
858 memcpy(newskb->data, sd->pg_chunk.va, len);
859 pci_dma_sync_single_for_device(adap->pdev, dma_addr,
860 len,
861 PCI_DMA_FROMDEVICE);
862 } else if (!drop_thres)
863 return NULL;
864recycle:
865 fl->credits--;
866 recycle_rx_buf(adap, fl, fl->cidx);
867 q->rx_recycle_buf++;
868 return newskb;
869 }
870
871 if (unlikely(q->rx_recycle_buf || (!skb && fl->credits <= drop_thres)))
872 goto recycle;
873
874 prefetch(sd->pg_chunk.p_cnt);
875
876 if (!skb)
877 newskb = alloc_skb(SGE_RX_PULL_LEN, GFP_ATOMIC);
878
879 if (unlikely(!newskb)) {
880 if (!drop_thres)
881 return NULL;
882 goto recycle;
883 }
884
885 pci_dma_sync_single_for_cpu(adap->pdev, dma_addr, len,
886 PCI_DMA_FROMDEVICE);
887 (*sd->pg_chunk.p_cnt)--;
888 if (!*sd->pg_chunk.p_cnt && sd->pg_chunk.page != fl->pg_chunk.page)
889 pci_unmap_page(adap->pdev,
890 sd->pg_chunk.mapping,
891 fl->alloc_size,
892 PCI_DMA_FROMDEVICE);
893 if (!skb) {
894 __skb_put(newskb, SGE_RX_PULL_LEN);
895 memcpy(newskb->data, sd->pg_chunk.va, SGE_RX_PULL_LEN);
896 skb_fill_page_desc(newskb, 0, sd->pg_chunk.page,
897 sd->pg_chunk.offset + SGE_RX_PULL_LEN,
898 len - SGE_RX_PULL_LEN);
899 newskb->len = len;
900 newskb->data_len = len - SGE_RX_PULL_LEN;
901 newskb->truesize += newskb->data_len;
902 } else {
903 skb_fill_page_desc(newskb, skb_shinfo(newskb)->nr_frags,
904 sd->pg_chunk.page,
905 sd->pg_chunk.offset, len);
906 newskb->len += len;
907 newskb->data_len += len;
908 newskb->truesize += len;
909 }
910
911 fl->credits--;
912
913
914
915
916 return newskb;
917}
918
919
920
921
922
923
924
925static inline struct sk_buff *get_imm_packet(const struct rsp_desc *resp)
926{
927 struct sk_buff *skb = alloc_skb(IMMED_PKT_SIZE, GFP_ATOMIC);
928
929 if (skb) {
930 __skb_put(skb, IMMED_PKT_SIZE);
931 skb_copy_to_linear_data(skb, resp->imm_data, IMMED_PKT_SIZE);
932 }
933 return skb;
934}
935
936
937
938
939
940
941
942
943static inline unsigned int calc_tx_descs(const struct sk_buff *skb)
944{
945 unsigned int flits;
946
947 if (skb->len <= WR_LEN - sizeof(struct cpl_tx_pkt))
948 return 1;
949
950 flits = sgl_len(skb_shinfo(skb)->nr_frags + 1) + 2;
951 if (skb_shinfo(skb)->gso_size)
952 flits++;
953 return flits_to_desc(flits);
954}
955
956
957
958
959
960
961
962
963static int map_skb(struct pci_dev *pdev, const struct sk_buff *skb,
964 dma_addr_t *addr)
965{
966 const skb_frag_t *fp, *end;
967 const struct skb_shared_info *si;
968
969 if (skb_headlen(skb)) {
970 *addr = pci_map_single(pdev, skb->data, skb_headlen(skb),
971 PCI_DMA_TODEVICE);
972 if (pci_dma_mapping_error(pdev, *addr))
973 goto out_err;
974 addr++;
975 }
976
977 si = skb_shinfo(skb);
978 end = &si->frags[si->nr_frags];
979
980 for (fp = si->frags; fp < end; fp++) {
981 *addr = skb_frag_dma_map(&pdev->dev, fp, 0, skb_frag_size(fp),
982 DMA_TO_DEVICE);
983 if (pci_dma_mapping_error(pdev, *addr))
984 goto unwind;
985 addr++;
986 }
987 return 0;
988
989unwind:
990 while (fp-- > si->frags)
991 dma_unmap_page(&pdev->dev, *--addr, skb_frag_size(fp),
992 DMA_TO_DEVICE);
993
994 pci_unmap_single(pdev, addr[-1], skb_headlen(skb), PCI_DMA_TODEVICE);
995out_err:
996 return -ENOMEM;
997}
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011static inline unsigned int write_sgl(const struct sk_buff *skb,
1012 struct sg_ent *sgp, unsigned char *start,
1013 unsigned int len, const dma_addr_t *addr)
1014{
1015 unsigned int i, j = 0, k = 0, nfrags;
1016
1017 if (len) {
1018 sgp->len[0] = cpu_to_be32(len);
1019 sgp->addr[j++] = cpu_to_be64(addr[k++]);
1020 }
1021
1022 nfrags = skb_shinfo(skb)->nr_frags;
1023 for (i = 0; i < nfrags; i++) {
1024 const skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
1025
1026 sgp->len[j] = cpu_to_be32(skb_frag_size(frag));
1027 sgp->addr[j] = cpu_to_be64(addr[k++]);
1028 j ^= 1;
1029 if (j == 0)
1030 ++sgp;
1031 }
1032 if (j)
1033 sgp->len[j] = 0;
1034 return ((nfrags + (len != 0)) * 3) / 2 + j;
1035}
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049static inline void check_ring_tx_db(struct adapter *adap, struct sge_txq *q)
1050{
1051#if USE_GTS
1052 clear_bit(TXQ_LAST_PKT_DB, &q->flags);
1053 if (test_and_set_bit(TXQ_RUNNING, &q->flags) == 0) {
1054 set_bit(TXQ_LAST_PKT_DB, &q->flags);
1055 t3_write_reg(adap, A_SG_KDOORBELL,
1056 F_SELEGRCNTX | V_EGRCNTX(q->cntxt_id));
1057 }
1058#else
1059 wmb();
1060 t3_write_reg(adap, A_SG_KDOORBELL,
1061 F_SELEGRCNTX | V_EGRCNTX(q->cntxt_id));
1062#endif
1063}
1064
1065static inline void wr_gen2(struct tx_desc *d, unsigned int gen)
1066{
1067#if SGE_NUM_GENBITS == 2
1068 d->flit[TX_DESC_FLITS - 1] = cpu_to_be64(gen);
1069#endif
1070}
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091static void write_wr_hdr_sgl(unsigned int ndesc, struct sk_buff *skb,
1092 struct tx_desc *d, unsigned int pidx,
1093 const struct sge_txq *q,
1094 const struct sg_ent *sgl,
1095 unsigned int flits, unsigned int sgl_flits,
1096 unsigned int gen, __be32 wr_hi,
1097 __be32 wr_lo)
1098{
1099 struct work_request_hdr *wrp = (struct work_request_hdr *)d;
1100 struct tx_sw_desc *sd = &q->sdesc[pidx];
1101
1102 sd->skb = skb;
1103 if (need_skb_unmap()) {
1104 sd->fragidx = 0;
1105 sd->addr_idx = 0;
1106 sd->sflit = flits;
1107 }
1108
1109 if (likely(ndesc == 1)) {
1110 sd->eop = 1;
1111 wrp->wr_hi = htonl(F_WR_SOP | F_WR_EOP | V_WR_DATATYPE(1) |
1112 V_WR_SGLSFLT(flits)) | wr_hi;
1113 dma_wmb();
1114 wrp->wr_lo = htonl(V_WR_LEN(flits + sgl_flits) |
1115 V_WR_GEN(gen)) | wr_lo;
1116 wr_gen2(d, gen);
1117 } else {
1118 unsigned int ogen = gen;
1119 const u64 *fp = (const u64 *)sgl;
1120 struct work_request_hdr *wp = wrp;
1121
1122 wrp->wr_hi = htonl(F_WR_SOP | V_WR_DATATYPE(1) |
1123 V_WR_SGLSFLT(flits)) | wr_hi;
1124
1125 while (sgl_flits) {
1126 unsigned int avail = WR_FLITS - flits;
1127
1128 if (avail > sgl_flits)
1129 avail = sgl_flits;
1130 memcpy(&d->flit[flits], fp, avail * sizeof(*fp));
1131 sgl_flits -= avail;
1132 ndesc--;
1133 if (!sgl_flits)
1134 break;
1135
1136 fp += avail;
1137 d++;
1138 sd->eop = 0;
1139 sd++;
1140 if (++pidx == q->size) {
1141 pidx = 0;
1142 gen ^= 1;
1143 d = q->desc;
1144 sd = q->sdesc;
1145 }
1146
1147 sd->skb = skb;
1148 wrp = (struct work_request_hdr *)d;
1149 wrp->wr_hi = htonl(V_WR_DATATYPE(1) |
1150 V_WR_SGLSFLT(1)) | wr_hi;
1151 wrp->wr_lo = htonl(V_WR_LEN(min(WR_FLITS,
1152 sgl_flits + 1)) |
1153 V_WR_GEN(gen)) | wr_lo;
1154 wr_gen2(d, gen);
1155 flits = 1;
1156 }
1157 sd->eop = 1;
1158 wrp->wr_hi |= htonl(F_WR_EOP);
1159 dma_wmb();
1160 wp->wr_lo = htonl(V_WR_LEN(WR_FLITS) | V_WR_GEN(ogen)) | wr_lo;
1161 wr_gen2((struct tx_desc *)wp, ogen);
1162 WARN_ON(ndesc != 0);
1163 }
1164}
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179static void write_tx_pkt_wr(struct adapter *adap, struct sk_buff *skb,
1180 const struct port_info *pi,
1181 unsigned int pidx, unsigned int gen,
1182 struct sge_txq *q, unsigned int ndesc,
1183 unsigned int compl, const dma_addr_t *addr)
1184{
1185 unsigned int flits, sgl_flits, cntrl, tso_info;
1186 struct sg_ent *sgp, sgl[MAX_SKB_FRAGS / 2 + 1];
1187 struct tx_desc *d = &q->desc[pidx];
1188 struct cpl_tx_pkt *cpl = (struct cpl_tx_pkt *)d;
1189
1190 cpl->len = htonl(skb->len);
1191 cntrl = V_TXPKT_INTF(pi->port_id);
1192
1193 if (skb_vlan_tag_present(skb))
1194 cntrl |= F_TXPKT_VLAN_VLD | V_TXPKT_VLAN(skb_vlan_tag_get(skb));
1195
1196 tso_info = V_LSO_MSS(skb_shinfo(skb)->gso_size);
1197 if (tso_info) {
1198 int eth_type;
1199 struct cpl_tx_pkt_lso *hdr = (struct cpl_tx_pkt_lso *)cpl;
1200
1201 d->flit[2] = 0;
1202 cntrl |= V_TXPKT_OPCODE(CPL_TX_PKT_LSO);
1203 hdr->cntrl = htonl(cntrl);
1204 eth_type = skb_network_offset(skb) == ETH_HLEN ?
1205 CPL_ETH_II : CPL_ETH_II_VLAN;
1206 tso_info |= V_LSO_ETH_TYPE(eth_type) |
1207 V_LSO_IPHDR_WORDS(ip_hdr(skb)->ihl) |
1208 V_LSO_TCPHDR_WORDS(tcp_hdr(skb)->doff);
1209 hdr->lso_info = htonl(tso_info);
1210 flits = 3;
1211 } else {
1212 cntrl |= V_TXPKT_OPCODE(CPL_TX_PKT);
1213 cntrl |= F_TXPKT_IPCSUM_DIS;
1214 cntrl |= V_TXPKT_L4CSUM_DIS(skb->ip_summed != CHECKSUM_PARTIAL);
1215 cpl->cntrl = htonl(cntrl);
1216
1217 if (skb->len <= WR_LEN - sizeof(*cpl)) {
1218 q->sdesc[pidx].skb = NULL;
1219 if (!skb->data_len)
1220 skb_copy_from_linear_data(skb, &d->flit[2],
1221 skb->len);
1222 else
1223 skb_copy_bits(skb, 0, &d->flit[2], skb->len);
1224
1225 flits = (skb->len + 7) / 8 + 2;
1226 cpl->wr.wr_hi = htonl(V_WR_BCNTLFLT(skb->len & 7) |
1227 V_WR_OP(FW_WROPCODE_TUNNEL_TX_PKT)
1228 | F_WR_SOP | F_WR_EOP | compl);
1229 dma_wmb();
1230 cpl->wr.wr_lo = htonl(V_WR_LEN(flits) | V_WR_GEN(gen) |
1231 V_WR_TID(q->token));
1232 wr_gen2(d, gen);
1233 kfree_skb(skb);
1234 return;
1235 }
1236
1237 flits = 2;
1238 }
1239
1240 sgp = ndesc == 1 ? (struct sg_ent *)&d->flit[flits] : sgl;
1241 sgl_flits = write_sgl(skb, sgp, skb->data, skb_headlen(skb), addr);
1242
1243 write_wr_hdr_sgl(ndesc, skb, d, pidx, q, sgl, flits, sgl_flits, gen,
1244 htonl(V_WR_OP(FW_WROPCODE_TUNNEL_TX_PKT) | compl),
1245 htonl(V_WR_TID(q->token)));
1246}
1247
1248static inline void t3_stop_tx_queue(struct netdev_queue *txq,
1249 struct sge_qset *qs, struct sge_txq *q)
1250{
1251 netif_tx_stop_queue(txq);
1252 set_bit(TXQ_ETH, &qs->txq_stopped);
1253 q->stops++;
1254}
1255
1256
1257
1258
1259
1260
1261
1262
1263netdev_tx_t t3_eth_xmit(struct sk_buff *skb, struct net_device *dev)
1264{
1265 int qidx;
1266 unsigned int ndesc, pidx, credits, gen, compl;
1267 const struct port_info *pi = netdev_priv(dev);
1268 struct adapter *adap = pi->adapter;
1269 struct netdev_queue *txq;
1270 struct sge_qset *qs;
1271 struct sge_txq *q;
1272 dma_addr_t addr[MAX_SKB_FRAGS + 1];
1273
1274
1275
1276
1277
1278 if (unlikely(skb->len < ETH_HLEN)) {
1279 dev_kfree_skb(skb);
1280 return NETDEV_TX_OK;
1281 }
1282
1283 qidx = skb_get_queue_mapping(skb);
1284 qs = &pi->qs[qidx];
1285 q = &qs->txq[TXQ_ETH];
1286 txq = netdev_get_tx_queue(dev, qidx);
1287
1288 reclaim_completed_tx(adap, q, TX_RECLAIM_CHUNK);
1289
1290 credits = q->size - q->in_use;
1291 ndesc = calc_tx_descs(skb);
1292
1293 if (unlikely(credits < ndesc)) {
1294 t3_stop_tx_queue(txq, qs, q);
1295 dev_err(&adap->pdev->dev,
1296 "%s: Tx ring %u full while queue awake!\n",
1297 dev->name, q->cntxt_id & 7);
1298 return NETDEV_TX_BUSY;
1299 }
1300
1301
1302 if (skb->len > (WR_LEN - sizeof(struct cpl_tx_pkt))) {
1303 if (unlikely(map_skb(adap->pdev, skb, addr) < 0)) {
1304 dev_kfree_skb(skb);
1305 return NETDEV_TX_OK;
1306 }
1307 }
1308
1309 q->in_use += ndesc;
1310 if (unlikely(credits - ndesc < q->stop_thres)) {
1311 t3_stop_tx_queue(txq, qs, q);
1312
1313 if (should_restart_tx(q) &&
1314 test_and_clear_bit(TXQ_ETH, &qs->txq_stopped)) {
1315 q->restarts++;
1316 netif_tx_start_queue(txq);
1317 }
1318 }
1319
1320 gen = q->gen;
1321 q->unacked += ndesc;
1322 compl = (q->unacked & 8) << (S_WR_COMPL - 3);
1323 q->unacked &= 7;
1324 pidx = q->pidx;
1325 q->pidx += ndesc;
1326 if (q->pidx >= q->size) {
1327 q->pidx -= q->size;
1328 q->gen ^= 1;
1329 }
1330
1331
1332 if (skb->ip_summed == CHECKSUM_PARTIAL)
1333 qs->port_stats[SGE_PSTAT_TX_CSUM]++;
1334 if (skb_shinfo(skb)->gso_size)
1335 qs->port_stats[SGE_PSTAT_TSO]++;
1336 if (skb_vlan_tag_present(skb))
1337 qs->port_stats[SGE_PSTAT_VLANINS]++;
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363 if (likely(!skb_shared(skb)))
1364 skb_orphan(skb);
1365
1366 write_tx_pkt_wr(adap, skb, pi, pidx, gen, q, ndesc, compl, addr);
1367 check_ring_tx_db(adap, q);
1368 return NETDEV_TX_OK;
1369}
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383static inline void write_imm(struct tx_desc *d, struct sk_buff *skb,
1384 unsigned int len, unsigned int gen)
1385{
1386 struct work_request_hdr *from = (struct work_request_hdr *)skb->data;
1387 struct work_request_hdr *to = (struct work_request_hdr *)d;
1388
1389 if (likely(!skb->data_len))
1390 memcpy(&to[1], &from[1], len - sizeof(*from));
1391 else
1392 skb_copy_bits(skb, sizeof(*from), &to[1], len - sizeof(*from));
1393
1394 to->wr_hi = from->wr_hi | htonl(F_WR_SOP | F_WR_EOP |
1395 V_WR_BCNTLFLT(len & 7));
1396 dma_wmb();
1397 to->wr_lo = from->wr_lo | htonl(V_WR_GEN(gen) |
1398 V_WR_LEN((len + 7) / 8));
1399 wr_gen2(d, gen);
1400 kfree_skb(skb);
1401}
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421static inline int check_desc_avail(struct adapter *adap, struct sge_txq *q,
1422 struct sk_buff *skb, unsigned int ndesc,
1423 unsigned int qid)
1424{
1425 if (unlikely(!skb_queue_empty(&q->sendq))) {
1426 addq_exit:__skb_queue_tail(&q->sendq, skb);
1427 return 1;
1428 }
1429 if (unlikely(q->size - q->in_use < ndesc)) {
1430 struct sge_qset *qs = txq_to_qset(q, qid);
1431
1432 set_bit(qid, &qs->txq_stopped);
1433 smp_mb__after_clear_bit();
1434
1435 if (should_restart_tx(q) &&
1436 test_and_clear_bit(qid, &qs->txq_stopped))
1437 return 2;
1438
1439 q->stops++;
1440 goto addq_exit;
1441 }
1442 return 0;
1443}
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453static inline void reclaim_completed_tx_imm(struct sge_txq *q)
1454{
1455 unsigned int reclaim = q->processed - q->cleaned;
1456
1457 q->in_use -= reclaim;
1458 q->cleaned += reclaim;
1459}
1460
1461static inline int immediate(const struct sk_buff *skb)
1462{
1463 return skb->len <= WR_LEN;
1464}
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476static int ctrl_xmit(struct adapter *adap, struct sge_txq *q,
1477 struct sk_buff *skb)
1478{
1479 int ret;
1480 struct work_request_hdr *wrp = (struct work_request_hdr *)skb->data;
1481
1482 if (unlikely(!immediate(skb))) {
1483 WARN_ON(1);
1484 dev_kfree_skb(skb);
1485 return NET_XMIT_SUCCESS;
1486 }
1487
1488 wrp->wr_hi |= htonl(F_WR_SOP | F_WR_EOP);
1489 wrp->wr_lo = htonl(V_WR_TID(q->token));
1490
1491 spin_lock(&q->lock);
1492 again:reclaim_completed_tx_imm(q);
1493
1494 ret = check_desc_avail(adap, q, skb, 1, TXQ_CTRL);
1495 if (unlikely(ret)) {
1496 if (ret == 1) {
1497 spin_unlock(&q->lock);
1498 return NET_XMIT_CN;
1499 }
1500 goto again;
1501 }
1502
1503 write_imm(&q->desc[q->pidx], skb, skb->len, q->gen);
1504
1505 q->in_use++;
1506 if (++q->pidx >= q->size) {
1507 q->pidx = 0;
1508 q->gen ^= 1;
1509 }
1510 spin_unlock(&q->lock);
1511 wmb();
1512 t3_write_reg(adap, A_SG_KDOORBELL,
1513 F_SELEGRCNTX | V_EGRCNTX(q->cntxt_id));
1514 return NET_XMIT_SUCCESS;
1515}
1516
1517
1518
1519
1520
1521
1522
1523static void restart_ctrlq(unsigned long data)
1524{
1525 struct sk_buff *skb;
1526 struct sge_qset *qs = (struct sge_qset *)data;
1527 struct sge_txq *q = &qs->txq[TXQ_CTRL];
1528
1529 spin_lock(&q->lock);
1530 again:reclaim_completed_tx_imm(q);
1531
1532 while (q->in_use < q->size &&
1533 (skb = __skb_dequeue(&q->sendq)) != NULL) {
1534
1535 write_imm(&q->desc[q->pidx], skb, skb->len, q->gen);
1536
1537 if (++q->pidx >= q->size) {
1538 q->pidx = 0;
1539 q->gen ^= 1;
1540 }
1541 q->in_use++;
1542 }
1543
1544 if (!skb_queue_empty(&q->sendq)) {
1545 set_bit(TXQ_CTRL, &qs->txq_stopped);
1546 smp_mb__after_clear_bit();
1547
1548 if (should_restart_tx(q) &&
1549 test_and_clear_bit(TXQ_CTRL, &qs->txq_stopped))
1550 goto again;
1551 q->stops++;
1552 }
1553
1554 spin_unlock(&q->lock);
1555 wmb();
1556 t3_write_reg(qs->adap, A_SG_KDOORBELL,
1557 F_SELEGRCNTX | V_EGRCNTX(q->cntxt_id));
1558}
1559
1560
1561
1562
1563int t3_mgmt_tx(struct adapter *adap, struct sk_buff *skb)
1564{
1565 int ret;
1566 local_bh_disable();
1567 ret = ctrl_xmit(adap, &adap->sge.qs[0].txq[TXQ_CTRL], skb);
1568 local_bh_enable();
1569
1570 return ret;
1571}
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581static void deferred_unmap_destructor(struct sk_buff *skb)
1582{
1583 int i;
1584 const dma_addr_t *p;
1585 const struct skb_shared_info *si;
1586 const struct deferred_unmap_info *dui;
1587
1588 dui = (struct deferred_unmap_info *)skb->head;
1589 p = dui->addr;
1590
1591 if (skb_tail_pointer(skb) - skb_transport_header(skb))
1592 pci_unmap_single(dui->pdev, *p++, skb_tail_pointer(skb) -
1593 skb_transport_header(skb), PCI_DMA_TODEVICE);
1594
1595 si = skb_shinfo(skb);
1596 for (i = 0; i < si->nr_frags; i++)
1597 pci_unmap_page(dui->pdev, *p++, skb_frag_size(&si->frags[i]),
1598 PCI_DMA_TODEVICE);
1599}
1600
1601static void setup_deferred_unmapping(struct sk_buff *skb, struct pci_dev *pdev,
1602 const struct sg_ent *sgl, int sgl_flits)
1603{
1604 dma_addr_t *p;
1605 struct deferred_unmap_info *dui;
1606
1607 dui = (struct deferred_unmap_info *)skb->head;
1608 dui->pdev = pdev;
1609 for (p = dui->addr; sgl_flits >= 3; sgl++, sgl_flits -= 3) {
1610 *p++ = be64_to_cpu(sgl->addr[0]);
1611 *p++ = be64_to_cpu(sgl->addr[1]);
1612 }
1613 if (sgl_flits)
1614 *p = be64_to_cpu(sgl->addr[0]);
1615}
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629static void write_ofld_wr(struct adapter *adap, struct sk_buff *skb,
1630 struct sge_txq *q, unsigned int pidx,
1631 unsigned int gen, unsigned int ndesc,
1632 const dma_addr_t *addr)
1633{
1634 unsigned int sgl_flits, flits;
1635 struct work_request_hdr *from;
1636 struct sg_ent *sgp, sgl[MAX_SKB_FRAGS / 2 + 1];
1637 struct tx_desc *d = &q->desc[pidx];
1638
1639 if (immediate(skb)) {
1640 q->sdesc[pidx].skb = NULL;
1641 write_imm(d, skb, skb->len, gen);
1642 return;
1643 }
1644
1645
1646
1647 from = (struct work_request_hdr *)skb->data;
1648 memcpy(&d->flit[1], &from[1],
1649 skb_transport_offset(skb) - sizeof(*from));
1650
1651 flits = skb_transport_offset(skb) / 8;
1652 sgp = ndesc == 1 ? (struct sg_ent *)&d->flit[flits] : sgl;
1653 sgl_flits = write_sgl(skb, sgp, skb_transport_header(skb),
1654 skb_tail_pointer(skb) - skb_transport_header(skb),
1655 addr);
1656 if (need_skb_unmap()) {
1657 setup_deferred_unmapping(skb, adap->pdev, sgp, sgl_flits);
1658 skb->destructor = deferred_unmap_destructor;
1659 }
1660
1661 write_wr_hdr_sgl(ndesc, skb, d, pidx, q, sgl, flits, sgl_flits,
1662 gen, from->wr_hi, from->wr_lo);
1663}
1664
1665
1666
1667
1668
1669
1670
1671
1672static inline unsigned int calc_tx_descs_ofld(const struct sk_buff *skb)
1673{
1674 unsigned int flits, cnt;
1675
1676 if (skb->len <= WR_LEN)
1677 return 1;
1678
1679 flits = skb_transport_offset(skb) / 8;
1680 cnt = skb_shinfo(skb)->nr_frags;
1681 if (skb_tail_pointer(skb) != skb_transport_header(skb))
1682 cnt++;
1683 return flits_to_desc(flits + sgl_len(cnt));
1684}
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694static int ofld_xmit(struct adapter *adap, struct sge_txq *q,
1695 struct sk_buff *skb)
1696{
1697 int ret;
1698 unsigned int ndesc = calc_tx_descs_ofld(skb), pidx, gen;
1699
1700 spin_lock(&q->lock);
1701again: reclaim_completed_tx(adap, q, TX_RECLAIM_CHUNK);
1702
1703 ret = check_desc_avail(adap, q, skb, ndesc, TXQ_OFLD);
1704 if (unlikely(ret)) {
1705 if (ret == 1) {
1706 skb->priority = ndesc;
1707 spin_unlock(&q->lock);
1708 return NET_XMIT_CN;
1709 }
1710 goto again;
1711 }
1712
1713 if (!immediate(skb) &&
1714 map_skb(adap->pdev, skb, (dma_addr_t *)skb->head)) {
1715 spin_unlock(&q->lock);
1716 return NET_XMIT_SUCCESS;
1717 }
1718
1719 gen = q->gen;
1720 q->in_use += ndesc;
1721 pidx = q->pidx;
1722 q->pidx += ndesc;
1723 if (q->pidx >= q->size) {
1724 q->pidx -= q->size;
1725 q->gen ^= 1;
1726 }
1727 spin_unlock(&q->lock);
1728
1729 write_ofld_wr(adap, skb, q, pidx, gen, ndesc, (dma_addr_t *)skb->head);
1730 check_ring_tx_db(adap, q);
1731 return NET_XMIT_SUCCESS;
1732}
1733
1734
1735
1736
1737
1738
1739
1740static void restart_offloadq(unsigned long data)
1741{
1742 struct sk_buff *skb;
1743 struct sge_qset *qs = (struct sge_qset *)data;
1744 struct sge_txq *q = &qs->txq[TXQ_OFLD];
1745 const struct port_info *pi = netdev_priv(qs->netdev);
1746 struct adapter *adap = pi->adapter;
1747 unsigned int written = 0;
1748
1749 spin_lock(&q->lock);
1750again: reclaim_completed_tx(adap, q, TX_RECLAIM_CHUNK);
1751
1752 while ((skb = skb_peek(&q->sendq)) != NULL) {
1753 unsigned int gen, pidx;
1754 unsigned int ndesc = skb->priority;
1755
1756 if (unlikely(q->size - q->in_use < ndesc)) {
1757 set_bit(TXQ_OFLD, &qs->txq_stopped);
1758 smp_mb__after_clear_bit();
1759
1760 if (should_restart_tx(q) &&
1761 test_and_clear_bit(TXQ_OFLD, &qs->txq_stopped))
1762 goto again;
1763 q->stops++;
1764 break;
1765 }
1766
1767 if (!immediate(skb) &&
1768 map_skb(adap->pdev, skb, (dma_addr_t *)skb->head))
1769 break;
1770
1771 gen = q->gen;
1772 q->in_use += ndesc;
1773 pidx = q->pidx;
1774 q->pidx += ndesc;
1775 written += ndesc;
1776 if (q->pidx >= q->size) {
1777 q->pidx -= q->size;
1778 q->gen ^= 1;
1779 }
1780 __skb_unlink(skb, &q->sendq);
1781 spin_unlock(&q->lock);
1782
1783 write_ofld_wr(adap, skb, q, pidx, gen, ndesc,
1784 (dma_addr_t *)skb->head);
1785 spin_lock(&q->lock);
1786 }
1787 spin_unlock(&q->lock);
1788
1789#if USE_GTS
1790 set_bit(TXQ_RUNNING, &q->flags);
1791 set_bit(TXQ_LAST_PKT_DB, &q->flags);
1792#endif
1793 wmb();
1794 if (likely(written))
1795 t3_write_reg(adap, A_SG_KDOORBELL,
1796 F_SELEGRCNTX | V_EGRCNTX(q->cntxt_id));
1797}
1798
1799
1800
1801
1802
1803
1804
1805
1806static inline int queue_set(const struct sk_buff *skb)
1807{
1808 return skb->priority >> 1;
1809}
1810
1811
1812
1813
1814
1815
1816
1817
1818static inline int is_ctrl_pkt(const struct sk_buff *skb)
1819{
1820 return skb->priority & 1;
1821}
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832int t3_offload_tx(struct t3cdev *tdev, struct sk_buff *skb)
1833{
1834 struct adapter *adap = tdev2adap(tdev);
1835 struct sge_qset *qs = &adap->sge.qs[queue_set(skb)];
1836
1837 if (unlikely(is_ctrl_pkt(skb)))
1838 return ctrl_xmit(adap, &qs->txq[TXQ_CTRL], skb);
1839
1840 return ofld_xmit(adap, &qs->txq[TXQ_OFLD], skb);
1841}
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852static inline void offload_enqueue(struct sge_rspq *q, struct sk_buff *skb)
1853{
1854 int was_empty = skb_queue_empty(&q->rx_queue);
1855
1856 __skb_queue_tail(&q->rx_queue, skb);
1857
1858 if (was_empty) {
1859 struct sge_qset *qs = rspq_to_qset(q);
1860
1861 napi_schedule(&qs->napi);
1862 }
1863}
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874static inline void deliver_partial_bundle(struct t3cdev *tdev,
1875 struct sge_rspq *q,
1876 struct sk_buff *skbs[], int n)
1877{
1878 if (n) {
1879 q->offload_bundles++;
1880 tdev->recv(tdev, skbs, n);
1881 }
1882}
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895static int ofld_poll(struct napi_struct *napi, int budget)
1896{
1897 struct sge_qset *qs = container_of(napi, struct sge_qset, napi);
1898 struct sge_rspq *q = &qs->rspq;
1899 struct adapter *adapter = qs->adap;
1900 int work_done = 0;
1901
1902 while (work_done < budget) {
1903 struct sk_buff *skb, *tmp, *skbs[RX_BUNDLE_SIZE];
1904 struct sk_buff_head queue;
1905 int ngathered;
1906
1907 spin_lock_irq(&q->lock);
1908 __skb_queue_head_init(&queue);
1909 skb_queue_splice_init(&q->rx_queue, &queue);
1910 if (skb_queue_empty(&queue)) {
1911 napi_complete(napi);
1912 spin_unlock_irq(&q->lock);
1913 return work_done;
1914 }
1915 spin_unlock_irq(&q->lock);
1916
1917 ngathered = 0;
1918 skb_queue_walk_safe(&queue, skb, tmp) {
1919 if (work_done >= budget)
1920 break;
1921 work_done++;
1922
1923 __skb_unlink(skb, &queue);
1924 prefetch(skb->data);
1925 skbs[ngathered] = skb;
1926 if (++ngathered == RX_BUNDLE_SIZE) {
1927 q->offload_bundles++;
1928 adapter->tdev.recv(&adapter->tdev, skbs,
1929 ngathered);
1930 ngathered = 0;
1931 }
1932 }
1933 if (!skb_queue_empty(&queue)) {
1934
1935 spin_lock_irq(&q->lock);
1936 skb_queue_splice(&queue, &q->rx_queue);
1937 spin_unlock_irq(&q->lock);
1938 }
1939 deliver_partial_bundle(&adapter->tdev, q, skbs, ngathered);
1940 }
1941
1942 return work_done;
1943}
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956static inline int rx_offload(struct t3cdev *tdev, struct sge_rspq *rq,
1957 struct sk_buff *skb, struct sk_buff *rx_gather[],
1958 unsigned int gather_idx)
1959{
1960 skb_reset_mac_header(skb);
1961 skb_reset_network_header(skb);
1962 skb_reset_transport_header(skb);
1963
1964 if (rq->polling) {
1965 rx_gather[gather_idx++] = skb;
1966 if (gather_idx == RX_BUNDLE_SIZE) {
1967 tdev->recv(tdev, rx_gather, RX_BUNDLE_SIZE);
1968 gather_idx = 0;
1969 rq->offload_bundles++;
1970 }
1971 } else
1972 offload_enqueue(rq, skb);
1973
1974 return gather_idx;
1975}
1976
1977
1978
1979
1980
1981
1982
1983
1984static void restart_tx(struct sge_qset *qs)
1985{
1986 if (test_bit(TXQ_ETH, &qs->txq_stopped) &&
1987 should_restart_tx(&qs->txq[TXQ_ETH]) &&
1988 test_and_clear_bit(TXQ_ETH, &qs->txq_stopped)) {
1989 qs->txq[TXQ_ETH].restarts++;
1990 if (netif_running(qs->netdev))
1991 netif_tx_wake_queue(qs->tx_q);
1992 }
1993
1994 if (test_bit(TXQ_OFLD, &qs->txq_stopped) &&
1995 should_restart_tx(&qs->txq[TXQ_OFLD]) &&
1996 test_and_clear_bit(TXQ_OFLD, &qs->txq_stopped)) {
1997 qs->txq[TXQ_OFLD].restarts++;
1998 tasklet_schedule(&qs->txq[TXQ_OFLD].qresume_tsk);
1999 }
2000 if (test_bit(TXQ_CTRL, &qs->txq_stopped) &&
2001 should_restart_tx(&qs->txq[TXQ_CTRL]) &&
2002 test_and_clear_bit(TXQ_CTRL, &qs->txq_stopped)) {
2003 qs->txq[TXQ_CTRL].restarts++;
2004 tasklet_schedule(&qs->txq[TXQ_CTRL].qresume_tsk);
2005 }
2006}
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016static void cxgb3_arp_process(struct port_info *pi, struct sk_buff *skb)
2017{
2018 struct net_device *dev = skb->dev;
2019 struct arphdr *arp;
2020 unsigned char *arp_ptr;
2021 unsigned char *sha;
2022 __be32 sip, tip;
2023
2024 if (!dev)
2025 return;
2026
2027 skb_reset_network_header(skb);
2028 arp = arp_hdr(skb);
2029
2030 if (arp->ar_op != htons(ARPOP_REQUEST))
2031 return;
2032
2033 arp_ptr = (unsigned char *)(arp + 1);
2034 sha = arp_ptr;
2035 arp_ptr += dev->addr_len;
2036 memcpy(&sip, arp_ptr, sizeof(sip));
2037 arp_ptr += sizeof(sip);
2038 arp_ptr += dev->addr_len;
2039 memcpy(&tip, arp_ptr, sizeof(tip));
2040
2041 if (tip != pi->iscsi_ipv4addr)
2042 return;
2043
2044 arp_send(ARPOP_REPLY, ETH_P_ARP, sip, dev, tip, sha,
2045 pi->iscsic.mac_addr, sha);
2046
2047}
2048
2049static inline int is_arp(struct sk_buff *skb)
2050{
2051 return skb->protocol == htons(ETH_P_ARP);
2052}
2053
2054static void cxgb3_process_iscsi_prov_pack(struct port_info *pi,
2055 struct sk_buff *skb)
2056{
2057 if (is_arp(skb)) {
2058 cxgb3_arp_process(pi, skb);
2059 return;
2060 }
2061
2062 if (pi->iscsic.recv)
2063 pi->iscsic.recv(pi, skb);
2064
2065}
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078static void rx_eth(struct adapter *adap, struct sge_rspq *rq,
2079 struct sk_buff *skb, int pad, int lro)
2080{
2081 struct cpl_rx_pkt *p = (struct cpl_rx_pkt *)(skb->data + pad);
2082 struct sge_qset *qs = rspq_to_qset(rq);
2083 struct port_info *pi;
2084
2085 skb_pull(skb, sizeof(*p) + pad);
2086 skb->protocol = eth_type_trans(skb, adap->port[p->iff]);
2087 pi = netdev_priv(skb->dev);
2088 if ((skb->dev->features & NETIF_F_RXCSUM) && p->csum_valid &&
2089 p->csum == htons(0xffff) && !p->fragment) {
2090 qs->port_stats[SGE_PSTAT_RX_CSUM_GOOD]++;
2091 skb->ip_summed = CHECKSUM_UNNECESSARY;
2092 } else
2093 skb_checksum_none_assert(skb);
2094 skb_record_rx_queue(skb, qs - &adap->sge.qs[pi->first_qset]);
2095
2096 if (p->vlan_valid) {
2097 qs->port_stats[SGE_PSTAT_VLANEX]++;
2098 __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), ntohs(p->vlan));
2099 }
2100 if (rq->polling) {
2101 if (lro)
2102 napi_gro_receive(&qs->napi, skb);
2103 else {
2104 if (unlikely(pi->iscsic.flags))
2105 cxgb3_process_iscsi_prov_pack(pi, skb);
2106 netif_receive_skb(skb);
2107 }
2108 } else
2109 netif_rx(skb);
2110}
2111
2112static inline int is_eth_tcp(u32 rss)
2113{
2114 return G_HASHTYPE(ntohl(rss)) == RSS_HASH_4_TUPLE;
2115}
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128static void lro_add_page(struct adapter *adap, struct sge_qset *qs,
2129 struct sge_fl *fl, int len, int complete)
2130{
2131 struct rx_sw_desc *sd = &fl->sdesc[fl->cidx];
2132 struct port_info *pi = netdev_priv(qs->netdev);
2133 struct sk_buff *skb = NULL;
2134 struct cpl_rx_pkt *cpl;
2135 struct skb_frag_struct *rx_frag;
2136 int nr_frags;
2137 int offset = 0;
2138
2139 if (!qs->nomem) {
2140 skb = napi_get_frags(&qs->napi);
2141 qs->nomem = !skb;
2142 }
2143
2144 fl->credits--;
2145
2146 pci_dma_sync_single_for_cpu(adap->pdev,
2147 dma_unmap_addr(sd, dma_addr),
2148 fl->buf_size - SGE_PG_RSVD,
2149 PCI_DMA_FROMDEVICE);
2150
2151 (*sd->pg_chunk.p_cnt)--;
2152 if (!*sd->pg_chunk.p_cnt && sd->pg_chunk.page != fl->pg_chunk.page)
2153 pci_unmap_page(adap->pdev,
2154 sd->pg_chunk.mapping,
2155 fl->alloc_size,
2156 PCI_DMA_FROMDEVICE);
2157
2158 if (!skb) {
2159 put_page(sd->pg_chunk.page);
2160 if (complete)
2161 qs->nomem = 0;
2162 return;
2163 }
2164
2165 rx_frag = skb_shinfo(skb)->frags;
2166 nr_frags = skb_shinfo(skb)->nr_frags;
2167
2168 if (!nr_frags) {
2169 offset = 2 + sizeof(struct cpl_rx_pkt);
2170 cpl = qs->lro_va = sd->pg_chunk.va + 2;
2171
2172 if ((qs->netdev->features & NETIF_F_RXCSUM) &&
2173 cpl->csum_valid && cpl->csum == htons(0xffff)) {
2174 skb->ip_summed = CHECKSUM_UNNECESSARY;
2175 qs->port_stats[SGE_PSTAT_RX_CSUM_GOOD]++;
2176 } else
2177 skb->ip_summed = CHECKSUM_NONE;
2178 } else
2179 cpl = qs->lro_va;
2180
2181 len -= offset;
2182
2183 rx_frag += nr_frags;
2184 __skb_frag_set_page(rx_frag, sd->pg_chunk.page);
2185 rx_frag->page_offset = sd->pg_chunk.offset + offset;
2186 skb_frag_size_set(rx_frag, len);
2187
2188 skb->len += len;
2189 skb->data_len += len;
2190 skb->truesize += len;
2191 skb_shinfo(skb)->nr_frags++;
2192
2193 if (!complete)
2194 return;
2195
2196 skb_record_rx_queue(skb, qs - &adap->sge.qs[pi->first_qset]);
2197
2198 if (cpl->vlan_valid) {
2199 qs->port_stats[SGE_PSTAT_VLANEX]++;
2200 __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), ntohs(cpl->vlan));
2201 }
2202 napi_gro_frags(&qs->napi);
2203}
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214static inline void handle_rsp_cntrl_info(struct sge_qset *qs, u32 flags)
2215{
2216 unsigned int credits;
2217
2218#if USE_GTS
2219 if (flags & F_RSPD_TXQ0_GTS)
2220 clear_bit(TXQ_RUNNING, &qs->txq[TXQ_ETH].flags);
2221#endif
2222
2223 credits = G_RSPD_TXQ0_CR(flags);
2224 if (credits)
2225 qs->txq[TXQ_ETH].processed += credits;
2226
2227 credits = G_RSPD_TXQ2_CR(flags);
2228 if (credits)
2229 qs->txq[TXQ_CTRL].processed += credits;
2230
2231# if USE_GTS
2232 if (flags & F_RSPD_TXQ1_GTS)
2233 clear_bit(TXQ_RUNNING, &qs->txq[TXQ_OFLD].flags);
2234# endif
2235 credits = G_RSPD_TXQ1_CR(flags);
2236 if (credits)
2237 qs->txq[TXQ_OFLD].processed += credits;
2238}
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250static void check_ring_db(struct adapter *adap, struct sge_qset *qs,
2251 unsigned int sleeping)
2252{
2253 if (sleeping & F_RSPD_TXQ0_GTS) {
2254 struct sge_txq *txq = &qs->txq[TXQ_ETH];
2255
2256 if (txq->cleaned + txq->in_use != txq->processed &&
2257 !test_and_set_bit(TXQ_LAST_PKT_DB, &txq->flags)) {
2258 set_bit(TXQ_RUNNING, &txq->flags);
2259 t3_write_reg(adap, A_SG_KDOORBELL, F_SELEGRCNTX |
2260 V_EGRCNTX(txq->cntxt_id));
2261 }
2262 }
2263
2264 if (sleeping & F_RSPD_TXQ1_GTS) {
2265 struct sge_txq *txq = &qs->txq[TXQ_OFLD];
2266
2267 if (txq->cleaned + txq->in_use != txq->processed &&
2268 !test_and_set_bit(TXQ_LAST_PKT_DB, &txq->flags)) {
2269 set_bit(TXQ_RUNNING, &txq->flags);
2270 t3_write_reg(adap, A_SG_KDOORBELL, F_SELEGRCNTX |
2271 V_EGRCNTX(txq->cntxt_id));
2272 }
2273 }
2274}
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284static inline int is_new_response(const struct rsp_desc *r,
2285 const struct sge_rspq *q)
2286{
2287 return (r->intr_gen & F_RSPD_GEN2) == q->gen;
2288}
2289
2290static inline void clear_rspq_bufstate(struct sge_rspq * const q)
2291{
2292 q->pg_skb = NULL;
2293 q->rx_recycle_buf = 0;
2294}
2295
2296#define RSPD_GTS_MASK (F_RSPD_TXQ0_GTS | F_RSPD_TXQ1_GTS)
2297#define RSPD_CTRL_MASK (RSPD_GTS_MASK | \
2298 V_RSPD_TXQ0_CR(M_RSPD_TXQ0_CR) | \
2299 V_RSPD_TXQ1_CR(M_RSPD_TXQ1_CR) | \
2300 V_RSPD_TXQ2_CR(M_RSPD_TXQ2_CR))
2301
2302
2303#define NOMEM_INTR_DELAY 2500
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320static int process_responses(struct adapter *adap, struct sge_qset *qs,
2321 int budget)
2322{
2323 struct sge_rspq *q = &qs->rspq;
2324 struct rsp_desc *r = &q->desc[q->cidx];
2325 int budget_left = budget;
2326 unsigned int sleeping = 0;
2327 struct sk_buff *offload_skbs[RX_BUNDLE_SIZE];
2328 int ngathered = 0;
2329
2330 q->next_holdoff = q->holdoff_tmr;
2331
2332 while (likely(budget_left && is_new_response(r, q))) {
2333 int packet_complete, eth, ethpad = 2;
2334 int lro = !!(qs->netdev->features & NETIF_F_GRO);
2335 struct sk_buff *skb = NULL;
2336 u32 len, flags;
2337 __be32 rss_hi, rss_lo;
2338
2339 dma_rmb();
2340 eth = r->rss_hdr.opcode == CPL_RX_PKT;
2341 rss_hi = *(const __be32 *)r;
2342 rss_lo = r->rss_hdr.rss_hash_val;
2343 flags = ntohl(r->flags);
2344
2345 if (unlikely(flags & F_RSPD_ASYNC_NOTIF)) {
2346 skb = alloc_skb(AN_PKT_SIZE, GFP_ATOMIC);
2347 if (!skb)
2348 goto no_mem;
2349
2350 memcpy(__skb_put(skb, AN_PKT_SIZE), r, AN_PKT_SIZE);
2351 skb->data[0] = CPL_ASYNC_NOTIF;
2352 rss_hi = htonl(CPL_ASYNC_NOTIF << 24);
2353 q->async_notif++;
2354 } else if (flags & F_RSPD_IMM_DATA_VALID) {
2355 skb = get_imm_packet(r);
2356 if (unlikely(!skb)) {
2357no_mem:
2358 q->next_holdoff = NOMEM_INTR_DELAY;
2359 q->nomem++;
2360
2361 budget_left--;
2362 break;
2363 }
2364 q->imm_data++;
2365 ethpad = 0;
2366 } else if ((len = ntohl(r->len_cq)) != 0) {
2367 struct sge_fl *fl;
2368
2369 lro &= eth && is_eth_tcp(rss_hi);
2370
2371 fl = (len & F_RSPD_FLQ) ? &qs->fl[1] : &qs->fl[0];
2372 if (fl->use_pages) {
2373 void *addr = fl->sdesc[fl->cidx].pg_chunk.va;
2374
2375 prefetch(addr);
2376#if L1_CACHE_BYTES < 128
2377 prefetch(addr + L1_CACHE_BYTES);
2378#endif
2379 __refill_fl(adap, fl);
2380 if (lro > 0) {
2381 lro_add_page(adap, qs, fl,
2382 G_RSPD_LEN(len),
2383 flags & F_RSPD_EOP);
2384 goto next_fl;
2385 }
2386
2387 skb = get_packet_pg(adap, fl, q,
2388 G_RSPD_LEN(len),
2389 eth ?
2390 SGE_RX_DROP_THRES : 0);
2391 q->pg_skb = skb;
2392 } else
2393 skb = get_packet(adap, fl, G_RSPD_LEN(len),
2394 eth ? SGE_RX_DROP_THRES : 0);
2395 if (unlikely(!skb)) {
2396 if (!eth)
2397 goto no_mem;
2398 q->rx_drops++;
2399 } else if (unlikely(r->rss_hdr.opcode == CPL_TRACE_PKT))
2400 __skb_pull(skb, 2);
2401next_fl:
2402 if (++fl->cidx == fl->size)
2403 fl->cidx = 0;
2404 } else
2405 q->pure_rsps++;
2406
2407 if (flags & RSPD_CTRL_MASK) {
2408 sleeping |= flags & RSPD_GTS_MASK;
2409 handle_rsp_cntrl_info(qs, flags);
2410 }
2411
2412 r++;
2413 if (unlikely(++q->cidx == q->size)) {
2414 q->cidx = 0;
2415 q->gen ^= 1;
2416 r = q->desc;
2417 }
2418 prefetch(r);
2419
2420 if (++q->credits >= (q->size / 4)) {
2421 refill_rspq(adap, q, q->credits);
2422 q->credits = 0;
2423 }
2424
2425 packet_complete = flags &
2426 (F_RSPD_EOP | F_RSPD_IMM_DATA_VALID |
2427 F_RSPD_ASYNC_NOTIF);
2428
2429 if (skb != NULL && packet_complete) {
2430 if (eth)
2431 rx_eth(adap, q, skb, ethpad, lro);
2432 else {
2433 q->offload_pkts++;
2434
2435 skb->csum = rss_hi;
2436 skb->priority = rss_lo;
2437 ngathered = rx_offload(&adap->tdev, q, skb,
2438 offload_skbs,
2439 ngathered);
2440 }
2441
2442 if (flags & F_RSPD_EOP)
2443 clear_rspq_bufstate(q);
2444 }
2445 --budget_left;
2446 }
2447
2448 deliver_partial_bundle(&adap->tdev, q, offload_skbs, ngathered);
2449
2450 if (sleeping)
2451 check_ring_db(adap, qs, sleeping);
2452
2453 smp_mb();
2454 if (unlikely(qs->txq_stopped != 0))
2455 restart_tx(qs);
2456
2457 budget -= budget_left;
2458 return budget;
2459}
2460
2461static inline int is_pure_response(const struct rsp_desc *r)
2462{
2463 __be32 n = r->flags & htonl(F_RSPD_ASYNC_NOTIF | F_RSPD_IMM_DATA_VALID);
2464
2465 return (n | r->len_cq) == 0;
2466}
2467
2468
2469
2470
2471
2472
2473
2474
2475static int napi_rx_handler(struct napi_struct *napi, int budget)
2476{
2477 struct sge_qset *qs = container_of(napi, struct sge_qset, napi);
2478 struct adapter *adap = qs->adap;
2479 int work_done = process_responses(adap, qs, budget);
2480
2481 if (likely(work_done < budget)) {
2482 napi_complete(napi);
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498 t3_write_reg(adap, A_SG_GTS, V_RSPQ(qs->rspq.cntxt_id) |
2499 V_NEWTIMER(qs->rspq.next_holdoff) |
2500 V_NEWINDEX(qs->rspq.cidx));
2501 }
2502 return work_done;
2503}
2504
2505
2506
2507
2508static inline int napi_is_scheduled(struct napi_struct *napi)
2509{
2510 return test_bit(NAPI_STATE_SCHED, &napi->state);
2511}
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527static int process_pure_responses(struct adapter *adap, struct sge_qset *qs,
2528 struct rsp_desc *r)
2529{
2530 struct sge_rspq *q = &qs->rspq;
2531 unsigned int sleeping = 0;
2532
2533 do {
2534 u32 flags = ntohl(r->flags);
2535
2536 r++;
2537 if (unlikely(++q->cidx == q->size)) {
2538 q->cidx = 0;
2539 q->gen ^= 1;
2540 r = q->desc;
2541 }
2542 prefetch(r);
2543
2544 if (flags & RSPD_CTRL_MASK) {
2545 sleeping |= flags & RSPD_GTS_MASK;
2546 handle_rsp_cntrl_info(qs, flags);
2547 }
2548
2549 q->pure_rsps++;
2550 if (++q->credits >= (q->size / 4)) {
2551 refill_rspq(adap, q, q->credits);
2552 q->credits = 0;
2553 }
2554 if (!is_new_response(r, q))
2555 break;
2556 dma_rmb();
2557 } while (is_pure_response(r));
2558
2559 if (sleeping)
2560 check_ring_db(adap, qs, sleeping);
2561
2562 smp_mb();
2563 if (unlikely(qs->txq_stopped != 0))
2564 restart_tx(qs);
2565
2566 return is_new_response(r, q);
2567}
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584static inline int handle_responses(struct adapter *adap, struct sge_rspq *q)
2585{
2586 struct sge_qset *qs = rspq_to_qset(q);
2587 struct rsp_desc *r = &q->desc[q->cidx];
2588
2589 if (!is_new_response(r, q))
2590 return -1;
2591 dma_rmb();
2592 if (is_pure_response(r) && process_pure_responses(adap, qs, r) == 0) {
2593 t3_write_reg(adap, A_SG_GTS, V_RSPQ(q->cntxt_id) |
2594 V_NEWTIMER(q->holdoff_tmr) | V_NEWINDEX(q->cidx));
2595 return 0;
2596 }
2597 napi_schedule(&qs->napi);
2598 return 1;
2599}
2600
2601
2602
2603
2604
2605static irqreturn_t t3_sge_intr_msix(int irq, void *cookie)
2606{
2607 struct sge_qset *qs = cookie;
2608 struct adapter *adap = qs->adap;
2609 struct sge_rspq *q = &qs->rspq;
2610
2611 spin_lock(&q->lock);
2612 if (process_responses(adap, qs, -1) == 0)
2613 q->unhandled_irqs++;
2614 t3_write_reg(adap, A_SG_GTS, V_RSPQ(q->cntxt_id) |
2615 V_NEWTIMER(q->next_holdoff) | V_NEWINDEX(q->cidx));
2616 spin_unlock(&q->lock);
2617 return IRQ_HANDLED;
2618}
2619
2620
2621
2622
2623
2624static irqreturn_t t3_sge_intr_msix_napi(int irq, void *cookie)
2625{
2626 struct sge_qset *qs = cookie;
2627 struct sge_rspq *q = &qs->rspq;
2628
2629 spin_lock(&q->lock);
2630
2631 if (handle_responses(qs->adap, q) < 0)
2632 q->unhandled_irqs++;
2633 spin_unlock(&q->lock);
2634 return IRQ_HANDLED;
2635}
2636
2637
2638
2639
2640
2641
2642
2643static irqreturn_t t3_intr_msi(int irq, void *cookie)
2644{
2645 int new_packets = 0;
2646 struct adapter *adap = cookie;
2647 struct sge_rspq *q = &adap->sge.qs[0].rspq;
2648
2649 spin_lock(&q->lock);
2650
2651 if (process_responses(adap, &adap->sge.qs[0], -1)) {
2652 t3_write_reg(adap, A_SG_GTS, V_RSPQ(q->cntxt_id) |
2653 V_NEWTIMER(q->next_holdoff) | V_NEWINDEX(q->cidx));
2654 new_packets = 1;
2655 }
2656
2657 if (adap->params.nports == 2 &&
2658 process_responses(adap, &adap->sge.qs[1], -1)) {
2659 struct sge_rspq *q1 = &adap->sge.qs[1].rspq;
2660
2661 t3_write_reg(adap, A_SG_GTS, V_RSPQ(q1->cntxt_id) |
2662 V_NEWTIMER(q1->next_holdoff) |
2663 V_NEWINDEX(q1->cidx));
2664 new_packets = 1;
2665 }
2666
2667 if (!new_packets && t3_slow_intr_handler(adap) == 0)
2668 q->unhandled_irqs++;
2669
2670 spin_unlock(&q->lock);
2671 return IRQ_HANDLED;
2672}
2673
2674static int rspq_check_napi(struct sge_qset *qs)
2675{
2676 struct sge_rspq *q = &qs->rspq;
2677
2678 if (!napi_is_scheduled(&qs->napi) &&
2679 is_new_response(&q->desc[q->cidx], q)) {
2680 napi_schedule(&qs->napi);
2681 return 1;
2682 }
2683 return 0;
2684}
2685
2686
2687
2688
2689
2690
2691
2692
2693static irqreturn_t t3_intr_msi_napi(int irq, void *cookie)
2694{
2695 int new_packets;
2696 struct adapter *adap = cookie;
2697 struct sge_rspq *q = &adap->sge.qs[0].rspq;
2698
2699 spin_lock(&q->lock);
2700
2701 new_packets = rspq_check_napi(&adap->sge.qs[0]);
2702 if (adap->params.nports == 2)
2703 new_packets += rspq_check_napi(&adap->sge.qs[1]);
2704 if (!new_packets && t3_slow_intr_handler(adap) == 0)
2705 q->unhandled_irqs++;
2706
2707 spin_unlock(&q->lock);
2708 return IRQ_HANDLED;
2709}
2710
2711
2712
2713
2714static inline int process_responses_gts(struct adapter *adap,
2715 struct sge_rspq *rq)
2716{
2717 int work;
2718
2719 work = process_responses(adap, rspq_to_qset(rq), -1);
2720 t3_write_reg(adap, A_SG_GTS, V_RSPQ(rq->cntxt_id) |
2721 V_NEWTIMER(rq->next_holdoff) | V_NEWINDEX(rq->cidx));
2722 return work;
2723}
2724
2725
2726
2727
2728
2729
2730
2731static irqreturn_t t3_intr(int irq, void *cookie)
2732{
2733 int work_done, w0, w1;
2734 struct adapter *adap = cookie;
2735 struct sge_rspq *q0 = &adap->sge.qs[0].rspq;
2736 struct sge_rspq *q1 = &adap->sge.qs[1].rspq;
2737
2738 spin_lock(&q0->lock);
2739
2740 w0 = is_new_response(&q0->desc[q0->cidx], q0);
2741 w1 = adap->params.nports == 2 &&
2742 is_new_response(&q1->desc[q1->cidx], q1);
2743
2744 if (likely(w0 | w1)) {
2745 t3_write_reg(adap, A_PL_CLI, 0);
2746 t3_read_reg(adap, A_PL_CLI);
2747
2748 if (likely(w0))
2749 process_responses_gts(adap, q0);
2750
2751 if (w1)
2752 process_responses_gts(adap, q1);
2753
2754 work_done = w0 | w1;
2755 } else
2756 work_done = t3_slow_intr_handler(adap);
2757
2758 spin_unlock(&q0->lock);
2759 return IRQ_RETVAL(work_done != 0);
2760}
2761
2762
2763
2764
2765
2766
2767
2768
2769static irqreturn_t t3b_intr(int irq, void *cookie)
2770{
2771 u32 map;
2772 struct adapter *adap = cookie;
2773 struct sge_rspq *q0 = &adap->sge.qs[0].rspq;
2774
2775 t3_write_reg(adap, A_PL_CLI, 0);
2776 map = t3_read_reg(adap, A_SG_DATA_INTR);
2777
2778 if (unlikely(!map))
2779 return IRQ_NONE;
2780
2781 spin_lock(&q0->lock);
2782
2783 if (unlikely(map & F_ERRINTR))
2784 t3_slow_intr_handler(adap);
2785
2786 if (likely(map & 1))
2787 process_responses_gts(adap, q0);
2788
2789 if (map & 2)
2790 process_responses_gts(adap, &adap->sge.qs[1].rspq);
2791
2792 spin_unlock(&q0->lock);
2793 return IRQ_HANDLED;
2794}
2795
2796
2797
2798
2799
2800
2801
2802
2803static irqreturn_t t3b_intr_napi(int irq, void *cookie)
2804{
2805 u32 map;
2806 struct adapter *adap = cookie;
2807 struct sge_qset *qs0 = &adap->sge.qs[0];
2808 struct sge_rspq *q0 = &qs0->rspq;
2809
2810 t3_write_reg(adap, A_PL_CLI, 0);
2811 map = t3_read_reg(adap, A_SG_DATA_INTR);
2812
2813 if (unlikely(!map))
2814 return IRQ_NONE;
2815
2816 spin_lock(&q0->lock);
2817
2818 if (unlikely(map & F_ERRINTR))
2819 t3_slow_intr_handler(adap);
2820
2821 if (likely(map & 1))
2822 napi_schedule(&qs0->napi);
2823
2824 if (map & 2)
2825 napi_schedule(&adap->sge.qs[1].napi);
2826
2827 spin_unlock(&q0->lock);
2828 return IRQ_HANDLED;
2829}
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840irq_handler_t t3_intr_handler(struct adapter *adap, int polling)
2841{
2842 if (adap->flags & USING_MSIX)
2843 return polling ? t3_sge_intr_msix_napi : t3_sge_intr_msix;
2844 if (adap->flags & USING_MSI)
2845 return polling ? t3_intr_msi_napi : t3_intr_msi;
2846 if (adap->params.rev > 0)
2847 return polling ? t3b_intr_napi : t3b_intr;
2848 return t3_intr;
2849}
2850
2851#define SGE_PARERR (F_CPPARITYERROR | F_OCPARITYERROR | F_RCPARITYERROR | \
2852 F_IRPARITYERROR | V_ITPARITYERROR(M_ITPARITYERROR) | \
2853 V_FLPARITYERROR(M_FLPARITYERROR) | F_LODRBPARITYERROR | \
2854 F_HIDRBPARITYERROR | F_LORCQPARITYERROR | \
2855 F_HIRCQPARITYERROR)
2856#define SGE_FRAMINGERR (F_UC_REQ_FRAMINGERROR | F_R_REQ_FRAMINGERROR)
2857#define SGE_FATALERR (SGE_PARERR | SGE_FRAMINGERR | F_RSPQCREDITOVERFOW | \
2858 F_RSPQDISABLED)
2859
2860
2861
2862
2863
2864
2865
2866void t3_sge_err_intr_handler(struct adapter *adapter)
2867{
2868 unsigned int v, status = t3_read_reg(adapter, A_SG_INT_CAUSE) &
2869 ~F_FLEMPTY;
2870
2871 if (status & SGE_PARERR)
2872 CH_ALERT(adapter, "SGE parity error (0x%x)\n",
2873 status & SGE_PARERR);
2874 if (status & SGE_FRAMINGERR)
2875 CH_ALERT(adapter, "SGE framing error (0x%x)\n",
2876 status & SGE_FRAMINGERR);
2877
2878 if (status & F_RSPQCREDITOVERFOW)
2879 CH_ALERT(adapter, "SGE response queue credit overflow\n");
2880
2881 if (status & F_RSPQDISABLED) {
2882 v = t3_read_reg(adapter, A_SG_RSPQ_FL_STATUS);
2883
2884 CH_ALERT(adapter,
2885 "packet delivered to disabled response queue "
2886 "(0x%x)\n", (v >> S_RSPQ0DISABLED) & 0xff);
2887 }
2888
2889 if (status & (F_HIPIODRBDROPERR | F_LOPIODRBDROPERR))
2890 queue_work(cxgb3_wq, &adapter->db_drop_task);
2891
2892 if (status & (F_HIPRIORITYDBFULL | F_LOPRIORITYDBFULL))
2893 queue_work(cxgb3_wq, &adapter->db_full_task);
2894
2895 if (status & (F_HIPRIORITYDBEMPTY | F_LOPRIORITYDBEMPTY))
2896 queue_work(cxgb3_wq, &adapter->db_empty_task);
2897
2898 t3_write_reg(adapter, A_SG_INT_CAUSE, status);
2899 if (status & SGE_FATALERR)
2900 t3_fatal_err(adapter);
2901}
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921static void sge_timer_tx(struct timer_list *t)
2922{
2923 struct sge_qset *qs = from_timer(qs, t, tx_reclaim_timer);
2924 struct port_info *pi = netdev_priv(qs->netdev);
2925 struct adapter *adap = pi->adapter;
2926 unsigned int tbd[SGE_TXQ_PER_SET] = {0, 0};
2927 unsigned long next_period;
2928
2929 if (__netif_tx_trylock(qs->tx_q)) {
2930 tbd[TXQ_ETH] = reclaim_completed_tx(adap, &qs->txq[TXQ_ETH],
2931 TX_RECLAIM_TIMER_CHUNK);
2932 __netif_tx_unlock(qs->tx_q);
2933 }
2934
2935 if (spin_trylock(&qs->txq[TXQ_OFLD].lock)) {
2936 tbd[TXQ_OFLD] = reclaim_completed_tx(adap, &qs->txq[TXQ_OFLD],
2937 TX_RECLAIM_TIMER_CHUNK);
2938 spin_unlock(&qs->txq[TXQ_OFLD].lock);
2939 }
2940
2941 next_period = TX_RECLAIM_PERIOD >>
2942 (max(tbd[TXQ_ETH], tbd[TXQ_OFLD]) /
2943 TX_RECLAIM_TIMER_CHUNK);
2944 mod_timer(&qs->tx_reclaim_timer, jiffies + next_period);
2945}
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961static void sge_timer_rx(struct timer_list *t)
2962{
2963 spinlock_t *lock;
2964 struct sge_qset *qs = from_timer(qs, t, rx_reclaim_timer);
2965 struct port_info *pi = netdev_priv(qs->netdev);
2966 struct adapter *adap = pi->adapter;
2967 u32 status;
2968
2969 lock = adap->params.rev > 0 ?
2970 &qs->rspq.lock : &adap->sge.qs[0].rspq.lock;
2971
2972 if (!spin_trylock_irq(lock))
2973 goto out;
2974
2975 if (napi_is_scheduled(&qs->napi))
2976 goto unlock;
2977
2978 if (adap->params.rev < 4) {
2979 status = t3_read_reg(adap, A_SG_RSPQ_FL_STATUS);
2980
2981 if (status & (1 << qs->rspq.cntxt_id)) {
2982 qs->rspq.starved++;
2983 if (qs->rspq.credits) {
2984 qs->rspq.credits--;
2985 refill_rspq(adap, &qs->rspq, 1);
2986 qs->rspq.restarted++;
2987 t3_write_reg(adap, A_SG_RSPQ_FL_STATUS,
2988 1 << qs->rspq.cntxt_id);
2989 }
2990 }
2991 }
2992
2993 if (qs->fl[0].credits < qs->fl[0].size)
2994 __refill_fl(adap, &qs->fl[0]);
2995 if (qs->fl[1].credits < qs->fl[1].size)
2996 __refill_fl(adap, &qs->fl[1]);
2997
2998unlock:
2999 spin_unlock_irq(lock);
3000out:
3001 mod_timer(&qs->rx_reclaim_timer, jiffies + RX_RECLAIM_PERIOD);
3002}
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012void t3_update_qset_coalesce(struct sge_qset *qs, const struct qset_params *p)
3013{
3014 qs->rspq.holdoff_tmr = max(p->coalesce_usecs * 10, 1U);
3015 qs->rspq.polling = p->polling;
3016 qs->napi.poll = p->polling ? napi_rx_handler : ofld_poll;
3017}
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035int t3_sge_alloc_qset(struct adapter *adapter, unsigned int id, int nports,
3036 int irq_vec_idx, const struct qset_params *p,
3037 int ntxq, struct net_device *dev,
3038 struct netdev_queue *netdevq)
3039{
3040 int i, avail, ret = -ENOMEM;
3041 struct sge_qset *q = &adapter->sge.qs[id];
3042
3043 init_qset_cntxt(q, id);
3044 timer_setup(&q->tx_reclaim_timer, sge_timer_tx, 0);
3045 timer_setup(&q->rx_reclaim_timer, sge_timer_rx, 0);
3046
3047 q->fl[0].desc = alloc_ring(adapter->pdev, p->fl_size,
3048 sizeof(struct rx_desc),
3049 sizeof(struct rx_sw_desc),
3050 &q->fl[0].phys_addr, &q->fl[0].sdesc);
3051 if (!q->fl[0].desc)
3052 goto err;
3053
3054 q->fl[1].desc = alloc_ring(adapter->pdev, p->jumbo_size,
3055 sizeof(struct rx_desc),
3056 sizeof(struct rx_sw_desc),
3057 &q->fl[1].phys_addr, &q->fl[1].sdesc);
3058 if (!q->fl[1].desc)
3059 goto err;
3060
3061 q->rspq.desc = alloc_ring(adapter->pdev, p->rspq_size,
3062 sizeof(struct rsp_desc), 0,
3063 &q->rspq.phys_addr, NULL);
3064 if (!q->rspq.desc)
3065 goto err;
3066
3067 for (i = 0; i < ntxq; ++i) {
3068
3069
3070
3071
3072 size_t sz = i == TXQ_CTRL ? 0 : sizeof(struct tx_sw_desc);
3073
3074 q->txq[i].desc = alloc_ring(adapter->pdev, p->txq_size[i],
3075 sizeof(struct tx_desc), sz,
3076 &q->txq[i].phys_addr,
3077 &q->txq[i].sdesc);
3078 if (!q->txq[i].desc)
3079 goto err;
3080
3081 q->txq[i].gen = 1;
3082 q->txq[i].size = p->txq_size[i];
3083 spin_lock_init(&q->txq[i].lock);
3084 skb_queue_head_init(&q->txq[i].sendq);
3085 }
3086
3087 tasklet_init(&q->txq[TXQ_OFLD].qresume_tsk, restart_offloadq,
3088 (unsigned long)q);
3089 tasklet_init(&q->txq[TXQ_CTRL].qresume_tsk, restart_ctrlq,
3090 (unsigned long)q);
3091
3092 q->fl[0].gen = q->fl[1].gen = 1;
3093 q->fl[0].size = p->fl_size;
3094 q->fl[1].size = p->jumbo_size;
3095
3096 q->rspq.gen = 1;
3097 q->rspq.size = p->rspq_size;
3098 spin_lock_init(&q->rspq.lock);
3099 skb_queue_head_init(&q->rspq.rx_queue);
3100
3101 q->txq[TXQ_ETH].stop_thres = nports *
3102 flits_to_desc(sgl_len(MAX_SKB_FRAGS + 1) + 3);
3103
3104#if FL0_PG_CHUNK_SIZE > 0
3105 q->fl[0].buf_size = FL0_PG_CHUNK_SIZE;
3106#else
3107 q->fl[0].buf_size = SGE_RX_SM_BUF_SIZE + sizeof(struct cpl_rx_data);
3108#endif
3109#if FL1_PG_CHUNK_SIZE > 0
3110 q->fl[1].buf_size = FL1_PG_CHUNK_SIZE;
3111#else
3112 q->fl[1].buf_size = is_offload(adapter) ?
3113 (16 * 1024) - SKB_DATA_ALIGN(sizeof(struct skb_shared_info)) :
3114 MAX_FRAME_SIZE + 2 + sizeof(struct cpl_rx_pkt);
3115#endif
3116
3117 q->fl[0].use_pages = FL0_PG_CHUNK_SIZE > 0;
3118 q->fl[1].use_pages = FL1_PG_CHUNK_SIZE > 0;
3119 q->fl[0].order = FL0_PG_ORDER;
3120 q->fl[1].order = FL1_PG_ORDER;
3121 q->fl[0].alloc_size = FL0_PG_ALLOC_SIZE;
3122 q->fl[1].alloc_size = FL1_PG_ALLOC_SIZE;
3123
3124 spin_lock_irq(&adapter->sge.reg_lock);
3125
3126
3127 ret = t3_sge_init_rspcntxt(adapter, q->rspq.cntxt_id, irq_vec_idx,
3128 q->rspq.phys_addr, q->rspq.size,
3129 q->fl[0].buf_size - SGE_PG_RSVD, 1, 0);
3130 if (ret)
3131 goto err_unlock;
3132
3133 for (i = 0; i < SGE_RXQ_PER_SET; ++i) {
3134 ret = t3_sge_init_flcntxt(adapter, q->fl[i].cntxt_id, 0,
3135 q->fl[i].phys_addr, q->fl[i].size,
3136 q->fl[i].buf_size - SGE_PG_RSVD,
3137 p->cong_thres, 1, 0);
3138 if (ret)
3139 goto err_unlock;
3140 }
3141
3142 ret = t3_sge_init_ecntxt(adapter, q->txq[TXQ_ETH].cntxt_id, USE_GTS,
3143 SGE_CNTXT_ETH, id, q->txq[TXQ_ETH].phys_addr,
3144 q->txq[TXQ_ETH].size, q->txq[TXQ_ETH].token,
3145 1, 0);
3146 if (ret)
3147 goto err_unlock;
3148
3149 if (ntxq > 1) {
3150 ret = t3_sge_init_ecntxt(adapter, q->txq[TXQ_OFLD].cntxt_id,
3151 USE_GTS, SGE_CNTXT_OFLD, id,
3152 q->txq[TXQ_OFLD].phys_addr,
3153 q->txq[TXQ_OFLD].size, 0, 1, 0);
3154 if (ret)
3155 goto err_unlock;
3156 }
3157
3158 if (ntxq > 2) {
3159 ret = t3_sge_init_ecntxt(adapter, q->txq[TXQ_CTRL].cntxt_id, 0,
3160 SGE_CNTXT_CTRL, id,
3161 q->txq[TXQ_CTRL].phys_addr,
3162 q->txq[TXQ_CTRL].size,
3163 q->txq[TXQ_CTRL].token, 1, 0);
3164 if (ret)
3165 goto err_unlock;
3166 }
3167
3168 spin_unlock_irq(&adapter->sge.reg_lock);
3169
3170 q->adap = adapter;
3171 q->netdev = dev;
3172 q->tx_q = netdevq;
3173 t3_update_qset_coalesce(q, p);
3174
3175 avail = refill_fl(adapter, &q->fl[0], q->fl[0].size,
3176 GFP_KERNEL | __GFP_COMP);
3177 if (!avail) {
3178 CH_ALERT(adapter, "free list queue 0 initialization failed\n");
3179 goto err;
3180 }
3181 if (avail < q->fl[0].size)
3182 CH_WARN(adapter, "free list queue 0 enabled with %d credits\n",
3183 avail);
3184
3185 avail = refill_fl(adapter, &q->fl[1], q->fl[1].size,
3186 GFP_KERNEL | __GFP_COMP);
3187 if (avail < q->fl[1].size)
3188 CH_WARN(adapter, "free list queue 1 enabled with %d credits\n",
3189 avail);
3190 refill_rspq(adapter, &q->rspq, q->rspq.size - 1);
3191
3192 t3_write_reg(adapter, A_SG_GTS, V_RSPQ(q->rspq.cntxt_id) |
3193 V_NEWTIMER(q->rspq.holdoff_tmr));
3194
3195 return 0;
3196
3197err_unlock:
3198 spin_unlock_irq(&adapter->sge.reg_lock);
3199err:
3200 t3_free_qset(adapter, q);
3201 return ret;
3202}
3203
3204
3205
3206
3207
3208
3209
3210void t3_start_sge_timers(struct adapter *adap)
3211{
3212 int i;
3213
3214 for (i = 0; i < SGE_QSETS; ++i) {
3215 struct sge_qset *q = &adap->sge.qs[i];
3216
3217 if (q->tx_reclaim_timer.function)
3218 mod_timer(&q->tx_reclaim_timer, jiffies + TX_RECLAIM_PERIOD);
3219
3220 if (q->rx_reclaim_timer.function)
3221 mod_timer(&q->rx_reclaim_timer, jiffies + RX_RECLAIM_PERIOD);
3222 }
3223}
3224
3225
3226
3227
3228
3229
3230
3231void t3_stop_sge_timers(struct adapter *adap)
3232{
3233 int i;
3234
3235 for (i = 0; i < SGE_QSETS; ++i) {
3236 struct sge_qset *q = &adap->sge.qs[i];
3237
3238 if (q->tx_reclaim_timer.function)
3239 del_timer_sync(&q->tx_reclaim_timer);
3240 if (q->rx_reclaim_timer.function)
3241 del_timer_sync(&q->rx_reclaim_timer);
3242 }
3243}
3244
3245
3246
3247
3248
3249
3250
3251void t3_free_sge_resources(struct adapter *adap)
3252{
3253 int i;
3254
3255 for (i = 0; i < SGE_QSETS; ++i)
3256 t3_free_qset(adap, &adap->sge.qs[i]);
3257}
3258
3259
3260
3261
3262
3263
3264
3265
3266void t3_sge_start(struct adapter *adap)
3267{
3268 t3_set_reg_field(adap, A_SG_CONTROL, F_GLOBALENABLE, F_GLOBALENABLE);
3269}
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284void t3_sge_stop(struct adapter *adap)
3285{
3286 t3_set_reg_field(adap, A_SG_CONTROL, F_GLOBALENABLE, 0);
3287 if (!in_interrupt()) {
3288 int i;
3289
3290 for (i = 0; i < SGE_QSETS; ++i) {
3291 struct sge_qset *qs = &adap->sge.qs[i];
3292
3293 tasklet_kill(&qs->txq[TXQ_OFLD].qresume_tsk);
3294 tasklet_kill(&qs->txq[TXQ_CTRL].qresume_tsk);
3295 }
3296 }
3297}
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309void t3_sge_init(struct adapter *adap, struct sge_params *p)
3310{
3311 unsigned int ctrl, ups = ffs(pci_resource_len(adap->pdev, 2) >> 12);
3312
3313 ctrl = F_DROPPKT | V_PKTSHIFT(2) | F_FLMODE | F_AVOIDCQOVFL |
3314 F_CQCRDTCTRL | F_CONGMODE | F_TNLFLMODE | F_FATLPERREN |
3315 V_HOSTPAGESIZE(PAGE_SHIFT - 11) | F_BIGENDIANINGRESS |
3316 V_USERSPACESIZE(ups ? ups - 1 : 0) | F_ISCSICOALESCING;
3317#if SGE_NUM_GENBITS == 1
3318 ctrl |= F_EGRGENCTRL;
3319#endif
3320 if (adap->params.rev > 0) {
3321 if (!(adap->flags & (USING_MSIX | USING_MSI)))
3322 ctrl |= F_ONEINTMULTQ | F_OPTONEINTMULTQ;
3323 }
3324 t3_write_reg(adap, A_SG_CONTROL, ctrl);
3325 t3_write_reg(adap, A_SG_EGR_RCQ_DRB_THRSH, V_HIRCQDRBTHRSH(512) |
3326 V_LORCQDRBTHRSH(512));
3327 t3_write_reg(adap, A_SG_TIMER_TICK, core_ticks_per_usec(adap) / 10);
3328 t3_write_reg(adap, A_SG_CMDQ_CREDIT_TH, V_THRESHOLD(32) |
3329 V_TIMEOUT(200 * core_ticks_per_usec(adap)));
3330 t3_write_reg(adap, A_SG_HI_DRB_HI_THRSH,
3331 adap->params.rev < T3_REV_C ? 1000 : 500);
3332 t3_write_reg(adap, A_SG_HI_DRB_LO_THRSH, 256);
3333 t3_write_reg(adap, A_SG_LO_DRB_HI_THRSH, 1000);
3334 t3_write_reg(adap, A_SG_LO_DRB_LO_THRSH, 256);
3335 t3_write_reg(adap, A_SG_OCO_BASE, V_BASE1(0xfff));
3336 t3_write_reg(adap, A_SG_DRB_PRI_THRESH, 63 * 1024);
3337}
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348void t3_sge_prep(struct adapter *adap, struct sge_params *p)
3349{
3350 int i;
3351
3352 p->max_pkt_size = (16 * 1024) - sizeof(struct cpl_rx_data) -
3353 SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
3354
3355 for (i = 0; i < SGE_QSETS; ++i) {
3356 struct qset_params *q = p->qset + i;
3357
3358 q->polling = adap->params.rev > 0;
3359 q->coalesce_usecs = 5;
3360 q->rspq_size = 1024;
3361 q->fl_size = 1024;
3362 q->jumbo_size = 512;
3363 q->txq_size[TXQ_ETH] = 1024;
3364 q->txq_size[TXQ_OFLD] = 1024;
3365 q->txq_size[TXQ_CTRL] = 256;
3366 q->cong_thres = 0;
3367 }
3368
3369 spin_lock_init(&adap->sge.reg_lock);
3370}
3371