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);
        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:
 
 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);