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