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 /* If RoCE-V2 TLV is not detected, driver need to use RoCE app 31439651abdSSudarsana Reddy Kalluru * data for RoCE-v2 not the default app data. 31539651abdSSudarsana Reddy Kalluru */ 31639651abdSSudarsana Reddy Kalluru if (!p_data->arr[DCBX_PROTOCOL_ROCE_V2].update && 31739651abdSSudarsana Reddy Kalluru p_data->arr[DCBX_PROTOCOL_ROCE].update) { 31839651abdSSudarsana Reddy Kalluru tc = p_data->arr[DCBX_PROTOCOL_ROCE].tc; 31939651abdSSudarsana Reddy Kalluru priority = p_data->arr[DCBX_PROTOCOL_ROCE].priority; 320dfc268f6SSudarsana Reddy Kalluru qed_dcbx_update_app_info(p_data, p_hwfn, true, 32139651abdSSudarsana Reddy Kalluru priority, tc, DCBX_PROTOCOL_ROCE_V2); 32239651abdSSudarsana Reddy Kalluru } 32339651abdSSudarsana Reddy Kalluru 32439651abdSSudarsana Reddy Kalluru /* Update ramrod protocol data and hw_info fields 32539651abdSSudarsana Reddy Kalluru * with default info when corresponding APP TLV's are not detected. 32639651abdSSudarsana Reddy Kalluru * The enabled field has a different logic for ethernet as only for 32739651abdSSudarsana Reddy Kalluru * ethernet dcb should disabled by default, as the information arrives 32839651abdSSudarsana Reddy Kalluru * from the OS (unless an explicit app tlv was present). 32939651abdSSudarsana Reddy Kalluru */ 33039651abdSSudarsana Reddy Kalluru tc = p_data->arr[DCBX_PROTOCOL_ETH].tc; 33139651abdSSudarsana Reddy Kalluru priority = p_data->arr[DCBX_PROTOCOL_ETH].priority; 33239651abdSSudarsana Reddy Kalluru for (type = 0; type < DCBX_MAX_PROTOCOL_TYPE; type++) { 33339651abdSSudarsana Reddy Kalluru if (p_data->arr[type].update) 33439651abdSSudarsana Reddy Kalluru continue; 33539651abdSSudarsana Reddy Kalluru 336dfc268f6SSudarsana Reddy Kalluru enable = (type == DCBX_PROTOCOL_ETH) ? false : !!dcbx_version; 337dfc268f6SSudarsana Reddy Kalluru qed_dcbx_update_app_info(p_data, p_hwfn, enable, 33839651abdSSudarsana Reddy Kalluru priority, tc, type); 33939651abdSSudarsana Reddy Kalluru } 34039651abdSSudarsana Reddy Kalluru 34139651abdSSudarsana Reddy Kalluru return 0; 34239651abdSSudarsana Reddy Kalluru } 34339651abdSSudarsana Reddy Kalluru 34439651abdSSudarsana Reddy Kalluru /* Parse app TLV's to update TC information in hw_info structure for 34539651abdSSudarsana Reddy Kalluru * reconfiguring QM. Get protocol specific data for PF update ramrod command. 34639651abdSSudarsana Reddy Kalluru */ 34739651abdSSudarsana Reddy Kalluru static int qed_dcbx_process_mib_info(struct qed_hwfn *p_hwfn) 34839651abdSSudarsana Reddy Kalluru { 34939651abdSSudarsana Reddy Kalluru struct dcbx_app_priority_feature *p_app; 35039651abdSSudarsana Reddy Kalluru struct dcbx_app_priority_entry *p_tbl; 35139651abdSSudarsana Reddy Kalluru struct qed_dcbx_results data = { 0 }; 35239651abdSSudarsana Reddy Kalluru struct dcbx_ets_feature *p_ets; 35339651abdSSudarsana Reddy Kalluru struct qed_hw_info *p_info; 35439651abdSSudarsana Reddy Kalluru u32 pri_tc_tbl, flags; 355fb9ea8a9SSudarsana Reddy Kalluru u8 dcbx_version; 35639651abdSSudarsana Reddy Kalluru int num_entries; 35739651abdSSudarsana Reddy Kalluru int rc = 0; 35839651abdSSudarsana Reddy Kalluru 35939651abdSSudarsana Reddy Kalluru flags = p_hwfn->p_dcbx_info->operational.flags; 360fb9ea8a9SSudarsana Reddy Kalluru dcbx_version = QED_MFW_GET_FIELD(flags, DCBX_CONFIG_VERSION); 36139651abdSSudarsana Reddy Kalluru 36239651abdSSudarsana Reddy Kalluru p_app = &p_hwfn->p_dcbx_info->operational.features.app; 36339651abdSSudarsana Reddy Kalluru p_tbl = p_app->app_pri_tbl; 36439651abdSSudarsana Reddy Kalluru 36539651abdSSudarsana Reddy Kalluru p_ets = &p_hwfn->p_dcbx_info->operational.features.ets; 36639651abdSSudarsana Reddy Kalluru pri_tc_tbl = p_ets->pri_tc_tbl[0]; 36739651abdSSudarsana Reddy Kalluru 36839651abdSSudarsana Reddy Kalluru p_info = &p_hwfn->hw_info; 36939651abdSSudarsana Reddy Kalluru num_entries = QED_MFW_GET_FIELD(p_app->flags, DCBX_APP_NUM_ENTRIES); 37039651abdSSudarsana Reddy Kalluru 37139651abdSSudarsana Reddy Kalluru rc = qed_dcbx_process_tlv(p_hwfn, &data, p_tbl, pri_tc_tbl, 372fb9ea8a9SSudarsana Reddy Kalluru num_entries, dcbx_version); 37339651abdSSudarsana Reddy Kalluru if (rc) 37439651abdSSudarsana Reddy Kalluru return rc; 37539651abdSSudarsana Reddy Kalluru 376b5a9ee7cSAriel Elior p_info->num_active_tc = QED_MFW_GET_FIELD(p_ets->flags, 377b5a9ee7cSAriel Elior DCBX_ETS_MAX_TCS); 378b5a9ee7cSAriel Elior p_hwfn->qm_info.ooo_tc = QED_MFW_GET_FIELD(p_ets->flags, DCBX_OOO_TC); 37939651abdSSudarsana Reddy Kalluru data.pf_id = p_hwfn->rel_pf_id; 380fb9ea8a9SSudarsana Reddy Kalluru data.dcbx_enabled = !!dcbx_version; 38139651abdSSudarsana Reddy Kalluru 38239651abdSSudarsana Reddy Kalluru qed_dcbx_dp_protocol(p_hwfn, &data); 38339651abdSSudarsana Reddy Kalluru 38439651abdSSudarsana Reddy Kalluru memcpy(&p_hwfn->p_dcbx_info->results, &data, 38539651abdSSudarsana Reddy Kalluru sizeof(struct qed_dcbx_results)); 38639651abdSSudarsana Reddy Kalluru 38739651abdSSudarsana Reddy Kalluru return 0; 38839651abdSSudarsana Reddy Kalluru } 38939651abdSSudarsana Reddy Kalluru 39039651abdSSudarsana Reddy Kalluru static int 39139651abdSSudarsana Reddy Kalluru qed_dcbx_copy_mib(struct qed_hwfn *p_hwfn, 39239651abdSSudarsana Reddy Kalluru struct qed_ptt *p_ptt, 39339651abdSSudarsana Reddy Kalluru struct qed_dcbx_mib_meta_data *p_data, 39439651abdSSudarsana Reddy Kalluru enum qed_mib_read_type type) 39539651abdSSudarsana Reddy Kalluru { 39639651abdSSudarsana Reddy Kalluru u32 prefix_seq_num, suffix_seq_num; 39739651abdSSudarsana Reddy Kalluru int read_count = 0; 39839651abdSSudarsana Reddy Kalluru int rc = 0; 39939651abdSSudarsana Reddy Kalluru 40039651abdSSudarsana Reddy Kalluru /* The data is considered to be valid only if both sequence numbers are 40139651abdSSudarsana Reddy Kalluru * the same. 40239651abdSSudarsana Reddy Kalluru */ 40339651abdSSudarsana Reddy Kalluru do { 40439651abdSSudarsana Reddy Kalluru if (type == QED_DCBX_REMOTE_LLDP_MIB) { 40539651abdSSudarsana Reddy Kalluru qed_memcpy_from(p_hwfn, p_ptt, p_data->lldp_remote, 40639651abdSSudarsana Reddy Kalluru p_data->addr, p_data->size); 40739651abdSSudarsana Reddy Kalluru prefix_seq_num = p_data->lldp_remote->prefix_seq_num; 40839651abdSSudarsana Reddy Kalluru suffix_seq_num = p_data->lldp_remote->suffix_seq_num; 40939651abdSSudarsana Reddy Kalluru } else { 41039651abdSSudarsana Reddy Kalluru qed_memcpy_from(p_hwfn, p_ptt, p_data->mib, 41139651abdSSudarsana Reddy Kalluru p_data->addr, p_data->size); 41239651abdSSudarsana Reddy Kalluru prefix_seq_num = p_data->mib->prefix_seq_num; 41339651abdSSudarsana Reddy Kalluru suffix_seq_num = p_data->mib->suffix_seq_num; 41439651abdSSudarsana Reddy Kalluru } 41539651abdSSudarsana Reddy Kalluru read_count++; 41639651abdSSudarsana Reddy Kalluru 41739651abdSSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, 41839651abdSSudarsana Reddy Kalluru QED_MSG_DCB, 41939651abdSSudarsana Reddy Kalluru "mib type = %d, try count = %d prefix seq num = %d suffix seq num = %d\n", 42039651abdSSudarsana Reddy Kalluru type, read_count, prefix_seq_num, suffix_seq_num); 42139651abdSSudarsana Reddy Kalluru } while ((prefix_seq_num != suffix_seq_num) && 42239651abdSSudarsana Reddy Kalluru (read_count < QED_DCBX_MAX_MIB_READ_TRY)); 42339651abdSSudarsana Reddy Kalluru 42439651abdSSudarsana Reddy Kalluru if (read_count >= QED_DCBX_MAX_MIB_READ_TRY) { 42539651abdSSudarsana Reddy Kalluru DP_ERR(p_hwfn, 42639651abdSSudarsana Reddy Kalluru "MIB read err, mib type = %d, try count = %d prefix seq num = %d suffix seq num = %d\n", 42739651abdSSudarsana Reddy Kalluru type, read_count, prefix_seq_num, suffix_seq_num); 42839651abdSSudarsana Reddy Kalluru rc = -EIO; 42939651abdSSudarsana Reddy Kalluru } 43039651abdSSudarsana Reddy Kalluru 43139651abdSSudarsana Reddy Kalluru return rc; 43239651abdSSudarsana Reddy Kalluru } 43339651abdSSudarsana Reddy Kalluru 4346ad8c632SSudarsana Reddy Kalluru static void 4356ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_priority_info(struct qed_hwfn *p_hwfn, 4366ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_app_prio *p_prio, 4376ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_results *p_results) 4386ad8c632SSudarsana Reddy Kalluru { 4396ad8c632SSudarsana Reddy Kalluru u8 val; 4406ad8c632SSudarsana Reddy Kalluru 4416ad8c632SSudarsana Reddy Kalluru p_prio->roce = QED_DCBX_INVALID_PRIORITY; 4426ad8c632SSudarsana Reddy Kalluru p_prio->roce_v2 = QED_DCBX_INVALID_PRIORITY; 4436ad8c632SSudarsana Reddy Kalluru p_prio->iscsi = QED_DCBX_INVALID_PRIORITY; 4446ad8c632SSudarsana Reddy Kalluru p_prio->fcoe = QED_DCBX_INVALID_PRIORITY; 4456ad8c632SSudarsana Reddy Kalluru 4466ad8c632SSudarsana Reddy Kalluru if (p_results->arr[DCBX_PROTOCOL_ROCE].update && 4476ad8c632SSudarsana Reddy Kalluru p_results->arr[DCBX_PROTOCOL_ROCE].enable) 4486ad8c632SSudarsana Reddy Kalluru p_prio->roce = p_results->arr[DCBX_PROTOCOL_ROCE].priority; 4496ad8c632SSudarsana Reddy Kalluru 4506ad8c632SSudarsana Reddy Kalluru if (p_results->arr[DCBX_PROTOCOL_ROCE_V2].update && 4516ad8c632SSudarsana Reddy Kalluru p_results->arr[DCBX_PROTOCOL_ROCE_V2].enable) { 4526ad8c632SSudarsana Reddy Kalluru val = p_results->arr[DCBX_PROTOCOL_ROCE_V2].priority; 4536ad8c632SSudarsana Reddy Kalluru p_prio->roce_v2 = val; 4546ad8c632SSudarsana Reddy Kalluru } 4556ad8c632SSudarsana Reddy Kalluru 4566ad8c632SSudarsana Reddy Kalluru if (p_results->arr[DCBX_PROTOCOL_ISCSI].update && 4576ad8c632SSudarsana Reddy Kalluru p_results->arr[DCBX_PROTOCOL_ISCSI].enable) 4586ad8c632SSudarsana Reddy Kalluru p_prio->iscsi = p_results->arr[DCBX_PROTOCOL_ISCSI].priority; 4596ad8c632SSudarsana Reddy Kalluru 4606ad8c632SSudarsana Reddy Kalluru if (p_results->arr[DCBX_PROTOCOL_FCOE].update && 4616ad8c632SSudarsana Reddy Kalluru p_results->arr[DCBX_PROTOCOL_FCOE].enable) 4626ad8c632SSudarsana Reddy Kalluru p_prio->fcoe = p_results->arr[DCBX_PROTOCOL_FCOE].priority; 4636ad8c632SSudarsana Reddy Kalluru 4646ad8c632SSudarsana Reddy Kalluru if (p_results->arr[DCBX_PROTOCOL_ETH].update && 4656ad8c632SSudarsana Reddy Kalluru p_results->arr[DCBX_PROTOCOL_ETH].enable) 4666ad8c632SSudarsana Reddy Kalluru p_prio->eth = p_results->arr[DCBX_PROTOCOL_ETH].priority; 4676ad8c632SSudarsana Reddy Kalluru 4686ad8c632SSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, 4696ad8c632SSudarsana Reddy Kalluru "Priorities: iscsi %d, roce %d, roce v2 %d, fcoe %d, eth %d\n", 4706ad8c632SSudarsana Reddy Kalluru p_prio->iscsi, p_prio->roce, p_prio->roce_v2, p_prio->fcoe, 4716ad8c632SSudarsana Reddy Kalluru p_prio->eth); 4726ad8c632SSudarsana Reddy Kalluru } 4736ad8c632SSudarsana Reddy Kalluru 4746ad8c632SSudarsana Reddy Kalluru static void 4756ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_app_data(struct qed_hwfn *p_hwfn, 4766ad8c632SSudarsana Reddy Kalluru struct dcbx_app_priority_feature *p_app, 4776ad8c632SSudarsana Reddy Kalluru struct dcbx_app_priority_entry *p_tbl, 478fb9ea8a9SSudarsana Reddy Kalluru struct qed_dcbx_params *p_params, bool ieee) 4796ad8c632SSudarsana Reddy Kalluru { 4806ad8c632SSudarsana Reddy Kalluru struct qed_app_entry *entry; 4816ad8c632SSudarsana Reddy Kalluru u8 pri_map; 4826ad8c632SSudarsana Reddy Kalluru int i; 4836ad8c632SSudarsana Reddy Kalluru 4846ad8c632SSudarsana Reddy Kalluru p_params->app_willing = QED_MFW_GET_FIELD(p_app->flags, 4856ad8c632SSudarsana Reddy Kalluru DCBX_APP_WILLING); 4866ad8c632SSudarsana Reddy Kalluru p_params->app_valid = QED_MFW_GET_FIELD(p_app->flags, DCBX_APP_ENABLED); 4876ad8c632SSudarsana Reddy Kalluru p_params->app_error = QED_MFW_GET_FIELD(p_app->flags, DCBX_APP_ERROR); 4886ad8c632SSudarsana Reddy Kalluru p_params->num_app_entries = QED_MFW_GET_FIELD(p_app->flags, 4896ad8c632SSudarsana Reddy Kalluru DCBX_APP_NUM_ENTRIES); 4906ad8c632SSudarsana Reddy Kalluru for (i = 0; i < DCBX_MAX_APP_PROTOCOL; i++) { 4916ad8c632SSudarsana Reddy Kalluru entry = &p_params->app_entry[i]; 49259bcb797SSudarsana Reddy Kalluru if (ieee) { 49359bcb797SSudarsana Reddy Kalluru u8 sf_ieee; 49459bcb797SSudarsana Reddy Kalluru u32 val; 49559bcb797SSudarsana Reddy Kalluru 49659bcb797SSudarsana Reddy Kalluru sf_ieee = QED_MFW_GET_FIELD(p_tbl[i].entry, 49759bcb797SSudarsana Reddy Kalluru DCBX_APP_SF_IEEE); 49859bcb797SSudarsana Reddy Kalluru switch (sf_ieee) { 49959bcb797SSudarsana Reddy Kalluru case DCBX_APP_SF_IEEE_RESERVED: 50059bcb797SSudarsana Reddy Kalluru /* Old MFW */ 50159bcb797SSudarsana Reddy Kalluru val = QED_MFW_GET_FIELD(p_tbl[i].entry, 50259bcb797SSudarsana Reddy Kalluru DCBX_APP_SF); 50359bcb797SSudarsana Reddy Kalluru entry->sf_ieee = val ? 50459bcb797SSudarsana Reddy Kalluru QED_DCBX_SF_IEEE_TCP_UDP_PORT : 50559bcb797SSudarsana Reddy Kalluru QED_DCBX_SF_IEEE_ETHTYPE; 50659bcb797SSudarsana Reddy Kalluru break; 50759bcb797SSudarsana Reddy Kalluru case DCBX_APP_SF_IEEE_ETHTYPE: 50859bcb797SSudarsana Reddy Kalluru entry->sf_ieee = QED_DCBX_SF_IEEE_ETHTYPE; 50959bcb797SSudarsana Reddy Kalluru break; 51059bcb797SSudarsana Reddy Kalluru case DCBX_APP_SF_IEEE_TCP_PORT: 51159bcb797SSudarsana Reddy Kalluru entry->sf_ieee = QED_DCBX_SF_IEEE_TCP_PORT; 51259bcb797SSudarsana Reddy Kalluru break; 51359bcb797SSudarsana Reddy Kalluru case DCBX_APP_SF_IEEE_UDP_PORT: 51459bcb797SSudarsana Reddy Kalluru entry->sf_ieee = QED_DCBX_SF_IEEE_UDP_PORT; 51559bcb797SSudarsana Reddy Kalluru break; 51659bcb797SSudarsana Reddy Kalluru case DCBX_APP_SF_IEEE_TCP_UDP_PORT: 51759bcb797SSudarsana Reddy Kalluru entry->sf_ieee = QED_DCBX_SF_IEEE_TCP_UDP_PORT; 51859bcb797SSudarsana Reddy Kalluru break; 51959bcb797SSudarsana Reddy Kalluru } 52059bcb797SSudarsana Reddy Kalluru } else { 5216ad8c632SSudarsana Reddy Kalluru entry->ethtype = !(QED_MFW_GET_FIELD(p_tbl[i].entry, 5226ad8c632SSudarsana Reddy Kalluru DCBX_APP_SF)); 52359bcb797SSudarsana Reddy Kalluru } 52459bcb797SSudarsana Reddy Kalluru 5256ad8c632SSudarsana Reddy Kalluru pri_map = QED_MFW_GET_FIELD(p_tbl[i].entry, DCBX_APP_PRI_MAP); 5266ad8c632SSudarsana Reddy Kalluru entry->prio = ffs(pri_map) - 1; 5276ad8c632SSudarsana Reddy Kalluru entry->proto_id = QED_MFW_GET_FIELD(p_tbl[i].entry, 5286ad8c632SSudarsana Reddy Kalluru DCBX_APP_PROTOCOL_ID); 5296ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_app_protocol_type(p_hwfn, p_tbl[i].entry, 5306ad8c632SSudarsana Reddy Kalluru entry->proto_id, 531fb9ea8a9SSudarsana Reddy Kalluru &entry->proto_type, ieee); 5326ad8c632SSudarsana Reddy Kalluru } 5336ad8c632SSudarsana Reddy Kalluru 5346ad8c632SSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, 5356ad8c632SSudarsana Reddy Kalluru "APP params: willing %d, valid %d error = %d\n", 5366ad8c632SSudarsana Reddy Kalluru p_params->app_willing, p_params->app_valid, 5376ad8c632SSudarsana Reddy Kalluru p_params->app_error); 5386ad8c632SSudarsana Reddy Kalluru } 5396ad8c632SSudarsana Reddy Kalluru 5406ad8c632SSudarsana Reddy Kalluru static void 5416ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_pfc_data(struct qed_hwfn *p_hwfn, 5426ad8c632SSudarsana Reddy Kalluru u32 pfc, struct qed_dcbx_params *p_params) 5436ad8c632SSudarsana Reddy Kalluru { 5446ad8c632SSudarsana Reddy Kalluru u8 pfc_map; 5456ad8c632SSudarsana Reddy Kalluru 5466ad8c632SSudarsana Reddy Kalluru p_params->pfc.willing = QED_MFW_GET_FIELD(pfc, DCBX_PFC_WILLING); 5476ad8c632SSudarsana Reddy Kalluru p_params->pfc.max_tc = QED_MFW_GET_FIELD(pfc, DCBX_PFC_CAPS); 5486ad8c632SSudarsana Reddy Kalluru p_params->pfc.enabled = QED_MFW_GET_FIELD(pfc, DCBX_PFC_ENABLED); 5496ad8c632SSudarsana Reddy Kalluru pfc_map = QED_MFW_GET_FIELD(pfc, DCBX_PFC_PRI_EN_BITMAP); 5506ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[0] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_0); 5516ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[1] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_1); 5526ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[2] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_2); 5536ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[3] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_3); 5546ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[4] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_4); 5556ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[5] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_5); 5566ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[6] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_6); 5576ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[7] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_7); 5586ad8c632SSudarsana Reddy Kalluru 5596ad8c632SSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, 560dfbeb85fSsudarsana.kalluru@cavium.com "PFC params: willing %d, pfc_bitmap %u max_tc = %u enabled = %d\n", 561dfbeb85fSsudarsana.kalluru@cavium.com p_params->pfc.willing, pfc_map, p_params->pfc.max_tc, 562dfbeb85fSsudarsana.kalluru@cavium.com p_params->pfc.enabled); 5636ad8c632SSudarsana Reddy Kalluru } 5646ad8c632SSudarsana Reddy Kalluru 5656ad8c632SSudarsana Reddy Kalluru static void 5666ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_ets_data(struct qed_hwfn *p_hwfn, 5676ad8c632SSudarsana Reddy Kalluru struct dcbx_ets_feature *p_ets, 5686ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_params *p_params) 5696ad8c632SSudarsana Reddy Kalluru { 5706ad8c632SSudarsana Reddy Kalluru u32 bw_map[2], tsa_map[2], pri_map; 5716ad8c632SSudarsana Reddy Kalluru int i; 5726ad8c632SSudarsana Reddy Kalluru 5736ad8c632SSudarsana Reddy Kalluru p_params->ets_willing = QED_MFW_GET_FIELD(p_ets->flags, 5746ad8c632SSudarsana Reddy Kalluru DCBX_ETS_WILLING); 5756ad8c632SSudarsana Reddy Kalluru p_params->ets_enabled = QED_MFW_GET_FIELD(p_ets->flags, 5766ad8c632SSudarsana Reddy Kalluru DCBX_ETS_ENABLED); 5776ad8c632SSudarsana Reddy Kalluru p_params->ets_cbs = QED_MFW_GET_FIELD(p_ets->flags, DCBX_ETS_CBS); 5786ad8c632SSudarsana Reddy Kalluru p_params->max_ets_tc = QED_MFW_GET_FIELD(p_ets->flags, 5796ad8c632SSudarsana Reddy Kalluru DCBX_ETS_MAX_TCS); 5806ad8c632SSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, 581dfbeb85fSsudarsana.kalluru@cavium.com "ETS params: willing %d, enabled = %d ets_cbs %d pri_tc_tbl_0 %x max_ets_tc %d\n", 582dfbeb85fSsudarsana.kalluru@cavium.com p_params->ets_willing, p_params->ets_enabled, 583dfbeb85fSsudarsana.kalluru@cavium.com p_params->ets_cbs, p_ets->pri_tc_tbl[0], 584dfbeb85fSsudarsana.kalluru@cavium.com p_params->max_ets_tc); 5856ad8c632SSudarsana Reddy Kalluru 58666367dabSsudarsana.kalluru@cavium.com if (p_params->ets_enabled && !p_params->max_ets_tc) { 58766367dabSsudarsana.kalluru@cavium.com p_params->max_ets_tc = QED_MAX_PFC_PRIORITIES; 58866367dabSsudarsana.kalluru@cavium.com DP_VERBOSE(p_hwfn, QED_MSG_DCB, 58966367dabSsudarsana.kalluru@cavium.com "ETS params: max_ets_tc is forced to %d\n", 59066367dabSsudarsana.kalluru@cavium.com p_params->max_ets_tc); 59166367dabSsudarsana.kalluru@cavium.com } 59266367dabSsudarsana.kalluru@cavium.com 5936ad8c632SSudarsana Reddy Kalluru /* 8 bit tsa and bw data corresponding to each of the 8 TC's are 5946ad8c632SSudarsana Reddy Kalluru * encoded in a type u32 array of size 2. 5956ad8c632SSudarsana Reddy Kalluru */ 5966ad8c632SSudarsana Reddy Kalluru bw_map[0] = be32_to_cpu(p_ets->tc_bw_tbl[0]); 5976ad8c632SSudarsana Reddy Kalluru bw_map[1] = be32_to_cpu(p_ets->tc_bw_tbl[1]); 5986ad8c632SSudarsana Reddy Kalluru tsa_map[0] = be32_to_cpu(p_ets->tc_tsa_tbl[0]); 5996ad8c632SSudarsana Reddy Kalluru tsa_map[1] = be32_to_cpu(p_ets->tc_tsa_tbl[1]); 600c0c45a6bSSudarsana Reddy Kalluru pri_map = p_ets->pri_tc_tbl[0]; 6016ad8c632SSudarsana Reddy Kalluru for (i = 0; i < QED_MAX_PFC_PRIORITIES; i++) { 6026ad8c632SSudarsana Reddy Kalluru p_params->ets_tc_bw_tbl[i] = ((u8 *)bw_map)[i]; 6036ad8c632SSudarsana Reddy Kalluru p_params->ets_tc_tsa_tbl[i] = ((u8 *)tsa_map)[i]; 6046ad8c632SSudarsana Reddy Kalluru p_params->ets_pri_tc_tbl[i] = QED_DCBX_PRIO2TC(pri_map, i); 6056ad8c632SSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, 6066ad8c632SSudarsana Reddy Kalluru "elem %d bw_tbl %x tsa_tbl %x\n", 6076ad8c632SSudarsana Reddy Kalluru i, p_params->ets_tc_bw_tbl[i], 6086ad8c632SSudarsana Reddy Kalluru p_params->ets_tc_tsa_tbl[i]); 6096ad8c632SSudarsana Reddy Kalluru } 6106ad8c632SSudarsana Reddy Kalluru } 6116ad8c632SSudarsana Reddy Kalluru 6126ad8c632SSudarsana Reddy Kalluru static void 6136ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_common_params(struct qed_hwfn *p_hwfn, 6146ad8c632SSudarsana Reddy Kalluru struct dcbx_app_priority_feature *p_app, 6156ad8c632SSudarsana Reddy Kalluru struct dcbx_app_priority_entry *p_tbl, 6166ad8c632SSudarsana Reddy Kalluru struct dcbx_ets_feature *p_ets, 617fb9ea8a9SSudarsana Reddy Kalluru u32 pfc, struct qed_dcbx_params *p_params, bool ieee) 6186ad8c632SSudarsana Reddy Kalluru { 619fb9ea8a9SSudarsana Reddy Kalluru qed_dcbx_get_app_data(p_hwfn, p_app, p_tbl, p_params, ieee); 6206ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_ets_data(p_hwfn, p_ets, p_params); 6216ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_pfc_data(p_hwfn, pfc, p_params); 6226ad8c632SSudarsana Reddy Kalluru } 6236ad8c632SSudarsana Reddy Kalluru 6246ad8c632SSudarsana Reddy Kalluru static void 625270837b3Ssudarsana.kalluru@cavium.com qed_dcbx_get_local_params(struct qed_hwfn *p_hwfn, struct qed_dcbx_get *params) 6266ad8c632SSudarsana Reddy Kalluru { 6276ad8c632SSudarsana Reddy Kalluru struct dcbx_features *p_feat; 6286ad8c632SSudarsana Reddy Kalluru 6296ad8c632SSudarsana Reddy Kalluru p_feat = &p_hwfn->p_dcbx_info->local_admin.features; 6306ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_common_params(p_hwfn, &p_feat->app, 6316ad8c632SSudarsana Reddy Kalluru p_feat->app.app_pri_tbl, &p_feat->ets, 632fb9ea8a9SSudarsana Reddy Kalluru p_feat->pfc, ¶ms->local.params, false); 6336ad8c632SSudarsana Reddy Kalluru params->local.valid = true; 6346ad8c632SSudarsana Reddy Kalluru } 6356ad8c632SSudarsana Reddy Kalluru 6366ad8c632SSudarsana Reddy Kalluru static void 637270837b3Ssudarsana.kalluru@cavium.com qed_dcbx_get_remote_params(struct qed_hwfn *p_hwfn, struct qed_dcbx_get *params) 6386ad8c632SSudarsana Reddy Kalluru { 6396ad8c632SSudarsana Reddy Kalluru struct dcbx_features *p_feat; 6406ad8c632SSudarsana Reddy Kalluru 6416ad8c632SSudarsana Reddy Kalluru p_feat = &p_hwfn->p_dcbx_info->remote.features; 6426ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_common_params(p_hwfn, &p_feat->app, 6436ad8c632SSudarsana Reddy Kalluru p_feat->app.app_pri_tbl, &p_feat->ets, 644fb9ea8a9SSudarsana Reddy Kalluru p_feat->pfc, ¶ms->remote.params, false); 6456ad8c632SSudarsana Reddy Kalluru params->remote.valid = true; 6466ad8c632SSudarsana Reddy Kalluru } 6476ad8c632SSudarsana Reddy Kalluru 6486ad8c632SSudarsana Reddy Kalluru static void 6496ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_operational_params(struct qed_hwfn *p_hwfn, 6506ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_get *params) 6516ad8c632SSudarsana Reddy Kalluru { 6526ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_operational_params *p_operational; 6536ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_results *p_results; 6546ad8c632SSudarsana Reddy Kalluru struct dcbx_features *p_feat; 6556ad8c632SSudarsana Reddy Kalluru bool enabled, err; 6566ad8c632SSudarsana Reddy Kalluru u32 flags; 6576ad8c632SSudarsana Reddy Kalluru bool val; 6586ad8c632SSudarsana Reddy Kalluru 6596ad8c632SSudarsana Reddy Kalluru flags = p_hwfn->p_dcbx_info->operational.flags; 6606ad8c632SSudarsana Reddy Kalluru 6616ad8c632SSudarsana Reddy Kalluru /* If DCBx version is non zero, then negotiation 6626ad8c632SSudarsana Reddy Kalluru * was successfuly performed 6636ad8c632SSudarsana Reddy Kalluru */ 6646ad8c632SSudarsana Reddy Kalluru p_operational = ¶ms->operational; 6656ad8c632SSudarsana Reddy Kalluru enabled = !!(QED_MFW_GET_FIELD(flags, DCBX_CONFIG_VERSION) != 6666ad8c632SSudarsana Reddy Kalluru DCBX_CONFIG_VERSION_DISABLED); 6676ad8c632SSudarsana Reddy Kalluru if (!enabled) { 6686ad8c632SSudarsana Reddy Kalluru p_operational->enabled = enabled; 6696ad8c632SSudarsana Reddy Kalluru p_operational->valid = false; 670dfbeb85fSsudarsana.kalluru@cavium.com DP_VERBOSE(p_hwfn, QED_MSG_DCB, "Dcbx is disabled\n"); 6716ad8c632SSudarsana Reddy Kalluru return; 6726ad8c632SSudarsana Reddy Kalluru } 6736ad8c632SSudarsana Reddy Kalluru 6746ad8c632SSudarsana Reddy Kalluru p_feat = &p_hwfn->p_dcbx_info->operational.features; 6756ad8c632SSudarsana Reddy Kalluru p_results = &p_hwfn->p_dcbx_info->results; 6766ad8c632SSudarsana Reddy Kalluru 6776ad8c632SSudarsana Reddy Kalluru val = !!(QED_MFW_GET_FIELD(flags, DCBX_CONFIG_VERSION) == 6786ad8c632SSudarsana Reddy Kalluru DCBX_CONFIG_VERSION_IEEE); 6796ad8c632SSudarsana Reddy Kalluru p_operational->ieee = val; 6806ad8c632SSudarsana Reddy Kalluru val = !!(QED_MFW_GET_FIELD(flags, DCBX_CONFIG_VERSION) == 6816ad8c632SSudarsana Reddy Kalluru DCBX_CONFIG_VERSION_CEE); 6826ad8c632SSudarsana Reddy Kalluru p_operational->cee = val; 6836ad8c632SSudarsana Reddy Kalluru 68449632b58Ssudarsana.kalluru@cavium.com val = !!(QED_MFW_GET_FIELD(flags, DCBX_CONFIG_VERSION) == 68549632b58Ssudarsana.kalluru@cavium.com DCBX_CONFIG_VERSION_STATIC); 68649632b58Ssudarsana.kalluru@cavium.com p_operational->local = val; 68749632b58Ssudarsana.kalluru@cavium.com 68849632b58Ssudarsana.kalluru@cavium.com DP_VERBOSE(p_hwfn, QED_MSG_DCB, 68949632b58Ssudarsana.kalluru@cavium.com "Version support: ieee %d, cee %d, static %d\n", 69049632b58Ssudarsana.kalluru@cavium.com p_operational->ieee, p_operational->cee, 69149632b58Ssudarsana.kalluru@cavium.com p_operational->local); 6926ad8c632SSudarsana Reddy Kalluru 6936ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_common_params(p_hwfn, &p_feat->app, 6946ad8c632SSudarsana Reddy Kalluru p_feat->app.app_pri_tbl, &p_feat->ets, 695fb9ea8a9SSudarsana Reddy Kalluru p_feat->pfc, ¶ms->operational.params, 696fb9ea8a9SSudarsana Reddy Kalluru p_operational->ieee); 6976ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_priority_info(p_hwfn, &p_operational->app_prio, p_results); 6986ad8c632SSudarsana Reddy Kalluru err = QED_MFW_GET_FIELD(p_feat->app.flags, DCBX_APP_ERROR); 6996ad8c632SSudarsana Reddy Kalluru p_operational->err = err; 7006ad8c632SSudarsana Reddy Kalluru p_operational->enabled = enabled; 7016ad8c632SSudarsana Reddy Kalluru p_operational->valid = true; 7026ad8c632SSudarsana Reddy Kalluru } 7036ad8c632SSudarsana Reddy Kalluru 7046ad8c632SSudarsana Reddy Kalluru static void 7056ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_local_lldp_params(struct qed_hwfn *p_hwfn, 7066ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_get *params) 7076ad8c632SSudarsana Reddy Kalluru { 7086ad8c632SSudarsana Reddy Kalluru struct lldp_config_params_s *p_local; 7096ad8c632SSudarsana Reddy Kalluru 7106ad8c632SSudarsana Reddy Kalluru p_local = &p_hwfn->p_dcbx_info->lldp_local[LLDP_NEAREST_BRIDGE]; 7116ad8c632SSudarsana Reddy Kalluru 7126ad8c632SSudarsana Reddy Kalluru memcpy(params->lldp_local.local_chassis_id, p_local->local_chassis_id, 7136ad8c632SSudarsana Reddy Kalluru ARRAY_SIZE(p_local->local_chassis_id)); 7146ad8c632SSudarsana Reddy Kalluru memcpy(params->lldp_local.local_port_id, p_local->local_port_id, 7156ad8c632SSudarsana Reddy Kalluru ARRAY_SIZE(p_local->local_port_id)); 7166ad8c632SSudarsana Reddy Kalluru } 7176ad8c632SSudarsana Reddy Kalluru 7186ad8c632SSudarsana Reddy Kalluru static void 7196ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_remote_lldp_params(struct qed_hwfn *p_hwfn, 7206ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_get *params) 7216ad8c632SSudarsana Reddy Kalluru { 7226ad8c632SSudarsana Reddy Kalluru struct lldp_status_params_s *p_remote; 7236ad8c632SSudarsana Reddy Kalluru 7246ad8c632SSudarsana Reddy Kalluru p_remote = &p_hwfn->p_dcbx_info->lldp_remote[LLDP_NEAREST_BRIDGE]; 7256ad8c632SSudarsana Reddy Kalluru 7266ad8c632SSudarsana Reddy Kalluru memcpy(params->lldp_remote.peer_chassis_id, p_remote->peer_chassis_id, 7276ad8c632SSudarsana Reddy Kalluru ARRAY_SIZE(p_remote->peer_chassis_id)); 7286ad8c632SSudarsana Reddy Kalluru memcpy(params->lldp_remote.peer_port_id, p_remote->peer_port_id, 7296ad8c632SSudarsana Reddy Kalluru ARRAY_SIZE(p_remote->peer_port_id)); 7306ad8c632SSudarsana Reddy Kalluru } 7316ad8c632SSudarsana Reddy Kalluru 7326ad8c632SSudarsana Reddy Kalluru static int 733270837b3Ssudarsana.kalluru@cavium.com qed_dcbx_get_params(struct qed_hwfn *p_hwfn, struct qed_dcbx_get *p_params, 7346ad8c632SSudarsana Reddy Kalluru enum qed_mib_read_type type) 7356ad8c632SSudarsana Reddy Kalluru { 7366ad8c632SSudarsana Reddy Kalluru switch (type) { 7376ad8c632SSudarsana Reddy Kalluru case QED_DCBX_REMOTE_MIB: 738270837b3Ssudarsana.kalluru@cavium.com qed_dcbx_get_remote_params(p_hwfn, p_params); 7396ad8c632SSudarsana Reddy Kalluru break; 7406ad8c632SSudarsana Reddy Kalluru case QED_DCBX_LOCAL_MIB: 741270837b3Ssudarsana.kalluru@cavium.com qed_dcbx_get_local_params(p_hwfn, p_params); 7426ad8c632SSudarsana Reddy Kalluru break; 7436ad8c632SSudarsana Reddy Kalluru case QED_DCBX_OPERATIONAL_MIB: 744270837b3Ssudarsana.kalluru@cavium.com qed_dcbx_get_operational_params(p_hwfn, p_params); 7456ad8c632SSudarsana Reddy Kalluru break; 7466ad8c632SSudarsana Reddy Kalluru case QED_DCBX_REMOTE_LLDP_MIB: 747270837b3Ssudarsana.kalluru@cavium.com qed_dcbx_get_remote_lldp_params(p_hwfn, p_params); 7486ad8c632SSudarsana Reddy Kalluru break; 7496ad8c632SSudarsana Reddy Kalluru case QED_DCBX_LOCAL_LLDP_MIB: 750270837b3Ssudarsana.kalluru@cavium.com qed_dcbx_get_local_lldp_params(p_hwfn, p_params); 7516ad8c632SSudarsana Reddy Kalluru break; 7526ad8c632SSudarsana Reddy Kalluru default: 7536ad8c632SSudarsana Reddy Kalluru DP_ERR(p_hwfn, "MIB read err, unknown mib type %d\n", type); 7546ad8c632SSudarsana Reddy Kalluru return -EINVAL; 7556ad8c632SSudarsana Reddy Kalluru } 7566ad8c632SSudarsana Reddy Kalluru 7576ad8c632SSudarsana Reddy Kalluru return 0; 7586ad8c632SSudarsana Reddy Kalluru } 7596ad8c632SSudarsana Reddy Kalluru 76039651abdSSudarsana Reddy Kalluru static int 76139651abdSSudarsana Reddy Kalluru qed_dcbx_read_local_lldp_mib(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt) 76239651abdSSudarsana Reddy Kalluru { 76339651abdSSudarsana Reddy Kalluru struct qed_dcbx_mib_meta_data data; 76439651abdSSudarsana Reddy Kalluru int rc = 0; 76539651abdSSudarsana Reddy Kalluru 76639651abdSSudarsana Reddy Kalluru memset(&data, 0, sizeof(data)); 76739651abdSSudarsana Reddy Kalluru data.addr = p_hwfn->mcp_info->port_addr + offsetof(struct public_port, 76839651abdSSudarsana Reddy Kalluru lldp_config_params); 76939651abdSSudarsana Reddy Kalluru data.lldp_local = p_hwfn->p_dcbx_info->lldp_local; 77039651abdSSudarsana Reddy Kalluru data.size = sizeof(struct lldp_config_params_s); 77139651abdSSudarsana Reddy Kalluru qed_memcpy_from(p_hwfn, p_ptt, data.lldp_local, data.addr, data.size); 77239651abdSSudarsana Reddy Kalluru 77339651abdSSudarsana Reddy Kalluru return rc; 77439651abdSSudarsana Reddy Kalluru } 77539651abdSSudarsana Reddy Kalluru 77639651abdSSudarsana Reddy Kalluru static int 77739651abdSSudarsana Reddy Kalluru qed_dcbx_read_remote_lldp_mib(struct qed_hwfn *p_hwfn, 77839651abdSSudarsana Reddy Kalluru struct qed_ptt *p_ptt, 77939651abdSSudarsana Reddy Kalluru enum qed_mib_read_type type) 78039651abdSSudarsana Reddy Kalluru { 78139651abdSSudarsana Reddy Kalluru struct qed_dcbx_mib_meta_data data; 78239651abdSSudarsana Reddy Kalluru int rc = 0; 78339651abdSSudarsana Reddy Kalluru 78439651abdSSudarsana Reddy Kalluru memset(&data, 0, sizeof(data)); 78539651abdSSudarsana Reddy Kalluru data.addr = p_hwfn->mcp_info->port_addr + offsetof(struct public_port, 78639651abdSSudarsana Reddy Kalluru lldp_status_params); 78739651abdSSudarsana Reddy Kalluru data.lldp_remote = p_hwfn->p_dcbx_info->lldp_remote; 78839651abdSSudarsana Reddy Kalluru data.size = sizeof(struct lldp_status_params_s); 78939651abdSSudarsana Reddy Kalluru rc = qed_dcbx_copy_mib(p_hwfn, p_ptt, &data, type); 79039651abdSSudarsana Reddy Kalluru 79139651abdSSudarsana Reddy Kalluru return rc; 79239651abdSSudarsana Reddy Kalluru } 79339651abdSSudarsana Reddy Kalluru 79439651abdSSudarsana Reddy Kalluru static int 79539651abdSSudarsana Reddy Kalluru qed_dcbx_read_operational_mib(struct qed_hwfn *p_hwfn, 79639651abdSSudarsana Reddy Kalluru struct qed_ptt *p_ptt, 79739651abdSSudarsana Reddy Kalluru enum qed_mib_read_type type) 79839651abdSSudarsana Reddy Kalluru { 79939651abdSSudarsana Reddy Kalluru struct qed_dcbx_mib_meta_data data; 80039651abdSSudarsana Reddy Kalluru int rc = 0; 80139651abdSSudarsana Reddy Kalluru 80239651abdSSudarsana Reddy Kalluru memset(&data, 0, sizeof(data)); 80339651abdSSudarsana Reddy Kalluru data.addr = p_hwfn->mcp_info->port_addr + 80439651abdSSudarsana Reddy Kalluru offsetof(struct public_port, operational_dcbx_mib); 80539651abdSSudarsana Reddy Kalluru data.mib = &p_hwfn->p_dcbx_info->operational; 80639651abdSSudarsana Reddy Kalluru data.size = sizeof(struct dcbx_mib); 80739651abdSSudarsana Reddy Kalluru rc = qed_dcbx_copy_mib(p_hwfn, p_ptt, &data, type); 80839651abdSSudarsana Reddy Kalluru 80939651abdSSudarsana Reddy Kalluru return rc; 81039651abdSSudarsana Reddy Kalluru } 81139651abdSSudarsana Reddy Kalluru 81239651abdSSudarsana Reddy Kalluru static int 81339651abdSSudarsana Reddy Kalluru qed_dcbx_read_remote_mib(struct qed_hwfn *p_hwfn, 81439651abdSSudarsana Reddy Kalluru struct qed_ptt *p_ptt, enum qed_mib_read_type type) 81539651abdSSudarsana Reddy Kalluru { 81639651abdSSudarsana Reddy Kalluru struct qed_dcbx_mib_meta_data data; 81739651abdSSudarsana Reddy Kalluru int rc = 0; 81839651abdSSudarsana Reddy Kalluru 81939651abdSSudarsana Reddy Kalluru memset(&data, 0, sizeof(data)); 82039651abdSSudarsana Reddy Kalluru data.addr = p_hwfn->mcp_info->port_addr + 82139651abdSSudarsana Reddy Kalluru offsetof(struct public_port, remote_dcbx_mib); 82239651abdSSudarsana Reddy Kalluru data.mib = &p_hwfn->p_dcbx_info->remote; 82339651abdSSudarsana Reddy Kalluru data.size = sizeof(struct dcbx_mib); 82439651abdSSudarsana Reddy Kalluru rc = qed_dcbx_copy_mib(p_hwfn, p_ptt, &data, type); 82539651abdSSudarsana Reddy Kalluru 82639651abdSSudarsana Reddy Kalluru return rc; 82739651abdSSudarsana Reddy Kalluru } 82839651abdSSudarsana Reddy Kalluru 82939651abdSSudarsana Reddy Kalluru static int 83039651abdSSudarsana Reddy Kalluru qed_dcbx_read_local_mib(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt) 83139651abdSSudarsana Reddy Kalluru { 83239651abdSSudarsana Reddy Kalluru struct qed_dcbx_mib_meta_data data; 83339651abdSSudarsana Reddy Kalluru int rc = 0; 83439651abdSSudarsana Reddy Kalluru 83539651abdSSudarsana Reddy Kalluru memset(&data, 0, sizeof(data)); 83639651abdSSudarsana Reddy Kalluru data.addr = p_hwfn->mcp_info->port_addr + 83739651abdSSudarsana Reddy Kalluru offsetof(struct public_port, local_admin_dcbx_mib); 83839651abdSSudarsana Reddy Kalluru data.local_admin = &p_hwfn->p_dcbx_info->local_admin; 83939651abdSSudarsana Reddy Kalluru data.size = sizeof(struct dcbx_local_params); 84039651abdSSudarsana Reddy Kalluru qed_memcpy_from(p_hwfn, p_ptt, data.local_admin, data.addr, data.size); 84139651abdSSudarsana Reddy Kalluru 84239651abdSSudarsana Reddy Kalluru return rc; 84339651abdSSudarsana Reddy Kalluru } 84439651abdSSudarsana Reddy Kalluru 84539651abdSSudarsana Reddy Kalluru static int qed_dcbx_read_mib(struct qed_hwfn *p_hwfn, 84639651abdSSudarsana Reddy Kalluru struct qed_ptt *p_ptt, enum qed_mib_read_type type) 84739651abdSSudarsana Reddy Kalluru { 84839651abdSSudarsana Reddy Kalluru int rc = -EINVAL; 84939651abdSSudarsana Reddy Kalluru 85039651abdSSudarsana Reddy Kalluru switch (type) { 85139651abdSSudarsana Reddy Kalluru case QED_DCBX_OPERATIONAL_MIB: 85239651abdSSudarsana Reddy Kalluru rc = qed_dcbx_read_operational_mib(p_hwfn, p_ptt, type); 85339651abdSSudarsana Reddy Kalluru break; 85439651abdSSudarsana Reddy Kalluru case QED_DCBX_REMOTE_MIB: 85539651abdSSudarsana Reddy Kalluru rc = qed_dcbx_read_remote_mib(p_hwfn, p_ptt, type); 85639651abdSSudarsana Reddy Kalluru break; 85739651abdSSudarsana Reddy Kalluru case QED_DCBX_LOCAL_MIB: 85839651abdSSudarsana Reddy Kalluru rc = qed_dcbx_read_local_mib(p_hwfn, p_ptt); 85939651abdSSudarsana Reddy Kalluru break; 86039651abdSSudarsana Reddy Kalluru case QED_DCBX_REMOTE_LLDP_MIB: 86139651abdSSudarsana Reddy Kalluru rc = qed_dcbx_read_remote_lldp_mib(p_hwfn, p_ptt, type); 86239651abdSSudarsana Reddy Kalluru break; 86339651abdSSudarsana Reddy Kalluru case QED_DCBX_LOCAL_LLDP_MIB: 86439651abdSSudarsana Reddy Kalluru rc = qed_dcbx_read_local_lldp_mib(p_hwfn, p_ptt); 86539651abdSSudarsana Reddy Kalluru break; 86639651abdSSudarsana Reddy Kalluru default: 86739651abdSSudarsana Reddy Kalluru DP_ERR(p_hwfn, "MIB read err, unknown mib type %d\n", type); 86839651abdSSudarsana Reddy Kalluru } 86939651abdSSudarsana Reddy Kalluru 87039651abdSSudarsana Reddy Kalluru return rc; 87139651abdSSudarsana Reddy Kalluru } 87239651abdSSudarsana Reddy Kalluru 8731e128c81SArun Easi void qed_dcbx_aen(struct qed_hwfn *hwfn, u32 mib_type) 8741e128c81SArun Easi { 8751e128c81SArun Easi struct qed_common_cb_ops *op = hwfn->cdev->protocol_ops.common; 8761e128c81SArun Easi void *cookie = hwfn->cdev->ops_cookie; 8771e128c81SArun Easi 8781e128c81SArun Easi if (cookie && op->dcbx_aen) 8791e128c81SArun Easi op->dcbx_aen(cookie, &hwfn->p_dcbx_info->get, mib_type); 8801e128c81SArun Easi } 8811e128c81SArun Easi 88239651abdSSudarsana Reddy Kalluru /* Read updated MIB. 88339651abdSSudarsana Reddy Kalluru * Reconfigure QM and invoke PF update ramrod command if operational MIB 88439651abdSSudarsana Reddy Kalluru * change is detected. 88539651abdSSudarsana Reddy Kalluru */ 88639651abdSSudarsana Reddy Kalluru int 88739651abdSSudarsana Reddy Kalluru qed_dcbx_mib_update_event(struct qed_hwfn *p_hwfn, 88839651abdSSudarsana Reddy Kalluru struct qed_ptt *p_ptt, enum qed_mib_read_type type) 88939651abdSSudarsana Reddy Kalluru { 89039651abdSSudarsana Reddy Kalluru int rc = 0; 89139651abdSSudarsana Reddy Kalluru 89239651abdSSudarsana Reddy Kalluru rc = qed_dcbx_read_mib(p_hwfn, p_ptt, type); 89339651abdSSudarsana Reddy Kalluru if (rc) 89439651abdSSudarsana Reddy Kalluru return rc; 89539651abdSSudarsana Reddy Kalluru 89639651abdSSudarsana Reddy Kalluru if (type == QED_DCBX_OPERATIONAL_MIB) { 89739651abdSSudarsana Reddy Kalluru rc = qed_dcbx_process_mib_info(p_hwfn); 89839651abdSSudarsana Reddy Kalluru if (!rc) { 89939651abdSSudarsana Reddy Kalluru /* reconfigure tcs of QM queues according 90039651abdSSudarsana Reddy Kalluru * to negotiation results 90139651abdSSudarsana Reddy Kalluru */ 90239651abdSSudarsana Reddy Kalluru qed_qm_reconf(p_hwfn, p_ptt); 90339651abdSSudarsana Reddy Kalluru 90439651abdSSudarsana Reddy Kalluru /* update storm FW with negotiation results */ 90539651abdSSudarsana Reddy Kalluru qed_sp_pf_update(p_hwfn); 90639651abdSSudarsana Reddy Kalluru } 90739651abdSSudarsana Reddy Kalluru } 908270837b3Ssudarsana.kalluru@cavium.com 909270837b3Ssudarsana.kalluru@cavium.com qed_dcbx_get_params(p_hwfn, &p_hwfn->p_dcbx_info->get, type); 9101e128c81SArun Easi qed_dcbx_aen(p_hwfn, type); 91139651abdSSudarsana Reddy Kalluru 91239651abdSSudarsana Reddy Kalluru return rc; 91339651abdSSudarsana Reddy Kalluru } 91439651abdSSudarsana Reddy Kalluru 91539651abdSSudarsana Reddy Kalluru int qed_dcbx_info_alloc(struct qed_hwfn *p_hwfn) 91639651abdSSudarsana Reddy Kalluru { 91739651abdSSudarsana Reddy Kalluru p_hwfn->p_dcbx_info = kzalloc(sizeof(*p_hwfn->p_dcbx_info), GFP_KERNEL); 9182591c280SJoe Perches if (!p_hwfn->p_dcbx_info) 919270837b3Ssudarsana.kalluru@cavium.com return -ENOMEM; 92039651abdSSudarsana Reddy Kalluru 921270837b3Ssudarsana.kalluru@cavium.com return 0; 92239651abdSSudarsana Reddy Kalluru } 92339651abdSSudarsana Reddy Kalluru 924270837b3Ssudarsana.kalluru@cavium.com void qed_dcbx_info_free(struct qed_hwfn *p_hwfn) 92539651abdSSudarsana Reddy Kalluru { 92639651abdSSudarsana Reddy Kalluru kfree(p_hwfn->p_dcbx_info); 9273587cb87STomer Tayar p_hwfn->p_dcbx_info = NULL; 92839651abdSSudarsana Reddy Kalluru } 92939651abdSSudarsana Reddy Kalluru 93039651abdSSudarsana Reddy Kalluru static void qed_dcbx_update_protocol_data(struct protocol_dcb_data *p_data, 93139651abdSSudarsana Reddy Kalluru struct qed_dcbx_results *p_src, 93239651abdSSudarsana Reddy Kalluru enum dcbx_protocol_type type) 93339651abdSSudarsana Reddy Kalluru { 93439651abdSSudarsana Reddy Kalluru p_data->dcb_enable_flag = p_src->arr[type].enable; 93539651abdSSudarsana Reddy Kalluru p_data->dcb_priority = p_src->arr[type].priority; 93639651abdSSudarsana Reddy Kalluru p_data->dcb_tc = p_src->arr[type].tc; 93739651abdSSudarsana Reddy Kalluru } 93839651abdSSudarsana Reddy Kalluru 93939651abdSSudarsana Reddy Kalluru /* Set pf update ramrod command params */ 94039651abdSSudarsana Reddy Kalluru void qed_dcbx_set_pf_update_params(struct qed_dcbx_results *p_src, 94139651abdSSudarsana Reddy Kalluru struct pf_update_ramrod_data *p_dest) 94239651abdSSudarsana Reddy Kalluru { 94339651abdSSudarsana Reddy Kalluru struct protocol_dcb_data *p_dcb_data; 94439651abdSSudarsana Reddy Kalluru bool update_flag = false; 94539651abdSSudarsana Reddy Kalluru 94639651abdSSudarsana Reddy Kalluru p_dest->pf_id = p_src->pf_id; 94739651abdSSudarsana Reddy Kalluru 94839651abdSSudarsana Reddy Kalluru update_flag = p_src->arr[DCBX_PROTOCOL_FCOE].update; 9497b6859fbSMintz, Yuval p_dest->update_fcoe_dcb_data_mode = update_flag; 95039651abdSSudarsana Reddy Kalluru 95139651abdSSudarsana Reddy Kalluru update_flag = p_src->arr[DCBX_PROTOCOL_ROCE].update; 9527b6859fbSMintz, Yuval p_dest->update_roce_dcb_data_mode = update_flag; 9537b6859fbSMintz, Yuval 95439651abdSSudarsana Reddy Kalluru update_flag = p_src->arr[DCBX_PROTOCOL_ROCE_V2].update; 9557b6859fbSMintz, Yuval p_dest->update_rroce_dcb_data_mode = update_flag; 95639651abdSSudarsana Reddy Kalluru 95739651abdSSudarsana Reddy Kalluru update_flag = p_src->arr[DCBX_PROTOCOL_ISCSI].update; 9587b6859fbSMintz, Yuval p_dest->update_iscsi_dcb_data_mode = update_flag; 95939651abdSSudarsana Reddy Kalluru update_flag = p_src->arr[DCBX_PROTOCOL_ETH].update; 9607b6859fbSMintz, Yuval p_dest->update_eth_dcb_data_mode = update_flag; 96139651abdSSudarsana Reddy Kalluru 96239651abdSSudarsana Reddy Kalluru p_dcb_data = &p_dest->fcoe_dcb_data; 96339651abdSSudarsana Reddy Kalluru qed_dcbx_update_protocol_data(p_dcb_data, p_src, DCBX_PROTOCOL_FCOE); 96439651abdSSudarsana Reddy Kalluru p_dcb_data = &p_dest->roce_dcb_data; 965449ad505Ssudarsana.kalluru@cavium.com qed_dcbx_update_protocol_data(p_dcb_data, p_src, DCBX_PROTOCOL_ROCE); 966449ad505Ssudarsana.kalluru@cavium.com p_dcb_data = &p_dest->rroce_dcb_data; 967449ad505Ssudarsana.kalluru@cavium.com qed_dcbx_update_protocol_data(p_dcb_data, p_src, DCBX_PROTOCOL_ROCE_V2); 96839651abdSSudarsana Reddy Kalluru p_dcb_data = &p_dest->iscsi_dcb_data; 96939651abdSSudarsana Reddy Kalluru qed_dcbx_update_protocol_data(p_dcb_data, p_src, DCBX_PROTOCOL_ISCSI); 97039651abdSSudarsana Reddy Kalluru p_dcb_data = &p_dest->eth_dcb_data; 97139651abdSSudarsana Reddy Kalluru qed_dcbx_update_protocol_data(p_dcb_data, p_src, DCBX_PROTOCOL_ETH); 97239651abdSSudarsana Reddy Kalluru } 9736ad8c632SSudarsana Reddy Kalluru 9746ad8c632SSudarsana Reddy Kalluru #ifdef CONFIG_DCB 9756ad8c632SSudarsana Reddy Kalluru static int qed_dcbx_query_params(struct qed_hwfn *p_hwfn, 9766ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_get *p_get, 9776ad8c632SSudarsana Reddy Kalluru enum qed_mib_read_type type) 9786ad8c632SSudarsana Reddy Kalluru { 9796ad8c632SSudarsana Reddy Kalluru struct qed_ptt *p_ptt; 9806ad8c632SSudarsana Reddy Kalluru int rc; 9816ad8c632SSudarsana Reddy Kalluru 9825fe118c9SSudarsana Reddy Kalluru if (IS_VF(p_hwfn->cdev)) 9835fe118c9SSudarsana Reddy Kalluru return -EINVAL; 9845fe118c9SSudarsana Reddy Kalluru 9856ad8c632SSudarsana Reddy Kalluru p_ptt = qed_ptt_acquire(p_hwfn); 9866ad8c632SSudarsana Reddy Kalluru if (!p_ptt) 9876ad8c632SSudarsana Reddy Kalluru return -EBUSY; 9886ad8c632SSudarsana Reddy Kalluru 9896ad8c632SSudarsana Reddy Kalluru rc = qed_dcbx_read_mib(p_hwfn, p_ptt, type); 9906ad8c632SSudarsana Reddy Kalluru if (rc) 9916ad8c632SSudarsana Reddy Kalluru goto out; 9926ad8c632SSudarsana Reddy Kalluru 993270837b3Ssudarsana.kalluru@cavium.com rc = qed_dcbx_get_params(p_hwfn, p_get, type); 9946ad8c632SSudarsana Reddy Kalluru 9956ad8c632SSudarsana Reddy Kalluru out: 9966ad8c632SSudarsana Reddy Kalluru qed_ptt_release(p_hwfn, p_ptt); 9976ad8c632SSudarsana Reddy Kalluru return rc; 9986ad8c632SSudarsana Reddy Kalluru } 9996ad8c632SSudarsana Reddy Kalluru 10006ad8c632SSudarsana Reddy Kalluru static void 10016ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_pfc_data(struct qed_hwfn *p_hwfn, 10026ad8c632SSudarsana Reddy Kalluru u32 *pfc, struct qed_dcbx_params *p_params) 10036ad8c632SSudarsana Reddy Kalluru { 10046ad8c632SSudarsana Reddy Kalluru u8 pfc_map = 0; 10056ad8c632SSudarsana Reddy Kalluru int i; 10066ad8c632SSudarsana Reddy Kalluru 10076cf75f1cSsudarsana.kalluru@cavium.com *pfc &= ~DCBX_PFC_ERROR_MASK; 10086cf75f1cSsudarsana.kalluru@cavium.com 10096ad8c632SSudarsana Reddy Kalluru if (p_params->pfc.willing) 10106ad8c632SSudarsana Reddy Kalluru *pfc |= DCBX_PFC_WILLING_MASK; 10116ad8c632SSudarsana Reddy Kalluru else 10126ad8c632SSudarsana Reddy Kalluru *pfc &= ~DCBX_PFC_WILLING_MASK; 10136ad8c632SSudarsana Reddy Kalluru 10146ad8c632SSudarsana Reddy Kalluru if (p_params->pfc.enabled) 10156ad8c632SSudarsana Reddy Kalluru *pfc |= DCBX_PFC_ENABLED_MASK; 10166ad8c632SSudarsana Reddy Kalluru else 10176ad8c632SSudarsana Reddy Kalluru *pfc &= ~DCBX_PFC_ENABLED_MASK; 10186ad8c632SSudarsana Reddy Kalluru 10196ad8c632SSudarsana Reddy Kalluru *pfc &= ~DCBX_PFC_CAPS_MASK; 10206ad8c632SSudarsana Reddy Kalluru *pfc |= (u32)p_params->pfc.max_tc << DCBX_PFC_CAPS_SHIFT; 10216ad8c632SSudarsana Reddy Kalluru 10226ad8c632SSudarsana Reddy Kalluru for (i = 0; i < QED_MAX_PFC_PRIORITIES; i++) 10236ad8c632SSudarsana Reddy Kalluru if (p_params->pfc.prio[i]) 10246ad8c632SSudarsana Reddy Kalluru pfc_map |= BIT(i); 10256ad8c632SSudarsana Reddy Kalluru 1026c5e801daSSudarsana Reddy Kalluru *pfc &= ~DCBX_PFC_PRI_EN_BITMAP_MASK; 10276ad8c632SSudarsana Reddy Kalluru *pfc |= (pfc_map << DCBX_PFC_PRI_EN_BITMAP_SHIFT); 10286ad8c632SSudarsana Reddy Kalluru 10296ad8c632SSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, "pfc = 0x%x\n", *pfc); 10306ad8c632SSudarsana Reddy Kalluru } 10316ad8c632SSudarsana Reddy Kalluru 10326ad8c632SSudarsana Reddy Kalluru static void 10336ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_ets_data(struct qed_hwfn *p_hwfn, 10346ad8c632SSudarsana Reddy Kalluru struct dcbx_ets_feature *p_ets, 10356ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_params *p_params) 10366ad8c632SSudarsana Reddy Kalluru { 10376ad8c632SSudarsana Reddy Kalluru u8 *bw_map, *tsa_map; 10386ad8c632SSudarsana Reddy Kalluru u32 val; 10396ad8c632SSudarsana Reddy Kalluru int i; 10406ad8c632SSudarsana Reddy Kalluru 10416ad8c632SSudarsana Reddy Kalluru if (p_params->ets_willing) 10426ad8c632SSudarsana Reddy Kalluru p_ets->flags |= DCBX_ETS_WILLING_MASK; 10436ad8c632SSudarsana Reddy Kalluru else 10446ad8c632SSudarsana Reddy Kalluru p_ets->flags &= ~DCBX_ETS_WILLING_MASK; 10456ad8c632SSudarsana Reddy Kalluru 10466ad8c632SSudarsana Reddy Kalluru if (p_params->ets_cbs) 10476ad8c632SSudarsana Reddy Kalluru p_ets->flags |= DCBX_ETS_CBS_MASK; 10486ad8c632SSudarsana Reddy Kalluru else 10496ad8c632SSudarsana Reddy Kalluru p_ets->flags &= ~DCBX_ETS_CBS_MASK; 10506ad8c632SSudarsana Reddy Kalluru 10516ad8c632SSudarsana Reddy Kalluru if (p_params->ets_enabled) 10526ad8c632SSudarsana Reddy Kalluru p_ets->flags |= DCBX_ETS_ENABLED_MASK; 10536ad8c632SSudarsana Reddy Kalluru else 10546ad8c632SSudarsana Reddy Kalluru p_ets->flags &= ~DCBX_ETS_ENABLED_MASK; 10556ad8c632SSudarsana Reddy Kalluru 10566ad8c632SSudarsana Reddy Kalluru p_ets->flags &= ~DCBX_ETS_MAX_TCS_MASK; 10576ad8c632SSudarsana Reddy Kalluru p_ets->flags |= (u32)p_params->max_ets_tc << DCBX_ETS_MAX_TCS_SHIFT; 10586ad8c632SSudarsana Reddy Kalluru 10596ad8c632SSudarsana Reddy Kalluru bw_map = (u8 *)&p_ets->tc_bw_tbl[0]; 10606ad8c632SSudarsana Reddy Kalluru tsa_map = (u8 *)&p_ets->tc_tsa_tbl[0]; 10616ad8c632SSudarsana Reddy Kalluru p_ets->pri_tc_tbl[0] = 0; 10626ad8c632SSudarsana Reddy Kalluru for (i = 0; i < QED_MAX_PFC_PRIORITIES; i++) { 10636ad8c632SSudarsana Reddy Kalluru bw_map[i] = p_params->ets_tc_bw_tbl[i]; 10646ad8c632SSudarsana Reddy Kalluru tsa_map[i] = p_params->ets_tc_tsa_tbl[i]; 10656ad8c632SSudarsana Reddy Kalluru /* Copy the priority value to the corresponding 4 bits in the 10666ad8c632SSudarsana Reddy Kalluru * traffic class table. 10676ad8c632SSudarsana Reddy Kalluru */ 10686ad8c632SSudarsana Reddy Kalluru val = (((u32)p_params->ets_pri_tc_tbl[i]) << ((7 - i) * 4)); 10696ad8c632SSudarsana Reddy Kalluru p_ets->pri_tc_tbl[0] |= val; 10706ad8c632SSudarsana Reddy Kalluru } 10716ad8c632SSudarsana Reddy Kalluru for (i = 0; i < 2; i++) { 10726ad8c632SSudarsana Reddy Kalluru p_ets->tc_bw_tbl[i] = cpu_to_be32(p_ets->tc_bw_tbl[i]); 10736ad8c632SSudarsana Reddy Kalluru p_ets->tc_tsa_tbl[i] = cpu_to_be32(p_ets->tc_tsa_tbl[i]); 10746ad8c632SSudarsana Reddy Kalluru } 10756ad8c632SSudarsana Reddy Kalluru } 10766ad8c632SSudarsana Reddy Kalluru 10776ad8c632SSudarsana Reddy Kalluru static void 10786ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_app_data(struct qed_hwfn *p_hwfn, 10796ad8c632SSudarsana Reddy Kalluru struct dcbx_app_priority_feature *p_app, 108059bcb797SSudarsana Reddy Kalluru struct qed_dcbx_params *p_params, bool ieee) 10816ad8c632SSudarsana Reddy Kalluru { 10826ad8c632SSudarsana Reddy Kalluru u32 *entry; 10836ad8c632SSudarsana Reddy Kalluru int i; 10846ad8c632SSudarsana Reddy Kalluru 10856ad8c632SSudarsana Reddy Kalluru if (p_params->app_willing) 10866ad8c632SSudarsana Reddy Kalluru p_app->flags |= DCBX_APP_WILLING_MASK; 10876ad8c632SSudarsana Reddy Kalluru else 10886ad8c632SSudarsana Reddy Kalluru p_app->flags &= ~DCBX_APP_WILLING_MASK; 10896ad8c632SSudarsana Reddy Kalluru 10906ad8c632SSudarsana Reddy Kalluru if (p_params->app_valid) 10916ad8c632SSudarsana Reddy Kalluru p_app->flags |= DCBX_APP_ENABLED_MASK; 10926ad8c632SSudarsana Reddy Kalluru else 10936ad8c632SSudarsana Reddy Kalluru p_app->flags &= ~DCBX_APP_ENABLED_MASK; 10946ad8c632SSudarsana Reddy Kalluru 10956ad8c632SSudarsana Reddy Kalluru p_app->flags &= ~DCBX_APP_NUM_ENTRIES_MASK; 10966ad8c632SSudarsana Reddy Kalluru p_app->flags |= (u32)p_params->num_app_entries << 10976ad8c632SSudarsana Reddy Kalluru DCBX_APP_NUM_ENTRIES_SHIFT; 10986ad8c632SSudarsana Reddy Kalluru 10996ad8c632SSudarsana Reddy Kalluru for (i = 0; i < DCBX_MAX_APP_PROTOCOL; i++) { 11006ad8c632SSudarsana Reddy Kalluru entry = &p_app->app_pri_tbl[i].entry; 1101c5e801daSSudarsana Reddy Kalluru *entry = 0; 110259bcb797SSudarsana Reddy Kalluru if (ieee) { 11035ec5dfa4SSudarsana Reddy Kalluru *entry &= ~(DCBX_APP_SF_IEEE_MASK | DCBX_APP_SF_MASK); 110459bcb797SSudarsana Reddy Kalluru switch (p_params->app_entry[i].sf_ieee) { 110559bcb797SSudarsana Reddy Kalluru case QED_DCBX_SF_IEEE_ETHTYPE: 110659bcb797SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_IEEE_ETHTYPE << 110759bcb797SSudarsana Reddy Kalluru DCBX_APP_SF_IEEE_SHIFT); 11085ec5dfa4SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_ETHTYPE << 11095ec5dfa4SSudarsana Reddy Kalluru DCBX_APP_SF_SHIFT); 111059bcb797SSudarsana Reddy Kalluru break; 111159bcb797SSudarsana Reddy Kalluru case QED_DCBX_SF_IEEE_TCP_PORT: 111259bcb797SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_IEEE_TCP_PORT << 111359bcb797SSudarsana Reddy Kalluru DCBX_APP_SF_IEEE_SHIFT); 11145ec5dfa4SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_PORT << 11155ec5dfa4SSudarsana Reddy Kalluru DCBX_APP_SF_SHIFT); 111659bcb797SSudarsana Reddy Kalluru break; 111759bcb797SSudarsana Reddy Kalluru case QED_DCBX_SF_IEEE_UDP_PORT: 111859bcb797SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_IEEE_UDP_PORT << 111959bcb797SSudarsana Reddy Kalluru DCBX_APP_SF_IEEE_SHIFT); 11205ec5dfa4SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_PORT << 11215ec5dfa4SSudarsana Reddy Kalluru DCBX_APP_SF_SHIFT); 112259bcb797SSudarsana Reddy Kalluru break; 112359bcb797SSudarsana Reddy Kalluru case QED_DCBX_SF_IEEE_TCP_UDP_PORT: 112459bcb797SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_IEEE_TCP_UDP_PORT << 112559bcb797SSudarsana Reddy Kalluru DCBX_APP_SF_IEEE_SHIFT); 11265ec5dfa4SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_PORT << 11275ec5dfa4SSudarsana Reddy Kalluru DCBX_APP_SF_SHIFT); 112859bcb797SSudarsana Reddy Kalluru break; 112959bcb797SSudarsana Reddy Kalluru } 113059bcb797SSudarsana Reddy Kalluru } else { 11316ad8c632SSudarsana Reddy Kalluru *entry &= ~DCBX_APP_SF_MASK; 11326ad8c632SSudarsana Reddy Kalluru if (p_params->app_entry[i].ethtype) 11336ad8c632SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_ETHTYPE << 11346ad8c632SSudarsana Reddy Kalluru DCBX_APP_SF_SHIFT); 11356ad8c632SSudarsana Reddy Kalluru else 113659bcb797SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_PORT << 113759bcb797SSudarsana Reddy Kalluru DCBX_APP_SF_SHIFT); 113859bcb797SSudarsana Reddy Kalluru } 113959bcb797SSudarsana Reddy Kalluru 11406ad8c632SSudarsana Reddy Kalluru *entry &= ~DCBX_APP_PROTOCOL_ID_MASK; 11416ad8c632SSudarsana Reddy Kalluru *entry |= ((u32)p_params->app_entry[i].proto_id << 11426ad8c632SSudarsana Reddy Kalluru DCBX_APP_PROTOCOL_ID_SHIFT); 11436ad8c632SSudarsana Reddy Kalluru *entry &= ~DCBX_APP_PRI_MAP_MASK; 11446ad8c632SSudarsana Reddy Kalluru *entry |= ((u32)(p_params->app_entry[i].prio) << 11456ad8c632SSudarsana Reddy Kalluru DCBX_APP_PRI_MAP_SHIFT); 11466ad8c632SSudarsana Reddy Kalluru } 11476ad8c632SSudarsana Reddy Kalluru } 11486ad8c632SSudarsana Reddy Kalluru 11496ad8c632SSudarsana Reddy Kalluru static void 11506ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_local_params(struct qed_hwfn *p_hwfn, 11516ad8c632SSudarsana Reddy Kalluru struct dcbx_local_params *local_admin, 11526ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_set *params) 11536ad8c632SSudarsana Reddy Kalluru { 115459bcb797SSudarsana Reddy Kalluru bool ieee = false; 115559bcb797SSudarsana Reddy Kalluru 11566ad8c632SSudarsana Reddy Kalluru local_admin->flags = 0; 11576ad8c632SSudarsana Reddy Kalluru memcpy(&local_admin->features, 11586ad8c632SSudarsana Reddy Kalluru &p_hwfn->p_dcbx_info->operational.features, 11596ad8c632SSudarsana Reddy Kalluru sizeof(local_admin->features)); 11606ad8c632SSudarsana Reddy Kalluru 116159bcb797SSudarsana Reddy Kalluru if (params->enabled) { 11626ad8c632SSudarsana Reddy Kalluru local_admin->config = params->ver_num; 116359bcb797SSudarsana Reddy Kalluru ieee = !!(params->ver_num & DCBX_CONFIG_VERSION_IEEE); 116459bcb797SSudarsana Reddy Kalluru } else { 11656ad8c632SSudarsana Reddy Kalluru local_admin->config = DCBX_CONFIG_VERSION_DISABLED; 116659bcb797SSudarsana Reddy Kalluru } 11676ad8c632SSudarsana Reddy Kalluru 1168dfbeb85fSsudarsana.kalluru@cavium.com DP_VERBOSE(p_hwfn, QED_MSG_DCB, "Dcbx version = %d\n", 1169dfbeb85fSsudarsana.kalluru@cavium.com local_admin->config); 1170dfbeb85fSsudarsana.kalluru@cavium.com 11716ad8c632SSudarsana Reddy Kalluru if (params->override_flags & QED_DCBX_OVERRIDE_PFC_CFG) 11726ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_pfc_data(p_hwfn, &local_admin->features.pfc, 11736ad8c632SSudarsana Reddy Kalluru ¶ms->config.params); 11746ad8c632SSudarsana Reddy Kalluru 11756ad8c632SSudarsana Reddy Kalluru if (params->override_flags & QED_DCBX_OVERRIDE_ETS_CFG) 11766ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_ets_data(p_hwfn, &local_admin->features.ets, 11776ad8c632SSudarsana Reddy Kalluru ¶ms->config.params); 11786ad8c632SSudarsana Reddy Kalluru 11796ad8c632SSudarsana Reddy Kalluru if (params->override_flags & QED_DCBX_OVERRIDE_APP_CFG) 11806ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_app_data(p_hwfn, &local_admin->features.app, 118159bcb797SSudarsana Reddy Kalluru ¶ms->config.params, ieee); 11826ad8c632SSudarsana Reddy Kalluru } 11836ad8c632SSudarsana Reddy Kalluru 11846ad8c632SSudarsana Reddy Kalluru int qed_dcbx_config_params(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, 11856ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_set *params, bool hw_commit) 11866ad8c632SSudarsana Reddy Kalluru { 11876ad8c632SSudarsana Reddy Kalluru struct dcbx_local_params local_admin; 11886ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_mib_meta_data data; 11896ad8c632SSudarsana Reddy Kalluru u32 resp = 0, param = 0; 11906ad8c632SSudarsana Reddy Kalluru int rc = 0; 11916ad8c632SSudarsana Reddy Kalluru 11926ad8c632SSudarsana Reddy Kalluru if (!hw_commit) { 11936ad8c632SSudarsana Reddy Kalluru memcpy(&p_hwfn->p_dcbx_info->set, params, 11946ad8c632SSudarsana Reddy Kalluru sizeof(struct qed_dcbx_set)); 11956ad8c632SSudarsana Reddy Kalluru return 0; 11966ad8c632SSudarsana Reddy Kalluru } 11976ad8c632SSudarsana Reddy Kalluru 11986ad8c632SSudarsana Reddy Kalluru /* clear set-parmas cache */ 11996ad8c632SSudarsana Reddy Kalluru memset(&p_hwfn->p_dcbx_info->set, 0, sizeof(p_hwfn->p_dcbx_info->set)); 12006ad8c632SSudarsana Reddy Kalluru 12016ad8c632SSudarsana Reddy Kalluru memset(&local_admin, 0, sizeof(local_admin)); 12026ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_local_params(p_hwfn, &local_admin, params); 12036ad8c632SSudarsana Reddy Kalluru 12046ad8c632SSudarsana Reddy Kalluru data.addr = p_hwfn->mcp_info->port_addr + 12056ad8c632SSudarsana Reddy Kalluru offsetof(struct public_port, local_admin_dcbx_mib); 12066ad8c632SSudarsana Reddy Kalluru data.local_admin = &local_admin; 12076ad8c632SSudarsana Reddy Kalluru data.size = sizeof(struct dcbx_local_params); 12086ad8c632SSudarsana Reddy Kalluru qed_memcpy_to(p_hwfn, p_ptt, data.addr, data.local_admin, data.size); 12096ad8c632SSudarsana Reddy Kalluru 12106ad8c632SSudarsana Reddy Kalluru rc = qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_SET_DCBX, 12116ad8c632SSudarsana Reddy Kalluru 1 << DRV_MB_PARAM_LLDP_SEND_SHIFT, &resp, ¶m); 12126ad8c632SSudarsana Reddy Kalluru if (rc) 12136ad8c632SSudarsana Reddy Kalluru DP_NOTICE(p_hwfn, "Failed to send DCBX update request\n"); 12146ad8c632SSudarsana Reddy Kalluru 12156ad8c632SSudarsana Reddy Kalluru return rc; 12166ad8c632SSudarsana Reddy Kalluru } 12176ad8c632SSudarsana Reddy Kalluru 12186ad8c632SSudarsana Reddy Kalluru int qed_dcbx_get_config_params(struct qed_hwfn *p_hwfn, 12196ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_set *params) 12206ad8c632SSudarsana Reddy Kalluru { 12216ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 12226ad8c632SSudarsana Reddy Kalluru int rc; 12236ad8c632SSudarsana Reddy Kalluru 12246ad8c632SSudarsana Reddy Kalluru if (p_hwfn->p_dcbx_info->set.config.valid) { 12256ad8c632SSudarsana Reddy Kalluru memcpy(params, &p_hwfn->p_dcbx_info->set, 12266ad8c632SSudarsana Reddy Kalluru sizeof(struct qed_dcbx_set)); 12276ad8c632SSudarsana Reddy Kalluru return 0; 12286ad8c632SSudarsana Reddy Kalluru } 12296ad8c632SSudarsana Reddy Kalluru 1230561ed233SWu Fengguang dcbx_info = kzalloc(sizeof(*dcbx_info), GFP_KERNEL); 12312591c280SJoe Perches if (!dcbx_info) 12326ad8c632SSudarsana Reddy Kalluru return -ENOMEM; 12336ad8c632SSudarsana Reddy Kalluru 123415c6de2cSSudarsana Reddy Kalluru memset(dcbx_info, 0, sizeof(*dcbx_info)); 12356ad8c632SSudarsana Reddy Kalluru rc = qed_dcbx_query_params(p_hwfn, dcbx_info, QED_DCBX_OPERATIONAL_MIB); 12366ad8c632SSudarsana Reddy Kalluru if (rc) { 12376ad8c632SSudarsana Reddy Kalluru kfree(dcbx_info); 12386ad8c632SSudarsana Reddy Kalluru return rc; 12396ad8c632SSudarsana Reddy Kalluru } 12406ad8c632SSudarsana Reddy Kalluru 12416ad8c632SSudarsana Reddy Kalluru p_hwfn->p_dcbx_info->set.override_flags = 0; 12426ad8c632SSudarsana Reddy Kalluru p_hwfn->p_dcbx_info->set.ver_num = DCBX_CONFIG_VERSION_DISABLED; 12436ad8c632SSudarsana Reddy Kalluru if (dcbx_info->operational.cee) 12446ad8c632SSudarsana Reddy Kalluru p_hwfn->p_dcbx_info->set.ver_num |= DCBX_CONFIG_VERSION_CEE; 12456ad8c632SSudarsana Reddy Kalluru if (dcbx_info->operational.ieee) 12466ad8c632SSudarsana Reddy Kalluru p_hwfn->p_dcbx_info->set.ver_num |= DCBX_CONFIG_VERSION_IEEE; 124749632b58Ssudarsana.kalluru@cavium.com if (dcbx_info->operational.local) 124849632b58Ssudarsana.kalluru@cavium.com p_hwfn->p_dcbx_info->set.ver_num |= DCBX_CONFIG_VERSION_STATIC; 12496ad8c632SSudarsana Reddy Kalluru 12506ad8c632SSudarsana Reddy Kalluru p_hwfn->p_dcbx_info->set.enabled = dcbx_info->operational.enabled; 12516ad8c632SSudarsana Reddy Kalluru memcpy(&p_hwfn->p_dcbx_info->set.config.params, 12526ad8c632SSudarsana Reddy Kalluru &dcbx_info->operational.params, 12536ad8c632SSudarsana Reddy Kalluru sizeof(struct qed_dcbx_admin_params)); 12546ad8c632SSudarsana Reddy Kalluru p_hwfn->p_dcbx_info->set.config.valid = true; 12556ad8c632SSudarsana Reddy Kalluru 12566ad8c632SSudarsana Reddy Kalluru memcpy(params, &p_hwfn->p_dcbx_info->set, sizeof(struct qed_dcbx_set)); 12576ad8c632SSudarsana Reddy Kalluru 12586ad8c632SSudarsana Reddy Kalluru kfree(dcbx_info); 12596ad8c632SSudarsana Reddy Kalluru 12606ad8c632SSudarsana Reddy Kalluru return 0; 12616ad8c632SSudarsana Reddy Kalluru } 1262a1d8d8a5SSudarsana Reddy Kalluru 1263a1d8d8a5SSudarsana Reddy Kalluru static struct qed_dcbx_get *qed_dcbnl_get_dcbx(struct qed_hwfn *hwfn, 1264a1d8d8a5SSudarsana Reddy Kalluru enum qed_mib_read_type type) 1265a1d8d8a5SSudarsana Reddy Kalluru { 1266a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1267a1d8d8a5SSudarsana Reddy Kalluru 126862289ba2Ssudarsana.kalluru@cavium.com dcbx_info = kmalloc(sizeof(*dcbx_info), GFP_ATOMIC); 12692591c280SJoe Perches if (!dcbx_info) 1270a1d8d8a5SSudarsana Reddy Kalluru return NULL; 1271a1d8d8a5SSudarsana Reddy Kalluru 127215c6de2cSSudarsana Reddy Kalluru memset(dcbx_info, 0, sizeof(*dcbx_info)); 1273a1d8d8a5SSudarsana Reddy Kalluru if (qed_dcbx_query_params(hwfn, dcbx_info, type)) { 1274a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1275a1d8d8a5SSudarsana Reddy Kalluru return NULL; 1276a1d8d8a5SSudarsana Reddy Kalluru } 1277a1d8d8a5SSudarsana Reddy Kalluru 1278a1d8d8a5SSudarsana Reddy Kalluru if ((type == QED_DCBX_OPERATIONAL_MIB) && 1279a1d8d8a5SSudarsana Reddy Kalluru !dcbx_info->operational.enabled) { 1280a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "DCBX is not enabled/operational\n"); 1281a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1282a1d8d8a5SSudarsana Reddy Kalluru return NULL; 1283a1d8d8a5SSudarsana Reddy Kalluru } 1284a1d8d8a5SSudarsana Reddy Kalluru 1285a1d8d8a5SSudarsana Reddy Kalluru return dcbx_info; 1286a1d8d8a5SSudarsana Reddy Kalluru } 1287a1d8d8a5SSudarsana Reddy Kalluru 1288a1d8d8a5SSudarsana Reddy Kalluru static u8 qed_dcbnl_getstate(struct qed_dev *cdev) 1289a1d8d8a5SSudarsana Reddy Kalluru { 1290a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1291a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1292a1d8d8a5SSudarsana Reddy Kalluru bool enabled; 1293a1d8d8a5SSudarsana Reddy Kalluru 1294a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 1295a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1296a1d8d8a5SSudarsana Reddy Kalluru return 0; 1297a1d8d8a5SSudarsana Reddy Kalluru 1298a1d8d8a5SSudarsana Reddy Kalluru enabled = dcbx_info->operational.enabled; 1299a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "DCB state = %d\n", enabled); 1300a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1301a1d8d8a5SSudarsana Reddy Kalluru 1302a1d8d8a5SSudarsana Reddy Kalluru return enabled; 1303a1d8d8a5SSudarsana Reddy Kalluru } 1304a1d8d8a5SSudarsana Reddy Kalluru 1305a1d8d8a5SSudarsana Reddy Kalluru static u8 qed_dcbnl_setstate(struct qed_dev *cdev, u8 state) 1306a1d8d8a5SSudarsana Reddy Kalluru { 1307a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1308a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 1309a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 1310a1d8d8a5SSudarsana Reddy Kalluru int rc; 1311a1d8d8a5SSudarsana Reddy Kalluru 1312a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "DCB state = %d\n", state); 1313a1d8d8a5SSudarsana Reddy Kalluru 1314a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 1315a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 1316a1d8d8a5SSudarsana Reddy Kalluru if (rc) 1317a1d8d8a5SSudarsana Reddy Kalluru return 1; 1318a1d8d8a5SSudarsana Reddy Kalluru 1319a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.enabled = !!state; 1320a1d8d8a5SSudarsana Reddy Kalluru 1321a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 1322a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 1323a1d8d8a5SSudarsana Reddy Kalluru return 1; 1324a1d8d8a5SSudarsana Reddy Kalluru 1325a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 1326a1d8d8a5SSudarsana Reddy Kalluru 1327a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 1328a1d8d8a5SSudarsana Reddy Kalluru 1329a1d8d8a5SSudarsana Reddy Kalluru return rc ? 1 : 0; 1330a1d8d8a5SSudarsana Reddy Kalluru } 1331a1d8d8a5SSudarsana Reddy Kalluru 1332a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_getpgtccfgtx(struct qed_dev *cdev, int tc, u8 *prio_type, 1333a1d8d8a5SSudarsana Reddy Kalluru u8 *pgid, u8 *bw_pct, u8 *up_map) 1334a1d8d8a5SSudarsana Reddy Kalluru { 1335a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1336a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1337a1d8d8a5SSudarsana Reddy Kalluru 1338a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "tc = %d\n", tc); 1339a1d8d8a5SSudarsana Reddy Kalluru *prio_type = *pgid = *bw_pct = *up_map = 0; 1340a1d8d8a5SSudarsana Reddy Kalluru if (tc < 0 || tc >= QED_MAX_PFC_PRIORITIES) { 1341a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "Invalid tc %d\n", tc); 1342a1d8d8a5SSudarsana Reddy Kalluru return; 1343a1d8d8a5SSudarsana Reddy Kalluru } 1344a1d8d8a5SSudarsana Reddy Kalluru 1345a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 1346a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1347a1d8d8a5SSudarsana Reddy Kalluru return; 1348a1d8d8a5SSudarsana Reddy Kalluru 1349a1d8d8a5SSudarsana Reddy Kalluru *pgid = dcbx_info->operational.params.ets_pri_tc_tbl[tc]; 1350a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1351a1d8d8a5SSudarsana Reddy Kalluru } 1352a1d8d8a5SSudarsana Reddy Kalluru 1353a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_getpgbwgcfgtx(struct qed_dev *cdev, int pgid, u8 *bw_pct) 1354a1d8d8a5SSudarsana Reddy Kalluru { 1355a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1356a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1357a1d8d8a5SSudarsana Reddy Kalluru 1358a1d8d8a5SSudarsana Reddy Kalluru *bw_pct = 0; 1359a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "pgid = %d\n", pgid); 1360a1d8d8a5SSudarsana Reddy Kalluru if (pgid < 0 || pgid >= QED_MAX_PFC_PRIORITIES) { 1361a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "Invalid pgid %d\n", pgid); 1362a1d8d8a5SSudarsana Reddy Kalluru return; 1363a1d8d8a5SSudarsana Reddy Kalluru } 1364a1d8d8a5SSudarsana Reddy Kalluru 1365a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 1366a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1367a1d8d8a5SSudarsana Reddy Kalluru return; 1368a1d8d8a5SSudarsana Reddy Kalluru 1369a1d8d8a5SSudarsana Reddy Kalluru *bw_pct = dcbx_info->operational.params.ets_tc_bw_tbl[pgid]; 1370a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "bw_pct = %d\n", *bw_pct); 1371a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1372a1d8d8a5SSudarsana Reddy Kalluru } 1373a1d8d8a5SSudarsana Reddy Kalluru 1374a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_getpgtccfgrx(struct qed_dev *cdev, int tc, u8 *prio, 1375a1d8d8a5SSudarsana Reddy Kalluru u8 *bwg_id, u8 *bw_pct, u8 *up_map) 1376a1d8d8a5SSudarsana Reddy Kalluru { 1377a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(QED_LEADING_HWFN(cdev), "Rx ETS is not supported\n"); 1378a1d8d8a5SSudarsana Reddy Kalluru *prio = *bwg_id = *bw_pct = *up_map = 0; 1379a1d8d8a5SSudarsana Reddy Kalluru } 1380a1d8d8a5SSudarsana Reddy Kalluru 1381a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_getpgbwgcfgrx(struct qed_dev *cdev, 1382a1d8d8a5SSudarsana Reddy Kalluru int bwg_id, u8 *bw_pct) 1383a1d8d8a5SSudarsana Reddy Kalluru { 1384a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(QED_LEADING_HWFN(cdev), "Rx ETS is not supported\n"); 1385a1d8d8a5SSudarsana Reddy Kalluru *bw_pct = 0; 1386a1d8d8a5SSudarsana Reddy Kalluru } 1387a1d8d8a5SSudarsana Reddy Kalluru 1388a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_getpfccfg(struct qed_dev *cdev, 1389a1d8d8a5SSudarsana Reddy Kalluru int priority, u8 *setting) 1390a1d8d8a5SSudarsana Reddy Kalluru { 1391a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1392a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1393a1d8d8a5SSudarsana Reddy Kalluru 1394a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "priority = %d\n", priority); 1395a1d8d8a5SSudarsana Reddy Kalluru if (priority < 0 || priority >= QED_MAX_PFC_PRIORITIES) { 1396a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "Invalid priority %d\n", priority); 1397a1d8d8a5SSudarsana Reddy Kalluru return; 1398a1d8d8a5SSudarsana Reddy Kalluru } 1399a1d8d8a5SSudarsana Reddy Kalluru 1400a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 1401a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1402a1d8d8a5SSudarsana Reddy Kalluru return; 1403a1d8d8a5SSudarsana Reddy Kalluru 1404a1d8d8a5SSudarsana Reddy Kalluru *setting = dcbx_info->operational.params.pfc.prio[priority]; 1405a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "setting = %d\n", *setting); 1406a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1407a1d8d8a5SSudarsana Reddy Kalluru } 1408a1d8d8a5SSudarsana Reddy Kalluru 1409a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_setpfccfg(struct qed_dev *cdev, int priority, u8 setting) 1410a1d8d8a5SSudarsana Reddy Kalluru { 1411a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1412a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 1413a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 1414a1d8d8a5SSudarsana Reddy Kalluru int rc; 1415a1d8d8a5SSudarsana Reddy Kalluru 1416a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "priority = %d setting = %d\n", 1417a1d8d8a5SSudarsana Reddy Kalluru priority, setting); 1418a1d8d8a5SSudarsana Reddy Kalluru if (priority < 0 || priority >= QED_MAX_PFC_PRIORITIES) { 1419a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "Invalid priority %d\n", priority); 1420a1d8d8a5SSudarsana Reddy Kalluru return; 1421a1d8d8a5SSudarsana Reddy Kalluru } 1422a1d8d8a5SSudarsana Reddy Kalluru 1423a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 1424a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 1425a1d8d8a5SSudarsana Reddy Kalluru if (rc) 1426a1d8d8a5SSudarsana Reddy Kalluru return; 1427a1d8d8a5SSudarsana Reddy Kalluru 1428a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_PFC_CFG; 1429a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.pfc.prio[priority] = !!setting; 1430a1d8d8a5SSudarsana Reddy Kalluru 1431a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 1432a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 1433a1d8d8a5SSudarsana Reddy Kalluru return; 1434a1d8d8a5SSudarsana Reddy Kalluru 1435a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 1436a1d8d8a5SSudarsana Reddy Kalluru 1437a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 1438a1d8d8a5SSudarsana Reddy Kalluru } 1439a1d8d8a5SSudarsana Reddy Kalluru 1440a1d8d8a5SSudarsana Reddy Kalluru static u8 qed_dcbnl_getcap(struct qed_dev *cdev, int capid, u8 *cap) 1441a1d8d8a5SSudarsana Reddy Kalluru { 1442a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1443a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1444a1d8d8a5SSudarsana Reddy Kalluru int rc = 0; 1445a1d8d8a5SSudarsana Reddy Kalluru 1446a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "capid = %d\n", capid); 1447a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 1448a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1449a1d8d8a5SSudarsana Reddy Kalluru return 1; 1450a1d8d8a5SSudarsana Reddy Kalluru 1451a1d8d8a5SSudarsana Reddy Kalluru switch (capid) { 1452a1d8d8a5SSudarsana Reddy Kalluru case DCB_CAP_ATTR_PG: 1453a1d8d8a5SSudarsana Reddy Kalluru case DCB_CAP_ATTR_PFC: 1454a1d8d8a5SSudarsana Reddy Kalluru case DCB_CAP_ATTR_UP2TC: 1455a1d8d8a5SSudarsana Reddy Kalluru case DCB_CAP_ATTR_GSP: 1456a1d8d8a5SSudarsana Reddy Kalluru *cap = true; 1457a1d8d8a5SSudarsana Reddy Kalluru break; 1458a1d8d8a5SSudarsana Reddy Kalluru case DCB_CAP_ATTR_PG_TCS: 1459a1d8d8a5SSudarsana Reddy Kalluru case DCB_CAP_ATTR_PFC_TCS: 1460a1d8d8a5SSudarsana Reddy Kalluru *cap = 0x80; 1461a1d8d8a5SSudarsana Reddy Kalluru break; 1462a1d8d8a5SSudarsana Reddy Kalluru case DCB_CAP_ATTR_DCBX: 1463a1d8d8a5SSudarsana Reddy Kalluru *cap = (DCB_CAP_DCBX_LLD_MANAGED | DCB_CAP_DCBX_VER_CEE | 146405930d18SSudarsana Reddy Kalluru DCB_CAP_DCBX_VER_IEEE | DCB_CAP_DCBX_STATIC); 1465a1d8d8a5SSudarsana Reddy Kalluru break; 1466a1d8d8a5SSudarsana Reddy Kalluru default: 1467a1d8d8a5SSudarsana Reddy Kalluru *cap = false; 1468a1d8d8a5SSudarsana Reddy Kalluru rc = 1; 1469a1d8d8a5SSudarsana Reddy Kalluru } 1470a1d8d8a5SSudarsana Reddy Kalluru 1471a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "id = %d caps = %d\n", capid, *cap); 1472a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1473a1d8d8a5SSudarsana Reddy Kalluru 1474a1d8d8a5SSudarsana Reddy Kalluru return rc; 1475a1d8d8a5SSudarsana Reddy Kalluru } 1476a1d8d8a5SSudarsana Reddy Kalluru 1477a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_getnumtcs(struct qed_dev *cdev, int tcid, u8 *num) 1478a1d8d8a5SSudarsana Reddy Kalluru { 1479a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1480a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1481a1d8d8a5SSudarsana Reddy Kalluru int rc = 0; 1482a1d8d8a5SSudarsana Reddy Kalluru 1483a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "tcid = %d\n", tcid); 1484a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 1485a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1486a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 1487a1d8d8a5SSudarsana Reddy Kalluru 1488a1d8d8a5SSudarsana Reddy Kalluru switch (tcid) { 1489a1d8d8a5SSudarsana Reddy Kalluru case DCB_NUMTCS_ATTR_PG: 1490a1d8d8a5SSudarsana Reddy Kalluru *num = dcbx_info->operational.params.max_ets_tc; 1491a1d8d8a5SSudarsana Reddy Kalluru break; 1492a1d8d8a5SSudarsana Reddy Kalluru case DCB_NUMTCS_ATTR_PFC: 1493a1d8d8a5SSudarsana Reddy Kalluru *num = dcbx_info->operational.params.pfc.max_tc; 1494a1d8d8a5SSudarsana Reddy Kalluru break; 1495a1d8d8a5SSudarsana Reddy Kalluru default: 1496a1d8d8a5SSudarsana Reddy Kalluru rc = -EINVAL; 1497a1d8d8a5SSudarsana Reddy Kalluru } 1498a1d8d8a5SSudarsana Reddy Kalluru 1499a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1500a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "numtcs = %d\n", *num); 1501a1d8d8a5SSudarsana Reddy Kalluru 1502a1d8d8a5SSudarsana Reddy Kalluru return rc; 1503a1d8d8a5SSudarsana Reddy Kalluru } 1504a1d8d8a5SSudarsana Reddy Kalluru 1505a1d8d8a5SSudarsana Reddy Kalluru static u8 qed_dcbnl_getpfcstate(struct qed_dev *cdev) 1506a1d8d8a5SSudarsana Reddy Kalluru { 1507a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1508a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1509a1d8d8a5SSudarsana Reddy Kalluru bool enabled; 1510a1d8d8a5SSudarsana Reddy Kalluru 1511a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 1512a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1513a1d8d8a5SSudarsana Reddy Kalluru return 0; 1514a1d8d8a5SSudarsana Reddy Kalluru 1515a1d8d8a5SSudarsana Reddy Kalluru enabled = dcbx_info->operational.params.pfc.enabled; 1516a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "pfc state = %d\n", enabled); 1517a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1518a1d8d8a5SSudarsana Reddy Kalluru 1519a1d8d8a5SSudarsana Reddy Kalluru return enabled; 1520a1d8d8a5SSudarsana Reddy Kalluru } 1521a1d8d8a5SSudarsana Reddy Kalluru 1522a1d8d8a5SSudarsana Reddy Kalluru static u8 qed_dcbnl_getdcbx(struct qed_dev *cdev) 1523a1d8d8a5SSudarsana Reddy Kalluru { 1524a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1525a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1526a1d8d8a5SSudarsana Reddy Kalluru u8 mode = 0; 1527a1d8d8a5SSudarsana Reddy Kalluru 1528a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 1529a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1530a1d8d8a5SSudarsana Reddy Kalluru return 0; 1531a1d8d8a5SSudarsana Reddy Kalluru 1532a1d8d8a5SSudarsana Reddy Kalluru if (dcbx_info->operational.enabled) 1533a1d8d8a5SSudarsana Reddy Kalluru mode |= DCB_CAP_DCBX_LLD_MANAGED; 1534a1d8d8a5SSudarsana Reddy Kalluru if (dcbx_info->operational.ieee) 1535a1d8d8a5SSudarsana Reddy Kalluru mode |= DCB_CAP_DCBX_VER_IEEE; 1536a1d8d8a5SSudarsana Reddy Kalluru if (dcbx_info->operational.cee) 1537a1d8d8a5SSudarsana Reddy Kalluru mode |= DCB_CAP_DCBX_VER_CEE; 153805930d18SSudarsana Reddy Kalluru if (dcbx_info->operational.local) 153905930d18SSudarsana Reddy Kalluru mode |= DCB_CAP_DCBX_STATIC; 1540a1d8d8a5SSudarsana Reddy Kalluru 1541a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "dcb mode = %d\n", mode); 1542a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1543a1d8d8a5SSudarsana Reddy Kalluru 1544a1d8d8a5SSudarsana Reddy Kalluru return mode; 1545a1d8d8a5SSudarsana Reddy Kalluru } 1546a1d8d8a5SSudarsana Reddy Kalluru 1547a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_setpgtccfgtx(struct qed_dev *cdev, 1548a1d8d8a5SSudarsana Reddy Kalluru int tc, 1549a1d8d8a5SSudarsana Reddy Kalluru u8 pri_type, u8 pgid, u8 bw_pct, u8 up_map) 1550a1d8d8a5SSudarsana Reddy Kalluru { 1551a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1552a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 1553a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 1554a1d8d8a5SSudarsana Reddy Kalluru int rc; 1555a1d8d8a5SSudarsana Reddy Kalluru 1556a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, 1557a1d8d8a5SSudarsana Reddy Kalluru "tc = %d pri_type = %d pgid = %d bw_pct = %d up_map = %d\n", 1558a1d8d8a5SSudarsana Reddy Kalluru tc, pri_type, pgid, bw_pct, up_map); 1559a1d8d8a5SSudarsana Reddy Kalluru 1560a1d8d8a5SSudarsana Reddy Kalluru if (tc < 0 || tc >= QED_MAX_PFC_PRIORITIES) { 1561a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "Invalid tc %d\n", tc); 1562a1d8d8a5SSudarsana Reddy Kalluru return; 1563a1d8d8a5SSudarsana Reddy Kalluru } 1564a1d8d8a5SSudarsana Reddy Kalluru 1565a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 1566a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 1567a1d8d8a5SSudarsana Reddy Kalluru if (rc) 1568a1d8d8a5SSudarsana Reddy Kalluru return; 1569a1d8d8a5SSudarsana Reddy Kalluru 1570a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_ETS_CFG; 1571a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.ets_pri_tc_tbl[tc] = pgid; 1572a1d8d8a5SSudarsana Reddy Kalluru 1573a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 1574a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 1575a1d8d8a5SSudarsana Reddy Kalluru return; 1576a1d8d8a5SSudarsana Reddy Kalluru 1577a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 1578a1d8d8a5SSudarsana Reddy Kalluru 1579a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 1580a1d8d8a5SSudarsana Reddy Kalluru } 1581a1d8d8a5SSudarsana Reddy Kalluru 1582a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_setpgtccfgrx(struct qed_dev *cdev, int prio, 1583a1d8d8a5SSudarsana Reddy Kalluru u8 pri_type, u8 pgid, u8 bw_pct, u8 up_map) 1584a1d8d8a5SSudarsana Reddy Kalluru { 1585a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(QED_LEADING_HWFN(cdev), "Rx ETS is not supported\n"); 1586a1d8d8a5SSudarsana Reddy Kalluru } 1587a1d8d8a5SSudarsana Reddy Kalluru 1588a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_setpgbwgcfgtx(struct qed_dev *cdev, int pgid, u8 bw_pct) 1589a1d8d8a5SSudarsana Reddy Kalluru { 1590a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1591a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 1592a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 1593a1d8d8a5SSudarsana Reddy Kalluru int rc; 1594a1d8d8a5SSudarsana Reddy Kalluru 1595a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "pgid = %d bw_pct = %d\n", pgid, bw_pct); 1596a1d8d8a5SSudarsana Reddy Kalluru if (pgid < 0 || pgid >= QED_MAX_PFC_PRIORITIES) { 1597a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "Invalid pgid %d\n", pgid); 1598a1d8d8a5SSudarsana Reddy Kalluru return; 1599a1d8d8a5SSudarsana Reddy Kalluru } 1600a1d8d8a5SSudarsana Reddy Kalluru 1601a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 1602a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 1603a1d8d8a5SSudarsana Reddy Kalluru if (rc) 1604a1d8d8a5SSudarsana Reddy Kalluru return; 1605a1d8d8a5SSudarsana Reddy Kalluru 1606a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_ETS_CFG; 1607a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.ets_tc_bw_tbl[pgid] = bw_pct; 1608a1d8d8a5SSudarsana Reddy Kalluru 1609a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 1610a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 1611a1d8d8a5SSudarsana Reddy Kalluru return; 1612a1d8d8a5SSudarsana Reddy Kalluru 1613a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 1614a1d8d8a5SSudarsana Reddy Kalluru 1615a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 1616a1d8d8a5SSudarsana Reddy Kalluru } 1617a1d8d8a5SSudarsana Reddy Kalluru 1618a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_setpgbwgcfgrx(struct qed_dev *cdev, int pgid, u8 bw_pct) 1619a1d8d8a5SSudarsana Reddy Kalluru { 1620a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(QED_LEADING_HWFN(cdev), "Rx ETS is not supported\n"); 1621a1d8d8a5SSudarsana Reddy Kalluru } 1622a1d8d8a5SSudarsana Reddy Kalluru 1623a1d8d8a5SSudarsana Reddy Kalluru static u8 qed_dcbnl_setall(struct qed_dev *cdev) 1624a1d8d8a5SSudarsana Reddy Kalluru { 1625a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1626a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 1627a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 1628a1d8d8a5SSudarsana Reddy Kalluru int rc; 1629a1d8d8a5SSudarsana Reddy Kalluru 1630a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 1631a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 1632a1d8d8a5SSudarsana Reddy Kalluru if (rc) 1633a1d8d8a5SSudarsana Reddy Kalluru return 1; 1634a1d8d8a5SSudarsana Reddy Kalluru 1635a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 1636a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 1637a1d8d8a5SSudarsana Reddy Kalluru return 1; 1638a1d8d8a5SSudarsana Reddy Kalluru 1639a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 1); 1640a1d8d8a5SSudarsana Reddy Kalluru 1641a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 1642a1d8d8a5SSudarsana Reddy Kalluru 1643a1d8d8a5SSudarsana Reddy Kalluru return rc; 1644a1d8d8a5SSudarsana Reddy Kalluru } 1645a1d8d8a5SSudarsana Reddy Kalluru 1646a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_setnumtcs(struct qed_dev *cdev, int tcid, u8 num) 1647a1d8d8a5SSudarsana Reddy Kalluru { 1648a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1649a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 1650a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 1651a1d8d8a5SSudarsana Reddy Kalluru int rc; 1652a1d8d8a5SSudarsana Reddy Kalluru 1653a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "tcid = %d num = %d\n", tcid, num); 1654a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 1655a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 1656a1d8d8a5SSudarsana Reddy Kalluru if (rc) 1657a1d8d8a5SSudarsana Reddy Kalluru return 1; 1658a1d8d8a5SSudarsana Reddy Kalluru 1659a1d8d8a5SSudarsana Reddy Kalluru switch (tcid) { 1660a1d8d8a5SSudarsana Reddy Kalluru case DCB_NUMTCS_ATTR_PG: 1661a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_ETS_CFG; 1662a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.max_ets_tc = num; 1663a1d8d8a5SSudarsana Reddy Kalluru break; 1664a1d8d8a5SSudarsana Reddy Kalluru case DCB_NUMTCS_ATTR_PFC: 1665a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_PFC_CFG; 1666a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.pfc.max_tc = num; 1667a1d8d8a5SSudarsana Reddy Kalluru break; 1668a1d8d8a5SSudarsana Reddy Kalluru default: 1669a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "Invalid tcid %d\n", tcid); 1670a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 1671a1d8d8a5SSudarsana Reddy Kalluru } 1672a1d8d8a5SSudarsana Reddy Kalluru 1673a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 1674a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 1675a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 1676a1d8d8a5SSudarsana Reddy Kalluru 1677a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 1678a1d8d8a5SSudarsana Reddy Kalluru 1679a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 1680a1d8d8a5SSudarsana Reddy Kalluru 1681a1d8d8a5SSudarsana Reddy Kalluru return 0; 1682a1d8d8a5SSudarsana Reddy Kalluru } 1683a1d8d8a5SSudarsana Reddy Kalluru 1684a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_setpfcstate(struct qed_dev *cdev, u8 state) 1685a1d8d8a5SSudarsana Reddy Kalluru { 1686a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1687a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 1688a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 1689a1d8d8a5SSudarsana Reddy Kalluru int rc; 1690a1d8d8a5SSudarsana Reddy Kalluru 1691a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "new state = %d\n", state); 1692a1d8d8a5SSudarsana Reddy Kalluru 1693a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 1694a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 1695a1d8d8a5SSudarsana Reddy Kalluru if (rc) 1696a1d8d8a5SSudarsana Reddy Kalluru return; 1697a1d8d8a5SSudarsana Reddy Kalluru 1698a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_PFC_CFG; 1699a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.pfc.enabled = !!state; 1700a1d8d8a5SSudarsana Reddy Kalluru 1701a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 1702a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 1703a1d8d8a5SSudarsana Reddy Kalluru return; 1704a1d8d8a5SSudarsana Reddy Kalluru 1705a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 1706a1d8d8a5SSudarsana Reddy Kalluru 1707a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 1708a1d8d8a5SSudarsana Reddy Kalluru } 1709a1d8d8a5SSudarsana Reddy Kalluru 1710a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_getapp(struct qed_dev *cdev, u8 idtype, u16 idval) 1711a1d8d8a5SSudarsana Reddy Kalluru { 1712a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1713a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1714a1d8d8a5SSudarsana Reddy Kalluru struct qed_app_entry *entry; 1715a1d8d8a5SSudarsana Reddy Kalluru bool ethtype; 1716a1d8d8a5SSudarsana Reddy Kalluru u8 prio = 0; 1717a1d8d8a5SSudarsana Reddy Kalluru int i; 1718a1d8d8a5SSudarsana Reddy Kalluru 1719a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 1720a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1721a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 1722a1d8d8a5SSudarsana Reddy Kalluru 1723a1d8d8a5SSudarsana Reddy Kalluru ethtype = !!(idtype == DCB_APP_IDTYPE_ETHTYPE); 1724a1d8d8a5SSudarsana Reddy Kalluru for (i = 0; i < QED_DCBX_MAX_APP_PROTOCOL; i++) { 1725a1d8d8a5SSudarsana Reddy Kalluru entry = &dcbx_info->operational.params.app_entry[i]; 1726a1d8d8a5SSudarsana Reddy Kalluru if ((entry->ethtype == ethtype) && (entry->proto_id == idval)) { 1727a1d8d8a5SSudarsana Reddy Kalluru prio = entry->prio; 1728a1d8d8a5SSudarsana Reddy Kalluru break; 1729a1d8d8a5SSudarsana Reddy Kalluru } 1730a1d8d8a5SSudarsana Reddy Kalluru } 1731a1d8d8a5SSudarsana Reddy Kalluru 1732a1d8d8a5SSudarsana Reddy Kalluru if (i == QED_DCBX_MAX_APP_PROTOCOL) { 1733a1d8d8a5SSudarsana Reddy Kalluru DP_ERR(cdev, "App entry (%d, %d) not found\n", idtype, idval); 1734a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1735a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 1736a1d8d8a5SSudarsana Reddy Kalluru } 1737a1d8d8a5SSudarsana Reddy Kalluru 1738a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1739a1d8d8a5SSudarsana Reddy Kalluru 1740a1d8d8a5SSudarsana Reddy Kalluru return prio; 1741a1d8d8a5SSudarsana Reddy Kalluru } 1742a1d8d8a5SSudarsana Reddy Kalluru 1743a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_setapp(struct qed_dev *cdev, 1744a1d8d8a5SSudarsana Reddy Kalluru u8 idtype, u16 idval, u8 pri_map) 1745a1d8d8a5SSudarsana Reddy Kalluru { 1746a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1747a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 1748a1d8d8a5SSudarsana Reddy Kalluru struct qed_app_entry *entry; 1749a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 1750a1d8d8a5SSudarsana Reddy Kalluru bool ethtype; 1751a1d8d8a5SSudarsana Reddy Kalluru int rc, i; 1752a1d8d8a5SSudarsana Reddy Kalluru 1753a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 1754a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 1755a1d8d8a5SSudarsana Reddy Kalluru if (rc) 1756a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 1757a1d8d8a5SSudarsana Reddy Kalluru 1758a1d8d8a5SSudarsana Reddy Kalluru ethtype = !!(idtype == DCB_APP_IDTYPE_ETHTYPE); 1759a1d8d8a5SSudarsana Reddy Kalluru for (i = 0; i < QED_DCBX_MAX_APP_PROTOCOL; i++) { 1760a1d8d8a5SSudarsana Reddy Kalluru entry = &dcbx_set.config.params.app_entry[i]; 1761a1d8d8a5SSudarsana Reddy Kalluru if ((entry->ethtype == ethtype) && (entry->proto_id == idval)) 1762a1d8d8a5SSudarsana Reddy Kalluru break; 1763a1d8d8a5SSudarsana Reddy Kalluru /* First empty slot */ 17641d7406ceSSudarsana Reddy Kalluru if (!entry->proto_id) { 17651d7406ceSSudarsana Reddy Kalluru dcbx_set.config.params.num_app_entries++; 1766a1d8d8a5SSudarsana Reddy Kalluru break; 1767a1d8d8a5SSudarsana Reddy Kalluru } 17681d7406ceSSudarsana Reddy Kalluru } 1769a1d8d8a5SSudarsana Reddy Kalluru 1770a1d8d8a5SSudarsana Reddy Kalluru if (i == QED_DCBX_MAX_APP_PROTOCOL) { 1771a1d8d8a5SSudarsana Reddy Kalluru DP_ERR(cdev, "App table is full\n"); 1772a1d8d8a5SSudarsana Reddy Kalluru return -EBUSY; 1773a1d8d8a5SSudarsana Reddy Kalluru } 1774a1d8d8a5SSudarsana Reddy Kalluru 1775a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_APP_CFG; 1776a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.app_entry[i].ethtype = ethtype; 1777a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.app_entry[i].proto_id = idval; 1778a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.app_entry[i].prio = pri_map; 1779a1d8d8a5SSudarsana Reddy Kalluru 1780a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 1781a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 1782a1d8d8a5SSudarsana Reddy Kalluru return -EBUSY; 1783a1d8d8a5SSudarsana Reddy Kalluru 1784a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 1785a1d8d8a5SSudarsana Reddy Kalluru 1786a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 1787a1d8d8a5SSudarsana Reddy Kalluru 1788a1d8d8a5SSudarsana Reddy Kalluru return rc; 1789a1d8d8a5SSudarsana Reddy Kalluru } 1790a1d8d8a5SSudarsana Reddy Kalluru 1791a1d8d8a5SSudarsana Reddy Kalluru static u8 qed_dcbnl_setdcbx(struct qed_dev *cdev, u8 mode) 1792a1d8d8a5SSudarsana Reddy Kalluru { 1793a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1794a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 1795a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 1796a1d8d8a5SSudarsana Reddy Kalluru int rc; 1797a1d8d8a5SSudarsana Reddy Kalluru 1798a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "new mode = %x\n", mode); 1799a1d8d8a5SSudarsana Reddy Kalluru 180049632b58Ssudarsana.kalluru@cavium.com if (!(mode & DCB_CAP_DCBX_VER_IEEE) && 180149632b58Ssudarsana.kalluru@cavium.com !(mode & DCB_CAP_DCBX_VER_CEE) && !(mode & DCB_CAP_DCBX_STATIC)) { 180249632b58Ssudarsana.kalluru@cavium.com DP_INFO(hwfn, "Allowed modes are cee, ieee or static\n"); 1803a1d8d8a5SSudarsana Reddy Kalluru return 1; 1804a1d8d8a5SSudarsana Reddy Kalluru } 1805a1d8d8a5SSudarsana Reddy Kalluru 1806a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 1807a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 1808a1d8d8a5SSudarsana Reddy Kalluru if (rc) 1809a1d8d8a5SSudarsana Reddy Kalluru return 1; 1810a1d8d8a5SSudarsana Reddy Kalluru 1811a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.ver_num = 0; 1812a1d8d8a5SSudarsana Reddy Kalluru if (mode & DCB_CAP_DCBX_VER_CEE) { 1813a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.ver_num |= DCBX_CONFIG_VERSION_CEE; 1814a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.enabled = true; 1815a1d8d8a5SSudarsana Reddy Kalluru } 1816a1d8d8a5SSudarsana Reddy Kalluru 1817a1d8d8a5SSudarsana Reddy Kalluru if (mode & DCB_CAP_DCBX_VER_IEEE) { 1818a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.ver_num |= DCBX_CONFIG_VERSION_IEEE; 1819a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.enabled = true; 1820a1d8d8a5SSudarsana Reddy Kalluru } 1821a1d8d8a5SSudarsana Reddy Kalluru 182249632b58Ssudarsana.kalluru@cavium.com if (mode & DCB_CAP_DCBX_STATIC) { 182349632b58Ssudarsana.kalluru@cavium.com dcbx_set.ver_num |= DCBX_CONFIG_VERSION_STATIC; 182449632b58Ssudarsana.kalluru@cavium.com dcbx_set.enabled = true; 182549632b58Ssudarsana.kalluru@cavium.com } 182649632b58Ssudarsana.kalluru@cavium.com 1827a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 1828a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 1829a1d8d8a5SSudarsana Reddy Kalluru return 1; 1830a1d8d8a5SSudarsana Reddy Kalluru 1831a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 1832a1d8d8a5SSudarsana Reddy Kalluru 1833a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 1834a1d8d8a5SSudarsana Reddy Kalluru 183549632b58Ssudarsana.kalluru@cavium.com return rc; 1836a1d8d8a5SSudarsana Reddy Kalluru } 1837a1d8d8a5SSudarsana Reddy Kalluru 1838a1d8d8a5SSudarsana Reddy Kalluru static u8 qed_dcbnl_getfeatcfg(struct qed_dev *cdev, int featid, u8 *flags) 1839a1d8d8a5SSudarsana Reddy Kalluru { 1840a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1841a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1842a1d8d8a5SSudarsana Reddy Kalluru 1843a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "Feature id = %d\n", featid); 1844a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 1845a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1846a1d8d8a5SSudarsana Reddy Kalluru return 1; 1847a1d8d8a5SSudarsana Reddy Kalluru 1848a1d8d8a5SSudarsana Reddy Kalluru *flags = 0; 1849a1d8d8a5SSudarsana Reddy Kalluru switch (featid) { 1850a1d8d8a5SSudarsana Reddy Kalluru case DCB_FEATCFG_ATTR_PG: 1851a1d8d8a5SSudarsana Reddy Kalluru if (dcbx_info->operational.params.ets_enabled) 1852a1d8d8a5SSudarsana Reddy Kalluru *flags = DCB_FEATCFG_ENABLE; 1853a1d8d8a5SSudarsana Reddy Kalluru else 1854a1d8d8a5SSudarsana Reddy Kalluru *flags = DCB_FEATCFG_ERROR; 1855a1d8d8a5SSudarsana Reddy Kalluru break; 1856a1d8d8a5SSudarsana Reddy Kalluru case DCB_FEATCFG_ATTR_PFC: 1857a1d8d8a5SSudarsana Reddy Kalluru if (dcbx_info->operational.params.pfc.enabled) 1858a1d8d8a5SSudarsana Reddy Kalluru *flags = DCB_FEATCFG_ENABLE; 1859a1d8d8a5SSudarsana Reddy Kalluru else 1860a1d8d8a5SSudarsana Reddy Kalluru *flags = DCB_FEATCFG_ERROR; 1861a1d8d8a5SSudarsana Reddy Kalluru break; 1862a1d8d8a5SSudarsana Reddy Kalluru case DCB_FEATCFG_ATTR_APP: 1863a1d8d8a5SSudarsana Reddy Kalluru if (dcbx_info->operational.params.app_valid) 1864a1d8d8a5SSudarsana Reddy Kalluru *flags = DCB_FEATCFG_ENABLE; 1865a1d8d8a5SSudarsana Reddy Kalluru else 1866a1d8d8a5SSudarsana Reddy Kalluru *flags = DCB_FEATCFG_ERROR; 1867a1d8d8a5SSudarsana Reddy Kalluru break; 1868a1d8d8a5SSudarsana Reddy Kalluru default: 1869a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "Invalid feature-ID %d\n", featid); 1870a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1871a1d8d8a5SSudarsana Reddy Kalluru return 1; 1872a1d8d8a5SSudarsana Reddy Kalluru } 1873a1d8d8a5SSudarsana Reddy Kalluru 1874a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "flags = %d\n", *flags); 1875a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1876a1d8d8a5SSudarsana Reddy Kalluru 1877a1d8d8a5SSudarsana Reddy Kalluru return 0; 1878a1d8d8a5SSudarsana Reddy Kalluru } 1879a1d8d8a5SSudarsana Reddy Kalluru 1880a1d8d8a5SSudarsana Reddy Kalluru static u8 qed_dcbnl_setfeatcfg(struct qed_dev *cdev, int featid, u8 flags) 1881a1d8d8a5SSudarsana Reddy Kalluru { 1882a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1883a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 1884a1d8d8a5SSudarsana Reddy Kalluru bool enabled, willing; 1885a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 1886a1d8d8a5SSudarsana Reddy Kalluru int rc; 1887a1d8d8a5SSudarsana Reddy Kalluru 1888a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "featid = %d flags = %d\n", 1889a1d8d8a5SSudarsana Reddy Kalluru featid, flags); 1890a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 1891a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 1892a1d8d8a5SSudarsana Reddy Kalluru if (rc) 1893a1d8d8a5SSudarsana Reddy Kalluru return 1; 1894a1d8d8a5SSudarsana Reddy Kalluru 1895a1d8d8a5SSudarsana Reddy Kalluru enabled = !!(flags & DCB_FEATCFG_ENABLE); 1896a1d8d8a5SSudarsana Reddy Kalluru willing = !!(flags & DCB_FEATCFG_WILLING); 1897a1d8d8a5SSudarsana Reddy Kalluru switch (featid) { 1898a1d8d8a5SSudarsana Reddy Kalluru case DCB_FEATCFG_ATTR_PG: 1899a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_ETS_CFG; 1900a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.ets_enabled = enabled; 1901a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.ets_willing = willing; 1902a1d8d8a5SSudarsana Reddy Kalluru break; 1903a1d8d8a5SSudarsana Reddy Kalluru case DCB_FEATCFG_ATTR_PFC: 1904a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_PFC_CFG; 1905a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.pfc.enabled = enabled; 1906a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.pfc.willing = willing; 1907a1d8d8a5SSudarsana Reddy Kalluru break; 1908a1d8d8a5SSudarsana Reddy Kalluru case DCB_FEATCFG_ATTR_APP: 1909a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_APP_CFG; 1910a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.app_willing = willing; 1911a1d8d8a5SSudarsana Reddy Kalluru break; 1912a1d8d8a5SSudarsana Reddy Kalluru default: 1913a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "Invalid feature-ID %d\n", featid); 1914a1d8d8a5SSudarsana Reddy Kalluru return 1; 1915a1d8d8a5SSudarsana Reddy Kalluru } 1916a1d8d8a5SSudarsana Reddy Kalluru 1917a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 1918a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 1919a1d8d8a5SSudarsana Reddy Kalluru return 1; 1920a1d8d8a5SSudarsana Reddy Kalluru 1921a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 1922a1d8d8a5SSudarsana Reddy Kalluru 1923a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 1924a1d8d8a5SSudarsana Reddy Kalluru 1925a1d8d8a5SSudarsana Reddy Kalluru return 0; 1926a1d8d8a5SSudarsana Reddy Kalluru } 1927a1d8d8a5SSudarsana Reddy Kalluru 1928a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_peer_getappinfo(struct qed_dev *cdev, 1929a1d8d8a5SSudarsana Reddy Kalluru struct dcb_peer_app_info *info, 1930a1d8d8a5SSudarsana Reddy Kalluru u16 *app_count) 1931a1d8d8a5SSudarsana Reddy Kalluru { 1932a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1933a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1934a1d8d8a5SSudarsana Reddy Kalluru 1935a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_REMOTE_MIB); 1936a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1937a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 1938a1d8d8a5SSudarsana Reddy Kalluru 1939a1d8d8a5SSudarsana Reddy Kalluru info->willing = dcbx_info->remote.params.app_willing; 1940a1d8d8a5SSudarsana Reddy Kalluru info->error = dcbx_info->remote.params.app_error; 1941a1d8d8a5SSudarsana Reddy Kalluru *app_count = dcbx_info->remote.params.num_app_entries; 1942a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1943a1d8d8a5SSudarsana Reddy Kalluru 1944a1d8d8a5SSudarsana Reddy Kalluru return 0; 1945a1d8d8a5SSudarsana Reddy Kalluru } 1946a1d8d8a5SSudarsana Reddy Kalluru 1947a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_peer_getapptable(struct qed_dev *cdev, 1948a1d8d8a5SSudarsana Reddy Kalluru struct dcb_app *table) 1949a1d8d8a5SSudarsana Reddy Kalluru { 1950a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1951a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1952a1d8d8a5SSudarsana Reddy Kalluru int i; 1953a1d8d8a5SSudarsana Reddy Kalluru 1954a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_REMOTE_MIB); 1955a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1956a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 1957a1d8d8a5SSudarsana Reddy Kalluru 1958a1d8d8a5SSudarsana Reddy Kalluru for (i = 0; i < dcbx_info->remote.params.num_app_entries; i++) { 1959a1d8d8a5SSudarsana Reddy Kalluru if (dcbx_info->remote.params.app_entry[i].ethtype) 1960a1d8d8a5SSudarsana Reddy Kalluru table[i].selector = DCB_APP_IDTYPE_ETHTYPE; 1961a1d8d8a5SSudarsana Reddy Kalluru else 1962a1d8d8a5SSudarsana Reddy Kalluru table[i].selector = DCB_APP_IDTYPE_PORTNUM; 1963a1d8d8a5SSudarsana Reddy Kalluru table[i].priority = dcbx_info->remote.params.app_entry[i].prio; 1964a1d8d8a5SSudarsana Reddy Kalluru table[i].protocol = 1965a1d8d8a5SSudarsana Reddy Kalluru dcbx_info->remote.params.app_entry[i].proto_id; 1966a1d8d8a5SSudarsana Reddy Kalluru } 1967a1d8d8a5SSudarsana Reddy Kalluru 1968a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1969a1d8d8a5SSudarsana Reddy Kalluru 1970a1d8d8a5SSudarsana Reddy Kalluru return 0; 1971a1d8d8a5SSudarsana Reddy Kalluru } 1972a1d8d8a5SSudarsana Reddy Kalluru 1973a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_cee_peer_getpfc(struct qed_dev *cdev, struct cee_pfc *pfc) 1974a1d8d8a5SSudarsana Reddy Kalluru { 1975a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1976a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1977a1d8d8a5SSudarsana Reddy Kalluru int i; 1978a1d8d8a5SSudarsana Reddy Kalluru 1979a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_REMOTE_MIB); 1980a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1981a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 1982a1d8d8a5SSudarsana Reddy Kalluru 1983a1d8d8a5SSudarsana Reddy Kalluru for (i = 0; i < QED_MAX_PFC_PRIORITIES; i++) 1984a1d8d8a5SSudarsana Reddy Kalluru if (dcbx_info->remote.params.pfc.prio[i]) 1985a1d8d8a5SSudarsana Reddy Kalluru pfc->pfc_en |= BIT(i); 1986a1d8d8a5SSudarsana Reddy Kalluru 1987a1d8d8a5SSudarsana Reddy Kalluru pfc->tcs_supported = dcbx_info->remote.params.pfc.max_tc; 1988a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "pfc state = %d tcs_supported = %d\n", 1989a1d8d8a5SSudarsana Reddy Kalluru pfc->pfc_en, pfc->tcs_supported); 1990a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1991a1d8d8a5SSudarsana Reddy Kalluru 1992a1d8d8a5SSudarsana Reddy Kalluru return 0; 1993a1d8d8a5SSudarsana Reddy Kalluru } 1994a1d8d8a5SSudarsana Reddy Kalluru 1995a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_cee_peer_getpg(struct qed_dev *cdev, struct cee_pg *pg) 1996a1d8d8a5SSudarsana Reddy Kalluru { 1997a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1998a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1999a1d8d8a5SSudarsana Reddy Kalluru int i; 2000a1d8d8a5SSudarsana Reddy Kalluru 2001a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_REMOTE_MIB); 2002a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 2003a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2004a1d8d8a5SSudarsana Reddy Kalluru 2005a1d8d8a5SSudarsana Reddy Kalluru pg->willing = dcbx_info->remote.params.ets_willing; 2006a1d8d8a5SSudarsana Reddy Kalluru for (i = 0; i < QED_MAX_PFC_PRIORITIES; i++) { 2007a1d8d8a5SSudarsana Reddy Kalluru pg->pg_bw[i] = dcbx_info->remote.params.ets_tc_bw_tbl[i]; 2008a1d8d8a5SSudarsana Reddy Kalluru pg->prio_pg[i] = dcbx_info->remote.params.ets_pri_tc_tbl[i]; 2009a1d8d8a5SSudarsana Reddy Kalluru } 2010a1d8d8a5SSudarsana Reddy Kalluru 2011a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "willing = %d", pg->willing); 2012a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2013a1d8d8a5SSudarsana Reddy Kalluru 2014a1d8d8a5SSudarsana Reddy Kalluru return 0; 2015a1d8d8a5SSudarsana Reddy Kalluru } 2016a1d8d8a5SSudarsana Reddy Kalluru 2017a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_get_ieee_pfc(struct qed_dev *cdev, 2018a1d8d8a5SSudarsana Reddy Kalluru struct ieee_pfc *pfc, bool remote) 2019a1d8d8a5SSudarsana Reddy Kalluru { 2020a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 2021a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_params *params; 2022a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 2023a1d8d8a5SSudarsana Reddy Kalluru int rc, i; 2024a1d8d8a5SSudarsana Reddy Kalluru 2025a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 2026a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 2027a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2028a1d8d8a5SSudarsana Reddy Kalluru 2029a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info->operational.ieee) { 2030a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "DCBX is not enabled/operational in IEEE mode\n"); 203102ee9b18SWei Yongjun kfree(dcbx_info); 2032a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2033a1d8d8a5SSudarsana Reddy Kalluru } 2034a1d8d8a5SSudarsana Reddy Kalluru 2035a1d8d8a5SSudarsana Reddy Kalluru if (remote) { 2036a1d8d8a5SSudarsana Reddy Kalluru memset(dcbx_info, 0, sizeof(*dcbx_info)); 2037a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_query_params(hwfn, dcbx_info, 2038a1d8d8a5SSudarsana Reddy Kalluru QED_DCBX_REMOTE_MIB); 2039a1d8d8a5SSudarsana Reddy Kalluru if (rc) { 2040a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2041a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2042a1d8d8a5SSudarsana Reddy Kalluru } 2043a1d8d8a5SSudarsana Reddy Kalluru 2044a1d8d8a5SSudarsana Reddy Kalluru params = &dcbx_info->remote.params; 2045a1d8d8a5SSudarsana Reddy Kalluru } else { 2046a1d8d8a5SSudarsana Reddy Kalluru params = &dcbx_info->operational.params; 2047a1d8d8a5SSudarsana Reddy Kalluru } 2048a1d8d8a5SSudarsana Reddy Kalluru 2049a1d8d8a5SSudarsana Reddy Kalluru pfc->pfc_cap = params->pfc.max_tc; 2050a1d8d8a5SSudarsana Reddy Kalluru pfc->pfc_en = 0; 2051a1d8d8a5SSudarsana Reddy Kalluru for (i = 0; i < QED_MAX_PFC_PRIORITIES; i++) 2052a1d8d8a5SSudarsana Reddy Kalluru if (params->pfc.prio[i]) 2053a1d8d8a5SSudarsana Reddy Kalluru pfc->pfc_en |= BIT(i); 2054a1d8d8a5SSudarsana Reddy Kalluru 2055a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2056a1d8d8a5SSudarsana Reddy Kalluru 2057a1d8d8a5SSudarsana Reddy Kalluru return 0; 2058a1d8d8a5SSudarsana Reddy Kalluru } 2059a1d8d8a5SSudarsana Reddy Kalluru 2060a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_ieee_getpfc(struct qed_dev *cdev, struct ieee_pfc *pfc) 2061a1d8d8a5SSudarsana Reddy Kalluru { 2062a1d8d8a5SSudarsana Reddy Kalluru return qed_dcbnl_get_ieee_pfc(cdev, pfc, false); 2063a1d8d8a5SSudarsana Reddy Kalluru } 2064a1d8d8a5SSudarsana Reddy Kalluru 2065a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_ieee_setpfc(struct qed_dev *cdev, struct ieee_pfc *pfc) 2066a1d8d8a5SSudarsana Reddy Kalluru { 2067a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 2068a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 2069a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 2070a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 2071a1d8d8a5SSudarsana Reddy Kalluru int rc, i; 2072a1d8d8a5SSudarsana Reddy Kalluru 2073a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 2074a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 2075a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2076a1d8d8a5SSudarsana Reddy Kalluru 2077a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info->operational.ieee) { 2078a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "DCBX is not enabled/operational in IEEE mode\n"); 2079a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2080a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2081a1d8d8a5SSudarsana Reddy Kalluru } 2082a1d8d8a5SSudarsana Reddy Kalluru 2083a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2084a1d8d8a5SSudarsana Reddy Kalluru 2085a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 2086a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 2087a1d8d8a5SSudarsana Reddy Kalluru if (rc) 2088a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2089a1d8d8a5SSudarsana Reddy Kalluru 2090a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_PFC_CFG; 2091a1d8d8a5SSudarsana Reddy Kalluru for (i = 0; i < QED_MAX_PFC_PRIORITIES; i++) 2092a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.pfc.prio[i] = !!(pfc->pfc_en & BIT(i)); 2093a1d8d8a5SSudarsana Reddy Kalluru 2094c0c5dbe7Ssudarsana.kalluru@cavium.com dcbx_set.config.params.pfc.max_tc = pfc->pfc_cap; 2095c0c5dbe7Ssudarsana.kalluru@cavium.com 2096a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 2097a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 2098a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2099a1d8d8a5SSudarsana Reddy Kalluru 2100a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 2101a1d8d8a5SSudarsana Reddy Kalluru 2102a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 2103a1d8d8a5SSudarsana Reddy Kalluru 2104a1d8d8a5SSudarsana Reddy Kalluru return rc; 2105a1d8d8a5SSudarsana Reddy Kalluru } 2106a1d8d8a5SSudarsana Reddy Kalluru 2107a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_get_ieee_ets(struct qed_dev *cdev, 2108a1d8d8a5SSudarsana Reddy Kalluru struct ieee_ets *ets, bool remote) 2109a1d8d8a5SSudarsana Reddy Kalluru { 2110a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 2111a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 2112a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_params *params; 2113a1d8d8a5SSudarsana Reddy Kalluru int rc; 2114a1d8d8a5SSudarsana Reddy Kalluru 2115a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 2116a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 2117a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2118a1d8d8a5SSudarsana Reddy Kalluru 2119a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info->operational.ieee) { 2120a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "DCBX is not enabled/operational in IEEE mode\n"); 2121a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2122a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2123a1d8d8a5SSudarsana Reddy Kalluru } 2124a1d8d8a5SSudarsana Reddy Kalluru 2125a1d8d8a5SSudarsana Reddy Kalluru if (remote) { 2126a1d8d8a5SSudarsana Reddy Kalluru memset(dcbx_info, 0, sizeof(*dcbx_info)); 2127a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_query_params(hwfn, dcbx_info, 2128a1d8d8a5SSudarsana Reddy Kalluru QED_DCBX_REMOTE_MIB); 2129a1d8d8a5SSudarsana Reddy Kalluru if (rc) { 2130a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2131a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2132a1d8d8a5SSudarsana Reddy Kalluru } 2133a1d8d8a5SSudarsana Reddy Kalluru 2134a1d8d8a5SSudarsana Reddy Kalluru params = &dcbx_info->remote.params; 2135a1d8d8a5SSudarsana Reddy Kalluru } else { 2136a1d8d8a5SSudarsana Reddy Kalluru params = &dcbx_info->operational.params; 2137a1d8d8a5SSudarsana Reddy Kalluru } 2138a1d8d8a5SSudarsana Reddy Kalluru 2139a1d8d8a5SSudarsana Reddy Kalluru ets->ets_cap = params->max_ets_tc; 2140a1d8d8a5SSudarsana Reddy Kalluru ets->willing = params->ets_willing; 2141a1d8d8a5SSudarsana Reddy Kalluru ets->cbs = params->ets_cbs; 2142a1d8d8a5SSudarsana Reddy Kalluru memcpy(ets->tc_tx_bw, params->ets_tc_bw_tbl, sizeof(ets->tc_tx_bw)); 2143a1d8d8a5SSudarsana Reddy Kalluru memcpy(ets->tc_tsa, params->ets_tc_tsa_tbl, sizeof(ets->tc_tsa)); 2144a1d8d8a5SSudarsana Reddy Kalluru memcpy(ets->prio_tc, params->ets_pri_tc_tbl, sizeof(ets->prio_tc)); 2145a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2146a1d8d8a5SSudarsana Reddy Kalluru 2147a1d8d8a5SSudarsana Reddy Kalluru return 0; 2148a1d8d8a5SSudarsana Reddy Kalluru } 2149a1d8d8a5SSudarsana Reddy Kalluru 2150a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_ieee_getets(struct qed_dev *cdev, struct ieee_ets *ets) 2151a1d8d8a5SSudarsana Reddy Kalluru { 2152a1d8d8a5SSudarsana Reddy Kalluru return qed_dcbnl_get_ieee_ets(cdev, ets, false); 2153a1d8d8a5SSudarsana Reddy Kalluru } 2154a1d8d8a5SSudarsana Reddy Kalluru 2155a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_ieee_setets(struct qed_dev *cdev, struct ieee_ets *ets) 2156a1d8d8a5SSudarsana Reddy Kalluru { 2157a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 2158a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 2159a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 2160a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 2161a1d8d8a5SSudarsana Reddy Kalluru int rc; 2162a1d8d8a5SSudarsana Reddy Kalluru 2163a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 2164a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 2165a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2166a1d8d8a5SSudarsana Reddy Kalluru 2167a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info->operational.ieee) { 2168a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "DCBX is not enabled/operational in IEEE mode\n"); 2169a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2170a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2171a1d8d8a5SSudarsana Reddy Kalluru } 2172a1d8d8a5SSudarsana Reddy Kalluru 2173a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2174a1d8d8a5SSudarsana Reddy Kalluru 2175a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 2176a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 2177a1d8d8a5SSudarsana Reddy Kalluru if (rc) 2178a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2179a1d8d8a5SSudarsana Reddy Kalluru 2180a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_ETS_CFG; 2181a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.max_ets_tc = ets->ets_cap; 2182a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.ets_willing = ets->willing; 2183a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.ets_cbs = ets->cbs; 2184a1d8d8a5SSudarsana Reddy Kalluru memcpy(dcbx_set.config.params.ets_tc_bw_tbl, ets->tc_tx_bw, 2185a1d8d8a5SSudarsana Reddy Kalluru sizeof(ets->tc_tx_bw)); 2186a1d8d8a5SSudarsana Reddy Kalluru memcpy(dcbx_set.config.params.ets_tc_tsa_tbl, ets->tc_tsa, 2187a1d8d8a5SSudarsana Reddy Kalluru sizeof(ets->tc_tsa)); 2188a1d8d8a5SSudarsana Reddy Kalluru memcpy(dcbx_set.config.params.ets_pri_tc_tbl, ets->prio_tc, 2189a1d8d8a5SSudarsana Reddy Kalluru sizeof(ets->prio_tc)); 2190a1d8d8a5SSudarsana Reddy Kalluru 2191a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 2192a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 2193a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2194a1d8d8a5SSudarsana Reddy Kalluru 2195a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 2196a1d8d8a5SSudarsana Reddy Kalluru 2197a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 2198a1d8d8a5SSudarsana Reddy Kalluru 2199a1d8d8a5SSudarsana Reddy Kalluru return rc; 2200a1d8d8a5SSudarsana Reddy Kalluru } 2201a1d8d8a5SSudarsana Reddy Kalluru 2202ba56947aSBaoyou Xie static int 2203ba56947aSBaoyou Xie qed_dcbnl_ieee_peer_getets(struct qed_dev *cdev, struct ieee_ets *ets) 2204a1d8d8a5SSudarsana Reddy Kalluru { 2205a1d8d8a5SSudarsana Reddy Kalluru return qed_dcbnl_get_ieee_ets(cdev, ets, true); 2206a1d8d8a5SSudarsana Reddy Kalluru } 2207a1d8d8a5SSudarsana Reddy Kalluru 2208ba56947aSBaoyou Xie static int 2209ba56947aSBaoyou Xie qed_dcbnl_ieee_peer_getpfc(struct qed_dev *cdev, struct ieee_pfc *pfc) 2210a1d8d8a5SSudarsana Reddy Kalluru { 2211a1d8d8a5SSudarsana Reddy Kalluru return qed_dcbnl_get_ieee_pfc(cdev, pfc, true); 2212a1d8d8a5SSudarsana Reddy Kalluru } 2213a1d8d8a5SSudarsana Reddy Kalluru 221405a79f92Ssudarsana.kalluru@cavium.com static int qed_get_sf_ieee_value(u8 selector, u8 *sf_ieee) 221505a79f92Ssudarsana.kalluru@cavium.com { 221605a79f92Ssudarsana.kalluru@cavium.com switch (selector) { 221705a79f92Ssudarsana.kalluru@cavium.com case IEEE_8021QAZ_APP_SEL_ETHERTYPE: 221805a79f92Ssudarsana.kalluru@cavium.com *sf_ieee = QED_DCBX_SF_IEEE_ETHTYPE; 221905a79f92Ssudarsana.kalluru@cavium.com break; 222005a79f92Ssudarsana.kalluru@cavium.com case IEEE_8021QAZ_APP_SEL_STREAM: 222105a79f92Ssudarsana.kalluru@cavium.com *sf_ieee = QED_DCBX_SF_IEEE_TCP_PORT; 222205a79f92Ssudarsana.kalluru@cavium.com break; 222305a79f92Ssudarsana.kalluru@cavium.com case IEEE_8021QAZ_APP_SEL_DGRAM: 222405a79f92Ssudarsana.kalluru@cavium.com *sf_ieee = QED_DCBX_SF_IEEE_UDP_PORT; 222505a79f92Ssudarsana.kalluru@cavium.com break; 222605a79f92Ssudarsana.kalluru@cavium.com case IEEE_8021QAZ_APP_SEL_ANY: 222705a79f92Ssudarsana.kalluru@cavium.com *sf_ieee = QED_DCBX_SF_IEEE_TCP_UDP_PORT; 222805a79f92Ssudarsana.kalluru@cavium.com break; 222905a79f92Ssudarsana.kalluru@cavium.com default: 223005a79f92Ssudarsana.kalluru@cavium.com return -EINVAL; 223105a79f92Ssudarsana.kalluru@cavium.com } 223205a79f92Ssudarsana.kalluru@cavium.com 223305a79f92Ssudarsana.kalluru@cavium.com return 0; 223405a79f92Ssudarsana.kalluru@cavium.com } 223505a79f92Ssudarsana.kalluru@cavium.com 2236ba56947aSBaoyou Xie static int qed_dcbnl_ieee_getapp(struct qed_dev *cdev, struct dcb_app *app) 2237a1d8d8a5SSudarsana Reddy Kalluru { 2238a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 2239a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 2240a1d8d8a5SSudarsana Reddy Kalluru struct qed_app_entry *entry; 2241a1d8d8a5SSudarsana Reddy Kalluru u8 prio = 0; 224205a79f92Ssudarsana.kalluru@cavium.com u8 sf_ieee; 2243a1d8d8a5SSudarsana Reddy Kalluru int i; 2244a1d8d8a5SSudarsana Reddy Kalluru 224505a79f92Ssudarsana.kalluru@cavium.com DP_VERBOSE(hwfn, QED_MSG_DCB, "selector = %d protocol = %d\n", 224605a79f92Ssudarsana.kalluru@cavium.com app->selector, app->protocol); 224705a79f92Ssudarsana.kalluru@cavium.com 224805a79f92Ssudarsana.kalluru@cavium.com if (qed_get_sf_ieee_value(app->selector, &sf_ieee)) { 224905a79f92Ssudarsana.kalluru@cavium.com DP_INFO(cdev, "Invalid selector field value %d\n", 225005a79f92Ssudarsana.kalluru@cavium.com app->selector); 225105a79f92Ssudarsana.kalluru@cavium.com return -EINVAL; 225205a79f92Ssudarsana.kalluru@cavium.com } 225305a79f92Ssudarsana.kalluru@cavium.com 2254a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 2255a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 2256a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2257a1d8d8a5SSudarsana Reddy Kalluru 2258a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info->operational.ieee) { 2259a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "DCBX is not enabled/operational in IEEE mode\n"); 2260a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2261a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2262a1d8d8a5SSudarsana Reddy Kalluru } 2263a1d8d8a5SSudarsana Reddy Kalluru 2264a1d8d8a5SSudarsana Reddy Kalluru for (i = 0; i < QED_DCBX_MAX_APP_PROTOCOL; i++) { 2265a1d8d8a5SSudarsana Reddy Kalluru entry = &dcbx_info->operational.params.app_entry[i]; 226605a79f92Ssudarsana.kalluru@cavium.com if ((entry->sf_ieee == sf_ieee) && 2267a1d8d8a5SSudarsana Reddy Kalluru (entry->proto_id == app->protocol)) { 2268a1d8d8a5SSudarsana Reddy Kalluru prio = entry->prio; 2269a1d8d8a5SSudarsana Reddy Kalluru break; 2270a1d8d8a5SSudarsana Reddy Kalluru } 2271a1d8d8a5SSudarsana Reddy Kalluru } 2272a1d8d8a5SSudarsana Reddy Kalluru 2273a1d8d8a5SSudarsana Reddy Kalluru if (i == QED_DCBX_MAX_APP_PROTOCOL) { 2274a1d8d8a5SSudarsana Reddy Kalluru DP_ERR(cdev, "App entry (%d, %d) not found\n", app->selector, 2275a1d8d8a5SSudarsana Reddy Kalluru app->protocol); 2276a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2277a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2278a1d8d8a5SSudarsana Reddy Kalluru } 2279a1d8d8a5SSudarsana Reddy Kalluru 2280a1d8d8a5SSudarsana Reddy Kalluru app->priority = ffs(prio) - 1; 2281a1d8d8a5SSudarsana Reddy Kalluru 2282a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2283a1d8d8a5SSudarsana Reddy Kalluru 2284a1d8d8a5SSudarsana Reddy Kalluru return 0; 2285a1d8d8a5SSudarsana Reddy Kalluru } 2286a1d8d8a5SSudarsana Reddy Kalluru 2287ba56947aSBaoyou Xie static int qed_dcbnl_ieee_setapp(struct qed_dev *cdev, struct dcb_app *app) 2288a1d8d8a5SSudarsana Reddy Kalluru { 2289a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 2290a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 2291a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 2292a1d8d8a5SSudarsana Reddy Kalluru struct qed_app_entry *entry; 2293a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 229405a79f92Ssudarsana.kalluru@cavium.com u8 sf_ieee; 2295a1d8d8a5SSudarsana Reddy Kalluru int rc, i; 2296a1d8d8a5SSudarsana Reddy Kalluru 229705a79f92Ssudarsana.kalluru@cavium.com DP_VERBOSE(hwfn, QED_MSG_DCB, "selector = %d protocol = %d pri = %d\n", 229805a79f92Ssudarsana.kalluru@cavium.com app->selector, app->protocol, app->priority); 2299a1d8d8a5SSudarsana Reddy Kalluru if (app->priority < 0 || app->priority >= QED_MAX_PFC_PRIORITIES) { 2300a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "Invalid priority %d\n", app->priority); 2301a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2302a1d8d8a5SSudarsana Reddy Kalluru } 2303a1d8d8a5SSudarsana Reddy Kalluru 230405a79f92Ssudarsana.kalluru@cavium.com if (qed_get_sf_ieee_value(app->selector, &sf_ieee)) { 230505a79f92Ssudarsana.kalluru@cavium.com DP_INFO(cdev, "Invalid selector field value %d\n", 230605a79f92Ssudarsana.kalluru@cavium.com app->selector); 230705a79f92Ssudarsana.kalluru@cavium.com return -EINVAL; 230805a79f92Ssudarsana.kalluru@cavium.com } 230905a79f92Ssudarsana.kalluru@cavium.com 2310a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 2311a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 2312a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2313a1d8d8a5SSudarsana Reddy Kalluru 2314a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info->operational.ieee) { 2315a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "DCBX is not enabled/operational in IEEE mode\n"); 2316a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2317a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2318a1d8d8a5SSudarsana Reddy Kalluru } 2319a1d8d8a5SSudarsana Reddy Kalluru 2320a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2321a1d8d8a5SSudarsana Reddy Kalluru 2322a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 2323a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 2324a1d8d8a5SSudarsana Reddy Kalluru if (rc) 2325a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2326a1d8d8a5SSudarsana Reddy Kalluru 2327a1d8d8a5SSudarsana Reddy Kalluru for (i = 0; i < QED_DCBX_MAX_APP_PROTOCOL; i++) { 2328a1d8d8a5SSudarsana Reddy Kalluru entry = &dcbx_set.config.params.app_entry[i]; 232905a79f92Ssudarsana.kalluru@cavium.com if ((entry->sf_ieee == sf_ieee) && 2330a1d8d8a5SSudarsana Reddy Kalluru (entry->proto_id == app->protocol)) 2331a1d8d8a5SSudarsana Reddy Kalluru break; 2332a1d8d8a5SSudarsana Reddy Kalluru /* First empty slot */ 23331d7406ceSSudarsana Reddy Kalluru if (!entry->proto_id) { 23341d7406ceSSudarsana Reddy Kalluru dcbx_set.config.params.num_app_entries++; 2335a1d8d8a5SSudarsana Reddy Kalluru break; 2336a1d8d8a5SSudarsana Reddy Kalluru } 23371d7406ceSSudarsana Reddy Kalluru } 2338a1d8d8a5SSudarsana Reddy Kalluru 2339a1d8d8a5SSudarsana Reddy Kalluru if (i == QED_DCBX_MAX_APP_PROTOCOL) { 2340a1d8d8a5SSudarsana Reddy Kalluru DP_ERR(cdev, "App table is full\n"); 2341a1d8d8a5SSudarsana Reddy Kalluru return -EBUSY; 2342a1d8d8a5SSudarsana Reddy Kalluru } 2343a1d8d8a5SSudarsana Reddy Kalluru 2344a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_APP_CFG; 234505a79f92Ssudarsana.kalluru@cavium.com dcbx_set.config.params.app_entry[i].sf_ieee = sf_ieee; 2346a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.app_entry[i].proto_id = app->protocol; 2347a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.app_entry[i].prio = BIT(app->priority); 2348a1d8d8a5SSudarsana Reddy Kalluru 2349a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 2350a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 2351a1d8d8a5SSudarsana Reddy Kalluru return -EBUSY; 2352a1d8d8a5SSudarsana Reddy Kalluru 2353a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 2354a1d8d8a5SSudarsana Reddy Kalluru 2355a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 2356a1d8d8a5SSudarsana Reddy Kalluru 2357a1d8d8a5SSudarsana Reddy Kalluru return rc; 2358a1d8d8a5SSudarsana Reddy Kalluru } 2359a1d8d8a5SSudarsana Reddy Kalluru 2360a1d8d8a5SSudarsana Reddy Kalluru const struct qed_eth_dcbnl_ops qed_dcbnl_ops_pass = { 2361a1d8d8a5SSudarsana Reddy Kalluru .getstate = qed_dcbnl_getstate, 2362a1d8d8a5SSudarsana Reddy Kalluru .setstate = qed_dcbnl_setstate, 2363a1d8d8a5SSudarsana Reddy Kalluru .getpgtccfgtx = qed_dcbnl_getpgtccfgtx, 2364a1d8d8a5SSudarsana Reddy Kalluru .getpgbwgcfgtx = qed_dcbnl_getpgbwgcfgtx, 2365a1d8d8a5SSudarsana Reddy Kalluru .getpgtccfgrx = qed_dcbnl_getpgtccfgrx, 2366a1d8d8a5SSudarsana Reddy Kalluru .getpgbwgcfgrx = qed_dcbnl_getpgbwgcfgrx, 2367a1d8d8a5SSudarsana Reddy Kalluru .getpfccfg = qed_dcbnl_getpfccfg, 2368a1d8d8a5SSudarsana Reddy Kalluru .setpfccfg = qed_dcbnl_setpfccfg, 2369a1d8d8a5SSudarsana Reddy Kalluru .getcap = qed_dcbnl_getcap, 2370a1d8d8a5SSudarsana Reddy Kalluru .getnumtcs = qed_dcbnl_getnumtcs, 2371a1d8d8a5SSudarsana Reddy Kalluru .getpfcstate = qed_dcbnl_getpfcstate, 2372a1d8d8a5SSudarsana Reddy Kalluru .getdcbx = qed_dcbnl_getdcbx, 2373a1d8d8a5SSudarsana Reddy Kalluru .setpgtccfgtx = qed_dcbnl_setpgtccfgtx, 2374a1d8d8a5SSudarsana Reddy Kalluru .setpgtccfgrx = qed_dcbnl_setpgtccfgrx, 2375a1d8d8a5SSudarsana Reddy Kalluru .setpgbwgcfgtx = qed_dcbnl_setpgbwgcfgtx, 2376a1d8d8a5SSudarsana Reddy Kalluru .setpgbwgcfgrx = qed_dcbnl_setpgbwgcfgrx, 2377a1d8d8a5SSudarsana Reddy Kalluru .setall = qed_dcbnl_setall, 2378a1d8d8a5SSudarsana Reddy Kalluru .setnumtcs = qed_dcbnl_setnumtcs, 2379a1d8d8a5SSudarsana Reddy Kalluru .setpfcstate = qed_dcbnl_setpfcstate, 2380a1d8d8a5SSudarsana Reddy Kalluru .setapp = qed_dcbnl_setapp, 2381a1d8d8a5SSudarsana Reddy Kalluru .setdcbx = qed_dcbnl_setdcbx, 2382a1d8d8a5SSudarsana Reddy Kalluru .setfeatcfg = qed_dcbnl_setfeatcfg, 2383a1d8d8a5SSudarsana Reddy Kalluru .getfeatcfg = qed_dcbnl_getfeatcfg, 2384a1d8d8a5SSudarsana Reddy Kalluru .getapp = qed_dcbnl_getapp, 2385a1d8d8a5SSudarsana Reddy Kalluru .peer_getappinfo = qed_dcbnl_peer_getappinfo, 2386a1d8d8a5SSudarsana Reddy Kalluru .peer_getapptable = qed_dcbnl_peer_getapptable, 2387a1d8d8a5SSudarsana Reddy Kalluru .cee_peer_getpfc = qed_dcbnl_cee_peer_getpfc, 2388a1d8d8a5SSudarsana Reddy Kalluru .cee_peer_getpg = qed_dcbnl_cee_peer_getpg, 2389a1d8d8a5SSudarsana Reddy Kalluru .ieee_getpfc = qed_dcbnl_ieee_getpfc, 2390a1d8d8a5SSudarsana Reddy Kalluru .ieee_setpfc = qed_dcbnl_ieee_setpfc, 2391a1d8d8a5SSudarsana Reddy Kalluru .ieee_getets = qed_dcbnl_ieee_getets, 2392a1d8d8a5SSudarsana Reddy Kalluru .ieee_setets = qed_dcbnl_ieee_setets, 2393a1d8d8a5SSudarsana Reddy Kalluru .ieee_peer_getpfc = qed_dcbnl_ieee_peer_getpfc, 2394a1d8d8a5SSudarsana Reddy Kalluru .ieee_peer_getets = qed_dcbnl_ieee_peer_getets, 2395a1d8d8a5SSudarsana Reddy Kalluru .ieee_getapp = qed_dcbnl_ieee_getapp, 2396a1d8d8a5SSudarsana Reddy Kalluru .ieee_setapp = qed_dcbnl_ieee_setapp, 2397a1d8d8a5SSudarsana Reddy Kalluru }; 2398a1d8d8a5SSudarsana Reddy Kalluru 23996ad8c632SSudarsana Reddy Kalluru #endif 2400