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