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