mlxsw: Set port split ability attribute in driver
authorDanielle Ratson <danieller@mellanox.com>
Thu, 9 Jul 2020 13:18:19 +0000 (16:18 +0300)
committerDavid S. Miller <davem@davemloft.net>
Thu, 9 Jul 2020 20:15:29 +0000 (13:15 -0700)
Currently, port attributes like flavour, port number and whether the port
was split are set when initializing a port.

Set the split ability of the port as well, based on port_mapping->width
field and split attribute of devlink port in spectrum, so that it could be
easily passed to devlink in the next patch.

Signed-off-by: Danielle Ratson <danieller@mellanox.com>
Reviewed-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/core.c
drivers/net/ethernet/mellanox/mlxsw/core.h
drivers/net/ethernet/mellanox/mlxsw/minimal.c
drivers/net/ethernet/mellanox/mlxsw/spectrum.c
drivers/net/ethernet/mellanox/mlxsw/switchib.c
drivers/net/ethernet/mellanox/mlxsw/switchx2.c

index 6cde196f6b7059023fb75d0a47c2a2959b4213b2..f85f5d88d331d18880982eb9ae3ffe2408b9d2cd 100644 (file)
@@ -2122,7 +2122,7 @@ static int __mlxsw_core_port_init(struct mlxsw_core *mlxsw_core, u8 local_port,
                                  enum devlink_port_flavour flavour,
                                  u32 port_number, bool split,
                                  u32 split_port_subnumber,
-                                 u32 lanes,
+                                 bool splittable, u32 lanes,
                                  const unsigned char *switch_id,
                                  unsigned char switch_id_len)
 {
@@ -2161,14 +2161,15 @@ static void __mlxsw_core_port_fini(struct mlxsw_core *mlxsw_core, u8 local_port)
 int mlxsw_core_port_init(struct mlxsw_core *mlxsw_core, u8 local_port,
                         u32 port_number, bool split,
                         u32 split_port_subnumber,
-                        u32 lanes,
+                        bool splittable, u32 lanes,
                         const unsigned char *switch_id,
                         unsigned char switch_id_len)
 {
        return __mlxsw_core_port_init(mlxsw_core, local_port,
                                      DEVLINK_PORT_FLAVOUR_PHYSICAL,
                                      port_number, split, split_port_subnumber,
-                                     lanes, switch_id, switch_id_len);
+                                     splittable, lanes,
+                                     switch_id, switch_id_len);
 }
 EXPORT_SYMBOL(mlxsw_core_port_init);
 
@@ -2189,7 +2190,7 @@ int mlxsw_core_cpu_port_init(struct mlxsw_core *mlxsw_core,
 
        err = __mlxsw_core_port_init(mlxsw_core, MLXSW_PORT_CPU_PORT,
                                     DEVLINK_PORT_FLAVOUR_CPU,
-                                    0, false, 0, 0,
+                                    0, false, 0, false, 0,
                                     switch_id, switch_id_len);
        if (err)
                return err;
index b5c02e6e6865d96bc5f9daa438bea7cc0f485f99..7d6b0a2327899f16f386d2a3ce1f4ef5b44498ab 100644 (file)
@@ -191,9 +191,8 @@ void mlxsw_core_lag_mapping_clear(struct mlxsw_core *mlxsw_core,
 
 void *mlxsw_core_port_driver_priv(struct mlxsw_core_port *mlxsw_core_port);
 int mlxsw_core_port_init(struct mlxsw_core *mlxsw_core, u8 local_port,
-                        u32 port_number, bool split,
-                        u32 split_port_subnumber,
-                        u32 lanes,
+                        u32 port_number, bool split, u32 split_port_subnumber,
+                        bool splittable, u32 lanes,
                         const unsigned char *switch_id,
                         unsigned char switch_id_len);
 void mlxsw_core_port_fini(struct mlxsw_core *mlxsw_core, u8 local_port);
index f9c9d7baf3be30a24bdcbf55f79d72b283c0c6f6..c010db2c9dba99566a2f06dcc70adebc5cbb5c6e 100644 (file)
@@ -164,8 +164,8 @@ mlxsw_m_port_create(struct mlxsw_m *mlxsw_m, u8 local_port, u8 module)
        int err;
 
        err = mlxsw_core_port_init(mlxsw_m->core, local_port,
-                                  module + 1, false, 0, 0,
-                                  mlxsw_m->base_mac,
+                                  module + 1, false, 0, false,
+                                  0, mlxsw_m->base_mac,
                                   sizeof(mlxsw_m->base_mac));
        if (err) {
                dev_err(mlxsw_m->bus_info->dev, "Port %d: Failed to init core port\n",
index 35d677e0911eb058fa611afca498d1b800161fa6..9cd2dc3afb13f112ac82c7993bdfb3dfc090e17e 100644 (file)
@@ -1735,12 +1735,14 @@ static int mlxsw_sp_port_create(struct mlxsw_sp *mlxsw_sp, u8 local_port,
        struct mlxsw_sp_port *mlxsw_sp_port;
        u32 lanes = port_mapping->width;
        struct net_device *dev;
+       bool splittable;
        int err;
 
+       splittable = lanes > 1 && !split;
        err = mlxsw_core_port_init(mlxsw_sp->core, local_port,
                                   port_mapping->module + 1, split,
                                   port_mapping->lane / lanes,
-                                  lanes,
+                                  splittable, lanes,
                                   mlxsw_sp->base_mac,
                                   sizeof(mlxsw_sp->base_mac));
        if (err) {
index 1b446e6071b2431fb0248639660ea2020eb84b64..1e561132eb1e58adcbfa143f4e29cd499889f423 100644 (file)
@@ -281,7 +281,7 @@ static int mlxsw_sib_port_create(struct mlxsw_sib *mlxsw_sib, u8 local_port,
        int err;
 
        err = mlxsw_core_port_init(mlxsw_sib->core, local_port,
-                                  module + 1, false, 0, 0,
+                                  module + 1, false, 0, false, 0,
                                   mlxsw_sib->hw_id, sizeof(mlxsw_sib->hw_id));
        if (err) {
                dev_err(mlxsw_sib->bus_info->dev, "Port %d: Failed to init core port\n",
index ac4cd7c234392f4d94ec97f97e44779a90841613..6f9a725662fb06e12cc58dfe727006c620c3cff3 100644 (file)
@@ -1107,7 +1107,7 @@ static int mlxsw_sx_port_eth_create(struct mlxsw_sx *mlxsw_sx, u8 local_port,
        int err;
 
        err = mlxsw_core_port_init(mlxsw_sx->core, local_port,
-                                  module + 1, false, 0, 0,
+                                  module + 1, false, 0, false, 0,
                                   mlxsw_sx->hw_id, sizeof(mlxsw_sx->hw_id));
        if (err) {
                dev_err(mlxsw_sx->bus_info->dev, "Port %d: Failed to init core port\n",