@@ -1354,17 +1354,28 @@ static int nfp_net_rx_csum_has_errors(u16 flags)
1354
1354
* @dp: NFP Net data path struct
1355
1355
* @r_vec: per-ring structure
1356
1356
* @rxd: Pointer to RX descriptor
1357
+ * @meta: Parsed metadata prepend
1357
1358
* @skb: Pointer to SKB
1358
1359
*/
1359
1360
static void nfp_net_rx_csum (struct nfp_net_dp * dp ,
1360
1361
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 )
1362
1364
{
1363
1365
skb_checksum_none_assert (skb );
1364
1366
1365
1367
if (!(dp -> netdev -> features & NETIF_F_RXCSUM ))
1366
1368
return ;
1367
1369
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
+
1368
1379
if (nfp_net_rx_csum_has_errors (le16_to_cpu (rxd -> rxd .flags ))) {
1369
1380
u64_stats_update_begin (& r_vec -> rx_sync );
1370
1381
r_vec -> hw_csum_rx_error ++ ;
@@ -1449,6 +1460,12 @@ nfp_net_parse_meta(struct net_device *netdev, struct nfp_meta_parsed *meta,
1449
1460
meta -> mark = get_unaligned_be32 (data );
1450
1461
data += 4 ;
1451
1462
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 ;
1452
1469
default :
1453
1470
return NULL ;
1454
1471
}
@@ -1712,7 +1729,7 @@ static int nfp_net_rx(struct nfp_net_rx_ring *rx_ring, int budget)
1712
1729
skb_record_rx_queue (skb , rx_ring -> idx );
1713
1730
skb -> protocol = eth_type_trans (skb , dp -> netdev );
1714
1731
1715
- nfp_net_rx_csum (dp , r_vec , rxd , skb );
1732
+ nfp_net_rx_csum (dp , r_vec , rxd , & meta , skb );
1716
1733
1717
1734
if (rxd -> rxd .flags & PCIE_DESC_RX_VLAN )
1718
1735
__vlan_hwaccel_put_tag (skb , htons (ETH_P_8021Q ),
@@ -2712,9 +2729,9 @@ static int nfp_net_set_features(struct net_device *netdev,
2712
2729
2713
2730
if (changed & NETIF_F_RXCSUM ) {
2714
2731
if (features & NETIF_F_RXCSUM )
2715
- new_ctrl |= NFP_NET_CFG_CTRL_RXCSUM ;
2732
+ new_ctrl |= nn -> cap & NFP_NET_CFG_CTRL_RXCSUM_ANY ;
2716
2733
else
2717
- new_ctrl &= ~NFP_NET_CFG_CTRL_RXCSUM ;
2734
+ new_ctrl &= ~NFP_NET_CFG_CTRL_RXCSUM_ANY ;
2718
2735
}
2719
2736
2720
2737
if (changed & (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM )) {
@@ -3035,7 +3052,7 @@ void nfp_net_info(struct nfp_net *nn)
3035
3052
nn -> fw_ver .resv , nn -> fw_ver .class ,
3036
3053
nn -> fw_ver .major , nn -> fw_ver .minor ,
3037
3054
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" ,
3039
3056
nn -> cap ,
3040
3057
nn -> cap & NFP_NET_CFG_CTRL_PROMISC ? "PROMISC " : "" ,
3041
3058
nn -> cap & NFP_NET_CFG_CTRL_L2BC ? "L2BCFILT " : "" ,
@@ -3055,7 +3072,9 @@ void nfp_net_info(struct nfp_net *nn)
3055
3072
nn -> cap & NFP_NET_CFG_CTRL_IRQMOD ? "IRQMOD " : "" ,
3056
3073
nn -> cap & NFP_NET_CFG_CTRL_VXLAN ? "VXLAN " : "" ,
3057
3074
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 " : "" );
3059
3078
}
3060
3079
3061
3080
/**
@@ -3246,9 +3265,9 @@ int nfp_net_netdev_init(struct net_device *netdev)
3246
3265
* supported. By default we enable most features.
3247
3266
*/
3248
3267
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 ) {
3250
3269
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 ;
3252
3271
}
3253
3272
if (nn -> cap & NFP_NET_CFG_CTRL_TXCSUM ) {
3254
3273
netdev -> hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM ;
0 commit comments