1  /* SPDX-License-Identifier: GPL-2.0 */
2  /* Copyright (C) 2018-2021, Intel Corporation. */
3  
4  #ifndef _ICE_LAG_H_
5  #define _ICE_LAG_H_
6  
7  #include <linux/netdevice.h>
8  
9  /* LAG roles for netdev */
10  enum ice_lag_role {
11  	ICE_LAG_NONE,
12  	ICE_LAG_PRIMARY,
13  	ICE_LAG_BACKUP,
14  	ICE_LAG_UNSET
15  };
16  
17  #define ICE_LAG_INVALID_PORT 0xFF
18  
19  #define ICE_LAG_RESET_RETRIES		5
20  #define ICE_SW_DEFAULT_PROFILE		0
21  #define ICE_FV_PROT_MDID		255
22  #define ICE_LP_EXT_BUF_OFFSET		32
23  
24  struct ice_pf;
25  struct ice_vf;
26  
27  struct ice_lag_netdev_list {
28  	struct list_head node;
29  	struct net_device *netdev;
30  };
31  
32  /* LAG info struct */
33  struct ice_lag {
34  	struct ice_pf *pf; /* backlink to PF struct */
35  	struct net_device *netdev; /* this PF's netdev */
36  	struct net_device *upper_netdev; /* upper bonding netdev */
37  	struct list_head *netdev_head;
38  	struct notifier_block notif_block;
39  	s32 bond_mode;
40  	u16 bond_swid; /* swid for primary interface */
41  	u8 active_port; /* lport value for the current active port */
42  	u8 bonded:1; /* currently bonded */
43  	u8 primary:1; /* this is primary */
44  	u16 pf_recipe;
45  	u16 lport_recipe;
46  	u16 pf_rx_rule_id;
47  	u16 pf_tx_rule_id;
48  	u16 cp_rule_idx;
49  	u16 lport_rule_idx;
50  	u8 role;
51  };
52  
53  /* LAG workqueue struct */
54  struct ice_lag_work {
55  	struct work_struct lag_task;
56  	struct ice_lag_netdev_list netdev_list;
57  	struct ice_lag *lag;
58  	unsigned long event;
59  	struct net_device *event_netdev;
60  	union {
61  		struct netdev_notifier_changeupper_info changeupper_info;
62  		struct netdev_notifier_bonding_info bonding_info;
63  		struct netdev_notifier_info notifier_info;
64  	} info;
65  };
66  
67  void ice_lag_move_new_vf_nodes(struct ice_vf *vf);
68  int ice_init_lag(struct ice_pf *pf);
69  void ice_deinit_lag(struct ice_pf *pf);
70  void ice_lag_rebuild(struct ice_pf *pf);
71  bool ice_lag_is_switchdev_running(struct ice_pf *pf);
72  void ice_lag_move_vf_nodes_cfg(struct ice_lag *lag, u8 src_prt, u8 dst_prt);
73  #endif /* _ICE_LAG_H_ */
74