1 From f3f8c009a5f039371341bc22e98b6b74490a7c6d Mon Sep 17 00:00:00 2001
2 From: Huy Nguyen <huyn@mellanox.com>
3 Date: Thu, 7 Mar 2019 14:07:32 -0600
4 Subject: net/mlx5e: Update xon formula
6 [ Upstream commit e28408e98bced123038857b6e3c81fa12a2e3e68 ]
8 Set xon = xoff - netdev's max_mtu.
9 netdev's max_mtu will give enough time for the pause frame to
12 Fixes: 0696d60853d5 ("net/mlx5e: Receive buffer configuration")
13 Signed-off-by: Huy Nguyen <huyn@mellanox.com>
14 Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
15 Signed-off-by: Sasha Levin <sashal@kernel.org>
17 .../mellanox/mlx5/core/en/port_buffer.c | 28 +++++++++++--------
18 1 file changed, 16 insertions(+), 12 deletions(-)
20 diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.c b/drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.c
21 index f00de0c987cd..4ab0d030b544 100644
22 --- a/drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.c
23 +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.c
24 @@ -143,7 +143,7 @@ static u32 calculate_xoff(struct mlx5e_priv *priv, unsigned int mtu)
27 static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer,
28 - u32 xoff, unsigned int mtu)
29 + u32 xoff, unsigned int max_mtu)
33 @@ -155,11 +155,12 @@ static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer,
36 if (port_buffer->buffer[i].size <
37 - (xoff + mtu + (1 << MLX5E_BUFFER_CELL_SHIFT)))
38 + (xoff + max_mtu + (1 << MLX5E_BUFFER_CELL_SHIFT)))
41 port_buffer->buffer[i].xoff = port_buffer->buffer[i].size - xoff;
42 - port_buffer->buffer[i].xon = port_buffer->buffer[i].xoff - mtu;
43 + port_buffer->buffer[i].xon =
44 + port_buffer->buffer[i].xoff - max_mtu;
48 @@ -167,7 +168,7 @@ static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer,
51 * update_buffer_lossy()
53 + * max_mtu: netdev's max_mtu
54 * pfc_en: <input> current pfc configuration
55 * buffer: <input> current prio to buffer mapping
56 * xoff: <input> xoff value
57 @@ -184,7 +185,7 @@ static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer,
58 * Return 0 if no error.
59 * Set change to true if buffer configuration is modified.
61 -static int update_buffer_lossy(unsigned int mtu,
62 +static int update_buffer_lossy(unsigned int max_mtu,
63 u8 pfc_en, u8 *buffer, u32 xoff,
64 struct mlx5e_port_buffer *port_buffer,
66 @@ -221,7 +222,7 @@ static int update_buffer_lossy(unsigned int mtu,
70 - err = update_xoff_threshold(port_buffer, xoff, mtu);
71 + err = update_xoff_threshold(port_buffer, xoff, max_mtu);
75 @@ -231,6 +232,7 @@ static int update_buffer_lossy(unsigned int mtu,
79 +#define MINIMUM_MAX_MTU 9216
80 int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
81 u32 change, unsigned int mtu,
83 @@ -242,12 +244,14 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
84 bool update_prio2buffer = false;
85 u8 buffer[MLX5E_MAX_PRIORITY];
86 bool update_buffer = false;
87 + unsigned int max_mtu;
93 mlx5e_dbg(HW, priv, "%s: change=%x\n", __func__, change);
94 + max_mtu = max_t(unsigned int, priv->netdev->max_mtu, MINIMUM_MAX_MTU);
96 err = mlx5e_port_query_buffer(priv, &port_buffer);
98 @@ -255,7 +259,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
100 if (change & MLX5E_PORT_BUFFER_CABLE_LEN) {
101 update_buffer = true;
102 - err = update_xoff_threshold(&port_buffer, xoff, mtu);
103 + err = update_xoff_threshold(&port_buffer, xoff, max_mtu);
107 @@ -265,7 +269,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
111 - err = update_buffer_lossy(mtu, pfc->pfc_en, buffer, xoff,
112 + err = update_buffer_lossy(max_mtu, pfc->pfc_en, buffer, xoff,
113 &port_buffer, &update_buffer);
116 @@ -277,8 +281,8 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
120 - err = update_buffer_lossy(mtu, curr_pfc_en, prio2buffer, xoff,
121 - &port_buffer, &update_buffer);
122 + err = update_buffer_lossy(max_mtu, curr_pfc_en, prio2buffer,
123 + xoff, &port_buffer, &update_buffer);
127 @@ -302,7 +306,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
130 update_buffer = true;
131 - err = update_xoff_threshold(&port_buffer, xoff, mtu);
132 + err = update_xoff_threshold(&port_buffer, xoff, max_mtu);
136 @@ -310,7 +314,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
137 /* Need to update buffer configuration if xoff value is changed */
138 if (!update_buffer && xoff != priv->dcbx.xoff) {
139 update_buffer = true;
140 - err = update_xoff_threshold(&port_buffer, xoff, mtu);
141 + err = update_xoff_threshold(&port_buffer, xoff, max_mtu);