|
Thomas Bogendoerfer |
35791e |
From: Aya Levin <ayal@nvidia.com>
|
|
Thomas Bogendoerfer |
35791e |
Date: Sun, 26 Sep 2021 17:55:41 +0300
|
|
Thomas Bogendoerfer |
35791e |
Subject: net/mlx5e: Mutually exclude RX-FCS and RX-port-timestamp
|
|
Thomas Bogendoerfer |
35791e |
Patch-mainline: v5.15-rc6
|
|
Thomas Bogendoerfer |
35791e |
Git-commit: 0bc73ad46a76ed6ece4dcacb28858e7b38561e1c
|
|
Thomas Bogendoerfer |
35791e |
References: git-fixes
|
|
Thomas Bogendoerfer |
35791e |
|
|
Thomas Bogendoerfer |
35791e |
Due to current HW arch limitations, RX-FCS (scattering FCS frame field
|
|
Thomas Bogendoerfer |
35791e |
to software) and RX-port-timestamp (improved timestamp accuracy on the
|
|
Thomas Bogendoerfer |
35791e |
receive side) can't work together.
|
|
Thomas Bogendoerfer |
35791e |
RX-port-timestamp is not controlled by the user and it is enabled by
|
|
Thomas Bogendoerfer |
35791e |
default when supported by the HW/FW.
|
|
Thomas Bogendoerfer |
35791e |
This patch sets RX-port-timestamp opposite to RX-FCS configuration.
|
|
Thomas Bogendoerfer |
35791e |
|
|
Thomas Bogendoerfer |
35791e |
Fixes: 102722fc6832 ("net/mlx5e: Add support for RXFCS feature flag")
|
|
Thomas Bogendoerfer |
35791e |
Signed-off-by: Aya Levin <ayal@nvidia.com>
|
|
Thomas Bogendoerfer |
35791e |
Reviewed-by: Tariq Toukan <tariqt@nvidia.com>
|
|
Thomas Bogendoerfer |
35791e |
Reviewed-by: Moshe Shemesh <moshe@nvidia.com>
|
|
Thomas Bogendoerfer |
35791e |
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
|
|
Thomas Bogendoerfer |
35791e |
Acked-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
|
|
Thomas Bogendoerfer |
35791e |
---
|
|
Thomas Bogendoerfer |
35791e |
drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 57 ++++++++++++++++++++--
|
|
Thomas Bogendoerfer |
35791e |
include/linux/mlx5/mlx5_ifc.h | 10 +++
|
|
Thomas Bogendoerfer |
35791e |
2 files changed, 60 insertions(+), 7 deletions(-)
|
|
Thomas Bogendoerfer |
35791e |
|
|
Thomas Bogendoerfer |
35791e |
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
|
|
Thomas Bogendoerfer |
35791e |
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
|
|
Thomas Bogendoerfer |
35791e |
@@ -3724,20 +3724,67 @@ static int set_feature_rx_all(struct net
|
|
Thomas Bogendoerfer |
35791e |
return mlx5_set_port_fcs(mdev, !enable);
|
|
Thomas Bogendoerfer |
35791e |
}
|
|
Thomas Bogendoerfer |
35791e |
|
|
Thomas Bogendoerfer |
35791e |
+static int mlx5e_set_rx_port_ts(struct mlx5_core_dev *mdev, bool enable)
|
|
Thomas Bogendoerfer |
35791e |
+{
|
|
Thomas Bogendoerfer |
35791e |
+ u32 in[MLX5_ST_SZ_DW(pcmr_reg)] = {};
|
|
Thomas Bogendoerfer |
35791e |
+ bool supported, curr_state;
|
|
Thomas Bogendoerfer |
35791e |
+ int err;
|
|
Thomas Bogendoerfer |
35791e |
+
|
|
Thomas Bogendoerfer |
35791e |
+ if (!MLX5_CAP_GEN(mdev, ports_check))
|
|
Thomas Bogendoerfer |
35791e |
+ return 0;
|
|
Thomas Bogendoerfer |
35791e |
+
|
|
Thomas Bogendoerfer |
35791e |
+ err = mlx5_query_ports_check(mdev, in, sizeof(in));
|
|
Thomas Bogendoerfer |
35791e |
+ if (err)
|
|
Thomas Bogendoerfer |
35791e |
+ return err;
|
|
Thomas Bogendoerfer |
35791e |
+
|
|
Thomas Bogendoerfer |
35791e |
+ supported = MLX5_GET(pcmr_reg, in, rx_ts_over_crc_cap);
|
|
Thomas Bogendoerfer |
35791e |
+ curr_state = MLX5_GET(pcmr_reg, in, rx_ts_over_crc);
|
|
Thomas Bogendoerfer |
35791e |
+
|
|
Thomas Bogendoerfer |
35791e |
+ if (!supported || enable == curr_state)
|
|
Thomas Bogendoerfer |
35791e |
+ return 0;
|
|
Thomas Bogendoerfer |
35791e |
+
|
|
Thomas Bogendoerfer |
35791e |
+ MLX5_SET(pcmr_reg, in, local_port, 1);
|
|
Thomas Bogendoerfer |
35791e |
+ MLX5_SET(pcmr_reg, in, rx_ts_over_crc, enable);
|
|
Thomas Bogendoerfer |
35791e |
+
|
|
Thomas Bogendoerfer |
35791e |
+ return mlx5_set_ports_check(mdev, in, sizeof(in));
|
|
Thomas Bogendoerfer |
35791e |
+}
|
|
Thomas Bogendoerfer |
35791e |
+
|
|
Thomas Bogendoerfer |
35791e |
static int set_feature_rx_fcs(struct net_device *netdev, bool enable)
|
|
Thomas Bogendoerfer |
35791e |
{
|
|
Thomas Bogendoerfer |
35791e |
struct mlx5e_priv *priv = netdev_priv(netdev);
|
|
Thomas Bogendoerfer |
35791e |
+ struct mlx5e_channels *chs = &priv->channels;
|
|
Thomas Bogendoerfer |
35791e |
+ struct mlx5_core_dev *mdev = priv->mdev;
|
|
Thomas Bogendoerfer |
35791e |
int err;
|
|
Thomas Bogendoerfer |
35791e |
|
|
Thomas Bogendoerfer |
35791e |
mutex_lock(&priv->state_lock);
|
|
Thomas Bogendoerfer |
35791e |
|
|
Thomas Bogendoerfer |
35791e |
- priv->channels.params.scatter_fcs_en = enable;
|
|
Thomas Bogendoerfer |
35791e |
- err = mlx5e_modify_channels_scatter_fcs(&priv->channels, enable);
|
|
Thomas Bogendoerfer |
35791e |
- if (err)
|
|
Thomas Bogendoerfer |
35791e |
- priv->channels.params.scatter_fcs_en = !enable;
|
|
Thomas Bogendoerfer |
35791e |
+ if (enable) {
|
|
Thomas Bogendoerfer |
35791e |
+ err = mlx5e_set_rx_port_ts(mdev, false);
|
|
Thomas Bogendoerfer |
35791e |
+ if (err)
|
|
Thomas Bogendoerfer |
35791e |
+ goto out;
|
|
Thomas Bogendoerfer |
35791e |
+
|
|
Thomas Bogendoerfer |
35791e |
+ chs->params.scatter_fcs_en = true;
|
|
Thomas Bogendoerfer |
35791e |
+ err = mlx5e_modify_channels_scatter_fcs(chs, true);
|
|
Thomas Bogendoerfer |
35791e |
+ if (err) {
|
|
Thomas Bogendoerfer |
35791e |
+ chs->params.scatter_fcs_en = false;
|
|
Thomas Bogendoerfer |
35791e |
+ mlx5e_set_rx_port_ts(mdev, true);
|
|
Thomas Bogendoerfer |
35791e |
+ }
|
|
Thomas Bogendoerfer |
35791e |
+ } else {
|
|
Thomas Bogendoerfer |
35791e |
+ chs->params.scatter_fcs_en = false;
|
|
Thomas Bogendoerfer |
35791e |
+ err = mlx5e_modify_channels_scatter_fcs(chs, false);
|
|
Thomas Bogendoerfer |
35791e |
+ if (err) {
|
|
Thomas Bogendoerfer |
35791e |
+ chs->params.scatter_fcs_en = true;
|
|
Thomas Bogendoerfer |
35791e |
+ goto out;
|
|
Thomas Bogendoerfer |
35791e |
+ }
|
|
Thomas Bogendoerfer |
35791e |
+ err = mlx5e_set_rx_port_ts(mdev, true);
|
|
Thomas Bogendoerfer |
35791e |
+ if (err) {
|
|
Thomas Bogendoerfer |
35791e |
+ mlx5_core_warn(mdev, "Failed to set RX port timestamp %d\n", err);
|
|
Thomas Bogendoerfer |
35791e |
+ err = 0;
|
|
Thomas Bogendoerfer |
35791e |
+ }
|
|
Thomas Bogendoerfer |
35791e |
+ }
|
|
Thomas Bogendoerfer |
35791e |
|
|
Thomas Bogendoerfer |
35791e |
+out:
|
|
Thomas Bogendoerfer |
35791e |
mutex_unlock(&priv->state_lock);
|
|
Thomas Bogendoerfer |
35791e |
-
|
|
Thomas Bogendoerfer |
35791e |
return err;
|
|
Thomas Bogendoerfer |
35791e |
}
|
|
Thomas Bogendoerfer |
35791e |
|
|
Thomas Bogendoerfer |
35791e |
--- a/include/linux/mlx5/mlx5_ifc.h
|
|
Thomas Bogendoerfer |
35791e |
+++ b/include/linux/mlx5/mlx5_ifc.h
|
|
Thomas Bogendoerfer |
35791e |
@@ -9174,16 +9174,22 @@ struct mlx5_ifc_pcmr_reg_bits {
|
|
Thomas Bogendoerfer |
35791e |
u8 reserved_at_0[0x8];
|
|
Thomas Bogendoerfer |
35791e |
u8 local_port[0x8];
|
|
Thomas Bogendoerfer |
35791e |
u8 reserved_at_10[0x10];
|
|
Thomas Bogendoerfer |
35791e |
+
|
|
Thomas Bogendoerfer |
35791e |
u8 entropy_force_cap[0x1];
|
|
Thomas Bogendoerfer |
35791e |
u8 entropy_calc_cap[0x1];
|
|
Thomas Bogendoerfer |
35791e |
u8 entropy_gre_calc_cap[0x1];
|
|
Thomas Bogendoerfer |
35791e |
- u8 reserved_at_23[0x1b];
|
|
Thomas Bogendoerfer |
35791e |
+ u8 reserved_at_23[0xf];
|
|
Thomas Bogendoerfer |
35791e |
+ u8 rx_ts_over_crc_cap[0x1];
|
|
Thomas Bogendoerfer |
35791e |
+ u8 reserved_at_33[0xb];
|
|
Thomas Bogendoerfer |
35791e |
u8 fcs_cap[0x1];
|
|
Thomas Bogendoerfer |
35791e |
u8 reserved_at_3f[0x1];
|
|
Thomas Bogendoerfer |
35791e |
+
|
|
Thomas Bogendoerfer |
35791e |
u8 entropy_force[0x1];
|
|
Thomas Bogendoerfer |
35791e |
u8 entropy_calc[0x1];
|
|
Thomas Bogendoerfer |
35791e |
u8 entropy_gre_calc[0x1];
|
|
Thomas Bogendoerfer |
35791e |
- u8 reserved_at_43[0x1b];
|
|
Thomas Bogendoerfer |
35791e |
+ u8 reserved_at_43[0xf];
|
|
Thomas Bogendoerfer |
35791e |
+ u8 rx_ts_over_crc[0x1];
|
|
Thomas Bogendoerfer |
35791e |
+ u8 reserved_at_53[0xb];
|
|
Thomas Bogendoerfer |
35791e |
u8 fcs_chk[0x1];
|
|
Thomas Bogendoerfer |
35791e |
u8 reserved_at_5f[0x1];
|
|
Thomas Bogendoerfer |
35791e |
};
|