0001
0002
0003
0004 #include <linux/bpf_trace.h>
0005 #include <linux/netdevice.h>
0006 #include <linux/bitfield.h>
0007
0008 #include "../nfp_app.h"
0009 #include "../nfp_net.h"
0010 #include "../nfp_net_dp.h"
0011 #include "../nfp_net_xsk.h"
0012 #include "../crypto/crypto.h"
0013 #include "../crypto/fw.h"
0014 #include "nfd3.h"
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030 static int nfp_nfd3_tx_ring_should_wake(struct nfp_net_tx_ring *tx_ring)
0031 {
0032 return !nfp_net_tx_full(tx_ring, MAX_SKB_FRAGS * 4);
0033 }
0034
0035 static int nfp_nfd3_tx_ring_should_stop(struct nfp_net_tx_ring *tx_ring)
0036 {
0037 return nfp_net_tx_full(tx_ring, MAX_SKB_FRAGS + 1);
0038 }
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049 static void
0050 nfp_nfd3_tx_ring_stop(struct netdev_queue *nd_q,
0051 struct nfp_net_tx_ring *tx_ring)
0052 {
0053 netif_tx_stop_queue(nd_q);
0054
0055
0056 smp_mb();
0057 if (unlikely(nfp_nfd3_tx_ring_should_wake(tx_ring)))
0058 netif_tx_start_queue(nd_q);
0059 }
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072 static void
0073 nfp_nfd3_tx_tso(struct nfp_net_r_vector *r_vec, struct nfp_nfd3_tx_buf *txbuf,
0074 struct nfp_nfd3_tx_desc *txd, struct sk_buff *skb, u32 md_bytes)
0075 {
0076 u32 l3_offset, l4_offset, hdrlen;
0077 u16 mss;
0078
0079 if (!skb_is_gso(skb))
0080 return;
0081
0082 if (!skb->encapsulation) {
0083 l3_offset = skb_network_offset(skb);
0084 l4_offset = skb_transport_offset(skb);
0085 hdrlen = skb_tcp_all_headers(skb);
0086 } else {
0087 l3_offset = skb_inner_network_offset(skb);
0088 l4_offset = skb_inner_transport_offset(skb);
0089 hdrlen = skb_inner_tcp_all_headers(skb);
0090 }
0091
0092 txbuf->pkt_cnt = skb_shinfo(skb)->gso_segs;
0093 txbuf->real_len += hdrlen * (txbuf->pkt_cnt - 1);
0094
0095 mss = skb_shinfo(skb)->gso_size & NFD3_DESC_TX_MSS_MASK;
0096 txd->l3_offset = l3_offset - md_bytes;
0097 txd->l4_offset = l4_offset - md_bytes;
0098 txd->lso_hdrlen = hdrlen - md_bytes;
0099 txd->mss = cpu_to_le16(mss);
0100 txd->flags |= NFD3_DESC_TX_LSO;
0101
0102 u64_stats_update_begin(&r_vec->tx_sync);
0103 r_vec->tx_lso++;
0104 u64_stats_update_end(&r_vec->tx_sync);
0105 }
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118 static void
0119 nfp_nfd3_tx_csum(struct nfp_net_dp *dp, struct nfp_net_r_vector *r_vec,
0120 struct nfp_nfd3_tx_buf *txbuf, struct nfp_nfd3_tx_desc *txd,
0121 struct sk_buff *skb)
0122 {
0123 struct ipv6hdr *ipv6h;
0124 struct iphdr *iph;
0125 u8 l4_hdr;
0126
0127 if (!(dp->ctrl & NFP_NET_CFG_CTRL_TXCSUM))
0128 return;
0129
0130 if (skb->ip_summed != CHECKSUM_PARTIAL)
0131 return;
0132
0133 txd->flags |= NFD3_DESC_TX_CSUM;
0134 if (skb->encapsulation)
0135 txd->flags |= NFD3_DESC_TX_ENCAP;
0136
0137 iph = skb->encapsulation ? inner_ip_hdr(skb) : ip_hdr(skb);
0138 ipv6h = skb->encapsulation ? inner_ipv6_hdr(skb) : ipv6_hdr(skb);
0139
0140 if (iph->version == 4) {
0141 txd->flags |= NFD3_DESC_TX_IP4_CSUM;
0142 l4_hdr = iph->protocol;
0143 } else if (ipv6h->version == 6) {
0144 l4_hdr = ipv6h->nexthdr;
0145 } else {
0146 nn_dp_warn(dp, "partial checksum but ipv=%x!\n", iph->version);
0147 return;
0148 }
0149
0150 switch (l4_hdr) {
0151 case IPPROTO_TCP:
0152 txd->flags |= NFD3_DESC_TX_TCP_CSUM;
0153 break;
0154 case IPPROTO_UDP:
0155 txd->flags |= NFD3_DESC_TX_UDP_CSUM;
0156 break;
0157 default:
0158 nn_dp_warn(dp, "partial checksum but l4 proto=%x!\n", l4_hdr);
0159 return;
0160 }
0161
0162 u64_stats_update_begin(&r_vec->tx_sync);
0163 if (skb->encapsulation)
0164 r_vec->hw_csum_tx_inner += txbuf->pkt_cnt;
0165 else
0166 r_vec->hw_csum_tx += txbuf->pkt_cnt;
0167 u64_stats_update_end(&r_vec->tx_sync);
0168 }
0169
0170 static int nfp_nfd3_prep_tx_meta(struct nfp_net_dp *dp, struct sk_buff *skb, u64 tls_handle)
0171 {
0172 struct metadata_dst *md_dst = skb_metadata_dst(skb);
0173 unsigned char *data;
0174 bool vlan_insert;
0175 u32 meta_id = 0;
0176 int md_bytes;
0177
0178 if (unlikely(md_dst || tls_handle)) {
0179 if (unlikely(md_dst && md_dst->type != METADATA_HW_PORT_MUX))
0180 md_dst = NULL;
0181 }
0182
0183 vlan_insert = skb_vlan_tag_present(skb) && (dp->ctrl & NFP_NET_CFG_CTRL_TXVLAN_V2);
0184
0185 if (!(md_dst || tls_handle || vlan_insert))
0186 return 0;
0187
0188 md_bytes = sizeof(meta_id) +
0189 !!md_dst * NFP_NET_META_PORTID_SIZE +
0190 !!tls_handle * NFP_NET_META_CONN_HANDLE_SIZE +
0191 vlan_insert * NFP_NET_META_VLAN_SIZE;
0192
0193 if (unlikely(skb_cow_head(skb, md_bytes)))
0194 return -ENOMEM;
0195
0196 data = skb_push(skb, md_bytes) + md_bytes;
0197 if (md_dst) {
0198 data -= NFP_NET_META_PORTID_SIZE;
0199 put_unaligned_be32(md_dst->u.port_info.port_id, data);
0200 meta_id = NFP_NET_META_PORTID;
0201 }
0202 if (tls_handle) {
0203
0204
0205
0206 data -= NFP_NET_META_CONN_HANDLE_SIZE;
0207 memcpy(data, &tls_handle, sizeof(tls_handle));
0208 meta_id <<= NFP_NET_META_FIELD_SIZE;
0209 meta_id |= NFP_NET_META_CONN_HANDLE;
0210 }
0211 if (vlan_insert) {
0212 data -= NFP_NET_META_VLAN_SIZE;
0213
0214
0215
0216 memcpy(data, &skb->vlan_proto, sizeof(skb->vlan_proto));
0217 put_unaligned_be16(skb_vlan_tag_get(skb), data + sizeof(skb->vlan_proto));
0218 meta_id <<= NFP_NET_META_FIELD_SIZE;
0219 meta_id |= NFP_NET_META_VLAN;
0220 }
0221
0222 data -= sizeof(meta_id);
0223 put_unaligned_be32(meta_id, data);
0224
0225 return md_bytes;
0226 }
0227
0228
0229
0230
0231
0232
0233
0234
0235 netdev_tx_t nfp_nfd3_tx(struct sk_buff *skb, struct net_device *netdev)
0236 {
0237 struct nfp_net *nn = netdev_priv(netdev);
0238 int f, nr_frags, wr_idx, md_bytes;
0239 struct nfp_net_tx_ring *tx_ring;
0240 struct nfp_net_r_vector *r_vec;
0241 struct nfp_nfd3_tx_buf *txbuf;
0242 struct nfp_nfd3_tx_desc *txd;
0243 struct netdev_queue *nd_q;
0244 const skb_frag_t *frag;
0245 struct nfp_net_dp *dp;
0246 dma_addr_t dma_addr;
0247 unsigned int fsize;
0248 u64 tls_handle = 0;
0249 u16 qidx;
0250
0251 dp = &nn->dp;
0252 qidx = skb_get_queue_mapping(skb);
0253 tx_ring = &dp->tx_rings[qidx];
0254 r_vec = tx_ring->r_vec;
0255
0256 nr_frags = skb_shinfo(skb)->nr_frags;
0257
0258 if (unlikely(nfp_net_tx_full(tx_ring, nr_frags + 1))) {
0259 nn_dp_warn(dp, "TX ring %d busy. wrp=%u rdp=%u\n",
0260 qidx, tx_ring->wr_p, tx_ring->rd_p);
0261 nd_q = netdev_get_tx_queue(dp->netdev, qidx);
0262 netif_tx_stop_queue(nd_q);
0263 nfp_net_tx_xmit_more_flush(tx_ring);
0264 u64_stats_update_begin(&r_vec->tx_sync);
0265 r_vec->tx_busy++;
0266 u64_stats_update_end(&r_vec->tx_sync);
0267 return NETDEV_TX_BUSY;
0268 }
0269
0270 skb = nfp_net_tls_tx(dp, r_vec, skb, &tls_handle, &nr_frags);
0271 if (unlikely(!skb)) {
0272 nfp_net_tx_xmit_more_flush(tx_ring);
0273 return NETDEV_TX_OK;
0274 }
0275
0276 md_bytes = nfp_nfd3_prep_tx_meta(dp, skb, tls_handle);
0277 if (unlikely(md_bytes < 0))
0278 goto err_flush;
0279
0280
0281 dma_addr = dma_map_single(dp->dev, skb->data, skb_headlen(skb),
0282 DMA_TO_DEVICE);
0283 if (dma_mapping_error(dp->dev, dma_addr))
0284 goto err_dma_err;
0285
0286 wr_idx = D_IDX(tx_ring, tx_ring->wr_p);
0287
0288
0289 txbuf = &tx_ring->txbufs[wr_idx];
0290 txbuf->skb = skb;
0291 txbuf->dma_addr = dma_addr;
0292 txbuf->fidx = -1;
0293 txbuf->pkt_cnt = 1;
0294 txbuf->real_len = skb->len;
0295
0296
0297 txd = &tx_ring->txds[wr_idx];
0298 txd->offset_eop = (nr_frags ? 0 : NFD3_DESC_TX_EOP) | md_bytes;
0299 txd->dma_len = cpu_to_le16(skb_headlen(skb));
0300 nfp_desc_set_dma_addr_40b(txd, dma_addr);
0301 txd->data_len = cpu_to_le16(skb->len);
0302
0303 txd->flags = 0;
0304 txd->mss = 0;
0305 txd->lso_hdrlen = 0;
0306
0307
0308 nfp_nfd3_tx_tso(r_vec, txbuf, txd, skb, md_bytes);
0309 nfp_nfd3_tx_csum(dp, r_vec, txbuf, txd, skb);
0310 if (skb_vlan_tag_present(skb) && dp->ctrl & NFP_NET_CFG_CTRL_TXVLAN) {
0311 txd->flags |= NFD3_DESC_TX_VLAN;
0312 txd->vlan = cpu_to_le16(skb_vlan_tag_get(skb));
0313 }
0314
0315
0316 if (nr_frags > 0) {
0317 __le64 second_half;
0318
0319
0320 second_half = txd->vals8[1];
0321
0322 for (f = 0; f < nr_frags; f++) {
0323 frag = &skb_shinfo(skb)->frags[f];
0324 fsize = skb_frag_size(frag);
0325
0326 dma_addr = skb_frag_dma_map(dp->dev, frag, 0,
0327 fsize, DMA_TO_DEVICE);
0328 if (dma_mapping_error(dp->dev, dma_addr))
0329 goto err_unmap;
0330
0331 wr_idx = D_IDX(tx_ring, wr_idx + 1);
0332 tx_ring->txbufs[wr_idx].skb = skb;
0333 tx_ring->txbufs[wr_idx].dma_addr = dma_addr;
0334 tx_ring->txbufs[wr_idx].fidx = f;
0335
0336 txd = &tx_ring->txds[wr_idx];
0337 txd->dma_len = cpu_to_le16(fsize);
0338 nfp_desc_set_dma_addr_40b(txd, dma_addr);
0339 txd->offset_eop = md_bytes |
0340 ((f == nr_frags - 1) ? NFD3_DESC_TX_EOP : 0);
0341 txd->vals8[1] = second_half;
0342 }
0343
0344 u64_stats_update_begin(&r_vec->tx_sync);
0345 r_vec->tx_gather++;
0346 u64_stats_update_end(&r_vec->tx_sync);
0347 }
0348
0349 skb_tx_timestamp(skb);
0350
0351 nd_q = netdev_get_tx_queue(dp->netdev, tx_ring->idx);
0352
0353 tx_ring->wr_p += nr_frags + 1;
0354 if (nfp_nfd3_tx_ring_should_stop(tx_ring))
0355 nfp_nfd3_tx_ring_stop(nd_q, tx_ring);
0356
0357 tx_ring->wr_ptr_add += nr_frags + 1;
0358 if (__netdev_tx_sent_queue(nd_q, txbuf->real_len, netdev_xmit_more()))
0359 nfp_net_tx_xmit_more_flush(tx_ring);
0360
0361 return NETDEV_TX_OK;
0362
0363 err_unmap:
0364 while (--f >= 0) {
0365 frag = &skb_shinfo(skb)->frags[f];
0366 dma_unmap_page(dp->dev, tx_ring->txbufs[wr_idx].dma_addr,
0367 skb_frag_size(frag), DMA_TO_DEVICE);
0368 tx_ring->txbufs[wr_idx].skb = NULL;
0369 tx_ring->txbufs[wr_idx].dma_addr = 0;
0370 tx_ring->txbufs[wr_idx].fidx = -2;
0371 wr_idx = wr_idx - 1;
0372 if (wr_idx < 0)
0373 wr_idx += tx_ring->cnt;
0374 }
0375 dma_unmap_single(dp->dev, tx_ring->txbufs[wr_idx].dma_addr,
0376 skb_headlen(skb), DMA_TO_DEVICE);
0377 tx_ring->txbufs[wr_idx].skb = NULL;
0378 tx_ring->txbufs[wr_idx].dma_addr = 0;
0379 tx_ring->txbufs[wr_idx].fidx = -2;
0380 err_dma_err:
0381 nn_dp_warn(dp, "Failed to map DMA TX buffer\n");
0382 err_flush:
0383 nfp_net_tx_xmit_more_flush(tx_ring);
0384 u64_stats_update_begin(&r_vec->tx_sync);
0385 r_vec->tx_errors++;
0386 u64_stats_update_end(&r_vec->tx_sync);
0387 nfp_net_tls_tx_undo(skb, tls_handle);
0388 dev_kfree_skb_any(skb);
0389 return NETDEV_TX_OK;
0390 }
0391
0392
0393
0394
0395
0396
0397 void nfp_nfd3_tx_complete(struct nfp_net_tx_ring *tx_ring, int budget)
0398 {
0399 struct nfp_net_r_vector *r_vec = tx_ring->r_vec;
0400 struct nfp_net_dp *dp = &r_vec->nfp_net->dp;
0401 u32 done_pkts = 0, done_bytes = 0;
0402 struct netdev_queue *nd_q;
0403 u32 qcp_rd_p;
0404 int todo;
0405
0406 if (tx_ring->wr_p == tx_ring->rd_p)
0407 return;
0408
0409
0410 qcp_rd_p = nfp_net_read_tx_cmpl(tx_ring, dp);
0411
0412 if (qcp_rd_p == tx_ring->qcp_rd_p)
0413 return;
0414
0415 todo = D_IDX(tx_ring, qcp_rd_p - tx_ring->qcp_rd_p);
0416
0417 while (todo--) {
0418 const skb_frag_t *frag;
0419 struct nfp_nfd3_tx_buf *tx_buf;
0420 struct sk_buff *skb;
0421 int fidx, nr_frags;
0422 int idx;
0423
0424 idx = D_IDX(tx_ring, tx_ring->rd_p++);
0425 tx_buf = &tx_ring->txbufs[idx];
0426
0427 skb = tx_buf->skb;
0428 if (!skb)
0429 continue;
0430
0431 nr_frags = skb_shinfo(skb)->nr_frags;
0432 fidx = tx_buf->fidx;
0433
0434 if (fidx == -1) {
0435
0436 dma_unmap_single(dp->dev, tx_buf->dma_addr,
0437 skb_headlen(skb), DMA_TO_DEVICE);
0438
0439 done_pkts += tx_buf->pkt_cnt;
0440 done_bytes += tx_buf->real_len;
0441 } else {
0442
0443 frag = &skb_shinfo(skb)->frags[fidx];
0444 dma_unmap_page(dp->dev, tx_buf->dma_addr,
0445 skb_frag_size(frag), DMA_TO_DEVICE);
0446 }
0447
0448
0449 if (fidx == nr_frags - 1)
0450 napi_consume_skb(skb, budget);
0451
0452 tx_buf->dma_addr = 0;
0453 tx_buf->skb = NULL;
0454 tx_buf->fidx = -2;
0455 }
0456
0457 tx_ring->qcp_rd_p = qcp_rd_p;
0458
0459 u64_stats_update_begin(&r_vec->tx_sync);
0460 r_vec->tx_bytes += done_bytes;
0461 r_vec->tx_pkts += done_pkts;
0462 u64_stats_update_end(&r_vec->tx_sync);
0463
0464 if (!dp->netdev)
0465 return;
0466
0467 nd_q = netdev_get_tx_queue(dp->netdev, tx_ring->idx);
0468 netdev_tx_completed_queue(nd_q, done_pkts, done_bytes);
0469 if (nfp_nfd3_tx_ring_should_wake(tx_ring)) {
0470
0471 smp_mb();
0472
0473 if (unlikely(netif_tx_queue_stopped(nd_q)))
0474 netif_tx_wake_queue(nd_q);
0475 }
0476
0477 WARN_ONCE(tx_ring->wr_p - tx_ring->rd_p > tx_ring->cnt,
0478 "TX ring corruption rd_p=%u wr_p=%u cnt=%u\n",
0479 tx_ring->rd_p, tx_ring->wr_p, tx_ring->cnt);
0480 }
0481
0482 static bool nfp_nfd3_xdp_complete(struct nfp_net_tx_ring *tx_ring)
0483 {
0484 struct nfp_net_r_vector *r_vec = tx_ring->r_vec;
0485 struct nfp_net_dp *dp = &r_vec->nfp_net->dp;
0486 u32 done_pkts = 0, done_bytes = 0;
0487 bool done_all;
0488 int idx, todo;
0489 u32 qcp_rd_p;
0490
0491
0492 qcp_rd_p = nfp_net_read_tx_cmpl(tx_ring, dp);
0493
0494 if (qcp_rd_p == tx_ring->qcp_rd_p)
0495 return true;
0496
0497 todo = D_IDX(tx_ring, qcp_rd_p - tx_ring->qcp_rd_p);
0498
0499 done_all = todo <= NFP_NET_XDP_MAX_COMPLETE;
0500 todo = min(todo, NFP_NET_XDP_MAX_COMPLETE);
0501
0502 tx_ring->qcp_rd_p = D_IDX(tx_ring, tx_ring->qcp_rd_p + todo);
0503
0504 done_pkts = todo;
0505 while (todo--) {
0506 idx = D_IDX(tx_ring, tx_ring->rd_p);
0507 tx_ring->rd_p++;
0508
0509 done_bytes += tx_ring->txbufs[idx].real_len;
0510 }
0511
0512 u64_stats_update_begin(&r_vec->tx_sync);
0513 r_vec->tx_bytes += done_bytes;
0514 r_vec->tx_pkts += done_pkts;
0515 u64_stats_update_end(&r_vec->tx_sync);
0516
0517 WARN_ONCE(tx_ring->wr_p - tx_ring->rd_p > tx_ring->cnt,
0518 "XDP TX ring corruption rd_p=%u wr_p=%u cnt=%u\n",
0519 tx_ring->rd_p, tx_ring->wr_p, tx_ring->cnt);
0520
0521 return done_all;
0522 }
0523
0524
0525
0526
0527 static void *
0528 nfp_nfd3_napi_alloc_one(struct nfp_net_dp *dp, dma_addr_t *dma_addr)
0529 {
0530 void *frag;
0531
0532 if (!dp->xdp_prog) {
0533 frag = napi_alloc_frag(dp->fl_bufsz);
0534 if (unlikely(!frag))
0535 return NULL;
0536 } else {
0537 struct page *page;
0538
0539 page = dev_alloc_page();
0540 if (unlikely(!page))
0541 return NULL;
0542 frag = page_address(page);
0543 }
0544
0545 *dma_addr = nfp_net_dma_map_rx(dp, frag);
0546 if (dma_mapping_error(dp->dev, *dma_addr)) {
0547 nfp_net_free_frag(frag, dp->xdp_prog);
0548 nn_dp_warn(dp, "Failed to map DMA RX buffer\n");
0549 return NULL;
0550 }
0551
0552 return frag;
0553 }
0554
0555
0556
0557
0558
0559
0560
0561
0562 static void
0563 nfp_nfd3_rx_give_one(const struct nfp_net_dp *dp,
0564 struct nfp_net_rx_ring *rx_ring,
0565 void *frag, dma_addr_t dma_addr)
0566 {
0567 unsigned int wr_idx;
0568
0569 wr_idx = D_IDX(rx_ring, rx_ring->wr_p);
0570
0571 nfp_net_dma_sync_dev_rx(dp, dma_addr);
0572
0573
0574 rx_ring->rxbufs[wr_idx].frag = frag;
0575 rx_ring->rxbufs[wr_idx].dma_addr = dma_addr;
0576
0577
0578 rx_ring->rxds[wr_idx].fld.reserved = 0;
0579 rx_ring->rxds[wr_idx].fld.meta_len_dd = 0;
0580
0581
0582
0583
0584 nfp_desc_set_dma_addr_48b(&rx_ring->rxds[wr_idx].fld,
0585 dma_addr + dp->rx_dma_off);
0586
0587 rx_ring->wr_p++;
0588 if (!(rx_ring->wr_p % NFP_NET_FL_BATCH)) {
0589
0590
0591
0592 wmb();
0593 nfp_qcp_wr_ptr_add(rx_ring->qcp_fl, NFP_NET_FL_BATCH);
0594 }
0595 }
0596
0597
0598
0599
0600
0601
0602 void nfp_nfd3_rx_ring_fill_freelist(struct nfp_net_dp *dp,
0603 struct nfp_net_rx_ring *rx_ring)
0604 {
0605 unsigned int i;
0606
0607 if (nfp_net_has_xsk_pool_slow(dp, rx_ring->idx))
0608 return nfp_net_xsk_rx_ring_fill_freelist(rx_ring);
0609
0610 for (i = 0; i < rx_ring->cnt - 1; i++)
0611 nfp_nfd3_rx_give_one(dp, rx_ring, rx_ring->rxbufs[i].frag,
0612 rx_ring->rxbufs[i].dma_addr);
0613 }
0614
0615
0616
0617
0618
0619 static int nfp_nfd3_rx_csum_has_errors(u16 flags)
0620 {
0621 u16 csum_all_checked, csum_all_ok;
0622
0623 csum_all_checked = flags & __PCIE_DESC_RX_CSUM_ALL;
0624 csum_all_ok = flags & __PCIE_DESC_RX_CSUM_ALL_OK;
0625
0626 return csum_all_checked != (csum_all_ok << PCIE_DESC_RX_CSUM_OK_SHIFT);
0627 }
0628
0629
0630
0631
0632
0633
0634
0635
0636
0637 void
0638 nfp_nfd3_rx_csum(const struct nfp_net_dp *dp, struct nfp_net_r_vector *r_vec,
0639 const struct nfp_net_rx_desc *rxd,
0640 const struct nfp_meta_parsed *meta, struct sk_buff *skb)
0641 {
0642 skb_checksum_none_assert(skb);
0643
0644 if (!(dp->netdev->features & NETIF_F_RXCSUM))
0645 return;
0646
0647 if (meta->csum_type) {
0648 skb->ip_summed = meta->csum_type;
0649 skb->csum = meta->csum;
0650 u64_stats_update_begin(&r_vec->rx_sync);
0651 r_vec->hw_csum_rx_complete++;
0652 u64_stats_update_end(&r_vec->rx_sync);
0653 return;
0654 }
0655
0656 if (nfp_nfd3_rx_csum_has_errors(le16_to_cpu(rxd->rxd.flags))) {
0657 u64_stats_update_begin(&r_vec->rx_sync);
0658 r_vec->hw_csum_rx_error++;
0659 u64_stats_update_end(&r_vec->rx_sync);
0660 return;
0661 }
0662
0663
0664
0665
0666
0667 if (rxd->rxd.flags & PCIE_DESC_RX_TCP_CSUM_OK ||
0668 rxd->rxd.flags & PCIE_DESC_RX_UDP_CSUM_OK) {
0669 __skb_incr_checksum_unnecessary(skb);
0670 u64_stats_update_begin(&r_vec->rx_sync);
0671 r_vec->hw_csum_rx_ok++;
0672 u64_stats_update_end(&r_vec->rx_sync);
0673 }
0674
0675 if (rxd->rxd.flags & PCIE_DESC_RX_I_TCP_CSUM_OK ||
0676 rxd->rxd.flags & PCIE_DESC_RX_I_UDP_CSUM_OK) {
0677 __skb_incr_checksum_unnecessary(skb);
0678 u64_stats_update_begin(&r_vec->rx_sync);
0679 r_vec->hw_csum_rx_inner_ok++;
0680 u64_stats_update_end(&r_vec->rx_sync);
0681 }
0682 }
0683
0684 static void
0685 nfp_nfd3_set_hash(struct net_device *netdev, struct nfp_meta_parsed *meta,
0686 unsigned int type, __be32 *hash)
0687 {
0688 if (!(netdev->features & NETIF_F_RXHASH))
0689 return;
0690
0691 switch (type) {
0692 case NFP_NET_RSS_IPV4:
0693 case NFP_NET_RSS_IPV6:
0694 case NFP_NET_RSS_IPV6_EX:
0695 meta->hash_type = PKT_HASH_TYPE_L3;
0696 break;
0697 default:
0698 meta->hash_type = PKT_HASH_TYPE_L4;
0699 break;
0700 }
0701
0702 meta->hash = get_unaligned_be32(hash);
0703 }
0704
0705 static void
0706 nfp_nfd3_set_hash_desc(struct net_device *netdev, struct nfp_meta_parsed *meta,
0707 void *data, struct nfp_net_rx_desc *rxd)
0708 {
0709 struct nfp_net_rx_hash *rx_hash = data;
0710
0711 if (!(rxd->rxd.flags & PCIE_DESC_RX_RSS))
0712 return;
0713
0714 nfp_nfd3_set_hash(netdev, meta, get_unaligned_be32(&rx_hash->hash_type),
0715 &rx_hash->hash);
0716 }
0717
0718 bool
0719 nfp_nfd3_parse_meta(struct net_device *netdev, struct nfp_meta_parsed *meta,
0720 void *data, void *pkt, unsigned int pkt_len, int meta_len)
0721 {
0722 u32 meta_info, vlan_info;
0723
0724 meta_info = get_unaligned_be32(data);
0725 data += 4;
0726
0727 while (meta_info) {
0728 switch (meta_info & NFP_NET_META_FIELD_MASK) {
0729 case NFP_NET_META_HASH:
0730 meta_info >>= NFP_NET_META_FIELD_SIZE;
0731 nfp_nfd3_set_hash(netdev, meta,
0732 meta_info & NFP_NET_META_FIELD_MASK,
0733 (__be32 *)data);
0734 data += 4;
0735 break;
0736 case NFP_NET_META_MARK:
0737 meta->mark = get_unaligned_be32(data);
0738 data += 4;
0739 break;
0740 case NFP_NET_META_VLAN:
0741 vlan_info = get_unaligned_be32(data);
0742 if (FIELD_GET(NFP_NET_META_VLAN_STRIP, vlan_info)) {
0743 meta->vlan.stripped = true;
0744 meta->vlan.tpid = FIELD_GET(NFP_NET_META_VLAN_TPID_MASK,
0745 vlan_info);
0746 meta->vlan.tci = FIELD_GET(NFP_NET_META_VLAN_TCI_MASK,
0747 vlan_info);
0748 }
0749 data += 4;
0750 break;
0751 case NFP_NET_META_PORTID:
0752 meta->portid = get_unaligned_be32(data);
0753 data += 4;
0754 break;
0755 case NFP_NET_META_CSUM:
0756 meta->csum_type = CHECKSUM_COMPLETE;
0757 meta->csum =
0758 (__force __wsum)__get_unaligned_cpu32(data);
0759 data += 4;
0760 break;
0761 case NFP_NET_META_RESYNC_INFO:
0762 if (nfp_net_tls_rx_resync_req(netdev, data, pkt,
0763 pkt_len))
0764 return false;
0765 data += sizeof(struct nfp_net_tls_resync_req);
0766 break;
0767 default:
0768 return true;
0769 }
0770
0771 meta_info >>= NFP_NET_META_FIELD_SIZE;
0772 }
0773
0774 return data != pkt;
0775 }
0776
0777 static void
0778 nfp_nfd3_rx_drop(const struct nfp_net_dp *dp, struct nfp_net_r_vector *r_vec,
0779 struct nfp_net_rx_ring *rx_ring, struct nfp_net_rx_buf *rxbuf,
0780 struct sk_buff *skb)
0781 {
0782 u64_stats_update_begin(&r_vec->rx_sync);
0783 r_vec->rx_drops++;
0784
0785
0786
0787 if (skb && rxbuf)
0788 r_vec->rx_replace_buf_alloc_fail++;
0789 u64_stats_update_end(&r_vec->rx_sync);
0790
0791
0792
0793
0794 if (skb && rxbuf && skb->head == rxbuf->frag)
0795 page_ref_inc(virt_to_head_page(rxbuf->frag));
0796 if (rxbuf)
0797 nfp_nfd3_rx_give_one(dp, rx_ring, rxbuf->frag, rxbuf->dma_addr);
0798 if (skb)
0799 dev_kfree_skb_any(skb);
0800 }
0801
0802 static bool
0803 nfp_nfd3_tx_xdp_buf(struct nfp_net_dp *dp, struct nfp_net_rx_ring *rx_ring,
0804 struct nfp_net_tx_ring *tx_ring,
0805 struct nfp_net_rx_buf *rxbuf, unsigned int dma_off,
0806 unsigned int pkt_len, bool *completed)
0807 {
0808 unsigned int dma_map_sz = dp->fl_bufsz - NFP_NET_RX_BUF_NON_DATA;
0809 struct nfp_nfd3_tx_buf *txbuf;
0810 struct nfp_nfd3_tx_desc *txd;
0811 int wr_idx;
0812
0813
0814 if (pkt_len + dma_off > dma_map_sz)
0815 return false;
0816
0817 if (unlikely(nfp_net_tx_full(tx_ring, 1))) {
0818 if (!*completed) {
0819 nfp_nfd3_xdp_complete(tx_ring);
0820 *completed = true;
0821 }
0822
0823 if (unlikely(nfp_net_tx_full(tx_ring, 1))) {
0824 nfp_nfd3_rx_drop(dp, rx_ring->r_vec, rx_ring, rxbuf,
0825 NULL);
0826 return false;
0827 }
0828 }
0829
0830 wr_idx = D_IDX(tx_ring, tx_ring->wr_p);
0831
0832
0833 txbuf = &tx_ring->txbufs[wr_idx];
0834
0835 nfp_nfd3_rx_give_one(dp, rx_ring, txbuf->frag, txbuf->dma_addr);
0836
0837 txbuf->frag = rxbuf->frag;
0838 txbuf->dma_addr = rxbuf->dma_addr;
0839 txbuf->fidx = -1;
0840 txbuf->pkt_cnt = 1;
0841 txbuf->real_len = pkt_len;
0842
0843 dma_sync_single_for_device(dp->dev, rxbuf->dma_addr + dma_off,
0844 pkt_len, DMA_BIDIRECTIONAL);
0845
0846
0847 txd = &tx_ring->txds[wr_idx];
0848 txd->offset_eop = NFD3_DESC_TX_EOP;
0849 txd->dma_len = cpu_to_le16(pkt_len);
0850 nfp_desc_set_dma_addr_40b(txd, rxbuf->dma_addr + dma_off);
0851 txd->data_len = cpu_to_le16(pkt_len);
0852
0853 txd->flags = 0;
0854 txd->mss = 0;
0855 txd->lso_hdrlen = 0;
0856
0857 tx_ring->wr_p++;
0858 tx_ring->wr_ptr_add++;
0859 return true;
0860 }
0861
0862
0863
0864
0865
0866
0867
0868
0869
0870
0871
0872
0873 static int nfp_nfd3_rx(struct nfp_net_rx_ring *rx_ring, int budget)
0874 {
0875 struct nfp_net_r_vector *r_vec = rx_ring->r_vec;
0876 struct nfp_net_dp *dp = &r_vec->nfp_net->dp;
0877 struct nfp_net_tx_ring *tx_ring;
0878 struct bpf_prog *xdp_prog;
0879 bool xdp_tx_cmpl = false;
0880 unsigned int true_bufsz;
0881 struct sk_buff *skb;
0882 int pkts_polled = 0;
0883 struct xdp_buff xdp;
0884 int idx;
0885
0886 xdp_prog = READ_ONCE(dp->xdp_prog);
0887 true_bufsz = xdp_prog ? PAGE_SIZE : dp->fl_bufsz;
0888 xdp_init_buff(&xdp, PAGE_SIZE - NFP_NET_RX_BUF_HEADROOM,
0889 &rx_ring->xdp_rxq);
0890 tx_ring = r_vec->xdp_ring;
0891
0892 while (pkts_polled < budget) {
0893 unsigned int meta_len, data_len, meta_off, pkt_len, pkt_off;
0894 struct nfp_net_rx_buf *rxbuf;
0895 struct nfp_net_rx_desc *rxd;
0896 struct nfp_meta_parsed meta;
0897 bool redir_egress = false;
0898 struct net_device *netdev;
0899 dma_addr_t new_dma_addr;
0900 u32 meta_len_xdp = 0;
0901 void *new_frag;
0902
0903 idx = D_IDX(rx_ring, rx_ring->rd_p);
0904
0905 rxd = &rx_ring->rxds[idx];
0906 if (!(rxd->rxd.meta_len_dd & PCIE_DESC_RX_DD))
0907 break;
0908
0909
0910
0911
0912 dma_rmb();
0913
0914 memset(&meta, 0, sizeof(meta));
0915
0916 rx_ring->rd_p++;
0917 pkts_polled++;
0918
0919 rxbuf = &rx_ring->rxbufs[idx];
0920
0921
0922
0923
0924
0925
0926
0927
0928
0929
0930
0931
0932 meta_len = rxd->rxd.meta_len_dd & PCIE_DESC_RX_META_LEN_MASK;
0933 data_len = le16_to_cpu(rxd->rxd.data_len);
0934 pkt_len = data_len - meta_len;
0935
0936 pkt_off = NFP_NET_RX_BUF_HEADROOM + dp->rx_dma_off;
0937 if (dp->rx_offset == NFP_NET_CFG_RX_OFFSET_DYNAMIC)
0938 pkt_off += meta_len;
0939 else
0940 pkt_off += dp->rx_offset;
0941 meta_off = pkt_off - meta_len;
0942
0943
0944 u64_stats_update_begin(&r_vec->rx_sync);
0945 r_vec->rx_pkts++;
0946 r_vec->rx_bytes += pkt_len;
0947 u64_stats_update_end(&r_vec->rx_sync);
0948
0949 if (unlikely(meta_len > NFP_NET_MAX_PREPEND ||
0950 (dp->rx_offset && meta_len > dp->rx_offset))) {
0951 nn_dp_warn(dp, "oversized RX packet metadata %u\n",
0952 meta_len);
0953 nfp_nfd3_rx_drop(dp, r_vec, rx_ring, rxbuf, NULL);
0954 continue;
0955 }
0956
0957 nfp_net_dma_sync_cpu_rx(dp, rxbuf->dma_addr + meta_off,
0958 data_len);
0959
0960 if (!dp->chained_metadata_format) {
0961 nfp_nfd3_set_hash_desc(dp->netdev, &meta,
0962 rxbuf->frag + meta_off, rxd);
0963 } else if (meta_len) {
0964 if (unlikely(nfp_nfd3_parse_meta(dp->netdev, &meta,
0965 rxbuf->frag + meta_off,
0966 rxbuf->frag + pkt_off,
0967 pkt_len, meta_len))) {
0968 nn_dp_warn(dp, "invalid RX packet metadata\n");
0969 nfp_nfd3_rx_drop(dp, r_vec, rx_ring, rxbuf,
0970 NULL);
0971 continue;
0972 }
0973 }
0974
0975 if (xdp_prog && !meta.portid) {
0976 void *orig_data = rxbuf->frag + pkt_off;
0977 unsigned int dma_off;
0978 int act;
0979
0980 xdp_prepare_buff(&xdp,
0981 rxbuf->frag + NFP_NET_RX_BUF_HEADROOM,
0982 pkt_off - NFP_NET_RX_BUF_HEADROOM,
0983 pkt_len, true);
0984
0985 act = bpf_prog_run_xdp(xdp_prog, &xdp);
0986
0987 pkt_len = xdp.data_end - xdp.data;
0988 pkt_off += xdp.data - orig_data;
0989
0990 switch (act) {
0991 case XDP_PASS:
0992 meta_len_xdp = xdp.data - xdp.data_meta;
0993 break;
0994 case XDP_TX:
0995 dma_off = pkt_off - NFP_NET_RX_BUF_HEADROOM;
0996 if (unlikely(!nfp_nfd3_tx_xdp_buf(dp, rx_ring,
0997 tx_ring,
0998 rxbuf,
0999 dma_off,
1000 pkt_len,
1001 &xdp_tx_cmpl)))
1002 trace_xdp_exception(dp->netdev,
1003 xdp_prog, act);
1004 continue;
1005 default:
1006 bpf_warn_invalid_xdp_action(dp->netdev, xdp_prog, act);
1007 fallthrough;
1008 case XDP_ABORTED:
1009 trace_xdp_exception(dp->netdev, xdp_prog, act);
1010 fallthrough;
1011 case XDP_DROP:
1012 nfp_nfd3_rx_give_one(dp, rx_ring, rxbuf->frag,
1013 rxbuf->dma_addr);
1014 continue;
1015 }
1016 }
1017
1018 if (likely(!meta.portid)) {
1019 netdev = dp->netdev;
1020 } else if (meta.portid == NFP_META_PORT_ID_CTRL) {
1021 struct nfp_net *nn = netdev_priv(dp->netdev);
1022
1023 nfp_app_ctrl_rx_raw(nn->app, rxbuf->frag + pkt_off,
1024 pkt_len);
1025 nfp_nfd3_rx_give_one(dp, rx_ring, rxbuf->frag,
1026 rxbuf->dma_addr);
1027 continue;
1028 } else {
1029 struct nfp_net *nn;
1030
1031 nn = netdev_priv(dp->netdev);
1032 netdev = nfp_app_dev_get(nn->app, meta.portid,
1033 &redir_egress);
1034 if (unlikely(!netdev)) {
1035 nfp_nfd3_rx_drop(dp, r_vec, rx_ring, rxbuf,
1036 NULL);
1037 continue;
1038 }
1039
1040 if (nfp_netdev_is_nfp_repr(netdev))
1041 nfp_repr_inc_rx_stats(netdev, pkt_len);
1042 }
1043
1044 skb = build_skb(rxbuf->frag, true_bufsz);
1045 if (unlikely(!skb)) {
1046 nfp_nfd3_rx_drop(dp, r_vec, rx_ring, rxbuf, NULL);
1047 continue;
1048 }
1049 new_frag = nfp_nfd3_napi_alloc_one(dp, &new_dma_addr);
1050 if (unlikely(!new_frag)) {
1051 nfp_nfd3_rx_drop(dp, r_vec, rx_ring, rxbuf, skb);
1052 continue;
1053 }
1054
1055 nfp_net_dma_unmap_rx(dp, rxbuf->dma_addr);
1056
1057 nfp_nfd3_rx_give_one(dp, rx_ring, new_frag, new_dma_addr);
1058
1059 skb_reserve(skb, pkt_off);
1060 skb_put(skb, pkt_len);
1061
1062 skb->mark = meta.mark;
1063 skb_set_hash(skb, meta.hash, meta.hash_type);
1064
1065 skb_record_rx_queue(skb, rx_ring->idx);
1066 skb->protocol = eth_type_trans(skb, netdev);
1067
1068 nfp_nfd3_rx_csum(dp, r_vec, rxd, &meta, skb);
1069
1070 #ifdef CONFIG_TLS_DEVICE
1071 if (rxd->rxd.flags & PCIE_DESC_RX_DECRYPTED) {
1072 skb->decrypted = true;
1073 u64_stats_update_begin(&r_vec->rx_sync);
1074 r_vec->hw_tls_rx++;
1075 u64_stats_update_end(&r_vec->rx_sync);
1076 }
1077 #endif
1078
1079 if (unlikely(!nfp_net_vlan_strip(skb, rxd, &meta))) {
1080 nfp_nfd3_rx_drop(dp, r_vec, rx_ring, NULL, skb);
1081 continue;
1082 }
1083
1084 if (meta_len_xdp)
1085 skb_metadata_set(skb, meta_len_xdp);
1086
1087 if (likely(!redir_egress)) {
1088 napi_gro_receive(&rx_ring->r_vec->napi, skb);
1089 } else {
1090 skb->dev = netdev;
1091 skb_reset_network_header(skb);
1092 __skb_push(skb, ETH_HLEN);
1093 dev_queue_xmit(skb);
1094 }
1095 }
1096
1097 if (xdp_prog) {
1098 if (tx_ring->wr_ptr_add)
1099 nfp_net_tx_xmit_more_flush(tx_ring);
1100 else if (unlikely(tx_ring->wr_p != tx_ring->rd_p) &&
1101 !xdp_tx_cmpl)
1102 if (!nfp_nfd3_xdp_complete(tx_ring))
1103 pkts_polled = budget;
1104 }
1105
1106 return pkts_polled;
1107 }
1108
1109
1110
1111
1112
1113
1114
1115
1116 int nfp_nfd3_poll(struct napi_struct *napi, int budget)
1117 {
1118 struct nfp_net_r_vector *r_vec =
1119 container_of(napi, struct nfp_net_r_vector, napi);
1120 unsigned int pkts_polled = 0;
1121
1122 if (r_vec->tx_ring)
1123 nfp_nfd3_tx_complete(r_vec->tx_ring, budget);
1124 if (r_vec->rx_ring)
1125 pkts_polled = nfp_nfd3_rx(r_vec->rx_ring, budget);
1126
1127 if (pkts_polled < budget)
1128 if (napi_complete_done(napi, pkts_polled))
1129 nfp_net_irq_unmask(r_vec->nfp_net, r_vec->irq_entry);
1130
1131 if (r_vec->nfp_net->rx_coalesce_adapt_on && r_vec->rx_ring) {
1132 struct dim_sample dim_sample = {};
1133 unsigned int start;
1134 u64 pkts, bytes;
1135
1136 do {
1137 start = u64_stats_fetch_begin(&r_vec->rx_sync);
1138 pkts = r_vec->rx_pkts;
1139 bytes = r_vec->rx_bytes;
1140 } while (u64_stats_fetch_retry(&r_vec->rx_sync, start));
1141
1142 dim_update_sample(r_vec->event_ctr, pkts, bytes, &dim_sample);
1143 net_dim(&r_vec->rx_dim, dim_sample);
1144 }
1145
1146 if (r_vec->nfp_net->tx_coalesce_adapt_on && r_vec->tx_ring) {
1147 struct dim_sample dim_sample = {};
1148 unsigned int start;
1149 u64 pkts, bytes;
1150
1151 do {
1152 start = u64_stats_fetch_begin(&r_vec->tx_sync);
1153 pkts = r_vec->tx_pkts;
1154 bytes = r_vec->tx_bytes;
1155 } while (u64_stats_fetch_retry(&r_vec->tx_sync, start));
1156
1157 dim_update_sample(r_vec->event_ctr, pkts, bytes, &dim_sample);
1158 net_dim(&r_vec->tx_dim, dim_sample);
1159 }
1160
1161 return pkts_polled;
1162 }
1163
1164
1165
1166
1167 bool
1168 nfp_nfd3_ctrl_tx_one(struct nfp_net *nn, struct nfp_net_r_vector *r_vec,
1169 struct sk_buff *skb, bool old)
1170 {
1171 unsigned int real_len = skb->len, meta_len = 0;
1172 struct nfp_net_tx_ring *tx_ring;
1173 struct nfp_nfd3_tx_buf *txbuf;
1174 struct nfp_nfd3_tx_desc *txd;
1175 struct nfp_net_dp *dp;
1176 dma_addr_t dma_addr;
1177 int wr_idx;
1178
1179 dp = &r_vec->nfp_net->dp;
1180 tx_ring = r_vec->tx_ring;
1181
1182 if (WARN_ON_ONCE(skb_shinfo(skb)->nr_frags)) {
1183 nn_dp_warn(dp, "Driver's CTRL TX does not implement gather\n");
1184 goto err_free;
1185 }
1186
1187 if (unlikely(nfp_net_tx_full(tx_ring, 1))) {
1188 u64_stats_update_begin(&r_vec->tx_sync);
1189 r_vec->tx_busy++;
1190 u64_stats_update_end(&r_vec->tx_sync);
1191 if (!old)
1192 __skb_queue_tail(&r_vec->queue, skb);
1193 else
1194 __skb_queue_head(&r_vec->queue, skb);
1195 return true;
1196 }
1197
1198 if (nfp_app_ctrl_has_meta(nn->app)) {
1199 if (unlikely(skb_headroom(skb) < 8)) {
1200 nn_dp_warn(dp, "CTRL TX on skb without headroom\n");
1201 goto err_free;
1202 }
1203 meta_len = 8;
1204 put_unaligned_be32(NFP_META_PORT_ID_CTRL, skb_push(skb, 4));
1205 put_unaligned_be32(NFP_NET_META_PORTID, skb_push(skb, 4));
1206 }
1207
1208
1209 dma_addr = dma_map_single(dp->dev, skb->data, skb_headlen(skb),
1210 DMA_TO_DEVICE);
1211 if (dma_mapping_error(dp->dev, dma_addr))
1212 goto err_dma_warn;
1213
1214 wr_idx = D_IDX(tx_ring, tx_ring->wr_p);
1215
1216
1217 txbuf = &tx_ring->txbufs[wr_idx];
1218 txbuf->skb = skb;
1219 txbuf->dma_addr = dma_addr;
1220 txbuf->fidx = -1;
1221 txbuf->pkt_cnt = 1;
1222 txbuf->real_len = real_len;
1223
1224
1225 txd = &tx_ring->txds[wr_idx];
1226 txd->offset_eop = meta_len | NFD3_DESC_TX_EOP;
1227 txd->dma_len = cpu_to_le16(skb_headlen(skb));
1228 nfp_desc_set_dma_addr_40b(txd, dma_addr);
1229 txd->data_len = cpu_to_le16(skb->len);
1230
1231 txd->flags = 0;
1232 txd->mss = 0;
1233 txd->lso_hdrlen = 0;
1234
1235 tx_ring->wr_p++;
1236 tx_ring->wr_ptr_add++;
1237 nfp_net_tx_xmit_more_flush(tx_ring);
1238
1239 return false;
1240
1241 err_dma_warn:
1242 nn_dp_warn(dp, "Failed to DMA map TX CTRL buffer\n");
1243 err_free:
1244 u64_stats_update_begin(&r_vec->tx_sync);
1245 r_vec->tx_errors++;
1246 u64_stats_update_end(&r_vec->tx_sync);
1247 dev_kfree_skb_any(skb);
1248 return false;
1249 }
1250
1251 static void __nfp_ctrl_tx_queued(struct nfp_net_r_vector *r_vec)
1252 {
1253 struct sk_buff *skb;
1254
1255 while ((skb = __skb_dequeue(&r_vec->queue)))
1256 if (nfp_nfd3_ctrl_tx_one(r_vec->nfp_net, r_vec, skb, true))
1257 return;
1258 }
1259
1260 static bool
1261 nfp_ctrl_meta_ok(struct nfp_net *nn, void *data, unsigned int meta_len)
1262 {
1263 u32 meta_type, meta_tag;
1264
1265 if (!nfp_app_ctrl_has_meta(nn->app))
1266 return !meta_len;
1267
1268 if (meta_len != 8)
1269 return false;
1270
1271 meta_type = get_unaligned_be32(data);
1272 meta_tag = get_unaligned_be32(data + 4);
1273
1274 return (meta_type == NFP_NET_META_PORTID &&
1275 meta_tag == NFP_META_PORT_ID_CTRL);
1276 }
1277
1278 static bool
1279 nfp_ctrl_rx_one(struct nfp_net *nn, struct nfp_net_dp *dp,
1280 struct nfp_net_r_vector *r_vec, struct nfp_net_rx_ring *rx_ring)
1281 {
1282 unsigned int meta_len, data_len, meta_off, pkt_len, pkt_off;
1283 struct nfp_net_rx_buf *rxbuf;
1284 struct nfp_net_rx_desc *rxd;
1285 dma_addr_t new_dma_addr;
1286 struct sk_buff *skb;
1287 void *new_frag;
1288 int idx;
1289
1290 idx = D_IDX(rx_ring, rx_ring->rd_p);
1291
1292 rxd = &rx_ring->rxds[idx];
1293 if (!(rxd->rxd.meta_len_dd & PCIE_DESC_RX_DD))
1294 return false;
1295
1296
1297
1298
1299 dma_rmb();
1300
1301 rx_ring->rd_p++;
1302
1303 rxbuf = &rx_ring->rxbufs[idx];
1304 meta_len = rxd->rxd.meta_len_dd & PCIE_DESC_RX_META_LEN_MASK;
1305 data_len = le16_to_cpu(rxd->rxd.data_len);
1306 pkt_len = data_len - meta_len;
1307
1308 pkt_off = NFP_NET_RX_BUF_HEADROOM + dp->rx_dma_off;
1309 if (dp->rx_offset == NFP_NET_CFG_RX_OFFSET_DYNAMIC)
1310 pkt_off += meta_len;
1311 else
1312 pkt_off += dp->rx_offset;
1313 meta_off = pkt_off - meta_len;
1314
1315
1316 u64_stats_update_begin(&r_vec->rx_sync);
1317 r_vec->rx_pkts++;
1318 r_vec->rx_bytes += pkt_len;
1319 u64_stats_update_end(&r_vec->rx_sync);
1320
1321 nfp_net_dma_sync_cpu_rx(dp, rxbuf->dma_addr + meta_off, data_len);
1322
1323 if (unlikely(!nfp_ctrl_meta_ok(nn, rxbuf->frag + meta_off, meta_len))) {
1324 nn_dp_warn(dp, "incorrect metadata for ctrl packet (%d)\n",
1325 meta_len);
1326 nfp_nfd3_rx_drop(dp, r_vec, rx_ring, rxbuf, NULL);
1327 return true;
1328 }
1329
1330 skb = build_skb(rxbuf->frag, dp->fl_bufsz);
1331 if (unlikely(!skb)) {
1332 nfp_nfd3_rx_drop(dp, r_vec, rx_ring, rxbuf, NULL);
1333 return true;
1334 }
1335 new_frag = nfp_nfd3_napi_alloc_one(dp, &new_dma_addr);
1336 if (unlikely(!new_frag)) {
1337 nfp_nfd3_rx_drop(dp, r_vec, rx_ring, rxbuf, skb);
1338 return true;
1339 }
1340
1341 nfp_net_dma_unmap_rx(dp, rxbuf->dma_addr);
1342
1343 nfp_nfd3_rx_give_one(dp, rx_ring, new_frag, new_dma_addr);
1344
1345 skb_reserve(skb, pkt_off);
1346 skb_put(skb, pkt_len);
1347
1348 nfp_app_ctrl_rx(nn->app, skb);
1349
1350 return true;
1351 }
1352
1353 static bool nfp_ctrl_rx(struct nfp_net_r_vector *r_vec)
1354 {
1355 struct nfp_net_rx_ring *rx_ring = r_vec->rx_ring;
1356 struct nfp_net *nn = r_vec->nfp_net;
1357 struct nfp_net_dp *dp = &nn->dp;
1358 unsigned int budget = 512;
1359
1360 while (nfp_ctrl_rx_one(nn, dp, r_vec, rx_ring) && budget--)
1361 continue;
1362
1363 return budget;
1364 }
1365
1366 void nfp_nfd3_ctrl_poll(struct tasklet_struct *t)
1367 {
1368 struct nfp_net_r_vector *r_vec = from_tasklet(r_vec, t, tasklet);
1369
1370 spin_lock(&r_vec->lock);
1371 nfp_nfd3_tx_complete(r_vec->tx_ring, 0);
1372 __nfp_ctrl_tx_queued(r_vec);
1373 spin_unlock(&r_vec->lock);
1374
1375 if (nfp_ctrl_rx(r_vec)) {
1376 nfp_net_irq_unmask(r_vec->nfp_net, r_vec->irq_entry);
1377 } else {
1378 tasklet_schedule(&r_vec->tasklet);
1379 nn_dp_warn(&r_vec->nfp_net->dp,
1380 "control message budget exceeded!\n");
1381 }
1382 }