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 17*14f0455eSJunxian Huang enum { 18*14f0455eSJunxian Huang BOND_MODE_1, 19*14f0455eSJunxian Huang BOND_MODE_2_4, 20*14f0455eSJunxian Huang }; 21*14f0455eSJunxian Huang 22*14f0455eSJunxian Huang enum hns_roce_bond_hashtype { 23*14f0455eSJunxian Huang BOND_HASH_L2, 24*14f0455eSJunxian Huang BOND_HASH_L34, 25*14f0455eSJunxian Huang BOND_HASH_L23, 26*14f0455eSJunxian Huang }; 27*14f0455eSJunxian Huang 28d31d410bSJunxian Huang enum bond_support_type { 29d31d410bSJunxian Huang BOND_NOT_SUPPORT, 30d31d410bSJunxian Huang /* 31d31d410bSJunxian Huang * bond_grp already exists, but in the current 32d31d410bSJunxian Huang * conditions it's no longer supported 33d31d410bSJunxian Huang */ 34d31d410bSJunxian Huang BOND_EXISTING_NOT_SUPPORT, 35d31d410bSJunxian Huang BOND_SUPPORT, 36d31d410bSJunxian Huang }; 37d31d410bSJunxian Huang 38d31d410bSJunxian Huang enum hns_roce_bond_state { 39d31d410bSJunxian Huang HNS_ROCE_BOND_NOT_ATTACHED, 40d31d410bSJunxian Huang HNS_ROCE_BOND_NOT_BONDED, 41d31d410bSJunxian Huang HNS_ROCE_BOND_IS_BONDED, 42d31d410bSJunxian Huang HNS_ROCE_BOND_SLAVE_CHANGE_NUM, 43d31d410bSJunxian Huang HNS_ROCE_BOND_SLAVE_CHANGESTATE, 44d31d410bSJunxian Huang }; 45d31d410bSJunxian Huang 46*14f0455eSJunxian Huang enum hns_roce_bond_cmd_type { 47*14f0455eSJunxian Huang HNS_ROCE_SET_BOND, 48*14f0455eSJunxian Huang HNS_ROCE_CHANGE_BOND, 49*14f0455eSJunxian Huang HNS_ROCE_CLEAR_BOND, 50*14f0455eSJunxian Huang }; 51*14f0455eSJunxian Huang 52b37ad2e2SJunxian Huang struct hns_roce_func_info { 53b37ad2e2SJunxian Huang struct net_device *net_dev; 54d31d410bSJunxian Huang struct hnae3_handle *handle; 55b37ad2e2SJunxian Huang }; 56b37ad2e2SJunxian Huang 57b37ad2e2SJunxian Huang struct hns_roce_bond_group { 58b37ad2e2SJunxian Huang struct net_device *upper_dev; 59d31d410bSJunxian Huang struct hns_roce_dev *main_hr_dev; 60*14f0455eSJunxian Huang u8 active_slave_num; 61*14f0455eSJunxian Huang u32 slave_map; 62*14f0455eSJunxian Huang u32 active_slave_map; 63b37ad2e2SJunxian Huang u8 bond_id; 64b37ad2e2SJunxian Huang u8 bus_num; 65b37ad2e2SJunxian Huang struct hns_roce_func_info bond_func_info[ROCE_BOND_FUNC_MAX]; 66d31d410bSJunxian Huang bool bond_ready; 67d31d410bSJunxian Huang enum hns_roce_bond_state bond_state; 68d31d410bSJunxian Huang enum netdev_lag_tx_type tx_type; 69d31d410bSJunxian Huang enum netdev_lag_hash hash_type; 70d31d410bSJunxian Huang struct mutex bond_mutex; 71d31d410bSJunxian Huang struct notifier_block bond_nb; 72b37ad2e2SJunxian Huang }; 73b37ad2e2SJunxian Huang 74b37ad2e2SJunxian Huang struct hns_roce_die_info { 75b37ad2e2SJunxian Huang u8 bond_id_mask; 76b37ad2e2SJunxian Huang struct hns_roce_bond_group *bgrps[ROCE_BOND_NUM_MAX]; 77b37ad2e2SJunxian Huang }; 78b37ad2e2SJunxian Huang 79b37ad2e2SJunxian Huang struct hns_roce_bond_group *hns_roce_get_bond_grp(struct net_device *net_dev, 80b37ad2e2SJunxian Huang u8 bus_num); 81b37ad2e2SJunxian Huang int hns_roce_alloc_bond_grp(struct hns_roce_dev *hr_dev); 82b37ad2e2SJunxian Huang void hns_roce_dealloc_bond_grp(void); 83b37ad2e2SJunxian Huang 84b37ad2e2SJunxian Huang #endif 85