162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ */
262306a36Sopenharmony_ci// Copyright (c) 2016-2017 Hisilicon Limited.
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#ifndef __HNAE3_H
562306a36Sopenharmony_ci#define __HNAE3_H
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci/* Names used in this framework:
862306a36Sopenharmony_ci *      ae handle (handle):
962306a36Sopenharmony_ci *        a set of queues provided by AE
1062306a36Sopenharmony_ci *      ring buffer queue (rbq):
1162306a36Sopenharmony_ci *        the channel between upper layer and the AE, can do tx and rx
1262306a36Sopenharmony_ci *      ring:
1362306a36Sopenharmony_ci *        a tx or rx channel within a rbq
1462306a36Sopenharmony_ci *      ring description (desc):
1562306a36Sopenharmony_ci *        an element in the ring with packet information
1662306a36Sopenharmony_ci *      buffer:
1762306a36Sopenharmony_ci *        a memory region referred by desc with the full packet payload
1862306a36Sopenharmony_ci *
1962306a36Sopenharmony_ci * "num" means a static number set as a parameter, "count" mean a dynamic
2062306a36Sopenharmony_ci *   number set while running
2162306a36Sopenharmony_ci * "cb" means control block
2262306a36Sopenharmony_ci */
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#include <linux/acpi.h>
2562306a36Sopenharmony_ci#include <linux/dcbnl.h>
2662306a36Sopenharmony_ci#include <linux/delay.h>
2762306a36Sopenharmony_ci#include <linux/device.h>
2862306a36Sopenharmony_ci#include <linux/ethtool.h>
2962306a36Sopenharmony_ci#include <linux/module.h>
3062306a36Sopenharmony_ci#include <linux/netdevice.h>
3162306a36Sopenharmony_ci#include <linux/pci.h>
3262306a36Sopenharmony_ci#include <linux/pkt_sched.h>
3362306a36Sopenharmony_ci#include <linux/types.h>
3462306a36Sopenharmony_ci#include <linux/bitmap.h>
3562306a36Sopenharmony_ci#include <net/pkt_cls.h>
3662306a36Sopenharmony_ci#include <net/pkt_sched.h>
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci#define HNAE3_MOD_VERSION "1.0"
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci#define HNAE3_MIN_VECTOR_NUM	2 /* first one for misc, another for IO */
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci/* Device version */
4362306a36Sopenharmony_ci#define HNAE3_DEVICE_VERSION_V1   0x00020
4462306a36Sopenharmony_ci#define HNAE3_DEVICE_VERSION_V2   0x00021
4562306a36Sopenharmony_ci#define HNAE3_DEVICE_VERSION_V3   0x00030
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci#define HNAE3_PCI_REVISION_BIT_SIZE		8
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci/* Device IDs */
5062306a36Sopenharmony_ci#define HNAE3_DEV_ID_GE				0xA220
5162306a36Sopenharmony_ci#define HNAE3_DEV_ID_25GE			0xA221
5262306a36Sopenharmony_ci#define HNAE3_DEV_ID_25GE_RDMA			0xA222
5362306a36Sopenharmony_ci#define HNAE3_DEV_ID_25GE_RDMA_MACSEC		0xA223
5462306a36Sopenharmony_ci#define HNAE3_DEV_ID_50GE_RDMA			0xA224
5562306a36Sopenharmony_ci#define HNAE3_DEV_ID_50GE_RDMA_MACSEC		0xA225
5662306a36Sopenharmony_ci#define HNAE3_DEV_ID_100G_RDMA_MACSEC		0xA226
5762306a36Sopenharmony_ci#define HNAE3_DEV_ID_200G_RDMA			0xA228
5862306a36Sopenharmony_ci#define HNAE3_DEV_ID_VF				0xA22E
5962306a36Sopenharmony_ci#define HNAE3_DEV_ID_RDMA_DCB_PFC_VF		0xA22F
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci#define HNAE3_CLASS_NAME_SIZE 16
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci#define HNAE3_DEV_INITED_B			0x0
6462306a36Sopenharmony_ci#define HNAE3_DEV_SUPPORT_ROCE_B		0x1
6562306a36Sopenharmony_ci#define HNAE3_DEV_SUPPORT_DCB_B			0x2
6662306a36Sopenharmony_ci#define HNAE3_KNIC_CLIENT_INITED_B		0x3
6762306a36Sopenharmony_ci#define HNAE3_UNIC_CLIENT_INITED_B		0x4
6862306a36Sopenharmony_ci#define HNAE3_ROCE_CLIENT_INITED_B		0x5
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci#define HNAE3_DEV_SUPPORT_ROCE_DCB_BITS (BIT(HNAE3_DEV_SUPPORT_DCB_B) | \
7162306a36Sopenharmony_ci		BIT(HNAE3_DEV_SUPPORT_ROCE_B))
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci#define hnae3_dev_roce_supported(hdev) \
7462306a36Sopenharmony_ci	hnae3_get_bit((hdev)->ae_dev->flag, HNAE3_DEV_SUPPORT_ROCE_B)
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci#define hnae3_dev_dcb_supported(hdev) \
7762306a36Sopenharmony_ci	hnae3_get_bit((hdev)->ae_dev->flag, HNAE3_DEV_SUPPORT_DCB_B)
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_cienum HNAE3_DEV_CAP_BITS {
8062306a36Sopenharmony_ci	HNAE3_DEV_SUPPORT_FD_B,
8162306a36Sopenharmony_ci	HNAE3_DEV_SUPPORT_GRO_B,
8262306a36Sopenharmony_ci	HNAE3_DEV_SUPPORT_FEC_B,
8362306a36Sopenharmony_ci	HNAE3_DEV_SUPPORT_UDP_GSO_B,
8462306a36Sopenharmony_ci	HNAE3_DEV_SUPPORT_QB_B,
8562306a36Sopenharmony_ci	HNAE3_DEV_SUPPORT_FD_FORWARD_TC_B,
8662306a36Sopenharmony_ci	HNAE3_DEV_SUPPORT_PTP_B,
8762306a36Sopenharmony_ci	HNAE3_DEV_SUPPORT_INT_QL_B,
8862306a36Sopenharmony_ci	HNAE3_DEV_SUPPORT_HW_TX_CSUM_B,
8962306a36Sopenharmony_ci	HNAE3_DEV_SUPPORT_TX_PUSH_B,
9062306a36Sopenharmony_ci	HNAE3_DEV_SUPPORT_PHY_IMP_B,
9162306a36Sopenharmony_ci	HNAE3_DEV_SUPPORT_TQP_TXRX_INDEP_B,
9262306a36Sopenharmony_ci	HNAE3_DEV_SUPPORT_HW_PAD_B,
9362306a36Sopenharmony_ci	HNAE3_DEV_SUPPORT_STASH_B,
9462306a36Sopenharmony_ci	HNAE3_DEV_SUPPORT_UDP_TUNNEL_CSUM_B,
9562306a36Sopenharmony_ci	HNAE3_DEV_SUPPORT_PAUSE_B,
9662306a36Sopenharmony_ci	HNAE3_DEV_SUPPORT_RAS_IMP_B,
9762306a36Sopenharmony_ci	HNAE3_DEV_SUPPORT_RXD_ADV_LAYOUT_B,
9862306a36Sopenharmony_ci	HNAE3_DEV_SUPPORT_PORT_VLAN_BYPASS_B,
9962306a36Sopenharmony_ci	HNAE3_DEV_SUPPORT_VLAN_FLTR_MDF_B,
10062306a36Sopenharmony_ci	HNAE3_DEV_SUPPORT_MC_MAC_MNG_B,
10162306a36Sopenharmony_ci	HNAE3_DEV_SUPPORT_CQ_B,
10262306a36Sopenharmony_ci	HNAE3_DEV_SUPPORT_FEC_STATS_B,
10362306a36Sopenharmony_ci	HNAE3_DEV_SUPPORT_LANE_NUM_B,
10462306a36Sopenharmony_ci	HNAE3_DEV_SUPPORT_WOL_B,
10562306a36Sopenharmony_ci	HNAE3_DEV_SUPPORT_TM_FLUSH_B,
10662306a36Sopenharmony_ci};
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci#define hnae3_ae_dev_fd_supported(ae_dev) \
10962306a36Sopenharmony_ci		test_bit(HNAE3_DEV_SUPPORT_FD_B, (ae_dev)->caps)
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci#define hnae3_ae_dev_gro_supported(ae_dev) \
11262306a36Sopenharmony_ci		test_bit(HNAE3_DEV_SUPPORT_GRO_B, (ae_dev)->caps)
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci#define hnae3_dev_fec_supported(hdev) \
11562306a36Sopenharmony_ci	test_bit(HNAE3_DEV_SUPPORT_FEC_B, (hdev)->ae_dev->caps)
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci#define hnae3_dev_udp_gso_supported(hdev) \
11862306a36Sopenharmony_ci	test_bit(HNAE3_DEV_SUPPORT_UDP_GSO_B, (hdev)->ae_dev->caps)
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci#define hnae3_dev_qb_supported(hdev) \
12162306a36Sopenharmony_ci	test_bit(HNAE3_DEV_SUPPORT_QB_B, (hdev)->ae_dev->caps)
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci#define hnae3_dev_fd_forward_tc_supported(hdev) \
12462306a36Sopenharmony_ci	test_bit(HNAE3_DEV_SUPPORT_FD_FORWARD_TC_B, (hdev)->ae_dev->caps)
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci#define hnae3_dev_ptp_supported(hdev) \
12762306a36Sopenharmony_ci	test_bit(HNAE3_DEV_SUPPORT_PTP_B, (hdev)->ae_dev->caps)
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci#define hnae3_dev_int_ql_supported(hdev) \
13062306a36Sopenharmony_ci	test_bit(HNAE3_DEV_SUPPORT_INT_QL_B, (hdev)->ae_dev->caps)
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci#define hnae3_dev_hw_csum_supported(hdev) \
13362306a36Sopenharmony_ci	test_bit(HNAE3_DEV_SUPPORT_HW_TX_CSUM_B, (hdev)->ae_dev->caps)
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci#define hnae3_dev_tx_push_supported(hdev) \
13662306a36Sopenharmony_ci	test_bit(HNAE3_DEV_SUPPORT_TX_PUSH_B, (hdev)->ae_dev->caps)
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci#define hnae3_dev_phy_imp_supported(hdev) \
13962306a36Sopenharmony_ci	test_bit(HNAE3_DEV_SUPPORT_PHY_IMP_B, (hdev)->ae_dev->caps)
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci#define hnae3_dev_ras_imp_supported(hdev) \
14262306a36Sopenharmony_ci	test_bit(HNAE3_DEV_SUPPORT_RAS_IMP_B, (hdev)->ae_dev->caps)
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci#define hnae3_dev_tqp_txrx_indep_supported(hdev) \
14562306a36Sopenharmony_ci	test_bit(HNAE3_DEV_SUPPORT_TQP_TXRX_INDEP_B, (hdev)->ae_dev->caps)
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci#define hnae3_dev_hw_pad_supported(hdev) \
14862306a36Sopenharmony_ci	test_bit(HNAE3_DEV_SUPPORT_HW_PAD_B, (hdev)->ae_dev->caps)
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ci#define hnae3_dev_stash_supported(hdev) \
15162306a36Sopenharmony_ci	test_bit(HNAE3_DEV_SUPPORT_STASH_B, (hdev)->ae_dev->caps)
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci#define hnae3_dev_pause_supported(hdev) \
15462306a36Sopenharmony_ci	test_bit(HNAE3_DEV_SUPPORT_PAUSE_B, (hdev)->ae_dev->caps)
15562306a36Sopenharmony_ci
15662306a36Sopenharmony_ci#define hnae3_ae_dev_tqp_txrx_indep_supported(ae_dev) \
15762306a36Sopenharmony_ci	test_bit(HNAE3_DEV_SUPPORT_TQP_TXRX_INDEP_B, (ae_dev)->caps)
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_ci#define hnae3_ae_dev_rxd_adv_layout_supported(ae_dev) \
16062306a36Sopenharmony_ci	test_bit(HNAE3_DEV_SUPPORT_RXD_ADV_LAYOUT_B, (ae_dev)->caps)
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ci#define hnae3_ae_dev_mc_mac_mng_supported(ae_dev) \
16362306a36Sopenharmony_ci	test_bit(HNAE3_DEV_SUPPORT_MC_MAC_MNG_B, (ae_dev)->caps)
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci#define hnae3_ae_dev_cq_supported(ae_dev) \
16662306a36Sopenharmony_ci	test_bit(HNAE3_DEV_SUPPORT_CQ_B, (ae_dev)->caps)
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ci#define hnae3_ae_dev_fec_stats_supported(ae_dev) \
16962306a36Sopenharmony_ci	test_bit(HNAE3_DEV_SUPPORT_FEC_STATS_B, (ae_dev)->caps)
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ci#define hnae3_ae_dev_lane_num_supported(ae_dev) \
17262306a36Sopenharmony_ci	test_bit(HNAE3_DEV_SUPPORT_LANE_NUM_B, (ae_dev)->caps)
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_ci#define hnae3_ae_dev_wol_supported(ae_dev) \
17562306a36Sopenharmony_ci	test_bit(HNAE3_DEV_SUPPORT_WOL_B, (ae_dev)->caps)
17662306a36Sopenharmony_ci
17762306a36Sopenharmony_ci#define hnae3_ae_dev_tm_flush_supported(hdev) \
17862306a36Sopenharmony_ci	test_bit(HNAE3_DEV_SUPPORT_TM_FLUSH_B, (hdev)->ae_dev->caps)
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_cienum HNAE3_PF_CAP_BITS {
18162306a36Sopenharmony_ci	HNAE3_PF_SUPPORT_VLAN_FLTR_MDF_B = 0,
18262306a36Sopenharmony_ci};
18362306a36Sopenharmony_ci#define ring_ptr_move_fw(ring, p) \
18462306a36Sopenharmony_ci	((ring)->p = ((ring)->p + 1) % (ring)->desc_num)
18562306a36Sopenharmony_ci#define ring_ptr_move_bw(ring, p) \
18662306a36Sopenharmony_ci	((ring)->p = ((ring)->p - 1 + (ring)->desc_num) % (ring)->desc_num)
18762306a36Sopenharmony_ci
18862306a36Sopenharmony_cistruct hnae3_handle;
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_cistruct hnae3_queue {
19162306a36Sopenharmony_ci	void __iomem *io_base;
19262306a36Sopenharmony_ci	void __iomem *mem_base;
19362306a36Sopenharmony_ci	struct hnae3_ae_algo *ae_algo;
19462306a36Sopenharmony_ci	struct hnae3_handle *handle;
19562306a36Sopenharmony_ci	int tqp_index;		/* index in a handle */
19662306a36Sopenharmony_ci	u32 buf_size;		/* size for hnae_desc->addr, preset by AE */
19762306a36Sopenharmony_ci	u16 tx_desc_num;	/* total number of tx desc */
19862306a36Sopenharmony_ci	u16 rx_desc_num;	/* total number of rx desc */
19962306a36Sopenharmony_ci};
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_cistruct hns3_mac_stats {
20262306a36Sopenharmony_ci	u64 tx_pause_cnt;
20362306a36Sopenharmony_ci	u64 rx_pause_cnt;
20462306a36Sopenharmony_ci};
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_ci/* hnae3 loop mode */
20762306a36Sopenharmony_cienum hnae3_loop {
20862306a36Sopenharmony_ci	HNAE3_LOOP_EXTERNAL,
20962306a36Sopenharmony_ci	HNAE3_LOOP_APP,
21062306a36Sopenharmony_ci	HNAE3_LOOP_SERIAL_SERDES,
21162306a36Sopenharmony_ci	HNAE3_LOOP_PARALLEL_SERDES,
21262306a36Sopenharmony_ci	HNAE3_LOOP_PHY,
21362306a36Sopenharmony_ci	HNAE3_LOOP_NONE,
21462306a36Sopenharmony_ci};
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_cienum hnae3_client_type {
21762306a36Sopenharmony_ci	HNAE3_CLIENT_KNIC,
21862306a36Sopenharmony_ci	HNAE3_CLIENT_ROCE,
21962306a36Sopenharmony_ci};
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_ci/* mac media type */
22262306a36Sopenharmony_cienum hnae3_media_type {
22362306a36Sopenharmony_ci	HNAE3_MEDIA_TYPE_UNKNOWN,
22462306a36Sopenharmony_ci	HNAE3_MEDIA_TYPE_FIBER,
22562306a36Sopenharmony_ci	HNAE3_MEDIA_TYPE_COPPER,
22662306a36Sopenharmony_ci	HNAE3_MEDIA_TYPE_BACKPLANE,
22762306a36Sopenharmony_ci	HNAE3_MEDIA_TYPE_NONE,
22862306a36Sopenharmony_ci};
22962306a36Sopenharmony_ci
23062306a36Sopenharmony_ci/* must be consistent with definition in firmware */
23162306a36Sopenharmony_cienum hnae3_module_type {
23262306a36Sopenharmony_ci	HNAE3_MODULE_TYPE_UNKNOWN	= 0x00,
23362306a36Sopenharmony_ci	HNAE3_MODULE_TYPE_FIBRE_LR	= 0x01,
23462306a36Sopenharmony_ci	HNAE3_MODULE_TYPE_FIBRE_SR	= 0x02,
23562306a36Sopenharmony_ci	HNAE3_MODULE_TYPE_AOC		= 0x03,
23662306a36Sopenharmony_ci	HNAE3_MODULE_TYPE_CR		= 0x04,
23762306a36Sopenharmony_ci	HNAE3_MODULE_TYPE_KR		= 0x05,
23862306a36Sopenharmony_ci	HNAE3_MODULE_TYPE_TP		= 0x06,
23962306a36Sopenharmony_ci};
24062306a36Sopenharmony_ci
24162306a36Sopenharmony_cienum hnae3_fec_mode {
24262306a36Sopenharmony_ci	HNAE3_FEC_AUTO = 0,
24362306a36Sopenharmony_ci	HNAE3_FEC_BASER,
24462306a36Sopenharmony_ci	HNAE3_FEC_RS,
24562306a36Sopenharmony_ci	HNAE3_FEC_LLRS,
24662306a36Sopenharmony_ci	HNAE3_FEC_NONE,
24762306a36Sopenharmony_ci	HNAE3_FEC_USER_DEF,
24862306a36Sopenharmony_ci};
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_cienum hnae3_reset_notify_type {
25162306a36Sopenharmony_ci	HNAE3_UP_CLIENT,
25262306a36Sopenharmony_ci	HNAE3_DOWN_CLIENT,
25362306a36Sopenharmony_ci	HNAE3_INIT_CLIENT,
25462306a36Sopenharmony_ci	HNAE3_UNINIT_CLIENT,
25562306a36Sopenharmony_ci};
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_cienum hnae3_hw_error_type {
25862306a36Sopenharmony_ci	HNAE3_PPU_POISON_ERROR,
25962306a36Sopenharmony_ci	HNAE3_CMDQ_ECC_ERROR,
26062306a36Sopenharmony_ci	HNAE3_IMP_RD_POISON_ERROR,
26162306a36Sopenharmony_ci	HNAE3_ROCEE_AXI_RESP_ERROR,
26262306a36Sopenharmony_ci};
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_cienum hnae3_reset_type {
26562306a36Sopenharmony_ci	HNAE3_VF_RESET,
26662306a36Sopenharmony_ci	HNAE3_VF_FUNC_RESET,
26762306a36Sopenharmony_ci	HNAE3_VF_PF_FUNC_RESET,
26862306a36Sopenharmony_ci	HNAE3_VF_FULL_RESET,
26962306a36Sopenharmony_ci	HNAE3_FLR_RESET,
27062306a36Sopenharmony_ci	HNAE3_FUNC_RESET,
27162306a36Sopenharmony_ci	HNAE3_GLOBAL_RESET,
27262306a36Sopenharmony_ci	HNAE3_IMP_RESET,
27362306a36Sopenharmony_ci	HNAE3_NONE_RESET,
27462306a36Sopenharmony_ci	HNAE3_MAX_RESET,
27562306a36Sopenharmony_ci};
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_cienum hnae3_port_base_vlan_state {
27862306a36Sopenharmony_ci	HNAE3_PORT_BASE_VLAN_DISABLE,
27962306a36Sopenharmony_ci	HNAE3_PORT_BASE_VLAN_ENABLE,
28062306a36Sopenharmony_ci	HNAE3_PORT_BASE_VLAN_MODIFY,
28162306a36Sopenharmony_ci	HNAE3_PORT_BASE_VLAN_NOCHANGE,
28262306a36Sopenharmony_ci};
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_cienum hnae3_dbg_cmd {
28562306a36Sopenharmony_ci	HNAE3_DBG_CMD_TM_NODES,
28662306a36Sopenharmony_ci	HNAE3_DBG_CMD_TM_PRI,
28762306a36Sopenharmony_ci	HNAE3_DBG_CMD_TM_QSET,
28862306a36Sopenharmony_ci	HNAE3_DBG_CMD_TM_MAP,
28962306a36Sopenharmony_ci	HNAE3_DBG_CMD_TM_PG,
29062306a36Sopenharmony_ci	HNAE3_DBG_CMD_TM_PORT,
29162306a36Sopenharmony_ci	HNAE3_DBG_CMD_TC_SCH_INFO,
29262306a36Sopenharmony_ci	HNAE3_DBG_CMD_QOS_PAUSE_CFG,
29362306a36Sopenharmony_ci	HNAE3_DBG_CMD_QOS_PRI_MAP,
29462306a36Sopenharmony_ci	HNAE3_DBG_CMD_QOS_DSCP_MAP,
29562306a36Sopenharmony_ci	HNAE3_DBG_CMD_QOS_BUF_CFG,
29662306a36Sopenharmony_ci	HNAE3_DBG_CMD_DEV_INFO,
29762306a36Sopenharmony_ci	HNAE3_DBG_CMD_TX_BD,
29862306a36Sopenharmony_ci	HNAE3_DBG_CMD_RX_BD,
29962306a36Sopenharmony_ci	HNAE3_DBG_CMD_MAC_UC,
30062306a36Sopenharmony_ci	HNAE3_DBG_CMD_MAC_MC,
30162306a36Sopenharmony_ci	HNAE3_DBG_CMD_MNG_TBL,
30262306a36Sopenharmony_ci	HNAE3_DBG_CMD_LOOPBACK,
30362306a36Sopenharmony_ci	HNAE3_DBG_CMD_PTP_INFO,
30462306a36Sopenharmony_ci	HNAE3_DBG_CMD_INTERRUPT_INFO,
30562306a36Sopenharmony_ci	HNAE3_DBG_CMD_RESET_INFO,
30662306a36Sopenharmony_ci	HNAE3_DBG_CMD_IMP_INFO,
30762306a36Sopenharmony_ci	HNAE3_DBG_CMD_NCL_CONFIG,
30862306a36Sopenharmony_ci	HNAE3_DBG_CMD_REG_BIOS_COMMON,
30962306a36Sopenharmony_ci	HNAE3_DBG_CMD_REG_SSU,
31062306a36Sopenharmony_ci	HNAE3_DBG_CMD_REG_IGU_EGU,
31162306a36Sopenharmony_ci	HNAE3_DBG_CMD_REG_RPU,
31262306a36Sopenharmony_ci	HNAE3_DBG_CMD_REG_NCSI,
31362306a36Sopenharmony_ci	HNAE3_DBG_CMD_REG_RTC,
31462306a36Sopenharmony_ci	HNAE3_DBG_CMD_REG_PPP,
31562306a36Sopenharmony_ci	HNAE3_DBG_CMD_REG_RCB,
31662306a36Sopenharmony_ci	HNAE3_DBG_CMD_REG_TQP,
31762306a36Sopenharmony_ci	HNAE3_DBG_CMD_REG_MAC,
31862306a36Sopenharmony_ci	HNAE3_DBG_CMD_REG_DCB,
31962306a36Sopenharmony_ci	HNAE3_DBG_CMD_VLAN_CONFIG,
32062306a36Sopenharmony_ci	HNAE3_DBG_CMD_QUEUE_MAP,
32162306a36Sopenharmony_ci	HNAE3_DBG_CMD_RX_QUEUE_INFO,
32262306a36Sopenharmony_ci	HNAE3_DBG_CMD_TX_QUEUE_INFO,
32362306a36Sopenharmony_ci	HNAE3_DBG_CMD_FD_TCAM,
32462306a36Sopenharmony_ci	HNAE3_DBG_CMD_FD_COUNTER,
32562306a36Sopenharmony_ci	HNAE3_DBG_CMD_MAC_TNL_STATUS,
32662306a36Sopenharmony_ci	HNAE3_DBG_CMD_SERV_INFO,
32762306a36Sopenharmony_ci	HNAE3_DBG_CMD_UMV_INFO,
32862306a36Sopenharmony_ci	HNAE3_DBG_CMD_PAGE_POOL_INFO,
32962306a36Sopenharmony_ci	HNAE3_DBG_CMD_COAL_INFO,
33062306a36Sopenharmony_ci	HNAE3_DBG_CMD_UNKNOWN,
33162306a36Sopenharmony_ci};
33262306a36Sopenharmony_ci
33362306a36Sopenharmony_cienum hnae3_tc_map_mode {
33462306a36Sopenharmony_ci	HNAE3_TC_MAP_MODE_PRIO,
33562306a36Sopenharmony_ci	HNAE3_TC_MAP_MODE_DSCP,
33662306a36Sopenharmony_ci};
33762306a36Sopenharmony_ci
33862306a36Sopenharmony_cistruct hnae3_vector_info {
33962306a36Sopenharmony_ci	u8 __iomem *io_addr;
34062306a36Sopenharmony_ci	int vector;
34162306a36Sopenharmony_ci};
34262306a36Sopenharmony_ci
34362306a36Sopenharmony_ci#define HNAE3_RING_TYPE_B 0
34462306a36Sopenharmony_ci#define HNAE3_RING_TYPE_TX 0
34562306a36Sopenharmony_ci#define HNAE3_RING_TYPE_RX 1
34662306a36Sopenharmony_ci#define HNAE3_RING_GL_IDX_S 0
34762306a36Sopenharmony_ci#define HNAE3_RING_GL_IDX_M GENMASK(1, 0)
34862306a36Sopenharmony_ci#define HNAE3_RING_GL_RX 0
34962306a36Sopenharmony_ci#define HNAE3_RING_GL_TX 1
35062306a36Sopenharmony_ci
35162306a36Sopenharmony_ci#define HNAE3_FW_VERSION_BYTE3_SHIFT	24
35262306a36Sopenharmony_ci#define HNAE3_FW_VERSION_BYTE3_MASK	GENMASK(31, 24)
35362306a36Sopenharmony_ci#define HNAE3_FW_VERSION_BYTE2_SHIFT	16
35462306a36Sopenharmony_ci#define HNAE3_FW_VERSION_BYTE2_MASK	GENMASK(23, 16)
35562306a36Sopenharmony_ci#define HNAE3_FW_VERSION_BYTE1_SHIFT	8
35662306a36Sopenharmony_ci#define HNAE3_FW_VERSION_BYTE1_MASK	GENMASK(15, 8)
35762306a36Sopenharmony_ci#define HNAE3_FW_VERSION_BYTE0_SHIFT	0
35862306a36Sopenharmony_ci#define HNAE3_FW_VERSION_BYTE0_MASK	GENMASK(7, 0)
35962306a36Sopenharmony_ci
36062306a36Sopenharmony_cistruct hnae3_ring_chain_node {
36162306a36Sopenharmony_ci	struct hnae3_ring_chain_node *next;
36262306a36Sopenharmony_ci	u32 tqp_index;
36362306a36Sopenharmony_ci	u32 flag;
36462306a36Sopenharmony_ci	u32 int_gl_idx;
36562306a36Sopenharmony_ci};
36662306a36Sopenharmony_ci
36762306a36Sopenharmony_ci#define HNAE3_IS_TX_RING(node) \
36862306a36Sopenharmony_ci	(((node)->flag & 1 << HNAE3_RING_TYPE_B) == HNAE3_RING_TYPE_TX)
36962306a36Sopenharmony_ci
37062306a36Sopenharmony_ci/* device specification info from firmware */
37162306a36Sopenharmony_cistruct hnae3_dev_specs {
37262306a36Sopenharmony_ci	u32 mac_entry_num; /* number of mac-vlan table entry */
37362306a36Sopenharmony_ci	u32 mng_entry_num; /* number of manager table entry */
37462306a36Sopenharmony_ci	u32 max_tm_rate;
37562306a36Sopenharmony_ci	u16 rss_ind_tbl_size;
37662306a36Sopenharmony_ci	u16 rss_key_size;
37762306a36Sopenharmony_ci	u16 int_ql_max; /* max value of interrupt coalesce based on INT_QL */
37862306a36Sopenharmony_ci	u16 max_int_gl; /* max value of interrupt coalesce based on INT_GL */
37962306a36Sopenharmony_ci	u8 max_non_tso_bd_num; /* max BD number of one non-TSO packet */
38062306a36Sopenharmony_ci	u16 max_frm_size;
38162306a36Sopenharmony_ci	u16 max_qset_num;
38262306a36Sopenharmony_ci	u16 umv_size;
38362306a36Sopenharmony_ci	u16 mc_mac_size;
38462306a36Sopenharmony_ci	u32 mac_stats_num;
38562306a36Sopenharmony_ci	u8 tnl_num;
38662306a36Sopenharmony_ci};
38762306a36Sopenharmony_ci
38862306a36Sopenharmony_cistruct hnae3_client_ops {
38962306a36Sopenharmony_ci	int (*init_instance)(struct hnae3_handle *handle);
39062306a36Sopenharmony_ci	void (*uninit_instance)(struct hnae3_handle *handle, bool reset);
39162306a36Sopenharmony_ci	void (*link_status_change)(struct hnae3_handle *handle, bool state);
39262306a36Sopenharmony_ci	int (*reset_notify)(struct hnae3_handle *handle,
39362306a36Sopenharmony_ci			    enum hnae3_reset_notify_type type);
39462306a36Sopenharmony_ci	void (*process_hw_error)(struct hnae3_handle *handle,
39562306a36Sopenharmony_ci				 enum hnae3_hw_error_type);
39662306a36Sopenharmony_ci};
39762306a36Sopenharmony_ci
39862306a36Sopenharmony_ci#define HNAE3_CLIENT_NAME_LENGTH 16
39962306a36Sopenharmony_cistruct hnae3_client {
40062306a36Sopenharmony_ci	char name[HNAE3_CLIENT_NAME_LENGTH];
40162306a36Sopenharmony_ci	unsigned long state;
40262306a36Sopenharmony_ci	enum hnae3_client_type type;
40362306a36Sopenharmony_ci	const struct hnae3_client_ops *ops;
40462306a36Sopenharmony_ci	struct list_head node;
40562306a36Sopenharmony_ci};
40662306a36Sopenharmony_ci
40762306a36Sopenharmony_ci#define HNAE3_DEV_CAPS_MAX_NUM	96
40862306a36Sopenharmony_cistruct hnae3_ae_dev {
40962306a36Sopenharmony_ci	struct pci_dev *pdev;
41062306a36Sopenharmony_ci	const struct hnae3_ae_ops *ops;
41162306a36Sopenharmony_ci	struct list_head node;
41262306a36Sopenharmony_ci	u32 flag;
41362306a36Sopenharmony_ci	unsigned long hw_err_reset_req;
41462306a36Sopenharmony_ci	struct hnae3_dev_specs dev_specs;
41562306a36Sopenharmony_ci	u32 dev_version;
41662306a36Sopenharmony_ci	DECLARE_BITMAP(caps, HNAE3_DEV_CAPS_MAX_NUM);
41762306a36Sopenharmony_ci	void *priv;
41862306a36Sopenharmony_ci};
41962306a36Sopenharmony_ci
42062306a36Sopenharmony_ci/* This struct defines the operation on the handle.
42162306a36Sopenharmony_ci *
42262306a36Sopenharmony_ci * init_ae_dev(): (mandatory)
42362306a36Sopenharmony_ci *   Get PF configure from pci_dev and initialize PF hardware
42462306a36Sopenharmony_ci * uninit_ae_dev()
42562306a36Sopenharmony_ci *   Disable PF device and release PF resource
42662306a36Sopenharmony_ci * register_client
42762306a36Sopenharmony_ci *   Register client to ae_dev
42862306a36Sopenharmony_ci * unregister_client()
42962306a36Sopenharmony_ci *   Unregister client from ae_dev
43062306a36Sopenharmony_ci * start()
43162306a36Sopenharmony_ci *   Enable the hardware
43262306a36Sopenharmony_ci * stop()
43362306a36Sopenharmony_ci *   Disable the hardware
43462306a36Sopenharmony_ci * start_client()
43562306a36Sopenharmony_ci *   Inform the hclge that client has been started
43662306a36Sopenharmony_ci * stop_client()
43762306a36Sopenharmony_ci *   Inform the hclge that client has been stopped
43862306a36Sopenharmony_ci * get_status()
43962306a36Sopenharmony_ci *   Get the carrier state of the back channel of the handle, 1 for ok, 0 for
44062306a36Sopenharmony_ci *   non-ok
44162306a36Sopenharmony_ci * get_ksettings_an_result()
44262306a36Sopenharmony_ci *   Get negotiation status,speed and duplex
44362306a36Sopenharmony_ci * get_media_type()
44462306a36Sopenharmony_ci *   Get media type of MAC
44562306a36Sopenharmony_ci * check_port_speed()
44662306a36Sopenharmony_ci *   Check target speed whether is supported
44762306a36Sopenharmony_ci * adjust_link()
44862306a36Sopenharmony_ci *   Adjust link status
44962306a36Sopenharmony_ci * set_loopback()
45062306a36Sopenharmony_ci *   Set loopback
45162306a36Sopenharmony_ci * set_promisc_mode
45262306a36Sopenharmony_ci *   Set promisc mode
45362306a36Sopenharmony_ci * request_update_promisc_mode
45462306a36Sopenharmony_ci *   request to hclge(vf) to update promisc mode
45562306a36Sopenharmony_ci * set_mtu()
45662306a36Sopenharmony_ci *   set mtu
45762306a36Sopenharmony_ci * get_pauseparam()
45862306a36Sopenharmony_ci *   get tx and rx of pause frame use
45962306a36Sopenharmony_ci * set_pauseparam()
46062306a36Sopenharmony_ci *   set tx and rx of pause frame use
46162306a36Sopenharmony_ci * set_autoneg()
46262306a36Sopenharmony_ci *   set auto autonegotiation of pause frame use
46362306a36Sopenharmony_ci * get_autoneg()
46462306a36Sopenharmony_ci *   get auto autonegotiation of pause frame use
46562306a36Sopenharmony_ci * restart_autoneg()
46662306a36Sopenharmony_ci *   restart autonegotiation
46762306a36Sopenharmony_ci * halt_autoneg()
46862306a36Sopenharmony_ci *   halt/resume autonegotiation when autonegotiation on
46962306a36Sopenharmony_ci * get_coalesce_usecs()
47062306a36Sopenharmony_ci *   get usecs to delay a TX interrupt after a packet is sent
47162306a36Sopenharmony_ci * get_rx_max_coalesced_frames()
47262306a36Sopenharmony_ci *   get Maximum number of packets to be sent before a TX interrupt.
47362306a36Sopenharmony_ci * set_coalesce_usecs()
47462306a36Sopenharmony_ci *   set usecs to delay a TX interrupt after a packet is sent
47562306a36Sopenharmony_ci * set_coalesce_frames()
47662306a36Sopenharmony_ci *   set Maximum number of packets to be sent before a TX interrupt.
47762306a36Sopenharmony_ci * get_mac_addr()
47862306a36Sopenharmony_ci *   get mac address
47962306a36Sopenharmony_ci * set_mac_addr()
48062306a36Sopenharmony_ci *   set mac address
48162306a36Sopenharmony_ci * add_uc_addr
48262306a36Sopenharmony_ci *   Add unicast addr to mac table
48362306a36Sopenharmony_ci * rm_uc_addr
48462306a36Sopenharmony_ci *   Remove unicast addr from mac table
48562306a36Sopenharmony_ci * set_mc_addr()
48662306a36Sopenharmony_ci *   Set multicast address
48762306a36Sopenharmony_ci * add_mc_addr
48862306a36Sopenharmony_ci *   Add multicast address to mac table
48962306a36Sopenharmony_ci * rm_mc_addr
49062306a36Sopenharmony_ci *   Remove multicast address from mac table
49162306a36Sopenharmony_ci * update_stats()
49262306a36Sopenharmony_ci *   Update Old network device statistics
49362306a36Sopenharmony_ci * get_mac_stats()
49462306a36Sopenharmony_ci *   get mac pause statistics including tx_cnt and rx_cnt
49562306a36Sopenharmony_ci * get_ethtool_stats()
49662306a36Sopenharmony_ci *   Get ethtool network device statistics
49762306a36Sopenharmony_ci * get_strings()
49862306a36Sopenharmony_ci *   Get a set of strings that describe the requested objects
49962306a36Sopenharmony_ci * get_sset_count()
50062306a36Sopenharmony_ci *   Get number of strings that @get_strings will write
50162306a36Sopenharmony_ci * update_led_status()
50262306a36Sopenharmony_ci *   Update the led status
50362306a36Sopenharmony_ci * set_led_id()
50462306a36Sopenharmony_ci *   Set led id
50562306a36Sopenharmony_ci * get_regs()
50662306a36Sopenharmony_ci *   Get regs dump
50762306a36Sopenharmony_ci * get_regs_len()
50862306a36Sopenharmony_ci *   Get the len of the regs dump
50962306a36Sopenharmony_ci * get_rss_key_size()
51062306a36Sopenharmony_ci *   Get rss key size
51162306a36Sopenharmony_ci * get_rss()
51262306a36Sopenharmony_ci *   Get rss table
51362306a36Sopenharmony_ci * set_rss()
51462306a36Sopenharmony_ci *   Set rss table
51562306a36Sopenharmony_ci * get_tc_size()
51662306a36Sopenharmony_ci *   Get tc size of handle
51762306a36Sopenharmony_ci * get_vector()
51862306a36Sopenharmony_ci *   Get vector number and vector information
51962306a36Sopenharmony_ci * put_vector()
52062306a36Sopenharmony_ci *   Put the vector in hdev
52162306a36Sopenharmony_ci * map_ring_to_vector()
52262306a36Sopenharmony_ci *   Map rings to vector
52362306a36Sopenharmony_ci * unmap_ring_from_vector()
52462306a36Sopenharmony_ci *   Unmap rings from vector
52562306a36Sopenharmony_ci * reset_queue()
52662306a36Sopenharmony_ci *   Reset queue
52762306a36Sopenharmony_ci * get_fw_version()
52862306a36Sopenharmony_ci *   Get firmware version
52962306a36Sopenharmony_ci * get_mdix_mode()
53062306a36Sopenharmony_ci *   Get media typr of phy
53162306a36Sopenharmony_ci * enable_vlan_filter()
53262306a36Sopenharmony_ci *   Enable vlan filter
53362306a36Sopenharmony_ci * set_vlan_filter()
53462306a36Sopenharmony_ci *   Set vlan filter config of Ports
53562306a36Sopenharmony_ci * set_vf_vlan_filter()
53662306a36Sopenharmony_ci *   Set vlan filter config of vf
53762306a36Sopenharmony_ci * enable_hw_strip_rxvtag()
53862306a36Sopenharmony_ci *   Enable/disable hardware strip vlan tag of packets received
53962306a36Sopenharmony_ci * set_gro_en
54062306a36Sopenharmony_ci *   Enable/disable HW GRO
54162306a36Sopenharmony_ci * add_arfs_entry
54262306a36Sopenharmony_ci *   Check the 5-tuples of flow, and create flow director rule
54362306a36Sopenharmony_ci * get_vf_config
54462306a36Sopenharmony_ci *   Get the VF configuration setting by the host
54562306a36Sopenharmony_ci * set_vf_link_state
54662306a36Sopenharmony_ci *   Set VF link status
54762306a36Sopenharmony_ci * set_vf_spoofchk
54862306a36Sopenharmony_ci *   Enable/disable spoof check for specified vf
54962306a36Sopenharmony_ci * set_vf_trust
55062306a36Sopenharmony_ci *   Enable/disable trust for specified vf, if the vf being trusted, then
55162306a36Sopenharmony_ci *   it can enable promisc mode
55262306a36Sopenharmony_ci * set_vf_rate
55362306a36Sopenharmony_ci *   Set the max tx rate of specified vf.
55462306a36Sopenharmony_ci * set_vf_mac
55562306a36Sopenharmony_ci *   Configure the default MAC for specified VF
55662306a36Sopenharmony_ci * get_module_eeprom
55762306a36Sopenharmony_ci *   Get the optical module eeprom info.
55862306a36Sopenharmony_ci * add_cls_flower
55962306a36Sopenharmony_ci *   Add clsflower rule
56062306a36Sopenharmony_ci * del_cls_flower
56162306a36Sopenharmony_ci *   Delete clsflower rule
56262306a36Sopenharmony_ci * cls_flower_active
56362306a36Sopenharmony_ci *   Check if any cls flower rule exist
56462306a36Sopenharmony_ci * dbg_read_cmd
56562306a36Sopenharmony_ci *   Execute debugfs read command.
56662306a36Sopenharmony_ci * set_tx_hwts_info
56762306a36Sopenharmony_ci *   Save information for 1588 tx packet
56862306a36Sopenharmony_ci * get_rx_hwts
56962306a36Sopenharmony_ci *   Get 1588 rx hwstamp
57062306a36Sopenharmony_ci * get_ts_info
57162306a36Sopenharmony_ci *   Get phc info
57262306a36Sopenharmony_ci * clean_vf_config
57362306a36Sopenharmony_ci *   Clean residual vf info after disable sriov
57462306a36Sopenharmony_ci * get_wol
57562306a36Sopenharmony_ci *   Get wake on lan info
57662306a36Sopenharmony_ci * set_wol
57762306a36Sopenharmony_ci *   Config wake on lan
57862306a36Sopenharmony_ci */
57962306a36Sopenharmony_cistruct hnae3_ae_ops {
58062306a36Sopenharmony_ci	int (*init_ae_dev)(struct hnae3_ae_dev *ae_dev);
58162306a36Sopenharmony_ci	void (*uninit_ae_dev)(struct hnae3_ae_dev *ae_dev);
58262306a36Sopenharmony_ci	void (*reset_prepare)(struct hnae3_ae_dev *ae_dev,
58362306a36Sopenharmony_ci			      enum hnae3_reset_type rst_type);
58462306a36Sopenharmony_ci	void (*reset_done)(struct hnae3_ae_dev *ae_dev);
58562306a36Sopenharmony_ci	int (*init_client_instance)(struct hnae3_client *client,
58662306a36Sopenharmony_ci				    struct hnae3_ae_dev *ae_dev);
58762306a36Sopenharmony_ci	void (*uninit_client_instance)(struct hnae3_client *client,
58862306a36Sopenharmony_ci				       struct hnae3_ae_dev *ae_dev);
58962306a36Sopenharmony_ci	int (*start)(struct hnae3_handle *handle);
59062306a36Sopenharmony_ci	void (*stop)(struct hnae3_handle *handle);
59162306a36Sopenharmony_ci	int (*client_start)(struct hnae3_handle *handle);
59262306a36Sopenharmony_ci	void (*client_stop)(struct hnae3_handle *handle);
59362306a36Sopenharmony_ci	int (*get_status)(struct hnae3_handle *handle);
59462306a36Sopenharmony_ci	void (*get_ksettings_an_result)(struct hnae3_handle *handle,
59562306a36Sopenharmony_ci					u8 *auto_neg, u32 *speed, u8 *duplex,
59662306a36Sopenharmony_ci					u32 *lane_num);
59762306a36Sopenharmony_ci
59862306a36Sopenharmony_ci	int (*cfg_mac_speed_dup_h)(struct hnae3_handle *handle, int speed,
59962306a36Sopenharmony_ci				   u8 duplex, u8 lane_num);
60062306a36Sopenharmony_ci
60162306a36Sopenharmony_ci	void (*get_media_type)(struct hnae3_handle *handle, u8 *media_type,
60262306a36Sopenharmony_ci			       u8 *module_type);
60362306a36Sopenharmony_ci	int (*check_port_speed)(struct hnae3_handle *handle, u32 speed);
60462306a36Sopenharmony_ci	void (*get_fec_stats)(struct hnae3_handle *handle,
60562306a36Sopenharmony_ci			      struct ethtool_fec_stats *fec_stats);
60662306a36Sopenharmony_ci	void (*get_fec)(struct hnae3_handle *handle, u8 *fec_ability,
60762306a36Sopenharmony_ci			u8 *fec_mode);
60862306a36Sopenharmony_ci	int (*set_fec)(struct hnae3_handle *handle, u32 fec_mode);
60962306a36Sopenharmony_ci	void (*adjust_link)(struct hnae3_handle *handle, int speed, int duplex);
61062306a36Sopenharmony_ci	int (*set_loopback)(struct hnae3_handle *handle,
61162306a36Sopenharmony_ci			    enum hnae3_loop loop_mode, bool en);
61262306a36Sopenharmony_ci
61362306a36Sopenharmony_ci	int (*set_promisc_mode)(struct hnae3_handle *handle, bool en_uc_pmc,
61462306a36Sopenharmony_ci				bool en_mc_pmc);
61562306a36Sopenharmony_ci	void (*request_update_promisc_mode)(struct hnae3_handle *handle);
61662306a36Sopenharmony_ci	int (*set_mtu)(struct hnae3_handle *handle, int new_mtu);
61762306a36Sopenharmony_ci
61862306a36Sopenharmony_ci	void (*get_pauseparam)(struct hnae3_handle *handle,
61962306a36Sopenharmony_ci			       u32 *auto_neg, u32 *rx_en, u32 *tx_en);
62062306a36Sopenharmony_ci	int (*set_pauseparam)(struct hnae3_handle *handle,
62162306a36Sopenharmony_ci			      u32 auto_neg, u32 rx_en, u32 tx_en);
62262306a36Sopenharmony_ci
62362306a36Sopenharmony_ci	int (*set_autoneg)(struct hnae3_handle *handle, bool enable);
62462306a36Sopenharmony_ci	int (*get_autoneg)(struct hnae3_handle *handle);
62562306a36Sopenharmony_ci	int (*restart_autoneg)(struct hnae3_handle *handle);
62662306a36Sopenharmony_ci	int (*halt_autoneg)(struct hnae3_handle *handle, bool halt);
62762306a36Sopenharmony_ci
62862306a36Sopenharmony_ci	void (*get_coalesce_usecs)(struct hnae3_handle *handle,
62962306a36Sopenharmony_ci				   u32 *tx_usecs, u32 *rx_usecs);
63062306a36Sopenharmony_ci	void (*get_rx_max_coalesced_frames)(struct hnae3_handle *handle,
63162306a36Sopenharmony_ci					    u32 *tx_frames, u32 *rx_frames);
63262306a36Sopenharmony_ci	int (*set_coalesce_usecs)(struct hnae3_handle *handle, u32 timeout);
63362306a36Sopenharmony_ci	int (*set_coalesce_frames)(struct hnae3_handle *handle,
63462306a36Sopenharmony_ci				   u32 coalesce_frames);
63562306a36Sopenharmony_ci	void (*get_coalesce_range)(struct hnae3_handle *handle,
63662306a36Sopenharmony_ci				   u32 *tx_frames_low, u32 *rx_frames_low,
63762306a36Sopenharmony_ci				   u32 *tx_frames_high, u32 *rx_frames_high,
63862306a36Sopenharmony_ci				   u32 *tx_usecs_low, u32 *rx_usecs_low,
63962306a36Sopenharmony_ci				   u32 *tx_usecs_high, u32 *rx_usecs_high);
64062306a36Sopenharmony_ci
64162306a36Sopenharmony_ci	void (*get_mac_addr)(struct hnae3_handle *handle, u8 *p);
64262306a36Sopenharmony_ci	int (*set_mac_addr)(struct hnae3_handle *handle, const void *p,
64362306a36Sopenharmony_ci			    bool is_first);
64462306a36Sopenharmony_ci	int (*do_ioctl)(struct hnae3_handle *handle,
64562306a36Sopenharmony_ci			struct ifreq *ifr, int cmd);
64662306a36Sopenharmony_ci	int (*add_uc_addr)(struct hnae3_handle *handle,
64762306a36Sopenharmony_ci			   const unsigned char *addr);
64862306a36Sopenharmony_ci	int (*rm_uc_addr)(struct hnae3_handle *handle,
64962306a36Sopenharmony_ci			  const unsigned char *addr);
65062306a36Sopenharmony_ci	int (*set_mc_addr)(struct hnae3_handle *handle, void *addr);
65162306a36Sopenharmony_ci	int (*add_mc_addr)(struct hnae3_handle *handle,
65262306a36Sopenharmony_ci			   const unsigned char *addr);
65362306a36Sopenharmony_ci	int (*rm_mc_addr)(struct hnae3_handle *handle,
65462306a36Sopenharmony_ci			  const unsigned char *addr);
65562306a36Sopenharmony_ci	void (*set_tso_stats)(struct hnae3_handle *handle, int enable);
65662306a36Sopenharmony_ci	void (*update_stats)(struct hnae3_handle *handle);
65762306a36Sopenharmony_ci	void (*get_stats)(struct hnae3_handle *handle, u64 *data);
65862306a36Sopenharmony_ci	void (*get_mac_stats)(struct hnae3_handle *handle,
65962306a36Sopenharmony_ci			      struct hns3_mac_stats *mac_stats);
66062306a36Sopenharmony_ci	void (*get_strings)(struct hnae3_handle *handle,
66162306a36Sopenharmony_ci			    u32 stringset, u8 *data);
66262306a36Sopenharmony_ci	int (*get_sset_count)(struct hnae3_handle *handle, int stringset);
66362306a36Sopenharmony_ci
66462306a36Sopenharmony_ci	void (*get_regs)(struct hnae3_handle *handle, u32 *version,
66562306a36Sopenharmony_ci			 void *data);
66662306a36Sopenharmony_ci	int (*get_regs_len)(struct hnae3_handle *handle);
66762306a36Sopenharmony_ci
66862306a36Sopenharmony_ci	u32 (*get_rss_key_size)(struct hnae3_handle *handle);
66962306a36Sopenharmony_ci	int (*get_rss)(struct hnae3_handle *handle, u32 *indir, u8 *key,
67062306a36Sopenharmony_ci		       u8 *hfunc);
67162306a36Sopenharmony_ci	int (*set_rss)(struct hnae3_handle *handle, const u32 *indir,
67262306a36Sopenharmony_ci		       const u8 *key, const u8 hfunc);
67362306a36Sopenharmony_ci	int (*set_rss_tuple)(struct hnae3_handle *handle,
67462306a36Sopenharmony_ci			     struct ethtool_rxnfc *cmd);
67562306a36Sopenharmony_ci	int (*get_rss_tuple)(struct hnae3_handle *handle,
67662306a36Sopenharmony_ci			     struct ethtool_rxnfc *cmd);
67762306a36Sopenharmony_ci
67862306a36Sopenharmony_ci	int (*get_tc_size)(struct hnae3_handle *handle);
67962306a36Sopenharmony_ci
68062306a36Sopenharmony_ci	int (*get_vector)(struct hnae3_handle *handle, u16 vector_num,
68162306a36Sopenharmony_ci			  struct hnae3_vector_info *vector_info);
68262306a36Sopenharmony_ci	int (*put_vector)(struct hnae3_handle *handle, int vector_num);
68362306a36Sopenharmony_ci	int (*map_ring_to_vector)(struct hnae3_handle *handle,
68462306a36Sopenharmony_ci				  int vector_num,
68562306a36Sopenharmony_ci				  struct hnae3_ring_chain_node *vr_chain);
68662306a36Sopenharmony_ci	int (*unmap_ring_from_vector)(struct hnae3_handle *handle,
68762306a36Sopenharmony_ci				      int vector_num,
68862306a36Sopenharmony_ci				      struct hnae3_ring_chain_node *vr_chain);
68962306a36Sopenharmony_ci
69062306a36Sopenharmony_ci	int (*reset_queue)(struct hnae3_handle *handle);
69162306a36Sopenharmony_ci	u32 (*get_fw_version)(struct hnae3_handle *handle);
69262306a36Sopenharmony_ci	void (*get_mdix_mode)(struct hnae3_handle *handle,
69362306a36Sopenharmony_ci			      u8 *tp_mdix_ctrl, u8 *tp_mdix);
69462306a36Sopenharmony_ci
69562306a36Sopenharmony_ci	int (*enable_vlan_filter)(struct hnae3_handle *handle, bool enable);
69662306a36Sopenharmony_ci	int (*set_vlan_filter)(struct hnae3_handle *handle, __be16 proto,
69762306a36Sopenharmony_ci			       u16 vlan_id, bool is_kill);
69862306a36Sopenharmony_ci	int (*set_vf_vlan_filter)(struct hnae3_handle *handle, int vfid,
69962306a36Sopenharmony_ci				  u16 vlan, u8 qos, __be16 proto);
70062306a36Sopenharmony_ci	int (*enable_hw_strip_rxvtag)(struct hnae3_handle *handle, bool enable);
70162306a36Sopenharmony_ci	void (*reset_event)(struct pci_dev *pdev, struct hnae3_handle *handle);
70262306a36Sopenharmony_ci	enum hnae3_reset_type (*get_reset_level)(struct hnae3_ae_dev *ae_dev,
70362306a36Sopenharmony_ci						 unsigned long *addr);
70462306a36Sopenharmony_ci	void (*set_default_reset_request)(struct hnae3_ae_dev *ae_dev,
70562306a36Sopenharmony_ci					  enum hnae3_reset_type rst_type);
70662306a36Sopenharmony_ci	void (*get_channels)(struct hnae3_handle *handle,
70762306a36Sopenharmony_ci			     struct ethtool_channels *ch);
70862306a36Sopenharmony_ci	void (*get_tqps_and_rss_info)(struct hnae3_handle *h,
70962306a36Sopenharmony_ci				      u16 *alloc_tqps, u16 *max_rss_size);
71062306a36Sopenharmony_ci	int (*set_channels)(struct hnae3_handle *handle, u32 new_tqps_num,
71162306a36Sopenharmony_ci			    bool rxfh_configured);
71262306a36Sopenharmony_ci	void (*get_flowctrl_adv)(struct hnae3_handle *handle,
71362306a36Sopenharmony_ci				 u32 *flowctrl_adv);
71462306a36Sopenharmony_ci	int (*set_led_id)(struct hnae3_handle *handle,
71562306a36Sopenharmony_ci			  enum ethtool_phys_id_state status);
71662306a36Sopenharmony_ci	void (*get_link_mode)(struct hnae3_handle *handle,
71762306a36Sopenharmony_ci			      unsigned long *supported,
71862306a36Sopenharmony_ci			      unsigned long *advertising);
71962306a36Sopenharmony_ci	int (*add_fd_entry)(struct hnae3_handle *handle,
72062306a36Sopenharmony_ci			    struct ethtool_rxnfc *cmd);
72162306a36Sopenharmony_ci	int (*del_fd_entry)(struct hnae3_handle *handle,
72262306a36Sopenharmony_ci			    struct ethtool_rxnfc *cmd);
72362306a36Sopenharmony_ci	int (*get_fd_rule_cnt)(struct hnae3_handle *handle,
72462306a36Sopenharmony_ci			       struct ethtool_rxnfc *cmd);
72562306a36Sopenharmony_ci	int (*get_fd_rule_info)(struct hnae3_handle *handle,
72662306a36Sopenharmony_ci				struct ethtool_rxnfc *cmd);
72762306a36Sopenharmony_ci	int (*get_fd_all_rules)(struct hnae3_handle *handle,
72862306a36Sopenharmony_ci				struct ethtool_rxnfc *cmd, u32 *rule_locs);
72962306a36Sopenharmony_ci	void (*enable_fd)(struct hnae3_handle *handle, bool enable);
73062306a36Sopenharmony_ci	int (*add_arfs_entry)(struct hnae3_handle *handle, u16 queue_id,
73162306a36Sopenharmony_ci			      u16 flow_id, struct flow_keys *fkeys);
73262306a36Sopenharmony_ci	int (*dbg_read_cmd)(struct hnae3_handle *handle, enum hnae3_dbg_cmd cmd,
73362306a36Sopenharmony_ci			    char *buf, int len);
73462306a36Sopenharmony_ci	pci_ers_result_t (*handle_hw_ras_error)(struct hnae3_ae_dev *ae_dev);
73562306a36Sopenharmony_ci	bool (*get_hw_reset_stat)(struct hnae3_handle *handle);
73662306a36Sopenharmony_ci	bool (*ae_dev_resetting)(struct hnae3_handle *handle);
73762306a36Sopenharmony_ci	unsigned long (*ae_dev_reset_cnt)(struct hnae3_handle *handle);
73862306a36Sopenharmony_ci	int (*set_gro_en)(struct hnae3_handle *handle, bool enable);
73962306a36Sopenharmony_ci	u16 (*get_global_queue_id)(struct hnae3_handle *handle, u16 queue_id);
74062306a36Sopenharmony_ci	void (*set_timer_task)(struct hnae3_handle *handle, bool enable);
74162306a36Sopenharmony_ci	int (*mac_connect_phy)(struct hnae3_handle *handle);
74262306a36Sopenharmony_ci	void (*mac_disconnect_phy)(struct hnae3_handle *handle);
74362306a36Sopenharmony_ci	int (*get_vf_config)(struct hnae3_handle *handle, int vf,
74462306a36Sopenharmony_ci			     struct ifla_vf_info *ivf);
74562306a36Sopenharmony_ci	int (*set_vf_link_state)(struct hnae3_handle *handle, int vf,
74662306a36Sopenharmony_ci				 int link_state);
74762306a36Sopenharmony_ci	int (*set_vf_spoofchk)(struct hnae3_handle *handle, int vf,
74862306a36Sopenharmony_ci			       bool enable);
74962306a36Sopenharmony_ci	int (*set_vf_trust)(struct hnae3_handle *handle, int vf, bool enable);
75062306a36Sopenharmony_ci	int (*set_vf_rate)(struct hnae3_handle *handle, int vf,
75162306a36Sopenharmony_ci			   int min_tx_rate, int max_tx_rate, bool force);
75262306a36Sopenharmony_ci	int (*set_vf_mac)(struct hnae3_handle *handle, int vf, u8 *p);
75362306a36Sopenharmony_ci	int (*get_module_eeprom)(struct hnae3_handle *handle, u32 offset,
75462306a36Sopenharmony_ci				 u32 len, u8 *data);
75562306a36Sopenharmony_ci	bool (*get_cmdq_stat)(struct hnae3_handle *handle);
75662306a36Sopenharmony_ci	int (*add_cls_flower)(struct hnae3_handle *handle,
75762306a36Sopenharmony_ci			      struct flow_cls_offload *cls_flower, int tc);
75862306a36Sopenharmony_ci	int (*del_cls_flower)(struct hnae3_handle *handle,
75962306a36Sopenharmony_ci			      struct flow_cls_offload *cls_flower);
76062306a36Sopenharmony_ci	bool (*cls_flower_active)(struct hnae3_handle *handle);
76162306a36Sopenharmony_ci	int (*get_phy_link_ksettings)(struct hnae3_handle *handle,
76262306a36Sopenharmony_ci				      struct ethtool_link_ksettings *cmd);
76362306a36Sopenharmony_ci	int (*set_phy_link_ksettings)(struct hnae3_handle *handle,
76462306a36Sopenharmony_ci				      const struct ethtool_link_ksettings *cmd);
76562306a36Sopenharmony_ci	bool (*set_tx_hwts_info)(struct hnae3_handle *handle,
76662306a36Sopenharmony_ci				 struct sk_buff *skb);
76762306a36Sopenharmony_ci	void (*get_rx_hwts)(struct hnae3_handle *handle, struct sk_buff *skb,
76862306a36Sopenharmony_ci			    u32 nsec, u32 sec);
76962306a36Sopenharmony_ci	int (*get_ts_info)(struct hnae3_handle *handle,
77062306a36Sopenharmony_ci			   struct ethtool_ts_info *info);
77162306a36Sopenharmony_ci	int (*get_link_diagnosis_info)(struct hnae3_handle *handle,
77262306a36Sopenharmony_ci				       u32 *status_code);
77362306a36Sopenharmony_ci	void (*clean_vf_config)(struct hnae3_ae_dev *ae_dev, int num_vfs);
77462306a36Sopenharmony_ci	int (*get_dscp_prio)(struct hnae3_handle *handle, u8 dscp,
77562306a36Sopenharmony_ci			     u8 *tc_map_mode, u8 *priority);
77662306a36Sopenharmony_ci	void (*get_wol)(struct hnae3_handle *handle,
77762306a36Sopenharmony_ci			struct ethtool_wolinfo *wol);
77862306a36Sopenharmony_ci	int (*set_wol)(struct hnae3_handle *handle,
77962306a36Sopenharmony_ci		       struct ethtool_wolinfo *wol);
78062306a36Sopenharmony_ci};
78162306a36Sopenharmony_ci
78262306a36Sopenharmony_cistruct hnae3_dcb_ops {
78362306a36Sopenharmony_ci	/* IEEE 802.1Qaz std */
78462306a36Sopenharmony_ci	int (*ieee_getets)(struct hnae3_handle *, struct ieee_ets *);
78562306a36Sopenharmony_ci	int (*ieee_setets)(struct hnae3_handle *, struct ieee_ets *);
78662306a36Sopenharmony_ci	int (*ieee_getpfc)(struct hnae3_handle *, struct ieee_pfc *);
78762306a36Sopenharmony_ci	int (*ieee_setpfc)(struct hnae3_handle *, struct ieee_pfc *);
78862306a36Sopenharmony_ci	int (*ieee_setapp)(struct hnae3_handle *h, struct dcb_app *app);
78962306a36Sopenharmony_ci	int (*ieee_delapp)(struct hnae3_handle *h, struct dcb_app *app);
79062306a36Sopenharmony_ci
79162306a36Sopenharmony_ci	/* DCBX configuration */
79262306a36Sopenharmony_ci	u8   (*getdcbx)(struct hnae3_handle *);
79362306a36Sopenharmony_ci	u8   (*setdcbx)(struct hnae3_handle *, u8);
79462306a36Sopenharmony_ci
79562306a36Sopenharmony_ci	int (*setup_tc)(struct hnae3_handle *handle,
79662306a36Sopenharmony_ci			struct tc_mqprio_qopt_offload *mqprio_qopt);
79762306a36Sopenharmony_ci};
79862306a36Sopenharmony_ci
79962306a36Sopenharmony_cistruct hnae3_ae_algo {
80062306a36Sopenharmony_ci	const struct hnae3_ae_ops *ops;
80162306a36Sopenharmony_ci	struct list_head node;
80262306a36Sopenharmony_ci	const struct pci_device_id *pdev_id_table;
80362306a36Sopenharmony_ci};
80462306a36Sopenharmony_ci
80562306a36Sopenharmony_ci#define HNAE3_INT_NAME_LEN        32
80662306a36Sopenharmony_ci#define HNAE3_ITR_COUNTDOWN_START 100
80762306a36Sopenharmony_ci
80862306a36Sopenharmony_ci#define HNAE3_MAX_TC		8
80962306a36Sopenharmony_ci#define HNAE3_MAX_USER_PRIO	8
81062306a36Sopenharmony_cistruct hnae3_tc_info {
81162306a36Sopenharmony_ci	u8 prio_tc[HNAE3_MAX_USER_PRIO]; /* TC indexed by prio */
81262306a36Sopenharmony_ci	u16 tqp_count[HNAE3_MAX_TC];
81362306a36Sopenharmony_ci	u16 tqp_offset[HNAE3_MAX_TC];
81462306a36Sopenharmony_ci	u8 max_tc; /* Total number of TCs */
81562306a36Sopenharmony_ci	u8 num_tc; /* Total number of enabled TCs */
81662306a36Sopenharmony_ci	bool mqprio_active;
81762306a36Sopenharmony_ci	bool dcb_ets_active;
81862306a36Sopenharmony_ci};
81962306a36Sopenharmony_ci
82062306a36Sopenharmony_ci#define HNAE3_MAX_DSCP			64
82162306a36Sopenharmony_ci#define HNAE3_PRIO_ID_INVALID		0xff
82262306a36Sopenharmony_cistruct hnae3_knic_private_info {
82362306a36Sopenharmony_ci	struct net_device *netdev; /* Set by KNIC client when init instance */
82462306a36Sopenharmony_ci	u16 rss_size;		   /* Allocated RSS queues */
82562306a36Sopenharmony_ci	u16 req_rss_size;
82662306a36Sopenharmony_ci	u16 rx_buf_len;
82762306a36Sopenharmony_ci	u16 num_tx_desc;
82862306a36Sopenharmony_ci	u16 num_rx_desc;
82962306a36Sopenharmony_ci	u32 tx_spare_buf_size;
83062306a36Sopenharmony_ci
83162306a36Sopenharmony_ci	struct hnae3_tc_info tc_info;
83262306a36Sopenharmony_ci	u8 tc_map_mode;
83362306a36Sopenharmony_ci	u8 dscp_app_cnt;
83462306a36Sopenharmony_ci	u8 dscp_prio[HNAE3_MAX_DSCP];
83562306a36Sopenharmony_ci
83662306a36Sopenharmony_ci	u16 num_tqps;		  /* total number of TQPs in this handle */
83762306a36Sopenharmony_ci	struct hnae3_queue **tqp;  /* array base of all TQPs in this instance */
83862306a36Sopenharmony_ci	const struct hnae3_dcb_ops *dcb_ops;
83962306a36Sopenharmony_ci
84062306a36Sopenharmony_ci	u16 int_rl_setting;
84162306a36Sopenharmony_ci	void __iomem *io_base;
84262306a36Sopenharmony_ci};
84362306a36Sopenharmony_ci
84462306a36Sopenharmony_cistruct hnae3_roce_private_info {
84562306a36Sopenharmony_ci	struct net_device *netdev;
84662306a36Sopenharmony_ci	void __iomem *roce_io_base;
84762306a36Sopenharmony_ci	void __iomem *roce_mem_base;
84862306a36Sopenharmony_ci	int base_vector;
84962306a36Sopenharmony_ci	int num_vectors;
85062306a36Sopenharmony_ci
85162306a36Sopenharmony_ci	/* The below attributes defined for RoCE client, hnae3 gives
85262306a36Sopenharmony_ci	 * initial values to them, and RoCE client can modify and use
85362306a36Sopenharmony_ci	 * them.
85462306a36Sopenharmony_ci	 */
85562306a36Sopenharmony_ci	unsigned long reset_state;
85662306a36Sopenharmony_ci	unsigned long instance_state;
85762306a36Sopenharmony_ci	unsigned long state;
85862306a36Sopenharmony_ci};
85962306a36Sopenharmony_ci
86062306a36Sopenharmony_ci#define HNAE3_SUPPORT_APP_LOOPBACK    BIT(0)
86162306a36Sopenharmony_ci#define HNAE3_SUPPORT_PHY_LOOPBACK    BIT(1)
86262306a36Sopenharmony_ci#define HNAE3_SUPPORT_SERDES_SERIAL_LOOPBACK	BIT(2)
86362306a36Sopenharmony_ci#define HNAE3_SUPPORT_VF	      BIT(3)
86462306a36Sopenharmony_ci#define HNAE3_SUPPORT_SERDES_PARALLEL_LOOPBACK	BIT(4)
86562306a36Sopenharmony_ci#define HNAE3_SUPPORT_EXTERNAL_LOOPBACK	BIT(5)
86662306a36Sopenharmony_ci
86762306a36Sopenharmony_ci#define HNAE3_USER_UPE		BIT(0)	/* unicast promisc enabled by user */
86862306a36Sopenharmony_ci#define HNAE3_USER_MPE		BIT(1)	/* mulitcast promisc enabled by user */
86962306a36Sopenharmony_ci#define HNAE3_BPE		BIT(2)	/* broadcast promisc enable */
87062306a36Sopenharmony_ci#define HNAE3_OVERFLOW_UPE	BIT(3)	/* unicast mac vlan overflow */
87162306a36Sopenharmony_ci#define HNAE3_OVERFLOW_MPE	BIT(4)	/* multicast mac vlan overflow */
87262306a36Sopenharmony_ci#define HNAE3_UPE		(HNAE3_USER_UPE | HNAE3_OVERFLOW_UPE)
87362306a36Sopenharmony_ci#define HNAE3_MPE		(HNAE3_USER_MPE | HNAE3_OVERFLOW_MPE)
87462306a36Sopenharmony_ci
87562306a36Sopenharmony_cienum hnae3_pflag {
87662306a36Sopenharmony_ci	HNAE3_PFLAG_LIMIT_PROMISC,
87762306a36Sopenharmony_ci	HNAE3_PFLAG_MAX
87862306a36Sopenharmony_ci};
87962306a36Sopenharmony_ci
88062306a36Sopenharmony_cistruct hnae3_handle {
88162306a36Sopenharmony_ci	struct hnae3_client *client;
88262306a36Sopenharmony_ci	struct pci_dev *pdev;
88362306a36Sopenharmony_ci	void *priv;
88462306a36Sopenharmony_ci	struct hnae3_ae_algo *ae_algo;  /* the class who provides this handle */
88562306a36Sopenharmony_ci	u64 flags; /* Indicate the capabilities for this handle */
88662306a36Sopenharmony_ci
88762306a36Sopenharmony_ci	union {
88862306a36Sopenharmony_ci		struct net_device *netdev; /* first member */
88962306a36Sopenharmony_ci		struct hnae3_knic_private_info kinfo;
89062306a36Sopenharmony_ci		struct hnae3_roce_private_info rinfo;
89162306a36Sopenharmony_ci	};
89262306a36Sopenharmony_ci
89362306a36Sopenharmony_ci	u32 numa_node_mask;	/* for multi-chip support */
89462306a36Sopenharmony_ci
89562306a36Sopenharmony_ci	enum hnae3_port_base_vlan_state port_base_vlan_state;
89662306a36Sopenharmony_ci
89762306a36Sopenharmony_ci	u8 netdev_flags;
89862306a36Sopenharmony_ci	struct dentry *hnae3_dbgfs;
89962306a36Sopenharmony_ci	/* protects concurrent contention between debugfs commands */
90062306a36Sopenharmony_ci	struct mutex dbgfs_lock;
90162306a36Sopenharmony_ci	char **dbgfs_buf;
90262306a36Sopenharmony_ci
90362306a36Sopenharmony_ci	/* Network interface message level enabled bits */
90462306a36Sopenharmony_ci	u32 msg_enable;
90562306a36Sopenharmony_ci
90662306a36Sopenharmony_ci	unsigned long supported_pflags;
90762306a36Sopenharmony_ci	unsigned long priv_flags;
90862306a36Sopenharmony_ci};
90962306a36Sopenharmony_ci
91062306a36Sopenharmony_ci#define hnae3_set_field(origin, mask, shift, val) \
91162306a36Sopenharmony_ci	do { \
91262306a36Sopenharmony_ci		(origin) &= (~(mask)); \
91362306a36Sopenharmony_ci		(origin) |= ((val) << (shift)) & (mask); \
91462306a36Sopenharmony_ci	} while (0)
91562306a36Sopenharmony_ci#define hnae3_get_field(origin, mask, shift) (((origin) & (mask)) >> (shift))
91662306a36Sopenharmony_ci
91762306a36Sopenharmony_ci#define hnae3_set_bit(origin, shift, val) \
91862306a36Sopenharmony_ci	hnae3_set_field(origin, 0x1 << (shift), shift, val)
91962306a36Sopenharmony_ci#define hnae3_get_bit(origin, shift) \
92062306a36Sopenharmony_ci	hnae3_get_field(origin, 0x1 << (shift), shift)
92162306a36Sopenharmony_ci
92262306a36Sopenharmony_ci#define HNAE3_FORMAT_MAC_ADDR_LEN	18
92362306a36Sopenharmony_ci#define HNAE3_FORMAT_MAC_ADDR_OFFSET_0	0
92462306a36Sopenharmony_ci#define HNAE3_FORMAT_MAC_ADDR_OFFSET_4	4
92562306a36Sopenharmony_ci#define HNAE3_FORMAT_MAC_ADDR_OFFSET_5	5
92662306a36Sopenharmony_ci
92762306a36Sopenharmony_cistatic inline void hnae3_format_mac_addr(char *format_mac_addr,
92862306a36Sopenharmony_ci					 const u8 *mac_addr)
92962306a36Sopenharmony_ci{
93062306a36Sopenharmony_ci	snprintf(format_mac_addr, HNAE3_FORMAT_MAC_ADDR_LEN, "%02x:**:**:**:%02x:%02x",
93162306a36Sopenharmony_ci		 mac_addr[HNAE3_FORMAT_MAC_ADDR_OFFSET_0],
93262306a36Sopenharmony_ci		 mac_addr[HNAE3_FORMAT_MAC_ADDR_OFFSET_4],
93362306a36Sopenharmony_ci		 mac_addr[HNAE3_FORMAT_MAC_ADDR_OFFSET_5]);
93462306a36Sopenharmony_ci}
93562306a36Sopenharmony_ci
93662306a36Sopenharmony_ciint hnae3_register_ae_dev(struct hnae3_ae_dev *ae_dev);
93762306a36Sopenharmony_civoid hnae3_unregister_ae_dev(struct hnae3_ae_dev *ae_dev);
93862306a36Sopenharmony_ci
93962306a36Sopenharmony_civoid hnae3_unregister_ae_algo_prepare(struct hnae3_ae_algo *ae_algo);
94062306a36Sopenharmony_civoid hnae3_unregister_ae_algo(struct hnae3_ae_algo *ae_algo);
94162306a36Sopenharmony_civoid hnae3_register_ae_algo(struct hnae3_ae_algo *ae_algo);
94262306a36Sopenharmony_ci
94362306a36Sopenharmony_civoid hnae3_unregister_client(struct hnae3_client *client);
94462306a36Sopenharmony_ciint hnae3_register_client(struct hnae3_client *client);
94562306a36Sopenharmony_ci
94662306a36Sopenharmony_civoid hnae3_set_client_init_flag(struct hnae3_client *client,
94762306a36Sopenharmony_ci				struct hnae3_ae_dev *ae_dev,
94862306a36Sopenharmony_ci				unsigned int inited);
94962306a36Sopenharmony_ci#endif
950