static struct mlx5_vport *mlx5_eswitch_get_vport(struct mlx5_eswitch *esw,
                                                 u16 vport_num)
 {
+       u16 idx = mlx5_eswitch_vport_num_to_index(esw, vport_num);
+
        WARN_ON(vport_num > esw->total_vports - 1);
-       return &esw->vports[vport_num];
+       return &esw->vports[idx];
 }
 
 static int arm_vport_context_events_cmd(struct mlx5_core_dev *dev, u16 vport,
        int total_vports = MLX5_TOTAL_VPORTS(dev);
        struct mlx5_eswitch *esw;
        struct mlx5_vport *vport;
-       int vport_num;
-       int err;
+       int err, i;
 
        if (!MLX5_VPORT_MANAGER(dev))
                return 0;
        hash_init(esw->offloads.mod_hdr_tbl);
        mutex_init(&esw->state_lock);
 
-       mlx5_esw_for_all_vports(esw, vport_num, vport) {
-               vport->vport = vport_num;
+       mlx5_esw_for_all_vports(esw, i, vport) {
+               vport->vport = mlx5_eswitch_index_to_vport_num(esw, i);
                vport->info.link_state = MLX5_VPORT_ADMIN_STATE_AUTO;
                vport->dev = dev;
                INIT_WORK(&vport->vport_change_handler,
 
                MLX5_VPORT_ECPF : MLX5_VPORT_PF;
 }
 
+static inline int mlx5_eswitch_uplink_idx(struct mlx5_eswitch *esw)
+{
+       /* Uplink always locate at the last element of the array.*/
+       return esw->total_vports - 1;
+}
+
+static inline int mlx5_eswitch_vport_num_to_index(struct mlx5_eswitch *esw,
+                                                 u16 vport_num)
+{
+       if (vport_num == MLX5_VPORT_UPLINK)
+               return mlx5_eswitch_uplink_idx(esw);
+
+       return vport_num;
+}
+
+static inline int mlx5_eswitch_index_to_vport_num(struct mlx5_eswitch *esw,
+                                                 int index)
+{
+       if (index == mlx5_eswitch_uplink_idx(esw))
+               return MLX5_VPORT_UPLINK;
+
+       return index;
+}
+
 #else  /* CONFIG_MLX5_ESWITCH */
 /* eswitch API stubs */
 static inline int  mlx5_eswitch_init(struct mlx5_core_dev *dev) { return 0; }
 
 static struct mlx5_eswitch_rep *mlx5_eswitch_get_rep(struct mlx5_eswitch *esw,
                                                     u16 vport_num)
 {
-       u16 idx = vport_num;
-
-       if (vport_num == MLX5_VPORT_UPLINK)
-               idx = UPLINK_REP_INDEX;
+       u16 idx = mlx5_eswitch_vport_num_to_index(esw, vport_num);
 
        WARN_ON(idx > esw->total_vports - 1);
        return &esw->offloads.vport_reps[idx];
 {
        int total_vfs = MLX5_TOTAL_VPORTS(esw->dev);
        struct mlx5_core_dev *dev = esw->dev;
-       struct mlx5_esw_offload *offloads;
        struct mlx5_eswitch_rep *rep;
        u8 hw_id[ETH_ALEN], rep_type;
        int vport;
        if (!esw->offloads.vport_reps)
                return -ENOMEM;
 
-       offloads = &esw->offloads;
        mlx5_query_nic_vport_mac_address(dev, 0, hw_id);
 
        mlx5_esw_for_all_reps(esw, vport, rep) {
-               rep->vport = vport;
+               rep->vport = mlx5_eswitch_index_to_vport_num(esw, vport);
                ether_addr_copy(rep->hw_id, hw_id);
 
                for (rep_type = 0; rep_type < NUM_REP_TYPES; rep_type++)
                        rep->rep_if[rep_type].state = REP_UNREGISTERED;
        }
 
-       offloads->vport_reps[0].vport = MLX5_VPORT_UPLINK;
-
        return 0;
 }
 
 
 #include <linux/mlx5/driver.h>
 #include <linux/mlx5/device.h>
 
-#define MLX5_VPORT_PF_PLACEHOLDER (1u)
-#define MLX5_SPECIAL_VPORTS (MLX5_VPORT_PF_PLACEHOLDER)
-#define MLX5_TOTAL_VPORTS(mdev) (MLX5_SPECIAL_VPORTS + mlx5_core_max_vfs(mdev))
+#define MLX5_VPORT_PF_PLACEHOLDER              (1u)
+#define MLX5_VPORT_UPLINK_PLACEHOLDER          (1u)
+
+#define MLX5_SPECIAL_VPORTS    (MLX5_VPORT_PF_PLACEHOLDER +            \
+                                MLX5_VPORT_UPLINK_PLACEHOLDER)
+
+#define MLX5_TOTAL_VPORTS(mdev)        (MLX5_SPECIAL_VPORTS +                  \
+                                mlx5_core_max_vfs(mdev))
 
 #define MLX5_VPORT_MANAGER(mdev)                                       \
        (MLX5_CAP_GEN(mdev, vport_group_manager) &&                     \