1b37ad2e2SJunxian Huang /* SPDX-License-Identifier: GPL-2.0+ */ 2b37ad2e2SJunxian Huang /* 3b37ad2e2SJunxian Huang * Copyright (c) 2025 Hisilicon Limited. 4b37ad2e2SJunxian Huang */ 5b37ad2e2SJunxian Huang 6b37ad2e2SJunxian Huang #ifndef _HNS_ROCE_BOND_H 7b37ad2e2SJunxian Huang #define _HNS_ROCE_BOND_H 8b37ad2e2SJunxian Huang 9b37ad2e2SJunxian Huang #include <linux/netdevice.h> 10b37ad2e2SJunxian Huang #include <net/bonding.h> 11b37ad2e2SJunxian Huang 12b37ad2e2SJunxian Huang #define ROCE_BOND_FUNC_MAX 4 13b37ad2e2SJunxian Huang #define ROCE_BOND_NUM_MAX 2 14b37ad2e2SJunxian Huang 15b37ad2e2SJunxian Huang #define BOND_ID(id) BIT(id) 16b37ad2e2SJunxian Huang 17d9023e46SJunxian Huang #define BOND_ERR_LOG(fmt, ...) \ 18d9023e46SJunxian Huang pr_err("HNS RoCE Bonding: " fmt, ##__VA_ARGS__) 19d9023e46SJunxian Huang 2014f0455eSJunxian Huang enum { 2114f0455eSJunxian Huang BOND_MODE_1, 2214f0455eSJunxian Huang BOND_MODE_2_4, 2314f0455eSJunxian Huang }; 2414f0455eSJunxian Huang 2514f0455eSJunxian Huang enum hns_roce_bond_hashtype { 2614f0455eSJunxian Huang BOND_HASH_L2, 2714f0455eSJunxian Huang BOND_HASH_L34, 2814f0455eSJunxian Huang BOND_HASH_L23, 2914f0455eSJunxian Huang }; 3014f0455eSJunxian Huang 31d31d410bSJunxian Huang enum bond_support_type { 32d31d410bSJunxian Huang BOND_NOT_SUPPORT, 33d31d410bSJunxian Huang /* 34d31d410bSJunxian Huang * bond_grp already exists, but in the current 35d31d410bSJunxian Huang * conditions it's no longer supported 36d31d410bSJunxian Huang */ 37d31d410bSJunxian Huang BOND_EXISTING_NOT_SUPPORT, 38d31d410bSJunxian Huang BOND_SUPPORT, 39d31d410bSJunxian Huang }; 40d31d410bSJunxian Huang 41d31d410bSJunxian Huang enum hns_roce_bond_state { 42d31d410bSJunxian Huang HNS_ROCE_BOND_NOT_ATTACHED, 43d31d410bSJunxian Huang HNS_ROCE_BOND_NOT_BONDED, 44d31d410bSJunxian Huang HNS_ROCE_BOND_IS_BONDED, 45d31d410bSJunxian Huang HNS_ROCE_BOND_SLAVE_CHANGE_NUM, 46d31d410bSJunxian Huang HNS_ROCE_BOND_SLAVE_CHANGESTATE, 47d31d410bSJunxian Huang }; 48d31d410bSJunxian Huang 4914f0455eSJunxian Huang enum hns_roce_bond_cmd_type { 5014f0455eSJunxian Huang HNS_ROCE_SET_BOND, 5114f0455eSJunxian Huang HNS_ROCE_CHANGE_BOND, 5214f0455eSJunxian Huang HNS_ROCE_CLEAR_BOND, 5314f0455eSJunxian Huang }; 5414f0455eSJunxian Huang 55b37ad2e2SJunxian Huang struct hns_roce_func_info { 56b37ad2e2SJunxian Huang struct net_device *net_dev; 57d31d410bSJunxian Huang struct hnae3_handle *handle; 58b37ad2e2SJunxian Huang }; 59b37ad2e2SJunxian Huang 60b37ad2e2SJunxian Huang struct hns_roce_bond_group { 61b37ad2e2SJunxian Huang struct net_device *upper_dev; 62d31d410bSJunxian Huang struct hns_roce_dev *main_hr_dev; 6314f0455eSJunxian Huang u8 active_slave_num; 6414f0455eSJunxian Huang u32 slave_map; 6514f0455eSJunxian Huang u32 active_slave_map; 66b37ad2e2SJunxian Huang u8 bond_id; 67b37ad2e2SJunxian Huang u8 bus_num; 68b37ad2e2SJunxian Huang struct hns_roce_func_info bond_func_info[ROCE_BOND_FUNC_MAX]; 69d31d410bSJunxian Huang bool bond_ready; 70d31d410bSJunxian Huang enum hns_roce_bond_state bond_state; 71d31d410bSJunxian Huang enum netdev_lag_tx_type tx_type; 72d31d410bSJunxian Huang enum netdev_lag_hash hash_type; 73d31d410bSJunxian Huang struct mutex bond_mutex; 74d31d410bSJunxian Huang struct notifier_block bond_nb; 75*5d91677bSJunxian Huang struct delayed_work bond_work; 76b37ad2e2SJunxian Huang }; 77b37ad2e2SJunxian Huang 78b37ad2e2SJunxian Huang struct hns_roce_die_info { 79b37ad2e2SJunxian Huang u8 bond_id_mask; 80b37ad2e2SJunxian Huang struct hns_roce_bond_group *bgrps[ROCE_BOND_NUM_MAX]; 81*5d91677bSJunxian Huang struct mutex die_mutex; 82*5d91677bSJunxian Huang u8 suspend_cnt; 83b37ad2e2SJunxian Huang }; 84b37ad2e2SJunxian Huang 85b37ad2e2SJunxian Huang struct hns_roce_bond_group *hns_roce_get_bond_grp(struct net_device *net_dev, 86b37ad2e2SJunxian Huang u8 bus_num); 87b37ad2e2SJunxian Huang int hns_roce_alloc_bond_grp(struct hns_roce_dev *hr_dev); 88b37ad2e2SJunxian Huang void hns_roce_dealloc_bond_grp(void); 89d9023e46SJunxian Huang void hns_roce_cleanup_bond(struct hns_roce_bond_group *bond_grp); 90d9023e46SJunxian Huang bool hns_roce_bond_is_active(struct hns_roce_dev *hr_dev); 91d9023e46SJunxian Huang int hns_roce_bond_init(struct hns_roce_dev *hr_dev); 92*5d91677bSJunxian Huang void hns_roce_bond_suspend(struct hnae3_handle *handle); 93*5d91677bSJunxian Huang void hns_roce_bond_resume(struct hnae3_handle *handle); 94b37ad2e2SJunxian Huang 95b37ad2e2SJunxian Huang #endif 96