162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/* Copyright (C) 2018-2021, Intel Corporation. */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#ifndef _ICE_LAG_H_
562306a36Sopenharmony_ci#define _ICE_LAG_H_
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include <linux/netdevice.h>
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci/* LAG roles for netdev */
1062306a36Sopenharmony_cienum ice_lag_role {
1162306a36Sopenharmony_ci	ICE_LAG_NONE,
1262306a36Sopenharmony_ci	ICE_LAG_PRIMARY,
1362306a36Sopenharmony_ci	ICE_LAG_BACKUP,
1462306a36Sopenharmony_ci	ICE_LAG_UNSET
1562306a36Sopenharmony_ci};
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#define ICE_LAG_INVALID_PORT 0xFF
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#define ICE_LAG_RESET_RETRIES		5
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_cistruct ice_pf;
2262306a36Sopenharmony_cistruct ice_vf;
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_cistruct ice_lag_netdev_list {
2562306a36Sopenharmony_ci	struct list_head node;
2662306a36Sopenharmony_ci	struct net_device *netdev;
2762306a36Sopenharmony_ci};
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci/* LAG info struct */
3062306a36Sopenharmony_cistruct ice_lag {
3162306a36Sopenharmony_ci	struct ice_pf *pf; /* backlink to PF struct */
3262306a36Sopenharmony_ci	struct net_device *netdev; /* this PF's netdev */
3362306a36Sopenharmony_ci	struct net_device *upper_netdev; /* upper bonding netdev */
3462306a36Sopenharmony_ci	struct list_head *netdev_head;
3562306a36Sopenharmony_ci	struct notifier_block notif_block;
3662306a36Sopenharmony_ci	s32 bond_mode;
3762306a36Sopenharmony_ci	u16 bond_swid; /* swid for primary interface */
3862306a36Sopenharmony_ci	u8 active_port; /* lport value for the current active port */
3962306a36Sopenharmony_ci	u8 bonded:1; /* currently bonded */
4062306a36Sopenharmony_ci	u8 primary:1; /* this is primary */
4162306a36Sopenharmony_ci	u16 pf_recipe;
4262306a36Sopenharmony_ci	u16 pf_rule_id;
4362306a36Sopenharmony_ci	u16 cp_rule_idx;
4462306a36Sopenharmony_ci	u8 role;
4562306a36Sopenharmony_ci};
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci/* LAG workqueue struct */
4862306a36Sopenharmony_cistruct ice_lag_work {
4962306a36Sopenharmony_ci	struct work_struct lag_task;
5062306a36Sopenharmony_ci	struct ice_lag_netdev_list netdev_list;
5162306a36Sopenharmony_ci	struct ice_lag *lag;
5262306a36Sopenharmony_ci	unsigned long event;
5362306a36Sopenharmony_ci	struct net_device *event_netdev;
5462306a36Sopenharmony_ci	union {
5562306a36Sopenharmony_ci		struct netdev_notifier_changeupper_info changeupper_info;
5662306a36Sopenharmony_ci		struct netdev_notifier_bonding_info bonding_info;
5762306a36Sopenharmony_ci		struct netdev_notifier_info notifier_info;
5862306a36Sopenharmony_ci	} info;
5962306a36Sopenharmony_ci};
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_civoid ice_lag_move_new_vf_nodes(struct ice_vf *vf);
6262306a36Sopenharmony_ciint ice_init_lag(struct ice_pf *pf);
6362306a36Sopenharmony_civoid ice_deinit_lag(struct ice_pf *pf);
6462306a36Sopenharmony_civoid ice_lag_rebuild(struct ice_pf *pf);
6562306a36Sopenharmony_cibool ice_lag_is_switchdev_running(struct ice_pf *pf);
6662306a36Sopenharmony_civoid ice_lag_move_vf_nodes_cfg(struct ice_lag *lag, u8 src_prt, u8 dst_prt);
6762306a36Sopenharmony_ci#endif /* _ICE_LAG_H_ */
68