1/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ 2/* Copyright (c) 2019 Mellanox Technologies. */ 3 4#ifndef __MLX5_LAG_H__ 5#define __MLX5_LAG_H__ 6 7#include "mlx5_core.h" 8#include "lag_mp.h" 9 10enum { 11 MLX5_LAG_FLAG_ROCE = 1 << 0, 12 MLX5_LAG_FLAG_SRIOV = 1 << 1, 13 MLX5_LAG_FLAG_MULTIPATH = 1 << 2, 14}; 15 16#define MLX5_LAG_MODE_FLAGS (MLX5_LAG_FLAG_ROCE | MLX5_LAG_FLAG_SRIOV |\ 17 MLX5_LAG_FLAG_MULTIPATH) 18 19struct lag_func { 20 struct mlx5_core_dev *dev; 21 struct net_device *netdev; 22}; 23 24/* Used for collection of netdev event info. */ 25struct lag_tracker { 26 enum netdev_lag_tx_type tx_type; 27 struct netdev_lag_lower_state_info netdev_state[MLX5_MAX_PORTS]; 28 unsigned int is_bonded:1; 29}; 30 31/* LAG data of a ConnectX card. 32 * It serves both its phys functions. 33 */ 34struct mlx5_lag { 35 u8 flags; 36 u8 v2p_map[MLX5_MAX_PORTS]; 37 struct lag_func pf[MLX5_MAX_PORTS]; 38 struct lag_tracker tracker; 39 struct workqueue_struct *wq; 40 struct delayed_work bond_work; 41 struct notifier_block nb; 42 struct lag_mp lag_mp; 43}; 44 45static inline struct mlx5_lag * 46mlx5_lag_dev_get(struct mlx5_core_dev *dev) 47{ 48 return dev->priv.lag; 49} 50 51static inline bool 52__mlx5_lag_is_active(struct mlx5_lag *ldev) 53{ 54 return !!(ldev->flags & MLX5_LAG_MODE_FLAGS); 55} 56 57void mlx5_modify_lag(struct mlx5_lag *ldev, 58 struct lag_tracker *tracker); 59int mlx5_activate_lag(struct mlx5_lag *ldev, 60 struct lag_tracker *tracker, 61 u8 flags); 62int mlx5_lag_dev_get_netdev_idx(struct mlx5_lag *ldev, 63 struct net_device *ndev); 64 65#endif /* __MLX5_LAG_H__ */ 66