return err;
 }
 
+static int mlxsw_sp_rifs_init(struct mlxsw_sp *mlxsw_sp)
+{
+       u64 max_rifs = MLXSW_CORE_RES_GET(mlxsw_sp->core, MAX_RIFS);
+
+       mlxsw_sp->router->rifs = kcalloc(max_rifs,
+                                        sizeof(struct mlxsw_sp_rif *),
+                                        GFP_KERNEL);
+       if (!mlxsw_sp->router->rifs)
+               return -ENOMEM;
+       return 0;
+}
+
+static void mlxsw_sp_rifs_fini(struct mlxsw_sp *mlxsw_sp)
+{
+       int i;
+
+       for (i = 0; i < MLXSW_CORE_RES_GET(mlxsw_sp->core, MAX_RIFS); i++)
+               WARN_ON_ONCE(mlxsw_sp->router->rifs[i]);
+
+       kfree(mlxsw_sp->router->rifs);
+}
+
 static void mlxsw_sp_router_fib_dump_flush(struct notifier_block *nb)
 {
        struct mlxsw_sp_router *router;
 
        if (!MLXSW_CORE_RES_VALID(mlxsw_sp->core, MAX_RIFS))
                return -EIO;
-
        max_rifs = MLXSW_CORE_RES_GET(mlxsw_sp->core, MAX_RIFS);
-       mlxsw_sp->router->rifs = kcalloc(max_rifs,
-                                        sizeof(struct mlxsw_sp_rif *),
-                                        GFP_KERNEL);
-       if (!mlxsw_sp->router->rifs)
-               return -ENOMEM;
 
        mlxsw_reg_rgcr_pack(rgcr_pl, true);
        mlxsw_reg_rgcr_max_router_interfaces_set(rgcr_pl, max_rifs);
        err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(rgcr), rgcr_pl);
        if (err)
-               goto err_rgcr_fail;
-
+               return err;
        return 0;
-
-err_rgcr_fail:
-       kfree(mlxsw_sp->router->rifs);
-       return err;
 }
 
 static void __mlxsw_sp_router_fini(struct mlxsw_sp *mlxsw_sp)
 {
        char rgcr_pl[MLXSW_REG_RGCR_LEN];
-       int i;
 
        mlxsw_reg_rgcr_pack(rgcr_pl, false);
        mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(rgcr), rgcr_pl);
-
-       for (i = 0; i < MLXSW_CORE_RES_GET(mlxsw_sp->core, MAX_RIFS); i++)
-               WARN_ON_ONCE(mlxsw_sp->router->rifs[i]);
-
-       kfree(mlxsw_sp->router->rifs);
 }
 
 int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp)
        if (err)
                goto err_router_init;
 
+       err = mlxsw_sp_rifs_init(mlxsw_sp);
+       if (err)
+               goto err_rifs_init;
+
        err = rhashtable_init(&mlxsw_sp->router->nexthop_ht,
                              &mlxsw_sp_nexthop_ht_params);
        if (err)
 err_nexthop_group_ht_init:
        rhashtable_destroy(&mlxsw_sp->router->nexthop_ht);
 err_nexthop_ht_init:
+       mlxsw_sp_rifs_fini(mlxsw_sp);
+err_rifs_init:
        __mlxsw_sp_router_fini(mlxsw_sp);
 err_router_init:
        kfree(mlxsw_sp->router);
        mlxsw_sp_lpm_fini(mlxsw_sp);
        rhashtable_destroy(&mlxsw_sp->router->nexthop_group_ht);
        rhashtable_destroy(&mlxsw_sp->router->nexthop_ht);
+       mlxsw_sp_rifs_fini(mlxsw_sp);
        __mlxsw_sp_router_fini(mlxsw_sp);
        kfree(mlxsw_sp->router);
 }