]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mlxsw: Use the same maximum MTU value throughout the driver
authorAmit Cohen <amcohen@nvidia.com>
Thu, 13 Jun 2024 14:07:57 +0000 (16:07 +0200)
committerJakub Kicinski <kuba@kernel.org>
Sat, 15 Jun 2024 02:30:34 +0000 (19:30 -0700)
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>
drivers/net/ethernet/mellanox/mlxsw/spectrum.c
drivers/net/ethernet/mellanox/mlxsw/spectrum.h
drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c

index c5856f4d6b8bef08a9fafa9a72345134647086a6..f064789f324058ab8d93def564deeafce0584727 100644 (file)
@@ -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:
index 3beb5d0847ab7ee672a9664d133e316f091b80e9..bb0586b45c8d781d736f72693c32300eb40093d1 100644 (file)
@@ -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;
index c9f1c79f3f9d0751780013789cb29ff408556018..1b9ed393fbd47f889ce361d60c0700107add6206 100644 (file)
@@ -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);