Skip to content

Commit ddb98d9

Browse files
Jakub Kicinskidavem330
authored andcommitted
nfp: add CHECKSUM_COMPLETE support
Introduce NFP_NET_CFG_CTRL_CSUM_COMPLETE capability and implement parsing of CHECKSUM_COMPLETE metadata. Signed-off-by: Jakub Kicinski <[email protected]> Signed-off-by: Edwin Peer <[email protected]> Reviewed-by: Simon Horman <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 611bdd4 commit ddb98d9

File tree

3 files changed

+36
-10
lines changed

3 files changed

+36
-10
lines changed

drivers/net/ethernet/netronome/nfp/nfp_net.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -292,9 +292,11 @@ struct nfp_net_rx_desc {
292292
#define NFP_NET_META_FIELD_MASK GENMASK(NFP_NET_META_FIELD_SIZE - 1, 0)
293293

294294
struct nfp_meta_parsed {
295-
u32 hash_type;
295+
u8 hash_type;
296+
u8 csum_type;
296297
u32 hash;
297298
u32 mark;
299+
__wsum csum;
298300
};
299301

300302
struct nfp_net_rx_hash {

drivers/net/ethernet/netronome/nfp/nfp_net_common.c

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1354,17 +1354,28 @@ static int nfp_net_rx_csum_has_errors(u16 flags)
13541354
* @dp: NFP Net data path struct
13551355
* @r_vec: per-ring structure
13561356
* @rxd: Pointer to RX descriptor
1357+
* @meta: Parsed metadata prepend
13571358
* @skb: Pointer to SKB
13581359
*/
13591360
static void nfp_net_rx_csum(struct nfp_net_dp *dp,
13601361
struct nfp_net_r_vector *r_vec,
1361-
struct nfp_net_rx_desc *rxd, struct sk_buff *skb)
1362+
struct nfp_net_rx_desc *rxd,
1363+
struct nfp_meta_parsed *meta, struct sk_buff *skb)
13621364
{
13631365
skb_checksum_none_assert(skb);
13641366

13651367
if (!(dp->netdev->features & NETIF_F_RXCSUM))
13661368
return;
13671369

1370+
if (meta->csum_type) {
1371+
skb->ip_summed = meta->csum_type;
1372+
skb->csum = meta->csum;
1373+
u64_stats_update_begin(&r_vec->rx_sync);
1374+
r_vec->hw_csum_rx_ok++;
1375+
u64_stats_update_end(&r_vec->rx_sync);
1376+
return;
1377+
}
1378+
13681379
if (nfp_net_rx_csum_has_errors(le16_to_cpu(rxd->rxd.flags))) {
13691380
u64_stats_update_begin(&r_vec->rx_sync);
13701381
r_vec->hw_csum_rx_error++;
@@ -1449,6 +1460,12 @@ nfp_net_parse_meta(struct net_device *netdev, struct nfp_meta_parsed *meta,
14491460
meta->mark = get_unaligned_be32(data);
14501461
data += 4;
14511462
break;
1463+
case NFP_NET_META_CSUM:
1464+
meta->csum_type = CHECKSUM_COMPLETE;
1465+
meta->csum =
1466+
(__force __wsum)__get_unaligned_cpu32(data);
1467+
data += 4;
1468+
break;
14521469
default:
14531470
return NULL;
14541471
}
@@ -1712,7 +1729,7 @@ static int nfp_net_rx(struct nfp_net_rx_ring *rx_ring, int budget)
17121729
skb_record_rx_queue(skb, rx_ring->idx);
17131730
skb->protocol = eth_type_trans(skb, dp->netdev);
17141731

1715-
nfp_net_rx_csum(dp, r_vec, rxd, skb);
1732+
nfp_net_rx_csum(dp, r_vec, rxd, &meta, skb);
17161733

17171734
if (rxd->rxd.flags & PCIE_DESC_RX_VLAN)
17181735
__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q),
@@ -2712,9 +2729,9 @@ static int nfp_net_set_features(struct net_device *netdev,
27122729

27132730
if (changed & NETIF_F_RXCSUM) {
27142731
if (features & NETIF_F_RXCSUM)
2715-
new_ctrl |= NFP_NET_CFG_CTRL_RXCSUM;
2732+
new_ctrl |= nn->cap & NFP_NET_CFG_CTRL_RXCSUM_ANY;
27162733
else
2717-
new_ctrl &= ~NFP_NET_CFG_CTRL_RXCSUM;
2734+
new_ctrl &= ~NFP_NET_CFG_CTRL_RXCSUM_ANY;
27182735
}
27192736

27202737
if (changed & (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM)) {
@@ -3035,7 +3052,7 @@ void nfp_net_info(struct nfp_net *nn)
30353052
nn->fw_ver.resv, nn->fw_ver.class,
30363053
nn->fw_ver.major, nn->fw_ver.minor,
30373054
nn->max_mtu);
3038-
nn_info(nn, "CAP: %#x %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
3055+
nn_info(nn, "CAP: %#x %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
30393056
nn->cap,
30403057
nn->cap & NFP_NET_CFG_CTRL_PROMISC ? "PROMISC " : "",
30413058
nn->cap & NFP_NET_CFG_CTRL_L2BC ? "L2BCFILT " : "",
@@ -3055,7 +3072,9 @@ void nfp_net_info(struct nfp_net *nn)
30553072
nn->cap & NFP_NET_CFG_CTRL_IRQMOD ? "IRQMOD " : "",
30563073
nn->cap & NFP_NET_CFG_CTRL_VXLAN ? "VXLAN " : "",
30573074
nn->cap & NFP_NET_CFG_CTRL_NVGRE ? "NVGRE " : "",
3058-
nfp_net_ebpf_capable(nn) ? "BPF " : "");
3075+
nfp_net_ebpf_capable(nn) ? "BPF " : "",
3076+
nn->cap & NFP_NET_CFG_CTRL_CSUM_COMPLETE ?
3077+
"RXCSUM_COMPLETE " : "");
30593078
}
30603079

30613080
/**
@@ -3246,9 +3265,9 @@ int nfp_net_netdev_init(struct net_device *netdev)
32463265
* supported. By default we enable most features.
32473266
*/
32483267
netdev->hw_features = NETIF_F_HIGHDMA;
3249-
if (nn->cap & NFP_NET_CFG_CTRL_RXCSUM) {
3268+
if (nn->cap & NFP_NET_CFG_CTRL_RXCSUM_ANY) {
32503269
netdev->hw_features |= NETIF_F_RXCSUM;
3251-
nn->dp.ctrl |= NFP_NET_CFG_CTRL_RXCSUM;
3270+
nn->dp.ctrl |= nn->cap & NFP_NET_CFG_CTRL_RXCSUM_ANY;
32523271
}
32533272
if (nn->cap & NFP_NET_CFG_CTRL_TXCSUM) {
32543273
netdev->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;

drivers/net/ethernet/netronome/nfp/nfp_net_ctrl.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
#define NFP_NET_META_FIELD_SIZE 4
7272
#define NFP_NET_META_HASH 1 /* next field carries hash type */
7373
#define NFP_NET_META_MARK 2
74+
#define NFP_NET_META_CSUM 6 /* checksum complete type */
7475

7576
/**
7677
* Hash type pre-pended when a RSS hash was computed
@@ -133,12 +134,16 @@
133134
#define NFP_NET_CFG_CTRL_BPF (0x1 << 27) /* BPF offload capable */
134135
#define NFP_NET_CFG_CTRL_LSO2 (0x1 << 28) /* LSO/TSO (version 2) */
135136
#define NFP_NET_CFG_CTRL_RSS2 (0x1 << 29) /* RSS (version 2) */
137+
#define NFP_NET_CFG_CTRL_CSUM_COMPLETE (0x1 << 30) /* Checksum complete */
136138

137139
#define NFP_NET_CFG_CTRL_LSO_ANY (NFP_NET_CFG_CTRL_LSO | \
138140
NFP_NET_CFG_CTRL_LSO2)
139141
#define NFP_NET_CFG_CTRL_RSS_ANY (NFP_NET_CFG_CTRL_RSS | \
140142
NFP_NET_CFG_CTRL_RSS2)
141-
#define NFP_NET_CFG_CTRL_CHAIN_META NFP_NET_CFG_CTRL_RSS2
143+
#define NFP_NET_CFG_CTRL_RXCSUM_ANY (NFP_NET_CFG_CTRL_RXCSUM | \
144+
NFP_NET_CFG_CTRL_CSUM_COMPLETE)
145+
#define NFP_NET_CFG_CTRL_CHAIN_META (NFP_NET_CFG_CTRL_RSS2 | \
146+
NFP_NET_CFG_CTRL_CSUM_COMPLETE)
142147

143148
#define NFP_NET_CFG_UPDATE 0x0004
144149
#define NFP_NET_CFG_UPDATE_GEN (0x1 << 0) /* General update */

0 commit comments

Comments
 (0)