Skip to content

Commit 94cb1eb

Browse files
Eran Ben Elishadavem330
authored andcommitted
net/mlx5e: Add support for RXALL netdev feature
Introduce new access register named Ports Check Mask Register (PCMR) to control all HW checks on port. With this register, the driver can enable/disable Hardware FCS validation. When RXALL is enabled/disabled using ndo_set_features, enable/disable fcs check at HW. User can change HW configuration using rx-all flag at ethtool. Signed-off-by: Eran Ben Elisha <[email protected]> Signed-off-by: Gal Pressman <[email protected]> Signed-off-by: Saeed Mahameed <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 0e40544 commit 94cb1eb

File tree

4 files changed

+74
-0
lines changed

4 files changed

+74
-0
lines changed

drivers/net/ethernet/mellanox/mlx5/core/en_main.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2139,6 +2139,14 @@ static int set_feature_tc_num_filters(struct net_device *netdev, bool enable)
21392139
return 0;
21402140
}
21412141

2142+
static int set_feature_rx_all(struct net_device *netdev, bool enable)
2143+
{
2144+
struct mlx5e_priv *priv = netdev_priv(netdev);
2145+
struct mlx5_core_dev *mdev = priv->mdev;
2146+
2147+
return mlx5_set_port_fcs(mdev, !enable);
2148+
}
2149+
21422150
static int mlx5e_handle_feature(struct net_device *netdev,
21432151
netdev_features_t wanted_features,
21442152
netdev_features_t feature,
@@ -2174,6 +2182,8 @@ static int mlx5e_set_features(struct net_device *netdev,
21742182
set_feature_vlan_filter);
21752183
err |= mlx5e_handle_feature(netdev, features, NETIF_F_HW_TC,
21762184
set_feature_tc_num_filters);
2185+
err |= mlx5e_handle_feature(netdev, features, NETIF_F_RXALL,
2186+
set_feature_rx_all);
21772187

21782188
return err ? -EINVAL : 0;
21792189
}
@@ -2564,6 +2574,8 @@ static void mlx5e_build_netdev(struct net_device *netdev)
25642574
{
25652575
struct mlx5e_priv *priv = netdev_priv(netdev);
25662576
struct mlx5_core_dev *mdev = priv->mdev;
2577+
bool fcs_supported;
2578+
bool fcs_enabled;
25672579

25682580
SET_NETDEV_DEV(netdev, &mdev->pdev->dev);
25692581

@@ -2607,10 +2619,18 @@ static void mlx5e_build_netdev(struct net_device *netdev)
26072619
netdev->hw_enc_features |= NETIF_F_GSO_UDP_TUNNEL;
26082620
}
26092621

2622+
mlx5_query_port_fcs(mdev, &fcs_supported, &fcs_enabled);
2623+
2624+
if (fcs_supported)
2625+
netdev->hw_features |= NETIF_F_RXALL;
2626+
26102627
netdev->features = netdev->hw_features;
26112628
if (!priv->params.lro_en)
26122629
netdev->features &= ~NETIF_F_LRO;
26132630

2631+
if (fcs_enabled)
2632+
netdev->features &= ~NETIF_F_RXALL;
2633+
26142634
#define FT_CAP(f) MLX5_CAP_FLOWTABLE(mdev, flow_table_properties_nic_receive.f)
26152635
if (FT_CAP(flow_modify_en) &&
26162636
FT_CAP(modify_root) &&

drivers/net/ethernet/mellanox/mlx5/core/port.c

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -607,3 +607,52 @@ int mlx5_query_port_wol(struct mlx5_core_dev *mdev, u8 *wol_mode)
607607
return err;
608608
}
609609
EXPORT_SYMBOL_GPL(mlx5_query_port_wol);
610+
611+
static int mlx5_query_ports_check(struct mlx5_core_dev *mdev, u32 *out,
612+
int outlen)
613+
{
614+
u32 in[MLX5_ST_SZ_DW(pcmr_reg)];
615+
616+
memset(in, 0, sizeof(in));
617+
MLX5_SET(pcmr_reg, in, local_port, 1);
618+
619+
return mlx5_core_access_reg(mdev, in, sizeof(in), out,
620+
outlen, MLX5_REG_PCMR, 0, 0);
621+
}
622+
623+
static int mlx5_set_ports_check(struct mlx5_core_dev *mdev, u32 *in, int inlen)
624+
{
625+
u32 out[MLX5_ST_SZ_DW(pcmr_reg)];
626+
627+
return mlx5_core_access_reg(mdev, in, inlen, out,
628+
sizeof(out), MLX5_REG_PCMR, 0, 1);
629+
}
630+
631+
int mlx5_set_port_fcs(struct mlx5_core_dev *mdev, u8 enable)
632+
{
633+
u32 in[MLX5_ST_SZ_DW(pcmr_reg)];
634+
635+
memset(in, 0, sizeof(in));
636+
MLX5_SET(pcmr_reg, in, local_port, 1);
637+
MLX5_SET(pcmr_reg, in, fcs_chk, enable);
638+
639+
return mlx5_set_ports_check(mdev, in, sizeof(in));
640+
}
641+
642+
void mlx5_query_port_fcs(struct mlx5_core_dev *mdev, bool *supported,
643+
bool *enabled)
644+
{
645+
u32 out[MLX5_ST_SZ_DW(pcmr_reg)];
646+
/* Default values for FW which do not support MLX5_REG_PCMR */
647+
*supported = false;
648+
*enabled = true;
649+
650+
if (!MLX5_CAP_GEN(mdev, ports_check))
651+
return;
652+
653+
if (mlx5_query_ports_check(mdev, out, sizeof(out)))
654+
return;
655+
656+
*supported = !!(MLX5_GET(pcmr_reg, out, fcs_cap));
657+
*enabled = !!(MLX5_GET(pcmr_reg, out, fcs_chk));
658+
}

include/linux/mlx5/driver.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ enum {
112112
MLX5_REG_PMPE = 0x5010,
113113
MLX5_REG_PELC = 0x500e,
114114
MLX5_REG_PVLC = 0x500f,
115+
MLX5_REG_PCMR = 0x5041,
115116
MLX5_REG_PMLP = 0, /* TBD */
116117
MLX5_REG_NODE_DESC = 0x6001,
117118
MLX5_REG_HOST_ENDIANNESS = 0x7004,

include/linux/mlx5/port.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,4 +84,8 @@ int mlx5_query_port_ets_rate_limit(struct mlx5_core_dev *mdev,
8484
int mlx5_set_port_wol(struct mlx5_core_dev *mdev, u8 wol_mode);
8585
int mlx5_query_port_wol(struct mlx5_core_dev *mdev, u8 *wol_mode);
8686

87+
int mlx5_set_port_fcs(struct mlx5_core_dev *mdev, u8 enable);
88+
void mlx5_query_port_fcs(struct mlx5_core_dev *mdev, bool *supported,
89+
bool *enabled);
90+
8791
#endif /* __MLX5_PORT_H__ */

0 commit comments

Comments
 (0)