ecore_dcbx_api.h revision 337519
1/*
2 * Copyright (c) 2017-2018 Cavium, Inc.
3 * All rights reserved.
4 *
5 *  Redistribution and use in source and binary forms, with or without
6 *  modification, are permitted provided that the following conditions
7 *  are met:
8 *
9 *  1. Redistributions of source code must retain the above copyright
10 *     notice, this list of conditions and the following disclaimer.
11 *  2. Redistributions in binary form must reproduce the above copyright
12 *     notice, this list of conditions and the following disclaimer in the
13 *     documentation and/or other materials provided with the distribution.
14 *
15 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16 *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19 *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 *  POSSIBILITY OF SUCH DAMAGE.
26 *
27 * $FreeBSD: stable/10/sys/dev/qlnx/qlnxe/ecore_dcbx_api.h 337519 2018-08-09 01:39:47Z davidcs $
28 *
29 */
30
31#ifndef __ECORE_DCBX_API_H__
32#define __ECORE_DCBX_API_H__
33
34#include "ecore_status.h"
35
36#define DCBX_CONFIG_MAX_APP_PROTOCOL	4
37
38enum ecore_mib_read_type {
39	ECORE_DCBX_OPERATIONAL_MIB,
40	ECORE_DCBX_REMOTE_MIB,
41	ECORE_DCBX_LOCAL_MIB,
42	ECORE_DCBX_REMOTE_LLDP_MIB,
43	ECORE_DCBX_LOCAL_LLDP_MIB,
44	ECORE_DCBX_LLDP_TLVS
45};
46
47struct ecore_dcbx_app_data {
48	bool enable;		/* DCB enabled */
49	u8 update;		/* Update indication */
50	u8 priority;		/* Priority */
51	u8 tc;			/* Traffic Class */
52	bool dscp_enable;	/* DSCP enabled */
53	u8 dscp_val;		/* DSCP value */
54	bool dont_add_vlan0;	/* Do not insert a vlan tag with id 0 */
55};
56
57#ifndef __EXTRACT__LINUX__IF__
58enum dcbx_protocol_type {
59	DCBX_PROTOCOL_ISCSI,
60	DCBX_PROTOCOL_FCOE,
61	DCBX_PROTOCOL_ROCE,
62	DCBX_PROTOCOL_ROCE_V2,
63	DCBX_PROTOCOL_ETH,
64	DCBX_PROTOCOL_IWARP,
65	DCBX_MAX_PROTOCOL_TYPE
66};
67
68#define ECORE_LLDP_CHASSIS_ID_STAT_LEN 4
69#define ECORE_LLDP_PORT_ID_STAT_LEN 4
70#define ECORE_DCBX_MAX_APP_PROTOCOL 32
71#define ECORE_MAX_PFC_PRIORITIES 8
72#define ECORE_DCBX_DSCP_SIZE 64
73
74struct ecore_dcbx_lldp_remote {
75	u32     peer_chassis_id[ECORE_LLDP_CHASSIS_ID_STAT_LEN];
76	u32     peer_port_id[ECORE_LLDP_PORT_ID_STAT_LEN];
77	bool	enable_rx;
78	bool	enable_tx;
79	u32     tx_interval;
80	u32     max_credit;
81};
82
83struct ecore_dcbx_lldp_local {
84	u32     local_chassis_id[ECORE_LLDP_CHASSIS_ID_STAT_LEN];
85	u32     local_port_id[ECORE_LLDP_PORT_ID_STAT_LEN];
86};
87
88struct ecore_dcbx_app_prio {
89	u8	roce;
90	u8	roce_v2;
91	u8	fcoe;
92	u8	iscsi;
93	u8	eth;
94};
95
96struct ecore_dbcx_pfc_params {
97	bool	willing;
98	bool	enabled;
99	u8	prio[ECORE_MAX_PFC_PRIORITIES];
100	u8	max_tc;
101};
102
103enum ecore_dcbx_sf_ieee_type {
104	ECORE_DCBX_SF_IEEE_ETHTYPE,
105	ECORE_DCBX_SF_IEEE_TCP_PORT,
106	ECORE_DCBX_SF_IEEE_UDP_PORT,
107	ECORE_DCBX_SF_IEEE_TCP_UDP_PORT
108};
109
110struct ecore_app_entry {
111	bool ethtype;
112	enum ecore_dcbx_sf_ieee_type sf_ieee;
113	bool enabled;
114	u8 prio;
115	u16 proto_id;
116	enum dcbx_protocol_type proto_type;
117};
118
119struct ecore_dcbx_params {
120	struct ecore_app_entry app_entry[ECORE_DCBX_MAX_APP_PROTOCOL];
121	u16	num_app_entries;
122	bool	app_willing;
123	bool	app_valid;
124	bool	app_error;
125	bool	ets_willing;
126	bool	ets_enabled;
127	bool	ets_cbs;
128	u8	ets_pri_tc_tbl[ECORE_MAX_PFC_PRIORITIES];
129	u8	ets_tc_bw_tbl[ECORE_MAX_PFC_PRIORITIES];
130	u8	ets_tc_tsa_tbl[ECORE_MAX_PFC_PRIORITIES];
131	struct ecore_dbcx_pfc_params pfc;
132	u8	max_ets_tc;
133};
134
135struct ecore_dcbx_admin_params {
136	struct ecore_dcbx_params params;
137	bool valid;		/* Indicate validity of params */
138};
139
140struct ecore_dcbx_remote_params {
141	struct ecore_dcbx_params params;
142	bool valid;		/* Indicate validity of params */
143};
144
145struct ecore_dcbx_operational_params {
146	struct ecore_dcbx_app_prio app_prio;
147	struct ecore_dcbx_params params;
148	bool valid;		/* Indicate validity of params */
149	bool enabled;
150	bool ieee;
151	bool cee;
152	bool local;
153	u32 err;
154};
155
156struct ecore_dcbx_dscp_params {
157	bool enabled;
158	u8 dscp_pri_map[ECORE_DCBX_DSCP_SIZE];
159};
160
161struct ecore_dcbx_get {
162	struct ecore_dcbx_operational_params operational;
163	struct ecore_dcbx_lldp_remote lldp_remote;
164	struct ecore_dcbx_lldp_local lldp_local;
165	struct ecore_dcbx_remote_params remote;
166	struct ecore_dcbx_admin_params local;
167	struct ecore_dcbx_dscp_params dscp;
168};
169#endif
170
171#define ECORE_DCBX_VERSION_DISABLED	0
172#define ECORE_DCBX_VERSION_IEEE		1
173#define ECORE_DCBX_VERSION_CEE		2
174#define ECORE_DCBX_VERSION_DYNAMIC	3
175
176struct ecore_dcbx_set {
177#define ECORE_DCBX_OVERRIDE_STATE	(1 << 0)
178#define ECORE_DCBX_OVERRIDE_PFC_CFG	(1 << 1)
179#define ECORE_DCBX_OVERRIDE_ETS_CFG	(1 << 2)
180#define ECORE_DCBX_OVERRIDE_APP_CFG	(1 << 3)
181#define ECORE_DCBX_OVERRIDE_DSCP_CFG	(1 << 4)
182	u32 override_flags;
183	bool enabled;
184	struct ecore_dcbx_admin_params config;
185	u32 ver_num;
186	struct ecore_dcbx_dscp_params dscp;
187};
188
189struct ecore_dcbx_results {
190	bool dcbx_enabled;
191	u8 pf_id;
192	struct ecore_dcbx_app_data arr[DCBX_MAX_PROTOCOL_TYPE];
193};
194
195struct ecore_dcbx_app_metadata {
196	enum dcbx_protocol_type id;
197	char *name;
198	enum ecore_pci_personality personality;
199};
200
201enum ecore_lldp_agent {
202	ECORE_LLDP_NEAREST_BRIDGE = 0,
203	ECORE_LLDP_NEAREST_NON_TPMR_BRIDGE,
204	ECORE_LLDP_NEAREST_CUSTOMER_BRIDGE,
205	ECORE_LLDP_MAX_AGENTS
206};
207
208struct ecore_lldp_config_params {
209	enum ecore_lldp_agent agent;
210	u8 tx_interval;
211	u8 tx_hold;
212	u8 tx_credit;
213	bool rx_enable;
214	bool tx_enable;
215	u32 chassis_id_tlv[ECORE_LLDP_CHASSIS_ID_STAT_LEN];
216	u32 port_id_tlv[ECORE_LLDP_PORT_ID_STAT_LEN];
217};
218
219#define ECORE_LLDP_SYS_TLV_SIZE 256
220struct ecore_lldp_sys_tlvs {
221	bool discard_mandatory_tlv;
222	u8 buf[ECORE_LLDP_SYS_TLV_SIZE];
223	u16 buf_size;
224};
225
226struct ecore_lldp_stats {
227	enum ecore_lldp_agent agent;
228	u32 tx_frames;
229	u32 rx_frames;
230	u32 rx_discards;
231	u32 rx_age_outs;
232};
233
234enum _ecore_status_t ecore_dcbx_query_params(struct ecore_hwfn *p_hwfn,
235					     struct ecore_dcbx_get *p_get,
236					     enum ecore_mib_read_type type);
237
238enum _ecore_status_t ecore_dcbx_get_config_params(struct ecore_hwfn *p_hwfn,
239						  struct ecore_dcbx_set
240						  *params);
241
242enum _ecore_status_t ecore_dcbx_config_params(struct ecore_hwfn *p_hwfn,
243					      struct ecore_ptt *p_ptt,
244					      struct ecore_dcbx_set *params,
245					      bool hw_commit);
246
247enum _ecore_status_t ecore_lldp_register_tlv(struct ecore_hwfn *p_hwfn,
248					     struct ecore_ptt *p_ptt,
249					     enum ecore_lldp_agent agent,
250					     u8 tlv_type);
251
252enum _ecore_status_t
253ecore_lldp_get_params(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
254		      struct ecore_lldp_config_params *p_params);
255
256enum _ecore_status_t
257ecore_lldp_set_params(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
258		      struct ecore_lldp_config_params *p_params);
259
260enum _ecore_status_t
261ecore_lldp_set_system_tlvs(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
262			   struct ecore_lldp_sys_tlvs *p_params);
263
264/* Returns priority value for a given dscp index */
265enum _ecore_status_t
266ecore_dcbx_get_dscp_priority(struct ecore_hwfn *p_hwfn,
267			     u8 dscp_index, u8 *p_dscp_pri);
268
269/* Sets priority value for a given dscp index */
270enum _ecore_status_t
271ecore_dcbx_set_dscp_priority(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
272			     u8 dscp_index, u8 pri_val);
273
274enum _ecore_status_t
275ecore_lldp_get_stats(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
276		     struct ecore_lldp_stats *p_params);
277
278#ifndef __EXTRACT__LINUX__C__
279static const struct ecore_dcbx_app_metadata ecore_dcbx_app_update[] = {
280	{DCBX_PROTOCOL_ISCSI, "ISCSI", ECORE_PCI_ISCSI},
281	{DCBX_PROTOCOL_FCOE, "FCOE", ECORE_PCI_FCOE},
282	{DCBX_PROTOCOL_ROCE, "ROCE", ECORE_PCI_ETH_ROCE},
283	{DCBX_PROTOCOL_ROCE_V2, "ROCE_V2", ECORE_PCI_ETH_ROCE},
284	{DCBX_PROTOCOL_ETH, "ETH", ECORE_PCI_ETH},
285	{DCBX_PROTOCOL_IWARP, "IWARP", ECORE_PCI_ETH_IWARP}
286};
287#endif
288
289#endif /* __ECORE_DCBX_API_H__ */
290