mlxsw: spectrum_switchdev: Don't batch STP operations
authorIdo Schimmel <idosch@mellanox.com>
Tue, 16 May 2017 17:38:32 +0000 (19:38 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 17 May 2017 18:06:54 +0000 (14:06 -0400)
Simplify the code by using the common function that sets an STP state
for a Port-VLAN and remove the existing one that tries to batch it for
several VLANs.

This will help us in a follow-up patchset to introduce a unified
infrastructure for bridge ports, regardless if the bridge is VLAN-aware
or not.

Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c

index 8a31bf9013f2eed98e55343559dc513d57c58676..ad5eefa7d23b4a86d2614c9fd4acd646ec0aaee2 100644 (file)
@@ -146,58 +146,33 @@ static int mlxsw_sp_port_attr_get(struct net_device *dev,
        return 0;
 }
 
-static int mlxsw_sp_port_stp_state_set(struct mlxsw_sp_port *mlxsw_sp_port,
-                                      u8 state)
+static int mlxsw_sp_port_attr_stp_state_set(struct mlxsw_sp_port *mlxsw_sp_port,
+                                           struct switchdev_trans *trans,
+                                           u8 state)
 {
-       struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
-       enum mlxsw_reg_spms_state spms_state;
-       char *spms_pl;
        u16 vid;
        int err;
 
-       switch (state) {
-       case BR_STATE_FORWARDING:
-               spms_state = MLXSW_REG_SPMS_STATE_FORWARDING;
-               break;
-       case BR_STATE_LEARNING:
-               spms_state = MLXSW_REG_SPMS_STATE_LEARNING;
-               break;
-       case BR_STATE_LISTENING: /* fall-through */
-       case BR_STATE_DISABLED: /* fall-through */
-       case BR_STATE_BLOCKING:
-               spms_state = MLXSW_REG_SPMS_STATE_DISCARDING;
-               break;
-       default:
-               BUG();
-       }
-
-       spms_pl = kmalloc(MLXSW_REG_SPMS_LEN, GFP_KERNEL);
-       if (!spms_pl)
-               return -ENOMEM;
-       mlxsw_reg_spms_pack(spms_pl, mlxsw_sp_port->local_port);
+       if (switchdev_trans_ph_prepare(trans))
+               return 0;
 
        if (mlxsw_sp_port_is_vport(mlxsw_sp_port)) {
                vid = mlxsw_sp_vport_vid_get(mlxsw_sp_port);
-               mlxsw_reg_spms_vid_pack(spms_pl, vid, spms_state);
-       } else {
-               for_each_set_bit(vid, mlxsw_sp_port->active_vlans, VLAN_N_VID)
-                       mlxsw_reg_spms_vid_pack(spms_pl, vid, spms_state);
-       }
-
-       err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(spms), spms_pl);
-       kfree(spms_pl);
-       return err;
-}
-
-static int mlxsw_sp_port_attr_stp_state_set(struct mlxsw_sp_port *mlxsw_sp_port,
-                                           struct switchdev_trans *trans,
-                                           u8 state)
-{
-       if (switchdev_trans_ph_prepare(trans))
+               err = mlxsw_sp_port_vid_stp_set(mlxsw_sp_port, vid, state);
+               if (err)
+                       return err;
+               mlxsw_sp_port->stp_state = state;
                return 0;
+       }
 
+       for_each_set_bit(vid, mlxsw_sp_port->active_vlans, VLAN_N_VID) {
+               err = mlxsw_sp_port_vid_stp_set(mlxsw_sp_port, vid, state);
+               if (err)
+                       return err;
+       }
        mlxsw_sp_port->stp_state = state;
-       return mlxsw_sp_port_stp_state_set(mlxsw_sp_port, state);
+
+       return 0;
 }
 
 static int __mlxsw_sp_port_flood_table_set(struct mlxsw_sp_port *mlxsw_sp_port,