]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - releases/4.19.35/net-mlx5e-update-xon-formula.patch
Linux 4.19.35
[thirdparty/kernel/stable-queue.git] / releases / 4.19.35 / net-mlx5e-update-xon-formula.patch
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
5
6 [ Upstream commit e28408e98bced123038857b6e3c81fa12a2e3e68 ]
7
8 Set xon = xoff - netdev's max_mtu.
9 netdev's max_mtu will give enough time for the pause frame to
10 arrive at the sender.
11
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>
16 ---
17 .../mellanox/mlx5/core/en/port_buffer.c | 28 +++++++++++--------
18 1 file changed, 16 insertions(+), 12 deletions(-)
19
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)
25 }
26
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)
30 {
31 int i;
32
33 @@ -155,11 +155,12 @@ static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer,
34 }
35
36 if (port_buffer->buffer[i].size <
37 - (xoff + mtu + (1 << MLX5E_BUFFER_CELL_SHIFT)))
38 + (xoff + max_mtu + (1 << MLX5E_BUFFER_CELL_SHIFT)))
39 return -ENOMEM;
40
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;
45 }
46
47 return 0;
48 @@ -167,7 +168,7 @@ static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer,
49
50 /**
51 * update_buffer_lossy()
52 - * mtu: device's MTU
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.
60 */
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,
65 bool *change)
66 @@ -221,7 +222,7 @@ static int update_buffer_lossy(unsigned int mtu,
67 }
68
69 if (changed) {
70 - err = update_xoff_threshold(port_buffer, xoff, mtu);
71 + err = update_xoff_threshold(port_buffer, xoff, max_mtu);
72 if (err)
73 return err;
74
75 @@ -231,6 +232,7 @@ static int update_buffer_lossy(unsigned int mtu,
76 return 0;
77 }
78
79 +#define MINIMUM_MAX_MTU 9216
80 int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
81 u32 change, unsigned int mtu,
82 struct ieee_pfc *pfc,
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;
88 u32 total_used = 0;
89 u8 curr_pfc_en;
90 int err;
91 int i;
92
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);
95
96 err = mlx5e_port_query_buffer(priv, &port_buffer);
97 if (err)
98 @@ -255,7 +259,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
99
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);
104 if (err)
105 return err;
106 }
107 @@ -265,7 +269,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
108 if (err)
109 return err;
110
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);
114 if (err)
115 return err;
116 @@ -277,8 +281,8 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
117 if (err)
118 return err;
119
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);
124 if (err)
125 return err;
126 }
127 @@ -302,7 +306,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
128 return -EINVAL;
129
130 update_buffer = true;
131 - err = update_xoff_threshold(&port_buffer, xoff, mtu);
132 + err = update_xoff_threshold(&port_buffer, xoff, max_mtu);
133 if (err)
134 return err;
135 }
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);
142 if (err)
143 return err;
144 }
145 --
146 2.19.1
147