mlxsw: Use the same maximum MTU value throughout the driver
Currently, the driver uses two different values for maximum MTU, one is stored in mlxsw_port->dev->max_mtu and the second is stored in mlxsw_port->max_mtu. The second one is set to value which is queried from firmware. This value was never tested, and unfortunately is not really supported. That means that with the existing code, user can set MTU to X, which is not really supported by firmware and which is bigger than buffer size which is allocated in pci. To make the driver consistent, use only mlxsw_port->dev->max_mtu for maximum MTU value, for buffers headroom add Ethernet frame headers, which are not included in mlxsw_port->dev->max_mtu. Remove mlxsw_port->max_mtu. Signed-off-by: Amit Cohen <amcohen@nvidia.com> Reviewed-by: Ido Schimmel <idosch@nvidia.com> Signed-off-by: Petr Machata <petrm@nvidia.com> Link: https://lore.kernel.org/r/89fa6f804386b918d337e736e14ac291bb947483.1718275854.git.petrm@nvidia.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
753aacfc03
commit
3e7856545d
@ -405,21 +405,6 @@ static int mlxsw_sp_port_dev_addr_init(struct mlxsw_sp_port *mlxsw_sp_port)
|
||||
mlxsw_sp_port->dev->dev_addr);
|
||||
}
|
||||
|
||||
static int mlxsw_sp_port_max_mtu_get(struct mlxsw_sp_port *mlxsw_sp_port, int *p_max_mtu)
|
||||
{
|
||||
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
|
||||
char pmtu_pl[MLXSW_REG_PMTU_LEN];
|
||||
int err;
|
||||
|
||||
mlxsw_reg_pmtu_pack(pmtu_pl, mlxsw_sp_port->local_port, 0);
|
||||
err = mlxsw_reg_query(mlxsw_sp->core, MLXSW_REG(pmtu), pmtu_pl);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
*p_max_mtu = mlxsw_reg_pmtu_max_mtu_get(pmtu_pl);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mlxsw_sp_port_mtu_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 mtu)
|
||||
{
|
||||
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
|
||||
@ -1725,13 +1710,6 @@ static int mlxsw_sp_port_create(struct mlxsw_sp *mlxsw_sp, u16 local_port,
|
||||
goto err_max_speed_get;
|
||||
}
|
||||
|
||||
err = mlxsw_sp_port_max_mtu_get(mlxsw_sp_port, &mlxsw_sp_port->max_mtu);
|
||||
if (err) {
|
||||
dev_err(mlxsw_sp->bus_info->dev, "Port %d: Failed to get maximum MTU\n",
|
||||
mlxsw_sp_port->local_port);
|
||||
goto err_port_max_mtu_get;
|
||||
}
|
||||
|
||||
err = mlxsw_sp_port_mtu_set(mlxsw_sp_port, ETH_DATA_LEN);
|
||||
if (err) {
|
||||
dev_err(mlxsw_sp->bus_info->dev, "Port %d: Failed to set MTU\n",
|
||||
@ -1875,7 +1853,6 @@ err_port_ets_init:
|
||||
err_port_buffers_init:
|
||||
err_port_admin_status_set:
|
||||
err_port_mtu_set:
|
||||
err_port_max_mtu_get:
|
||||
err_max_speed_get:
|
||||
err_port_speed_by_width_set:
|
||||
err_port_system_port_mapping_set:
|
||||
|
@ -359,7 +359,6 @@ struct mlxsw_sp_port {
|
||||
u16 egr_types;
|
||||
struct mlxsw_sp_ptp_port_stats stats;
|
||||
} ptp;
|
||||
int max_mtu;
|
||||
u32 max_speed;
|
||||
struct mlxsw_sp_hdroom *hdroom;
|
||||
u64 module_overheat_initial_val;
|
||||
|
@ -399,11 +399,13 @@ void mlxsw_sp_hdroom_bufs_reset_sizes(struct mlxsw_sp_port *mlxsw_sp_port,
|
||||
struct mlxsw_sp_hdroom *hdroom)
|
||||
{
|
||||
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
|
||||
unsigned int max_mtu = mlxsw_sp_port->dev->max_mtu;
|
||||
u16 reserve_cells;
|
||||
int i;
|
||||
|
||||
max_mtu += MLXSW_PORT_ETH_FRAME_HDR;
|
||||
/* Internal buffer. */
|
||||
reserve_cells = mlxsw_sp_hdroom_int_buf_size_get(mlxsw_sp, mlxsw_sp_port->max_mtu,
|
||||
reserve_cells = mlxsw_sp_hdroom_int_buf_size_get(mlxsw_sp, max_mtu,
|
||||
mlxsw_sp_port->max_speed);
|
||||
reserve_cells = mlxsw_sp_port_headroom_8x_adjust(mlxsw_sp_port, reserve_cells);
|
||||
hdroom->int_buf.reserve_cells = reserve_cells;
|
||||
@ -613,7 +615,9 @@ static int mlxsw_sp_port_headroom_init(struct mlxsw_sp_port *mlxsw_sp_port)
|
||||
mlxsw_sp_hdroom_bufs_reset_sizes(mlxsw_sp_port, &hdroom);
|
||||
|
||||
/* Buffer 9 is used for control traffic. */
|
||||
size9 = mlxsw_sp_port_headroom_8x_adjust(mlxsw_sp_port, mlxsw_sp_port->max_mtu);
|
||||
size9 = mlxsw_sp_port_headroom_8x_adjust(mlxsw_sp_port,
|
||||
mlxsw_sp_port->dev->max_mtu +
|
||||
MLXSW_PORT_ETH_FRAME_HDR);
|
||||
hdroom.bufs.buf[9].size_cells = mlxsw_sp_bytes_cells(mlxsw_sp, size9);
|
||||
|
||||
return __mlxsw_sp_hdroom_configure(mlxsw_sp_port, &hdroom, true);
|
||||
|
Loading…
x
Reference in New Issue
Block a user