OSDN Git Service

net/mlx5: E-Switch, Refactor load/unload of representors
authorMark Bloch <markb@mellanox.com>
Wed, 9 Aug 2017 14:50:57 +0000 (14:50 +0000)
committerSaeed Mahameed <saeedm@mellanox.com>
Thu, 28 Dec 2017 10:36:33 +0000 (12:36 +0200)
Refactor the load/unload stages for better code reuse.

Signed-off-by: Mark Bloch <markb@mellanox.com>
Reviewed-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c

index 7e15854..26fbc50 100644 (file)
@@ -767,12 +767,47 @@ int esw_offloads_init_reps(struct mlx5_eswitch *esw)
        return 0;
 }
 
-int esw_offloads_init(struct mlx5_eswitch *esw, int nvports)
+static void esw_offloads_unload_reps(struct mlx5_eswitch *esw, int nvports)
+{
+       struct mlx5_eswitch_rep *rep;
+       int vport;
+
+       for (vport = nvports - 1; vport >= 0; vport--) {
+               rep = &esw->offloads.vport_reps[vport];
+               if (!rep->valid)
+                       continue;
+
+               rep->unload(esw, rep);
+       }
+}
+
+static int esw_offloads_load_reps(struct mlx5_eswitch *esw, int nvports)
 {
        struct mlx5_eswitch_rep *rep;
        int vport;
        int err;
 
+       for (vport = 0; vport < nvports; vport++) {
+               rep = &esw->offloads.vport_reps[vport];
+               if (!rep->valid)
+                       continue;
+
+               err = rep->load(esw, rep);
+               if (err)
+                       goto err_reps;
+       }
+
+       return 0;
+
+err_reps:
+       esw_offloads_unload_reps(esw, vport);
+       return err;
+}
+
+int esw_offloads_init(struct mlx5_eswitch *esw, int nvports)
+{
+       int err;
+
        /* disable PF RoCE so missed packets don't go through RoCE steering */
        mlx5_dev_list_lock();
        mlx5_remove_dev_by_protocol(esw->dev, MLX5_INTERFACE_PROTOCOL_IB);
@@ -790,25 +825,13 @@ int esw_offloads_init(struct mlx5_eswitch *esw, int nvports)
        if (err)
                goto create_fg_err;
 
-       for (vport = 0; vport < nvports; vport++) {
-               rep = &esw->offloads.vport_reps[vport];
-               if (!rep->valid)
-                       continue;
-
-               err = rep->load(esw, rep);
-               if (err)
-                       goto err_reps;
-       }
+       err = esw_offloads_load_reps(esw, nvports);
+       if (err)
+               goto err_reps;
 
        return 0;
 
 err_reps:
-       for (vport--; vport >= 0; vport--) {
-               rep = &esw->offloads.vport_reps[vport];
-               if (!rep->valid)
-                       continue;
-               rep->unload(esw, rep);
-       }
        esw_destroy_vport_rx_group(esw);
 
 create_fg_err:
@@ -849,16 +872,7 @@ static int esw_offloads_stop(struct mlx5_eswitch *esw)
 
 void esw_offloads_cleanup(struct mlx5_eswitch *esw, int nvports)
 {
-       struct mlx5_eswitch_rep *rep;
-       int vport;
-
-       for (vport = nvports - 1; vport >= 0; vport--) {
-               rep = &esw->offloads.vport_reps[vport];
-               if (!rep->valid)
-                       continue;
-               rep->unload(esw, rep);
-       }
-
+       esw_offloads_unload_reps(esw, nvports);
        esw_destroy_vport_rx_group(esw);
        esw_destroy_offloads_table(esw);
        esw_destroy_offloads_fdb_tables(esw);