xref: /linux/drivers/infiniband/hw/hns/hns_roce_bond.h (revision 55aa394a5ed871208eac11c5f4677cafd258c4dd)
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