static inline bool mlx5_ib_lag_should_assign_affinity(struct mlx5_ib_dev *dev)
 {
+       /*
+        * If the driver is in hash mode and the port_select_flow_table_bypass cap
+        * is supported, it means that the driver no longer needs to assign the port
+        * affinity by default. If a user wants to set the port affinity explicitly,
+        * the user has a dedicated API to do that, so there is no need to assign
+        * the port affinity by default.
+        */
+       if (dev->lag_active &&
+           mlx5_lag_mode_is_hash(dev->mdev) &&
+           MLX5_CAP_PORT_SELECTION(dev->mdev, port_select_flow_table_bypass))
+               return 0;
+
        return dev->lag_active ||
                (MLX5_CAP_GEN(dev->mdev, num_lag_ports) > 1 &&
                 MLX5_CAP_GEN(dev->mdev, lag_tx_port_affinity));
 
 }
 EXPORT_SYMBOL(mlx5_lag_is_active);
 
+bool mlx5_lag_mode_is_hash(struct mlx5_core_dev *dev)
+{
+       struct mlx5_lag *ldev;
+       unsigned long flags;
+       bool res = 0;
+
+       spin_lock_irqsave(&lag_lock, flags);
+       ldev = mlx5_lag_dev(dev);
+       if (ldev)
+               res = test_bit(MLX5_LAG_MODE_FLAG_HASH_BASED, &ldev->mode_flags);
+       spin_unlock_irqrestore(&lag_lock, flags);
+
+       return res;
+}
+EXPORT_SYMBOL(mlx5_lag_mode_is_hash);
+
 bool mlx5_lag_is_master(struct mlx5_core_dev *dev)
 {
        struct mlx5_lag *ldev;
 
 bool mlx5_lag_is_roce(struct mlx5_core_dev *dev);
 bool mlx5_lag_is_sriov(struct mlx5_core_dev *dev);
 bool mlx5_lag_is_active(struct mlx5_core_dev *dev);
+bool mlx5_lag_mode_is_hash(struct mlx5_core_dev *dev);
 bool mlx5_lag_is_master(struct mlx5_core_dev *dev);
 bool mlx5_lag_is_shared_fdb(struct mlx5_core_dev *dev);
 struct net_device *mlx5_lag_get_roce_netdev(struct mlx5_core_dev *dev);