1316485Sdavidcs/*
2316485Sdavidcs * Copyright (c) 2017-2018 Cavium, Inc.
3316485Sdavidcs * All rights reserved.
4316485Sdavidcs *
5316485Sdavidcs *  Redistribution and use in source and binary forms, with or without
6316485Sdavidcs *  modification, are permitted provided that the following conditions
7316485Sdavidcs *  are met:
8316485Sdavidcs *
9316485Sdavidcs *  1. Redistributions of source code must retain the above copyright
10316485Sdavidcs *     notice, this list of conditions and the following disclaimer.
11316485Sdavidcs *  2. Redistributions in binary form must reproduce the above copyright
12316485Sdavidcs *     notice, this list of conditions and the following disclaimer in the
13316485Sdavidcs *     documentation and/or other materials provided with the distribution.
14316485Sdavidcs *
15316485Sdavidcs *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16316485Sdavidcs *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17316485Sdavidcs *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18316485Sdavidcs *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19316485Sdavidcs *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20316485Sdavidcs *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21316485Sdavidcs *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22316485Sdavidcs *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23316485Sdavidcs *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24316485Sdavidcs *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25316485Sdavidcs *  POSSIBILITY OF SUCH DAMAGE.
26316485Sdavidcs *
27316485Sdavidcs * $FreeBSD: stable/10/sys/dev/qlnx/qlnxe/ecore_dcbx_api.h 337519 2018-08-09 01:39:47Z davidcs $
28316485Sdavidcs *
29316485Sdavidcs */
30316485Sdavidcs
31316485Sdavidcs#ifndef __ECORE_DCBX_API_H__
32316485Sdavidcs#define __ECORE_DCBX_API_H__
33316485Sdavidcs
34316485Sdavidcs#include "ecore_status.h"
35316485Sdavidcs
36316485Sdavidcs#define DCBX_CONFIG_MAX_APP_PROTOCOL	4
37316485Sdavidcs
38316485Sdavidcsenum ecore_mib_read_type {
39316485Sdavidcs	ECORE_DCBX_OPERATIONAL_MIB,
40316485Sdavidcs	ECORE_DCBX_REMOTE_MIB,
41316485Sdavidcs	ECORE_DCBX_LOCAL_MIB,
42316485Sdavidcs	ECORE_DCBX_REMOTE_LLDP_MIB,
43337519Sdavidcs	ECORE_DCBX_LOCAL_LLDP_MIB,
44337519Sdavidcs	ECORE_DCBX_LLDP_TLVS
45316485Sdavidcs};
46316485Sdavidcs
47316485Sdavidcsstruct ecore_dcbx_app_data {
48316485Sdavidcs	bool enable;		/* DCB enabled */
49316485Sdavidcs	u8 update;		/* Update indication */
50316485Sdavidcs	u8 priority;		/* Priority */
51316485Sdavidcs	u8 tc;			/* Traffic Class */
52316485Sdavidcs	bool dscp_enable;	/* DSCP enabled */
53316485Sdavidcs	u8 dscp_val;		/* DSCP value */
54337519Sdavidcs	bool dont_add_vlan0;	/* Do not insert a vlan tag with id 0 */
55316485Sdavidcs};
56316485Sdavidcs
57337519Sdavidcs#ifndef __EXTRACT__LINUX__IF__
58316485Sdavidcsenum dcbx_protocol_type {
59316485Sdavidcs	DCBX_PROTOCOL_ISCSI,
60316485Sdavidcs	DCBX_PROTOCOL_FCOE,
61316485Sdavidcs	DCBX_PROTOCOL_ROCE,
62316485Sdavidcs	DCBX_PROTOCOL_ROCE_V2,
63316485Sdavidcs	DCBX_PROTOCOL_ETH,
64316485Sdavidcs	DCBX_PROTOCOL_IWARP,
65316485Sdavidcs	DCBX_MAX_PROTOCOL_TYPE
66316485Sdavidcs};
67316485Sdavidcs
68316485Sdavidcs#define ECORE_LLDP_CHASSIS_ID_STAT_LEN 4
69316485Sdavidcs#define ECORE_LLDP_PORT_ID_STAT_LEN 4
70316485Sdavidcs#define ECORE_DCBX_MAX_APP_PROTOCOL 32
71316485Sdavidcs#define ECORE_MAX_PFC_PRIORITIES 8
72316485Sdavidcs#define ECORE_DCBX_DSCP_SIZE 64
73316485Sdavidcs
74316485Sdavidcsstruct ecore_dcbx_lldp_remote {
75316485Sdavidcs	u32     peer_chassis_id[ECORE_LLDP_CHASSIS_ID_STAT_LEN];
76316485Sdavidcs	u32     peer_port_id[ECORE_LLDP_PORT_ID_STAT_LEN];
77316485Sdavidcs	bool	enable_rx;
78316485Sdavidcs	bool	enable_tx;
79316485Sdavidcs	u32     tx_interval;
80316485Sdavidcs	u32     max_credit;
81316485Sdavidcs};
82316485Sdavidcs
83316485Sdavidcsstruct ecore_dcbx_lldp_local {
84316485Sdavidcs	u32     local_chassis_id[ECORE_LLDP_CHASSIS_ID_STAT_LEN];
85316485Sdavidcs	u32     local_port_id[ECORE_LLDP_PORT_ID_STAT_LEN];
86316485Sdavidcs};
87316485Sdavidcs
88316485Sdavidcsstruct ecore_dcbx_app_prio {
89316485Sdavidcs	u8	roce;
90316485Sdavidcs	u8	roce_v2;
91316485Sdavidcs	u8	fcoe;
92316485Sdavidcs	u8	iscsi;
93316485Sdavidcs	u8	eth;
94316485Sdavidcs};
95316485Sdavidcs
96316485Sdavidcsstruct ecore_dbcx_pfc_params {
97316485Sdavidcs	bool	willing;
98316485Sdavidcs	bool	enabled;
99316485Sdavidcs	u8	prio[ECORE_MAX_PFC_PRIORITIES];
100316485Sdavidcs	u8	max_tc;
101316485Sdavidcs};
102316485Sdavidcs
103316485Sdavidcsenum ecore_dcbx_sf_ieee_type {
104316485Sdavidcs	ECORE_DCBX_SF_IEEE_ETHTYPE,
105316485Sdavidcs	ECORE_DCBX_SF_IEEE_TCP_PORT,
106316485Sdavidcs	ECORE_DCBX_SF_IEEE_UDP_PORT,
107316485Sdavidcs	ECORE_DCBX_SF_IEEE_TCP_UDP_PORT
108316485Sdavidcs};
109316485Sdavidcs
110316485Sdavidcsstruct ecore_app_entry {
111316485Sdavidcs	bool ethtype;
112316485Sdavidcs	enum ecore_dcbx_sf_ieee_type sf_ieee;
113316485Sdavidcs	bool enabled;
114316485Sdavidcs	u8 prio;
115316485Sdavidcs	u16 proto_id;
116316485Sdavidcs	enum dcbx_protocol_type proto_type;
117316485Sdavidcs};
118316485Sdavidcs
119316485Sdavidcsstruct ecore_dcbx_params {
120316485Sdavidcs	struct ecore_app_entry app_entry[ECORE_DCBX_MAX_APP_PROTOCOL];
121316485Sdavidcs	u16	num_app_entries;
122316485Sdavidcs	bool	app_willing;
123316485Sdavidcs	bool	app_valid;
124316485Sdavidcs	bool	app_error;
125316485Sdavidcs	bool	ets_willing;
126316485Sdavidcs	bool	ets_enabled;
127316485Sdavidcs	bool	ets_cbs;
128316485Sdavidcs	u8	ets_pri_tc_tbl[ECORE_MAX_PFC_PRIORITIES];
129316485Sdavidcs	u8	ets_tc_bw_tbl[ECORE_MAX_PFC_PRIORITIES];
130316485Sdavidcs	u8	ets_tc_tsa_tbl[ECORE_MAX_PFC_PRIORITIES];
131316485Sdavidcs	struct ecore_dbcx_pfc_params pfc;
132316485Sdavidcs	u8	max_ets_tc;
133316485Sdavidcs};
134316485Sdavidcs
135316485Sdavidcsstruct ecore_dcbx_admin_params {
136316485Sdavidcs	struct ecore_dcbx_params params;
137316485Sdavidcs	bool valid;		/* Indicate validity of params */
138316485Sdavidcs};
139316485Sdavidcs
140316485Sdavidcsstruct ecore_dcbx_remote_params {
141316485Sdavidcs	struct ecore_dcbx_params params;
142316485Sdavidcs	bool valid;		/* Indicate validity of params */
143316485Sdavidcs};
144316485Sdavidcs
145316485Sdavidcsstruct ecore_dcbx_operational_params {
146316485Sdavidcs	struct ecore_dcbx_app_prio app_prio;
147316485Sdavidcs	struct ecore_dcbx_params params;
148316485Sdavidcs	bool valid;		/* Indicate validity of params */
149316485Sdavidcs	bool enabled;
150316485Sdavidcs	bool ieee;
151316485Sdavidcs	bool cee;
152316485Sdavidcs	bool local;
153316485Sdavidcs	u32 err;
154316485Sdavidcs};
155316485Sdavidcs
156316485Sdavidcsstruct ecore_dcbx_dscp_params {
157316485Sdavidcs	bool enabled;
158316485Sdavidcs	u8 dscp_pri_map[ECORE_DCBX_DSCP_SIZE];
159316485Sdavidcs};
160316485Sdavidcs
161316485Sdavidcsstruct ecore_dcbx_get {
162316485Sdavidcs	struct ecore_dcbx_operational_params operational;
163316485Sdavidcs	struct ecore_dcbx_lldp_remote lldp_remote;
164316485Sdavidcs	struct ecore_dcbx_lldp_local lldp_local;
165316485Sdavidcs	struct ecore_dcbx_remote_params remote;
166316485Sdavidcs	struct ecore_dcbx_admin_params local;
167316485Sdavidcs	struct ecore_dcbx_dscp_params dscp;
168316485Sdavidcs};
169337519Sdavidcs#endif
170316485Sdavidcs
171316485Sdavidcs#define ECORE_DCBX_VERSION_DISABLED	0
172316485Sdavidcs#define ECORE_DCBX_VERSION_IEEE		1
173316485Sdavidcs#define ECORE_DCBX_VERSION_CEE		2
174316485Sdavidcs#define ECORE_DCBX_VERSION_DYNAMIC	3
175316485Sdavidcs
176316485Sdavidcsstruct ecore_dcbx_set {
177316485Sdavidcs#define ECORE_DCBX_OVERRIDE_STATE	(1 << 0)
178316485Sdavidcs#define ECORE_DCBX_OVERRIDE_PFC_CFG	(1 << 1)
179316485Sdavidcs#define ECORE_DCBX_OVERRIDE_ETS_CFG	(1 << 2)
180316485Sdavidcs#define ECORE_DCBX_OVERRIDE_APP_CFG	(1 << 3)
181316485Sdavidcs#define ECORE_DCBX_OVERRIDE_DSCP_CFG	(1 << 4)
182316485Sdavidcs	u32 override_flags;
183316485Sdavidcs	bool enabled;
184316485Sdavidcs	struct ecore_dcbx_admin_params config;
185316485Sdavidcs	u32 ver_num;
186316485Sdavidcs	struct ecore_dcbx_dscp_params dscp;
187316485Sdavidcs};
188316485Sdavidcs
189316485Sdavidcsstruct ecore_dcbx_results {
190316485Sdavidcs	bool dcbx_enabled;
191316485Sdavidcs	u8 pf_id;
192316485Sdavidcs	struct ecore_dcbx_app_data arr[DCBX_MAX_PROTOCOL_TYPE];
193316485Sdavidcs};
194316485Sdavidcs
195316485Sdavidcsstruct ecore_dcbx_app_metadata {
196316485Sdavidcs	enum dcbx_protocol_type id;
197316485Sdavidcs	char *name;
198316485Sdavidcs	enum ecore_pci_personality personality;
199316485Sdavidcs};
200316485Sdavidcs
201337519Sdavidcsenum ecore_lldp_agent {
202337519Sdavidcs	ECORE_LLDP_NEAREST_BRIDGE = 0,
203337519Sdavidcs	ECORE_LLDP_NEAREST_NON_TPMR_BRIDGE,
204337519Sdavidcs	ECORE_LLDP_NEAREST_CUSTOMER_BRIDGE,
205337519Sdavidcs	ECORE_LLDP_MAX_AGENTS
206337519Sdavidcs};
207316485Sdavidcs
208337519Sdavidcsstruct ecore_lldp_config_params {
209337519Sdavidcs	enum ecore_lldp_agent agent;
210337519Sdavidcs	u8 tx_interval;
211337519Sdavidcs	u8 tx_hold;
212337519Sdavidcs	u8 tx_credit;
213337519Sdavidcs	bool rx_enable;
214337519Sdavidcs	bool tx_enable;
215337519Sdavidcs	u32 chassis_id_tlv[ECORE_LLDP_CHASSIS_ID_STAT_LEN];
216337519Sdavidcs	u32 port_id_tlv[ECORE_LLDP_PORT_ID_STAT_LEN];
217337519Sdavidcs};
218316485Sdavidcs
219337519Sdavidcs#define ECORE_LLDP_SYS_TLV_SIZE 256
220337519Sdavidcsstruct ecore_lldp_sys_tlvs {
221337519Sdavidcs	bool discard_mandatory_tlv;
222337519Sdavidcs	u8 buf[ECORE_LLDP_SYS_TLV_SIZE];
223337519Sdavidcs	u16 buf_size;
224337519Sdavidcs};
225316485Sdavidcs
226337519Sdavidcsstruct ecore_lldp_stats {
227337519Sdavidcs	enum ecore_lldp_agent agent;
228337519Sdavidcs	u32 tx_frames;
229337519Sdavidcs	u32 rx_frames;
230337519Sdavidcs	u32 rx_discards;
231337519Sdavidcs	u32 rx_age_outs;
232337519Sdavidcs};
233337519Sdavidcs
234337519Sdavidcsenum _ecore_status_t ecore_dcbx_query_params(struct ecore_hwfn *p_hwfn,
235337519Sdavidcs					     struct ecore_dcbx_get *p_get,
236337519Sdavidcs					     enum ecore_mib_read_type type);
237337519Sdavidcs
238337519Sdavidcsenum _ecore_status_t ecore_dcbx_get_config_params(struct ecore_hwfn *p_hwfn,
239337519Sdavidcs						  struct ecore_dcbx_set
240337519Sdavidcs						  *params);
241337519Sdavidcs
242337519Sdavidcsenum _ecore_status_t ecore_dcbx_config_params(struct ecore_hwfn *p_hwfn,
243337519Sdavidcs					      struct ecore_ptt *p_ptt,
244337519Sdavidcs					      struct ecore_dcbx_set *params,
245337519Sdavidcs					      bool hw_commit);
246337519Sdavidcs
247337519Sdavidcsenum _ecore_status_t ecore_lldp_register_tlv(struct ecore_hwfn *p_hwfn,
248337519Sdavidcs					     struct ecore_ptt *p_ptt,
249337519Sdavidcs					     enum ecore_lldp_agent agent,
250337519Sdavidcs					     u8 tlv_type);
251337519Sdavidcs
252337519Sdavidcsenum _ecore_status_t
253337519Sdavidcsecore_lldp_get_params(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
254337519Sdavidcs		      struct ecore_lldp_config_params *p_params);
255337519Sdavidcs
256337519Sdavidcsenum _ecore_status_t
257337519Sdavidcsecore_lldp_set_params(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
258337519Sdavidcs		      struct ecore_lldp_config_params *p_params);
259337519Sdavidcs
260337519Sdavidcsenum _ecore_status_t
261337519Sdavidcsecore_lldp_set_system_tlvs(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
262337519Sdavidcs			   struct ecore_lldp_sys_tlvs *p_params);
263337519Sdavidcs
264337519Sdavidcs/* Returns priority value for a given dscp index */
265337519Sdavidcsenum _ecore_status_t
266337519Sdavidcsecore_dcbx_get_dscp_priority(struct ecore_hwfn *p_hwfn,
267337519Sdavidcs			     u8 dscp_index, u8 *p_dscp_pri);
268337519Sdavidcs
269337519Sdavidcs/* Sets priority value for a given dscp index */
270337519Sdavidcsenum _ecore_status_t
271337519Sdavidcsecore_dcbx_set_dscp_priority(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
272337519Sdavidcs			     u8 dscp_index, u8 pri_val);
273337519Sdavidcs
274337519Sdavidcsenum _ecore_status_t
275337519Sdavidcsecore_lldp_get_stats(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
276337519Sdavidcs		     struct ecore_lldp_stats *p_params);
277337519Sdavidcs
278337519Sdavidcs#ifndef __EXTRACT__LINUX__C__
279316485Sdavidcsstatic const struct ecore_dcbx_app_metadata ecore_dcbx_app_update[] = {
280316485Sdavidcs	{DCBX_PROTOCOL_ISCSI, "ISCSI", ECORE_PCI_ISCSI},
281316485Sdavidcs	{DCBX_PROTOCOL_FCOE, "FCOE", ECORE_PCI_FCOE},
282316485Sdavidcs	{DCBX_PROTOCOL_ROCE, "ROCE", ECORE_PCI_ETH_ROCE},
283316485Sdavidcs	{DCBX_PROTOCOL_ROCE_V2, "ROCE_V2", ECORE_PCI_ETH_ROCE},
284316485Sdavidcs	{DCBX_PROTOCOL_ETH, "ETH", ECORE_PCI_ETH},
285316485Sdavidcs	{DCBX_PROTOCOL_IWARP, "IWARP", ECORE_PCI_ETH_IWARP}
286316485Sdavidcs};
287337519Sdavidcs#endif
288316485Sdavidcs
289316485Sdavidcs#endif /* __ECORE_DCBX_API_H__ */
290