.. | .. |
---|
34 | 34 | int mlx5e_port_query_buffer(struct mlx5e_priv *priv, |
---|
35 | 35 | struct mlx5e_port_buffer *port_buffer) |
---|
36 | 36 | { |
---|
| 37 | + u16 port_buff_cell_sz = priv->dcbx.port_buff_cell_sz; |
---|
37 | 38 | struct mlx5_core_dev *mdev = priv->mdev; |
---|
38 | 39 | int sz = MLX5_ST_SZ_BYTES(pbmc_reg); |
---|
39 | 40 | u32 total_used = 0; |
---|
.. | .. |
---|
57 | 58 | port_buffer->buffer[i].epsb = |
---|
58 | 59 | MLX5_GET(bufferx_reg, buffer, epsb); |
---|
59 | 60 | port_buffer->buffer[i].size = |
---|
60 | | - MLX5_GET(bufferx_reg, buffer, size) << MLX5E_BUFFER_CELL_SHIFT; |
---|
| 61 | + MLX5_GET(bufferx_reg, buffer, size) * port_buff_cell_sz; |
---|
61 | 62 | port_buffer->buffer[i].xon = |
---|
62 | | - MLX5_GET(bufferx_reg, buffer, xon_threshold) << MLX5E_BUFFER_CELL_SHIFT; |
---|
| 63 | + MLX5_GET(bufferx_reg, buffer, xon_threshold) * port_buff_cell_sz; |
---|
63 | 64 | port_buffer->buffer[i].xoff = |
---|
64 | | - MLX5_GET(bufferx_reg, buffer, xoff_threshold) << MLX5E_BUFFER_CELL_SHIFT; |
---|
| 65 | + MLX5_GET(bufferx_reg, buffer, xoff_threshold) * port_buff_cell_sz; |
---|
65 | 66 | total_used += port_buffer->buffer[i].size; |
---|
66 | 67 | |
---|
67 | 68 | mlx5e_dbg(HW, priv, "buffer %d: size=%d, xon=%d, xoff=%d, epsb=%d, lossy=%d\n", i, |
---|
.. | .. |
---|
73 | 74 | } |
---|
74 | 75 | |
---|
75 | 76 | port_buffer->port_buffer_size = |
---|
76 | | - MLX5_GET(pbmc_reg, out, port_buffer_size) << MLX5E_BUFFER_CELL_SHIFT; |
---|
| 77 | + MLX5_GET(pbmc_reg, out, port_buffer_size) * port_buff_cell_sz; |
---|
77 | 78 | port_buffer->spare_buffer_size = |
---|
78 | 79 | port_buffer->port_buffer_size - total_used; |
---|
79 | 80 | |
---|
.. | .. |
---|
88 | 89 | static int port_set_buffer(struct mlx5e_priv *priv, |
---|
89 | 90 | struct mlx5e_port_buffer *port_buffer) |
---|
90 | 91 | { |
---|
| 92 | + u16 port_buff_cell_sz = priv->dcbx.port_buff_cell_sz; |
---|
91 | 93 | struct mlx5_core_dev *mdev = priv->mdev; |
---|
92 | 94 | int sz = MLX5_ST_SZ_BYTES(pbmc_reg); |
---|
93 | | - void *buffer; |
---|
94 | 95 | void *in; |
---|
95 | 96 | int err; |
---|
96 | 97 | int i; |
---|
.. | .. |
---|
104 | 105 | goto out; |
---|
105 | 106 | |
---|
106 | 107 | for (i = 0; i < MLX5E_MAX_BUFFER; i++) { |
---|
107 | | - buffer = MLX5_ADDR_OF(pbmc_reg, in, buffer[i]); |
---|
| 108 | + void *buffer = MLX5_ADDR_OF(pbmc_reg, in, buffer[i]); |
---|
| 109 | + u64 size = port_buffer->buffer[i].size; |
---|
| 110 | + u64 xoff = port_buffer->buffer[i].xoff; |
---|
| 111 | + u64 xon = port_buffer->buffer[i].xon; |
---|
108 | 112 | |
---|
109 | | - MLX5_SET(bufferx_reg, buffer, size, |
---|
110 | | - port_buffer->buffer[i].size >> MLX5E_BUFFER_CELL_SHIFT); |
---|
111 | | - MLX5_SET(bufferx_reg, buffer, lossy, |
---|
112 | | - port_buffer->buffer[i].lossy); |
---|
113 | | - MLX5_SET(bufferx_reg, buffer, xoff_threshold, |
---|
114 | | - port_buffer->buffer[i].xoff >> MLX5E_BUFFER_CELL_SHIFT); |
---|
115 | | - MLX5_SET(bufferx_reg, buffer, xon_threshold, |
---|
116 | | - port_buffer->buffer[i].xon >> MLX5E_BUFFER_CELL_SHIFT); |
---|
| 113 | + do_div(size, port_buff_cell_sz); |
---|
| 114 | + do_div(xoff, port_buff_cell_sz); |
---|
| 115 | + do_div(xon, port_buff_cell_sz); |
---|
| 116 | + MLX5_SET(bufferx_reg, buffer, size, size); |
---|
| 117 | + MLX5_SET(bufferx_reg, buffer, lossy, port_buffer->buffer[i].lossy); |
---|
| 118 | + MLX5_SET(bufferx_reg, buffer, xoff_threshold, xoff); |
---|
| 119 | + MLX5_SET(bufferx_reg, buffer, xon_threshold, xon); |
---|
117 | 120 | } |
---|
118 | 121 | |
---|
119 | 122 | err = mlx5e_port_set_pbmc(mdev, in); |
---|
.. | .. |
---|
143 | 146 | } |
---|
144 | 147 | |
---|
145 | 148 | static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer, |
---|
146 | | - u32 xoff, unsigned int max_mtu) |
---|
| 149 | + u32 xoff, unsigned int max_mtu, u16 port_buff_cell_sz) |
---|
147 | 150 | { |
---|
148 | 151 | int i; |
---|
149 | 152 | |
---|
.. | .. |
---|
155 | 158 | } |
---|
156 | 159 | |
---|
157 | 160 | if (port_buffer->buffer[i].size < |
---|
158 | | - (xoff + max_mtu + (1 << MLX5E_BUFFER_CELL_SHIFT))) { |
---|
| 161 | + (xoff + max_mtu + port_buff_cell_sz)) { |
---|
159 | 162 | pr_err("buffer_size[%d]=%d is not enough for lossless buffer\n", |
---|
160 | 163 | i, port_buffer->buffer[i].size); |
---|
161 | 164 | return -ENOMEM; |
---|
.. | .. |
---|
170 | 173 | } |
---|
171 | 174 | |
---|
172 | 175 | /** |
---|
173 | | - * update_buffer_lossy() |
---|
174 | | - * max_mtu: netdev's max_mtu |
---|
175 | | - * pfc_en: <input> current pfc configuration |
---|
176 | | - * buffer: <input> current prio to buffer mapping |
---|
177 | | - * xoff: <input> xoff value |
---|
178 | | - * port_buffer: <output> port receive buffer configuration |
---|
179 | | - * change: <output> |
---|
| 176 | + * update_buffer_lossy - Update buffer configuration based on pfc |
---|
| 177 | + * @max_mtu: netdev's max_mtu |
---|
| 178 | + * @pfc_en: <input> current pfc configuration |
---|
| 179 | + * @buffer: <input> current prio to buffer mapping |
---|
| 180 | + * @xoff: <input> xoff value |
---|
| 181 | + * @port_buff_cell_sz: <input> port buffer cell_size |
---|
| 182 | + * @port_buffer: <output> port receive buffer configuration |
---|
| 183 | + * @change: <output> |
---|
180 | 184 | * |
---|
181 | | - * Update buffer configuration based on pfc configuraiton and priority |
---|
182 | | - * to buffer mapping. |
---|
183 | | - * Buffer's lossy bit is changed to: |
---|
184 | | - * lossless if there is at least one PFC enabled priority mapped to this buffer |
---|
185 | | - * lossy if all priorities mapped to this buffer are PFC disabled |
---|
| 185 | + * Update buffer configuration based on pfc configuration and |
---|
| 186 | + * priority to buffer mapping. |
---|
| 187 | + * Buffer's lossy bit is changed to: |
---|
| 188 | + * lossless if there is at least one PFC enabled priority |
---|
| 189 | + * mapped to this buffer lossy if all priorities mapped to |
---|
| 190 | + * this buffer are PFC disabled |
---|
186 | 191 | * |
---|
187 | | - * Return: |
---|
188 | | - * Return 0 if no error. |
---|
189 | | - * Set change to true if buffer configuration is modified. |
---|
| 192 | + * @return: 0 if no error, |
---|
| 193 | + * sets change to true if buffer configuration was modified. |
---|
190 | 194 | */ |
---|
191 | 195 | static int update_buffer_lossy(unsigned int max_mtu, |
---|
192 | | - u8 pfc_en, u8 *buffer, u32 xoff, |
---|
| 196 | + u8 pfc_en, u8 *buffer, u32 xoff, u16 port_buff_cell_sz, |
---|
193 | 197 | struct mlx5e_port_buffer *port_buffer, |
---|
194 | 198 | bool *change) |
---|
195 | 199 | { |
---|
.. | .. |
---|
225 | 229 | } |
---|
226 | 230 | |
---|
227 | 231 | if (changed) { |
---|
228 | | - err = update_xoff_threshold(port_buffer, xoff, max_mtu); |
---|
| 232 | + err = update_xoff_threshold(port_buffer, xoff, max_mtu, port_buff_cell_sz); |
---|
229 | 233 | if (err) |
---|
230 | 234 | return err; |
---|
231 | 235 | |
---|
.. | .. |
---|
262 | 266 | u32 *buffer_size, |
---|
263 | 267 | u8 *prio2buffer) |
---|
264 | 268 | { |
---|
| 269 | + u16 port_buff_cell_sz = priv->dcbx.port_buff_cell_sz; |
---|
265 | 270 | struct mlx5e_port_buffer port_buffer; |
---|
266 | 271 | u32 xoff = calculate_xoff(priv, mtu); |
---|
267 | 272 | bool update_prio2buffer = false; |
---|
.. | .. |
---|
282 | 287 | |
---|
283 | 288 | if (change & MLX5E_PORT_BUFFER_CABLE_LEN) { |
---|
284 | 289 | update_buffer = true; |
---|
285 | | - err = update_xoff_threshold(&port_buffer, xoff, max_mtu); |
---|
| 290 | + err = update_xoff_threshold(&port_buffer, xoff, max_mtu, port_buff_cell_sz); |
---|
286 | 291 | if (err) |
---|
287 | 292 | return err; |
---|
288 | 293 | } |
---|
.. | .. |
---|
292 | 297 | if (err) |
---|
293 | 298 | return err; |
---|
294 | 299 | |
---|
295 | | - err = update_buffer_lossy(max_mtu, pfc->pfc_en, buffer, xoff, |
---|
| 300 | + err = update_buffer_lossy(max_mtu, pfc->pfc_en, buffer, xoff, port_buff_cell_sz, |
---|
296 | 301 | &port_buffer, &update_buffer); |
---|
297 | 302 | if (err) |
---|
298 | 303 | return err; |
---|
.. | .. |
---|
304 | 309 | if (err) |
---|
305 | 310 | return err; |
---|
306 | 311 | |
---|
307 | | - err = update_buffer_lossy(max_mtu, curr_pfc_en, prio2buffer, |
---|
308 | | - xoff, &port_buffer, &update_buffer); |
---|
| 312 | + err = update_buffer_lossy(max_mtu, curr_pfc_en, prio2buffer, xoff, |
---|
| 313 | + port_buff_cell_sz, &port_buffer, &update_buffer); |
---|
309 | 314 | if (err) |
---|
310 | 315 | return err; |
---|
311 | 316 | } |
---|
.. | .. |
---|
329 | 334 | return -EINVAL; |
---|
330 | 335 | |
---|
331 | 336 | update_buffer = true; |
---|
332 | | - err = update_xoff_threshold(&port_buffer, xoff, max_mtu); |
---|
| 337 | + err = update_xoff_threshold(&port_buffer, xoff, max_mtu, port_buff_cell_sz); |
---|
333 | 338 | if (err) |
---|
334 | 339 | return err; |
---|
335 | 340 | } |
---|
.. | .. |
---|
337 | 342 | /* Need to update buffer configuration if xoff value is changed */ |
---|
338 | 343 | if (!update_buffer && xoff != priv->dcbx.xoff) { |
---|
339 | 344 | update_buffer = true; |
---|
340 | | - err = update_xoff_threshold(&port_buffer, xoff, max_mtu); |
---|
| 345 | + err = update_xoff_threshold(&port_buffer, xoff, max_mtu, port_buff_cell_sz); |
---|
341 | 346 | if (err) |
---|
342 | 347 | return err; |
---|
343 | 348 | } |
---|