mlxsw: spectrum_router: Pass payload pointer to nexthop update function
authorIdo Schimmel <idosch@nvidia.com>
Wed, 24 Mar 2021 20:14:17 +0000 (22:14 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 24 Mar 2021 23:34:57 +0000 (16:34 -0700)
Have the caller pass a pointer to the payload of the RATR register to
the function updating a single nexthop / adjacency entry.

In a subsequent patch, this will allow the caller to make sure
replacement was successful by querying the state of the adjacency entry
after replacement and comparing with the initial request.

Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: Petr Machata <petrm@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/spectrum_dpipe.c
drivers/net/ethernet/mellanox/mlxsw/spectrum_ipip.c
drivers/net/ethernet/mellanox/mlxsw/spectrum_ipip.h
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.h

index 9ff286ba9bf0641e4fb40d24d30a66356ad9dfdc..1a2fef2a5379617d2d19fbbab8b7b943d021bdd5 100644 (file)
@@ -1178,6 +1178,7 @@ out:
 
 static int mlxsw_sp_dpipe_table_adj_counters_update(void *priv, bool enable)
 {
+       char ratr_pl[MLXSW_REG_RATR_LEN];
        struct mlxsw_sp *mlxsw_sp = priv;
        struct mlxsw_sp_nexthop *nh;
        u32 adj_hash_index = 0;
@@ -1197,7 +1198,7 @@ static int mlxsw_sp_dpipe_table_adj_counters_update(void *priv, bool enable)
                        mlxsw_sp_nexthop_counter_free(mlxsw_sp, nh);
                mlxsw_sp_nexthop_eth_update(mlxsw_sp,
                                            adj_index + adj_hash_index, nh,
-                                           true);
+                                           true, ratr_pl);
        }
        return 0;
 }
index 23896260720f1284ac3a503a14bad99e96d03d63..b8b08a6a1d1083ab1cb5e717643dfafb2e9242c5 100644 (file)
@@ -128,11 +128,10 @@ bool mlxsw_sp_l3addr_is_zero(union mlxsw_sp_l3addr addr)
 static int
 mlxsw_sp_ipip_nexthop_update_gre4(struct mlxsw_sp *mlxsw_sp, u32 adj_index,
                                  struct mlxsw_sp_ipip_entry *ipip_entry,
-                                 bool force)
+                                 bool force, char *ratr_pl)
 {
        u16 rif_index = mlxsw_sp_ipip_lb_rif_index(ipip_entry->ol_lb);
        __be32 daddr4 = mlxsw_sp_ipip_netdev_daddr4(ipip_entry->ol_dev);
-       char ratr_pl[MLXSW_REG_RATR_LEN];
        enum mlxsw_reg_ratr_op op;
 
        op = force ? MLXSW_REG_RATR_OP_WRITE_WRITE_ENTRY :
index af7dd19f50e6ec63ef9e56d0ac915f0b7125c7af..f0837b42d1d62e2d771f2e0d2ff6884ccd1b7f9e 100644 (file)
@@ -41,7 +41,7 @@ struct mlxsw_sp_ipip_ops {
 
        int (*nexthop_update)(struct mlxsw_sp *mlxsw_sp, u32 adj_index,
                              struct mlxsw_sp_ipip_entry *ipip_entry,
-                             bool force);
+                             bool force, char *ratr_pl);
 
        bool (*can_offload)(const struct mlxsw_sp *mlxsw_sp,
                            const struct net_device *ol_dev);
index 63c2c7a84c64ebc777a8c4f2c59be78134e3bc19..02200b183bf74118dfef6a95dcd0522d73672c02 100644 (file)
@@ -3420,10 +3420,9 @@ err_mass_update_vr:
 static int __mlxsw_sp_nexthop_eth_update(struct mlxsw_sp *mlxsw_sp,
                                         u32 adj_index,
                                         struct mlxsw_sp_nexthop *nh,
-                                        bool force)
+                                        bool force, char *ratr_pl)
 {
        struct mlxsw_sp_neigh_entry *neigh_entry = nh->neigh_entry;
-       char ratr_pl[MLXSW_REG_RATR_LEN];
        enum mlxsw_reg_ratr_op op;
        u16 rif_index;
 
@@ -3459,7 +3458,8 @@ static int __mlxsw_sp_nexthop_eth_update(struct mlxsw_sp *mlxsw_sp,
 }
 
 int mlxsw_sp_nexthop_eth_update(struct mlxsw_sp *mlxsw_sp, u32 adj_index,
-                               struct mlxsw_sp_nexthop *nh, bool force)
+                               struct mlxsw_sp_nexthop *nh, bool force,
+                               char *ratr_pl)
 {
        int i;
 
@@ -3467,7 +3467,7 @@ int mlxsw_sp_nexthop_eth_update(struct mlxsw_sp *mlxsw_sp, u32 adj_index,
                int err;
 
                err = __mlxsw_sp_nexthop_eth_update(mlxsw_sp, adj_index + i,
-                                                   nh, force);
+                                                   nh, force, ratr_pl);
                if (err)
                        return err;
        }
@@ -3478,18 +3478,19 @@ int mlxsw_sp_nexthop_eth_update(struct mlxsw_sp *mlxsw_sp, u32 adj_index,
 static int __mlxsw_sp_nexthop_ipip_update(struct mlxsw_sp *mlxsw_sp,
                                          u32 adj_index,
                                          struct mlxsw_sp_nexthop *nh,
-                                         bool force)
+                                         bool force, char *ratr_pl)
 {
        const struct mlxsw_sp_ipip_ops *ipip_ops;
 
        ipip_ops = mlxsw_sp->router->ipip_ops_arr[nh->ipip_entry->ipipt];
        return ipip_ops->nexthop_update(mlxsw_sp, adj_index, nh->ipip_entry,
-                                       force);
+                                       force, ratr_pl);
 }
 
 static int mlxsw_sp_nexthop_ipip_update(struct mlxsw_sp *mlxsw_sp,
                                        u32 adj_index,
-                                       struct mlxsw_sp_nexthop *nh, bool force)
+                                       struct mlxsw_sp_nexthop *nh, bool force,
+                                       char *ratr_pl)
 {
        int i;
 
@@ -3497,7 +3498,7 @@ static int mlxsw_sp_nexthop_ipip_update(struct mlxsw_sp *mlxsw_sp,
                int err;
 
                err = __mlxsw_sp_nexthop_ipip_update(mlxsw_sp, adj_index + i,
-                                                    nh, force);
+                                                    nh, force, ratr_pl);
                if (err)
                        return err;
        }
@@ -3506,7 +3507,8 @@ static int mlxsw_sp_nexthop_ipip_update(struct mlxsw_sp *mlxsw_sp,
 }
 
 static int mlxsw_sp_nexthop_update(struct mlxsw_sp *mlxsw_sp, u32 adj_index,
-                                  struct mlxsw_sp_nexthop *nh, bool force)
+                                  struct mlxsw_sp_nexthop *nh, bool force,
+                                  char *ratr_pl)
 {
        /* When action is discard or trap, the nexthop must be
         * programmed as an Ethernet nexthop.
@@ -3515,10 +3517,10 @@ static int mlxsw_sp_nexthop_update(struct mlxsw_sp *mlxsw_sp, u32 adj_index,
            nh->action == MLXSW_SP_NEXTHOP_ACTION_DISCARD ||
            nh->action == MLXSW_SP_NEXTHOP_ACTION_TRAP)
                return mlxsw_sp_nexthop_eth_update(mlxsw_sp, adj_index, nh,
-                                                  force);
+                                                  force, ratr_pl);
        else
                return mlxsw_sp_nexthop_ipip_update(mlxsw_sp, adj_index, nh,
-                                                   force);
+                                                   force, ratr_pl);
 }
 
 static int
@@ -3526,6 +3528,7 @@ mlxsw_sp_nexthop_group_update(struct mlxsw_sp *mlxsw_sp,
                              struct mlxsw_sp_nexthop_group_info *nhgi,
                              bool reallocate)
 {
+       char ratr_pl[MLXSW_REG_RATR_LEN];
        u32 adj_index = nhgi->adj_index; /* base */
        struct mlxsw_sp_nexthop *nh;
        int i;
@@ -3542,7 +3545,7 @@ mlxsw_sp_nexthop_group_update(struct mlxsw_sp *mlxsw_sp,
                        int err = 0;
 
                        err = mlxsw_sp_nexthop_update(mlxsw_sp, adj_index, nh,
-                                                     true);
+                                                     true, ratr_pl);
                        if (err)
                                return err;
                        nh->update = 0;
index 3bb2a06359a3d097f46f77ddd0e047e8b745f616..b85c5f6c2262d518b1193d31fa009f06d7a107a1 100644 (file)
@@ -209,7 +209,8 @@ bool mlxsw_sp_nexthop_group_has_ipip(struct mlxsw_sp_nexthop *nh);
 int mlxsw_sp_nexthop_counter_get(struct mlxsw_sp *mlxsw_sp,
                                 struct mlxsw_sp_nexthop *nh, u64 *p_counter);
 int mlxsw_sp_nexthop_eth_update(struct mlxsw_sp *mlxsw_sp, u32 adj_index,
-                               struct mlxsw_sp_nexthop *nh, bool force);
+                               struct mlxsw_sp_nexthop *nh, bool force,
+                               char *ratr_pl);
 void mlxsw_sp_nexthop_counter_alloc(struct mlxsw_sp *mlxsw_sp,
                                    struct mlxsw_sp_nexthop *nh);
 void mlxsw_sp_nexthop_counter_free(struct mlxsw_sp *mlxsw_sp,