mlxsw: Convert does-RIF-have-this-netdev queries to a dedicated helper
[linux-2.6-microblaze.git] / drivers / net / ethernet / mellanox / mlxsw / spectrum_mr.c
index 7846a21..69cd689 100644 (file)
@@ -535,6 +535,16 @@ mlxsw_sp_mr_route_evif_resolve(struct mlxsw_sp_mr_table *mr_table,
        u16 erif_index = 0;
        int err;
 
+       /* Add the eRIF */
+       if (mlxsw_sp_mr_vif_valid(rve->mr_vif)) {
+               erif_index = mlxsw_sp_rif_index(rve->mr_vif->rif);
+               err = mr->mr_ops->route_erif_add(mlxsw_sp,
+                                                rve->mr_route->route_priv,
+                                                erif_index);
+               if (err)
+                       return err;
+       }
+
        /* Update the route action, as the new eVIF can be a tunnel or a pimreg
         * device which will require updating the action.
         */
@@ -544,17 +554,7 @@ mlxsw_sp_mr_route_evif_resolve(struct mlxsw_sp_mr_table *mr_table,
                                                      rve->mr_route->route_priv,
                                                      route_action);
                if (err)
-                       return err;
-       }
-
-       /* Add the eRIF */
-       if (mlxsw_sp_mr_vif_valid(rve->mr_vif)) {
-               erif_index = mlxsw_sp_rif_index(rve->mr_vif->rif);
-               err = mr->mr_ops->route_erif_add(mlxsw_sp,
-                                                rve->mr_route->route_priv,
-                                                erif_index);
-               if (err)
-                       goto err_route_erif_add;
+                       goto err_route_action_update;
        }
 
        /* Update the minimum MTU */
@@ -572,14 +572,14 @@ mlxsw_sp_mr_route_evif_resolve(struct mlxsw_sp_mr_table *mr_table,
        return 0;
 
 err_route_min_mtu_update:
-       if (mlxsw_sp_mr_vif_valid(rve->mr_vif))
-               mr->mr_ops->route_erif_del(mlxsw_sp, rve->mr_route->route_priv,
-                                          erif_index);
-err_route_erif_add:
        if (route_action != rve->mr_route->route_action)
                mr->mr_ops->route_action_update(mlxsw_sp,
                                                rve->mr_route->route_priv,
                                                rve->mr_route->route_action);
+err_route_action_update:
+       if (mlxsw_sp_mr_vif_valid(rve->mr_vif))
+               mr->mr_ops->route_erif_del(mlxsw_sp, rve->mr_route->route_priv,
+                                          erif_index);
        return err;
 }
 
@@ -704,12 +704,12 @@ void mlxsw_sp_mr_vif_del(struct mlxsw_sp_mr_table *mr_table, vifi_t vif_index)
 
 static struct mlxsw_sp_mr_vif *
 mlxsw_sp_mr_dev_vif_lookup(struct mlxsw_sp_mr_table *mr_table,
-                          const struct net_device *dev)
+                          const struct mlxsw_sp_rif *rif)
 {
        vifi_t vif_index;
 
        for (vif_index = 0; vif_index < MAXVIFS; vif_index++)
-               if (mr_table->vifs[vif_index].dev == dev)
+               if (mlxsw_sp_rif_dev_is(rif, mr_table->vifs[vif_index].dev))
                        return &mr_table->vifs[vif_index];
        return NULL;
 }
@@ -717,13 +717,12 @@ mlxsw_sp_mr_dev_vif_lookup(struct mlxsw_sp_mr_table *mr_table,
 int mlxsw_sp_mr_rif_add(struct mlxsw_sp_mr_table *mr_table,
                        const struct mlxsw_sp_rif *rif)
 {
-       const struct net_device *rif_dev = mlxsw_sp_rif_dev(rif);
        struct mlxsw_sp_mr_vif *mr_vif;
 
-       if (!rif_dev)
+       if (!mlxsw_sp_rif_has_dev(rif))
                return 0;
 
-       mr_vif = mlxsw_sp_mr_dev_vif_lookup(mr_table, rif_dev);
+       mr_vif = mlxsw_sp_mr_dev_vif_lookup(mr_table, rif);
        if (!mr_vif)
                return 0;
        return mlxsw_sp_mr_vif_resolve(mr_table, mr_vif->dev, mr_vif,
@@ -733,13 +732,12 @@ int mlxsw_sp_mr_rif_add(struct mlxsw_sp_mr_table *mr_table,
 void mlxsw_sp_mr_rif_del(struct mlxsw_sp_mr_table *mr_table,
                         const struct mlxsw_sp_rif *rif)
 {
-       const struct net_device *rif_dev = mlxsw_sp_rif_dev(rif);
        struct mlxsw_sp_mr_vif *mr_vif;
 
-       if (!rif_dev)
+       if (!mlxsw_sp_rif_has_dev(rif))
                return;
 
-       mr_vif = mlxsw_sp_mr_dev_vif_lookup(mr_table, rif_dev);
+       mr_vif = mlxsw_sp_mr_dev_vif_lookup(mr_table, rif);
        if (!mr_vif)
                return;
        mlxsw_sp_mr_vif_unresolve(mr_table, mr_vif->dev, mr_vif);
@@ -748,17 +746,16 @@ void mlxsw_sp_mr_rif_del(struct mlxsw_sp_mr_table *mr_table,
 void mlxsw_sp_mr_rif_mtu_update(struct mlxsw_sp_mr_table *mr_table,
                                const struct mlxsw_sp_rif *rif, int mtu)
 {
-       const struct net_device *rif_dev = mlxsw_sp_rif_dev(rif);
        struct mlxsw_sp *mlxsw_sp = mr_table->mlxsw_sp;
        struct mlxsw_sp_mr_route_vif_entry *rve;
        struct mlxsw_sp_mr *mr = mlxsw_sp->mr;
        struct mlxsw_sp_mr_vif *mr_vif;
 
-       if (!rif_dev)
+       if (!mlxsw_sp_rif_has_dev(rif))
                return;
 
        /* Search for a VIF that use that RIF */
-       mr_vif = mlxsw_sp_mr_dev_vif_lookup(mr_table, rif_dev);
+       mr_vif = mlxsw_sp_mr_dev_vif_lookup(mr_table, rif);
        if (!mr_vif)
                return;