Commit 0bc73ad4 authored by Aya Levin's avatar Aya Levin Committed by Saeed Mahameed

net/mlx5e: Mutually exclude RX-FCS and RX-port-timestamp

Due to current HW arch limitations, RX-FCS (scattering FCS frame field
to software) and RX-port-timestamp (improved timestamp accuracy on the
receive side) can't work together.
RX-port-timestamp is not controlled by the user and it is enabled by
default when supported by the HW/FW.
This patch sets RX-port-timestamp opposite to RX-FCS configuration.

Fixes: 102722fc ("net/mlx5e: Add support for RXFCS feature flag")
Signed-off-by: default avatarAya Levin <ayal@nvidia.com>
Reviewed-by: default avatarTariq Toukan <tariqt@nvidia.com>
Reviewed-by: default avatarMoshe Shemesh <moshe@nvidia.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
parent b2107cdc
...@@ -3325,20 +3325,67 @@ static int set_feature_rx_all(struct net_device *netdev, bool enable) ...@@ -3325,20 +3325,67 @@ static int set_feature_rx_all(struct net_device *netdev, bool enable)
return mlx5_set_port_fcs(mdev, !enable); return mlx5_set_port_fcs(mdev, !enable);
} }
static int mlx5e_set_rx_port_ts(struct mlx5_core_dev *mdev, bool enable)
{
u32 in[MLX5_ST_SZ_DW(pcmr_reg)] = {};
bool supported, curr_state;
int err;
if (!MLX5_CAP_GEN(mdev, ports_check))
return 0;
err = mlx5_query_ports_check(mdev, in, sizeof(in));
if (err)
return err;
supported = MLX5_GET(pcmr_reg, in, rx_ts_over_crc_cap);
curr_state = MLX5_GET(pcmr_reg, in, rx_ts_over_crc);
if (!supported || enable == curr_state)
return 0;
MLX5_SET(pcmr_reg, in, local_port, 1);
MLX5_SET(pcmr_reg, in, rx_ts_over_crc, enable);
return mlx5_set_ports_check(mdev, in, sizeof(in));
}
static int set_feature_rx_fcs(struct net_device *netdev, bool enable) static int set_feature_rx_fcs(struct net_device *netdev, bool enable)
{ {
struct mlx5e_priv *priv = netdev_priv(netdev); struct mlx5e_priv *priv = netdev_priv(netdev);
struct mlx5e_channels *chs = &priv->channels;
struct mlx5_core_dev *mdev = priv->mdev;
int err; int err;
mutex_lock(&priv->state_lock); mutex_lock(&priv->state_lock);
priv->channels.params.scatter_fcs_en = enable; if (enable) {
err = mlx5e_modify_channels_scatter_fcs(&priv->channels, enable); err = mlx5e_set_rx_port_ts(mdev, false);
if (err) if (err)
priv->channels.params.scatter_fcs_en = !enable; goto out;
mutex_unlock(&priv->state_lock); chs->params.scatter_fcs_en = true;
err = mlx5e_modify_channels_scatter_fcs(chs, true);
if (err) {
chs->params.scatter_fcs_en = false;
mlx5e_set_rx_port_ts(mdev, true);
}
} else {
chs->params.scatter_fcs_en = false;
err = mlx5e_modify_channels_scatter_fcs(chs, false);
if (err) {
chs->params.scatter_fcs_en = true;
goto out;
}
err = mlx5e_set_rx_port_ts(mdev, true);
if (err) {
mlx5_core_warn(mdev, "Failed to set RX port timestamp %d\n", err);
err = 0;
}
}
out:
mutex_unlock(&priv->state_lock);
return err; return err;
} }
......
...@@ -9475,16 +9475,22 @@ struct mlx5_ifc_pcmr_reg_bits { ...@@ -9475,16 +9475,22 @@ struct mlx5_ifc_pcmr_reg_bits {
u8 reserved_at_0[0x8]; u8 reserved_at_0[0x8];
u8 local_port[0x8]; u8 local_port[0x8];
u8 reserved_at_10[0x10]; u8 reserved_at_10[0x10];
u8 entropy_force_cap[0x1]; u8 entropy_force_cap[0x1];
u8 entropy_calc_cap[0x1]; u8 entropy_calc_cap[0x1];
u8 entropy_gre_calc_cap[0x1]; u8 entropy_gre_calc_cap[0x1];
u8 reserved_at_23[0x1b]; u8 reserved_at_23[0xf];
u8 rx_ts_over_crc_cap[0x1];
u8 reserved_at_33[0xb];
u8 fcs_cap[0x1]; u8 fcs_cap[0x1];
u8 reserved_at_3f[0x1]; u8 reserved_at_3f[0x1];
u8 entropy_force[0x1]; u8 entropy_force[0x1];
u8 entropy_calc[0x1]; u8 entropy_calc[0x1];
u8 entropy_gre_calc[0x1]; u8 entropy_gre_calc[0x1];
u8 reserved_at_43[0x1b]; u8 reserved_at_43[0xf];
u8 rx_ts_over_crc[0x1];
u8 reserved_at_53[0xb];
u8 fcs_chk[0x1]; u8 fcs_chk[0x1];
u8 reserved_at_5f[0x1]; u8 reserved_at_5f[0x1];
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment