139651abdSSudarsana Reddy Kalluru /* QLogic qed NIC Driver 2e8f1cb50SMintz, Yuval * Copyright (c) 2015-2017 QLogic Corporation 339651abdSSudarsana Reddy Kalluru * 4e8f1cb50SMintz, Yuval * This software is available to you under a choice of one of two 5e8f1cb50SMintz, Yuval * licenses. You may choose to be licensed under the terms of the GNU 6e8f1cb50SMintz, Yuval * General Public License (GPL) Version 2, available from the file 7e8f1cb50SMintz, Yuval * COPYING in the main directory of this source tree, or the 8e8f1cb50SMintz, Yuval * OpenIB.org BSD license below: 9e8f1cb50SMintz, Yuval * 10e8f1cb50SMintz, Yuval * Redistribution and use in source and binary forms, with or 11e8f1cb50SMintz, Yuval * without modification, are permitted provided that the following 12e8f1cb50SMintz, Yuval * conditions are met: 13e8f1cb50SMintz, Yuval * 14e8f1cb50SMintz, Yuval * - Redistributions of source code must retain the above 15e8f1cb50SMintz, Yuval * copyright notice, this list of conditions and the following 16e8f1cb50SMintz, Yuval * disclaimer. 17e8f1cb50SMintz, Yuval * 18e8f1cb50SMintz, Yuval * - Redistributions in binary form must reproduce the above 19e8f1cb50SMintz, Yuval * copyright notice, this list of conditions and the following 20e8f1cb50SMintz, Yuval * disclaimer in the documentation and /or other materials 21e8f1cb50SMintz, Yuval * provided with the distribution. 22e8f1cb50SMintz, Yuval * 23e8f1cb50SMintz, Yuval * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 24e8f1cb50SMintz, Yuval * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 25e8f1cb50SMintz, Yuval * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 26e8f1cb50SMintz, Yuval * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 27e8f1cb50SMintz, Yuval * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 28e8f1cb50SMintz, Yuval * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 29e8f1cb50SMintz, Yuval * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 30e8f1cb50SMintz, Yuval * SOFTWARE. 3139651abdSSudarsana Reddy Kalluru */ 3239651abdSSudarsana Reddy Kalluru 3339651abdSSudarsana Reddy Kalluru #include <linux/types.h> 3439651abdSSudarsana Reddy Kalluru #include <asm/byteorder.h> 3539651abdSSudarsana Reddy Kalluru #include <linux/bitops.h> 36a1d8d8a5SSudarsana Reddy Kalluru #include <linux/dcbnl.h> 3739651abdSSudarsana Reddy Kalluru #include <linux/errno.h> 3839651abdSSudarsana Reddy Kalluru #include <linux/kernel.h> 3939651abdSSudarsana Reddy Kalluru #include <linux/slab.h> 4039651abdSSudarsana Reddy Kalluru #include <linux/string.h> 4139651abdSSudarsana Reddy Kalluru #include "qed.h" 4239651abdSSudarsana Reddy Kalluru #include "qed_cxt.h" 4339651abdSSudarsana Reddy Kalluru #include "qed_dcbx.h" 4439651abdSSudarsana Reddy Kalluru #include "qed_hsi.h" 4539651abdSSudarsana Reddy Kalluru #include "qed_sp.h" 465fe118c9SSudarsana Reddy Kalluru #include "qed_sriov.h" 47a1d8d8a5SSudarsana Reddy Kalluru #ifdef CONFIG_DCB 48a1d8d8a5SSudarsana Reddy Kalluru #include <linux/qed/qed_eth_if.h> 49a1d8d8a5SSudarsana Reddy Kalluru #endif 5039651abdSSudarsana Reddy Kalluru 5139651abdSSudarsana Reddy Kalluru #define QED_DCBX_MAX_MIB_READ_TRY (100) 5239651abdSSudarsana Reddy Kalluru #define QED_ETH_TYPE_DEFAULT (0) 5339651abdSSudarsana Reddy Kalluru #define QED_ETH_TYPE_ROCE (0x8915) 5439651abdSSudarsana Reddy Kalluru #define QED_UDP_PORT_TYPE_ROCE_V2 (0x12B7) 5539651abdSSudarsana Reddy Kalluru #define QED_ETH_TYPE_FCOE (0x8906) 5639651abdSSudarsana Reddy Kalluru #define QED_TCP_PORT_ISCSI (0xCBC) 5739651abdSSudarsana Reddy Kalluru 5839651abdSSudarsana Reddy Kalluru #define QED_DCBX_INVALID_PRIORITY 0xFF 5939651abdSSudarsana Reddy Kalluru 6039651abdSSudarsana Reddy Kalluru /* Get Traffic Class from priority traffic class table, 4 bits represent 6139651abdSSudarsana Reddy Kalluru * the traffic class corresponding to the priority. 6239651abdSSudarsana Reddy Kalluru */ 6339651abdSSudarsana Reddy Kalluru #define QED_DCBX_PRIO2TC(prio_tc_tbl, prio) \ 6439651abdSSudarsana Reddy Kalluru ((u32)(prio_tc_tbl >> ((7 - prio) * 4)) & 0x7) 6539651abdSSudarsana Reddy Kalluru 6639651abdSSudarsana Reddy Kalluru static const struct qed_dcbx_app_metadata qed_dcbx_app_update[] = { 67c8fcd133Ssudarsana.kalluru@cavium.com {DCBX_PROTOCOL_ISCSI, "ISCSI", QED_PCI_ISCSI}, 68c8fcd133Ssudarsana.kalluru@cavium.com {DCBX_PROTOCOL_FCOE, "FCOE", QED_PCI_FCOE}, 69c8fcd133Ssudarsana.kalluru@cavium.com {DCBX_PROTOCOL_ROCE, "ROCE", QED_PCI_ETH_ROCE}, 70c8fcd133Ssudarsana.kalluru@cavium.com {DCBX_PROTOCOL_ROCE_V2, "ROCE_V2", QED_PCI_ETH_ROCE}, 71c8fcd133Ssudarsana.kalluru@cavium.com {DCBX_PROTOCOL_ETH, "ETH", QED_PCI_ETH}, 7239651abdSSudarsana Reddy Kalluru }; 7339651abdSSudarsana Reddy Kalluru 7439651abdSSudarsana Reddy Kalluru static bool qed_dcbx_app_ethtype(u32 app_info_bitmap) 7539651abdSSudarsana Reddy Kalluru { 7639651abdSSudarsana Reddy Kalluru return !!(QED_MFW_GET_FIELD(app_info_bitmap, DCBX_APP_SF) == 7739651abdSSudarsana Reddy Kalluru DCBX_APP_SF_ETHTYPE); 7839651abdSSudarsana Reddy Kalluru } 7939651abdSSudarsana Reddy Kalluru 80fb9ea8a9SSudarsana Reddy Kalluru static bool qed_dcbx_ieee_app_ethtype(u32 app_info_bitmap) 81fb9ea8a9SSudarsana Reddy Kalluru { 82fb9ea8a9SSudarsana Reddy Kalluru u8 mfw_val = QED_MFW_GET_FIELD(app_info_bitmap, DCBX_APP_SF_IEEE); 83fb9ea8a9SSudarsana Reddy Kalluru 84fb9ea8a9SSudarsana Reddy Kalluru /* Old MFW */ 85fb9ea8a9SSudarsana Reddy Kalluru if (mfw_val == DCBX_APP_SF_IEEE_RESERVED) 86fb9ea8a9SSudarsana Reddy Kalluru return qed_dcbx_app_ethtype(app_info_bitmap); 87fb9ea8a9SSudarsana Reddy Kalluru 88fb9ea8a9SSudarsana Reddy Kalluru return !!(mfw_val == DCBX_APP_SF_IEEE_ETHTYPE); 89fb9ea8a9SSudarsana Reddy Kalluru } 90fb9ea8a9SSudarsana Reddy Kalluru 9139651abdSSudarsana Reddy Kalluru static bool qed_dcbx_app_port(u32 app_info_bitmap) 9239651abdSSudarsana Reddy Kalluru { 9339651abdSSudarsana Reddy Kalluru return !!(QED_MFW_GET_FIELD(app_info_bitmap, DCBX_APP_SF) == 9439651abdSSudarsana Reddy Kalluru DCBX_APP_SF_PORT); 9539651abdSSudarsana Reddy Kalluru } 9639651abdSSudarsana Reddy Kalluru 9759bcb797SSudarsana Reddy Kalluru static bool qed_dcbx_ieee_app_port(u32 app_info_bitmap, u8 type) 9839651abdSSudarsana Reddy Kalluru { 9959bcb797SSudarsana Reddy Kalluru u8 mfw_val = QED_MFW_GET_FIELD(app_info_bitmap, DCBX_APP_SF_IEEE); 10059bcb797SSudarsana Reddy Kalluru 10159bcb797SSudarsana Reddy Kalluru /* Old MFW */ 10259bcb797SSudarsana Reddy Kalluru if (mfw_val == DCBX_APP_SF_IEEE_RESERVED) 10359bcb797SSudarsana Reddy Kalluru return qed_dcbx_app_port(app_info_bitmap); 10459bcb797SSudarsana Reddy Kalluru 10559bcb797SSudarsana Reddy Kalluru return !!(mfw_val == type || mfw_val == DCBX_APP_SF_IEEE_TCP_UDP_PORT); 10639651abdSSudarsana Reddy Kalluru } 10739651abdSSudarsana Reddy Kalluru 108fb9ea8a9SSudarsana Reddy Kalluru static bool qed_dcbx_default_tlv(u32 app_info_bitmap, u16 proto_id, bool ieee) 10939651abdSSudarsana Reddy Kalluru { 110fb9ea8a9SSudarsana Reddy Kalluru bool ethtype; 111fb9ea8a9SSudarsana Reddy Kalluru 112fb9ea8a9SSudarsana Reddy Kalluru if (ieee) 113fb9ea8a9SSudarsana Reddy Kalluru ethtype = qed_dcbx_ieee_app_ethtype(app_info_bitmap); 114fb9ea8a9SSudarsana Reddy Kalluru else 115fb9ea8a9SSudarsana Reddy Kalluru ethtype = qed_dcbx_app_ethtype(app_info_bitmap); 116fb9ea8a9SSudarsana Reddy Kalluru 117fb9ea8a9SSudarsana Reddy Kalluru return !!(ethtype && (proto_id == QED_ETH_TYPE_DEFAULT)); 11839651abdSSudarsana Reddy Kalluru } 11939651abdSSudarsana Reddy Kalluru 12059bcb797SSudarsana Reddy Kalluru static bool qed_dcbx_iscsi_tlv(u32 app_info_bitmap, u16 proto_id, bool ieee) 12139651abdSSudarsana Reddy Kalluru { 12259bcb797SSudarsana Reddy Kalluru bool port; 12359bcb797SSudarsana Reddy Kalluru 12459bcb797SSudarsana Reddy Kalluru if (ieee) 12559bcb797SSudarsana Reddy Kalluru port = qed_dcbx_ieee_app_port(app_info_bitmap, 12659bcb797SSudarsana Reddy Kalluru DCBX_APP_SF_IEEE_TCP_PORT); 12759bcb797SSudarsana Reddy Kalluru else 12859bcb797SSudarsana Reddy Kalluru port = qed_dcbx_app_port(app_info_bitmap); 12959bcb797SSudarsana Reddy Kalluru 13059bcb797SSudarsana Reddy Kalluru return !!(port && (proto_id == QED_TCP_PORT_ISCSI)); 13139651abdSSudarsana Reddy Kalluru } 13239651abdSSudarsana Reddy Kalluru 133fb9ea8a9SSudarsana Reddy Kalluru static bool qed_dcbx_fcoe_tlv(u32 app_info_bitmap, u16 proto_id, bool ieee) 13439651abdSSudarsana Reddy Kalluru { 135fb9ea8a9SSudarsana Reddy Kalluru bool ethtype; 136fb9ea8a9SSudarsana Reddy Kalluru 137fb9ea8a9SSudarsana Reddy Kalluru if (ieee) 138fb9ea8a9SSudarsana Reddy Kalluru ethtype = qed_dcbx_ieee_app_ethtype(app_info_bitmap); 139fb9ea8a9SSudarsana Reddy Kalluru else 140fb9ea8a9SSudarsana Reddy Kalluru ethtype = qed_dcbx_app_ethtype(app_info_bitmap); 141fb9ea8a9SSudarsana Reddy Kalluru 142fb9ea8a9SSudarsana Reddy Kalluru return !!(ethtype && (proto_id == QED_ETH_TYPE_FCOE)); 14339651abdSSudarsana Reddy Kalluru } 14439651abdSSudarsana Reddy Kalluru 145fb9ea8a9SSudarsana Reddy Kalluru static bool qed_dcbx_roce_tlv(u32 app_info_bitmap, u16 proto_id, bool ieee) 14639651abdSSudarsana Reddy Kalluru { 147fb9ea8a9SSudarsana Reddy Kalluru bool ethtype; 148fb9ea8a9SSudarsana Reddy Kalluru 149fb9ea8a9SSudarsana Reddy Kalluru if (ieee) 150fb9ea8a9SSudarsana Reddy Kalluru ethtype = qed_dcbx_ieee_app_ethtype(app_info_bitmap); 151fb9ea8a9SSudarsana Reddy Kalluru else 152fb9ea8a9SSudarsana Reddy Kalluru ethtype = qed_dcbx_app_ethtype(app_info_bitmap); 153fb9ea8a9SSudarsana Reddy Kalluru 154fb9ea8a9SSudarsana Reddy Kalluru return !!(ethtype && (proto_id == QED_ETH_TYPE_ROCE)); 15539651abdSSudarsana Reddy Kalluru } 15639651abdSSudarsana Reddy Kalluru 15759bcb797SSudarsana Reddy Kalluru static bool qed_dcbx_roce_v2_tlv(u32 app_info_bitmap, u16 proto_id, bool ieee) 15839651abdSSudarsana Reddy Kalluru { 15959bcb797SSudarsana Reddy Kalluru bool port; 16059bcb797SSudarsana Reddy Kalluru 16159bcb797SSudarsana Reddy Kalluru if (ieee) 16259bcb797SSudarsana Reddy Kalluru port = qed_dcbx_ieee_app_port(app_info_bitmap, 16359bcb797SSudarsana Reddy Kalluru DCBX_APP_SF_IEEE_UDP_PORT); 16459bcb797SSudarsana Reddy Kalluru else 16559bcb797SSudarsana Reddy Kalluru port = qed_dcbx_app_port(app_info_bitmap); 16659bcb797SSudarsana Reddy Kalluru 16759bcb797SSudarsana Reddy Kalluru return !!(port && (proto_id == QED_UDP_PORT_TYPE_ROCE_V2)); 16839651abdSSudarsana Reddy Kalluru } 16939651abdSSudarsana Reddy Kalluru 17039651abdSSudarsana Reddy Kalluru static void 17139651abdSSudarsana Reddy Kalluru qed_dcbx_dp_protocol(struct qed_hwfn *p_hwfn, struct qed_dcbx_results *p_data) 17239651abdSSudarsana Reddy Kalluru { 17339651abdSSudarsana Reddy Kalluru enum dcbx_protocol_type id; 17439651abdSSudarsana Reddy Kalluru int i; 17539651abdSSudarsana Reddy Kalluru 17639651abdSSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, "DCBX negotiated: %d\n", 17739651abdSSudarsana Reddy Kalluru p_data->dcbx_enabled); 17839651abdSSudarsana Reddy Kalluru 17939651abdSSudarsana Reddy Kalluru for (i = 0; i < ARRAY_SIZE(qed_dcbx_app_update); i++) { 18039651abdSSudarsana Reddy Kalluru id = qed_dcbx_app_update[i].id; 18139651abdSSudarsana Reddy Kalluru 18239651abdSSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, 18339651abdSSudarsana Reddy Kalluru "%s info: update %d, enable %d, prio %d, tc %d, num_tc %d\n", 18439651abdSSudarsana Reddy Kalluru qed_dcbx_app_update[i].name, p_data->arr[id].update, 18539651abdSSudarsana Reddy Kalluru p_data->arr[id].enable, p_data->arr[id].priority, 186b5a9ee7cSAriel Elior p_data->arr[id].tc, p_hwfn->hw_info.num_active_tc); 18739651abdSSudarsana Reddy Kalluru } 18839651abdSSudarsana Reddy Kalluru } 18939651abdSSudarsana Reddy Kalluru 19039651abdSSudarsana Reddy Kalluru static void 19139651abdSSudarsana Reddy Kalluru qed_dcbx_set_params(struct qed_dcbx_results *p_data, 19239651abdSSudarsana Reddy Kalluru struct qed_hw_info *p_info, 19339651abdSSudarsana Reddy Kalluru bool enable, 19439651abdSSudarsana Reddy Kalluru u8 prio, 19539651abdSSudarsana Reddy Kalluru u8 tc, 19639651abdSSudarsana Reddy Kalluru enum dcbx_protocol_type type, 19739651abdSSudarsana Reddy Kalluru enum qed_pci_personality personality) 19839651abdSSudarsana Reddy Kalluru { 19939651abdSSudarsana Reddy Kalluru /* PF update ramrod data */ 20039651abdSSudarsana Reddy Kalluru p_data->arr[type].enable = enable; 20139651abdSSudarsana Reddy Kalluru p_data->arr[type].priority = prio; 20239651abdSSudarsana Reddy Kalluru p_data->arr[type].tc = tc; 203dfc268f6SSudarsana Reddy Kalluru if (enable) 204dfc268f6SSudarsana Reddy Kalluru p_data->arr[type].update = UPDATE_DCB; 205dfc268f6SSudarsana Reddy Kalluru else 206dfc268f6SSudarsana Reddy Kalluru p_data->arr[type].update = DONT_UPDATE_DCB_DSCP; 20739651abdSSudarsana Reddy Kalluru 20839651abdSSudarsana Reddy Kalluru /* QM reconf data */ 209b5a9ee7cSAriel Elior if (p_info->personality == personality) 21039651abdSSudarsana Reddy Kalluru p_info->offload_tc = tc; 21139651abdSSudarsana Reddy Kalluru } 21239651abdSSudarsana Reddy Kalluru 21339651abdSSudarsana Reddy Kalluru /* Update app protocol data and hw_info fields with the TLV info */ 21439651abdSSudarsana Reddy Kalluru static void 21539651abdSSudarsana Reddy Kalluru qed_dcbx_update_app_info(struct qed_dcbx_results *p_data, 21639651abdSSudarsana Reddy Kalluru struct qed_hwfn *p_hwfn, 21739651abdSSudarsana Reddy Kalluru bool enable, 21839651abdSSudarsana Reddy Kalluru u8 prio, u8 tc, enum dcbx_protocol_type type) 21939651abdSSudarsana Reddy Kalluru { 22039651abdSSudarsana Reddy Kalluru struct qed_hw_info *p_info = &p_hwfn->hw_info; 22139651abdSSudarsana Reddy Kalluru enum qed_pci_personality personality; 22239651abdSSudarsana Reddy Kalluru enum dcbx_protocol_type id; 22339651abdSSudarsana Reddy Kalluru char *name; 22439651abdSSudarsana Reddy Kalluru int i; 22539651abdSSudarsana Reddy Kalluru 22639651abdSSudarsana Reddy Kalluru for (i = 0; i < ARRAY_SIZE(qed_dcbx_app_update); i++) { 22739651abdSSudarsana Reddy Kalluru id = qed_dcbx_app_update[i].id; 22839651abdSSudarsana Reddy Kalluru 22939651abdSSudarsana Reddy Kalluru if (type != id) 23039651abdSSudarsana Reddy Kalluru continue; 23139651abdSSudarsana Reddy Kalluru 23239651abdSSudarsana Reddy Kalluru personality = qed_dcbx_app_update[i].personality; 23339651abdSSudarsana Reddy Kalluru name = qed_dcbx_app_update[i].name; 23439651abdSSudarsana Reddy Kalluru 235dfc268f6SSudarsana Reddy Kalluru qed_dcbx_set_params(p_data, p_info, enable, 23639651abdSSudarsana Reddy Kalluru prio, tc, type, personality); 23739651abdSSudarsana Reddy Kalluru } 23839651abdSSudarsana Reddy Kalluru } 23939651abdSSudarsana Reddy Kalluru 24039651abdSSudarsana Reddy Kalluru static bool 24139651abdSSudarsana Reddy Kalluru qed_dcbx_get_app_protocol_type(struct qed_hwfn *p_hwfn, 24239651abdSSudarsana Reddy Kalluru u32 app_prio_bitmap, 243fb9ea8a9SSudarsana Reddy Kalluru u16 id, enum dcbx_protocol_type *type, bool ieee) 24439651abdSSudarsana Reddy Kalluru { 245fb9ea8a9SSudarsana Reddy Kalluru if (qed_dcbx_fcoe_tlv(app_prio_bitmap, id, ieee)) { 24639651abdSSudarsana Reddy Kalluru *type = DCBX_PROTOCOL_FCOE; 247fb9ea8a9SSudarsana Reddy Kalluru } else if (qed_dcbx_roce_tlv(app_prio_bitmap, id, ieee)) { 24839651abdSSudarsana Reddy Kalluru *type = DCBX_PROTOCOL_ROCE; 24959bcb797SSudarsana Reddy Kalluru } else if (qed_dcbx_iscsi_tlv(app_prio_bitmap, id, ieee)) { 25039651abdSSudarsana Reddy Kalluru *type = DCBX_PROTOCOL_ISCSI; 251fb9ea8a9SSudarsana Reddy Kalluru } else if (qed_dcbx_default_tlv(app_prio_bitmap, id, ieee)) { 25239651abdSSudarsana Reddy Kalluru *type = DCBX_PROTOCOL_ETH; 25359bcb797SSudarsana Reddy Kalluru } else if (qed_dcbx_roce_v2_tlv(app_prio_bitmap, id, ieee)) { 25439651abdSSudarsana Reddy Kalluru *type = DCBX_PROTOCOL_ROCE_V2; 25539651abdSSudarsana Reddy Kalluru } else { 25639651abdSSudarsana Reddy Kalluru *type = DCBX_MAX_PROTOCOL_TYPE; 25739651abdSSudarsana Reddy Kalluru DP_ERR(p_hwfn, 25839651abdSSudarsana Reddy Kalluru "No action required, App TLV id = 0x%x app_prio_bitmap = 0x%x\n", 25939651abdSSudarsana Reddy Kalluru id, app_prio_bitmap); 26039651abdSSudarsana Reddy Kalluru return false; 26139651abdSSudarsana Reddy Kalluru } 26239651abdSSudarsana Reddy Kalluru 26339651abdSSudarsana Reddy Kalluru return true; 26439651abdSSudarsana Reddy Kalluru } 26539651abdSSudarsana Reddy Kalluru 26639651abdSSudarsana Reddy Kalluru /* Parse app TLV's to update TC information in hw_info structure for 26739651abdSSudarsana Reddy Kalluru * reconfiguring QM. Get protocol specific data for PF update ramrod command. 26839651abdSSudarsana Reddy Kalluru */ 26939651abdSSudarsana Reddy Kalluru static int 27039651abdSSudarsana Reddy Kalluru qed_dcbx_process_tlv(struct qed_hwfn *p_hwfn, 27139651abdSSudarsana Reddy Kalluru struct qed_dcbx_results *p_data, 27239651abdSSudarsana Reddy Kalluru struct dcbx_app_priority_entry *p_tbl, 273fb9ea8a9SSudarsana Reddy Kalluru u32 pri_tc_tbl, int count, u8 dcbx_version) 27439651abdSSudarsana Reddy Kalluru { 27539651abdSSudarsana Reddy Kalluru enum dcbx_protocol_type type; 276270837b3Ssudarsana.kalluru@cavium.com u8 tc, priority_map; 277fb9ea8a9SSudarsana Reddy Kalluru bool enable, ieee; 27839651abdSSudarsana Reddy Kalluru u16 protocol_id; 27954b9430fSDan Carpenter int priority; 28039651abdSSudarsana Reddy Kalluru int i; 28139651abdSSudarsana Reddy Kalluru 28239651abdSSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, "Num APP entries = %d\n", count); 28339651abdSSudarsana Reddy Kalluru 284fb9ea8a9SSudarsana Reddy Kalluru ieee = (dcbx_version == DCBX_CONFIG_VERSION_IEEE); 28539651abdSSudarsana Reddy Kalluru /* Parse APP TLV */ 28639651abdSSudarsana Reddy Kalluru for (i = 0; i < count; i++) { 28739651abdSSudarsana Reddy Kalluru protocol_id = QED_MFW_GET_FIELD(p_tbl[i].entry, 28839651abdSSudarsana Reddy Kalluru DCBX_APP_PROTOCOL_ID); 28939651abdSSudarsana Reddy Kalluru priority_map = QED_MFW_GET_FIELD(p_tbl[i].entry, 29039651abdSSudarsana Reddy Kalluru DCBX_APP_PRI_MAP); 29139651abdSSudarsana Reddy Kalluru priority = ffs(priority_map) - 1; 29239651abdSSudarsana Reddy Kalluru if (priority < 0) { 29339651abdSSudarsana Reddy Kalluru DP_ERR(p_hwfn, "Invalid priority\n"); 29439651abdSSudarsana Reddy Kalluru return -EINVAL; 29539651abdSSudarsana Reddy Kalluru } 29639651abdSSudarsana Reddy Kalluru 29739651abdSSudarsana Reddy Kalluru tc = QED_DCBX_PRIO2TC(pri_tc_tbl, priority); 29839651abdSSudarsana Reddy Kalluru if (qed_dcbx_get_app_protocol_type(p_hwfn, p_tbl[i].entry, 299fb9ea8a9SSudarsana Reddy Kalluru protocol_id, &type, ieee)) { 30039651abdSSudarsana Reddy Kalluru /* ETH always have the enable bit reset, as it gets 30139651abdSSudarsana Reddy Kalluru * vlan information per packet. For other protocols, 30239651abdSSudarsana Reddy Kalluru * should be set according to the dcbx_enabled 30339651abdSSudarsana Reddy Kalluru * indication, but we only got here if there was an 30439651abdSSudarsana Reddy Kalluru * app tlv for the protocol, so dcbx must be enabled. 30539651abdSSudarsana Reddy Kalluru */ 306ec7c7f5cSSudarsana Reddy Kalluru enable = !(type == DCBX_PROTOCOL_ETH); 30739651abdSSudarsana Reddy Kalluru 308dfc268f6SSudarsana Reddy Kalluru qed_dcbx_update_app_info(p_data, p_hwfn, enable, 30939651abdSSudarsana Reddy Kalluru priority, tc, type); 31039651abdSSudarsana Reddy Kalluru } 31139651abdSSudarsana Reddy Kalluru } 31239651abdSSudarsana Reddy Kalluru 31339651abdSSudarsana Reddy Kalluru /* Update ramrod protocol data and hw_info fields 31439651abdSSudarsana Reddy Kalluru * with default info when corresponding APP TLV's are not detected. 31539651abdSSudarsana Reddy Kalluru * The enabled field has a different logic for ethernet as only for 31639651abdSSudarsana Reddy Kalluru * ethernet dcb should disabled by default, as the information arrives 31739651abdSSudarsana Reddy Kalluru * from the OS (unless an explicit app tlv was present). 31839651abdSSudarsana Reddy Kalluru */ 31939651abdSSudarsana Reddy Kalluru tc = p_data->arr[DCBX_PROTOCOL_ETH].tc; 32039651abdSSudarsana Reddy Kalluru priority = p_data->arr[DCBX_PROTOCOL_ETH].priority; 32139651abdSSudarsana Reddy Kalluru for (type = 0; type < DCBX_MAX_PROTOCOL_TYPE; type++) { 32239651abdSSudarsana Reddy Kalluru if (p_data->arr[type].update) 32339651abdSSudarsana Reddy Kalluru continue; 32439651abdSSudarsana Reddy Kalluru 325dfc268f6SSudarsana Reddy Kalluru enable = (type == DCBX_PROTOCOL_ETH) ? false : !!dcbx_version; 326dfc268f6SSudarsana Reddy Kalluru qed_dcbx_update_app_info(p_data, p_hwfn, enable, 32739651abdSSudarsana Reddy Kalluru priority, tc, type); 32839651abdSSudarsana Reddy Kalluru } 32939651abdSSudarsana Reddy Kalluru 33039651abdSSudarsana Reddy Kalluru return 0; 33139651abdSSudarsana Reddy Kalluru } 33239651abdSSudarsana Reddy Kalluru 33339651abdSSudarsana Reddy Kalluru /* Parse app TLV's to update TC information in hw_info structure for 33439651abdSSudarsana Reddy Kalluru * reconfiguring QM. Get protocol specific data for PF update ramrod command. 33539651abdSSudarsana Reddy Kalluru */ 33639651abdSSudarsana Reddy Kalluru static int qed_dcbx_process_mib_info(struct qed_hwfn *p_hwfn) 33739651abdSSudarsana Reddy Kalluru { 33839651abdSSudarsana Reddy Kalluru struct dcbx_app_priority_feature *p_app; 33939651abdSSudarsana Reddy Kalluru struct dcbx_app_priority_entry *p_tbl; 34039651abdSSudarsana Reddy Kalluru struct qed_dcbx_results data = { 0 }; 34139651abdSSudarsana Reddy Kalluru struct dcbx_ets_feature *p_ets; 34239651abdSSudarsana Reddy Kalluru struct qed_hw_info *p_info; 34339651abdSSudarsana Reddy Kalluru u32 pri_tc_tbl, flags; 344fb9ea8a9SSudarsana Reddy Kalluru u8 dcbx_version; 34539651abdSSudarsana Reddy Kalluru int num_entries; 34639651abdSSudarsana Reddy Kalluru int rc = 0; 34739651abdSSudarsana Reddy Kalluru 34839651abdSSudarsana Reddy Kalluru flags = p_hwfn->p_dcbx_info->operational.flags; 349fb9ea8a9SSudarsana Reddy Kalluru dcbx_version = QED_MFW_GET_FIELD(flags, DCBX_CONFIG_VERSION); 35039651abdSSudarsana Reddy Kalluru 35139651abdSSudarsana Reddy Kalluru p_app = &p_hwfn->p_dcbx_info->operational.features.app; 35239651abdSSudarsana Reddy Kalluru p_tbl = p_app->app_pri_tbl; 35339651abdSSudarsana Reddy Kalluru 35439651abdSSudarsana Reddy Kalluru p_ets = &p_hwfn->p_dcbx_info->operational.features.ets; 35539651abdSSudarsana Reddy Kalluru pri_tc_tbl = p_ets->pri_tc_tbl[0]; 35639651abdSSudarsana Reddy Kalluru 35739651abdSSudarsana Reddy Kalluru p_info = &p_hwfn->hw_info; 35839651abdSSudarsana Reddy Kalluru num_entries = QED_MFW_GET_FIELD(p_app->flags, DCBX_APP_NUM_ENTRIES); 35939651abdSSudarsana Reddy Kalluru 36039651abdSSudarsana Reddy Kalluru rc = qed_dcbx_process_tlv(p_hwfn, &data, p_tbl, pri_tc_tbl, 361fb9ea8a9SSudarsana Reddy Kalluru num_entries, dcbx_version); 36239651abdSSudarsana Reddy Kalluru if (rc) 36339651abdSSudarsana Reddy Kalluru return rc; 36439651abdSSudarsana Reddy Kalluru 365b5a9ee7cSAriel Elior p_info->num_active_tc = QED_MFW_GET_FIELD(p_ets->flags, 366b5a9ee7cSAriel Elior DCBX_ETS_MAX_TCS); 367b5a9ee7cSAriel Elior p_hwfn->qm_info.ooo_tc = QED_MFW_GET_FIELD(p_ets->flags, DCBX_OOO_TC); 36839651abdSSudarsana Reddy Kalluru data.pf_id = p_hwfn->rel_pf_id; 369fb9ea8a9SSudarsana Reddy Kalluru data.dcbx_enabled = !!dcbx_version; 37039651abdSSudarsana Reddy Kalluru 37139651abdSSudarsana Reddy Kalluru qed_dcbx_dp_protocol(p_hwfn, &data); 37239651abdSSudarsana Reddy Kalluru 37339651abdSSudarsana Reddy Kalluru memcpy(&p_hwfn->p_dcbx_info->results, &data, 37439651abdSSudarsana Reddy Kalluru sizeof(struct qed_dcbx_results)); 37539651abdSSudarsana Reddy Kalluru 37639651abdSSudarsana Reddy Kalluru return 0; 37739651abdSSudarsana Reddy Kalluru } 37839651abdSSudarsana Reddy Kalluru 37939651abdSSudarsana Reddy Kalluru static int 38039651abdSSudarsana Reddy Kalluru qed_dcbx_copy_mib(struct qed_hwfn *p_hwfn, 38139651abdSSudarsana Reddy Kalluru struct qed_ptt *p_ptt, 38239651abdSSudarsana Reddy Kalluru struct qed_dcbx_mib_meta_data *p_data, 38339651abdSSudarsana Reddy Kalluru enum qed_mib_read_type type) 38439651abdSSudarsana Reddy Kalluru { 38539651abdSSudarsana Reddy Kalluru u32 prefix_seq_num, suffix_seq_num; 38639651abdSSudarsana Reddy Kalluru int read_count = 0; 38739651abdSSudarsana Reddy Kalluru int rc = 0; 38839651abdSSudarsana Reddy Kalluru 38939651abdSSudarsana Reddy Kalluru /* The data is considered to be valid only if both sequence numbers are 39039651abdSSudarsana Reddy Kalluru * the same. 39139651abdSSudarsana Reddy Kalluru */ 39239651abdSSudarsana Reddy Kalluru do { 39339651abdSSudarsana Reddy Kalluru if (type == QED_DCBX_REMOTE_LLDP_MIB) { 39439651abdSSudarsana Reddy Kalluru qed_memcpy_from(p_hwfn, p_ptt, p_data->lldp_remote, 39539651abdSSudarsana Reddy Kalluru p_data->addr, p_data->size); 39639651abdSSudarsana Reddy Kalluru prefix_seq_num = p_data->lldp_remote->prefix_seq_num; 39739651abdSSudarsana Reddy Kalluru suffix_seq_num = p_data->lldp_remote->suffix_seq_num; 39839651abdSSudarsana Reddy Kalluru } else { 39939651abdSSudarsana Reddy Kalluru qed_memcpy_from(p_hwfn, p_ptt, p_data->mib, 40039651abdSSudarsana Reddy Kalluru p_data->addr, p_data->size); 40139651abdSSudarsana Reddy Kalluru prefix_seq_num = p_data->mib->prefix_seq_num; 40239651abdSSudarsana Reddy Kalluru suffix_seq_num = p_data->mib->suffix_seq_num; 40339651abdSSudarsana Reddy Kalluru } 40439651abdSSudarsana Reddy Kalluru read_count++; 40539651abdSSudarsana Reddy Kalluru 40639651abdSSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, 40739651abdSSudarsana Reddy Kalluru QED_MSG_DCB, 40839651abdSSudarsana Reddy Kalluru "mib type = %d, try count = %d prefix seq num = %d suffix seq num = %d\n", 40939651abdSSudarsana Reddy Kalluru type, read_count, prefix_seq_num, suffix_seq_num); 41039651abdSSudarsana Reddy Kalluru } while ((prefix_seq_num != suffix_seq_num) && 41139651abdSSudarsana Reddy Kalluru (read_count < QED_DCBX_MAX_MIB_READ_TRY)); 41239651abdSSudarsana Reddy Kalluru 41339651abdSSudarsana Reddy Kalluru if (read_count >= QED_DCBX_MAX_MIB_READ_TRY) { 41439651abdSSudarsana Reddy Kalluru DP_ERR(p_hwfn, 41539651abdSSudarsana Reddy Kalluru "MIB read err, mib type = %d, try count = %d prefix seq num = %d suffix seq num = %d\n", 41639651abdSSudarsana Reddy Kalluru type, read_count, prefix_seq_num, suffix_seq_num); 41739651abdSSudarsana Reddy Kalluru rc = -EIO; 41839651abdSSudarsana Reddy Kalluru } 41939651abdSSudarsana Reddy Kalluru 42039651abdSSudarsana Reddy Kalluru return rc; 42139651abdSSudarsana Reddy Kalluru } 42239651abdSSudarsana Reddy Kalluru 4236ad8c632SSudarsana Reddy Kalluru static void 4246ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_priority_info(struct qed_hwfn *p_hwfn, 4256ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_app_prio *p_prio, 4266ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_results *p_results) 4276ad8c632SSudarsana Reddy Kalluru { 4286ad8c632SSudarsana Reddy Kalluru u8 val; 4296ad8c632SSudarsana Reddy Kalluru 4306ad8c632SSudarsana Reddy Kalluru p_prio->roce = QED_DCBX_INVALID_PRIORITY; 4316ad8c632SSudarsana Reddy Kalluru p_prio->roce_v2 = QED_DCBX_INVALID_PRIORITY; 4326ad8c632SSudarsana Reddy Kalluru p_prio->iscsi = QED_DCBX_INVALID_PRIORITY; 4336ad8c632SSudarsana Reddy Kalluru p_prio->fcoe = QED_DCBX_INVALID_PRIORITY; 4346ad8c632SSudarsana Reddy Kalluru 4356ad8c632SSudarsana Reddy Kalluru if (p_results->arr[DCBX_PROTOCOL_ROCE].update && 4366ad8c632SSudarsana Reddy Kalluru p_results->arr[DCBX_PROTOCOL_ROCE].enable) 4376ad8c632SSudarsana Reddy Kalluru p_prio->roce = p_results->arr[DCBX_PROTOCOL_ROCE].priority; 4386ad8c632SSudarsana Reddy Kalluru 4396ad8c632SSudarsana Reddy Kalluru if (p_results->arr[DCBX_PROTOCOL_ROCE_V2].update && 4406ad8c632SSudarsana Reddy Kalluru p_results->arr[DCBX_PROTOCOL_ROCE_V2].enable) { 4416ad8c632SSudarsana Reddy Kalluru val = p_results->arr[DCBX_PROTOCOL_ROCE_V2].priority; 4426ad8c632SSudarsana Reddy Kalluru p_prio->roce_v2 = val; 4436ad8c632SSudarsana Reddy Kalluru } 4446ad8c632SSudarsana Reddy Kalluru 4456ad8c632SSudarsana Reddy Kalluru if (p_results->arr[DCBX_PROTOCOL_ISCSI].update && 4466ad8c632SSudarsana Reddy Kalluru p_results->arr[DCBX_PROTOCOL_ISCSI].enable) 4476ad8c632SSudarsana Reddy Kalluru p_prio->iscsi = p_results->arr[DCBX_PROTOCOL_ISCSI].priority; 4486ad8c632SSudarsana Reddy Kalluru 4496ad8c632SSudarsana Reddy Kalluru if (p_results->arr[DCBX_PROTOCOL_FCOE].update && 4506ad8c632SSudarsana Reddy Kalluru p_results->arr[DCBX_PROTOCOL_FCOE].enable) 4516ad8c632SSudarsana Reddy Kalluru p_prio->fcoe = p_results->arr[DCBX_PROTOCOL_FCOE].priority; 4526ad8c632SSudarsana Reddy Kalluru 4536ad8c632SSudarsana Reddy Kalluru if (p_results->arr[DCBX_PROTOCOL_ETH].update && 4546ad8c632SSudarsana Reddy Kalluru p_results->arr[DCBX_PROTOCOL_ETH].enable) 4556ad8c632SSudarsana Reddy Kalluru p_prio->eth = p_results->arr[DCBX_PROTOCOL_ETH].priority; 4566ad8c632SSudarsana Reddy Kalluru 4576ad8c632SSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, 4586ad8c632SSudarsana Reddy Kalluru "Priorities: iscsi %d, roce %d, roce v2 %d, fcoe %d, eth %d\n", 4596ad8c632SSudarsana Reddy Kalluru p_prio->iscsi, p_prio->roce, p_prio->roce_v2, p_prio->fcoe, 4606ad8c632SSudarsana Reddy Kalluru p_prio->eth); 4616ad8c632SSudarsana Reddy Kalluru } 4626ad8c632SSudarsana Reddy Kalluru 4636ad8c632SSudarsana Reddy Kalluru static void 4646ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_app_data(struct qed_hwfn *p_hwfn, 4656ad8c632SSudarsana Reddy Kalluru struct dcbx_app_priority_feature *p_app, 4666ad8c632SSudarsana Reddy Kalluru struct dcbx_app_priority_entry *p_tbl, 467fb9ea8a9SSudarsana Reddy Kalluru struct qed_dcbx_params *p_params, bool ieee) 4686ad8c632SSudarsana Reddy Kalluru { 4696ad8c632SSudarsana Reddy Kalluru struct qed_app_entry *entry; 4706ad8c632SSudarsana Reddy Kalluru u8 pri_map; 4716ad8c632SSudarsana Reddy Kalluru int i; 4726ad8c632SSudarsana Reddy Kalluru 4736ad8c632SSudarsana Reddy Kalluru p_params->app_willing = QED_MFW_GET_FIELD(p_app->flags, 4746ad8c632SSudarsana Reddy Kalluru DCBX_APP_WILLING); 4756ad8c632SSudarsana Reddy Kalluru p_params->app_valid = QED_MFW_GET_FIELD(p_app->flags, DCBX_APP_ENABLED); 4766ad8c632SSudarsana Reddy Kalluru p_params->app_error = QED_MFW_GET_FIELD(p_app->flags, DCBX_APP_ERROR); 4776ad8c632SSudarsana Reddy Kalluru p_params->num_app_entries = QED_MFW_GET_FIELD(p_app->flags, 4786ad8c632SSudarsana Reddy Kalluru DCBX_APP_NUM_ENTRIES); 4796ad8c632SSudarsana Reddy Kalluru for (i = 0; i < DCBX_MAX_APP_PROTOCOL; i++) { 4806ad8c632SSudarsana Reddy Kalluru entry = &p_params->app_entry[i]; 48159bcb797SSudarsana Reddy Kalluru if (ieee) { 48259bcb797SSudarsana Reddy Kalluru u8 sf_ieee; 48359bcb797SSudarsana Reddy Kalluru u32 val; 48459bcb797SSudarsana Reddy Kalluru 48559bcb797SSudarsana Reddy Kalluru sf_ieee = QED_MFW_GET_FIELD(p_tbl[i].entry, 48659bcb797SSudarsana Reddy Kalluru DCBX_APP_SF_IEEE); 48759bcb797SSudarsana Reddy Kalluru switch (sf_ieee) { 48859bcb797SSudarsana Reddy Kalluru case DCBX_APP_SF_IEEE_RESERVED: 48959bcb797SSudarsana Reddy Kalluru /* Old MFW */ 49059bcb797SSudarsana Reddy Kalluru val = QED_MFW_GET_FIELD(p_tbl[i].entry, 49159bcb797SSudarsana Reddy Kalluru DCBX_APP_SF); 49259bcb797SSudarsana Reddy Kalluru entry->sf_ieee = val ? 49359bcb797SSudarsana Reddy Kalluru QED_DCBX_SF_IEEE_TCP_UDP_PORT : 49459bcb797SSudarsana Reddy Kalluru QED_DCBX_SF_IEEE_ETHTYPE; 49559bcb797SSudarsana Reddy Kalluru break; 49659bcb797SSudarsana Reddy Kalluru case DCBX_APP_SF_IEEE_ETHTYPE: 49759bcb797SSudarsana Reddy Kalluru entry->sf_ieee = QED_DCBX_SF_IEEE_ETHTYPE; 49859bcb797SSudarsana Reddy Kalluru break; 49959bcb797SSudarsana Reddy Kalluru case DCBX_APP_SF_IEEE_TCP_PORT: 50059bcb797SSudarsana Reddy Kalluru entry->sf_ieee = QED_DCBX_SF_IEEE_TCP_PORT; 50159bcb797SSudarsana Reddy Kalluru break; 50259bcb797SSudarsana Reddy Kalluru case DCBX_APP_SF_IEEE_UDP_PORT: 50359bcb797SSudarsana Reddy Kalluru entry->sf_ieee = QED_DCBX_SF_IEEE_UDP_PORT; 50459bcb797SSudarsana Reddy Kalluru break; 50559bcb797SSudarsana Reddy Kalluru case DCBX_APP_SF_IEEE_TCP_UDP_PORT: 50659bcb797SSudarsana Reddy Kalluru entry->sf_ieee = QED_DCBX_SF_IEEE_TCP_UDP_PORT; 50759bcb797SSudarsana Reddy Kalluru break; 50859bcb797SSudarsana Reddy Kalluru } 50959bcb797SSudarsana Reddy Kalluru } else { 5106ad8c632SSudarsana Reddy Kalluru entry->ethtype = !(QED_MFW_GET_FIELD(p_tbl[i].entry, 5116ad8c632SSudarsana Reddy Kalluru DCBX_APP_SF)); 51259bcb797SSudarsana Reddy Kalluru } 51359bcb797SSudarsana Reddy Kalluru 5146ad8c632SSudarsana Reddy Kalluru pri_map = QED_MFW_GET_FIELD(p_tbl[i].entry, DCBX_APP_PRI_MAP); 5156ad8c632SSudarsana Reddy Kalluru entry->prio = ffs(pri_map) - 1; 5166ad8c632SSudarsana Reddy Kalluru entry->proto_id = QED_MFW_GET_FIELD(p_tbl[i].entry, 5176ad8c632SSudarsana Reddy Kalluru DCBX_APP_PROTOCOL_ID); 5186ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_app_protocol_type(p_hwfn, p_tbl[i].entry, 5196ad8c632SSudarsana Reddy Kalluru entry->proto_id, 520fb9ea8a9SSudarsana Reddy Kalluru &entry->proto_type, ieee); 5216ad8c632SSudarsana Reddy Kalluru } 5226ad8c632SSudarsana Reddy Kalluru 5236ad8c632SSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, 5246ad8c632SSudarsana Reddy Kalluru "APP params: willing %d, valid %d error = %d\n", 5256ad8c632SSudarsana Reddy Kalluru p_params->app_willing, p_params->app_valid, 5266ad8c632SSudarsana Reddy Kalluru p_params->app_error); 5276ad8c632SSudarsana Reddy Kalluru } 5286ad8c632SSudarsana Reddy Kalluru 5296ad8c632SSudarsana Reddy Kalluru static void 5306ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_pfc_data(struct qed_hwfn *p_hwfn, 5316ad8c632SSudarsana Reddy Kalluru u32 pfc, struct qed_dcbx_params *p_params) 5326ad8c632SSudarsana Reddy Kalluru { 5336ad8c632SSudarsana Reddy Kalluru u8 pfc_map; 5346ad8c632SSudarsana Reddy Kalluru 5356ad8c632SSudarsana Reddy Kalluru p_params->pfc.willing = QED_MFW_GET_FIELD(pfc, DCBX_PFC_WILLING); 5366ad8c632SSudarsana Reddy Kalluru p_params->pfc.max_tc = QED_MFW_GET_FIELD(pfc, DCBX_PFC_CAPS); 5376ad8c632SSudarsana Reddy Kalluru p_params->pfc.enabled = QED_MFW_GET_FIELD(pfc, DCBX_PFC_ENABLED); 5386ad8c632SSudarsana Reddy Kalluru pfc_map = QED_MFW_GET_FIELD(pfc, DCBX_PFC_PRI_EN_BITMAP); 5396ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[0] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_0); 5406ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[1] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_1); 5416ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[2] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_2); 5426ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[3] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_3); 5436ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[4] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_4); 5446ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[5] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_5); 5456ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[6] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_6); 5466ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[7] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_7); 5476ad8c632SSudarsana Reddy Kalluru 5486ad8c632SSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, 549dfbeb85fSsudarsana.kalluru@cavium.com "PFC params: willing %d, pfc_bitmap %u max_tc = %u enabled = %d\n", 550dfbeb85fSsudarsana.kalluru@cavium.com p_params->pfc.willing, pfc_map, p_params->pfc.max_tc, 551dfbeb85fSsudarsana.kalluru@cavium.com p_params->pfc.enabled); 5526ad8c632SSudarsana Reddy Kalluru } 5536ad8c632SSudarsana Reddy Kalluru 5546ad8c632SSudarsana Reddy Kalluru static void 5556ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_ets_data(struct qed_hwfn *p_hwfn, 5566ad8c632SSudarsana Reddy Kalluru struct dcbx_ets_feature *p_ets, 5576ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_params *p_params) 5586ad8c632SSudarsana Reddy Kalluru { 5596ad8c632SSudarsana Reddy Kalluru u32 bw_map[2], tsa_map[2], pri_map; 5606ad8c632SSudarsana Reddy Kalluru int i; 5616ad8c632SSudarsana Reddy Kalluru 5626ad8c632SSudarsana Reddy Kalluru p_params->ets_willing = QED_MFW_GET_FIELD(p_ets->flags, 5636ad8c632SSudarsana Reddy Kalluru DCBX_ETS_WILLING); 5646ad8c632SSudarsana Reddy Kalluru p_params->ets_enabled = QED_MFW_GET_FIELD(p_ets->flags, 5656ad8c632SSudarsana Reddy Kalluru DCBX_ETS_ENABLED); 5666ad8c632SSudarsana Reddy Kalluru p_params->ets_cbs = QED_MFW_GET_FIELD(p_ets->flags, DCBX_ETS_CBS); 5676ad8c632SSudarsana Reddy Kalluru p_params->max_ets_tc = QED_MFW_GET_FIELD(p_ets->flags, 5686ad8c632SSudarsana Reddy Kalluru DCBX_ETS_MAX_TCS); 5696ad8c632SSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, 570dfbeb85fSsudarsana.kalluru@cavium.com "ETS params: willing %d, enabled = %d ets_cbs %d pri_tc_tbl_0 %x max_ets_tc %d\n", 571dfbeb85fSsudarsana.kalluru@cavium.com p_params->ets_willing, p_params->ets_enabled, 572dfbeb85fSsudarsana.kalluru@cavium.com p_params->ets_cbs, p_ets->pri_tc_tbl[0], 573dfbeb85fSsudarsana.kalluru@cavium.com p_params->max_ets_tc); 5746ad8c632SSudarsana Reddy Kalluru 57566367dabSsudarsana.kalluru@cavium.com if (p_params->ets_enabled && !p_params->max_ets_tc) { 57666367dabSsudarsana.kalluru@cavium.com p_params->max_ets_tc = QED_MAX_PFC_PRIORITIES; 57766367dabSsudarsana.kalluru@cavium.com DP_VERBOSE(p_hwfn, QED_MSG_DCB, 57866367dabSsudarsana.kalluru@cavium.com "ETS params: max_ets_tc is forced to %d\n", 57966367dabSsudarsana.kalluru@cavium.com p_params->max_ets_tc); 58066367dabSsudarsana.kalluru@cavium.com } 58166367dabSsudarsana.kalluru@cavium.com 5826ad8c632SSudarsana Reddy Kalluru /* 8 bit tsa and bw data corresponding to each of the 8 TC's are 5836ad8c632SSudarsana Reddy Kalluru * encoded in a type u32 array of size 2. 5846ad8c632SSudarsana Reddy Kalluru */ 5856ad8c632SSudarsana Reddy Kalluru bw_map[0] = be32_to_cpu(p_ets->tc_bw_tbl[0]); 5866ad8c632SSudarsana Reddy Kalluru bw_map[1] = be32_to_cpu(p_ets->tc_bw_tbl[1]); 5876ad8c632SSudarsana Reddy Kalluru tsa_map[0] = be32_to_cpu(p_ets->tc_tsa_tbl[0]); 5886ad8c632SSudarsana Reddy Kalluru tsa_map[1] = be32_to_cpu(p_ets->tc_tsa_tbl[1]); 589c0c45a6bSSudarsana Reddy Kalluru pri_map = p_ets->pri_tc_tbl[0]; 5906ad8c632SSudarsana Reddy Kalluru for (i = 0; i < QED_MAX_PFC_PRIORITIES; i++) { 5916ad8c632SSudarsana Reddy Kalluru p_params->ets_tc_bw_tbl[i] = ((u8 *)bw_map)[i]; 5926ad8c632SSudarsana Reddy Kalluru p_params->ets_tc_tsa_tbl[i] = ((u8 *)tsa_map)[i]; 5936ad8c632SSudarsana Reddy Kalluru p_params->ets_pri_tc_tbl[i] = QED_DCBX_PRIO2TC(pri_map, i); 5946ad8c632SSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, 5956ad8c632SSudarsana Reddy Kalluru "elem %d bw_tbl %x tsa_tbl %x\n", 5966ad8c632SSudarsana Reddy Kalluru i, p_params->ets_tc_bw_tbl[i], 5976ad8c632SSudarsana Reddy Kalluru p_params->ets_tc_tsa_tbl[i]); 5986ad8c632SSudarsana Reddy Kalluru } 5996ad8c632SSudarsana Reddy Kalluru } 6006ad8c632SSudarsana Reddy Kalluru 6016ad8c632SSudarsana Reddy Kalluru static void 6026ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_common_params(struct qed_hwfn *p_hwfn, 6036ad8c632SSudarsana Reddy Kalluru struct dcbx_app_priority_feature *p_app, 6046ad8c632SSudarsana Reddy Kalluru struct dcbx_app_priority_entry *p_tbl, 6056ad8c632SSudarsana Reddy Kalluru struct dcbx_ets_feature *p_ets, 606fb9ea8a9SSudarsana Reddy Kalluru u32 pfc, struct qed_dcbx_params *p_params, bool ieee) 6076ad8c632SSudarsana Reddy Kalluru { 608fb9ea8a9SSudarsana Reddy Kalluru qed_dcbx_get_app_data(p_hwfn, p_app, p_tbl, p_params, ieee); 6096ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_ets_data(p_hwfn, p_ets, p_params); 6106ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_pfc_data(p_hwfn, pfc, p_params); 6116ad8c632SSudarsana Reddy Kalluru } 6126ad8c632SSudarsana Reddy Kalluru 6136ad8c632SSudarsana Reddy Kalluru static void 614270837b3Ssudarsana.kalluru@cavium.com qed_dcbx_get_local_params(struct qed_hwfn *p_hwfn, struct qed_dcbx_get *params) 6156ad8c632SSudarsana Reddy Kalluru { 6166ad8c632SSudarsana Reddy Kalluru struct dcbx_features *p_feat; 6176ad8c632SSudarsana Reddy Kalluru 6186ad8c632SSudarsana Reddy Kalluru p_feat = &p_hwfn->p_dcbx_info->local_admin.features; 6196ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_common_params(p_hwfn, &p_feat->app, 6206ad8c632SSudarsana Reddy Kalluru p_feat->app.app_pri_tbl, &p_feat->ets, 621fb9ea8a9SSudarsana Reddy Kalluru p_feat->pfc, ¶ms->local.params, false); 6226ad8c632SSudarsana Reddy Kalluru params->local.valid = true; 6236ad8c632SSudarsana Reddy Kalluru } 6246ad8c632SSudarsana Reddy Kalluru 6256ad8c632SSudarsana Reddy Kalluru static void 626270837b3Ssudarsana.kalluru@cavium.com qed_dcbx_get_remote_params(struct qed_hwfn *p_hwfn, struct qed_dcbx_get *params) 6276ad8c632SSudarsana Reddy Kalluru { 6286ad8c632SSudarsana Reddy Kalluru struct dcbx_features *p_feat; 6296ad8c632SSudarsana Reddy Kalluru 6306ad8c632SSudarsana Reddy Kalluru p_feat = &p_hwfn->p_dcbx_info->remote.features; 6316ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_common_params(p_hwfn, &p_feat->app, 6326ad8c632SSudarsana Reddy Kalluru p_feat->app.app_pri_tbl, &p_feat->ets, 633fb9ea8a9SSudarsana Reddy Kalluru p_feat->pfc, ¶ms->remote.params, false); 6346ad8c632SSudarsana Reddy Kalluru params->remote.valid = true; 6356ad8c632SSudarsana Reddy Kalluru } 6366ad8c632SSudarsana Reddy Kalluru 6376ad8c632SSudarsana Reddy Kalluru static void 6386ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_operational_params(struct qed_hwfn *p_hwfn, 6396ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_get *params) 6406ad8c632SSudarsana Reddy Kalluru { 6416ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_operational_params *p_operational; 6426ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_results *p_results; 6436ad8c632SSudarsana Reddy Kalluru struct dcbx_features *p_feat; 6446ad8c632SSudarsana Reddy Kalluru bool enabled, err; 6456ad8c632SSudarsana Reddy Kalluru u32 flags; 6466ad8c632SSudarsana Reddy Kalluru bool val; 6476ad8c632SSudarsana Reddy Kalluru 6486ad8c632SSudarsana Reddy Kalluru flags = p_hwfn->p_dcbx_info->operational.flags; 6496ad8c632SSudarsana Reddy Kalluru 6506ad8c632SSudarsana Reddy Kalluru /* If DCBx version is non zero, then negotiation 6516ad8c632SSudarsana Reddy Kalluru * was successfuly performed 6526ad8c632SSudarsana Reddy Kalluru */ 6536ad8c632SSudarsana Reddy Kalluru p_operational = ¶ms->operational; 6546ad8c632SSudarsana Reddy Kalluru enabled = !!(QED_MFW_GET_FIELD(flags, DCBX_CONFIG_VERSION) != 6556ad8c632SSudarsana Reddy Kalluru DCBX_CONFIG_VERSION_DISABLED); 6566ad8c632SSudarsana Reddy Kalluru if (!enabled) { 6576ad8c632SSudarsana Reddy Kalluru p_operational->enabled = enabled; 6586ad8c632SSudarsana Reddy Kalluru p_operational->valid = false; 659dfbeb85fSsudarsana.kalluru@cavium.com DP_VERBOSE(p_hwfn, QED_MSG_DCB, "Dcbx is disabled\n"); 6606ad8c632SSudarsana Reddy Kalluru return; 6616ad8c632SSudarsana Reddy Kalluru } 6626ad8c632SSudarsana Reddy Kalluru 6636ad8c632SSudarsana Reddy Kalluru p_feat = &p_hwfn->p_dcbx_info->operational.features; 6646ad8c632SSudarsana Reddy Kalluru p_results = &p_hwfn->p_dcbx_info->results; 6656ad8c632SSudarsana Reddy Kalluru 6666ad8c632SSudarsana Reddy Kalluru val = !!(QED_MFW_GET_FIELD(flags, DCBX_CONFIG_VERSION) == 6676ad8c632SSudarsana Reddy Kalluru DCBX_CONFIG_VERSION_IEEE); 6686ad8c632SSudarsana Reddy Kalluru p_operational->ieee = val; 6696ad8c632SSudarsana Reddy Kalluru val = !!(QED_MFW_GET_FIELD(flags, DCBX_CONFIG_VERSION) == 6706ad8c632SSudarsana Reddy Kalluru DCBX_CONFIG_VERSION_CEE); 6716ad8c632SSudarsana Reddy Kalluru p_operational->cee = val; 6726ad8c632SSudarsana Reddy Kalluru 67349632b58Ssudarsana.kalluru@cavium.com val = !!(QED_MFW_GET_FIELD(flags, DCBX_CONFIG_VERSION) == 67449632b58Ssudarsana.kalluru@cavium.com DCBX_CONFIG_VERSION_STATIC); 67549632b58Ssudarsana.kalluru@cavium.com p_operational->local = val; 67649632b58Ssudarsana.kalluru@cavium.com 67749632b58Ssudarsana.kalluru@cavium.com DP_VERBOSE(p_hwfn, QED_MSG_DCB, 67849632b58Ssudarsana.kalluru@cavium.com "Version support: ieee %d, cee %d, static %d\n", 67949632b58Ssudarsana.kalluru@cavium.com p_operational->ieee, p_operational->cee, 68049632b58Ssudarsana.kalluru@cavium.com p_operational->local); 6816ad8c632SSudarsana Reddy Kalluru 6826ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_common_params(p_hwfn, &p_feat->app, 6836ad8c632SSudarsana Reddy Kalluru p_feat->app.app_pri_tbl, &p_feat->ets, 684fb9ea8a9SSudarsana Reddy Kalluru p_feat->pfc, ¶ms->operational.params, 685fb9ea8a9SSudarsana Reddy Kalluru p_operational->ieee); 6866ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_priority_info(p_hwfn, &p_operational->app_prio, p_results); 6876ad8c632SSudarsana Reddy Kalluru err = QED_MFW_GET_FIELD(p_feat->app.flags, DCBX_APP_ERROR); 6886ad8c632SSudarsana Reddy Kalluru p_operational->err = err; 6896ad8c632SSudarsana Reddy Kalluru p_operational->enabled = enabled; 6906ad8c632SSudarsana Reddy Kalluru p_operational->valid = true; 6916ad8c632SSudarsana Reddy Kalluru } 6926ad8c632SSudarsana Reddy Kalluru 6936ad8c632SSudarsana Reddy Kalluru static void 6946ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_local_lldp_params(struct qed_hwfn *p_hwfn, 6956ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_get *params) 6966ad8c632SSudarsana Reddy Kalluru { 6976ad8c632SSudarsana Reddy Kalluru struct lldp_config_params_s *p_local; 6986ad8c632SSudarsana Reddy Kalluru 6996ad8c632SSudarsana Reddy Kalluru p_local = &p_hwfn->p_dcbx_info->lldp_local[LLDP_NEAREST_BRIDGE]; 7006ad8c632SSudarsana Reddy Kalluru 7016ad8c632SSudarsana Reddy Kalluru memcpy(params->lldp_local.local_chassis_id, p_local->local_chassis_id, 7026ad8c632SSudarsana Reddy Kalluru ARRAY_SIZE(p_local->local_chassis_id)); 7036ad8c632SSudarsana Reddy Kalluru memcpy(params->lldp_local.local_port_id, p_local->local_port_id, 7046ad8c632SSudarsana Reddy Kalluru ARRAY_SIZE(p_local->local_port_id)); 7056ad8c632SSudarsana Reddy Kalluru } 7066ad8c632SSudarsana Reddy Kalluru 7076ad8c632SSudarsana Reddy Kalluru static void 7086ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_remote_lldp_params(struct qed_hwfn *p_hwfn, 7096ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_get *params) 7106ad8c632SSudarsana Reddy Kalluru { 7116ad8c632SSudarsana Reddy Kalluru struct lldp_status_params_s *p_remote; 7126ad8c632SSudarsana Reddy Kalluru 7136ad8c632SSudarsana Reddy Kalluru p_remote = &p_hwfn->p_dcbx_info->lldp_remote[LLDP_NEAREST_BRIDGE]; 7146ad8c632SSudarsana Reddy Kalluru 7156ad8c632SSudarsana Reddy Kalluru memcpy(params->lldp_remote.peer_chassis_id, p_remote->peer_chassis_id, 7166ad8c632SSudarsana Reddy Kalluru ARRAY_SIZE(p_remote->peer_chassis_id)); 7176ad8c632SSudarsana Reddy Kalluru memcpy(params->lldp_remote.peer_port_id, p_remote->peer_port_id, 7186ad8c632SSudarsana Reddy Kalluru ARRAY_SIZE(p_remote->peer_port_id)); 7196ad8c632SSudarsana Reddy Kalluru } 7206ad8c632SSudarsana Reddy Kalluru 7216ad8c632SSudarsana Reddy Kalluru static int 722270837b3Ssudarsana.kalluru@cavium.com qed_dcbx_get_params(struct qed_hwfn *p_hwfn, struct qed_dcbx_get *p_params, 7236ad8c632SSudarsana Reddy Kalluru enum qed_mib_read_type type) 7246ad8c632SSudarsana Reddy Kalluru { 7256ad8c632SSudarsana Reddy Kalluru switch (type) { 7266ad8c632SSudarsana Reddy Kalluru case QED_DCBX_REMOTE_MIB: 727270837b3Ssudarsana.kalluru@cavium.com qed_dcbx_get_remote_params(p_hwfn, p_params); 7286ad8c632SSudarsana Reddy Kalluru break; 7296ad8c632SSudarsana Reddy Kalluru case QED_DCBX_LOCAL_MIB: 730270837b3Ssudarsana.kalluru@cavium.com qed_dcbx_get_local_params(p_hwfn, p_params); 7316ad8c632SSudarsana Reddy Kalluru break; 7326ad8c632SSudarsana Reddy Kalluru case QED_DCBX_OPERATIONAL_MIB: 733270837b3Ssudarsana.kalluru@cavium.com qed_dcbx_get_operational_params(p_hwfn, p_params); 7346ad8c632SSudarsana Reddy Kalluru break; 7356ad8c632SSudarsana Reddy Kalluru case QED_DCBX_REMOTE_LLDP_MIB: 736270837b3Ssudarsana.kalluru@cavium.com qed_dcbx_get_remote_lldp_params(p_hwfn, p_params); 7376ad8c632SSudarsana Reddy Kalluru break; 7386ad8c632SSudarsana Reddy Kalluru case QED_DCBX_LOCAL_LLDP_MIB: 739270837b3Ssudarsana.kalluru@cavium.com qed_dcbx_get_local_lldp_params(p_hwfn, p_params); 7406ad8c632SSudarsana Reddy Kalluru break; 7416ad8c632SSudarsana Reddy Kalluru default: 7426ad8c632SSudarsana Reddy Kalluru DP_ERR(p_hwfn, "MIB read err, unknown mib type %d\n", type); 7436ad8c632SSudarsana Reddy Kalluru return -EINVAL; 7446ad8c632SSudarsana Reddy Kalluru } 7456ad8c632SSudarsana Reddy Kalluru 7466ad8c632SSudarsana Reddy Kalluru return 0; 7476ad8c632SSudarsana Reddy Kalluru } 7486ad8c632SSudarsana Reddy Kalluru 74939651abdSSudarsana Reddy Kalluru static int 75039651abdSSudarsana Reddy Kalluru qed_dcbx_read_local_lldp_mib(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt) 75139651abdSSudarsana Reddy Kalluru { 75239651abdSSudarsana Reddy Kalluru struct qed_dcbx_mib_meta_data data; 75339651abdSSudarsana Reddy Kalluru int rc = 0; 75439651abdSSudarsana Reddy Kalluru 75539651abdSSudarsana Reddy Kalluru memset(&data, 0, sizeof(data)); 75639651abdSSudarsana Reddy Kalluru data.addr = p_hwfn->mcp_info->port_addr + offsetof(struct public_port, 75739651abdSSudarsana Reddy Kalluru lldp_config_params); 75839651abdSSudarsana Reddy Kalluru data.lldp_local = p_hwfn->p_dcbx_info->lldp_local; 75939651abdSSudarsana Reddy Kalluru data.size = sizeof(struct lldp_config_params_s); 76039651abdSSudarsana Reddy Kalluru qed_memcpy_from(p_hwfn, p_ptt, data.lldp_local, data.addr, data.size); 76139651abdSSudarsana Reddy Kalluru 76239651abdSSudarsana Reddy Kalluru return rc; 76339651abdSSudarsana Reddy Kalluru } 76439651abdSSudarsana Reddy Kalluru 76539651abdSSudarsana Reddy Kalluru static int 76639651abdSSudarsana Reddy Kalluru qed_dcbx_read_remote_lldp_mib(struct qed_hwfn *p_hwfn, 76739651abdSSudarsana Reddy Kalluru struct qed_ptt *p_ptt, 76839651abdSSudarsana Reddy Kalluru enum qed_mib_read_type type) 76939651abdSSudarsana Reddy Kalluru { 77039651abdSSudarsana Reddy Kalluru struct qed_dcbx_mib_meta_data data; 77139651abdSSudarsana Reddy Kalluru int rc = 0; 77239651abdSSudarsana Reddy Kalluru 77339651abdSSudarsana Reddy Kalluru memset(&data, 0, sizeof(data)); 77439651abdSSudarsana Reddy Kalluru data.addr = p_hwfn->mcp_info->port_addr + offsetof(struct public_port, 77539651abdSSudarsana Reddy Kalluru lldp_status_params); 77639651abdSSudarsana Reddy Kalluru data.lldp_remote = p_hwfn->p_dcbx_info->lldp_remote; 77739651abdSSudarsana Reddy Kalluru data.size = sizeof(struct lldp_status_params_s); 77839651abdSSudarsana Reddy Kalluru rc = qed_dcbx_copy_mib(p_hwfn, p_ptt, &data, type); 77939651abdSSudarsana Reddy Kalluru 78039651abdSSudarsana Reddy Kalluru return rc; 78139651abdSSudarsana Reddy Kalluru } 78239651abdSSudarsana Reddy Kalluru 78339651abdSSudarsana Reddy Kalluru static int 78439651abdSSudarsana Reddy Kalluru qed_dcbx_read_operational_mib(struct qed_hwfn *p_hwfn, 78539651abdSSudarsana Reddy Kalluru struct qed_ptt *p_ptt, 78639651abdSSudarsana Reddy Kalluru enum qed_mib_read_type type) 78739651abdSSudarsana Reddy Kalluru { 78839651abdSSudarsana Reddy Kalluru struct qed_dcbx_mib_meta_data data; 78939651abdSSudarsana Reddy Kalluru int rc = 0; 79039651abdSSudarsana Reddy Kalluru 79139651abdSSudarsana Reddy Kalluru memset(&data, 0, sizeof(data)); 79239651abdSSudarsana Reddy Kalluru data.addr = p_hwfn->mcp_info->port_addr + 79339651abdSSudarsana Reddy Kalluru offsetof(struct public_port, operational_dcbx_mib); 79439651abdSSudarsana Reddy Kalluru data.mib = &p_hwfn->p_dcbx_info->operational; 79539651abdSSudarsana Reddy Kalluru data.size = sizeof(struct dcbx_mib); 79639651abdSSudarsana Reddy Kalluru rc = qed_dcbx_copy_mib(p_hwfn, p_ptt, &data, type); 79739651abdSSudarsana Reddy Kalluru 79839651abdSSudarsana Reddy Kalluru return rc; 79939651abdSSudarsana Reddy Kalluru } 80039651abdSSudarsana Reddy Kalluru 80139651abdSSudarsana Reddy Kalluru static int 80239651abdSSudarsana Reddy Kalluru qed_dcbx_read_remote_mib(struct qed_hwfn *p_hwfn, 80339651abdSSudarsana Reddy Kalluru struct qed_ptt *p_ptt, enum qed_mib_read_type type) 80439651abdSSudarsana Reddy Kalluru { 80539651abdSSudarsana Reddy Kalluru struct qed_dcbx_mib_meta_data data; 80639651abdSSudarsana Reddy Kalluru int rc = 0; 80739651abdSSudarsana Reddy Kalluru 80839651abdSSudarsana Reddy Kalluru memset(&data, 0, sizeof(data)); 80939651abdSSudarsana Reddy Kalluru data.addr = p_hwfn->mcp_info->port_addr + 81039651abdSSudarsana Reddy Kalluru offsetof(struct public_port, remote_dcbx_mib); 81139651abdSSudarsana Reddy Kalluru data.mib = &p_hwfn->p_dcbx_info->remote; 81239651abdSSudarsana Reddy Kalluru data.size = sizeof(struct dcbx_mib); 81339651abdSSudarsana Reddy Kalluru rc = qed_dcbx_copy_mib(p_hwfn, p_ptt, &data, type); 81439651abdSSudarsana Reddy Kalluru 81539651abdSSudarsana Reddy Kalluru return rc; 81639651abdSSudarsana Reddy Kalluru } 81739651abdSSudarsana Reddy Kalluru 81839651abdSSudarsana Reddy Kalluru static int 81939651abdSSudarsana Reddy Kalluru qed_dcbx_read_local_mib(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt) 82039651abdSSudarsana Reddy Kalluru { 82139651abdSSudarsana Reddy Kalluru struct qed_dcbx_mib_meta_data data; 82239651abdSSudarsana Reddy Kalluru int rc = 0; 82339651abdSSudarsana Reddy Kalluru 82439651abdSSudarsana Reddy Kalluru memset(&data, 0, sizeof(data)); 82539651abdSSudarsana Reddy Kalluru data.addr = p_hwfn->mcp_info->port_addr + 82639651abdSSudarsana Reddy Kalluru offsetof(struct public_port, local_admin_dcbx_mib); 82739651abdSSudarsana Reddy Kalluru data.local_admin = &p_hwfn->p_dcbx_info->local_admin; 82839651abdSSudarsana Reddy Kalluru data.size = sizeof(struct dcbx_local_params); 82939651abdSSudarsana Reddy Kalluru qed_memcpy_from(p_hwfn, p_ptt, data.local_admin, data.addr, data.size); 83039651abdSSudarsana Reddy Kalluru 83139651abdSSudarsana Reddy Kalluru return rc; 83239651abdSSudarsana Reddy Kalluru } 83339651abdSSudarsana Reddy Kalluru 83439651abdSSudarsana Reddy Kalluru static int qed_dcbx_read_mib(struct qed_hwfn *p_hwfn, 83539651abdSSudarsana Reddy Kalluru struct qed_ptt *p_ptt, enum qed_mib_read_type type) 83639651abdSSudarsana Reddy Kalluru { 83739651abdSSudarsana Reddy Kalluru int rc = -EINVAL; 83839651abdSSudarsana Reddy Kalluru 83939651abdSSudarsana Reddy Kalluru switch (type) { 84039651abdSSudarsana Reddy Kalluru case QED_DCBX_OPERATIONAL_MIB: 84139651abdSSudarsana Reddy Kalluru rc = qed_dcbx_read_operational_mib(p_hwfn, p_ptt, type); 84239651abdSSudarsana Reddy Kalluru break; 84339651abdSSudarsana Reddy Kalluru case QED_DCBX_REMOTE_MIB: 84439651abdSSudarsana Reddy Kalluru rc = qed_dcbx_read_remote_mib(p_hwfn, p_ptt, type); 84539651abdSSudarsana Reddy Kalluru break; 84639651abdSSudarsana Reddy Kalluru case QED_DCBX_LOCAL_MIB: 84739651abdSSudarsana Reddy Kalluru rc = qed_dcbx_read_local_mib(p_hwfn, p_ptt); 84839651abdSSudarsana Reddy Kalluru break; 84939651abdSSudarsana Reddy Kalluru case QED_DCBX_REMOTE_LLDP_MIB: 85039651abdSSudarsana Reddy Kalluru rc = qed_dcbx_read_remote_lldp_mib(p_hwfn, p_ptt, type); 85139651abdSSudarsana Reddy Kalluru break; 85239651abdSSudarsana Reddy Kalluru case QED_DCBX_LOCAL_LLDP_MIB: 85339651abdSSudarsana Reddy Kalluru rc = qed_dcbx_read_local_lldp_mib(p_hwfn, p_ptt); 85439651abdSSudarsana Reddy Kalluru break; 85539651abdSSudarsana Reddy Kalluru default: 85639651abdSSudarsana Reddy Kalluru DP_ERR(p_hwfn, "MIB read err, unknown mib type %d\n", type); 85739651abdSSudarsana Reddy Kalluru } 85839651abdSSudarsana Reddy Kalluru 85939651abdSSudarsana Reddy Kalluru return rc; 86039651abdSSudarsana Reddy Kalluru } 86139651abdSSudarsana Reddy Kalluru 8621e128c81SArun Easi void qed_dcbx_aen(struct qed_hwfn *hwfn, u32 mib_type) 8631e128c81SArun Easi { 8641e128c81SArun Easi struct qed_common_cb_ops *op = hwfn->cdev->protocol_ops.common; 8651e128c81SArun Easi void *cookie = hwfn->cdev->ops_cookie; 8661e128c81SArun Easi 8671e128c81SArun Easi if (cookie && op->dcbx_aen) 8681e128c81SArun Easi op->dcbx_aen(cookie, &hwfn->p_dcbx_info->get, mib_type); 8691e128c81SArun Easi } 8701e128c81SArun Easi 87139651abdSSudarsana Reddy Kalluru /* Read updated MIB. 87239651abdSSudarsana Reddy Kalluru * Reconfigure QM and invoke PF update ramrod command if operational MIB 87339651abdSSudarsana Reddy Kalluru * change is detected. 87439651abdSSudarsana Reddy Kalluru */ 87539651abdSSudarsana Reddy Kalluru int 87639651abdSSudarsana Reddy Kalluru qed_dcbx_mib_update_event(struct qed_hwfn *p_hwfn, 87739651abdSSudarsana Reddy Kalluru struct qed_ptt *p_ptt, enum qed_mib_read_type type) 87839651abdSSudarsana Reddy Kalluru { 87939651abdSSudarsana Reddy Kalluru int rc = 0; 88039651abdSSudarsana Reddy Kalluru 88139651abdSSudarsana Reddy Kalluru rc = qed_dcbx_read_mib(p_hwfn, p_ptt, type); 88239651abdSSudarsana Reddy Kalluru if (rc) 88339651abdSSudarsana Reddy Kalluru return rc; 88439651abdSSudarsana Reddy Kalluru 88539651abdSSudarsana Reddy Kalluru if (type == QED_DCBX_OPERATIONAL_MIB) { 88639651abdSSudarsana Reddy Kalluru rc = qed_dcbx_process_mib_info(p_hwfn); 88739651abdSSudarsana Reddy Kalluru if (!rc) { 88839651abdSSudarsana Reddy Kalluru /* reconfigure tcs of QM queues according 88939651abdSSudarsana Reddy Kalluru * to negotiation results 89039651abdSSudarsana Reddy Kalluru */ 89139651abdSSudarsana Reddy Kalluru qed_qm_reconf(p_hwfn, p_ptt); 89239651abdSSudarsana Reddy Kalluru 89339651abdSSudarsana Reddy Kalluru /* update storm FW with negotiation results */ 89439651abdSSudarsana Reddy Kalluru qed_sp_pf_update(p_hwfn); 89539651abdSSudarsana Reddy Kalluru } 89639651abdSSudarsana Reddy Kalluru } 897270837b3Ssudarsana.kalluru@cavium.com 898270837b3Ssudarsana.kalluru@cavium.com qed_dcbx_get_params(p_hwfn, &p_hwfn->p_dcbx_info->get, type); 89926462ad9SMintz, Yuval 90026462ad9SMintz, Yuval if (type == QED_DCBX_OPERATIONAL_MIB) { 90126462ad9SMintz, Yuval struct qed_dcbx_results *p_data; 90226462ad9SMintz, Yuval u16 val; 90326462ad9SMintz, Yuval 90426462ad9SMintz, Yuval /* Configure in NIG which protocols support EDPM and should 90526462ad9SMintz, Yuval * honor PFC. 90626462ad9SMintz, Yuval */ 90726462ad9SMintz, Yuval p_data = &p_hwfn->p_dcbx_info->results; 90826462ad9SMintz, Yuval val = (0x1 << p_data->arr[DCBX_PROTOCOL_ROCE].tc) | 90926462ad9SMintz, Yuval (0x1 << p_data->arr[DCBX_PROTOCOL_ROCE_V2].tc); 91026462ad9SMintz, Yuval val <<= NIG_REG_TX_EDPM_CTRL_TX_EDPM_TC_EN_SHIFT; 91126462ad9SMintz, Yuval val |= NIG_REG_TX_EDPM_CTRL_TX_EDPM_EN; 91226462ad9SMintz, Yuval qed_wr(p_hwfn, p_ptt, NIG_REG_TX_EDPM_CTRL, val); 91326462ad9SMintz, Yuval } 91426462ad9SMintz, Yuval 9151e128c81SArun Easi qed_dcbx_aen(p_hwfn, type); 91639651abdSSudarsana Reddy Kalluru 91739651abdSSudarsana Reddy Kalluru return rc; 91839651abdSSudarsana Reddy Kalluru } 91939651abdSSudarsana Reddy Kalluru 92039651abdSSudarsana Reddy Kalluru int qed_dcbx_info_alloc(struct qed_hwfn *p_hwfn) 92139651abdSSudarsana Reddy Kalluru { 92239651abdSSudarsana Reddy Kalluru p_hwfn->p_dcbx_info = kzalloc(sizeof(*p_hwfn->p_dcbx_info), GFP_KERNEL); 9232591c280SJoe Perches if (!p_hwfn->p_dcbx_info) 924270837b3Ssudarsana.kalluru@cavium.com return -ENOMEM; 92539651abdSSudarsana Reddy Kalluru 926270837b3Ssudarsana.kalluru@cavium.com return 0; 92739651abdSSudarsana Reddy Kalluru } 92839651abdSSudarsana Reddy Kalluru 929270837b3Ssudarsana.kalluru@cavium.com void qed_dcbx_info_free(struct qed_hwfn *p_hwfn) 93039651abdSSudarsana Reddy Kalluru { 93139651abdSSudarsana Reddy Kalluru kfree(p_hwfn->p_dcbx_info); 9323587cb87STomer Tayar p_hwfn->p_dcbx_info = NULL; 93339651abdSSudarsana Reddy Kalluru } 93439651abdSSudarsana Reddy Kalluru 93539651abdSSudarsana Reddy Kalluru static void qed_dcbx_update_protocol_data(struct protocol_dcb_data *p_data, 93639651abdSSudarsana Reddy Kalluru struct qed_dcbx_results *p_src, 93739651abdSSudarsana Reddy Kalluru enum dcbx_protocol_type type) 93839651abdSSudarsana Reddy Kalluru { 93939651abdSSudarsana Reddy Kalluru p_data->dcb_enable_flag = p_src->arr[type].enable; 94039651abdSSudarsana Reddy Kalluru p_data->dcb_priority = p_src->arr[type].priority; 94139651abdSSudarsana Reddy Kalluru p_data->dcb_tc = p_src->arr[type].tc; 94239651abdSSudarsana Reddy Kalluru } 94339651abdSSudarsana Reddy Kalluru 94439651abdSSudarsana Reddy Kalluru /* Set pf update ramrod command params */ 94539651abdSSudarsana Reddy Kalluru void qed_dcbx_set_pf_update_params(struct qed_dcbx_results *p_src, 94639651abdSSudarsana Reddy Kalluru struct pf_update_ramrod_data *p_dest) 94739651abdSSudarsana Reddy Kalluru { 94839651abdSSudarsana Reddy Kalluru struct protocol_dcb_data *p_dcb_data; 94939651abdSSudarsana Reddy Kalluru bool update_flag = false; 95039651abdSSudarsana Reddy Kalluru 95139651abdSSudarsana Reddy Kalluru p_dest->pf_id = p_src->pf_id; 95239651abdSSudarsana Reddy Kalluru 95339651abdSSudarsana Reddy Kalluru update_flag = p_src->arr[DCBX_PROTOCOL_FCOE].update; 9547b6859fbSMintz, Yuval p_dest->update_fcoe_dcb_data_mode = update_flag; 95539651abdSSudarsana Reddy Kalluru 95639651abdSSudarsana Reddy Kalluru update_flag = p_src->arr[DCBX_PROTOCOL_ROCE].update; 9577b6859fbSMintz, Yuval p_dest->update_roce_dcb_data_mode = update_flag; 9587b6859fbSMintz, Yuval 95939651abdSSudarsana Reddy Kalluru update_flag = p_src->arr[DCBX_PROTOCOL_ROCE_V2].update; 9607b6859fbSMintz, Yuval p_dest->update_rroce_dcb_data_mode = update_flag; 96139651abdSSudarsana Reddy Kalluru 96239651abdSSudarsana Reddy Kalluru update_flag = p_src->arr[DCBX_PROTOCOL_ISCSI].update; 9637b6859fbSMintz, Yuval p_dest->update_iscsi_dcb_data_mode = update_flag; 96439651abdSSudarsana Reddy Kalluru update_flag = p_src->arr[DCBX_PROTOCOL_ETH].update; 9657b6859fbSMintz, Yuval p_dest->update_eth_dcb_data_mode = update_flag; 96639651abdSSudarsana Reddy Kalluru 96739651abdSSudarsana Reddy Kalluru p_dcb_data = &p_dest->fcoe_dcb_data; 96839651abdSSudarsana Reddy Kalluru qed_dcbx_update_protocol_data(p_dcb_data, p_src, DCBX_PROTOCOL_FCOE); 96939651abdSSudarsana Reddy Kalluru p_dcb_data = &p_dest->roce_dcb_data; 970449ad505Ssudarsana.kalluru@cavium.com qed_dcbx_update_protocol_data(p_dcb_data, p_src, DCBX_PROTOCOL_ROCE); 971449ad505Ssudarsana.kalluru@cavium.com p_dcb_data = &p_dest->rroce_dcb_data; 972449ad505Ssudarsana.kalluru@cavium.com qed_dcbx_update_protocol_data(p_dcb_data, p_src, DCBX_PROTOCOL_ROCE_V2); 97339651abdSSudarsana Reddy Kalluru p_dcb_data = &p_dest->iscsi_dcb_data; 97439651abdSSudarsana Reddy Kalluru qed_dcbx_update_protocol_data(p_dcb_data, p_src, DCBX_PROTOCOL_ISCSI); 97539651abdSSudarsana Reddy Kalluru p_dcb_data = &p_dest->eth_dcb_data; 97639651abdSSudarsana Reddy Kalluru qed_dcbx_update_protocol_data(p_dcb_data, p_src, DCBX_PROTOCOL_ETH); 97739651abdSSudarsana Reddy Kalluru } 9786ad8c632SSudarsana Reddy Kalluru 9796ad8c632SSudarsana Reddy Kalluru #ifdef CONFIG_DCB 9806ad8c632SSudarsana Reddy Kalluru static int qed_dcbx_query_params(struct qed_hwfn *p_hwfn, 9816ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_get *p_get, 9826ad8c632SSudarsana Reddy Kalluru enum qed_mib_read_type type) 9836ad8c632SSudarsana Reddy Kalluru { 9846ad8c632SSudarsana Reddy Kalluru struct qed_ptt *p_ptt; 9856ad8c632SSudarsana Reddy Kalluru int rc; 9866ad8c632SSudarsana Reddy Kalluru 9875fe118c9SSudarsana Reddy Kalluru if (IS_VF(p_hwfn->cdev)) 9885fe118c9SSudarsana Reddy Kalluru return -EINVAL; 9895fe118c9SSudarsana Reddy Kalluru 9906ad8c632SSudarsana Reddy Kalluru p_ptt = qed_ptt_acquire(p_hwfn); 9916ad8c632SSudarsana Reddy Kalluru if (!p_ptt) 9926ad8c632SSudarsana Reddy Kalluru return -EBUSY; 9936ad8c632SSudarsana Reddy Kalluru 9946ad8c632SSudarsana Reddy Kalluru rc = qed_dcbx_read_mib(p_hwfn, p_ptt, type); 9956ad8c632SSudarsana Reddy Kalluru if (rc) 9966ad8c632SSudarsana Reddy Kalluru goto out; 9976ad8c632SSudarsana Reddy Kalluru 998270837b3Ssudarsana.kalluru@cavium.com rc = qed_dcbx_get_params(p_hwfn, p_get, type); 9996ad8c632SSudarsana Reddy Kalluru 10006ad8c632SSudarsana Reddy Kalluru out: 10016ad8c632SSudarsana Reddy Kalluru qed_ptt_release(p_hwfn, p_ptt); 10026ad8c632SSudarsana Reddy Kalluru return rc; 10036ad8c632SSudarsana Reddy Kalluru } 10046ad8c632SSudarsana Reddy Kalluru 10056ad8c632SSudarsana Reddy Kalluru static void 10066ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_pfc_data(struct qed_hwfn *p_hwfn, 10076ad8c632SSudarsana Reddy Kalluru u32 *pfc, struct qed_dcbx_params *p_params) 10086ad8c632SSudarsana Reddy Kalluru { 10096ad8c632SSudarsana Reddy Kalluru u8 pfc_map = 0; 10106ad8c632SSudarsana Reddy Kalluru int i; 10116ad8c632SSudarsana Reddy Kalluru 10126cf75f1cSsudarsana.kalluru@cavium.com *pfc &= ~DCBX_PFC_ERROR_MASK; 10136cf75f1cSsudarsana.kalluru@cavium.com 10146ad8c632SSudarsana Reddy Kalluru if (p_params->pfc.willing) 10156ad8c632SSudarsana Reddy Kalluru *pfc |= DCBX_PFC_WILLING_MASK; 10166ad8c632SSudarsana Reddy Kalluru else 10176ad8c632SSudarsana Reddy Kalluru *pfc &= ~DCBX_PFC_WILLING_MASK; 10186ad8c632SSudarsana Reddy Kalluru 10196ad8c632SSudarsana Reddy Kalluru if (p_params->pfc.enabled) 10206ad8c632SSudarsana Reddy Kalluru *pfc |= DCBX_PFC_ENABLED_MASK; 10216ad8c632SSudarsana Reddy Kalluru else 10226ad8c632SSudarsana Reddy Kalluru *pfc &= ~DCBX_PFC_ENABLED_MASK; 10236ad8c632SSudarsana Reddy Kalluru 10246ad8c632SSudarsana Reddy Kalluru *pfc &= ~DCBX_PFC_CAPS_MASK; 10256ad8c632SSudarsana Reddy Kalluru *pfc |= (u32)p_params->pfc.max_tc << DCBX_PFC_CAPS_SHIFT; 10266ad8c632SSudarsana Reddy Kalluru 10276ad8c632SSudarsana Reddy Kalluru for (i = 0; i < QED_MAX_PFC_PRIORITIES; i++) 10286ad8c632SSudarsana Reddy Kalluru if (p_params->pfc.prio[i]) 10296ad8c632SSudarsana Reddy Kalluru pfc_map |= BIT(i); 10306ad8c632SSudarsana Reddy Kalluru 1031c5e801daSSudarsana Reddy Kalluru *pfc &= ~DCBX_PFC_PRI_EN_BITMAP_MASK; 10326ad8c632SSudarsana Reddy Kalluru *pfc |= (pfc_map << DCBX_PFC_PRI_EN_BITMAP_SHIFT); 10336ad8c632SSudarsana Reddy Kalluru 10346ad8c632SSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, "pfc = 0x%x\n", *pfc); 10356ad8c632SSudarsana Reddy Kalluru } 10366ad8c632SSudarsana Reddy Kalluru 10376ad8c632SSudarsana Reddy Kalluru static void 10386ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_ets_data(struct qed_hwfn *p_hwfn, 10396ad8c632SSudarsana Reddy Kalluru struct dcbx_ets_feature *p_ets, 10406ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_params *p_params) 10416ad8c632SSudarsana Reddy Kalluru { 10426ad8c632SSudarsana Reddy Kalluru u8 *bw_map, *tsa_map; 10436ad8c632SSudarsana Reddy Kalluru u32 val; 10446ad8c632SSudarsana Reddy Kalluru int i; 10456ad8c632SSudarsana Reddy Kalluru 10466ad8c632SSudarsana Reddy Kalluru if (p_params->ets_willing) 10476ad8c632SSudarsana Reddy Kalluru p_ets->flags |= DCBX_ETS_WILLING_MASK; 10486ad8c632SSudarsana Reddy Kalluru else 10496ad8c632SSudarsana Reddy Kalluru p_ets->flags &= ~DCBX_ETS_WILLING_MASK; 10506ad8c632SSudarsana Reddy Kalluru 10516ad8c632SSudarsana Reddy Kalluru if (p_params->ets_cbs) 10526ad8c632SSudarsana Reddy Kalluru p_ets->flags |= DCBX_ETS_CBS_MASK; 10536ad8c632SSudarsana Reddy Kalluru else 10546ad8c632SSudarsana Reddy Kalluru p_ets->flags &= ~DCBX_ETS_CBS_MASK; 10556ad8c632SSudarsana Reddy Kalluru 10566ad8c632SSudarsana Reddy Kalluru if (p_params->ets_enabled) 10576ad8c632SSudarsana Reddy Kalluru p_ets->flags |= DCBX_ETS_ENABLED_MASK; 10586ad8c632SSudarsana Reddy Kalluru else 10596ad8c632SSudarsana Reddy Kalluru p_ets->flags &= ~DCBX_ETS_ENABLED_MASK; 10606ad8c632SSudarsana Reddy Kalluru 10616ad8c632SSudarsana Reddy Kalluru p_ets->flags &= ~DCBX_ETS_MAX_TCS_MASK; 10626ad8c632SSudarsana Reddy Kalluru p_ets->flags |= (u32)p_params->max_ets_tc << DCBX_ETS_MAX_TCS_SHIFT; 10636ad8c632SSudarsana Reddy Kalluru 10646ad8c632SSudarsana Reddy Kalluru bw_map = (u8 *)&p_ets->tc_bw_tbl[0]; 10656ad8c632SSudarsana Reddy Kalluru tsa_map = (u8 *)&p_ets->tc_tsa_tbl[0]; 10666ad8c632SSudarsana Reddy Kalluru p_ets->pri_tc_tbl[0] = 0; 10676ad8c632SSudarsana Reddy Kalluru for (i = 0; i < QED_MAX_PFC_PRIORITIES; i++) { 10686ad8c632SSudarsana Reddy Kalluru bw_map[i] = p_params->ets_tc_bw_tbl[i]; 10696ad8c632SSudarsana Reddy Kalluru tsa_map[i] = p_params->ets_tc_tsa_tbl[i]; 10706ad8c632SSudarsana Reddy Kalluru /* Copy the priority value to the corresponding 4 bits in the 10716ad8c632SSudarsana Reddy Kalluru * traffic class table. 10726ad8c632SSudarsana Reddy Kalluru */ 10736ad8c632SSudarsana Reddy Kalluru val = (((u32)p_params->ets_pri_tc_tbl[i]) << ((7 - i) * 4)); 10746ad8c632SSudarsana Reddy Kalluru p_ets->pri_tc_tbl[0] |= val; 10756ad8c632SSudarsana Reddy Kalluru } 10766ad8c632SSudarsana Reddy Kalluru for (i = 0; i < 2; i++) { 10776ad8c632SSudarsana Reddy Kalluru p_ets->tc_bw_tbl[i] = cpu_to_be32(p_ets->tc_bw_tbl[i]); 10786ad8c632SSudarsana Reddy Kalluru p_ets->tc_tsa_tbl[i] = cpu_to_be32(p_ets->tc_tsa_tbl[i]); 10796ad8c632SSudarsana Reddy Kalluru } 10806ad8c632SSudarsana Reddy Kalluru } 10816ad8c632SSudarsana Reddy Kalluru 10826ad8c632SSudarsana Reddy Kalluru static void 10836ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_app_data(struct qed_hwfn *p_hwfn, 10846ad8c632SSudarsana Reddy Kalluru struct dcbx_app_priority_feature *p_app, 108559bcb797SSudarsana Reddy Kalluru struct qed_dcbx_params *p_params, bool ieee) 10866ad8c632SSudarsana Reddy Kalluru { 10876ad8c632SSudarsana Reddy Kalluru u32 *entry; 10886ad8c632SSudarsana Reddy Kalluru int i; 10896ad8c632SSudarsana Reddy Kalluru 10906ad8c632SSudarsana Reddy Kalluru if (p_params->app_willing) 10916ad8c632SSudarsana Reddy Kalluru p_app->flags |= DCBX_APP_WILLING_MASK; 10926ad8c632SSudarsana Reddy Kalluru else 10936ad8c632SSudarsana Reddy Kalluru p_app->flags &= ~DCBX_APP_WILLING_MASK; 10946ad8c632SSudarsana Reddy Kalluru 10956ad8c632SSudarsana Reddy Kalluru if (p_params->app_valid) 10966ad8c632SSudarsana Reddy Kalluru p_app->flags |= DCBX_APP_ENABLED_MASK; 10976ad8c632SSudarsana Reddy Kalluru else 10986ad8c632SSudarsana Reddy Kalluru p_app->flags &= ~DCBX_APP_ENABLED_MASK; 10996ad8c632SSudarsana Reddy Kalluru 11006ad8c632SSudarsana Reddy Kalluru p_app->flags &= ~DCBX_APP_NUM_ENTRIES_MASK; 11016ad8c632SSudarsana Reddy Kalluru p_app->flags |= (u32)p_params->num_app_entries << 11026ad8c632SSudarsana Reddy Kalluru DCBX_APP_NUM_ENTRIES_SHIFT; 11036ad8c632SSudarsana Reddy Kalluru 11046ad8c632SSudarsana Reddy Kalluru for (i = 0; i < DCBX_MAX_APP_PROTOCOL; i++) { 11056ad8c632SSudarsana Reddy Kalluru entry = &p_app->app_pri_tbl[i].entry; 1106c5e801daSSudarsana Reddy Kalluru *entry = 0; 110759bcb797SSudarsana Reddy Kalluru if (ieee) { 11085ec5dfa4SSudarsana Reddy Kalluru *entry &= ~(DCBX_APP_SF_IEEE_MASK | DCBX_APP_SF_MASK); 110959bcb797SSudarsana Reddy Kalluru switch (p_params->app_entry[i].sf_ieee) { 111059bcb797SSudarsana Reddy Kalluru case QED_DCBX_SF_IEEE_ETHTYPE: 111159bcb797SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_IEEE_ETHTYPE << 111259bcb797SSudarsana Reddy Kalluru DCBX_APP_SF_IEEE_SHIFT); 11135ec5dfa4SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_ETHTYPE << 11145ec5dfa4SSudarsana Reddy Kalluru DCBX_APP_SF_SHIFT); 111559bcb797SSudarsana Reddy Kalluru break; 111659bcb797SSudarsana Reddy Kalluru case QED_DCBX_SF_IEEE_TCP_PORT: 111759bcb797SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_IEEE_TCP_PORT << 111859bcb797SSudarsana Reddy Kalluru DCBX_APP_SF_IEEE_SHIFT); 11195ec5dfa4SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_PORT << 11205ec5dfa4SSudarsana Reddy Kalluru DCBX_APP_SF_SHIFT); 112159bcb797SSudarsana Reddy Kalluru break; 112259bcb797SSudarsana Reddy Kalluru case QED_DCBX_SF_IEEE_UDP_PORT: 112359bcb797SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_IEEE_UDP_PORT << 112459bcb797SSudarsana Reddy Kalluru DCBX_APP_SF_IEEE_SHIFT); 11255ec5dfa4SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_PORT << 11265ec5dfa4SSudarsana Reddy Kalluru DCBX_APP_SF_SHIFT); 112759bcb797SSudarsana Reddy Kalluru break; 112859bcb797SSudarsana Reddy Kalluru case QED_DCBX_SF_IEEE_TCP_UDP_PORT: 112959bcb797SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_IEEE_TCP_UDP_PORT << 113059bcb797SSudarsana Reddy Kalluru DCBX_APP_SF_IEEE_SHIFT); 11315ec5dfa4SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_PORT << 11325ec5dfa4SSudarsana Reddy Kalluru DCBX_APP_SF_SHIFT); 113359bcb797SSudarsana Reddy Kalluru break; 113459bcb797SSudarsana Reddy Kalluru } 113559bcb797SSudarsana Reddy Kalluru } else { 11366ad8c632SSudarsana Reddy Kalluru *entry &= ~DCBX_APP_SF_MASK; 11376ad8c632SSudarsana Reddy Kalluru if (p_params->app_entry[i].ethtype) 11386ad8c632SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_ETHTYPE << 11396ad8c632SSudarsana Reddy Kalluru DCBX_APP_SF_SHIFT); 11406ad8c632SSudarsana Reddy Kalluru else 114159bcb797SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_PORT << 114259bcb797SSudarsana Reddy Kalluru DCBX_APP_SF_SHIFT); 114359bcb797SSudarsana Reddy Kalluru } 114459bcb797SSudarsana Reddy Kalluru 11456ad8c632SSudarsana Reddy Kalluru *entry &= ~DCBX_APP_PROTOCOL_ID_MASK; 11466ad8c632SSudarsana Reddy Kalluru *entry |= ((u32)p_params->app_entry[i].proto_id << 11476ad8c632SSudarsana Reddy Kalluru DCBX_APP_PROTOCOL_ID_SHIFT); 11486ad8c632SSudarsana Reddy Kalluru *entry &= ~DCBX_APP_PRI_MAP_MASK; 11496ad8c632SSudarsana Reddy Kalluru *entry |= ((u32)(p_params->app_entry[i].prio) << 11506ad8c632SSudarsana Reddy Kalluru DCBX_APP_PRI_MAP_SHIFT); 11516ad8c632SSudarsana Reddy Kalluru } 11526ad8c632SSudarsana Reddy Kalluru } 11536ad8c632SSudarsana Reddy Kalluru 11546ad8c632SSudarsana Reddy Kalluru static void 11556ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_local_params(struct qed_hwfn *p_hwfn, 11566ad8c632SSudarsana Reddy Kalluru struct dcbx_local_params *local_admin, 11576ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_set *params) 11586ad8c632SSudarsana Reddy Kalluru { 115959bcb797SSudarsana Reddy Kalluru bool ieee = false; 116059bcb797SSudarsana Reddy Kalluru 11616ad8c632SSudarsana Reddy Kalluru local_admin->flags = 0; 11626ad8c632SSudarsana Reddy Kalluru memcpy(&local_admin->features, 11636ad8c632SSudarsana Reddy Kalluru &p_hwfn->p_dcbx_info->operational.features, 11646ad8c632SSudarsana Reddy Kalluru sizeof(local_admin->features)); 11656ad8c632SSudarsana Reddy Kalluru 116659bcb797SSudarsana Reddy Kalluru if (params->enabled) { 11676ad8c632SSudarsana Reddy Kalluru local_admin->config = params->ver_num; 116859bcb797SSudarsana Reddy Kalluru ieee = !!(params->ver_num & DCBX_CONFIG_VERSION_IEEE); 116959bcb797SSudarsana Reddy Kalluru } else { 11706ad8c632SSudarsana Reddy Kalluru local_admin->config = DCBX_CONFIG_VERSION_DISABLED; 117159bcb797SSudarsana Reddy Kalluru } 11726ad8c632SSudarsana Reddy Kalluru 1173dfbeb85fSsudarsana.kalluru@cavium.com DP_VERBOSE(p_hwfn, QED_MSG_DCB, "Dcbx version = %d\n", 1174dfbeb85fSsudarsana.kalluru@cavium.com local_admin->config); 1175dfbeb85fSsudarsana.kalluru@cavium.com 11766ad8c632SSudarsana Reddy Kalluru if (params->override_flags & QED_DCBX_OVERRIDE_PFC_CFG) 11776ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_pfc_data(p_hwfn, &local_admin->features.pfc, 11786ad8c632SSudarsana Reddy Kalluru ¶ms->config.params); 11796ad8c632SSudarsana Reddy Kalluru 11806ad8c632SSudarsana Reddy Kalluru if (params->override_flags & QED_DCBX_OVERRIDE_ETS_CFG) 11816ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_ets_data(p_hwfn, &local_admin->features.ets, 11826ad8c632SSudarsana Reddy Kalluru ¶ms->config.params); 11836ad8c632SSudarsana Reddy Kalluru 11846ad8c632SSudarsana Reddy Kalluru if (params->override_flags & QED_DCBX_OVERRIDE_APP_CFG) 11856ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_app_data(p_hwfn, &local_admin->features.app, 118659bcb797SSudarsana Reddy Kalluru ¶ms->config.params, ieee); 11876ad8c632SSudarsana Reddy Kalluru } 11886ad8c632SSudarsana Reddy Kalluru 11896ad8c632SSudarsana Reddy Kalluru int qed_dcbx_config_params(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, 11906ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_set *params, bool hw_commit) 11916ad8c632SSudarsana Reddy Kalluru { 11926ad8c632SSudarsana Reddy Kalluru struct dcbx_local_params local_admin; 11936ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_mib_meta_data data; 11946ad8c632SSudarsana Reddy Kalluru u32 resp = 0, param = 0; 11956ad8c632SSudarsana Reddy Kalluru int rc = 0; 11966ad8c632SSudarsana Reddy Kalluru 11976ad8c632SSudarsana Reddy Kalluru if (!hw_commit) { 11986ad8c632SSudarsana Reddy Kalluru memcpy(&p_hwfn->p_dcbx_info->set, params, 11996ad8c632SSudarsana Reddy Kalluru sizeof(struct qed_dcbx_set)); 12006ad8c632SSudarsana Reddy Kalluru return 0; 12016ad8c632SSudarsana Reddy Kalluru } 12026ad8c632SSudarsana Reddy Kalluru 12036ad8c632SSudarsana Reddy Kalluru /* clear set-parmas cache */ 12046ad8c632SSudarsana Reddy Kalluru memset(&p_hwfn->p_dcbx_info->set, 0, sizeof(p_hwfn->p_dcbx_info->set)); 12056ad8c632SSudarsana Reddy Kalluru 12066ad8c632SSudarsana Reddy Kalluru memset(&local_admin, 0, sizeof(local_admin)); 12076ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_local_params(p_hwfn, &local_admin, params); 12086ad8c632SSudarsana Reddy Kalluru 12096ad8c632SSudarsana Reddy Kalluru data.addr = p_hwfn->mcp_info->port_addr + 12106ad8c632SSudarsana Reddy Kalluru offsetof(struct public_port, local_admin_dcbx_mib); 12116ad8c632SSudarsana Reddy Kalluru data.local_admin = &local_admin; 12126ad8c632SSudarsana Reddy Kalluru data.size = sizeof(struct dcbx_local_params); 12136ad8c632SSudarsana Reddy Kalluru qed_memcpy_to(p_hwfn, p_ptt, data.addr, data.local_admin, data.size); 12146ad8c632SSudarsana Reddy Kalluru 12156ad8c632SSudarsana Reddy Kalluru rc = qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_SET_DCBX, 12166ad8c632SSudarsana Reddy Kalluru 1 << DRV_MB_PARAM_LLDP_SEND_SHIFT, &resp, ¶m); 12176ad8c632SSudarsana Reddy Kalluru if (rc) 12186ad8c632SSudarsana Reddy Kalluru DP_NOTICE(p_hwfn, "Failed to send DCBX update request\n"); 12196ad8c632SSudarsana Reddy Kalluru 12206ad8c632SSudarsana Reddy Kalluru return rc; 12216ad8c632SSudarsana Reddy Kalluru } 12226ad8c632SSudarsana Reddy Kalluru 12236ad8c632SSudarsana Reddy Kalluru int qed_dcbx_get_config_params(struct qed_hwfn *p_hwfn, 12246ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_set *params) 12256ad8c632SSudarsana Reddy Kalluru { 12266ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 12276ad8c632SSudarsana Reddy Kalluru int rc; 12286ad8c632SSudarsana Reddy Kalluru 12296ad8c632SSudarsana Reddy Kalluru if (p_hwfn->p_dcbx_info->set.config.valid) { 12306ad8c632SSudarsana Reddy Kalluru memcpy(params, &p_hwfn->p_dcbx_info->set, 12316ad8c632SSudarsana Reddy Kalluru sizeof(struct qed_dcbx_set)); 12326ad8c632SSudarsana Reddy Kalluru return 0; 12336ad8c632SSudarsana Reddy Kalluru } 12346ad8c632SSudarsana Reddy Kalluru 1235561ed233SWu Fengguang dcbx_info = kzalloc(sizeof(*dcbx_info), GFP_KERNEL); 12362591c280SJoe Perches if (!dcbx_info) 12376ad8c632SSudarsana Reddy Kalluru return -ENOMEM; 12386ad8c632SSudarsana Reddy Kalluru 123915c6de2cSSudarsana Reddy Kalluru memset(dcbx_info, 0, sizeof(*dcbx_info)); 12406ad8c632SSudarsana Reddy Kalluru rc = qed_dcbx_query_params(p_hwfn, dcbx_info, QED_DCBX_OPERATIONAL_MIB); 12416ad8c632SSudarsana Reddy Kalluru if (rc) { 12426ad8c632SSudarsana Reddy Kalluru kfree(dcbx_info); 12436ad8c632SSudarsana Reddy Kalluru return rc; 12446ad8c632SSudarsana Reddy Kalluru } 12456ad8c632SSudarsana Reddy Kalluru 12466ad8c632SSudarsana Reddy Kalluru p_hwfn->p_dcbx_info->set.override_flags = 0; 12476ad8c632SSudarsana Reddy Kalluru p_hwfn->p_dcbx_info->set.ver_num = DCBX_CONFIG_VERSION_DISABLED; 12486ad8c632SSudarsana Reddy Kalluru if (dcbx_info->operational.cee) 12496ad8c632SSudarsana Reddy Kalluru p_hwfn->p_dcbx_info->set.ver_num |= DCBX_CONFIG_VERSION_CEE; 12506ad8c632SSudarsana Reddy Kalluru if (dcbx_info->operational.ieee) 12516ad8c632SSudarsana Reddy Kalluru p_hwfn->p_dcbx_info->set.ver_num |= DCBX_CONFIG_VERSION_IEEE; 125249632b58Ssudarsana.kalluru@cavium.com if (dcbx_info->operational.local) 125349632b58Ssudarsana.kalluru@cavium.com p_hwfn->p_dcbx_info->set.ver_num |= DCBX_CONFIG_VERSION_STATIC; 12546ad8c632SSudarsana Reddy Kalluru 12556ad8c632SSudarsana Reddy Kalluru p_hwfn->p_dcbx_info->set.enabled = dcbx_info->operational.enabled; 12566ad8c632SSudarsana Reddy Kalluru memcpy(&p_hwfn->p_dcbx_info->set.config.params, 12576ad8c632SSudarsana Reddy Kalluru &dcbx_info->operational.params, 12586ad8c632SSudarsana Reddy Kalluru sizeof(struct qed_dcbx_admin_params)); 12596ad8c632SSudarsana Reddy Kalluru p_hwfn->p_dcbx_info->set.config.valid = true; 12606ad8c632SSudarsana Reddy Kalluru 12616ad8c632SSudarsana Reddy Kalluru memcpy(params, &p_hwfn->p_dcbx_info->set, sizeof(struct qed_dcbx_set)); 12626ad8c632SSudarsana Reddy Kalluru 12636ad8c632SSudarsana Reddy Kalluru kfree(dcbx_info); 12646ad8c632SSudarsana Reddy Kalluru 12656ad8c632SSudarsana Reddy Kalluru return 0; 12666ad8c632SSudarsana Reddy Kalluru } 1267a1d8d8a5SSudarsana Reddy Kalluru 1268a1d8d8a5SSudarsana Reddy Kalluru static struct qed_dcbx_get *qed_dcbnl_get_dcbx(struct qed_hwfn *hwfn, 1269a1d8d8a5SSudarsana Reddy Kalluru enum qed_mib_read_type type) 1270a1d8d8a5SSudarsana Reddy Kalluru { 1271a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1272a1d8d8a5SSudarsana Reddy Kalluru 127362289ba2Ssudarsana.kalluru@cavium.com dcbx_info = kmalloc(sizeof(*dcbx_info), GFP_ATOMIC); 12742591c280SJoe Perches if (!dcbx_info) 1275a1d8d8a5SSudarsana Reddy Kalluru return NULL; 1276a1d8d8a5SSudarsana Reddy Kalluru 127715c6de2cSSudarsana Reddy Kalluru memset(dcbx_info, 0, sizeof(*dcbx_info)); 1278a1d8d8a5SSudarsana Reddy Kalluru if (qed_dcbx_query_params(hwfn, dcbx_info, type)) { 1279a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1280a1d8d8a5SSudarsana Reddy Kalluru return NULL; 1281a1d8d8a5SSudarsana Reddy Kalluru } 1282a1d8d8a5SSudarsana Reddy Kalluru 1283a1d8d8a5SSudarsana Reddy Kalluru if ((type == QED_DCBX_OPERATIONAL_MIB) && 1284a1d8d8a5SSudarsana Reddy Kalluru !dcbx_info->operational.enabled) { 1285a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "DCBX is not enabled/operational\n"); 1286a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1287a1d8d8a5SSudarsana Reddy Kalluru return NULL; 1288a1d8d8a5SSudarsana Reddy Kalluru } 1289a1d8d8a5SSudarsana Reddy Kalluru 1290a1d8d8a5SSudarsana Reddy Kalluru return dcbx_info; 1291a1d8d8a5SSudarsana Reddy Kalluru } 1292a1d8d8a5SSudarsana Reddy Kalluru 1293a1d8d8a5SSudarsana Reddy Kalluru static u8 qed_dcbnl_getstate(struct qed_dev *cdev) 1294a1d8d8a5SSudarsana Reddy Kalluru { 1295a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1296a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1297a1d8d8a5SSudarsana Reddy Kalluru bool enabled; 1298a1d8d8a5SSudarsana Reddy Kalluru 1299a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 1300a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1301a1d8d8a5SSudarsana Reddy Kalluru return 0; 1302a1d8d8a5SSudarsana Reddy Kalluru 1303a1d8d8a5SSudarsana Reddy Kalluru enabled = dcbx_info->operational.enabled; 1304a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "DCB state = %d\n", enabled); 1305a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1306a1d8d8a5SSudarsana Reddy Kalluru 1307a1d8d8a5SSudarsana Reddy Kalluru return enabled; 1308a1d8d8a5SSudarsana Reddy Kalluru } 1309a1d8d8a5SSudarsana Reddy Kalluru 1310a1d8d8a5SSudarsana Reddy Kalluru static u8 qed_dcbnl_setstate(struct qed_dev *cdev, u8 state) 1311a1d8d8a5SSudarsana Reddy Kalluru { 1312a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1313a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 1314a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 1315a1d8d8a5SSudarsana Reddy Kalluru int rc; 1316a1d8d8a5SSudarsana Reddy Kalluru 1317a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "DCB state = %d\n", state); 1318a1d8d8a5SSudarsana Reddy Kalluru 1319a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 1320a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 1321a1d8d8a5SSudarsana Reddy Kalluru if (rc) 1322a1d8d8a5SSudarsana Reddy Kalluru return 1; 1323a1d8d8a5SSudarsana Reddy Kalluru 1324a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.enabled = !!state; 1325a1d8d8a5SSudarsana Reddy Kalluru 1326a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 1327a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 1328a1d8d8a5SSudarsana Reddy Kalluru return 1; 1329a1d8d8a5SSudarsana Reddy Kalluru 1330a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 1331a1d8d8a5SSudarsana Reddy Kalluru 1332a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 1333a1d8d8a5SSudarsana Reddy Kalluru 1334a1d8d8a5SSudarsana Reddy Kalluru return rc ? 1 : 0; 1335a1d8d8a5SSudarsana Reddy Kalluru } 1336a1d8d8a5SSudarsana Reddy Kalluru 1337a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_getpgtccfgtx(struct qed_dev *cdev, int tc, u8 *prio_type, 1338a1d8d8a5SSudarsana Reddy Kalluru u8 *pgid, u8 *bw_pct, u8 *up_map) 1339a1d8d8a5SSudarsana Reddy Kalluru { 1340a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1341a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1342a1d8d8a5SSudarsana Reddy Kalluru 1343a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "tc = %d\n", tc); 1344a1d8d8a5SSudarsana Reddy Kalluru *prio_type = *pgid = *bw_pct = *up_map = 0; 1345a1d8d8a5SSudarsana Reddy Kalluru if (tc < 0 || tc >= QED_MAX_PFC_PRIORITIES) { 1346a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "Invalid tc %d\n", tc); 1347a1d8d8a5SSudarsana Reddy Kalluru return; 1348a1d8d8a5SSudarsana Reddy Kalluru } 1349a1d8d8a5SSudarsana Reddy Kalluru 1350a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 1351a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1352a1d8d8a5SSudarsana Reddy Kalluru return; 1353a1d8d8a5SSudarsana Reddy Kalluru 1354a1d8d8a5SSudarsana Reddy Kalluru *pgid = dcbx_info->operational.params.ets_pri_tc_tbl[tc]; 1355a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1356a1d8d8a5SSudarsana Reddy Kalluru } 1357a1d8d8a5SSudarsana Reddy Kalluru 1358a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_getpgbwgcfgtx(struct qed_dev *cdev, int pgid, u8 *bw_pct) 1359a1d8d8a5SSudarsana Reddy Kalluru { 1360a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1361a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1362a1d8d8a5SSudarsana Reddy Kalluru 1363a1d8d8a5SSudarsana Reddy Kalluru *bw_pct = 0; 1364a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "pgid = %d\n", pgid); 1365a1d8d8a5SSudarsana Reddy Kalluru if (pgid < 0 || pgid >= QED_MAX_PFC_PRIORITIES) { 1366a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "Invalid pgid %d\n", pgid); 1367a1d8d8a5SSudarsana Reddy Kalluru return; 1368a1d8d8a5SSudarsana Reddy Kalluru } 1369a1d8d8a5SSudarsana Reddy Kalluru 1370a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 1371a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1372a1d8d8a5SSudarsana Reddy Kalluru return; 1373a1d8d8a5SSudarsana Reddy Kalluru 1374a1d8d8a5SSudarsana Reddy Kalluru *bw_pct = dcbx_info->operational.params.ets_tc_bw_tbl[pgid]; 1375a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "bw_pct = %d\n", *bw_pct); 1376a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1377a1d8d8a5SSudarsana Reddy Kalluru } 1378a1d8d8a5SSudarsana Reddy Kalluru 1379a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_getpgtccfgrx(struct qed_dev *cdev, int tc, u8 *prio, 1380a1d8d8a5SSudarsana Reddy Kalluru u8 *bwg_id, u8 *bw_pct, u8 *up_map) 1381a1d8d8a5SSudarsana Reddy Kalluru { 1382a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(QED_LEADING_HWFN(cdev), "Rx ETS is not supported\n"); 1383a1d8d8a5SSudarsana Reddy Kalluru *prio = *bwg_id = *bw_pct = *up_map = 0; 1384a1d8d8a5SSudarsana Reddy Kalluru } 1385a1d8d8a5SSudarsana Reddy Kalluru 1386a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_getpgbwgcfgrx(struct qed_dev *cdev, 1387a1d8d8a5SSudarsana Reddy Kalluru int bwg_id, u8 *bw_pct) 1388a1d8d8a5SSudarsana Reddy Kalluru { 1389a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(QED_LEADING_HWFN(cdev), "Rx ETS is not supported\n"); 1390a1d8d8a5SSudarsana Reddy Kalluru *bw_pct = 0; 1391a1d8d8a5SSudarsana Reddy Kalluru } 1392a1d8d8a5SSudarsana Reddy Kalluru 1393a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_getpfccfg(struct qed_dev *cdev, 1394a1d8d8a5SSudarsana Reddy Kalluru int priority, u8 *setting) 1395a1d8d8a5SSudarsana Reddy Kalluru { 1396a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1397a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1398a1d8d8a5SSudarsana Reddy Kalluru 1399a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "priority = %d\n", priority); 1400a1d8d8a5SSudarsana Reddy Kalluru if (priority < 0 || priority >= QED_MAX_PFC_PRIORITIES) { 1401a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "Invalid priority %d\n", priority); 1402a1d8d8a5SSudarsana Reddy Kalluru return; 1403a1d8d8a5SSudarsana Reddy Kalluru } 1404a1d8d8a5SSudarsana Reddy Kalluru 1405a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 1406a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1407a1d8d8a5SSudarsana Reddy Kalluru return; 1408a1d8d8a5SSudarsana Reddy Kalluru 1409a1d8d8a5SSudarsana Reddy Kalluru *setting = dcbx_info->operational.params.pfc.prio[priority]; 1410a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "setting = %d\n", *setting); 1411a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1412a1d8d8a5SSudarsana Reddy Kalluru } 1413a1d8d8a5SSudarsana Reddy Kalluru 1414a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_setpfccfg(struct qed_dev *cdev, int priority, u8 setting) 1415a1d8d8a5SSudarsana Reddy Kalluru { 1416a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1417a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 1418a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 1419a1d8d8a5SSudarsana Reddy Kalluru int rc; 1420a1d8d8a5SSudarsana Reddy Kalluru 1421a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "priority = %d setting = %d\n", 1422a1d8d8a5SSudarsana Reddy Kalluru priority, setting); 1423a1d8d8a5SSudarsana Reddy Kalluru if (priority < 0 || priority >= QED_MAX_PFC_PRIORITIES) { 1424a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "Invalid priority %d\n", priority); 1425a1d8d8a5SSudarsana Reddy Kalluru return; 1426a1d8d8a5SSudarsana Reddy Kalluru } 1427a1d8d8a5SSudarsana Reddy Kalluru 1428a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 1429a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 1430a1d8d8a5SSudarsana Reddy Kalluru if (rc) 1431a1d8d8a5SSudarsana Reddy Kalluru return; 1432a1d8d8a5SSudarsana Reddy Kalluru 1433a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_PFC_CFG; 1434a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.pfc.prio[priority] = !!setting; 1435a1d8d8a5SSudarsana Reddy Kalluru 1436a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 1437a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 1438a1d8d8a5SSudarsana Reddy Kalluru return; 1439a1d8d8a5SSudarsana Reddy Kalluru 1440a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 1441a1d8d8a5SSudarsana Reddy Kalluru 1442a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 1443a1d8d8a5SSudarsana Reddy Kalluru } 1444a1d8d8a5SSudarsana Reddy Kalluru 1445a1d8d8a5SSudarsana Reddy Kalluru static u8 qed_dcbnl_getcap(struct qed_dev *cdev, int capid, u8 *cap) 1446a1d8d8a5SSudarsana Reddy Kalluru { 1447a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1448a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1449a1d8d8a5SSudarsana Reddy Kalluru int rc = 0; 1450a1d8d8a5SSudarsana Reddy Kalluru 1451a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "capid = %d\n", capid); 1452a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 1453a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1454a1d8d8a5SSudarsana Reddy Kalluru return 1; 1455a1d8d8a5SSudarsana Reddy Kalluru 1456a1d8d8a5SSudarsana Reddy Kalluru switch (capid) { 1457a1d8d8a5SSudarsana Reddy Kalluru case DCB_CAP_ATTR_PG: 1458a1d8d8a5SSudarsana Reddy Kalluru case DCB_CAP_ATTR_PFC: 1459a1d8d8a5SSudarsana Reddy Kalluru case DCB_CAP_ATTR_UP2TC: 1460a1d8d8a5SSudarsana Reddy Kalluru case DCB_CAP_ATTR_GSP: 1461a1d8d8a5SSudarsana Reddy Kalluru *cap = true; 1462a1d8d8a5SSudarsana Reddy Kalluru break; 1463a1d8d8a5SSudarsana Reddy Kalluru case DCB_CAP_ATTR_PG_TCS: 1464a1d8d8a5SSudarsana Reddy Kalluru case DCB_CAP_ATTR_PFC_TCS: 1465a1d8d8a5SSudarsana Reddy Kalluru *cap = 0x80; 1466a1d8d8a5SSudarsana Reddy Kalluru break; 1467a1d8d8a5SSudarsana Reddy Kalluru case DCB_CAP_ATTR_DCBX: 1468a1d8d8a5SSudarsana Reddy Kalluru *cap = (DCB_CAP_DCBX_LLD_MANAGED | DCB_CAP_DCBX_VER_CEE | 146905930d18SSudarsana Reddy Kalluru DCB_CAP_DCBX_VER_IEEE | DCB_CAP_DCBX_STATIC); 1470a1d8d8a5SSudarsana Reddy Kalluru break; 1471a1d8d8a5SSudarsana Reddy Kalluru default: 1472a1d8d8a5SSudarsana Reddy Kalluru *cap = false; 1473a1d8d8a5SSudarsana Reddy Kalluru rc = 1; 1474a1d8d8a5SSudarsana Reddy Kalluru } 1475a1d8d8a5SSudarsana Reddy Kalluru 1476a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "id = %d caps = %d\n", capid, *cap); 1477a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1478a1d8d8a5SSudarsana Reddy Kalluru 1479a1d8d8a5SSudarsana Reddy Kalluru return rc; 1480a1d8d8a5SSudarsana Reddy Kalluru } 1481a1d8d8a5SSudarsana Reddy Kalluru 1482a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_getnumtcs(struct qed_dev *cdev, int tcid, u8 *num) 1483a1d8d8a5SSudarsana Reddy Kalluru { 1484a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1485a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1486a1d8d8a5SSudarsana Reddy Kalluru int rc = 0; 1487a1d8d8a5SSudarsana Reddy Kalluru 1488a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "tcid = %d\n", tcid); 1489a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 1490a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1491a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 1492a1d8d8a5SSudarsana Reddy Kalluru 1493a1d8d8a5SSudarsana Reddy Kalluru switch (tcid) { 1494a1d8d8a5SSudarsana Reddy Kalluru case DCB_NUMTCS_ATTR_PG: 1495a1d8d8a5SSudarsana Reddy Kalluru *num = dcbx_info->operational.params.max_ets_tc; 1496a1d8d8a5SSudarsana Reddy Kalluru break; 1497a1d8d8a5SSudarsana Reddy Kalluru case DCB_NUMTCS_ATTR_PFC: 1498a1d8d8a5SSudarsana Reddy Kalluru *num = dcbx_info->operational.params.pfc.max_tc; 1499a1d8d8a5SSudarsana Reddy Kalluru break; 1500a1d8d8a5SSudarsana Reddy Kalluru default: 1501a1d8d8a5SSudarsana Reddy Kalluru rc = -EINVAL; 1502a1d8d8a5SSudarsana Reddy Kalluru } 1503a1d8d8a5SSudarsana Reddy Kalluru 1504a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1505a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "numtcs = %d\n", *num); 1506a1d8d8a5SSudarsana Reddy Kalluru 1507a1d8d8a5SSudarsana Reddy Kalluru return rc; 1508a1d8d8a5SSudarsana Reddy Kalluru } 1509a1d8d8a5SSudarsana Reddy Kalluru 1510a1d8d8a5SSudarsana Reddy Kalluru static u8 qed_dcbnl_getpfcstate(struct qed_dev *cdev) 1511a1d8d8a5SSudarsana Reddy Kalluru { 1512a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1513a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1514a1d8d8a5SSudarsana Reddy Kalluru bool enabled; 1515a1d8d8a5SSudarsana Reddy Kalluru 1516a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 1517a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1518a1d8d8a5SSudarsana Reddy Kalluru return 0; 1519a1d8d8a5SSudarsana Reddy Kalluru 1520a1d8d8a5SSudarsana Reddy Kalluru enabled = dcbx_info->operational.params.pfc.enabled; 1521a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "pfc state = %d\n", enabled); 1522a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1523a1d8d8a5SSudarsana Reddy Kalluru 1524a1d8d8a5SSudarsana Reddy Kalluru return enabled; 1525a1d8d8a5SSudarsana Reddy Kalluru } 1526a1d8d8a5SSudarsana Reddy Kalluru 1527a1d8d8a5SSudarsana Reddy Kalluru static u8 qed_dcbnl_getdcbx(struct qed_dev *cdev) 1528a1d8d8a5SSudarsana Reddy Kalluru { 1529a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1530a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1531a1d8d8a5SSudarsana Reddy Kalluru u8 mode = 0; 1532a1d8d8a5SSudarsana Reddy Kalluru 1533a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 1534a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1535a1d8d8a5SSudarsana Reddy Kalluru return 0; 1536a1d8d8a5SSudarsana Reddy Kalluru 1537a1d8d8a5SSudarsana Reddy Kalluru if (dcbx_info->operational.enabled) 1538a1d8d8a5SSudarsana Reddy Kalluru mode |= DCB_CAP_DCBX_LLD_MANAGED; 1539a1d8d8a5SSudarsana Reddy Kalluru if (dcbx_info->operational.ieee) 1540a1d8d8a5SSudarsana Reddy Kalluru mode |= DCB_CAP_DCBX_VER_IEEE; 1541a1d8d8a5SSudarsana Reddy Kalluru if (dcbx_info->operational.cee) 1542a1d8d8a5SSudarsana Reddy Kalluru mode |= DCB_CAP_DCBX_VER_CEE; 154305930d18SSudarsana Reddy Kalluru if (dcbx_info->operational.local) 154405930d18SSudarsana Reddy Kalluru mode |= DCB_CAP_DCBX_STATIC; 1545a1d8d8a5SSudarsana Reddy Kalluru 1546a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "dcb mode = %d\n", mode); 1547a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1548a1d8d8a5SSudarsana Reddy Kalluru 1549a1d8d8a5SSudarsana Reddy Kalluru return mode; 1550a1d8d8a5SSudarsana Reddy Kalluru } 1551a1d8d8a5SSudarsana Reddy Kalluru 1552a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_setpgtccfgtx(struct qed_dev *cdev, 1553a1d8d8a5SSudarsana Reddy Kalluru int tc, 1554a1d8d8a5SSudarsana Reddy Kalluru u8 pri_type, u8 pgid, u8 bw_pct, u8 up_map) 1555a1d8d8a5SSudarsana Reddy Kalluru { 1556a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1557a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 1558a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 1559a1d8d8a5SSudarsana Reddy Kalluru int rc; 1560a1d8d8a5SSudarsana Reddy Kalluru 1561a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, 1562a1d8d8a5SSudarsana Reddy Kalluru "tc = %d pri_type = %d pgid = %d bw_pct = %d up_map = %d\n", 1563a1d8d8a5SSudarsana Reddy Kalluru tc, pri_type, pgid, bw_pct, up_map); 1564a1d8d8a5SSudarsana Reddy Kalluru 1565a1d8d8a5SSudarsana Reddy Kalluru if (tc < 0 || tc >= QED_MAX_PFC_PRIORITIES) { 1566a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "Invalid tc %d\n", tc); 1567a1d8d8a5SSudarsana Reddy Kalluru return; 1568a1d8d8a5SSudarsana Reddy Kalluru } 1569a1d8d8a5SSudarsana Reddy Kalluru 1570a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 1571a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 1572a1d8d8a5SSudarsana Reddy Kalluru if (rc) 1573a1d8d8a5SSudarsana Reddy Kalluru return; 1574a1d8d8a5SSudarsana Reddy Kalluru 1575a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_ETS_CFG; 1576a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.ets_pri_tc_tbl[tc] = pgid; 1577a1d8d8a5SSudarsana Reddy Kalluru 1578a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 1579a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 1580a1d8d8a5SSudarsana Reddy Kalluru return; 1581a1d8d8a5SSudarsana Reddy Kalluru 1582a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 1583a1d8d8a5SSudarsana Reddy Kalluru 1584a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 1585a1d8d8a5SSudarsana Reddy Kalluru } 1586a1d8d8a5SSudarsana Reddy Kalluru 1587a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_setpgtccfgrx(struct qed_dev *cdev, int prio, 1588a1d8d8a5SSudarsana Reddy Kalluru u8 pri_type, u8 pgid, u8 bw_pct, u8 up_map) 1589a1d8d8a5SSudarsana Reddy Kalluru { 1590a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(QED_LEADING_HWFN(cdev), "Rx ETS is not supported\n"); 1591a1d8d8a5SSudarsana Reddy Kalluru } 1592a1d8d8a5SSudarsana Reddy Kalluru 1593a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_setpgbwgcfgtx(struct qed_dev *cdev, int pgid, u8 bw_pct) 1594a1d8d8a5SSudarsana Reddy Kalluru { 1595a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1596a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 1597a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 1598a1d8d8a5SSudarsana Reddy Kalluru int rc; 1599a1d8d8a5SSudarsana Reddy Kalluru 1600a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "pgid = %d bw_pct = %d\n", pgid, bw_pct); 1601a1d8d8a5SSudarsana Reddy Kalluru if (pgid < 0 || pgid >= QED_MAX_PFC_PRIORITIES) { 1602a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "Invalid pgid %d\n", pgid); 1603a1d8d8a5SSudarsana Reddy Kalluru return; 1604a1d8d8a5SSudarsana Reddy Kalluru } 1605a1d8d8a5SSudarsana Reddy Kalluru 1606a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 1607a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 1608a1d8d8a5SSudarsana Reddy Kalluru if (rc) 1609a1d8d8a5SSudarsana Reddy Kalluru return; 1610a1d8d8a5SSudarsana Reddy Kalluru 1611a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_ETS_CFG; 1612a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.ets_tc_bw_tbl[pgid] = bw_pct; 1613a1d8d8a5SSudarsana Reddy Kalluru 1614a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 1615a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 1616a1d8d8a5SSudarsana Reddy Kalluru return; 1617a1d8d8a5SSudarsana Reddy Kalluru 1618a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 1619a1d8d8a5SSudarsana Reddy Kalluru 1620a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 1621a1d8d8a5SSudarsana Reddy Kalluru } 1622a1d8d8a5SSudarsana Reddy Kalluru 1623a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_setpgbwgcfgrx(struct qed_dev *cdev, int pgid, u8 bw_pct) 1624a1d8d8a5SSudarsana Reddy Kalluru { 1625a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(QED_LEADING_HWFN(cdev), "Rx ETS is not supported\n"); 1626a1d8d8a5SSudarsana Reddy Kalluru } 1627a1d8d8a5SSudarsana Reddy Kalluru 1628a1d8d8a5SSudarsana Reddy Kalluru static u8 qed_dcbnl_setall(struct qed_dev *cdev) 1629a1d8d8a5SSudarsana Reddy Kalluru { 1630a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1631a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 1632a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 1633a1d8d8a5SSudarsana Reddy Kalluru int rc; 1634a1d8d8a5SSudarsana Reddy Kalluru 1635a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 1636a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 1637a1d8d8a5SSudarsana Reddy Kalluru if (rc) 1638a1d8d8a5SSudarsana Reddy Kalluru return 1; 1639a1d8d8a5SSudarsana Reddy Kalluru 1640a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 1641a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 1642a1d8d8a5SSudarsana Reddy Kalluru return 1; 1643a1d8d8a5SSudarsana Reddy Kalluru 1644a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 1); 1645a1d8d8a5SSudarsana Reddy Kalluru 1646a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 1647a1d8d8a5SSudarsana Reddy Kalluru 1648a1d8d8a5SSudarsana Reddy Kalluru return rc; 1649a1d8d8a5SSudarsana Reddy Kalluru } 1650a1d8d8a5SSudarsana Reddy Kalluru 1651a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_setnumtcs(struct qed_dev *cdev, int tcid, u8 num) 1652a1d8d8a5SSudarsana Reddy Kalluru { 1653a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1654a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 1655a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 1656a1d8d8a5SSudarsana Reddy Kalluru int rc; 1657a1d8d8a5SSudarsana Reddy Kalluru 1658a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "tcid = %d num = %d\n", tcid, num); 1659a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 1660a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 1661a1d8d8a5SSudarsana Reddy Kalluru if (rc) 1662a1d8d8a5SSudarsana Reddy Kalluru return 1; 1663a1d8d8a5SSudarsana Reddy Kalluru 1664a1d8d8a5SSudarsana Reddy Kalluru switch (tcid) { 1665a1d8d8a5SSudarsana Reddy Kalluru case DCB_NUMTCS_ATTR_PG: 1666a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_ETS_CFG; 1667a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.max_ets_tc = num; 1668a1d8d8a5SSudarsana Reddy Kalluru break; 1669a1d8d8a5SSudarsana Reddy Kalluru case DCB_NUMTCS_ATTR_PFC: 1670a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_PFC_CFG; 1671a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.pfc.max_tc = num; 1672a1d8d8a5SSudarsana Reddy Kalluru break; 1673a1d8d8a5SSudarsana Reddy Kalluru default: 1674a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "Invalid tcid %d\n", tcid); 1675a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 1676a1d8d8a5SSudarsana Reddy Kalluru } 1677a1d8d8a5SSudarsana Reddy Kalluru 1678a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 1679a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 1680a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 1681a1d8d8a5SSudarsana Reddy Kalluru 1682a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 1683a1d8d8a5SSudarsana Reddy Kalluru 1684a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 1685a1d8d8a5SSudarsana Reddy Kalluru 1686a1d8d8a5SSudarsana Reddy Kalluru return 0; 1687a1d8d8a5SSudarsana Reddy Kalluru } 1688a1d8d8a5SSudarsana Reddy Kalluru 1689a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_setpfcstate(struct qed_dev *cdev, u8 state) 1690a1d8d8a5SSudarsana Reddy Kalluru { 1691a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1692a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 1693a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 1694a1d8d8a5SSudarsana Reddy Kalluru int rc; 1695a1d8d8a5SSudarsana Reddy Kalluru 1696a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "new state = %d\n", state); 1697a1d8d8a5SSudarsana Reddy Kalluru 1698a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 1699a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 1700a1d8d8a5SSudarsana Reddy Kalluru if (rc) 1701a1d8d8a5SSudarsana Reddy Kalluru return; 1702a1d8d8a5SSudarsana Reddy Kalluru 1703a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_PFC_CFG; 1704a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.pfc.enabled = !!state; 1705a1d8d8a5SSudarsana Reddy Kalluru 1706a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 1707a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 1708a1d8d8a5SSudarsana Reddy Kalluru return; 1709a1d8d8a5SSudarsana Reddy Kalluru 1710a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 1711a1d8d8a5SSudarsana Reddy Kalluru 1712a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 1713a1d8d8a5SSudarsana Reddy Kalluru } 1714a1d8d8a5SSudarsana Reddy Kalluru 1715a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_getapp(struct qed_dev *cdev, u8 idtype, u16 idval) 1716a1d8d8a5SSudarsana Reddy Kalluru { 1717a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1718a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1719a1d8d8a5SSudarsana Reddy Kalluru struct qed_app_entry *entry; 1720a1d8d8a5SSudarsana Reddy Kalluru bool ethtype; 1721a1d8d8a5SSudarsana Reddy Kalluru u8 prio = 0; 1722a1d8d8a5SSudarsana Reddy Kalluru int i; 1723a1d8d8a5SSudarsana Reddy Kalluru 1724a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 1725a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1726a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 1727a1d8d8a5SSudarsana Reddy Kalluru 1728a1d8d8a5SSudarsana Reddy Kalluru ethtype = !!(idtype == DCB_APP_IDTYPE_ETHTYPE); 1729a1d8d8a5SSudarsana Reddy Kalluru for (i = 0; i < QED_DCBX_MAX_APP_PROTOCOL; i++) { 1730a1d8d8a5SSudarsana Reddy Kalluru entry = &dcbx_info->operational.params.app_entry[i]; 1731a1d8d8a5SSudarsana Reddy Kalluru if ((entry->ethtype == ethtype) && (entry->proto_id == idval)) { 1732a1d8d8a5SSudarsana Reddy Kalluru prio = entry->prio; 1733a1d8d8a5SSudarsana Reddy Kalluru break; 1734a1d8d8a5SSudarsana Reddy Kalluru } 1735a1d8d8a5SSudarsana Reddy Kalluru } 1736a1d8d8a5SSudarsana Reddy Kalluru 1737a1d8d8a5SSudarsana Reddy Kalluru if (i == QED_DCBX_MAX_APP_PROTOCOL) { 1738a1d8d8a5SSudarsana Reddy Kalluru DP_ERR(cdev, "App entry (%d, %d) not found\n", idtype, idval); 1739a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1740a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 1741a1d8d8a5SSudarsana Reddy Kalluru } 1742a1d8d8a5SSudarsana Reddy Kalluru 1743a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1744a1d8d8a5SSudarsana Reddy Kalluru 1745a1d8d8a5SSudarsana Reddy Kalluru return prio; 1746a1d8d8a5SSudarsana Reddy Kalluru } 1747a1d8d8a5SSudarsana Reddy Kalluru 1748a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_setapp(struct qed_dev *cdev, 1749a1d8d8a5SSudarsana Reddy Kalluru u8 idtype, u16 idval, u8 pri_map) 1750a1d8d8a5SSudarsana Reddy Kalluru { 1751a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1752a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 1753a1d8d8a5SSudarsana Reddy Kalluru struct qed_app_entry *entry; 1754a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 1755a1d8d8a5SSudarsana Reddy Kalluru bool ethtype; 1756a1d8d8a5SSudarsana Reddy Kalluru int rc, i; 1757a1d8d8a5SSudarsana Reddy Kalluru 1758a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 1759a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 1760a1d8d8a5SSudarsana Reddy Kalluru if (rc) 1761a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 1762a1d8d8a5SSudarsana Reddy Kalluru 1763a1d8d8a5SSudarsana Reddy Kalluru ethtype = !!(idtype == DCB_APP_IDTYPE_ETHTYPE); 1764a1d8d8a5SSudarsana Reddy Kalluru for (i = 0; i < QED_DCBX_MAX_APP_PROTOCOL; i++) { 1765a1d8d8a5SSudarsana Reddy Kalluru entry = &dcbx_set.config.params.app_entry[i]; 1766a1d8d8a5SSudarsana Reddy Kalluru if ((entry->ethtype == ethtype) && (entry->proto_id == idval)) 1767a1d8d8a5SSudarsana Reddy Kalluru break; 1768a1d8d8a5SSudarsana Reddy Kalluru /* First empty slot */ 17691d7406ceSSudarsana Reddy Kalluru if (!entry->proto_id) { 17701d7406ceSSudarsana Reddy Kalluru dcbx_set.config.params.num_app_entries++; 1771a1d8d8a5SSudarsana Reddy Kalluru break; 1772a1d8d8a5SSudarsana Reddy Kalluru } 17731d7406ceSSudarsana Reddy Kalluru } 1774a1d8d8a5SSudarsana Reddy Kalluru 1775a1d8d8a5SSudarsana Reddy Kalluru if (i == QED_DCBX_MAX_APP_PROTOCOL) { 1776a1d8d8a5SSudarsana Reddy Kalluru DP_ERR(cdev, "App table is full\n"); 1777a1d8d8a5SSudarsana Reddy Kalluru return -EBUSY; 1778a1d8d8a5SSudarsana Reddy Kalluru } 1779a1d8d8a5SSudarsana Reddy Kalluru 1780a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_APP_CFG; 1781a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.app_entry[i].ethtype = ethtype; 1782a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.app_entry[i].proto_id = idval; 1783a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.app_entry[i].prio = pri_map; 1784a1d8d8a5SSudarsana Reddy Kalluru 1785a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 1786a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 1787a1d8d8a5SSudarsana Reddy Kalluru return -EBUSY; 1788a1d8d8a5SSudarsana Reddy Kalluru 1789a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 1790a1d8d8a5SSudarsana Reddy Kalluru 1791a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 1792a1d8d8a5SSudarsana Reddy Kalluru 1793a1d8d8a5SSudarsana Reddy Kalluru return rc; 1794a1d8d8a5SSudarsana Reddy Kalluru } 1795a1d8d8a5SSudarsana Reddy Kalluru 1796a1d8d8a5SSudarsana Reddy Kalluru static u8 qed_dcbnl_setdcbx(struct qed_dev *cdev, u8 mode) 1797a1d8d8a5SSudarsana Reddy Kalluru { 1798a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1799a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 1800a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 1801a1d8d8a5SSudarsana Reddy Kalluru int rc; 1802a1d8d8a5SSudarsana Reddy Kalluru 1803a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "new mode = %x\n", mode); 1804a1d8d8a5SSudarsana Reddy Kalluru 180549632b58Ssudarsana.kalluru@cavium.com if (!(mode & DCB_CAP_DCBX_VER_IEEE) && 180649632b58Ssudarsana.kalluru@cavium.com !(mode & DCB_CAP_DCBX_VER_CEE) && !(mode & DCB_CAP_DCBX_STATIC)) { 180749632b58Ssudarsana.kalluru@cavium.com DP_INFO(hwfn, "Allowed modes are cee, ieee or static\n"); 1808a1d8d8a5SSudarsana Reddy Kalluru return 1; 1809a1d8d8a5SSudarsana Reddy Kalluru } 1810a1d8d8a5SSudarsana Reddy Kalluru 1811a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 1812a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 1813a1d8d8a5SSudarsana Reddy Kalluru if (rc) 1814a1d8d8a5SSudarsana Reddy Kalluru return 1; 1815a1d8d8a5SSudarsana Reddy Kalluru 1816a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.ver_num = 0; 1817a1d8d8a5SSudarsana Reddy Kalluru if (mode & DCB_CAP_DCBX_VER_CEE) { 1818a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.ver_num |= DCBX_CONFIG_VERSION_CEE; 1819a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.enabled = true; 1820a1d8d8a5SSudarsana Reddy Kalluru } 1821a1d8d8a5SSudarsana Reddy Kalluru 1822a1d8d8a5SSudarsana Reddy Kalluru if (mode & DCB_CAP_DCBX_VER_IEEE) { 1823a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.ver_num |= DCBX_CONFIG_VERSION_IEEE; 1824a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.enabled = true; 1825a1d8d8a5SSudarsana Reddy Kalluru } 1826a1d8d8a5SSudarsana Reddy Kalluru 182749632b58Ssudarsana.kalluru@cavium.com if (mode & DCB_CAP_DCBX_STATIC) { 182849632b58Ssudarsana.kalluru@cavium.com dcbx_set.ver_num |= DCBX_CONFIG_VERSION_STATIC; 182949632b58Ssudarsana.kalluru@cavium.com dcbx_set.enabled = true; 183049632b58Ssudarsana.kalluru@cavium.com } 183149632b58Ssudarsana.kalluru@cavium.com 1832a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 1833a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 1834a1d8d8a5SSudarsana Reddy Kalluru return 1; 1835a1d8d8a5SSudarsana Reddy Kalluru 1836a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 1837a1d8d8a5SSudarsana Reddy Kalluru 1838a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 1839a1d8d8a5SSudarsana Reddy Kalluru 184049632b58Ssudarsana.kalluru@cavium.com return rc; 1841a1d8d8a5SSudarsana Reddy Kalluru } 1842a1d8d8a5SSudarsana Reddy Kalluru 1843a1d8d8a5SSudarsana Reddy Kalluru static u8 qed_dcbnl_getfeatcfg(struct qed_dev *cdev, int featid, u8 *flags) 1844a1d8d8a5SSudarsana Reddy Kalluru { 1845a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1846a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1847a1d8d8a5SSudarsana Reddy Kalluru 1848a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "Feature id = %d\n", featid); 1849a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 1850a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1851a1d8d8a5SSudarsana Reddy Kalluru return 1; 1852a1d8d8a5SSudarsana Reddy Kalluru 1853a1d8d8a5SSudarsana Reddy Kalluru *flags = 0; 1854a1d8d8a5SSudarsana Reddy Kalluru switch (featid) { 1855a1d8d8a5SSudarsana Reddy Kalluru case DCB_FEATCFG_ATTR_PG: 1856a1d8d8a5SSudarsana Reddy Kalluru if (dcbx_info->operational.params.ets_enabled) 1857a1d8d8a5SSudarsana Reddy Kalluru *flags = DCB_FEATCFG_ENABLE; 1858a1d8d8a5SSudarsana Reddy Kalluru else 1859a1d8d8a5SSudarsana Reddy Kalluru *flags = DCB_FEATCFG_ERROR; 1860a1d8d8a5SSudarsana Reddy Kalluru break; 1861a1d8d8a5SSudarsana Reddy Kalluru case DCB_FEATCFG_ATTR_PFC: 1862a1d8d8a5SSudarsana Reddy Kalluru if (dcbx_info->operational.params.pfc.enabled) 1863a1d8d8a5SSudarsana Reddy Kalluru *flags = DCB_FEATCFG_ENABLE; 1864a1d8d8a5SSudarsana Reddy Kalluru else 1865a1d8d8a5SSudarsana Reddy Kalluru *flags = DCB_FEATCFG_ERROR; 1866a1d8d8a5SSudarsana Reddy Kalluru break; 1867a1d8d8a5SSudarsana Reddy Kalluru case DCB_FEATCFG_ATTR_APP: 1868a1d8d8a5SSudarsana Reddy Kalluru if (dcbx_info->operational.params.app_valid) 1869a1d8d8a5SSudarsana Reddy Kalluru *flags = DCB_FEATCFG_ENABLE; 1870a1d8d8a5SSudarsana Reddy Kalluru else 1871a1d8d8a5SSudarsana Reddy Kalluru *flags = DCB_FEATCFG_ERROR; 1872a1d8d8a5SSudarsana Reddy Kalluru break; 1873a1d8d8a5SSudarsana Reddy Kalluru default: 1874a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "Invalid feature-ID %d\n", featid); 1875a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1876a1d8d8a5SSudarsana Reddy Kalluru return 1; 1877a1d8d8a5SSudarsana Reddy Kalluru } 1878a1d8d8a5SSudarsana Reddy Kalluru 1879a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "flags = %d\n", *flags); 1880a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1881a1d8d8a5SSudarsana Reddy Kalluru 1882a1d8d8a5SSudarsana Reddy Kalluru return 0; 1883a1d8d8a5SSudarsana Reddy Kalluru } 1884a1d8d8a5SSudarsana Reddy Kalluru 1885a1d8d8a5SSudarsana Reddy Kalluru static u8 qed_dcbnl_setfeatcfg(struct qed_dev *cdev, int featid, u8 flags) 1886a1d8d8a5SSudarsana Reddy Kalluru { 1887a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1888a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 1889a1d8d8a5SSudarsana Reddy Kalluru bool enabled, willing; 1890a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 1891a1d8d8a5SSudarsana Reddy Kalluru int rc; 1892a1d8d8a5SSudarsana Reddy Kalluru 1893a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "featid = %d flags = %d\n", 1894a1d8d8a5SSudarsana Reddy Kalluru featid, flags); 1895a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 1896a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 1897a1d8d8a5SSudarsana Reddy Kalluru if (rc) 1898a1d8d8a5SSudarsana Reddy Kalluru return 1; 1899a1d8d8a5SSudarsana Reddy Kalluru 1900a1d8d8a5SSudarsana Reddy Kalluru enabled = !!(flags & DCB_FEATCFG_ENABLE); 1901a1d8d8a5SSudarsana Reddy Kalluru willing = !!(flags & DCB_FEATCFG_WILLING); 1902a1d8d8a5SSudarsana Reddy Kalluru switch (featid) { 1903a1d8d8a5SSudarsana Reddy Kalluru case DCB_FEATCFG_ATTR_PG: 1904a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_ETS_CFG; 1905a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.ets_enabled = enabled; 1906a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.ets_willing = willing; 1907a1d8d8a5SSudarsana Reddy Kalluru break; 1908a1d8d8a5SSudarsana Reddy Kalluru case DCB_FEATCFG_ATTR_PFC: 1909a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_PFC_CFG; 1910a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.pfc.enabled = enabled; 1911a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.pfc.willing = willing; 1912a1d8d8a5SSudarsana Reddy Kalluru break; 1913a1d8d8a5SSudarsana Reddy Kalluru case DCB_FEATCFG_ATTR_APP: 1914a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_APP_CFG; 1915a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.app_willing = willing; 1916a1d8d8a5SSudarsana Reddy Kalluru break; 1917a1d8d8a5SSudarsana Reddy Kalluru default: 1918a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "Invalid feature-ID %d\n", featid); 1919a1d8d8a5SSudarsana Reddy Kalluru return 1; 1920a1d8d8a5SSudarsana Reddy Kalluru } 1921a1d8d8a5SSudarsana Reddy Kalluru 1922a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 1923a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 1924a1d8d8a5SSudarsana Reddy Kalluru return 1; 1925a1d8d8a5SSudarsana Reddy Kalluru 1926a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 1927a1d8d8a5SSudarsana Reddy Kalluru 1928a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 1929a1d8d8a5SSudarsana Reddy Kalluru 1930a1d8d8a5SSudarsana Reddy Kalluru return 0; 1931a1d8d8a5SSudarsana Reddy Kalluru } 1932a1d8d8a5SSudarsana Reddy Kalluru 1933a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_peer_getappinfo(struct qed_dev *cdev, 1934a1d8d8a5SSudarsana Reddy Kalluru struct dcb_peer_app_info *info, 1935a1d8d8a5SSudarsana Reddy Kalluru u16 *app_count) 1936a1d8d8a5SSudarsana Reddy Kalluru { 1937a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1938a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1939a1d8d8a5SSudarsana Reddy Kalluru 1940a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_REMOTE_MIB); 1941a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1942a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 1943a1d8d8a5SSudarsana Reddy Kalluru 1944a1d8d8a5SSudarsana Reddy Kalluru info->willing = dcbx_info->remote.params.app_willing; 1945a1d8d8a5SSudarsana Reddy Kalluru info->error = dcbx_info->remote.params.app_error; 1946a1d8d8a5SSudarsana Reddy Kalluru *app_count = dcbx_info->remote.params.num_app_entries; 1947a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1948a1d8d8a5SSudarsana Reddy Kalluru 1949a1d8d8a5SSudarsana Reddy Kalluru return 0; 1950a1d8d8a5SSudarsana Reddy Kalluru } 1951a1d8d8a5SSudarsana Reddy Kalluru 1952a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_peer_getapptable(struct qed_dev *cdev, 1953a1d8d8a5SSudarsana Reddy Kalluru struct dcb_app *table) 1954a1d8d8a5SSudarsana Reddy Kalluru { 1955a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1956a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1957a1d8d8a5SSudarsana Reddy Kalluru int i; 1958a1d8d8a5SSudarsana Reddy Kalluru 1959a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_REMOTE_MIB); 1960a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1961a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 1962a1d8d8a5SSudarsana Reddy Kalluru 1963a1d8d8a5SSudarsana Reddy Kalluru for (i = 0; i < dcbx_info->remote.params.num_app_entries; i++) { 1964a1d8d8a5SSudarsana Reddy Kalluru if (dcbx_info->remote.params.app_entry[i].ethtype) 1965a1d8d8a5SSudarsana Reddy Kalluru table[i].selector = DCB_APP_IDTYPE_ETHTYPE; 1966a1d8d8a5SSudarsana Reddy Kalluru else 1967a1d8d8a5SSudarsana Reddy Kalluru table[i].selector = DCB_APP_IDTYPE_PORTNUM; 1968a1d8d8a5SSudarsana Reddy Kalluru table[i].priority = dcbx_info->remote.params.app_entry[i].prio; 1969a1d8d8a5SSudarsana Reddy Kalluru table[i].protocol = 1970a1d8d8a5SSudarsana Reddy Kalluru dcbx_info->remote.params.app_entry[i].proto_id; 1971a1d8d8a5SSudarsana Reddy Kalluru } 1972a1d8d8a5SSudarsana Reddy Kalluru 1973a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1974a1d8d8a5SSudarsana Reddy Kalluru 1975a1d8d8a5SSudarsana Reddy Kalluru return 0; 1976a1d8d8a5SSudarsana Reddy Kalluru } 1977a1d8d8a5SSudarsana Reddy Kalluru 1978a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_cee_peer_getpfc(struct qed_dev *cdev, struct cee_pfc *pfc) 1979a1d8d8a5SSudarsana Reddy Kalluru { 1980a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1981a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1982a1d8d8a5SSudarsana Reddy Kalluru int i; 1983a1d8d8a5SSudarsana Reddy Kalluru 1984a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_REMOTE_MIB); 1985a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1986a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 1987a1d8d8a5SSudarsana Reddy Kalluru 1988a1d8d8a5SSudarsana Reddy Kalluru for (i = 0; i < QED_MAX_PFC_PRIORITIES; i++) 1989a1d8d8a5SSudarsana Reddy Kalluru if (dcbx_info->remote.params.pfc.prio[i]) 1990a1d8d8a5SSudarsana Reddy Kalluru pfc->pfc_en |= BIT(i); 1991a1d8d8a5SSudarsana Reddy Kalluru 1992a1d8d8a5SSudarsana Reddy Kalluru pfc->tcs_supported = dcbx_info->remote.params.pfc.max_tc; 1993a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "pfc state = %d tcs_supported = %d\n", 1994a1d8d8a5SSudarsana Reddy Kalluru pfc->pfc_en, pfc->tcs_supported); 1995a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1996a1d8d8a5SSudarsana Reddy Kalluru 1997a1d8d8a5SSudarsana Reddy Kalluru return 0; 1998a1d8d8a5SSudarsana Reddy Kalluru } 1999a1d8d8a5SSudarsana Reddy Kalluru 2000a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_cee_peer_getpg(struct qed_dev *cdev, struct cee_pg *pg) 2001a1d8d8a5SSudarsana Reddy Kalluru { 2002a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 2003a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 2004a1d8d8a5SSudarsana Reddy Kalluru int i; 2005a1d8d8a5SSudarsana Reddy Kalluru 2006a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_REMOTE_MIB); 2007a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 2008a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2009a1d8d8a5SSudarsana Reddy Kalluru 2010a1d8d8a5SSudarsana Reddy Kalluru pg->willing = dcbx_info->remote.params.ets_willing; 2011a1d8d8a5SSudarsana Reddy Kalluru for (i = 0; i < QED_MAX_PFC_PRIORITIES; i++) { 2012a1d8d8a5SSudarsana Reddy Kalluru pg->pg_bw[i] = dcbx_info->remote.params.ets_tc_bw_tbl[i]; 2013a1d8d8a5SSudarsana Reddy Kalluru pg->prio_pg[i] = dcbx_info->remote.params.ets_pri_tc_tbl[i]; 2014a1d8d8a5SSudarsana Reddy Kalluru } 2015a1d8d8a5SSudarsana Reddy Kalluru 2016a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "willing = %d", pg->willing); 2017a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2018a1d8d8a5SSudarsana Reddy Kalluru 2019a1d8d8a5SSudarsana Reddy Kalluru return 0; 2020a1d8d8a5SSudarsana Reddy Kalluru } 2021a1d8d8a5SSudarsana Reddy Kalluru 2022a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_get_ieee_pfc(struct qed_dev *cdev, 2023a1d8d8a5SSudarsana Reddy Kalluru struct ieee_pfc *pfc, bool remote) 2024a1d8d8a5SSudarsana Reddy Kalluru { 2025a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 2026a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_params *params; 2027a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 2028a1d8d8a5SSudarsana Reddy Kalluru int rc, i; 2029a1d8d8a5SSudarsana Reddy Kalluru 2030a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 2031a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 2032a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2033a1d8d8a5SSudarsana Reddy Kalluru 2034a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info->operational.ieee) { 2035a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "DCBX is not enabled/operational in IEEE mode\n"); 203602ee9b18SWei Yongjun kfree(dcbx_info); 2037a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2038a1d8d8a5SSudarsana Reddy Kalluru } 2039a1d8d8a5SSudarsana Reddy Kalluru 2040a1d8d8a5SSudarsana Reddy Kalluru if (remote) { 2041a1d8d8a5SSudarsana Reddy Kalluru memset(dcbx_info, 0, sizeof(*dcbx_info)); 2042a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_query_params(hwfn, dcbx_info, 2043a1d8d8a5SSudarsana Reddy Kalluru QED_DCBX_REMOTE_MIB); 2044a1d8d8a5SSudarsana Reddy Kalluru if (rc) { 2045a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2046a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2047a1d8d8a5SSudarsana Reddy Kalluru } 2048a1d8d8a5SSudarsana Reddy Kalluru 2049a1d8d8a5SSudarsana Reddy Kalluru params = &dcbx_info->remote.params; 2050a1d8d8a5SSudarsana Reddy Kalluru } else { 2051a1d8d8a5SSudarsana Reddy Kalluru params = &dcbx_info->operational.params; 2052a1d8d8a5SSudarsana Reddy Kalluru } 2053a1d8d8a5SSudarsana Reddy Kalluru 2054a1d8d8a5SSudarsana Reddy Kalluru pfc->pfc_cap = params->pfc.max_tc; 2055a1d8d8a5SSudarsana Reddy Kalluru pfc->pfc_en = 0; 2056a1d8d8a5SSudarsana Reddy Kalluru for (i = 0; i < QED_MAX_PFC_PRIORITIES; i++) 2057a1d8d8a5SSudarsana Reddy Kalluru if (params->pfc.prio[i]) 2058a1d8d8a5SSudarsana Reddy Kalluru pfc->pfc_en |= BIT(i); 2059a1d8d8a5SSudarsana Reddy Kalluru 2060a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2061a1d8d8a5SSudarsana Reddy Kalluru 2062a1d8d8a5SSudarsana Reddy Kalluru return 0; 2063a1d8d8a5SSudarsana Reddy Kalluru } 2064a1d8d8a5SSudarsana Reddy Kalluru 2065a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_ieee_getpfc(struct qed_dev *cdev, struct ieee_pfc *pfc) 2066a1d8d8a5SSudarsana Reddy Kalluru { 2067a1d8d8a5SSudarsana Reddy Kalluru return qed_dcbnl_get_ieee_pfc(cdev, pfc, false); 2068a1d8d8a5SSudarsana Reddy Kalluru } 2069a1d8d8a5SSudarsana Reddy Kalluru 2070a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_ieee_setpfc(struct qed_dev *cdev, struct ieee_pfc *pfc) 2071a1d8d8a5SSudarsana Reddy Kalluru { 2072a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 2073a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 2074a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 2075a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 2076a1d8d8a5SSudarsana Reddy Kalluru int rc, i; 2077a1d8d8a5SSudarsana Reddy Kalluru 2078a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 2079a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 2080a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2081a1d8d8a5SSudarsana Reddy Kalluru 2082a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info->operational.ieee) { 2083a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "DCBX is not enabled/operational in IEEE mode\n"); 2084a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2085a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2086a1d8d8a5SSudarsana Reddy Kalluru } 2087a1d8d8a5SSudarsana Reddy Kalluru 2088a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2089a1d8d8a5SSudarsana Reddy Kalluru 2090a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 2091a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 2092a1d8d8a5SSudarsana Reddy Kalluru if (rc) 2093a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2094a1d8d8a5SSudarsana Reddy Kalluru 2095a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_PFC_CFG; 2096a1d8d8a5SSudarsana Reddy Kalluru for (i = 0; i < QED_MAX_PFC_PRIORITIES; i++) 2097a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.pfc.prio[i] = !!(pfc->pfc_en & BIT(i)); 2098a1d8d8a5SSudarsana Reddy Kalluru 2099c0c5dbe7Ssudarsana.kalluru@cavium.com dcbx_set.config.params.pfc.max_tc = pfc->pfc_cap; 2100c0c5dbe7Ssudarsana.kalluru@cavium.com 2101a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 2102a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 2103a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2104a1d8d8a5SSudarsana Reddy Kalluru 2105a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 2106a1d8d8a5SSudarsana Reddy Kalluru 2107a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 2108a1d8d8a5SSudarsana Reddy Kalluru 2109a1d8d8a5SSudarsana Reddy Kalluru return rc; 2110a1d8d8a5SSudarsana Reddy Kalluru } 2111a1d8d8a5SSudarsana Reddy Kalluru 2112a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_get_ieee_ets(struct qed_dev *cdev, 2113a1d8d8a5SSudarsana Reddy Kalluru struct ieee_ets *ets, bool remote) 2114a1d8d8a5SSudarsana Reddy Kalluru { 2115a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 2116a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 2117a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_params *params; 2118a1d8d8a5SSudarsana Reddy Kalluru int rc; 2119a1d8d8a5SSudarsana Reddy Kalluru 2120a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 2121a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 2122a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2123a1d8d8a5SSudarsana Reddy Kalluru 2124a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info->operational.ieee) { 2125a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "DCBX is not enabled/operational in IEEE mode\n"); 2126a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2127a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2128a1d8d8a5SSudarsana Reddy Kalluru } 2129a1d8d8a5SSudarsana Reddy Kalluru 2130a1d8d8a5SSudarsana Reddy Kalluru if (remote) { 2131a1d8d8a5SSudarsana Reddy Kalluru memset(dcbx_info, 0, sizeof(*dcbx_info)); 2132a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_query_params(hwfn, dcbx_info, 2133a1d8d8a5SSudarsana Reddy Kalluru QED_DCBX_REMOTE_MIB); 2134a1d8d8a5SSudarsana Reddy Kalluru if (rc) { 2135a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2136a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2137a1d8d8a5SSudarsana Reddy Kalluru } 2138a1d8d8a5SSudarsana Reddy Kalluru 2139a1d8d8a5SSudarsana Reddy Kalluru params = &dcbx_info->remote.params; 2140a1d8d8a5SSudarsana Reddy Kalluru } else { 2141a1d8d8a5SSudarsana Reddy Kalluru params = &dcbx_info->operational.params; 2142a1d8d8a5SSudarsana Reddy Kalluru } 2143a1d8d8a5SSudarsana Reddy Kalluru 2144a1d8d8a5SSudarsana Reddy Kalluru ets->ets_cap = params->max_ets_tc; 2145a1d8d8a5SSudarsana Reddy Kalluru ets->willing = params->ets_willing; 2146a1d8d8a5SSudarsana Reddy Kalluru ets->cbs = params->ets_cbs; 2147a1d8d8a5SSudarsana Reddy Kalluru memcpy(ets->tc_tx_bw, params->ets_tc_bw_tbl, sizeof(ets->tc_tx_bw)); 2148a1d8d8a5SSudarsana Reddy Kalluru memcpy(ets->tc_tsa, params->ets_tc_tsa_tbl, sizeof(ets->tc_tsa)); 2149a1d8d8a5SSudarsana Reddy Kalluru memcpy(ets->prio_tc, params->ets_pri_tc_tbl, sizeof(ets->prio_tc)); 2150a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2151a1d8d8a5SSudarsana Reddy Kalluru 2152a1d8d8a5SSudarsana Reddy Kalluru return 0; 2153a1d8d8a5SSudarsana Reddy Kalluru } 2154a1d8d8a5SSudarsana Reddy Kalluru 2155a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_ieee_getets(struct qed_dev *cdev, struct ieee_ets *ets) 2156a1d8d8a5SSudarsana Reddy Kalluru { 2157a1d8d8a5SSudarsana Reddy Kalluru return qed_dcbnl_get_ieee_ets(cdev, ets, false); 2158a1d8d8a5SSudarsana Reddy Kalluru } 2159a1d8d8a5SSudarsana Reddy Kalluru 2160a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_ieee_setets(struct qed_dev *cdev, struct ieee_ets *ets) 2161a1d8d8a5SSudarsana Reddy Kalluru { 2162a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 2163a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 2164a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 2165a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 2166a1d8d8a5SSudarsana Reddy Kalluru int rc; 2167a1d8d8a5SSudarsana Reddy Kalluru 2168a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 2169a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 2170a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2171a1d8d8a5SSudarsana Reddy Kalluru 2172a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info->operational.ieee) { 2173a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "DCBX is not enabled/operational in IEEE mode\n"); 2174a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2175a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2176a1d8d8a5SSudarsana Reddy Kalluru } 2177a1d8d8a5SSudarsana Reddy Kalluru 2178a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2179a1d8d8a5SSudarsana Reddy Kalluru 2180a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 2181a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 2182a1d8d8a5SSudarsana Reddy Kalluru if (rc) 2183a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2184a1d8d8a5SSudarsana Reddy Kalluru 2185a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_ETS_CFG; 2186a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.max_ets_tc = ets->ets_cap; 2187a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.ets_willing = ets->willing; 2188a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.ets_cbs = ets->cbs; 2189a1d8d8a5SSudarsana Reddy Kalluru memcpy(dcbx_set.config.params.ets_tc_bw_tbl, ets->tc_tx_bw, 2190a1d8d8a5SSudarsana Reddy Kalluru sizeof(ets->tc_tx_bw)); 2191a1d8d8a5SSudarsana Reddy Kalluru memcpy(dcbx_set.config.params.ets_tc_tsa_tbl, ets->tc_tsa, 2192a1d8d8a5SSudarsana Reddy Kalluru sizeof(ets->tc_tsa)); 2193a1d8d8a5SSudarsana Reddy Kalluru memcpy(dcbx_set.config.params.ets_pri_tc_tbl, ets->prio_tc, 2194a1d8d8a5SSudarsana Reddy Kalluru sizeof(ets->prio_tc)); 2195a1d8d8a5SSudarsana Reddy Kalluru 2196a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 2197a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 2198a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2199a1d8d8a5SSudarsana Reddy Kalluru 2200a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 2201a1d8d8a5SSudarsana Reddy Kalluru 2202a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 2203a1d8d8a5SSudarsana Reddy Kalluru 2204a1d8d8a5SSudarsana Reddy Kalluru return rc; 2205a1d8d8a5SSudarsana Reddy Kalluru } 2206a1d8d8a5SSudarsana Reddy Kalluru 2207ba56947aSBaoyou Xie static int 2208ba56947aSBaoyou Xie qed_dcbnl_ieee_peer_getets(struct qed_dev *cdev, struct ieee_ets *ets) 2209a1d8d8a5SSudarsana Reddy Kalluru { 2210a1d8d8a5SSudarsana Reddy Kalluru return qed_dcbnl_get_ieee_ets(cdev, ets, true); 2211a1d8d8a5SSudarsana Reddy Kalluru } 2212a1d8d8a5SSudarsana Reddy Kalluru 2213ba56947aSBaoyou Xie static int 2214ba56947aSBaoyou Xie qed_dcbnl_ieee_peer_getpfc(struct qed_dev *cdev, struct ieee_pfc *pfc) 2215a1d8d8a5SSudarsana Reddy Kalluru { 2216a1d8d8a5SSudarsana Reddy Kalluru return qed_dcbnl_get_ieee_pfc(cdev, pfc, true); 2217a1d8d8a5SSudarsana Reddy Kalluru } 2218a1d8d8a5SSudarsana Reddy Kalluru 221905a79f92Ssudarsana.kalluru@cavium.com static int qed_get_sf_ieee_value(u8 selector, u8 *sf_ieee) 222005a79f92Ssudarsana.kalluru@cavium.com { 222105a79f92Ssudarsana.kalluru@cavium.com switch (selector) { 222205a79f92Ssudarsana.kalluru@cavium.com case IEEE_8021QAZ_APP_SEL_ETHERTYPE: 222305a79f92Ssudarsana.kalluru@cavium.com *sf_ieee = QED_DCBX_SF_IEEE_ETHTYPE; 222405a79f92Ssudarsana.kalluru@cavium.com break; 222505a79f92Ssudarsana.kalluru@cavium.com case IEEE_8021QAZ_APP_SEL_STREAM: 222605a79f92Ssudarsana.kalluru@cavium.com *sf_ieee = QED_DCBX_SF_IEEE_TCP_PORT; 222705a79f92Ssudarsana.kalluru@cavium.com break; 222805a79f92Ssudarsana.kalluru@cavium.com case IEEE_8021QAZ_APP_SEL_DGRAM: 222905a79f92Ssudarsana.kalluru@cavium.com *sf_ieee = QED_DCBX_SF_IEEE_UDP_PORT; 223005a79f92Ssudarsana.kalluru@cavium.com break; 223105a79f92Ssudarsana.kalluru@cavium.com case IEEE_8021QAZ_APP_SEL_ANY: 223205a79f92Ssudarsana.kalluru@cavium.com *sf_ieee = QED_DCBX_SF_IEEE_TCP_UDP_PORT; 223305a79f92Ssudarsana.kalluru@cavium.com break; 223405a79f92Ssudarsana.kalluru@cavium.com default: 223505a79f92Ssudarsana.kalluru@cavium.com return -EINVAL; 223605a79f92Ssudarsana.kalluru@cavium.com } 223705a79f92Ssudarsana.kalluru@cavium.com 223805a79f92Ssudarsana.kalluru@cavium.com return 0; 223905a79f92Ssudarsana.kalluru@cavium.com } 224005a79f92Ssudarsana.kalluru@cavium.com 2241ba56947aSBaoyou Xie static int qed_dcbnl_ieee_getapp(struct qed_dev *cdev, struct dcb_app *app) 2242a1d8d8a5SSudarsana Reddy Kalluru { 2243a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 2244a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 2245a1d8d8a5SSudarsana Reddy Kalluru struct qed_app_entry *entry; 2246a1d8d8a5SSudarsana Reddy Kalluru u8 prio = 0; 224705a79f92Ssudarsana.kalluru@cavium.com u8 sf_ieee; 2248a1d8d8a5SSudarsana Reddy Kalluru int i; 2249a1d8d8a5SSudarsana Reddy Kalluru 225005a79f92Ssudarsana.kalluru@cavium.com DP_VERBOSE(hwfn, QED_MSG_DCB, "selector = %d protocol = %d\n", 225105a79f92Ssudarsana.kalluru@cavium.com app->selector, app->protocol); 225205a79f92Ssudarsana.kalluru@cavium.com 225305a79f92Ssudarsana.kalluru@cavium.com if (qed_get_sf_ieee_value(app->selector, &sf_ieee)) { 225405a79f92Ssudarsana.kalluru@cavium.com DP_INFO(cdev, "Invalid selector field value %d\n", 225505a79f92Ssudarsana.kalluru@cavium.com app->selector); 225605a79f92Ssudarsana.kalluru@cavium.com return -EINVAL; 225705a79f92Ssudarsana.kalluru@cavium.com } 225805a79f92Ssudarsana.kalluru@cavium.com 2259a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 2260a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 2261a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2262a1d8d8a5SSudarsana Reddy Kalluru 2263a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info->operational.ieee) { 2264a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "DCBX is not enabled/operational in IEEE mode\n"); 2265a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2266a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2267a1d8d8a5SSudarsana Reddy Kalluru } 2268a1d8d8a5SSudarsana Reddy Kalluru 2269a1d8d8a5SSudarsana Reddy Kalluru for (i = 0; i < QED_DCBX_MAX_APP_PROTOCOL; i++) { 2270a1d8d8a5SSudarsana Reddy Kalluru entry = &dcbx_info->operational.params.app_entry[i]; 227105a79f92Ssudarsana.kalluru@cavium.com if ((entry->sf_ieee == sf_ieee) && 2272a1d8d8a5SSudarsana Reddy Kalluru (entry->proto_id == app->protocol)) { 2273a1d8d8a5SSudarsana Reddy Kalluru prio = entry->prio; 2274a1d8d8a5SSudarsana Reddy Kalluru break; 2275a1d8d8a5SSudarsana Reddy Kalluru } 2276a1d8d8a5SSudarsana Reddy Kalluru } 2277a1d8d8a5SSudarsana Reddy Kalluru 2278a1d8d8a5SSudarsana Reddy Kalluru if (i == QED_DCBX_MAX_APP_PROTOCOL) { 2279a1d8d8a5SSudarsana Reddy Kalluru DP_ERR(cdev, "App entry (%d, %d) not found\n", app->selector, 2280a1d8d8a5SSudarsana Reddy Kalluru app->protocol); 2281a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2282a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2283a1d8d8a5SSudarsana Reddy Kalluru } 2284a1d8d8a5SSudarsana Reddy Kalluru 2285a1d8d8a5SSudarsana Reddy Kalluru app->priority = ffs(prio) - 1; 2286a1d8d8a5SSudarsana Reddy Kalluru 2287a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2288a1d8d8a5SSudarsana Reddy Kalluru 2289a1d8d8a5SSudarsana Reddy Kalluru return 0; 2290a1d8d8a5SSudarsana Reddy Kalluru } 2291a1d8d8a5SSudarsana Reddy Kalluru 2292ba56947aSBaoyou Xie static int qed_dcbnl_ieee_setapp(struct qed_dev *cdev, struct dcb_app *app) 2293a1d8d8a5SSudarsana Reddy Kalluru { 2294a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 2295a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 2296a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 2297a1d8d8a5SSudarsana Reddy Kalluru struct qed_app_entry *entry; 2298a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 229905a79f92Ssudarsana.kalluru@cavium.com u8 sf_ieee; 2300a1d8d8a5SSudarsana Reddy Kalluru int rc, i; 2301a1d8d8a5SSudarsana Reddy Kalluru 230205a79f92Ssudarsana.kalluru@cavium.com DP_VERBOSE(hwfn, QED_MSG_DCB, "selector = %d protocol = %d pri = %d\n", 230305a79f92Ssudarsana.kalluru@cavium.com app->selector, app->protocol, app->priority); 2304a1d8d8a5SSudarsana Reddy Kalluru if (app->priority < 0 || app->priority >= QED_MAX_PFC_PRIORITIES) { 2305a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "Invalid priority %d\n", app->priority); 2306a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2307a1d8d8a5SSudarsana Reddy Kalluru } 2308a1d8d8a5SSudarsana Reddy Kalluru 230905a79f92Ssudarsana.kalluru@cavium.com if (qed_get_sf_ieee_value(app->selector, &sf_ieee)) { 231005a79f92Ssudarsana.kalluru@cavium.com DP_INFO(cdev, "Invalid selector field value %d\n", 231105a79f92Ssudarsana.kalluru@cavium.com app->selector); 231205a79f92Ssudarsana.kalluru@cavium.com return -EINVAL; 231305a79f92Ssudarsana.kalluru@cavium.com } 231405a79f92Ssudarsana.kalluru@cavium.com 2315a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 2316a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 2317a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2318a1d8d8a5SSudarsana Reddy Kalluru 2319a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info->operational.ieee) { 2320a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "DCBX is not enabled/operational in IEEE mode\n"); 2321a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2322a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2323a1d8d8a5SSudarsana Reddy Kalluru } 2324a1d8d8a5SSudarsana Reddy Kalluru 2325a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2326a1d8d8a5SSudarsana Reddy Kalluru 2327a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 2328a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 2329a1d8d8a5SSudarsana Reddy Kalluru if (rc) 2330a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2331a1d8d8a5SSudarsana Reddy Kalluru 2332a1d8d8a5SSudarsana Reddy Kalluru for (i = 0; i < QED_DCBX_MAX_APP_PROTOCOL; i++) { 2333a1d8d8a5SSudarsana Reddy Kalluru entry = &dcbx_set.config.params.app_entry[i]; 233405a79f92Ssudarsana.kalluru@cavium.com if ((entry->sf_ieee == sf_ieee) && 2335a1d8d8a5SSudarsana Reddy Kalluru (entry->proto_id == app->protocol)) 2336a1d8d8a5SSudarsana Reddy Kalluru break; 2337a1d8d8a5SSudarsana Reddy Kalluru /* First empty slot */ 23381d7406ceSSudarsana Reddy Kalluru if (!entry->proto_id) { 23391d7406ceSSudarsana Reddy Kalluru dcbx_set.config.params.num_app_entries++; 2340a1d8d8a5SSudarsana Reddy Kalluru break; 2341a1d8d8a5SSudarsana Reddy Kalluru } 23421d7406ceSSudarsana Reddy Kalluru } 2343a1d8d8a5SSudarsana Reddy Kalluru 2344a1d8d8a5SSudarsana Reddy Kalluru if (i == QED_DCBX_MAX_APP_PROTOCOL) { 2345a1d8d8a5SSudarsana Reddy Kalluru DP_ERR(cdev, "App table is full\n"); 2346a1d8d8a5SSudarsana Reddy Kalluru return -EBUSY; 2347a1d8d8a5SSudarsana Reddy Kalluru } 2348a1d8d8a5SSudarsana Reddy Kalluru 2349a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_APP_CFG; 235005a79f92Ssudarsana.kalluru@cavium.com dcbx_set.config.params.app_entry[i].sf_ieee = sf_ieee; 2351a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.app_entry[i].proto_id = app->protocol; 2352a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.app_entry[i].prio = BIT(app->priority); 2353a1d8d8a5SSudarsana Reddy Kalluru 2354a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 2355a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 2356a1d8d8a5SSudarsana Reddy Kalluru return -EBUSY; 2357a1d8d8a5SSudarsana Reddy Kalluru 2358a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 2359a1d8d8a5SSudarsana Reddy Kalluru 2360a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 2361a1d8d8a5SSudarsana Reddy Kalluru 2362a1d8d8a5SSudarsana Reddy Kalluru return rc; 2363a1d8d8a5SSudarsana Reddy Kalluru } 2364a1d8d8a5SSudarsana Reddy Kalluru 2365a1d8d8a5SSudarsana Reddy Kalluru const struct qed_eth_dcbnl_ops qed_dcbnl_ops_pass = { 2366a1d8d8a5SSudarsana Reddy Kalluru .getstate = qed_dcbnl_getstate, 2367a1d8d8a5SSudarsana Reddy Kalluru .setstate = qed_dcbnl_setstate, 2368a1d8d8a5SSudarsana Reddy Kalluru .getpgtccfgtx = qed_dcbnl_getpgtccfgtx, 2369a1d8d8a5SSudarsana Reddy Kalluru .getpgbwgcfgtx = qed_dcbnl_getpgbwgcfgtx, 2370a1d8d8a5SSudarsana Reddy Kalluru .getpgtccfgrx = qed_dcbnl_getpgtccfgrx, 2371a1d8d8a5SSudarsana Reddy Kalluru .getpgbwgcfgrx = qed_dcbnl_getpgbwgcfgrx, 2372a1d8d8a5SSudarsana Reddy Kalluru .getpfccfg = qed_dcbnl_getpfccfg, 2373a1d8d8a5SSudarsana Reddy Kalluru .setpfccfg = qed_dcbnl_setpfccfg, 2374a1d8d8a5SSudarsana Reddy Kalluru .getcap = qed_dcbnl_getcap, 2375a1d8d8a5SSudarsana Reddy Kalluru .getnumtcs = qed_dcbnl_getnumtcs, 2376a1d8d8a5SSudarsana Reddy Kalluru .getpfcstate = qed_dcbnl_getpfcstate, 2377a1d8d8a5SSudarsana Reddy Kalluru .getdcbx = qed_dcbnl_getdcbx, 2378a1d8d8a5SSudarsana Reddy Kalluru .setpgtccfgtx = qed_dcbnl_setpgtccfgtx, 2379a1d8d8a5SSudarsana Reddy Kalluru .setpgtccfgrx = qed_dcbnl_setpgtccfgrx, 2380a1d8d8a5SSudarsana Reddy Kalluru .setpgbwgcfgtx = qed_dcbnl_setpgbwgcfgtx, 2381a1d8d8a5SSudarsana Reddy Kalluru .setpgbwgcfgrx = qed_dcbnl_setpgbwgcfgrx, 2382a1d8d8a5SSudarsana Reddy Kalluru .setall = qed_dcbnl_setall, 2383a1d8d8a5SSudarsana Reddy Kalluru .setnumtcs = qed_dcbnl_setnumtcs, 2384a1d8d8a5SSudarsana Reddy Kalluru .setpfcstate = qed_dcbnl_setpfcstate, 2385a1d8d8a5SSudarsana Reddy Kalluru .setapp = qed_dcbnl_setapp, 2386a1d8d8a5SSudarsana Reddy Kalluru .setdcbx = qed_dcbnl_setdcbx, 2387a1d8d8a5SSudarsana Reddy Kalluru .setfeatcfg = qed_dcbnl_setfeatcfg, 2388a1d8d8a5SSudarsana Reddy Kalluru .getfeatcfg = qed_dcbnl_getfeatcfg, 2389a1d8d8a5SSudarsana Reddy Kalluru .getapp = qed_dcbnl_getapp, 2390a1d8d8a5SSudarsana Reddy Kalluru .peer_getappinfo = qed_dcbnl_peer_getappinfo, 2391a1d8d8a5SSudarsana Reddy Kalluru .peer_getapptable = qed_dcbnl_peer_getapptable, 2392a1d8d8a5SSudarsana Reddy Kalluru .cee_peer_getpfc = qed_dcbnl_cee_peer_getpfc, 2393a1d8d8a5SSudarsana Reddy Kalluru .cee_peer_getpg = qed_dcbnl_cee_peer_getpg, 2394a1d8d8a5SSudarsana Reddy Kalluru .ieee_getpfc = qed_dcbnl_ieee_getpfc, 2395a1d8d8a5SSudarsana Reddy Kalluru .ieee_setpfc = qed_dcbnl_ieee_setpfc, 2396a1d8d8a5SSudarsana Reddy Kalluru .ieee_getets = qed_dcbnl_ieee_getets, 2397a1d8d8a5SSudarsana Reddy Kalluru .ieee_setets = qed_dcbnl_ieee_setets, 2398a1d8d8a5SSudarsana Reddy Kalluru .ieee_peer_getpfc = qed_dcbnl_ieee_peer_getpfc, 2399a1d8d8a5SSudarsana Reddy Kalluru .ieee_peer_getets = qed_dcbnl_ieee_peer_getets, 2400a1d8d8a5SSudarsana Reddy Kalluru .ieee_getapp = qed_dcbnl_ieee_getapp, 2401a1d8d8a5SSudarsana Reddy Kalluru .ieee_setapp = qed_dcbnl_ieee_setapp, 2402a1d8d8a5SSudarsana Reddy Kalluru }; 2403a1d8d8a5SSudarsana Reddy Kalluru 24046ad8c632SSudarsana Reddy Kalluru #endif 2405