hc
2023-12-06 08f87f769b595151be1afeff53e144f543faa614
kernel/drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.c
....@@ -34,6 +34,7 @@
3434 int mlx5e_port_query_buffer(struct mlx5e_priv *priv,
3535 struct mlx5e_port_buffer *port_buffer)
3636 {
37
+ u16 port_buff_cell_sz = priv->dcbx.port_buff_cell_sz;
3738 struct mlx5_core_dev *mdev = priv->mdev;
3839 int sz = MLX5_ST_SZ_BYTES(pbmc_reg);
3940 u32 total_used = 0;
....@@ -57,11 +58,11 @@
5758 port_buffer->buffer[i].epsb =
5859 MLX5_GET(bufferx_reg, buffer, epsb);
5960 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;
6162 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;
6364 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;
6566 total_used += port_buffer->buffer[i].size;
6667
6768 mlx5e_dbg(HW, priv, "buffer %d: size=%d, xon=%d, xoff=%d, epsb=%d, lossy=%d\n", i,
....@@ -73,7 +74,7 @@
7374 }
7475
7576 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;
7778 port_buffer->spare_buffer_size =
7879 port_buffer->port_buffer_size - total_used;
7980
....@@ -88,9 +89,9 @@
8889 static int port_set_buffer(struct mlx5e_priv *priv,
8990 struct mlx5e_port_buffer *port_buffer)
9091 {
92
+ u16 port_buff_cell_sz = priv->dcbx.port_buff_cell_sz;
9193 struct mlx5_core_dev *mdev = priv->mdev;
9294 int sz = MLX5_ST_SZ_BYTES(pbmc_reg);
93
- void *buffer;
9495 void *in;
9596 int err;
9697 int i;
....@@ -104,16 +105,18 @@
104105 goto out;
105106
106107 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;
108112
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);
117120 }
118121
119122 err = mlx5e_port_set_pbmc(mdev, in);
....@@ -143,7 +146,7 @@
143146 }
144147
145148 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)
147150 {
148151 int i;
149152
....@@ -155,7 +158,7 @@
155158 }
156159
157160 if (port_buffer->buffer[i].size <
158
- (xoff + max_mtu + (1 << MLX5E_BUFFER_CELL_SHIFT))) {
161
+ (xoff + max_mtu + port_buff_cell_sz)) {
159162 pr_err("buffer_size[%d]=%d is not enough for lossless buffer\n",
160163 i, port_buffer->buffer[i].size);
161164 return -ENOMEM;
....@@ -170,26 +173,27 @@
170173 }
171174
172175 /**
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>
180184 *
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
186191 *
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.
190194 */
191195 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,
193197 struct mlx5e_port_buffer *port_buffer,
194198 bool *change)
195199 {
....@@ -225,7 +229,7 @@
225229 }
226230
227231 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);
229233 if (err)
230234 return err;
231235
....@@ -262,6 +266,7 @@
262266 u32 *buffer_size,
263267 u8 *prio2buffer)
264268 {
269
+ u16 port_buff_cell_sz = priv->dcbx.port_buff_cell_sz;
265270 struct mlx5e_port_buffer port_buffer;
266271 u32 xoff = calculate_xoff(priv, mtu);
267272 bool update_prio2buffer = false;
....@@ -282,7 +287,7 @@
282287
283288 if (change & MLX5E_PORT_BUFFER_CABLE_LEN) {
284289 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);
286291 if (err)
287292 return err;
288293 }
....@@ -292,7 +297,7 @@
292297 if (err)
293298 return err;
294299
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,
296301 &port_buffer, &update_buffer);
297302 if (err)
298303 return err;
....@@ -304,8 +309,8 @@
304309 if (err)
305310 return err;
306311
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);
309314 if (err)
310315 return err;
311316 }
....@@ -329,7 +334,7 @@
329334 return -EINVAL;
330335
331336 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);
333338 if (err)
334339 return err;
335340 }
....@@ -337,7 +342,7 @@
337342 /* Need to update buffer configuration if xoff value is changed */
338343 if (!update_buffer && xoff != priv->dcbx.xoff) {
339344 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);
341346 if (err)
342347 return err;
343348 }