mlxsw: spectrum_fid: Make mlxsw_sp_fid_ops.setup return an int
authorPetr Machata <petrm@nvidia.com>
Tue, 28 Nov 2023 15:50:37 +0000 (16:50 +0100)
committerJakub Kicinski <kuba@kernel.org>
Thu, 30 Nov 2023 04:03:23 +0000 (20:03 -0800)
This operation will be fallible for rFIDs in CFF mode, which will be
introduced in follow-up patches. Have it return an int, and handle
the failures in the caller.

Signed-off-by: Petr Machata <petrm@nvidia.com>
Reviewed-by: Amit Cohen <amcohen@nvidia.com>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
Link: https://lore.kernel.org/r/75f1b85c0cb86bea5501fcc8657042f221a78b32.1701183892.git.petrm@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlxsw/spectrum_fid.c

index 96cedc2..ab0632b 100644 (file)
@@ -76,7 +76,7 @@ struct mlxsw_sp_flood_table {
 };
 
 struct mlxsw_sp_fid_ops {
-       void (*setup)(struct mlxsw_sp_fid *fid, const void *arg);
+       int (*setup)(struct mlxsw_sp_fid *fid, const void *arg);
        int (*configure)(struct mlxsw_sp_fid *fid);
        void (*deconfigure)(struct mlxsw_sp_fid *fid);
        int (*index_alloc)(struct mlxsw_sp_fid *fid, const void *arg,
@@ -417,12 +417,13 @@ u16 mlxsw_sp_fid_8021q_vid(const struct mlxsw_sp_fid *fid)
        return mlxsw_sp_fid_8021q_fid(fid)->vid;
 }
 
-static void mlxsw_sp_fid_8021q_setup(struct mlxsw_sp_fid *fid, const void *arg)
+static int mlxsw_sp_fid_8021q_setup(struct mlxsw_sp_fid *fid, const void *arg)
 {
        u16 vid = *(u16 *) arg;
 
        mlxsw_sp_fid_8021q_fid(fid)->vid = vid;
        fid->fid_offset = fid->fid_index - fid->fid_family->start_index;
+       return 0;
 }
 
 static enum mlxsw_reg_sfmr_op mlxsw_sp_sfmr_op(bool valid)
@@ -785,12 +786,13 @@ mlxsw_sp_fid_8021d_fid(const struct mlxsw_sp_fid *fid)
        return container_of(fid, struct mlxsw_sp_fid_8021d, common);
 }
 
-static void mlxsw_sp_fid_8021d_setup(struct mlxsw_sp_fid *fid, const void *arg)
+static int mlxsw_sp_fid_8021d_setup(struct mlxsw_sp_fid *fid, const void *arg)
 {
        int br_ifindex = *(int *) arg;
 
        mlxsw_sp_fid_8021d_fid(fid)->br_ifindex = br_ifindex;
        fid->fid_offset = fid->fid_index - fid->fid_family->start_index;
+       return 0;
 }
 
 static int mlxsw_sp_fid_8021d_configure(struct mlxsw_sp_fid *fid)
@@ -1127,11 +1129,12 @@ mlxsw_sp_fid_8021q_fdb_clear_offload(const struct mlxsw_sp_fid *fid,
        br_fdb_clear_offload(nve_dev, mlxsw_sp_fid_8021q_vid(fid));
 }
 
-static void mlxsw_sp_fid_rfid_setup_ctl(struct mlxsw_sp_fid *fid,
-                                       const void *arg)
+static int mlxsw_sp_fid_rfid_setup_ctl(struct mlxsw_sp_fid *fid,
+                                      const void *arg)
 {
        /* In controlled mode, the FW takes care of FID placement. */
        fid->fid_offset = 0;
+       return 0;
 }
 
 static int mlxsw_sp_fid_rfid_configure(struct mlxsw_sp_fid *fid)
@@ -1272,9 +1275,10 @@ static const struct mlxsw_sp_fid_ops mlxsw_sp_fid_rfid_ops_ctl = {
        .vid_to_fid_rif_update  = mlxsw_sp_fid_rfid_vid_to_fid_rif_update,
 };
 
-static void mlxsw_sp_fid_dummy_setup(struct mlxsw_sp_fid *fid, const void *arg)
+static int mlxsw_sp_fid_dummy_setup(struct mlxsw_sp_fid *fid, const void *arg)
 {
        fid->fid_offset = 0;
+       return 0;
 }
 
 static int mlxsw_sp_fid_dummy_configure(struct mlxsw_sp_fid *fid)
@@ -1590,7 +1594,9 @@ static struct mlxsw_sp_fid *mlxsw_sp_fid_get(struct mlxsw_sp *mlxsw_sp,
        fid->fid_index = fid_index;
        __set_bit(fid_index - fid_family->start_index, fid_family->fids_bitmap);
 
-       fid->fid_family->ops->setup(fid, arg);
+       err = fid->fid_family->ops->setup(fid, arg);
+       if (err)
+               goto err_setup;
 
        err = fid->fid_family->ops->configure(fid);
        if (err)
@@ -1608,6 +1614,7 @@ static struct mlxsw_sp_fid *mlxsw_sp_fid_get(struct mlxsw_sp *mlxsw_sp,
 err_rhashtable_insert:
        fid->fid_family->ops->deconfigure(fid);
 err_configure:
+err_setup:
        __clear_bit(fid_index - fid_family->start_index,
                    fid_family->fids_bitmap);
 err_index_alloc: