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/netdevice.h>
33#include <linux/etherdevice.h>
34#include <linux/skbuff.h>
35#include <net/udp_tunnel.h>
36#include <linux/ip.h>
37#include <net/ipv6.h>
38#include <net/tcp.h>
39#include <linux/if_ether.h>
40#include <linux/if_vlan.h>
41#include <net/ip6_checksum.h>
42#include "qede_ptp.h"
43
44#include <linux/qed/qed_if.h>
45#include "qede.h"
46
47
48
49
50int qede_alloc_rx_buffer(struct qede_rx_queue *rxq, bool allow_lazy)
51{
52 struct sw_rx_data *sw_rx_data;
53 struct eth_rx_bd *rx_bd;
54 dma_addr_t mapping;
55 struct page *data;
56
57
58
59
60
61 if (allow_lazy && likely(rxq->filled_buffers > 12)) {
62 rxq->filled_buffers--;
63 return 0;
64 }
65
66 data = alloc_pages(GFP_ATOMIC, 0);
67 if (unlikely(!data))
68 return -ENOMEM;
69
70
71
72
73 mapping = dma_map_page(rxq->dev, data, 0,
74 PAGE_SIZE, DMA_FROM_DEVICE);
75 if (unlikely(dma_mapping_error(rxq->dev, mapping))) {
76 __free_page(data);
77 return -ENOMEM;
78 }
79
80 sw_rx_data = &rxq->sw_rx_ring[rxq->sw_rx_prod & NUM_RX_BDS_MAX];
81 sw_rx_data->page_offset = 0;
82 sw_rx_data->data = data;
83 sw_rx_data->mapping = mapping;
84
85
86 rx_bd = (struct eth_rx_bd *)qed_chain_produce(&rxq->rx_bd_ring);
87 WARN_ON(!rx_bd);
88 rx_bd->addr.hi = cpu_to_le32(upper_32_bits(mapping));
89 rx_bd->addr.lo = cpu_to_le32(lower_32_bits(mapping) +
90 rxq->rx_headroom);
91
92 rxq->sw_rx_prod++;
93 rxq->filled_buffers++;
94
95 return 0;
96}
97
98
99int qede_free_tx_pkt(struct qede_dev *edev, struct qede_tx_queue *txq, int *len)
100{
101 u16 idx = txq->sw_tx_cons;
102 struct sk_buff *skb = txq->sw_tx_ring[idx].skb;
103 struct eth_tx_1st_bd *first_bd;
104 struct eth_tx_bd *tx_data_bd;
105 int bds_consumed = 0;
106 int nbds;
107 bool data_split = txq->sw_tx_ring[idx].flags & QEDE_TSO_SPLIT_BD;
108 int i, split_bd_len = 0;
109
110 if (unlikely(!skb)) {
111 DP_ERR(edev,
112 "skb is null for txq idx=%d txq->sw_tx_cons=%d txq->sw_tx_prod=%d\n",
113 idx, txq->sw_tx_cons, txq->sw_tx_prod);
114 return -1;
115 }
116
117 *len = skb->len;
118
119 first_bd = (struct eth_tx_1st_bd *)qed_chain_consume(&txq->tx_pbl);
120
121 bds_consumed++;
122
123 nbds = first_bd->data.nbds;
124
125 if (data_split) {
126 struct eth_tx_bd *split = (struct eth_tx_bd *)
127 qed_chain_consume(&txq->tx_pbl);
128 split_bd_len = BD_UNMAP_LEN(split);
129 bds_consumed++;
130 }
131 dma_unmap_single(&edev->pdev->dev, BD_UNMAP_ADDR(first_bd),
132 BD_UNMAP_LEN(first_bd) + split_bd_len, DMA_TO_DEVICE);
133
134
135 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++, bds_consumed++) {
136 tx_data_bd = (struct eth_tx_bd *)
137 qed_chain_consume(&txq->tx_pbl);
138 dma_unmap_page(&edev->pdev->dev, BD_UNMAP_ADDR(tx_data_bd),
139 BD_UNMAP_LEN(tx_data_bd), DMA_TO_DEVICE);
140 }
141
142 while (bds_consumed++ < nbds)
143 qed_chain_consume(&txq->tx_pbl);
144
145
146 dev_kfree_skb_any(skb);
147 txq->sw_tx_ring[idx].skb = NULL;
148 txq->sw_tx_ring[idx].flags = 0;
149
150 return 0;
151}
152
153
154static void qede_free_failed_tx_pkt(struct qede_tx_queue *txq,
155 struct eth_tx_1st_bd *first_bd,
156 int nbd, bool data_split)
157{
158 u16 idx = txq->sw_tx_prod;
159 struct sk_buff *skb = txq->sw_tx_ring[idx].skb;
160 struct eth_tx_bd *tx_data_bd;
161 int i, split_bd_len = 0;
162
163
164 qed_chain_set_prod(&txq->tx_pbl,
165 le16_to_cpu(txq->tx_db.data.bd_prod), first_bd);
166
167 first_bd = (struct eth_tx_1st_bd *)qed_chain_produce(&txq->tx_pbl);
168
169 if (data_split) {
170 struct eth_tx_bd *split = (struct eth_tx_bd *)
171 qed_chain_produce(&txq->tx_pbl);
172 split_bd_len = BD_UNMAP_LEN(split);
173 nbd--;
174 }
175
176 dma_unmap_single(txq->dev, BD_UNMAP_ADDR(first_bd),
177 BD_UNMAP_LEN(first_bd) + split_bd_len, DMA_TO_DEVICE);
178
179
180 for (i = 0; i < nbd; i++) {
181 tx_data_bd = (struct eth_tx_bd *)
182 qed_chain_produce(&txq->tx_pbl);
183 if (tx_data_bd->nbytes)
184 dma_unmap_page(txq->dev,
185 BD_UNMAP_ADDR(tx_data_bd),
186 BD_UNMAP_LEN(tx_data_bd), DMA_TO_DEVICE);
187 }
188
189
190 qed_chain_set_prod(&txq->tx_pbl,
191 le16_to_cpu(txq->tx_db.data.bd_prod), first_bd);
192
193
194 dev_kfree_skb_any(skb);
195 txq->sw_tx_ring[idx].skb = NULL;
196 txq->sw_tx_ring[idx].flags = 0;
197}
198
199static u32 qede_xmit_type(struct sk_buff *skb, int *ipv6_ext)
200{
201 u32 rc = XMIT_L4_CSUM;
202 __be16 l3_proto;
203
204 if (skb->ip_summed != CHECKSUM_PARTIAL)
205 return XMIT_PLAIN;
206
207 l3_proto = vlan_get_protocol(skb);
208 if (l3_proto == htons(ETH_P_IPV6) &&
209 (ipv6_hdr(skb)->nexthdr == NEXTHDR_IPV6))
210 *ipv6_ext = 1;
211
212 if (skb->encapsulation) {
213 rc |= XMIT_ENC;
214 if (skb_is_gso(skb)) {
215 unsigned short gso_type = skb_shinfo(skb)->gso_type;
216
217 if ((gso_type & SKB_GSO_UDP_TUNNEL_CSUM) ||
218 (gso_type & SKB_GSO_GRE_CSUM))
219 rc |= XMIT_ENC_GSO_L4_CSUM;
220
221 rc |= XMIT_LSO;
222 return rc;
223 }
224 }
225
226 if (skb_is_gso(skb))
227 rc |= XMIT_LSO;
228
229 return rc;
230}
231
232static void qede_set_params_for_ipv6_ext(struct sk_buff *skb,
233 struct eth_tx_2nd_bd *second_bd,
234 struct eth_tx_3rd_bd *third_bd)
235{
236 u8 l4_proto;
237 u16 bd2_bits1 = 0, bd2_bits2 = 0;
238
239 bd2_bits1 |= (1 << ETH_TX_DATA_2ND_BD_IPV6_EXT_SHIFT);
240
241 bd2_bits2 |= ((((u8 *)skb_transport_header(skb) - skb->data) >> 1) &
242 ETH_TX_DATA_2ND_BD_L4_HDR_START_OFFSET_W_MASK)
243 << ETH_TX_DATA_2ND_BD_L4_HDR_START_OFFSET_W_SHIFT;
244
245 bd2_bits1 |= (ETH_L4_PSEUDO_CSUM_CORRECT_LENGTH <<
246 ETH_TX_DATA_2ND_BD_L4_PSEUDO_CSUM_MODE_SHIFT);
247
248 if (vlan_get_protocol(skb) == htons(ETH_P_IPV6))
249 l4_proto = ipv6_hdr(skb)->nexthdr;
250 else
251 l4_proto = ip_hdr(skb)->protocol;
252
253 if (l4_proto == IPPROTO_UDP)
254 bd2_bits1 |= 1 << ETH_TX_DATA_2ND_BD_L4_UDP_SHIFT;
255
256 if (third_bd)
257 third_bd->data.bitfields |=
258 cpu_to_le16(((tcp_hdrlen(skb) / 4) &
259 ETH_TX_DATA_3RD_BD_TCP_HDR_LEN_DW_MASK) <<
260 ETH_TX_DATA_3RD_BD_TCP_HDR_LEN_DW_SHIFT);
261
262 second_bd->data.bitfields1 = cpu_to_le16(bd2_bits1);
263 second_bd->data.bitfields2 = cpu_to_le16(bd2_bits2);
264}
265
266static int map_frag_to_bd(struct qede_tx_queue *txq,
267 skb_frag_t *frag, struct eth_tx_bd *bd)
268{
269 dma_addr_t mapping;
270
271
272 mapping = skb_frag_dma_map(txq->dev, frag, 0,
273 skb_frag_size(frag), DMA_TO_DEVICE);
274 if (unlikely(dma_mapping_error(txq->dev, mapping)))
275 return -ENOMEM;
276
277
278 BD_SET_UNMAP_ADDR_LEN(bd, mapping, skb_frag_size(frag));
279
280 return 0;
281}
282
283static u16 qede_get_skb_hlen(struct sk_buff *skb, bool is_encap_pkt)
284{
285 if (is_encap_pkt)
286 return (skb_inner_transport_header(skb) +
287 inner_tcp_hdrlen(skb) - skb->data);
288 else
289 return (skb_transport_header(skb) +
290 tcp_hdrlen(skb) - skb->data);
291}
292
293
294#if ((MAX_SKB_FRAGS + 2) > ETH_TX_MAX_BDS_PER_NON_LSO_PACKET)
295static bool qede_pkt_req_lin(struct sk_buff *skb, u8 xmit_type)
296{
297 int allowed_frags = ETH_TX_MAX_BDS_PER_NON_LSO_PACKET - 1;
298
299 if (xmit_type & XMIT_LSO) {
300 int hlen;
301
302 hlen = qede_get_skb_hlen(skb, xmit_type & XMIT_ENC);
303
304
305 if (skb_headlen(skb) > hlen)
306 allowed_frags--;
307 }
308
309 return (skb_shinfo(skb)->nr_frags > allowed_frags);
310}
311#endif
312
313static inline void qede_update_tx_producer(struct qede_tx_queue *txq)
314{
315
316
317
318 wmb();
319 barrier();
320 writel(txq->tx_db.raw, txq->doorbell_addr);
321
322
323
324
325
326 wmb();
327}
328
329int qede_txq_has_work(struct qede_tx_queue *txq)
330{
331 u16 hw_bd_cons;
332
333
334 barrier();
335 hw_bd_cons = le16_to_cpu(*txq->hw_cons_ptr);
336 if (qed_chain_get_cons_idx(&txq->tx_pbl) == hw_bd_cons + 1)
337 return 0;
338
339 return hw_bd_cons != qed_chain_get_cons_idx(&txq->tx_pbl);
340}
341
342static int qede_tx_int(struct qede_dev *edev, struct qede_tx_queue *txq)
343{
344 struct netdev_queue *netdev_txq;
345 u16 hw_bd_cons;
346 unsigned int pkts_compl = 0, bytes_compl = 0;
347 int rc;
348
349 netdev_txq = netdev_get_tx_queue(edev->ndev, txq->index);
350
351 hw_bd_cons = le16_to_cpu(*txq->hw_cons_ptr);
352 barrier();
353
354 while (hw_bd_cons != qed_chain_get_cons_idx(&txq->tx_pbl)) {
355 int len = 0;
356
357 rc = qede_free_tx_pkt(edev, txq, &len);
358 if (rc) {
359 DP_NOTICE(edev, "hw_bd_cons = %d, chain_cons=%d\n",
360 hw_bd_cons,
361 qed_chain_get_cons_idx(&txq->tx_pbl));
362 break;
363 }
364
365 bytes_compl += len;
366 pkts_compl++;
367 txq->sw_tx_cons = (txq->sw_tx_cons + 1) % txq->num_tx_buffers;
368 txq->xmit_pkts++;
369 }
370
371 netdev_tx_completed_queue(netdev_txq, pkts_compl, bytes_compl);
372
373
374
375
376
377
378
379
380
381
382 smp_mb();
383
384 if (unlikely(netif_tx_queue_stopped(netdev_txq))) {
385
386
387
388
389
390
391
392
393
394
395 __netif_tx_lock(netdev_txq, smp_processor_id());
396
397 if ((netif_tx_queue_stopped(netdev_txq)) &&
398 (edev->state == QEDE_STATE_OPEN) &&
399 (qed_chain_get_elem_left(&txq->tx_pbl)
400 >= (MAX_SKB_FRAGS + 1))) {
401 netif_tx_wake_queue(netdev_txq);
402 DP_VERBOSE(edev, NETIF_MSG_TX_DONE,
403 "Wake queue was called\n");
404 }
405
406 __netif_tx_unlock(netdev_txq);
407 }
408
409 return 0;
410}
411
412bool qede_has_rx_work(struct qede_rx_queue *rxq)
413{
414 u16 hw_comp_cons, sw_comp_cons;
415
416
417 barrier();
418
419 hw_comp_cons = le16_to_cpu(*rxq->hw_cons_ptr);
420 sw_comp_cons = qed_chain_get_cons_idx(&rxq->rx_comp_ring);
421
422 return hw_comp_cons != sw_comp_cons;
423}
424
425static inline void qede_rx_bd_ring_consume(struct qede_rx_queue *rxq)
426{
427 qed_chain_consume(&rxq->rx_bd_ring);
428 rxq->sw_rx_cons++;
429}
430
431
432
433
434static inline void qede_reuse_page(struct qede_rx_queue *rxq,
435 struct sw_rx_data *curr_cons)
436{
437 struct eth_rx_bd *rx_bd_prod = qed_chain_produce(&rxq->rx_bd_ring);
438 struct sw_rx_data *curr_prod;
439 dma_addr_t new_mapping;
440
441 curr_prod = &rxq->sw_rx_ring[rxq->sw_rx_prod & NUM_RX_BDS_MAX];
442 *curr_prod = *curr_cons;
443
444 new_mapping = curr_prod->mapping + curr_prod->page_offset;
445
446 rx_bd_prod->addr.hi = cpu_to_le32(upper_32_bits(new_mapping));
447 rx_bd_prod->addr.lo = cpu_to_le32(lower_32_bits(new_mapping) +
448 rxq->rx_headroom);
449
450 rxq->sw_rx_prod++;
451 curr_cons->data = NULL;
452}
453
454
455
456
457void qede_recycle_rx_bd_ring(struct qede_rx_queue *rxq, u8 count)
458{
459 struct sw_rx_data *curr_cons;
460
461 for (; count > 0; count--) {
462 curr_cons = &rxq->sw_rx_ring[rxq->sw_rx_cons & NUM_RX_BDS_MAX];
463 qede_reuse_page(rxq, curr_cons);
464 qede_rx_bd_ring_consume(rxq);
465 }
466}
467
468static inline int qede_realloc_rx_buffer(struct qede_rx_queue *rxq,
469 struct sw_rx_data *curr_cons)
470{
471
472 curr_cons->page_offset += rxq->rx_buf_seg_size;
473
474 if (curr_cons->page_offset == PAGE_SIZE) {
475 if (unlikely(qede_alloc_rx_buffer(rxq, true))) {
476
477
478
479 curr_cons->page_offset -= rxq->rx_buf_seg_size;
480
481 return -ENOMEM;
482 }
483
484 dma_unmap_page(rxq->dev, curr_cons->mapping,
485 PAGE_SIZE, DMA_FROM_DEVICE);
486 } else {
487
488
489
490
491 page_ref_inc(curr_cons->data);
492 qede_reuse_page(rxq, curr_cons);
493 }
494
495 return 0;
496}
497
498void qede_update_rx_prod(struct qede_dev *edev, struct qede_rx_queue *rxq)
499{
500 u16 bd_prod = qed_chain_get_prod_idx(&rxq->rx_bd_ring);
501 u16 cqe_prod = qed_chain_get_prod_idx(&rxq->rx_comp_ring);
502 struct eth_rx_prod_data rx_prods = {0};
503
504
505 rx_prods.bd_prod = cpu_to_le16(bd_prod);
506 rx_prods.cqe_prod = cpu_to_le16(cqe_prod);
507
508
509
510
511
512 wmb();
513
514 internal_ram_wr(rxq->hw_rxq_prod_addr, sizeof(rx_prods),
515 (u32 *)&rx_prods);
516
517
518
519
520
521
522
523 mmiowb();
524}
525
526static void qede_get_rxhash(struct sk_buff *skb, u8 bitfields, __le32 rss_hash)
527{
528 enum pkt_hash_types hash_type = PKT_HASH_TYPE_NONE;
529 enum rss_hash_type htype;
530 u32 hash = 0;
531
532 htype = GET_FIELD(bitfields, ETH_FAST_PATH_RX_REG_CQE_RSS_HASH_TYPE);
533 if (htype) {
534 hash_type = ((htype == RSS_HASH_TYPE_IPV4) ||
535 (htype == RSS_HASH_TYPE_IPV6)) ?
536 PKT_HASH_TYPE_L3 : PKT_HASH_TYPE_L4;
537 hash = le32_to_cpu(rss_hash);
538 }
539 skb_set_hash(skb, hash, hash_type);
540}
541
542static void qede_set_skb_csum(struct sk_buff *skb, u8 csum_flag)
543{
544 skb_checksum_none_assert(skb);
545
546 if (csum_flag & QEDE_CSUM_UNNECESSARY)
547 skb->ip_summed = CHECKSUM_UNNECESSARY;
548
549 if (csum_flag & QEDE_TUNN_CSUM_UNNECESSARY) {
550 skb->csum_level = 1;
551 skb->encapsulation = 1;
552 }
553}
554
555static inline void qede_skb_receive(struct qede_dev *edev,
556 struct qede_fastpath *fp,
557 struct qede_rx_queue *rxq,
558 struct sk_buff *skb, u16 vlan_tag)
559{
560 if (vlan_tag)
561 __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), vlan_tag);
562
563 napi_gro_receive(&fp->napi, skb);
564}
565
566static void qede_set_gro_params(struct qede_dev *edev,
567 struct sk_buff *skb,
568 struct eth_fast_path_rx_tpa_start_cqe *cqe)
569{
570 u16 parsing_flags = le16_to_cpu(cqe->pars_flags.flags);
571
572 if (((parsing_flags >> PARSING_AND_ERR_FLAGS_L3TYPE_SHIFT) &
573 PARSING_AND_ERR_FLAGS_L3TYPE_MASK) == 2)
574 skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6;
575 else
576 skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
577
578 skb_shinfo(skb)->gso_size = __le16_to_cpu(cqe->len_on_first_bd) -
579 cqe->header_len;
580}
581
582static int qede_fill_frag_skb(struct qede_dev *edev,
583 struct qede_rx_queue *rxq,
584 u8 tpa_agg_index, u16 len_on_bd)
585{
586 struct sw_rx_data *current_bd = &rxq->sw_rx_ring[rxq->sw_rx_cons &
587 NUM_RX_BDS_MAX];
588 struct qede_agg_info *tpa_info = &rxq->tpa_info[tpa_agg_index];
589 struct sk_buff *skb = tpa_info->skb;
590
591 if (unlikely(tpa_info->state != QEDE_AGG_STATE_START))
592 goto out;
593
594
595 skb_fill_page_desc(skb, tpa_info->frag_id++,
596 current_bd->data, current_bd->page_offset,
597 len_on_bd);
598
599 if (unlikely(qede_realloc_rx_buffer(rxq, current_bd))) {
600
601
602
603 page_ref_inc(current_bd->data);
604 goto out;
605 }
606
607 qed_chain_consume(&rxq->rx_bd_ring);
608 rxq->sw_rx_cons++;
609
610 skb->data_len += len_on_bd;
611 skb->truesize += rxq->rx_buf_seg_size;
612 skb->len += len_on_bd;
613
614 return 0;
615
616out:
617 tpa_info->state = QEDE_AGG_STATE_ERROR;
618 qede_recycle_rx_bd_ring(rxq, 1);
619
620 return -ENOMEM;
621}
622
623static bool qede_tunn_exist(u16 flag)
624{
625 return !!(flag & (PARSING_AND_ERR_FLAGS_TUNNELEXIST_MASK <<
626 PARSING_AND_ERR_FLAGS_TUNNELEXIST_SHIFT));
627}
628
629static u8 qede_check_tunn_csum(u16 flag)
630{
631 u16 csum_flag = 0;
632 u8 tcsum = 0;
633
634 if (flag & (PARSING_AND_ERR_FLAGS_TUNNELL4CHKSMWASCALCULATED_MASK <<
635 PARSING_AND_ERR_FLAGS_TUNNELL4CHKSMWASCALCULATED_SHIFT))
636 csum_flag |= PARSING_AND_ERR_FLAGS_TUNNELL4CHKSMERROR_MASK <<
637 PARSING_AND_ERR_FLAGS_TUNNELL4CHKSMERROR_SHIFT;
638
639 if (flag & (PARSING_AND_ERR_FLAGS_L4CHKSMWASCALCULATED_MASK <<
640 PARSING_AND_ERR_FLAGS_L4CHKSMWASCALCULATED_SHIFT)) {
641 csum_flag |= PARSING_AND_ERR_FLAGS_L4CHKSMERROR_MASK <<
642 PARSING_AND_ERR_FLAGS_L4CHKSMERROR_SHIFT;
643 tcsum = QEDE_TUNN_CSUM_UNNECESSARY;
644 }
645
646 csum_flag |= PARSING_AND_ERR_FLAGS_TUNNELIPHDRERROR_MASK <<
647 PARSING_AND_ERR_FLAGS_TUNNELIPHDRERROR_SHIFT |
648 PARSING_AND_ERR_FLAGS_IPHDRERROR_MASK <<
649 PARSING_AND_ERR_FLAGS_IPHDRERROR_SHIFT;
650
651 if (csum_flag & flag)
652 return QEDE_CSUM_ERROR;
653
654 return QEDE_CSUM_UNNECESSARY | tcsum;
655}
656
657static void qede_tpa_start(struct qede_dev *edev,
658 struct qede_rx_queue *rxq,
659 struct eth_fast_path_rx_tpa_start_cqe *cqe)
660{
661 struct qede_agg_info *tpa_info = &rxq->tpa_info[cqe->tpa_agg_index];
662 struct eth_rx_bd *rx_bd_cons = qed_chain_consume(&rxq->rx_bd_ring);
663 struct eth_rx_bd *rx_bd_prod = qed_chain_produce(&rxq->rx_bd_ring);
664 struct sw_rx_data *replace_buf = &tpa_info->buffer;
665 dma_addr_t mapping = tpa_info->buffer_mapping;
666 struct sw_rx_data *sw_rx_data_cons;
667 struct sw_rx_data *sw_rx_data_prod;
668
669 sw_rx_data_cons = &rxq->sw_rx_ring[rxq->sw_rx_cons & NUM_RX_BDS_MAX];
670 sw_rx_data_prod = &rxq->sw_rx_ring[rxq->sw_rx_prod & NUM_RX_BDS_MAX];
671
672
673
674
675
676 sw_rx_data_prod->mapping = replace_buf->mapping;
677
678 sw_rx_data_prod->data = replace_buf->data;
679 rx_bd_prod->addr.hi = cpu_to_le32(upper_32_bits(mapping));
680 rx_bd_prod->addr.lo = cpu_to_le32(lower_32_bits(mapping));
681 sw_rx_data_prod->page_offset = replace_buf->page_offset;
682
683 rxq->sw_rx_prod++;
684
685
686
687
688 tpa_info->buffer = *sw_rx_data_cons;
689 mapping = HILO_U64(le32_to_cpu(rx_bd_cons->addr.hi),
690 le32_to_cpu(rx_bd_cons->addr.lo));
691
692 tpa_info->buffer_mapping = mapping;
693 rxq->sw_rx_cons++;
694
695
696
697
698
699 tpa_info->skb = netdev_alloc_skb(edev->ndev,
700 le16_to_cpu(cqe->len_on_first_bd));
701 if (unlikely(!tpa_info->skb)) {
702 DP_NOTICE(edev, "Failed to allocate SKB for gro\n");
703 tpa_info->state = QEDE_AGG_STATE_ERROR;
704 goto cons_buf;
705 }
706
707
708 skb_put(tpa_info->skb, le16_to_cpu(cqe->len_on_first_bd));
709 tpa_info->frag_id = 0;
710 tpa_info->state = QEDE_AGG_STATE_START;
711
712
713 tpa_info->start_cqe_placement_offset = cqe->placement_offset;
714 tpa_info->start_cqe_bd_len = le16_to_cpu(cqe->len_on_first_bd);
715 if ((le16_to_cpu(cqe->pars_flags.flags) >>
716 PARSING_AND_ERR_FLAGS_TAG8021QEXIST_SHIFT) &
717 PARSING_AND_ERR_FLAGS_TAG8021QEXIST_MASK)
718 tpa_info->vlan_tag = le16_to_cpu(cqe->vlan_tag);
719 else
720 tpa_info->vlan_tag = 0;
721
722 qede_get_rxhash(tpa_info->skb, cqe->bitfields, cqe->rss_hash);
723
724
725 qede_set_gro_params(edev, tpa_info->skb, cqe);
726
727cons_buf:
728 if (likely(cqe->ext_bd_len_list[0]))
729 qede_fill_frag_skb(edev, rxq, cqe->tpa_agg_index,
730 le16_to_cpu(cqe->ext_bd_len_list[0]));
731
732 if (unlikely(cqe->ext_bd_len_list[1])) {
733 DP_ERR(edev,
734 "Unlikely - got a TPA aggregation with more than one ext_bd_len_list entry in the TPA start\n");
735 tpa_info->state = QEDE_AGG_STATE_ERROR;
736 }
737}
738
739#ifdef CONFIG_INET
740static void qede_gro_ip_csum(struct sk_buff *skb)
741{
742 const struct iphdr *iph = ip_hdr(skb);
743 struct tcphdr *th;
744
745 skb_set_transport_header(skb, sizeof(struct iphdr));
746 th = tcp_hdr(skb);
747
748 th->check = ~tcp_v4_check(skb->len - skb_transport_offset(skb),
749 iph->saddr, iph->daddr, 0);
750
751 tcp_gro_complete(skb);
752}
753
754static void qede_gro_ipv6_csum(struct sk_buff *skb)
755{
756 struct ipv6hdr *iph = ipv6_hdr(skb);
757 struct tcphdr *th;
758
759 skb_set_transport_header(skb, sizeof(struct ipv6hdr));
760 th = tcp_hdr(skb);
761
762 th->check = ~tcp_v6_check(skb->len - skb_transport_offset(skb),
763 &iph->saddr, &iph->daddr, 0);
764 tcp_gro_complete(skb);
765}
766#endif
767
768static void qede_gro_receive(struct qede_dev *edev,
769 struct qede_fastpath *fp,
770 struct sk_buff *skb,
771 u16 vlan_tag)
772{
773
774
775
776
777
778 if (unlikely(!skb->data_len)) {
779 skb_shinfo(skb)->gso_type = 0;
780 skb_shinfo(skb)->gso_size = 0;
781 goto send_skb;
782 }
783
784#ifdef CONFIG_INET
785 if (skb_shinfo(skb)->gso_size) {
786 skb_reset_network_header(skb);
787
788 switch (skb->protocol) {
789 case htons(ETH_P_IP):
790 qede_gro_ip_csum(skb);
791 break;
792 case htons(ETH_P_IPV6):
793 qede_gro_ipv6_csum(skb);
794 break;
795 default:
796 DP_ERR(edev,
797 "Error: FW GRO supports only IPv4/IPv6, not 0x%04x\n",
798 ntohs(skb->protocol));
799 }
800 }
801#endif
802
803send_skb:
804 skb_record_rx_queue(skb, fp->rxq->rxq_id);
805 qede_skb_receive(edev, fp, fp->rxq, skb, vlan_tag);
806}
807
808static inline void qede_tpa_cont(struct qede_dev *edev,
809 struct qede_rx_queue *rxq,
810 struct eth_fast_path_rx_tpa_cont_cqe *cqe)
811{
812 int i;
813
814 for (i = 0; cqe->len_list[i]; i++)
815 qede_fill_frag_skb(edev, rxq, cqe->tpa_agg_index,
816 le16_to_cpu(cqe->len_list[i]));
817
818 if (unlikely(i > 1))
819 DP_ERR(edev,
820 "Strange - TPA cont with more than a single len_list entry\n");
821}
822
823static int qede_tpa_end(struct qede_dev *edev,
824 struct qede_fastpath *fp,
825 struct eth_fast_path_rx_tpa_end_cqe *cqe)
826{
827 struct qede_rx_queue *rxq = fp->rxq;
828 struct qede_agg_info *tpa_info;
829 struct sk_buff *skb;
830 int i;
831
832 tpa_info = &rxq->tpa_info[cqe->tpa_agg_index];
833 skb = tpa_info->skb;
834
835 for (i = 0; cqe->len_list[i]; i++)
836 qede_fill_frag_skb(edev, rxq, cqe->tpa_agg_index,
837 le16_to_cpu(cqe->len_list[i]));
838 if (unlikely(i > 1))
839 DP_ERR(edev,
840 "Strange - TPA emd with more than a single len_list entry\n");
841
842 if (unlikely(tpa_info->state != QEDE_AGG_STATE_START))
843 goto err;
844
845
846 if (unlikely(cqe->num_of_bds != tpa_info->frag_id + 1))
847 DP_ERR(edev,
848 "Strange - TPA had %02x BDs, but SKB has only %d frags\n",
849 cqe->num_of_bds, tpa_info->frag_id);
850 if (unlikely(skb->len != le16_to_cpu(cqe->total_packet_len)))
851 DP_ERR(edev,
852 "Strange - total packet len [cqe] is %4x but SKB has len %04x\n",
853 le16_to_cpu(cqe->total_packet_len), skb->len);
854
855 memcpy(skb->data,
856 page_address(tpa_info->buffer.data) +
857 tpa_info->start_cqe_placement_offset +
858 tpa_info->buffer.page_offset, tpa_info->start_cqe_bd_len);
859
860
861 skb->protocol = eth_type_trans(skb, edev->ndev);
862 skb->ip_summed = CHECKSUM_UNNECESSARY;
863
864
865
866
867 NAPI_GRO_CB(skb)->count = le16_to_cpu(cqe->num_of_coalesced_segs);
868
869 qede_gro_receive(edev, fp, skb, tpa_info->vlan_tag);
870
871 tpa_info->state = QEDE_AGG_STATE_NONE;
872
873 return 1;
874err:
875 tpa_info->state = QEDE_AGG_STATE_NONE;
876 dev_kfree_skb_any(tpa_info->skb);
877 tpa_info->skb = NULL;
878 return 0;
879}
880
881static u8 qede_check_notunn_csum(u16 flag)
882{
883 u16 csum_flag = 0;
884 u8 csum = 0;
885
886 if (flag & (PARSING_AND_ERR_FLAGS_L4CHKSMWASCALCULATED_MASK <<
887 PARSING_AND_ERR_FLAGS_L4CHKSMWASCALCULATED_SHIFT)) {
888 csum_flag |= PARSING_AND_ERR_FLAGS_L4CHKSMERROR_MASK <<
889 PARSING_AND_ERR_FLAGS_L4CHKSMERROR_SHIFT;
890 csum = QEDE_CSUM_UNNECESSARY;
891 }
892
893 csum_flag |= PARSING_AND_ERR_FLAGS_IPHDRERROR_MASK <<
894 PARSING_AND_ERR_FLAGS_IPHDRERROR_SHIFT;
895
896 if (csum_flag & flag)
897 return QEDE_CSUM_ERROR;
898
899 return csum;
900}
901
902static u8 qede_check_csum(u16 flag)
903{
904 if (!qede_tunn_exist(flag))
905 return qede_check_notunn_csum(flag);
906 else
907 return qede_check_tunn_csum(flag);
908}
909
910static bool qede_pkt_is_ip_fragmented(struct eth_fast_path_rx_reg_cqe *cqe,
911 u16 flag)
912{
913 u8 tun_pars_flg = cqe->tunnel_pars_flags.flags;
914
915 if ((tun_pars_flg & (ETH_TUNNEL_PARSING_FLAGS_IPV4_FRAGMENT_MASK <<
916 ETH_TUNNEL_PARSING_FLAGS_IPV4_FRAGMENT_SHIFT)) ||
917 (flag & (PARSING_AND_ERR_FLAGS_IPV4FRAG_MASK <<
918 PARSING_AND_ERR_FLAGS_IPV4FRAG_SHIFT)))
919 return true;
920
921 return false;
922}
923
924static struct sk_buff *qede_rx_allocate_skb(struct qede_dev *edev,
925 struct qede_rx_queue *rxq,
926 struct sw_rx_data *bd, u16 len,
927 u16 pad)
928{
929 unsigned int offset = bd->page_offset + pad;
930 struct skb_frag_struct *frag;
931 struct page *page = bd->data;
932 unsigned int pull_len;
933 struct sk_buff *skb;
934 unsigned char *va;
935
936
937 skb = netdev_alloc_skb(edev->ndev, QEDE_RX_HDR_SIZE);
938 if (unlikely(!skb))
939 return NULL;
940
941
942
943
944 if (len + pad <= edev->rx_copybreak) {
945 memcpy(skb_put(skb, len),
946 page_address(page) + offset, len);
947 qede_reuse_page(rxq, bd);
948 goto out;
949 }
950
951 frag = &skb_shinfo(skb)->frags[0];
952
953 skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
954 page, offset, len, rxq->rx_buf_seg_size);
955
956 va = skb_frag_address(frag);
957 pull_len = eth_get_headlen(va, QEDE_RX_HDR_SIZE);
958
959
960 memcpy(skb->data, va, ALIGN(pull_len, sizeof(long)));
961
962
963 skb_frag_size_sub(frag, pull_len);
964 frag->page_offset += pull_len;
965 skb->data_len -= pull_len;
966 skb->tail += pull_len;
967
968 if (unlikely(qede_realloc_rx_buffer(rxq, bd))) {
969
970
971
972
973 page_ref_inc(page);
974 dev_kfree_skb_any(skb);
975 return NULL;
976 }
977
978out:
979
980 qede_rx_bd_ring_consume(rxq);
981 return skb;
982}
983
984static int qede_rx_build_jumbo(struct qede_dev *edev,
985 struct qede_rx_queue *rxq,
986 struct sk_buff *skb,
987 struct eth_fast_path_rx_reg_cqe *cqe,
988 u16 first_bd_len)
989{
990 u16 pkt_len = le16_to_cpu(cqe->pkt_len);
991 struct sw_rx_data *bd;
992 u16 bd_cons_idx;
993 u8 num_frags;
994
995 pkt_len -= first_bd_len;
996
997
998 for (num_frags = cqe->bd_num - 1; num_frags > 0; num_frags--) {
999 u16 cur_size = pkt_len > rxq->rx_buf_size ? rxq->rx_buf_size :
1000 pkt_len;
1001
1002 if (unlikely(!cur_size)) {
1003 DP_ERR(edev,
1004 "Still got %d BDs for mapping jumbo, but length became 0\n",
1005 num_frags);
1006 goto out;
1007 }
1008
1009
1010 if (unlikely(qede_alloc_rx_buffer(rxq, true)))
1011 goto out;
1012
1013
1014
1015
1016 bd_cons_idx = rxq->sw_rx_cons & NUM_RX_BDS_MAX;
1017 bd = &rxq->sw_rx_ring[bd_cons_idx];
1018 qede_rx_bd_ring_consume(rxq);
1019
1020 dma_unmap_page(rxq->dev, bd->mapping,
1021 PAGE_SIZE, DMA_FROM_DEVICE);
1022
1023 skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags++,
1024 bd->data, 0, cur_size);
1025
1026 skb->truesize += PAGE_SIZE;
1027 skb->data_len += cur_size;
1028 skb->len += cur_size;
1029 pkt_len -= cur_size;
1030 }
1031
1032 if (unlikely(pkt_len))
1033 DP_ERR(edev,
1034 "Mapped all BDs of jumbo, but still have %d bytes\n",
1035 pkt_len);
1036
1037out:
1038 return num_frags;
1039}
1040
1041static int qede_rx_process_tpa_cqe(struct qede_dev *edev,
1042 struct qede_fastpath *fp,
1043 struct qede_rx_queue *rxq,
1044 union eth_rx_cqe *cqe,
1045 enum eth_rx_cqe_type type)
1046{
1047 switch (type) {
1048 case ETH_RX_CQE_TYPE_TPA_START:
1049 qede_tpa_start(edev, rxq, &cqe->fast_path_tpa_start);
1050 return 0;
1051 case ETH_RX_CQE_TYPE_TPA_CONT:
1052 qede_tpa_cont(edev, rxq, &cqe->fast_path_tpa_cont);
1053 return 0;
1054 case ETH_RX_CQE_TYPE_TPA_END:
1055 return qede_tpa_end(edev, fp, &cqe->fast_path_tpa_end);
1056 default:
1057 return 0;
1058 }
1059}
1060
1061static int qede_rx_process_cqe(struct qede_dev *edev,
1062 struct qede_fastpath *fp,
1063 struct qede_rx_queue *rxq)
1064{
1065 struct eth_fast_path_rx_reg_cqe *fp_cqe;
1066 u16 len, pad, bd_cons_idx, parse_flag;
1067 enum eth_rx_cqe_type cqe_type;
1068 union eth_rx_cqe *cqe;
1069 struct sw_rx_data *bd;
1070 struct sk_buff *skb;
1071 __le16 flags;
1072 u8 csum_flag;
1073
1074
1075 cqe = (union eth_rx_cqe *)qed_chain_consume(&rxq->rx_comp_ring);
1076 cqe_type = cqe->fast_path_regular.type;
1077
1078
1079 if (unlikely(cqe_type == ETH_RX_CQE_TYPE_SLOW_PATH)) {
1080 struct eth_slow_path_rx_cqe *sp_cqe;
1081
1082 sp_cqe = (struct eth_slow_path_rx_cqe *)cqe;
1083 edev->ops->eth_cqe_completion(edev->cdev, fp->id, sp_cqe);
1084 return 0;
1085 }
1086
1087
1088 if (cqe_type != ETH_RX_CQE_TYPE_REGULAR)
1089 return qede_rx_process_tpa_cqe(edev, fp, rxq, cqe, cqe_type);
1090
1091
1092
1093
1094 bd_cons_idx = rxq->sw_rx_cons & NUM_RX_BDS_MAX;
1095 bd = &rxq->sw_rx_ring[bd_cons_idx];
1096
1097 fp_cqe = &cqe->fast_path_regular;
1098 len = le16_to_cpu(fp_cqe->len_on_first_bd);
1099 pad = fp_cqe->placement_offset + rxq->rx_headroom;
1100
1101
1102
1103 flags = cqe->fast_path_regular.pars_flags.flags;
1104 parse_flag = le16_to_cpu(flags);
1105
1106 csum_flag = qede_check_csum(parse_flag);
1107 if (unlikely(csum_flag == QEDE_CSUM_ERROR)) {
1108 if (qede_pkt_is_ip_fragmented(fp_cqe, parse_flag))
1109 rxq->rx_ip_frags++;
1110 else
1111 rxq->rx_hw_errors++;
1112 }
1113
1114
1115
1116
1117 skb = qede_rx_allocate_skb(edev, rxq, bd, len, pad);
1118 if (!skb) {
1119 rxq->rx_alloc_errors++;
1120 qede_recycle_rx_bd_ring(rxq, fp_cqe->bd_num);
1121 return 0;
1122 }
1123
1124
1125
1126
1127 if (fp_cqe->bd_num > 1) {
1128 u16 unmapped_frags = qede_rx_build_jumbo(edev, rxq, skb,
1129 fp_cqe, len);
1130
1131 if (unlikely(unmapped_frags > 0)) {
1132 qede_recycle_rx_bd_ring(rxq, unmapped_frags);
1133 dev_kfree_skb_any(skb);
1134 return 0;
1135 }
1136 }
1137
1138
1139 skb->protocol = eth_type_trans(skb, edev->ndev);
1140 qede_get_rxhash(skb, fp_cqe->bitfields, fp_cqe->rss_hash);
1141 qede_set_skb_csum(skb, csum_flag);
1142 skb_record_rx_queue(skb, rxq->rxq_id);
1143 qede_ptp_record_rx_ts(edev, cqe, skb);
1144
1145
1146 qede_skb_receive(edev, fp, rxq, skb, le16_to_cpu(fp_cqe->vlan_tag));
1147
1148 return 1;
1149}
1150
1151static int qede_rx_int(struct qede_fastpath *fp, int budget)
1152{
1153 struct qede_rx_queue *rxq = fp->rxq;
1154 struct qede_dev *edev = fp->edev;
1155 int work_done = 0, rcv_pkts = 0;
1156 u16 hw_comp_cons, sw_comp_cons;
1157
1158 hw_comp_cons = le16_to_cpu(*rxq->hw_cons_ptr);
1159 sw_comp_cons = qed_chain_get_cons_idx(&rxq->rx_comp_ring);
1160
1161
1162
1163
1164
1165
1166 rmb();
1167
1168
1169 while ((sw_comp_cons != hw_comp_cons) && (work_done < budget)) {
1170 rcv_pkts += qede_rx_process_cqe(edev, fp, rxq);
1171 qed_chain_recycle_consumed(&rxq->rx_comp_ring);
1172 sw_comp_cons = qed_chain_get_cons_idx(&rxq->rx_comp_ring);
1173 work_done++;
1174 }
1175
1176 rxq->rcv_pkts += rcv_pkts;
1177
1178
1179 while (rxq->num_rx_buffers - rxq->filled_buffers)
1180 if (qede_alloc_rx_buffer(rxq, false))
1181 break;
1182
1183
1184 qede_update_rx_prod(edev, rxq);
1185
1186 return work_done;
1187}
1188
1189static bool qede_poll_is_more_work(struct qede_fastpath *fp)
1190{
1191 qed_sb_update_sb_idx(fp->sb_info);
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203 rmb();
1204
1205 if (likely(fp->type & QEDE_FASTPATH_RX))
1206 if (qede_has_rx_work(fp->rxq))
1207 return true;
1208
1209 if (likely(fp->type & QEDE_FASTPATH_TX))
1210 if (qede_txq_has_work(fp->txq))
1211 return true;
1212
1213 return false;
1214}
1215
1216
1217
1218
1219int qede_poll(struct napi_struct *napi, int budget)
1220{
1221 struct qede_fastpath *fp = container_of(napi, struct qede_fastpath,
1222 napi);
1223 struct qede_dev *edev = fp->edev;
1224 int rx_work_done = 0;
1225
1226 if (likely(fp->type & QEDE_FASTPATH_TX) && qede_txq_has_work(fp->txq))
1227 qede_tx_int(edev, fp->txq);
1228
1229 rx_work_done = (likely(fp->type & QEDE_FASTPATH_RX) &&
1230 qede_has_rx_work(fp->rxq)) ?
1231 qede_rx_int(fp, budget) : 0;
1232 if (rx_work_done < budget) {
1233 if (!qede_poll_is_more_work(fp)) {
1234 napi_complete(napi);
1235
1236
1237 qed_sb_ack(fp->sb_info, IGU_INT_ENABLE, 1);
1238 } else {
1239 rx_work_done = budget;
1240 }
1241 }
1242
1243 return rx_work_done;
1244}
1245
1246irqreturn_t qede_msix_fp_int(int irq, void *fp_cookie)
1247{
1248 struct qede_fastpath *fp = fp_cookie;
1249
1250 qed_sb_ack(fp->sb_info, IGU_INT_DISABLE, 0 );
1251
1252 napi_schedule_irqoff(&fp->napi);
1253 return IRQ_HANDLED;
1254}
1255
1256
1257netdev_tx_t qede_start_xmit(struct sk_buff *skb, struct net_device *ndev)
1258{
1259 struct qede_dev *edev = netdev_priv(ndev);
1260 struct netdev_queue *netdev_txq;
1261 struct qede_tx_queue *txq;
1262 struct eth_tx_1st_bd *first_bd;
1263 struct eth_tx_2nd_bd *second_bd = NULL;
1264 struct eth_tx_3rd_bd *third_bd = NULL;
1265 struct eth_tx_bd *tx_data_bd = NULL;
1266 u16 txq_index, val = 0;
1267 u8 nbd = 0;
1268 dma_addr_t mapping;
1269 int rc, frag_idx = 0, ipv6_ext = 0;
1270 u8 xmit_type;
1271 u16 idx;
1272 u16 hlen;
1273 bool data_split = false;
1274
1275
1276 txq_index = skb_get_queue_mapping(skb);
1277 WARN_ON(txq_index >= QEDE_TSS_COUNT(edev));
1278 txq = edev->fp_array[edev->fp_num_rx + txq_index].txq;
1279 netdev_txq = netdev_get_tx_queue(ndev, txq_index);
1280
1281 WARN_ON(qed_chain_get_elem_left(&txq->tx_pbl) < (MAX_SKB_FRAGS + 1));
1282
1283 xmit_type = qede_xmit_type(skb, &ipv6_ext);
1284
1285#if ((MAX_SKB_FRAGS + 2) > ETH_TX_MAX_BDS_PER_NON_LSO_PACKET)
1286 if (qede_pkt_req_lin(skb, xmit_type)) {
1287 if (skb_linearize(skb)) {
1288 DP_NOTICE(edev,
1289 "SKB linearization failed - silently dropping this SKB\n");
1290 dev_kfree_skb_any(skb);
1291 return NETDEV_TX_OK;
1292 }
1293 }
1294#endif
1295
1296
1297 idx = txq->sw_tx_prod;
1298 txq->sw_tx_ring[idx].skb = skb;
1299 first_bd = (struct eth_tx_1st_bd *)
1300 qed_chain_produce(&txq->tx_pbl);
1301 memset(first_bd, 0, sizeof(*first_bd));
1302 first_bd->data.bd_flags.bitfields =
1303 1 << ETH_TX_1ST_BD_FLAGS_START_BD_SHIFT;
1304
1305 if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP))
1306 qede_ptp_tx_ts(edev, skb);
1307
1308
1309 mapping = dma_map_single(txq->dev, skb->data,
1310 skb_headlen(skb), DMA_TO_DEVICE);
1311 if (unlikely(dma_mapping_error(txq->dev, mapping))) {
1312 DP_NOTICE(edev, "SKB mapping failed\n");
1313 qede_free_failed_tx_pkt(txq, first_bd, 0, false);
1314 qede_update_tx_producer(txq);
1315 return NETDEV_TX_OK;
1316 }
1317 nbd++;
1318 BD_SET_UNMAP_ADDR_LEN(first_bd, mapping, skb_headlen(skb));
1319
1320
1321
1322
1323 if (unlikely((xmit_type & XMIT_LSO) | ipv6_ext)) {
1324 second_bd = (struct eth_tx_2nd_bd *)
1325 qed_chain_produce(&txq->tx_pbl);
1326 memset(second_bd, 0, sizeof(*second_bd));
1327
1328 nbd++;
1329 third_bd = (struct eth_tx_3rd_bd *)
1330 qed_chain_produce(&txq->tx_pbl);
1331 memset(third_bd, 0, sizeof(*third_bd));
1332
1333 nbd++;
1334
1335 tx_data_bd = (struct eth_tx_bd *)second_bd;
1336 }
1337
1338 if (skb_vlan_tag_present(skb)) {
1339 first_bd->data.vlan = cpu_to_le16(skb_vlan_tag_get(skb));
1340 first_bd->data.bd_flags.bitfields |=
1341 1 << ETH_TX_1ST_BD_FLAGS_VLAN_INSERTION_SHIFT;
1342 }
1343
1344
1345 if (xmit_type & XMIT_L4_CSUM) {
1346
1347
1348
1349 first_bd->data.bd_flags.bitfields |=
1350 1 << ETH_TX_1ST_BD_FLAGS_L4_CSUM_SHIFT;
1351
1352 if (xmit_type & XMIT_ENC) {
1353 first_bd->data.bd_flags.bitfields |=
1354 1 << ETH_TX_1ST_BD_FLAGS_IP_CSUM_SHIFT;
1355
1356 val |= (1 << ETH_TX_DATA_1ST_BD_TUNN_FLAG_SHIFT);
1357 }
1358
1359
1360
1361
1362
1363 if (unlikely(txq->is_legacy))
1364 val ^= (1 << ETH_TX_DATA_1ST_BD_TUNN_FLAG_SHIFT);
1365
1366
1367
1368
1369
1370 if (unlikely(ipv6_ext))
1371 qede_set_params_for_ipv6_ext(skb, second_bd, third_bd);
1372 }
1373
1374 if (xmit_type & XMIT_LSO) {
1375 first_bd->data.bd_flags.bitfields |=
1376 (1 << ETH_TX_1ST_BD_FLAGS_LSO_SHIFT);
1377 third_bd->data.lso_mss =
1378 cpu_to_le16(skb_shinfo(skb)->gso_size);
1379
1380 if (unlikely(xmit_type & XMIT_ENC)) {
1381 first_bd->data.bd_flags.bitfields |=
1382 1 << ETH_TX_1ST_BD_FLAGS_TUNN_IP_CSUM_SHIFT;
1383
1384 if (xmit_type & XMIT_ENC_GSO_L4_CSUM) {
1385 u8 tmp = ETH_TX_1ST_BD_FLAGS_TUNN_L4_CSUM_SHIFT;
1386
1387 first_bd->data.bd_flags.bitfields |= 1 << tmp;
1388 }
1389 hlen = qede_get_skb_hlen(skb, true);
1390 } else {
1391 first_bd->data.bd_flags.bitfields |=
1392 1 << ETH_TX_1ST_BD_FLAGS_IP_CSUM_SHIFT;
1393 hlen = qede_get_skb_hlen(skb, false);
1394 }
1395
1396
1397 third_bd->data.bitfields |=
1398 cpu_to_le16(1 << ETH_TX_DATA_3RD_BD_HDR_NBD_SHIFT);
1399
1400
1401
1402
1403 if (unlikely(skb_headlen(skb) > hlen)) {
1404 DP_VERBOSE(edev, NETIF_MSG_TX_QUEUED,
1405 "TSO split header size is %d (%x:%x)\n",
1406 first_bd->nbytes, first_bd->addr.hi,
1407 first_bd->addr.lo);
1408
1409 mapping = HILO_U64(le32_to_cpu(first_bd->addr.hi),
1410 le32_to_cpu(first_bd->addr.lo)) +
1411 hlen;
1412
1413 BD_SET_UNMAP_ADDR_LEN(tx_data_bd, mapping,
1414 le16_to_cpu(first_bd->nbytes) -
1415 hlen);
1416
1417
1418
1419
1420 txq->sw_tx_ring[idx].flags |= QEDE_TSO_SPLIT_BD;
1421
1422 first_bd->nbytes = cpu_to_le16(hlen);
1423
1424 tx_data_bd = (struct eth_tx_bd *)third_bd;
1425 data_split = true;
1426 }
1427 } else {
1428 val |= ((skb->len & ETH_TX_DATA_1ST_BD_PKT_LEN_MASK) <<
1429 ETH_TX_DATA_1ST_BD_PKT_LEN_SHIFT);
1430 }
1431
1432 first_bd->data.bitfields = cpu_to_le16(val);
1433
1434
1435
1436 while (tx_data_bd && frag_idx < skb_shinfo(skb)->nr_frags) {
1437 rc = map_frag_to_bd(txq,
1438 &skb_shinfo(skb)->frags[frag_idx],
1439 tx_data_bd);
1440 if (rc) {
1441 qede_free_failed_tx_pkt(txq, first_bd, nbd, data_split);
1442 qede_update_tx_producer(txq);
1443 return NETDEV_TX_OK;
1444 }
1445
1446 if (tx_data_bd == (struct eth_tx_bd *)second_bd)
1447 tx_data_bd = (struct eth_tx_bd *)third_bd;
1448 else
1449 tx_data_bd = NULL;
1450
1451 frag_idx++;
1452 }
1453
1454
1455 for (; frag_idx < skb_shinfo(skb)->nr_frags; frag_idx++, nbd++) {
1456 tx_data_bd = (struct eth_tx_bd *)
1457 qed_chain_produce(&txq->tx_pbl);
1458
1459 memset(tx_data_bd, 0, sizeof(*tx_data_bd));
1460
1461 rc = map_frag_to_bd(txq,
1462 &skb_shinfo(skb)->frags[frag_idx],
1463 tx_data_bd);
1464 if (rc) {
1465 qede_free_failed_tx_pkt(txq, first_bd, nbd, data_split);
1466 qede_update_tx_producer(txq);
1467 return NETDEV_TX_OK;
1468 }
1469 }
1470
1471
1472 first_bd->data.nbds = nbd;
1473
1474 netdev_tx_sent_queue(netdev_txq, skb->len);
1475
1476 skb_tx_timestamp(skb);
1477
1478
1479
1480
1481 txq->sw_tx_prod = (txq->sw_tx_prod + 1) % txq->num_tx_buffers;
1482
1483
1484 txq->tx_db.data.bd_prod =
1485 cpu_to_le16(qed_chain_get_prod_idx(&txq->tx_pbl));
1486
1487 if (!skb->xmit_more || netif_xmit_stopped(netdev_txq))
1488 qede_update_tx_producer(txq);
1489
1490 if (unlikely(qed_chain_get_elem_left(&txq->tx_pbl)
1491 < (MAX_SKB_FRAGS + 1))) {
1492 if (skb->xmit_more)
1493 qede_update_tx_producer(txq);
1494
1495 netif_tx_stop_queue(netdev_txq);
1496 txq->stopped_cnt++;
1497 DP_VERBOSE(edev, NETIF_MSG_TX_QUEUED,
1498 "Stop queue was called\n");
1499
1500
1501
1502
1503 smp_mb();
1504
1505 if ((qed_chain_get_elem_left(&txq->tx_pbl) >=
1506 (MAX_SKB_FRAGS + 1)) &&
1507 (edev->state == QEDE_STATE_OPEN)) {
1508 netif_tx_wake_queue(netdev_txq);
1509 DP_VERBOSE(edev, NETIF_MSG_TX_QUEUED,
1510 "Wake queue was called\n");
1511 }
1512 }
1513
1514 return NETDEV_TX_OK;
1515}
1516
1517
1518#define QEDE_MAX_TUN_HDR_LEN 48
1519
1520netdev_features_t qede_features_check(struct sk_buff *skb,
1521 struct net_device *dev,
1522 netdev_features_t features)
1523{
1524 if (skb->encapsulation) {
1525 u8 l4_proto = 0;
1526
1527 switch (vlan_get_protocol(skb)) {
1528 case htons(ETH_P_IP):
1529 l4_proto = ip_hdr(skb)->protocol;
1530 break;
1531 case htons(ETH_P_IPV6):
1532 l4_proto = ipv6_hdr(skb)->nexthdr;
1533 break;
1534 default:
1535 return features;
1536 }
1537
1538
1539
1540
1541
1542 if (l4_proto == IPPROTO_UDP) {
1543 struct qede_dev *edev = netdev_priv(dev);
1544 u16 hdrlen, vxln_port, gnv_port;
1545
1546 hdrlen = QEDE_MAX_TUN_HDR_LEN;
1547 vxln_port = edev->vxlan_dst_port;
1548 gnv_port = edev->geneve_dst_port;
1549
1550 if ((skb_inner_mac_header(skb) -
1551 skb_transport_header(skb)) > hdrlen ||
1552 (ntohs(udp_hdr(skb)->dest) != vxln_port &&
1553 ntohs(udp_hdr(skb)->dest) != gnv_port))
1554 return features & ~(NETIF_F_CSUM_MASK |
1555 NETIF_F_GSO_MASK);
1556 }
1557 }
1558
1559 return features;
1560}
1561