11f4d4ed6SAlexander Lobakin /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
239651abdSSudarsana Reddy Kalluru /* QLogic qed NIC Driver
3e8f1cb50SMintz, Yuval  * Copyright (c) 2015-2017  QLogic Corporation
4663eacd8SAlexander Lobakin  * Copyright (c) 2019-2020 Marvell International Ltd.
539651abdSSudarsana Reddy Kalluru  */
639651abdSSudarsana Reddy Kalluru 
739651abdSSudarsana Reddy Kalluru #ifndef _QED_DCBX_H
839651abdSSudarsana Reddy Kalluru #define _QED_DCBX_H
939651abdSSudarsana Reddy Kalluru #include <linux/types.h>
1039651abdSSudarsana Reddy Kalluru #include <linux/slab.h>
1139651abdSSudarsana Reddy Kalluru #include "qed.h"
1239651abdSSudarsana Reddy Kalluru #include "qed_hsi.h"
1339651abdSSudarsana Reddy Kalluru #include "qed_hw.h"
1439651abdSSudarsana Reddy Kalluru #include "qed_mcp.h"
1539651abdSSudarsana Reddy Kalluru #include "qed_reg_addr.h"
1639651abdSSudarsana Reddy Kalluru 
1739651abdSSudarsana Reddy Kalluru #define DCBX_CONFIG_MAX_APP_PROTOCOL    4
1839651abdSSudarsana Reddy Kalluru 
1939651abdSSudarsana Reddy Kalluru enum qed_mib_read_type {
2039651abdSSudarsana Reddy Kalluru 	QED_DCBX_OPERATIONAL_MIB,
2139651abdSSudarsana Reddy Kalluru 	QED_DCBX_REMOTE_MIB,
2239651abdSSudarsana Reddy Kalluru 	QED_DCBX_LOCAL_MIB,
2339651abdSSudarsana Reddy Kalluru 	QED_DCBX_REMOTE_LLDP_MIB,
2439651abdSSudarsana Reddy Kalluru 	QED_DCBX_LOCAL_LLDP_MIB
2539651abdSSudarsana Reddy Kalluru };
2639651abdSSudarsana Reddy Kalluru 
2739651abdSSudarsana Reddy Kalluru struct qed_dcbx_app_data {
2839651abdSSudarsana Reddy Kalluru 	bool enable;		/* DCB enabled */
29dfc268f6SSudarsana Reddy Kalluru 	u8 update;		/* Update indication */
3039651abdSSudarsana Reddy Kalluru 	u8 priority;		/* Priority */
3139651abdSSudarsana Reddy Kalluru 	u8 tc;			/* Traffic Class */
320216da94SSudarsana Reddy Kalluru 	bool dont_add_vlan0;	/* Do not insert a vlan tag with id 0 */
3339651abdSSudarsana Reddy Kalluru };
3439651abdSSudarsana Reddy Kalluru 
356ad8c632SSudarsana Reddy Kalluru #define QED_DCBX_VERSION_DISABLED       0
366ad8c632SSudarsana Reddy Kalluru #define QED_DCBX_VERSION_IEEE           1
376ad8c632SSudarsana Reddy Kalluru #define QED_DCBX_VERSION_CEE            2
386ad8c632SSudarsana Reddy Kalluru 
396ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_set {
406ad8c632SSudarsana Reddy Kalluru #define QED_DCBX_OVERRIDE_STATE	        BIT(0)
416ad8c632SSudarsana Reddy Kalluru #define QED_DCBX_OVERRIDE_PFC_CFG       BIT(1)
426ad8c632SSudarsana Reddy Kalluru #define QED_DCBX_OVERRIDE_ETS_CFG       BIT(2)
436ad8c632SSudarsana Reddy Kalluru #define QED_DCBX_OVERRIDE_APP_CFG       BIT(3)
446ad8c632SSudarsana Reddy Kalluru #define QED_DCBX_OVERRIDE_DSCP_CFG      BIT(4)
456ad8c632SSudarsana Reddy Kalluru 	u32 override_flags;
466ad8c632SSudarsana Reddy Kalluru 	bool enabled;
476ad8c632SSudarsana Reddy Kalluru 	struct qed_dcbx_admin_params config;
486ad8c632SSudarsana Reddy Kalluru 	u32 ver_num;
496ad8c632SSudarsana Reddy Kalluru };
506ad8c632SSudarsana Reddy Kalluru 
5139651abdSSudarsana Reddy Kalluru struct qed_dcbx_results {
5239651abdSSudarsana Reddy Kalluru 	bool dcbx_enabled;
5339651abdSSudarsana Reddy Kalluru 	u8 pf_id;
5439651abdSSudarsana Reddy Kalluru 	struct qed_dcbx_app_data arr[DCBX_MAX_PROTOCOL_TYPE];
5539651abdSSudarsana Reddy Kalluru };
5639651abdSSudarsana Reddy Kalluru 
5739651abdSSudarsana Reddy Kalluru struct qed_dcbx_app_metadata {
5839651abdSSudarsana Reddy Kalluru 	enum dcbx_protocol_type id;
5939651abdSSudarsana Reddy Kalluru 	char *name;
6039651abdSSudarsana Reddy Kalluru 	enum qed_pci_personality personality;
6139651abdSSudarsana Reddy Kalluru };
6239651abdSSudarsana Reddy Kalluru 
6339651abdSSudarsana Reddy Kalluru struct qed_dcbx_info {
6439651abdSSudarsana Reddy Kalluru 	struct lldp_status_params_s lldp_remote[LLDP_MAX_LLDP_AGENTS];
6539651abdSSudarsana Reddy Kalluru 	struct lldp_config_params_s lldp_local[LLDP_MAX_LLDP_AGENTS];
6639651abdSSudarsana Reddy Kalluru 	struct dcbx_local_params local_admin;
6739651abdSSudarsana Reddy Kalluru 	struct qed_dcbx_results results;
6839651abdSSudarsana Reddy Kalluru 	struct dcbx_mib operational;
6939651abdSSudarsana Reddy Kalluru 	struct dcbx_mib remote;
706ad8c632SSudarsana Reddy Kalluru 	struct qed_dcbx_set set;
711e128c81SArun Easi 	struct qed_dcbx_get get;
7239651abdSSudarsana Reddy Kalluru 	u8 dcbx_cap;
7339651abdSSudarsana Reddy Kalluru };
7439651abdSSudarsana Reddy Kalluru 
7539651abdSSudarsana Reddy Kalluru struct qed_dcbx_mib_meta_data {
7639651abdSSudarsana Reddy Kalluru 	struct lldp_config_params_s *lldp_local;
7739651abdSSudarsana Reddy Kalluru 	struct lldp_status_params_s *lldp_remote;
7839651abdSSudarsana Reddy Kalluru 	struct dcbx_local_params *local_admin;
7939651abdSSudarsana Reddy Kalluru 	struct dcbx_mib *mib;
8039651abdSSudarsana Reddy Kalluru 	size_t size;
8139651abdSSudarsana Reddy Kalluru 	u32 addr;
8239651abdSSudarsana Reddy Kalluru };
8339651abdSSudarsana Reddy Kalluru 
84c6b7314dSAlexander Lobakin extern const struct qed_eth_dcbnl_ops qed_dcbnl_ops_pass;
85c6b7314dSAlexander Lobakin 
866ad8c632SSudarsana Reddy Kalluru #ifdef CONFIG_DCB
87*ee824f4bSOmkar Kulkarni int qed_dcbx_get_config_params(struct qed_hwfn *p_hwfn,
88*ee824f4bSOmkar Kulkarni 			       struct qed_dcbx_set *params);
896ad8c632SSudarsana Reddy Kalluru 
90*ee824f4bSOmkar Kulkarni int qed_dcbx_config_params(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt,
91*ee824f4bSOmkar Kulkarni 			   struct qed_dcbx_set *params, bool hw_commit);
926ad8c632SSudarsana Reddy Kalluru #endif
936ad8c632SSudarsana Reddy Kalluru 
9439651abdSSudarsana Reddy Kalluru /* QED local interface routines */
9539651abdSSudarsana Reddy Kalluru int
96*ee824f4bSOmkar Kulkarni qed_dcbx_mib_update_event(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt,
97*ee824f4bSOmkar Kulkarni 			  enum qed_mib_read_type type);
9839651abdSSudarsana Reddy Kalluru 
9939651abdSSudarsana Reddy Kalluru int qed_dcbx_info_alloc(struct qed_hwfn *p_hwfn);
100270837b3Ssudarsana.kalluru@cavium.com void qed_dcbx_info_free(struct qed_hwfn *p_hwfn);
10139651abdSSudarsana Reddy Kalluru void qed_dcbx_set_pf_update_params(struct qed_dcbx_results *p_src,
10239651abdSSudarsana Reddy Kalluru 				   struct pf_update_ramrod_data *p_dest);
10339651abdSSudarsana Reddy Kalluru 
1042a1cb1bfSDenis Bolotin #define QED_DCBX_DEFAULT_TC	0
1052a1cb1bfSDenis Bolotin 
1062a1cb1bfSDenis Bolotin u8 qed_dcbx_get_priority_tc(struct qed_hwfn *p_hwfn, u8 pri);
10739651abdSSudarsana Reddy Kalluru #endif
108