From: Bodong Wang <bod...@mellanox.com>

In SmartNIC mode, the eswitch manager is not necessarily the PF
(vport 0). Use a helper function to get the correct eswitch manager
vport number and cache on the eswitch instance for fast reference.

Signed-off-by: Bodong Wang <bod...@mellanox.com>
Signed-off-by: Eli Cohen <e...@mellanox.com>
Reviewed-by: Or Gerlitz <ogerl...@mellanox.com>
Signed-off-by: Saeed Mahameed <sae...@mellanox.com>
---
 .../net/ethernet/mellanox/mlx5/core/eswitch.c | 35 ++++++++++++-------
 .../net/ethernet/mellanox/mlx5/core/eswitch.h | 10 ++++++
 .../mellanox/mlx5/core/eswitch_offloads.c     |  7 ++--
 include/linux/mlx5/vport.h                    |  2 ++
 4 files changed, 39 insertions(+), 15 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c 
b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
index 05830696abd8..9c622749dbde 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
@@ -378,16 +378,16 @@ static int esw_add_uc_addr(struct mlx5_eswitch *esw, 
struct vport_addr *vaddr)
        u16 vport = vaddr->vport;
        int err;
 
-       /* Skip mlx5_mpfs_add_mac for PFs,
-        * it is already done by the PF netdev in mlx5e_execute_l2_action
+       /* Skip mlx5_mpfs_add_mac for eswitch_managers,
+        * it is already done by its netdev in mlx5e_execute_l2_action
         */
-       if (!vport)
+       if (esw->manager_vport == vport)
                goto fdb_add;
 
        err = mlx5_mpfs_add_mac(esw->dev, mac);
        if (err) {
                esw_warn(esw->dev,
-                        "Failed to add L2 table mac(%pM) for vport(%d), 
err(%d)\n",
+                        "Failed to add L2 table mac(%pM) for vport(0x%x), 
err(%d)\n",
                         mac, vport, err);
                return err;
        }
@@ -410,10 +410,10 @@ static int esw_del_uc_addr(struct mlx5_eswitch *esw, 
struct vport_addr *vaddr)
        u16 vport = vaddr->vport;
        int err = 0;
 
-       /* Skip mlx5_mpfs_del_mac for PFs,
-        * it is already done by the PF netdev in mlx5e_execute_l2_action
+       /* Skip mlx5_mpfs_del_mac for eswitch managerss,
+        * it is already done by its netdev in mlx5e_execute_l2_action
         */
-       if (!vport || !vaddr->mpfs)
+       if (!vaddr->mpfs || esw->manager_vport == vport)
                goto fdb_del;
 
        err = mlx5_mpfs_del_mac(esw->dev, mac);
@@ -1457,15 +1457,22 @@ static void esw_apply_vport_conf(struct mlx5_eswitch 
*esw,
 {
        int vport_num = vport->vport;
 
-       if (!vport_num)
+       if (esw->manager_vport == vport_num)
                return;
 
        mlx5_modify_vport_admin_state(esw->dev,
                                      MLX5_VPORT_STATE_OP_MOD_ESW_VPORT,
                                      vport_num,
                                      vport->info.link_state);
-       mlx5_modify_nic_vport_mac_address(esw->dev, vport_num, vport->info.mac);
-       mlx5_modify_nic_vport_node_guid(esw->dev, vport_num, 
vport->info.node_guid);
+
+       /* Host PF has its own mac/guid. */
+       if (vport_num) {
+               mlx5_modify_nic_vport_mac_address(esw->dev, vport_num,
+                                                 vport->info.mac);
+               mlx5_modify_nic_vport_node_guid(esw->dev, vport_num,
+                                               vport->info.node_guid);
+       }
+
        modify_esw_vport_cvlan(esw->dev, vport_num, vport->info.vlan, 
vport->info.qos,
                               (vport->info.vlan || vport->info.qos));
 
@@ -1537,8 +1544,11 @@ static void esw_enable_vport(struct mlx5_eswitch *esw, 
int vport_num,
        vport->enabled_events = enable_events;
        vport->enabled = true;
 
-       /* only PF is trusted by default */
-       if (!vport_num)
+       /* Esw manager is trusted by default. Host PF (vport 0) is trusted as 
well
+        * in smartNIC as it's a vport group manager.
+        */
+       if (esw->manager_vport == vport_num ||
+           (!vport_num && mlx5_core_is_ecpf(esw->dev)))
                vport->info.trusted = true;
 
        esw_vport_change_handle_locked(vport);
@@ -1733,6 +1743,7 @@ int mlx5_eswitch_init(struct mlx5_core_dev *dev)
                return -ENOMEM;
 
        esw->dev = dev;
+       esw->manager_vport = mlx5_eswitch_manager_vport(dev);
 
        esw->work_queue = create_singlethread_workqueue("mlx5_esw_wq");
        if (!esw->work_queue) {
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h 
b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
index 0a3eee8746c1..959a9e28d08f 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
@@ -38,6 +38,7 @@
 #include <net/devlink.h>
 #include <linux/mlx5/device.h>
 #include <linux/mlx5/eswitch.h>
+#include <linux/mlx5/vport.h>
 #include <linux/mlx5/fs.h>
 #include "lib/mpfs.h"
 
@@ -204,6 +205,7 @@ struct mlx5_eswitch {
        struct mlx5_esw_offload offloads;
        int                     mode;
        int                     nvports;
+       u16                     manager_vport;
 };
 
 void esw_offloads_cleanup(struct mlx5_eswitch *esw, int nvports);
@@ -363,6 +365,14 @@ bool mlx5_esw_lag_prereq(struct mlx5_core_dev *dev0,
 
 #define esw_debug(dev, format, ...)                            \
        mlx5_core_dbg_mask(dev, MLX5_DEBUG_ESWITCH_MASK, format, ##__VA_ARGS__)
+
+/* The returned number is valid only when the dev is eswitch manager. */
+static inline u16 mlx5_eswitch_manager_vport(struct mlx5_core_dev *dev)
+{
+       return mlx5_core_is_ecpf_esw_manager(dev) ?
+               MLX5_VPORT_ECPF : MLX5_VPORT_PF;
+}
+
 #else  /* CONFIG_MLX5_ESWITCH */
 /* eswitch API stubs */
 static inline int  mlx5_eswitch_init(struct mlx5_core_dev *dev) { return 0; }
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c 
b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
index 9128b45f3f37..af2c44d31357 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
@@ -522,7 +522,8 @@ mlx5_eswitch_add_send_to_vport_rule(struct mlx5_eswitch 
*esw, int vport, u32 sqn
 
        misc = MLX5_ADDR_OF(fte_match_param, spec->match_value, 
misc_parameters);
        MLX5_SET(fte_match_set_misc, misc, source_sqn, sqn);
-       MLX5_SET(fte_match_set_misc, misc, source_port, 0x0); /* source vport 
is 0 */
+       /* source vport is the esw manager */
+       MLX5_SET(fte_match_set_misc, misc, source_port, esw->manager_vport);
 
        misc = MLX5_ADDR_OF(fte_match_param, spec->match_criteria, 
misc_parameters);
        MLX5_SET_TO_ONES(fte_match_set_misc, misc, source_sqn);
@@ -567,7 +568,7 @@ static void peer_miss_rules_setup(struct mlx5_core_dev 
*peer_dev,
                         source_eswitch_owner_vhca_id);
 
        dest->type = MLX5_FLOW_DESTINATION_TYPE_VPORT;
-       dest->vport.num = 0;
+       dest->vport.num = peer_dev->priv.eswitch->manager_vport;
        dest->vport.vhca_id = MLX5_CAP_GEN(peer_dev, vhca_id);
        dest->vport.flags |= MLX5_FLOW_DEST_VPORT_VHCA_ID;
 }
@@ -666,7 +667,7 @@ static int esw_add_fdb_miss_rule(struct mlx5_eswitch *esw)
        dmac_c[0] = 0x01;
 
        dest.type = MLX5_FLOW_DESTINATION_TYPE_VPORT;
-       dest.vport.num = 0;
+       dest.vport.num = esw->manager_vport;
        flow_act.action = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
 
        flow_rule = mlx5_add_flow_rules(esw->fdb_table.offloads.slow_fdb, spec,
diff --git a/include/linux/mlx5/vport.h b/include/linux/mlx5/vport.h
index 3bc05449ac39..b67bcc95ab5d 100644
--- a/include/linux/mlx5/vport.h
+++ b/include/linux/mlx5/vport.h
@@ -52,6 +52,8 @@ enum {
 };
 
 enum {
+       MLX5_VPORT_PF                   = 0x0,
+       MLX5_VPORT_ECPF                 = 0xfffe,
        MLX5_VPORT_UPLINK               = 0xffff
 };
 
-- 
2.20.1

Reply via email to