| From f89713bd7279018c47fd8b7f8901228ef25f15fc Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 14 Dec 2022 16:02:57 +0200 |
| Subject: net/mlx5e: Fix hw mtu initializing at XDP SQ allocation |
| |
| From: Adham Faris <afaris@nvidia.com> |
| |
| [ Upstream commit 1e267ab88dc44c48f556218f7b7f14c76f7aa066 ] |
| |
| Current xdp xmit functions logic (mlx5e_xmit_xdp_frame_mpwqe or |
| mlx5e_xmit_xdp_frame), validates xdp packet length by comparing it to |
| hw mtu (configured at xdp sq allocation) before xmiting it. This check |
| does not account for ethernet fcs length (calculated and filled by the |
| nic). Hence, when we try sending packets with length > (hw-mtu - |
| ethernet-fcs-size), the device port drops it and tx_errors_phy is |
| incremented. Desired behavior is to catch these packets and drop them |
| by the driver. |
| |
| Fix this behavior in XDP SQ allocation function (mlx5e_alloc_xdpsq) by |
| subtracting ethernet FCS header size (4 Bytes) from current hw mtu |
| value, since ethernet FCS is calculated and written to ethernet frames |
| by the nic. |
| |
| Fixes: d8bec2b29a82 ("net/mlx5e: Support bpf_xdp_adjust_head()") |
| Signed-off-by: Adham Faris <afaris@nvidia.com> |
| Reviewed-by: Tariq Toukan <tariqt@nvidia.com> |
| Signed-off-by: Saeed Mahameed <saeedm@nvidia.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c |
| index 5e41dfdf79c8..951ede433813 100644 |
| --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c |
| +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c |
| @@ -1298,7 +1298,7 @@ static int mlx5e_alloc_xdpsq(struct mlx5e_channel *c, |
| sq->channel = c; |
| sq->uar_map = mdev->mlx5e_res.hw_objs.bfreg.map; |
| sq->min_inline_mode = params->tx_min_inline_mode; |
| - sq->hw_mtu = MLX5E_SW2HW_MTU(params, params->sw_mtu); |
| + sq->hw_mtu = MLX5E_SW2HW_MTU(params, params->sw_mtu) - ETH_FCS_LEN; |
| sq->xsk_pool = xsk_pool; |
| |
| sq->stats = sq->xsk_pool ? |
| -- |
| 2.35.1 |
| |