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,11 +58,11 @@ int mlx5e_port_query_buffer(struct mlx5e_priv *priv,
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,7 +74,7 @@ int mlx5e_port_query_buffer(struct mlx5e_priv *priv,
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,9 +89,9 @@ int mlx5e_port_query_buffer(struct mlx5e_priv *priv,
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,16 +105,18 @@ static int port_set_buffer(struct mlx5e_priv *priv,
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
-
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 );
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 ;
112
+
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,7 +146,7 @@ static u32 calculate_xoff(struct mlx5e_priv *priv, unsigned int mtu)
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,7 +158,7 @@ static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer,
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 ;
@@ -175,6 +178,7 @@ static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer,
175
178
* @pfc_en: <input> current pfc configuration
176
179
* @buffer: <input> current prio to buffer mapping
177
180
* @xoff: <input> xoff value
181
+ * @port_buff_cell_sz: <input> port buffer cell_size
178
182
* @port_buffer: <output> port receive buffer configuration
179
183
* @change: <output>
180
184
*
@@ -189,7 +193,7 @@ static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer,
189
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,7 +229,7 @@ static int update_buffer_lossy(unsigned int max_mtu,
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,6 +266,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
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,7 +287,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
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,7 +297,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
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,7 +309,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
304
309
if (err )
305
310
return err ;
306
311
307
- err = update_buffer_lossy (max_mtu , curr_pfc_en , prio2buffer ,
312
+ err = update_buffer_lossy (max_mtu , curr_pfc_en , prio2buffer , port_buff_cell_sz ,
308
313
xoff , & port_buffer , & update_buffer );
309
314
if (err )
310
315
return err ;
@@ -329,15 +334,15 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
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
}
336
341
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
}
0 commit comments