return mlx5_core_roce_gid_set(dev->mdev, index, roce_version,
                                      roce_l3_type, gid->raw, mac, vlan,
-                                     vlan_id);
+                                     vlan_id, port_num);
 }
 
 static int mlx5_ib_add_gid(struct ib_device *device, u8 port_num,
 
        err = mlx5_core_roce_gid_set(fdev->mdev, conn->qp.sgid_index,
                                     MLX5_ROCE_VERSION_2,
                                     MLX5_ROCE_L3_TYPE_IPV6,
-                                    remote_ip, remote_mac, true, 0);
+                                    remote_ip, remote_mac, true, 0,
+                                    MLX5_FPGA_PORT_NUM);
        if (err) {
                mlx5_fpga_err(fdev, "Failed to set SGID: %d\n", err);
                ret = ERR_PTR(err);
        mlx5_fpga_conn_destroy_cq(conn);
 err_gid:
        mlx5_core_roce_gid_set(fdev->mdev, conn->qp.sgid_index, 0, 0, NULL,
-                              NULL, false, 0);
+                              NULL, false, 0, MLX5_FPGA_PORT_NUM);
 err_rsvd_gid:
        mlx5_core_reserved_gid_free(fdev->mdev, conn->qp.sgid_index);
 err:
        mlx5_fpga_conn_destroy_cq(conn);
 
        mlx5_core_roce_gid_set(conn->fdev->mdev, conn->qp.sgid_index, 0, 0,
-                              NULL, NULL, false, 0);
+                              NULL, NULL, false, 0, MLX5_FPGA_PORT_NUM);
        mlx5_core_reserved_gid_free(conn->fdev->mdev, conn->qp.sgid_index);
        kfree(conn);
 }
 
 
 int mlx5_core_roce_gid_set(struct mlx5_core_dev *dev, unsigned int index,
                           u8 roce_version, u8 roce_l3_type, const u8 *gid,
-                          const u8 *mac, bool vlan, u16 vlan_id)
+                          const u8 *mac, bool vlan, u16 vlan_id, u8 port_num)
 {
 #define MLX5_SET_RA(p, f, v) MLX5_SET(roce_addr_layout, p, f, v)
        u32  in[MLX5_ST_SZ_DW(set_roce_address_in)] = {0};
                memcpy(addr_l3_addr, gid, gidsz);
        }
 
+       if (MLX5_CAP_GEN(dev, num_vhca_ports) > 0)
+               MLX5_SET(set_roce_address_in, in, vhca_port_num, port_num);
+
        MLX5_SET(set_roce_address_in, in, roce_address_index, index);
        MLX5_SET(set_roce_address_in, in, opcode, MLX5_CMD_OP_SET_ROCE_ADDRESS);
        return mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
 
 unsigned int mlx5_core_reserved_gids_count(struct mlx5_core_dev *dev);
 int mlx5_core_roce_gid_set(struct mlx5_core_dev *dev, unsigned int index,
                           u8 roce_version, u8 roce_l3_type, const u8 *gid,
-                          const u8 *mac, bool vlan, u16 vlan_id);
+                          const u8 *mac, bool vlan, u16 vlan_id, u8 port_num);
 
 static inline int fw_initializing(struct mlx5_core_dev *dev)
 {