Skip to content

Commit 12da46c

Browse files
ayalevingregkh
authored andcommitted
net/mlx5e: Mutually exclude RX-FCS and RX-port-timestamp
commit 0bc73ad upstream. 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: 102722f ("net/mlx5e: Add support for RXFCS feature flag") Signed-off-by: Aya Levin <[email protected]> Reviewed-by: Tariq Toukan <[email protected]> Reviewed-by: Moshe Shemesh <[email protected]> Signed-off-by: Saeed Mahameed <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 4f7bddf commit 12da46c

File tree

2 files changed

+60
-7
lines changed

2 files changed

+60
-7
lines changed

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

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3819,20 +3819,67 @@ static int set_feature_rx_all(struct net_device *netdev, bool enable)
38193819
return mlx5_set_port_fcs(mdev, !enable);
38203820
}
38213821

3822+
static int mlx5e_set_rx_port_ts(struct mlx5_core_dev *mdev, bool enable)
3823+
{
3824+
u32 in[MLX5_ST_SZ_DW(pcmr_reg)] = {};
3825+
bool supported, curr_state;
3826+
int err;
3827+
3828+
if (!MLX5_CAP_GEN(mdev, ports_check))
3829+
return 0;
3830+
3831+
err = mlx5_query_ports_check(mdev, in, sizeof(in));
3832+
if (err)
3833+
return err;
3834+
3835+
supported = MLX5_GET(pcmr_reg, in, rx_ts_over_crc_cap);
3836+
curr_state = MLX5_GET(pcmr_reg, in, rx_ts_over_crc);
3837+
3838+
if (!supported || enable == curr_state)
3839+
return 0;
3840+
3841+
MLX5_SET(pcmr_reg, in, local_port, 1);
3842+
MLX5_SET(pcmr_reg, in, rx_ts_over_crc, enable);
3843+
3844+
return mlx5_set_ports_check(mdev, in, sizeof(in));
3845+
}
3846+
38223847
static int set_feature_rx_fcs(struct net_device *netdev, bool enable)
38233848
{
38243849
struct mlx5e_priv *priv = netdev_priv(netdev);
3850+
struct mlx5e_channels *chs = &priv->channels;
3851+
struct mlx5_core_dev *mdev = priv->mdev;
38253852
int err;
38263853

38273854
mutex_lock(&priv->state_lock);
38283855

3829-
priv->channels.params.scatter_fcs_en = enable;
3830-
err = mlx5e_modify_channels_scatter_fcs(&priv->channels, enable);
3831-
if (err)
3832-
priv->channels.params.scatter_fcs_en = !enable;
3856+
if (enable) {
3857+
err = mlx5e_set_rx_port_ts(mdev, false);
3858+
if (err)
3859+
goto out;
38333860

3834-
mutex_unlock(&priv->state_lock);
3861+
chs->params.scatter_fcs_en = true;
3862+
err = mlx5e_modify_channels_scatter_fcs(chs, true);
3863+
if (err) {
3864+
chs->params.scatter_fcs_en = false;
3865+
mlx5e_set_rx_port_ts(mdev, true);
3866+
}
3867+
} else {
3868+
chs->params.scatter_fcs_en = false;
3869+
err = mlx5e_modify_channels_scatter_fcs(chs, false);
3870+
if (err) {
3871+
chs->params.scatter_fcs_en = true;
3872+
goto out;
3873+
}
3874+
err = mlx5e_set_rx_port_ts(mdev, true);
3875+
if (err) {
3876+
mlx5_core_warn(mdev, "Failed to set RX port timestamp %d\n", err);
3877+
err = 0;
3878+
}
3879+
}
38353880

3881+
out:
3882+
mutex_unlock(&priv->state_lock);
38363883
return err;
38373884
}
38383885

include/linux/mlx5/mlx5_ifc.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9274,16 +9274,22 @@ struct mlx5_ifc_pcmr_reg_bits {
92749274
u8 reserved_at_0[0x8];
92759275
u8 local_port[0x8];
92769276
u8 reserved_at_10[0x10];
9277+
92779278
u8 entropy_force_cap[0x1];
92789279
u8 entropy_calc_cap[0x1];
92799280
u8 entropy_gre_calc_cap[0x1];
9280-
u8 reserved_at_23[0x1b];
9281+
u8 reserved_at_23[0xf];
9282+
u8 rx_ts_over_crc_cap[0x1];
9283+
u8 reserved_at_33[0xb];
92819284
u8 fcs_cap[0x1];
92829285
u8 reserved_at_3f[0x1];
9286+
92839287
u8 entropy_force[0x1];
92849288
u8 entropy_calc[0x1];
92859289
u8 entropy_gre_calc[0x1];
9286-
u8 reserved_at_43[0x1b];
9290+
u8 reserved_at_43[0xf];
9291+
u8 rx_ts_over_crc[0x1];
9292+
u8 reserved_at_53[0xb];
92879293
u8 fcs_chk[0x1];
92889294
u8 reserved_at_5f[0x1];
92899295
};

0 commit comments

Comments
 (0)