| .. | .. |
|---|
| 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 | } |
|---|