/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ /* Copyright (c) 2019 Mellanox Technologies. */ #ifndef __MLX5_LAG_H__ #define __MLX5_LAG_H__ #include "mlx5_core.h" #include "lag_mp.h" enum { MLX5_LAG_P1, MLX5_LAG_P2, }; enum { MLX5_LAG_FLAG_ROCE = 1 << 0, MLX5_LAG_FLAG_SRIOV = 1 << 1, MLX5_LAG_FLAG_MULTIPATH = 1 << 2, }; #define MLX5_LAG_MODE_FLAGS (MLX5_LAG_FLAG_ROCE | MLX5_LAG_FLAG_SRIOV |\ MLX5_LAG_FLAG_MULTIPATH) struct lag_func { struct mlx5_core_dev *dev; struct net_device *netdev; }; /* Used for collection of netdev event info. */ struct lag_tracker { enum netdev_lag_tx_type tx_type; struct netdev_lag_lower_state_info netdev_state[MLX5_MAX_PORTS]; unsigned int is_bonded:1; }; /* LAG data of a ConnectX card. * It serves both its phys functions. */ struct mlx5_lag { u8 flags; u8 v2p_map[MLX5_MAX_PORTS]; struct lag_func pf[MLX5_MAX_PORTS]; struct lag_tracker tracker; struct workqueue_struct *wq; struct delayed_work bond_work; struct notifier_block nb; struct lag_mp lag_mp; }; static inline struct mlx5_lag * mlx5_lag_dev_get(struct mlx5_core_dev *dev) { return dev->priv.lag; } static inline bool __mlx5_lag_is_active(struct mlx5_lag *ldev) { return !!(ldev->flags & MLX5_LAG_MODE_FLAGS); } void mlx5_modify_lag(struct mlx5_lag *ldev, struct lag_tracker *tracker); int mlx5_activate_lag(struct mlx5_lag *ldev, struct lag_tracker *tracker, u8 flags); int mlx5_lag_dev_get_netdev_idx(struct mlx5_lag *ldev, struct net_device *ndev); #endif /* __MLX5_LAG_H__ */