xref: /OK3568_Linux_fs/kernel/drivers/net/ethernet/qlogic/qed/qed_dcbx.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
2*4882a593Smuzhiyun /* QLogic qed NIC Driver
3*4882a593Smuzhiyun  * Copyright (c) 2015-2017  QLogic Corporation
4*4882a593Smuzhiyun  * Copyright (c) 2019-2020 Marvell International Ltd.
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #ifndef _QED_DCBX_H
8*4882a593Smuzhiyun #define _QED_DCBX_H
9*4882a593Smuzhiyun #include <linux/types.h>
10*4882a593Smuzhiyun #include <linux/slab.h>
11*4882a593Smuzhiyun #include "qed.h"
12*4882a593Smuzhiyun #include "qed_hsi.h"
13*4882a593Smuzhiyun #include "qed_hw.h"
14*4882a593Smuzhiyun #include "qed_mcp.h"
15*4882a593Smuzhiyun #include "qed_reg_addr.h"
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #define DCBX_CONFIG_MAX_APP_PROTOCOL    4
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun enum qed_mib_read_type {
20*4882a593Smuzhiyun 	QED_DCBX_OPERATIONAL_MIB,
21*4882a593Smuzhiyun 	QED_DCBX_REMOTE_MIB,
22*4882a593Smuzhiyun 	QED_DCBX_LOCAL_MIB,
23*4882a593Smuzhiyun 	QED_DCBX_REMOTE_LLDP_MIB,
24*4882a593Smuzhiyun 	QED_DCBX_LOCAL_LLDP_MIB
25*4882a593Smuzhiyun };
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun struct qed_dcbx_app_data {
28*4882a593Smuzhiyun 	bool enable;		/* DCB enabled */
29*4882a593Smuzhiyun 	u8 update;		/* Update indication */
30*4882a593Smuzhiyun 	u8 priority;		/* Priority */
31*4882a593Smuzhiyun 	u8 tc;			/* Traffic Class */
32*4882a593Smuzhiyun 	bool dont_add_vlan0;	/* Do not insert a vlan tag with id 0 */
33*4882a593Smuzhiyun };
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun #define QED_DCBX_VERSION_DISABLED       0
36*4882a593Smuzhiyun #define QED_DCBX_VERSION_IEEE           1
37*4882a593Smuzhiyun #define QED_DCBX_VERSION_CEE            2
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun struct qed_dcbx_set {
40*4882a593Smuzhiyun #define QED_DCBX_OVERRIDE_STATE	        BIT(0)
41*4882a593Smuzhiyun #define QED_DCBX_OVERRIDE_PFC_CFG       BIT(1)
42*4882a593Smuzhiyun #define QED_DCBX_OVERRIDE_ETS_CFG       BIT(2)
43*4882a593Smuzhiyun #define QED_DCBX_OVERRIDE_APP_CFG       BIT(3)
44*4882a593Smuzhiyun #define QED_DCBX_OVERRIDE_DSCP_CFG      BIT(4)
45*4882a593Smuzhiyun 	u32 override_flags;
46*4882a593Smuzhiyun 	bool enabled;
47*4882a593Smuzhiyun 	struct qed_dcbx_admin_params config;
48*4882a593Smuzhiyun 	u32 ver_num;
49*4882a593Smuzhiyun };
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun struct qed_dcbx_results {
52*4882a593Smuzhiyun 	bool dcbx_enabled;
53*4882a593Smuzhiyun 	u8 pf_id;
54*4882a593Smuzhiyun 	struct qed_dcbx_app_data arr[DCBX_MAX_PROTOCOL_TYPE];
55*4882a593Smuzhiyun };
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun struct qed_dcbx_app_metadata {
58*4882a593Smuzhiyun 	enum dcbx_protocol_type id;
59*4882a593Smuzhiyun 	char *name;
60*4882a593Smuzhiyun 	enum qed_pci_personality personality;
61*4882a593Smuzhiyun };
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun struct qed_dcbx_info {
64*4882a593Smuzhiyun 	struct lldp_status_params_s lldp_remote[LLDP_MAX_LLDP_AGENTS];
65*4882a593Smuzhiyun 	struct lldp_config_params_s lldp_local[LLDP_MAX_LLDP_AGENTS];
66*4882a593Smuzhiyun 	struct dcbx_local_params local_admin;
67*4882a593Smuzhiyun 	struct qed_dcbx_results results;
68*4882a593Smuzhiyun 	struct dcbx_mib operational;
69*4882a593Smuzhiyun 	struct dcbx_mib remote;
70*4882a593Smuzhiyun 	struct qed_dcbx_set set;
71*4882a593Smuzhiyun 	struct qed_dcbx_get get;
72*4882a593Smuzhiyun 	u8 dcbx_cap;
73*4882a593Smuzhiyun };
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun struct qed_dcbx_mib_meta_data {
76*4882a593Smuzhiyun 	struct lldp_config_params_s *lldp_local;
77*4882a593Smuzhiyun 	struct lldp_status_params_s *lldp_remote;
78*4882a593Smuzhiyun 	struct dcbx_local_params *local_admin;
79*4882a593Smuzhiyun 	struct dcbx_mib *mib;
80*4882a593Smuzhiyun 	size_t size;
81*4882a593Smuzhiyun 	u32 addr;
82*4882a593Smuzhiyun };
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun extern const struct qed_eth_dcbnl_ops qed_dcbnl_ops_pass;
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun #ifdef CONFIG_DCB
87*4882a593Smuzhiyun int qed_dcbx_get_config_params(struct qed_hwfn *, struct qed_dcbx_set *);
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun int qed_dcbx_config_params(struct qed_hwfn *,
90*4882a593Smuzhiyun 			   struct qed_ptt *, struct qed_dcbx_set *, bool);
91*4882a593Smuzhiyun #endif
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun /* QED local interface routines */
94*4882a593Smuzhiyun int
95*4882a593Smuzhiyun qed_dcbx_mib_update_event(struct qed_hwfn *,
96*4882a593Smuzhiyun 			  struct qed_ptt *, enum qed_mib_read_type);
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun int qed_dcbx_info_alloc(struct qed_hwfn *p_hwfn);
99*4882a593Smuzhiyun void qed_dcbx_info_free(struct qed_hwfn *p_hwfn);
100*4882a593Smuzhiyun void qed_dcbx_set_pf_update_params(struct qed_dcbx_results *p_src,
101*4882a593Smuzhiyun 				   struct pf_update_ramrod_data *p_dest);
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun #define QED_DCBX_DEFAULT_TC	0
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun u8 qed_dcbx_get_priority_tc(struct qed_hwfn *p_hwfn, u8 pri);
106*4882a593Smuzhiyun #endif
107