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" 47b71b9afdSKalderon, Michal #include "qed_rdma.h" 48a1d8d8a5SSudarsana Reddy Kalluru #ifdef CONFIG_DCB 49a1d8d8a5SSudarsana Reddy Kalluru #include <linux/qed/qed_eth_if.h> 50a1d8d8a5SSudarsana Reddy Kalluru #endif 5139651abdSSudarsana Reddy Kalluru 5239651abdSSudarsana Reddy Kalluru #define QED_DCBX_MAX_MIB_READ_TRY (100) 5339651abdSSudarsana Reddy Kalluru #define QED_ETH_TYPE_DEFAULT (0) 5439651abdSSudarsana Reddy Kalluru #define QED_ETH_TYPE_ROCE (0x8915) 5539651abdSSudarsana Reddy Kalluru #define QED_UDP_PORT_TYPE_ROCE_V2 (0x12B7) 5639651abdSSudarsana Reddy Kalluru #define QED_ETH_TYPE_FCOE (0x8906) 5739651abdSSudarsana Reddy Kalluru #define QED_TCP_PORT_ISCSI (0xCBC) 5839651abdSSudarsana Reddy Kalluru 5939651abdSSudarsana Reddy Kalluru #define QED_DCBX_INVALID_PRIORITY 0xFF 6039651abdSSudarsana Reddy Kalluru 6139651abdSSudarsana Reddy Kalluru /* Get Traffic Class from priority traffic class table, 4 bits represent 6239651abdSSudarsana Reddy Kalluru * the traffic class corresponding to the priority. 6339651abdSSudarsana Reddy Kalluru */ 6439651abdSSudarsana Reddy Kalluru #define QED_DCBX_PRIO2TC(prio_tc_tbl, prio) \ 6539651abdSSudarsana Reddy Kalluru ((u32)(prio_tc_tbl >> ((7 - prio) * 4)) & 0x7) 6639651abdSSudarsana Reddy Kalluru 6739651abdSSudarsana Reddy Kalluru static const struct qed_dcbx_app_metadata qed_dcbx_app_update[] = { 68c8fcd133Ssudarsana.kalluru@cavium.com {DCBX_PROTOCOL_ISCSI, "ISCSI", QED_PCI_ISCSI}, 69c8fcd133Ssudarsana.kalluru@cavium.com {DCBX_PROTOCOL_FCOE, "FCOE", QED_PCI_FCOE}, 70c8fcd133Ssudarsana.kalluru@cavium.com {DCBX_PROTOCOL_ROCE, "ROCE", QED_PCI_ETH_ROCE}, 71c8fcd133Ssudarsana.kalluru@cavium.com {DCBX_PROTOCOL_ROCE_V2, "ROCE_V2", QED_PCI_ETH_ROCE}, 72c8fcd133Ssudarsana.kalluru@cavium.com {DCBX_PROTOCOL_ETH, "ETH", QED_PCI_ETH}, 7339651abdSSudarsana Reddy Kalluru }; 7439651abdSSudarsana Reddy Kalluru 7539651abdSSudarsana Reddy Kalluru static bool qed_dcbx_app_ethtype(u32 app_info_bitmap) 7639651abdSSudarsana Reddy Kalluru { 7739651abdSSudarsana Reddy Kalluru return !!(QED_MFW_GET_FIELD(app_info_bitmap, DCBX_APP_SF) == 7839651abdSSudarsana Reddy Kalluru DCBX_APP_SF_ETHTYPE); 7939651abdSSudarsana Reddy Kalluru } 8039651abdSSudarsana Reddy Kalluru 81fb9ea8a9SSudarsana Reddy Kalluru static bool qed_dcbx_ieee_app_ethtype(u32 app_info_bitmap) 82fb9ea8a9SSudarsana Reddy Kalluru { 83fb9ea8a9SSudarsana Reddy Kalluru u8 mfw_val = QED_MFW_GET_FIELD(app_info_bitmap, DCBX_APP_SF_IEEE); 84fb9ea8a9SSudarsana Reddy Kalluru 85fb9ea8a9SSudarsana Reddy Kalluru /* Old MFW */ 86fb9ea8a9SSudarsana Reddy Kalluru if (mfw_val == DCBX_APP_SF_IEEE_RESERVED) 87fb9ea8a9SSudarsana Reddy Kalluru return qed_dcbx_app_ethtype(app_info_bitmap); 88fb9ea8a9SSudarsana Reddy Kalluru 89fb9ea8a9SSudarsana Reddy Kalluru return !!(mfw_val == DCBX_APP_SF_IEEE_ETHTYPE); 90fb9ea8a9SSudarsana Reddy Kalluru } 91fb9ea8a9SSudarsana Reddy Kalluru 9239651abdSSudarsana Reddy Kalluru static bool qed_dcbx_app_port(u32 app_info_bitmap) 9339651abdSSudarsana Reddy Kalluru { 9439651abdSSudarsana Reddy Kalluru return !!(QED_MFW_GET_FIELD(app_info_bitmap, DCBX_APP_SF) == 9539651abdSSudarsana Reddy Kalluru DCBX_APP_SF_PORT); 9639651abdSSudarsana Reddy Kalluru } 9739651abdSSudarsana Reddy Kalluru 9859bcb797SSudarsana Reddy Kalluru static bool qed_dcbx_ieee_app_port(u32 app_info_bitmap, u8 type) 9939651abdSSudarsana Reddy Kalluru { 10059bcb797SSudarsana Reddy Kalluru u8 mfw_val = QED_MFW_GET_FIELD(app_info_bitmap, DCBX_APP_SF_IEEE); 10159bcb797SSudarsana Reddy Kalluru 10259bcb797SSudarsana Reddy Kalluru /* Old MFW */ 10359bcb797SSudarsana Reddy Kalluru if (mfw_val == DCBX_APP_SF_IEEE_RESERVED) 10459bcb797SSudarsana Reddy Kalluru return qed_dcbx_app_port(app_info_bitmap); 10559bcb797SSudarsana Reddy Kalluru 10659bcb797SSudarsana Reddy Kalluru return !!(mfw_val == type || mfw_val == DCBX_APP_SF_IEEE_TCP_UDP_PORT); 10739651abdSSudarsana Reddy Kalluru } 10839651abdSSudarsana Reddy Kalluru 109fb9ea8a9SSudarsana Reddy Kalluru static bool qed_dcbx_default_tlv(u32 app_info_bitmap, u16 proto_id, bool ieee) 11039651abdSSudarsana Reddy Kalluru { 111fb9ea8a9SSudarsana Reddy Kalluru bool ethtype; 112fb9ea8a9SSudarsana Reddy Kalluru 113fb9ea8a9SSudarsana Reddy Kalluru if (ieee) 114fb9ea8a9SSudarsana Reddy Kalluru ethtype = qed_dcbx_ieee_app_ethtype(app_info_bitmap); 115fb9ea8a9SSudarsana Reddy Kalluru else 116fb9ea8a9SSudarsana Reddy Kalluru ethtype = qed_dcbx_app_ethtype(app_info_bitmap); 117fb9ea8a9SSudarsana Reddy Kalluru 118fb9ea8a9SSudarsana Reddy Kalluru return !!(ethtype && (proto_id == QED_ETH_TYPE_DEFAULT)); 11939651abdSSudarsana Reddy Kalluru } 12039651abdSSudarsana Reddy Kalluru 12159bcb797SSudarsana Reddy Kalluru static bool qed_dcbx_iscsi_tlv(u32 app_info_bitmap, u16 proto_id, bool ieee) 12239651abdSSudarsana Reddy Kalluru { 12359bcb797SSudarsana Reddy Kalluru bool port; 12459bcb797SSudarsana Reddy Kalluru 12559bcb797SSudarsana Reddy Kalluru if (ieee) 12659bcb797SSudarsana Reddy Kalluru port = qed_dcbx_ieee_app_port(app_info_bitmap, 12759bcb797SSudarsana Reddy Kalluru DCBX_APP_SF_IEEE_TCP_PORT); 12859bcb797SSudarsana Reddy Kalluru else 12959bcb797SSudarsana Reddy Kalluru port = qed_dcbx_app_port(app_info_bitmap); 13059bcb797SSudarsana Reddy Kalluru 13159bcb797SSudarsana Reddy Kalluru return !!(port && (proto_id == QED_TCP_PORT_ISCSI)); 13239651abdSSudarsana Reddy Kalluru } 13339651abdSSudarsana Reddy Kalluru 134fb9ea8a9SSudarsana Reddy Kalluru static bool qed_dcbx_fcoe_tlv(u32 app_info_bitmap, u16 proto_id, bool ieee) 13539651abdSSudarsana Reddy Kalluru { 136fb9ea8a9SSudarsana Reddy Kalluru bool ethtype; 137fb9ea8a9SSudarsana Reddy Kalluru 138fb9ea8a9SSudarsana Reddy Kalluru if (ieee) 139fb9ea8a9SSudarsana Reddy Kalluru ethtype = qed_dcbx_ieee_app_ethtype(app_info_bitmap); 140fb9ea8a9SSudarsana Reddy Kalluru else 141fb9ea8a9SSudarsana Reddy Kalluru ethtype = qed_dcbx_app_ethtype(app_info_bitmap); 142fb9ea8a9SSudarsana Reddy Kalluru 143fb9ea8a9SSudarsana Reddy Kalluru return !!(ethtype && (proto_id == QED_ETH_TYPE_FCOE)); 14439651abdSSudarsana Reddy Kalluru } 14539651abdSSudarsana Reddy Kalluru 146fb9ea8a9SSudarsana Reddy Kalluru static bool qed_dcbx_roce_tlv(u32 app_info_bitmap, u16 proto_id, bool ieee) 14739651abdSSudarsana Reddy Kalluru { 148fb9ea8a9SSudarsana Reddy Kalluru bool ethtype; 149fb9ea8a9SSudarsana Reddy Kalluru 150fb9ea8a9SSudarsana Reddy Kalluru if (ieee) 151fb9ea8a9SSudarsana Reddy Kalluru ethtype = qed_dcbx_ieee_app_ethtype(app_info_bitmap); 152fb9ea8a9SSudarsana Reddy Kalluru else 153fb9ea8a9SSudarsana Reddy Kalluru ethtype = qed_dcbx_app_ethtype(app_info_bitmap); 154fb9ea8a9SSudarsana Reddy Kalluru 155fb9ea8a9SSudarsana Reddy Kalluru return !!(ethtype && (proto_id == QED_ETH_TYPE_ROCE)); 15639651abdSSudarsana Reddy Kalluru } 15739651abdSSudarsana Reddy Kalluru 15859bcb797SSudarsana Reddy Kalluru static bool qed_dcbx_roce_v2_tlv(u32 app_info_bitmap, u16 proto_id, bool ieee) 15939651abdSSudarsana Reddy Kalluru { 16059bcb797SSudarsana Reddy Kalluru bool port; 16159bcb797SSudarsana Reddy Kalluru 16259bcb797SSudarsana Reddy Kalluru if (ieee) 16359bcb797SSudarsana Reddy Kalluru port = qed_dcbx_ieee_app_port(app_info_bitmap, 16459bcb797SSudarsana Reddy Kalluru DCBX_APP_SF_IEEE_UDP_PORT); 16559bcb797SSudarsana Reddy Kalluru else 16659bcb797SSudarsana Reddy Kalluru port = qed_dcbx_app_port(app_info_bitmap); 16759bcb797SSudarsana Reddy Kalluru 16859bcb797SSudarsana Reddy Kalluru return !!(port && (proto_id == QED_UDP_PORT_TYPE_ROCE_V2)); 16939651abdSSudarsana Reddy Kalluru } 17039651abdSSudarsana Reddy Kalluru 17139651abdSSudarsana Reddy Kalluru static void 17239651abdSSudarsana Reddy Kalluru qed_dcbx_dp_protocol(struct qed_hwfn *p_hwfn, struct qed_dcbx_results *p_data) 17339651abdSSudarsana Reddy Kalluru { 17439651abdSSudarsana Reddy Kalluru enum dcbx_protocol_type id; 17539651abdSSudarsana Reddy Kalluru int i; 17639651abdSSudarsana Reddy Kalluru 17739651abdSSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, "DCBX negotiated: %d\n", 17839651abdSSudarsana Reddy Kalluru p_data->dcbx_enabled); 17939651abdSSudarsana Reddy Kalluru 18039651abdSSudarsana Reddy Kalluru for (i = 0; i < ARRAY_SIZE(qed_dcbx_app_update); i++) { 18139651abdSSudarsana Reddy Kalluru id = qed_dcbx_app_update[i].id; 18239651abdSSudarsana Reddy Kalluru 18339651abdSSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, 18439651abdSSudarsana Reddy Kalluru "%s info: update %d, enable %d, prio %d, tc %d, num_tc %d\n", 18539651abdSSudarsana Reddy Kalluru qed_dcbx_app_update[i].name, p_data->arr[id].update, 18639651abdSSudarsana Reddy Kalluru p_data->arr[id].enable, p_data->arr[id].priority, 187b5a9ee7cSAriel Elior p_data->arr[id].tc, p_hwfn->hw_info.num_active_tc); 18839651abdSSudarsana Reddy Kalluru } 18939651abdSSudarsana Reddy Kalluru } 19039651abdSSudarsana Reddy Kalluru 19139651abdSSudarsana Reddy Kalluru static void 19239651abdSSudarsana Reddy Kalluru qed_dcbx_set_params(struct qed_dcbx_results *p_data, 19339651abdSSudarsana Reddy Kalluru struct qed_hw_info *p_info, 19439651abdSSudarsana Reddy Kalluru bool enable, 19539651abdSSudarsana Reddy Kalluru u8 prio, 19639651abdSSudarsana Reddy Kalluru u8 tc, 19739651abdSSudarsana Reddy Kalluru enum dcbx_protocol_type type, 19839651abdSSudarsana Reddy Kalluru enum qed_pci_personality personality) 19939651abdSSudarsana Reddy Kalluru { 20039651abdSSudarsana Reddy Kalluru /* PF update ramrod data */ 20139651abdSSudarsana Reddy Kalluru p_data->arr[type].enable = enable; 20239651abdSSudarsana Reddy Kalluru p_data->arr[type].priority = prio; 20339651abdSSudarsana Reddy Kalluru p_data->arr[type].tc = tc; 204dfc268f6SSudarsana Reddy Kalluru if (enable) 205dfc268f6SSudarsana Reddy Kalluru p_data->arr[type].update = UPDATE_DCB; 206dfc268f6SSudarsana Reddy Kalluru else 207dfc268f6SSudarsana Reddy Kalluru p_data->arr[type].update = DONT_UPDATE_DCB_DSCP; 20839651abdSSudarsana Reddy Kalluru 20939651abdSSudarsana Reddy Kalluru /* QM reconf data */ 210b5a9ee7cSAriel Elior if (p_info->personality == personality) 211c4259ddaSDenis Bolotin qed_hw_info_set_offload_tc(p_info, tc); 21239651abdSSudarsana Reddy Kalluru } 21339651abdSSudarsana Reddy Kalluru 21439651abdSSudarsana Reddy Kalluru /* Update app protocol data and hw_info fields with the TLV info */ 21539651abdSSudarsana Reddy Kalluru static void 21639651abdSSudarsana Reddy Kalluru qed_dcbx_update_app_info(struct qed_dcbx_results *p_data, 21739651abdSSudarsana Reddy Kalluru struct qed_hwfn *p_hwfn, 21839651abdSSudarsana Reddy Kalluru bool enable, 21939651abdSSudarsana Reddy Kalluru u8 prio, u8 tc, enum dcbx_protocol_type type) 22039651abdSSudarsana Reddy Kalluru { 22139651abdSSudarsana Reddy Kalluru struct qed_hw_info *p_info = &p_hwfn->hw_info; 22239651abdSSudarsana Reddy Kalluru enum qed_pci_personality personality; 22339651abdSSudarsana Reddy Kalluru enum dcbx_protocol_type id; 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 234dfc268f6SSudarsana Reddy Kalluru qed_dcbx_set_params(p_data, p_info, enable, 23539651abdSSudarsana Reddy Kalluru prio, tc, type, personality); 23639651abdSSudarsana Reddy Kalluru } 23739651abdSSudarsana Reddy Kalluru } 23839651abdSSudarsana Reddy Kalluru 23939651abdSSudarsana Reddy Kalluru static bool 24039651abdSSudarsana Reddy Kalluru qed_dcbx_get_app_protocol_type(struct qed_hwfn *p_hwfn, 24139651abdSSudarsana Reddy Kalluru u32 app_prio_bitmap, 242fb9ea8a9SSudarsana Reddy Kalluru u16 id, enum dcbx_protocol_type *type, bool ieee) 24339651abdSSudarsana Reddy Kalluru { 244fb9ea8a9SSudarsana Reddy Kalluru if (qed_dcbx_fcoe_tlv(app_prio_bitmap, id, ieee)) { 24539651abdSSudarsana Reddy Kalluru *type = DCBX_PROTOCOL_FCOE; 246fb9ea8a9SSudarsana Reddy Kalluru } else if (qed_dcbx_roce_tlv(app_prio_bitmap, id, ieee)) { 24739651abdSSudarsana Reddy Kalluru *type = DCBX_PROTOCOL_ROCE; 24859bcb797SSudarsana Reddy Kalluru } else if (qed_dcbx_iscsi_tlv(app_prio_bitmap, id, ieee)) { 24939651abdSSudarsana Reddy Kalluru *type = DCBX_PROTOCOL_ISCSI; 250fb9ea8a9SSudarsana Reddy Kalluru } else if (qed_dcbx_default_tlv(app_prio_bitmap, id, ieee)) { 25139651abdSSudarsana Reddy Kalluru *type = DCBX_PROTOCOL_ETH; 25259bcb797SSudarsana Reddy Kalluru } else if (qed_dcbx_roce_v2_tlv(app_prio_bitmap, id, ieee)) { 25339651abdSSudarsana Reddy Kalluru *type = DCBX_PROTOCOL_ROCE_V2; 25439651abdSSudarsana Reddy Kalluru } else { 25539651abdSSudarsana Reddy Kalluru *type = DCBX_MAX_PROTOCOL_TYPE; 256c8b79566SSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, 257c8b79566SSudarsana Reddy Kalluru "No action required, App TLV entry = 0x%x\n", 258ff54d5cdSSudarsana Reddy Kalluru app_prio_bitmap); 25939651abdSSudarsana Reddy Kalluru return false; 26039651abdSSudarsana Reddy Kalluru } 26139651abdSSudarsana Reddy Kalluru 26239651abdSSudarsana Reddy Kalluru return true; 26339651abdSSudarsana Reddy Kalluru } 26439651abdSSudarsana Reddy Kalluru 26539651abdSSudarsana Reddy Kalluru /* Parse app TLV's to update TC information in hw_info structure for 26639651abdSSudarsana Reddy Kalluru * reconfiguring QM. Get protocol specific data for PF update ramrod command. 26739651abdSSudarsana Reddy Kalluru */ 26839651abdSSudarsana Reddy Kalluru static int 26939651abdSSudarsana Reddy Kalluru qed_dcbx_process_tlv(struct qed_hwfn *p_hwfn, 27039651abdSSudarsana Reddy Kalluru struct qed_dcbx_results *p_data, 27139651abdSSudarsana Reddy Kalluru struct dcbx_app_priority_entry *p_tbl, 272fb9ea8a9SSudarsana Reddy Kalluru u32 pri_tc_tbl, int count, u8 dcbx_version) 27339651abdSSudarsana Reddy Kalluru { 27439651abdSSudarsana Reddy Kalluru enum dcbx_protocol_type type; 275cac6f691SSudarsana Reddy Kalluru bool enable, ieee, eth_tlv; 276270837b3Ssudarsana.kalluru@cavium.com u8 tc, priority_map; 27739651abdSSudarsana Reddy Kalluru u16 protocol_id; 27854b9430fSDan Carpenter int priority; 27939651abdSSudarsana Reddy Kalluru int i; 28039651abdSSudarsana Reddy Kalluru 28139651abdSSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, "Num APP entries = %d\n", count); 28239651abdSSudarsana Reddy Kalluru 283fb9ea8a9SSudarsana Reddy Kalluru ieee = (dcbx_version == DCBX_CONFIG_VERSION_IEEE); 284cac6f691SSudarsana Reddy Kalluru eth_tlv = false; 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 */ 306cac6f691SSudarsana Reddy Kalluru if (type == DCBX_PROTOCOL_ETH) { 307cac6f691SSudarsana Reddy Kalluru enable = false; 308cac6f691SSudarsana Reddy Kalluru eth_tlv = true; 309cac6f691SSudarsana Reddy Kalluru } else { 310cac6f691SSudarsana Reddy Kalluru enable = true; 311cac6f691SSudarsana Reddy Kalluru } 31239651abdSSudarsana Reddy Kalluru 313dfc268f6SSudarsana Reddy Kalluru qed_dcbx_update_app_info(p_data, p_hwfn, enable, 31439651abdSSudarsana Reddy Kalluru priority, tc, type); 31539651abdSSudarsana Reddy Kalluru } 31639651abdSSudarsana Reddy Kalluru } 31739651abdSSudarsana Reddy Kalluru 318cac6f691SSudarsana Reddy Kalluru /* If Eth TLV is not detected, use UFP TC as default TC */ 319cac6f691SSudarsana Reddy Kalluru if (test_bit(QED_MF_UFP_SPECIFIC, &p_hwfn->cdev->mf_bits) && !eth_tlv) 320cac6f691SSudarsana Reddy Kalluru p_data->arr[DCBX_PROTOCOL_ETH].tc = p_hwfn->ufp_info.tc; 321cac6f691SSudarsana Reddy Kalluru 32239651abdSSudarsana Reddy Kalluru /* Update ramrod protocol data and hw_info fields 32339651abdSSudarsana Reddy Kalluru * with default info when corresponding APP TLV's are not detected. 32439651abdSSudarsana Reddy Kalluru * The enabled field has a different logic for ethernet as only for 32539651abdSSudarsana Reddy Kalluru * ethernet dcb should disabled by default, as the information arrives 32639651abdSSudarsana Reddy Kalluru * from the OS (unless an explicit app tlv was present). 32739651abdSSudarsana Reddy Kalluru */ 32839651abdSSudarsana Reddy Kalluru tc = p_data->arr[DCBX_PROTOCOL_ETH].tc; 32939651abdSSudarsana Reddy Kalluru priority = p_data->arr[DCBX_PROTOCOL_ETH].priority; 33039651abdSSudarsana Reddy Kalluru for (type = 0; type < DCBX_MAX_PROTOCOL_TYPE; type++) { 33139651abdSSudarsana Reddy Kalluru if (p_data->arr[type].update) 33239651abdSSudarsana Reddy Kalluru continue; 33339651abdSSudarsana Reddy Kalluru 334dfc268f6SSudarsana Reddy Kalluru enable = (type == DCBX_PROTOCOL_ETH) ? false : !!dcbx_version; 335dfc268f6SSudarsana Reddy Kalluru qed_dcbx_update_app_info(p_data, p_hwfn, enable, 33639651abdSSudarsana Reddy Kalluru priority, tc, type); 33739651abdSSudarsana Reddy Kalluru } 33839651abdSSudarsana Reddy Kalluru 33939651abdSSudarsana Reddy Kalluru return 0; 34039651abdSSudarsana Reddy Kalluru } 34139651abdSSudarsana Reddy Kalluru 34239651abdSSudarsana Reddy Kalluru /* Parse app TLV's to update TC information in hw_info structure for 34339651abdSSudarsana Reddy Kalluru * reconfiguring QM. Get protocol specific data for PF update ramrod command. 34439651abdSSudarsana Reddy Kalluru */ 34539651abdSSudarsana Reddy Kalluru static int qed_dcbx_process_mib_info(struct qed_hwfn *p_hwfn) 34639651abdSSudarsana Reddy Kalluru { 34739651abdSSudarsana Reddy Kalluru struct dcbx_app_priority_feature *p_app; 34839651abdSSudarsana Reddy Kalluru struct dcbx_app_priority_entry *p_tbl; 34939651abdSSudarsana Reddy Kalluru struct qed_dcbx_results data = { 0 }; 35039651abdSSudarsana Reddy Kalluru struct dcbx_ets_feature *p_ets; 35139651abdSSudarsana Reddy Kalluru struct qed_hw_info *p_info; 35239651abdSSudarsana Reddy Kalluru u32 pri_tc_tbl, flags; 353fb9ea8a9SSudarsana Reddy Kalluru u8 dcbx_version; 35439651abdSSudarsana Reddy Kalluru int num_entries; 35539651abdSSudarsana Reddy Kalluru int rc = 0; 35639651abdSSudarsana Reddy Kalluru 35739651abdSSudarsana Reddy Kalluru flags = p_hwfn->p_dcbx_info->operational.flags; 358fb9ea8a9SSudarsana Reddy Kalluru dcbx_version = QED_MFW_GET_FIELD(flags, DCBX_CONFIG_VERSION); 35939651abdSSudarsana Reddy Kalluru 36039651abdSSudarsana Reddy Kalluru p_app = &p_hwfn->p_dcbx_info->operational.features.app; 36139651abdSSudarsana Reddy Kalluru p_tbl = p_app->app_pri_tbl; 36239651abdSSudarsana Reddy Kalluru 36339651abdSSudarsana Reddy Kalluru p_ets = &p_hwfn->p_dcbx_info->operational.features.ets; 36439651abdSSudarsana Reddy Kalluru pri_tc_tbl = p_ets->pri_tc_tbl[0]; 36539651abdSSudarsana Reddy Kalluru 36639651abdSSudarsana Reddy Kalluru p_info = &p_hwfn->hw_info; 36739651abdSSudarsana Reddy Kalluru num_entries = QED_MFW_GET_FIELD(p_app->flags, DCBX_APP_NUM_ENTRIES); 36839651abdSSudarsana Reddy Kalluru 36939651abdSSudarsana Reddy Kalluru rc = qed_dcbx_process_tlv(p_hwfn, &data, p_tbl, pri_tc_tbl, 370fb9ea8a9SSudarsana Reddy Kalluru num_entries, dcbx_version); 37139651abdSSudarsana Reddy Kalluru if (rc) 37239651abdSSudarsana Reddy Kalluru return rc; 37339651abdSSudarsana Reddy Kalluru 374b5a9ee7cSAriel Elior p_info->num_active_tc = QED_MFW_GET_FIELD(p_ets->flags, 375b5a9ee7cSAriel Elior DCBX_ETS_MAX_TCS); 376b5a9ee7cSAriel Elior p_hwfn->qm_info.ooo_tc = QED_MFW_GET_FIELD(p_ets->flags, DCBX_OOO_TC); 37739651abdSSudarsana Reddy Kalluru data.pf_id = p_hwfn->rel_pf_id; 378fb9ea8a9SSudarsana Reddy Kalluru data.dcbx_enabled = !!dcbx_version; 37939651abdSSudarsana Reddy Kalluru 38039651abdSSudarsana Reddy Kalluru qed_dcbx_dp_protocol(p_hwfn, &data); 38139651abdSSudarsana Reddy Kalluru 38239651abdSSudarsana Reddy Kalluru memcpy(&p_hwfn->p_dcbx_info->results, &data, 38339651abdSSudarsana Reddy Kalluru sizeof(struct qed_dcbx_results)); 38439651abdSSudarsana Reddy Kalluru 38539651abdSSudarsana Reddy Kalluru return 0; 38639651abdSSudarsana Reddy Kalluru } 38739651abdSSudarsana Reddy Kalluru 38839651abdSSudarsana Reddy Kalluru static int 38939651abdSSudarsana Reddy Kalluru qed_dcbx_copy_mib(struct qed_hwfn *p_hwfn, 39039651abdSSudarsana Reddy Kalluru struct qed_ptt *p_ptt, 39139651abdSSudarsana Reddy Kalluru struct qed_dcbx_mib_meta_data *p_data, 39239651abdSSudarsana Reddy Kalluru enum qed_mib_read_type type) 39339651abdSSudarsana Reddy Kalluru { 39439651abdSSudarsana Reddy Kalluru u32 prefix_seq_num, suffix_seq_num; 39539651abdSSudarsana Reddy Kalluru int read_count = 0; 39639651abdSSudarsana Reddy Kalluru int rc = 0; 39739651abdSSudarsana Reddy Kalluru 39839651abdSSudarsana Reddy Kalluru /* The data is considered to be valid only if both sequence numbers are 39939651abdSSudarsana Reddy Kalluru * the same. 40039651abdSSudarsana Reddy Kalluru */ 40139651abdSSudarsana Reddy Kalluru do { 40239651abdSSudarsana Reddy Kalluru if (type == QED_DCBX_REMOTE_LLDP_MIB) { 40339651abdSSudarsana Reddy Kalluru qed_memcpy_from(p_hwfn, p_ptt, p_data->lldp_remote, 40439651abdSSudarsana Reddy Kalluru p_data->addr, p_data->size); 40539651abdSSudarsana Reddy Kalluru prefix_seq_num = p_data->lldp_remote->prefix_seq_num; 40639651abdSSudarsana Reddy Kalluru suffix_seq_num = p_data->lldp_remote->suffix_seq_num; 40739651abdSSudarsana Reddy Kalluru } else { 40839651abdSSudarsana Reddy Kalluru qed_memcpy_from(p_hwfn, p_ptt, p_data->mib, 40939651abdSSudarsana Reddy Kalluru p_data->addr, p_data->size); 41039651abdSSudarsana Reddy Kalluru prefix_seq_num = p_data->mib->prefix_seq_num; 41139651abdSSudarsana Reddy Kalluru suffix_seq_num = p_data->mib->suffix_seq_num; 41239651abdSSudarsana Reddy Kalluru } 41339651abdSSudarsana Reddy Kalluru read_count++; 41439651abdSSudarsana Reddy Kalluru 41539651abdSSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, 41639651abdSSudarsana Reddy Kalluru QED_MSG_DCB, 41739651abdSSudarsana Reddy Kalluru "mib type = %d, try count = %d prefix seq num = %d suffix seq num = %d\n", 41839651abdSSudarsana Reddy Kalluru type, read_count, prefix_seq_num, suffix_seq_num); 41939651abdSSudarsana Reddy Kalluru } while ((prefix_seq_num != suffix_seq_num) && 42039651abdSSudarsana Reddy Kalluru (read_count < QED_DCBX_MAX_MIB_READ_TRY)); 42139651abdSSudarsana Reddy Kalluru 42239651abdSSudarsana Reddy Kalluru if (read_count >= QED_DCBX_MAX_MIB_READ_TRY) { 42339651abdSSudarsana Reddy Kalluru DP_ERR(p_hwfn, 42439651abdSSudarsana Reddy Kalluru "MIB read err, mib type = %d, try count = %d prefix seq num = %d suffix seq num = %d\n", 42539651abdSSudarsana Reddy Kalluru type, read_count, prefix_seq_num, suffix_seq_num); 42639651abdSSudarsana Reddy Kalluru rc = -EIO; 42739651abdSSudarsana Reddy Kalluru } 42839651abdSSudarsana Reddy Kalluru 42939651abdSSudarsana Reddy Kalluru return rc; 43039651abdSSudarsana Reddy Kalluru } 43139651abdSSudarsana Reddy Kalluru 4326ad8c632SSudarsana Reddy Kalluru static void 4336ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_priority_info(struct qed_hwfn *p_hwfn, 4346ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_app_prio *p_prio, 4356ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_results *p_results) 4366ad8c632SSudarsana Reddy Kalluru { 4376ad8c632SSudarsana Reddy Kalluru u8 val; 4386ad8c632SSudarsana Reddy Kalluru 4396ad8c632SSudarsana Reddy Kalluru p_prio->roce = QED_DCBX_INVALID_PRIORITY; 4406ad8c632SSudarsana Reddy Kalluru p_prio->roce_v2 = QED_DCBX_INVALID_PRIORITY; 4416ad8c632SSudarsana Reddy Kalluru p_prio->iscsi = QED_DCBX_INVALID_PRIORITY; 4426ad8c632SSudarsana Reddy Kalluru p_prio->fcoe = QED_DCBX_INVALID_PRIORITY; 4436ad8c632SSudarsana Reddy Kalluru 4446ad8c632SSudarsana Reddy Kalluru if (p_results->arr[DCBX_PROTOCOL_ROCE].update && 4456ad8c632SSudarsana Reddy Kalluru p_results->arr[DCBX_PROTOCOL_ROCE].enable) 4466ad8c632SSudarsana Reddy Kalluru p_prio->roce = p_results->arr[DCBX_PROTOCOL_ROCE].priority; 4476ad8c632SSudarsana Reddy Kalluru 4486ad8c632SSudarsana Reddy Kalluru if (p_results->arr[DCBX_PROTOCOL_ROCE_V2].update && 4496ad8c632SSudarsana Reddy Kalluru p_results->arr[DCBX_PROTOCOL_ROCE_V2].enable) { 4506ad8c632SSudarsana Reddy Kalluru val = p_results->arr[DCBX_PROTOCOL_ROCE_V2].priority; 4516ad8c632SSudarsana Reddy Kalluru p_prio->roce_v2 = val; 4526ad8c632SSudarsana Reddy Kalluru } 4536ad8c632SSudarsana Reddy Kalluru 4546ad8c632SSudarsana Reddy Kalluru if (p_results->arr[DCBX_PROTOCOL_ISCSI].update && 4556ad8c632SSudarsana Reddy Kalluru p_results->arr[DCBX_PROTOCOL_ISCSI].enable) 4566ad8c632SSudarsana Reddy Kalluru p_prio->iscsi = p_results->arr[DCBX_PROTOCOL_ISCSI].priority; 4576ad8c632SSudarsana Reddy Kalluru 4586ad8c632SSudarsana Reddy Kalluru if (p_results->arr[DCBX_PROTOCOL_FCOE].update && 4596ad8c632SSudarsana Reddy Kalluru p_results->arr[DCBX_PROTOCOL_FCOE].enable) 4606ad8c632SSudarsana Reddy Kalluru p_prio->fcoe = p_results->arr[DCBX_PROTOCOL_FCOE].priority; 4616ad8c632SSudarsana Reddy Kalluru 4626ad8c632SSudarsana Reddy Kalluru if (p_results->arr[DCBX_PROTOCOL_ETH].update && 4636ad8c632SSudarsana Reddy Kalluru p_results->arr[DCBX_PROTOCOL_ETH].enable) 4646ad8c632SSudarsana Reddy Kalluru p_prio->eth = p_results->arr[DCBX_PROTOCOL_ETH].priority; 4656ad8c632SSudarsana Reddy Kalluru 4666ad8c632SSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, 4676ad8c632SSudarsana Reddy Kalluru "Priorities: iscsi %d, roce %d, roce v2 %d, fcoe %d, eth %d\n", 4686ad8c632SSudarsana Reddy Kalluru p_prio->iscsi, p_prio->roce, p_prio->roce_v2, p_prio->fcoe, 4696ad8c632SSudarsana Reddy Kalluru p_prio->eth); 4706ad8c632SSudarsana Reddy Kalluru } 4716ad8c632SSudarsana Reddy Kalluru 4726ad8c632SSudarsana Reddy Kalluru static void 4736ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_app_data(struct qed_hwfn *p_hwfn, 4746ad8c632SSudarsana Reddy Kalluru struct dcbx_app_priority_feature *p_app, 4756ad8c632SSudarsana Reddy Kalluru struct dcbx_app_priority_entry *p_tbl, 476fb9ea8a9SSudarsana Reddy Kalluru struct qed_dcbx_params *p_params, bool ieee) 4776ad8c632SSudarsana Reddy Kalluru { 4786ad8c632SSudarsana Reddy Kalluru struct qed_app_entry *entry; 4796ad8c632SSudarsana Reddy Kalluru u8 pri_map; 4806ad8c632SSudarsana Reddy Kalluru int i; 4816ad8c632SSudarsana Reddy Kalluru 4826ad8c632SSudarsana Reddy Kalluru p_params->app_willing = QED_MFW_GET_FIELD(p_app->flags, 4836ad8c632SSudarsana Reddy Kalluru DCBX_APP_WILLING); 4846ad8c632SSudarsana Reddy Kalluru p_params->app_valid = QED_MFW_GET_FIELD(p_app->flags, DCBX_APP_ENABLED); 4856ad8c632SSudarsana Reddy Kalluru p_params->app_error = QED_MFW_GET_FIELD(p_app->flags, DCBX_APP_ERROR); 4866ad8c632SSudarsana Reddy Kalluru p_params->num_app_entries = QED_MFW_GET_FIELD(p_app->flags, 4876ad8c632SSudarsana Reddy Kalluru DCBX_APP_NUM_ENTRIES); 4886ad8c632SSudarsana Reddy Kalluru for (i = 0; i < DCBX_MAX_APP_PROTOCOL; i++) { 4896ad8c632SSudarsana Reddy Kalluru entry = &p_params->app_entry[i]; 49059bcb797SSudarsana Reddy Kalluru if (ieee) { 49159bcb797SSudarsana Reddy Kalluru u8 sf_ieee; 49259bcb797SSudarsana Reddy Kalluru u32 val; 49359bcb797SSudarsana Reddy Kalluru 49459bcb797SSudarsana Reddy Kalluru sf_ieee = QED_MFW_GET_FIELD(p_tbl[i].entry, 49559bcb797SSudarsana Reddy Kalluru DCBX_APP_SF_IEEE); 49659bcb797SSudarsana Reddy Kalluru switch (sf_ieee) { 49759bcb797SSudarsana Reddy Kalluru case DCBX_APP_SF_IEEE_RESERVED: 49859bcb797SSudarsana Reddy Kalluru /* Old MFW */ 49959bcb797SSudarsana Reddy Kalluru val = QED_MFW_GET_FIELD(p_tbl[i].entry, 50059bcb797SSudarsana Reddy Kalluru DCBX_APP_SF); 50159bcb797SSudarsana Reddy Kalluru entry->sf_ieee = val ? 50259bcb797SSudarsana Reddy Kalluru QED_DCBX_SF_IEEE_TCP_UDP_PORT : 50359bcb797SSudarsana Reddy Kalluru QED_DCBX_SF_IEEE_ETHTYPE; 50459bcb797SSudarsana Reddy Kalluru break; 50559bcb797SSudarsana Reddy Kalluru case DCBX_APP_SF_IEEE_ETHTYPE: 50659bcb797SSudarsana Reddy Kalluru entry->sf_ieee = QED_DCBX_SF_IEEE_ETHTYPE; 50759bcb797SSudarsana Reddy Kalluru break; 50859bcb797SSudarsana Reddy Kalluru case DCBX_APP_SF_IEEE_TCP_PORT: 50959bcb797SSudarsana Reddy Kalluru entry->sf_ieee = QED_DCBX_SF_IEEE_TCP_PORT; 51059bcb797SSudarsana Reddy Kalluru break; 51159bcb797SSudarsana Reddy Kalluru case DCBX_APP_SF_IEEE_UDP_PORT: 51259bcb797SSudarsana Reddy Kalluru entry->sf_ieee = QED_DCBX_SF_IEEE_UDP_PORT; 51359bcb797SSudarsana Reddy Kalluru break; 51459bcb797SSudarsana Reddy Kalluru case DCBX_APP_SF_IEEE_TCP_UDP_PORT: 51559bcb797SSudarsana Reddy Kalluru entry->sf_ieee = QED_DCBX_SF_IEEE_TCP_UDP_PORT; 51659bcb797SSudarsana Reddy Kalluru break; 51759bcb797SSudarsana Reddy Kalluru } 51859bcb797SSudarsana Reddy Kalluru } else { 5196ad8c632SSudarsana Reddy Kalluru entry->ethtype = !(QED_MFW_GET_FIELD(p_tbl[i].entry, 5206ad8c632SSudarsana Reddy Kalluru DCBX_APP_SF)); 52159bcb797SSudarsana Reddy Kalluru } 52259bcb797SSudarsana Reddy Kalluru 5236ad8c632SSudarsana Reddy Kalluru pri_map = QED_MFW_GET_FIELD(p_tbl[i].entry, DCBX_APP_PRI_MAP); 5246ad8c632SSudarsana Reddy Kalluru entry->prio = ffs(pri_map) - 1; 5256ad8c632SSudarsana Reddy Kalluru entry->proto_id = QED_MFW_GET_FIELD(p_tbl[i].entry, 5266ad8c632SSudarsana Reddy Kalluru DCBX_APP_PROTOCOL_ID); 5276ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_app_protocol_type(p_hwfn, p_tbl[i].entry, 5286ad8c632SSudarsana Reddy Kalluru entry->proto_id, 529fb9ea8a9SSudarsana Reddy Kalluru &entry->proto_type, ieee); 5306ad8c632SSudarsana Reddy Kalluru } 5316ad8c632SSudarsana Reddy Kalluru 5326ad8c632SSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, 5336ad8c632SSudarsana Reddy Kalluru "APP params: willing %d, valid %d error = %d\n", 5346ad8c632SSudarsana Reddy Kalluru p_params->app_willing, p_params->app_valid, 5356ad8c632SSudarsana Reddy Kalluru p_params->app_error); 5366ad8c632SSudarsana Reddy Kalluru } 5376ad8c632SSudarsana Reddy Kalluru 5386ad8c632SSudarsana Reddy Kalluru static void 5396ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_pfc_data(struct qed_hwfn *p_hwfn, 5406ad8c632SSudarsana Reddy Kalluru u32 pfc, struct qed_dcbx_params *p_params) 5416ad8c632SSudarsana Reddy Kalluru { 5426ad8c632SSudarsana Reddy Kalluru u8 pfc_map; 5436ad8c632SSudarsana Reddy Kalluru 5446ad8c632SSudarsana Reddy Kalluru p_params->pfc.willing = QED_MFW_GET_FIELD(pfc, DCBX_PFC_WILLING); 5456ad8c632SSudarsana Reddy Kalluru p_params->pfc.max_tc = QED_MFW_GET_FIELD(pfc, DCBX_PFC_CAPS); 5466ad8c632SSudarsana Reddy Kalluru p_params->pfc.enabled = QED_MFW_GET_FIELD(pfc, DCBX_PFC_ENABLED); 5476ad8c632SSudarsana Reddy Kalluru pfc_map = QED_MFW_GET_FIELD(pfc, DCBX_PFC_PRI_EN_BITMAP); 5486ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[0] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_0); 5496ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[1] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_1); 5506ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[2] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_2); 5516ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[3] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_3); 5526ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[4] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_4); 5536ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[5] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_5); 5546ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[6] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_6); 5556ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[7] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_7); 5566ad8c632SSudarsana Reddy Kalluru 5576ad8c632SSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, 558dfbeb85fSsudarsana.kalluru@cavium.com "PFC params: willing %d, pfc_bitmap %u max_tc = %u enabled = %d\n", 559dfbeb85fSsudarsana.kalluru@cavium.com p_params->pfc.willing, pfc_map, p_params->pfc.max_tc, 560dfbeb85fSsudarsana.kalluru@cavium.com p_params->pfc.enabled); 5616ad8c632SSudarsana Reddy Kalluru } 5626ad8c632SSudarsana Reddy Kalluru 5636ad8c632SSudarsana Reddy Kalluru static void 5646ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_ets_data(struct qed_hwfn *p_hwfn, 5656ad8c632SSudarsana Reddy Kalluru struct dcbx_ets_feature *p_ets, 5666ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_params *p_params) 5676ad8c632SSudarsana Reddy Kalluru { 5686ad8c632SSudarsana Reddy Kalluru u32 bw_map[2], tsa_map[2], pri_map; 5696ad8c632SSudarsana Reddy Kalluru int i; 5706ad8c632SSudarsana Reddy Kalluru 5716ad8c632SSudarsana Reddy Kalluru p_params->ets_willing = QED_MFW_GET_FIELD(p_ets->flags, 5726ad8c632SSudarsana Reddy Kalluru DCBX_ETS_WILLING); 5736ad8c632SSudarsana Reddy Kalluru p_params->ets_enabled = QED_MFW_GET_FIELD(p_ets->flags, 5746ad8c632SSudarsana Reddy Kalluru DCBX_ETS_ENABLED); 5756ad8c632SSudarsana Reddy Kalluru p_params->ets_cbs = QED_MFW_GET_FIELD(p_ets->flags, DCBX_ETS_CBS); 5766ad8c632SSudarsana Reddy Kalluru p_params->max_ets_tc = QED_MFW_GET_FIELD(p_ets->flags, 5776ad8c632SSudarsana Reddy Kalluru DCBX_ETS_MAX_TCS); 5786ad8c632SSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, 579dfbeb85fSsudarsana.kalluru@cavium.com "ETS params: willing %d, enabled = %d ets_cbs %d pri_tc_tbl_0 %x max_ets_tc %d\n", 580dfbeb85fSsudarsana.kalluru@cavium.com p_params->ets_willing, p_params->ets_enabled, 581dfbeb85fSsudarsana.kalluru@cavium.com p_params->ets_cbs, p_ets->pri_tc_tbl[0], 582dfbeb85fSsudarsana.kalluru@cavium.com p_params->max_ets_tc); 5836ad8c632SSudarsana Reddy Kalluru 58466367dabSsudarsana.kalluru@cavium.com if (p_params->ets_enabled && !p_params->max_ets_tc) { 58566367dabSsudarsana.kalluru@cavium.com p_params->max_ets_tc = QED_MAX_PFC_PRIORITIES; 58666367dabSsudarsana.kalluru@cavium.com DP_VERBOSE(p_hwfn, QED_MSG_DCB, 58766367dabSsudarsana.kalluru@cavium.com "ETS params: max_ets_tc is forced to %d\n", 58866367dabSsudarsana.kalluru@cavium.com p_params->max_ets_tc); 58966367dabSsudarsana.kalluru@cavium.com } 59066367dabSsudarsana.kalluru@cavium.com 5916ad8c632SSudarsana Reddy Kalluru /* 8 bit tsa and bw data corresponding to each of the 8 TC's are 5926ad8c632SSudarsana Reddy Kalluru * encoded in a type u32 array of size 2. 5936ad8c632SSudarsana Reddy Kalluru */ 5946ad8c632SSudarsana Reddy Kalluru bw_map[0] = be32_to_cpu(p_ets->tc_bw_tbl[0]); 5956ad8c632SSudarsana Reddy Kalluru bw_map[1] = be32_to_cpu(p_ets->tc_bw_tbl[1]); 5966ad8c632SSudarsana Reddy Kalluru tsa_map[0] = be32_to_cpu(p_ets->tc_tsa_tbl[0]); 5976ad8c632SSudarsana Reddy Kalluru tsa_map[1] = be32_to_cpu(p_ets->tc_tsa_tbl[1]); 598c0c45a6bSSudarsana Reddy Kalluru pri_map = p_ets->pri_tc_tbl[0]; 5996ad8c632SSudarsana Reddy Kalluru for (i = 0; i < QED_MAX_PFC_PRIORITIES; i++) { 6006ad8c632SSudarsana Reddy Kalluru p_params->ets_tc_bw_tbl[i] = ((u8 *)bw_map)[i]; 6016ad8c632SSudarsana Reddy Kalluru p_params->ets_tc_tsa_tbl[i] = ((u8 *)tsa_map)[i]; 6026ad8c632SSudarsana Reddy Kalluru p_params->ets_pri_tc_tbl[i] = QED_DCBX_PRIO2TC(pri_map, i); 6036ad8c632SSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, 6046ad8c632SSudarsana Reddy Kalluru "elem %d bw_tbl %x tsa_tbl %x\n", 6056ad8c632SSudarsana Reddy Kalluru i, p_params->ets_tc_bw_tbl[i], 6066ad8c632SSudarsana Reddy Kalluru p_params->ets_tc_tsa_tbl[i]); 6076ad8c632SSudarsana Reddy Kalluru } 6086ad8c632SSudarsana Reddy Kalluru } 6096ad8c632SSudarsana Reddy Kalluru 6106ad8c632SSudarsana Reddy Kalluru static void 6116ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_common_params(struct qed_hwfn *p_hwfn, 6126ad8c632SSudarsana Reddy Kalluru struct dcbx_app_priority_feature *p_app, 6136ad8c632SSudarsana Reddy Kalluru struct dcbx_app_priority_entry *p_tbl, 6146ad8c632SSudarsana Reddy Kalluru struct dcbx_ets_feature *p_ets, 615fb9ea8a9SSudarsana Reddy Kalluru u32 pfc, struct qed_dcbx_params *p_params, bool ieee) 6166ad8c632SSudarsana Reddy Kalluru { 617fb9ea8a9SSudarsana Reddy Kalluru qed_dcbx_get_app_data(p_hwfn, p_app, p_tbl, p_params, ieee); 6186ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_ets_data(p_hwfn, p_ets, p_params); 6196ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_pfc_data(p_hwfn, pfc, p_params); 6206ad8c632SSudarsana Reddy Kalluru } 6216ad8c632SSudarsana Reddy Kalluru 6226ad8c632SSudarsana Reddy Kalluru static void 623270837b3Ssudarsana.kalluru@cavium.com qed_dcbx_get_local_params(struct qed_hwfn *p_hwfn, struct qed_dcbx_get *params) 6246ad8c632SSudarsana Reddy Kalluru { 6256ad8c632SSudarsana Reddy Kalluru struct dcbx_features *p_feat; 6266ad8c632SSudarsana Reddy Kalluru 6276ad8c632SSudarsana Reddy Kalluru p_feat = &p_hwfn->p_dcbx_info->local_admin.features; 6286ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_common_params(p_hwfn, &p_feat->app, 6296ad8c632SSudarsana Reddy Kalluru p_feat->app.app_pri_tbl, &p_feat->ets, 630fb9ea8a9SSudarsana Reddy Kalluru p_feat->pfc, ¶ms->local.params, false); 6316ad8c632SSudarsana Reddy Kalluru params->local.valid = true; 6326ad8c632SSudarsana Reddy Kalluru } 6336ad8c632SSudarsana Reddy Kalluru 6346ad8c632SSudarsana Reddy Kalluru static void 635270837b3Ssudarsana.kalluru@cavium.com qed_dcbx_get_remote_params(struct qed_hwfn *p_hwfn, struct qed_dcbx_get *params) 6366ad8c632SSudarsana Reddy Kalluru { 6376ad8c632SSudarsana Reddy Kalluru struct dcbx_features *p_feat; 6386ad8c632SSudarsana Reddy Kalluru 6396ad8c632SSudarsana Reddy Kalluru p_feat = &p_hwfn->p_dcbx_info->remote.features; 6406ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_common_params(p_hwfn, &p_feat->app, 6416ad8c632SSudarsana Reddy Kalluru p_feat->app.app_pri_tbl, &p_feat->ets, 642fb9ea8a9SSudarsana Reddy Kalluru p_feat->pfc, ¶ms->remote.params, false); 6436ad8c632SSudarsana Reddy Kalluru params->remote.valid = true; 6446ad8c632SSudarsana Reddy Kalluru } 6456ad8c632SSudarsana Reddy Kalluru 6466ad8c632SSudarsana Reddy Kalluru static void 6476ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_operational_params(struct qed_hwfn *p_hwfn, 6486ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_get *params) 6496ad8c632SSudarsana Reddy Kalluru { 6506ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_operational_params *p_operational; 6516ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_results *p_results; 6526ad8c632SSudarsana Reddy Kalluru struct dcbx_features *p_feat; 6536ad8c632SSudarsana Reddy Kalluru bool enabled, err; 6546ad8c632SSudarsana Reddy Kalluru u32 flags; 6556ad8c632SSudarsana Reddy Kalluru bool val; 6566ad8c632SSudarsana Reddy Kalluru 6576ad8c632SSudarsana Reddy Kalluru flags = p_hwfn->p_dcbx_info->operational.flags; 6586ad8c632SSudarsana Reddy Kalluru 6596ad8c632SSudarsana Reddy Kalluru /* If DCBx version is non zero, then negotiation 6606ad8c632SSudarsana Reddy Kalluru * was successfuly performed 6616ad8c632SSudarsana Reddy Kalluru */ 6626ad8c632SSudarsana Reddy Kalluru p_operational = ¶ms->operational; 6636ad8c632SSudarsana Reddy Kalluru enabled = !!(QED_MFW_GET_FIELD(flags, DCBX_CONFIG_VERSION) != 6646ad8c632SSudarsana Reddy Kalluru DCBX_CONFIG_VERSION_DISABLED); 6656ad8c632SSudarsana Reddy Kalluru if (!enabled) { 6666ad8c632SSudarsana Reddy Kalluru p_operational->enabled = enabled; 6676ad8c632SSudarsana Reddy Kalluru p_operational->valid = false; 668dfbeb85fSsudarsana.kalluru@cavium.com DP_VERBOSE(p_hwfn, QED_MSG_DCB, "Dcbx is disabled\n"); 6696ad8c632SSudarsana Reddy Kalluru return; 6706ad8c632SSudarsana Reddy Kalluru } 6716ad8c632SSudarsana Reddy Kalluru 6726ad8c632SSudarsana Reddy Kalluru p_feat = &p_hwfn->p_dcbx_info->operational.features; 6736ad8c632SSudarsana Reddy Kalluru p_results = &p_hwfn->p_dcbx_info->results; 6746ad8c632SSudarsana Reddy Kalluru 6756ad8c632SSudarsana Reddy Kalluru val = !!(QED_MFW_GET_FIELD(flags, DCBX_CONFIG_VERSION) == 6766ad8c632SSudarsana Reddy Kalluru DCBX_CONFIG_VERSION_IEEE); 6776ad8c632SSudarsana Reddy Kalluru p_operational->ieee = val; 6786ad8c632SSudarsana Reddy Kalluru val = !!(QED_MFW_GET_FIELD(flags, DCBX_CONFIG_VERSION) == 6796ad8c632SSudarsana Reddy Kalluru DCBX_CONFIG_VERSION_CEE); 6806ad8c632SSudarsana Reddy Kalluru p_operational->cee = val; 6816ad8c632SSudarsana Reddy Kalluru 68249632b58Ssudarsana.kalluru@cavium.com val = !!(QED_MFW_GET_FIELD(flags, DCBX_CONFIG_VERSION) == 68349632b58Ssudarsana.kalluru@cavium.com DCBX_CONFIG_VERSION_STATIC); 68449632b58Ssudarsana.kalluru@cavium.com p_operational->local = val; 68549632b58Ssudarsana.kalluru@cavium.com 68649632b58Ssudarsana.kalluru@cavium.com DP_VERBOSE(p_hwfn, QED_MSG_DCB, 68749632b58Ssudarsana.kalluru@cavium.com "Version support: ieee %d, cee %d, static %d\n", 68849632b58Ssudarsana.kalluru@cavium.com p_operational->ieee, p_operational->cee, 68949632b58Ssudarsana.kalluru@cavium.com p_operational->local); 6906ad8c632SSudarsana Reddy Kalluru 6916ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_common_params(p_hwfn, &p_feat->app, 6926ad8c632SSudarsana Reddy Kalluru p_feat->app.app_pri_tbl, &p_feat->ets, 693fb9ea8a9SSudarsana Reddy Kalluru p_feat->pfc, ¶ms->operational.params, 694fb9ea8a9SSudarsana Reddy Kalluru p_operational->ieee); 6956ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_priority_info(p_hwfn, &p_operational->app_prio, p_results); 6966ad8c632SSudarsana Reddy Kalluru err = QED_MFW_GET_FIELD(p_feat->app.flags, DCBX_APP_ERROR); 6976ad8c632SSudarsana Reddy Kalluru p_operational->err = err; 6986ad8c632SSudarsana Reddy Kalluru p_operational->enabled = enabled; 6996ad8c632SSudarsana Reddy Kalluru p_operational->valid = true; 7006ad8c632SSudarsana Reddy Kalluru } 7016ad8c632SSudarsana Reddy Kalluru 7026ad8c632SSudarsana Reddy Kalluru static void 7036ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_local_lldp_params(struct qed_hwfn *p_hwfn, 7046ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_get *params) 7056ad8c632SSudarsana Reddy Kalluru { 7066ad8c632SSudarsana Reddy Kalluru struct lldp_config_params_s *p_local; 7076ad8c632SSudarsana Reddy Kalluru 7086ad8c632SSudarsana Reddy Kalluru p_local = &p_hwfn->p_dcbx_info->lldp_local[LLDP_NEAREST_BRIDGE]; 7096ad8c632SSudarsana Reddy Kalluru 7106ad8c632SSudarsana Reddy Kalluru memcpy(params->lldp_local.local_chassis_id, p_local->local_chassis_id, 711cc9b27cdSSudarsana Reddy Kalluru sizeof(p_local->local_chassis_id)); 7126ad8c632SSudarsana Reddy Kalluru memcpy(params->lldp_local.local_port_id, p_local->local_port_id, 713cc9b27cdSSudarsana Reddy Kalluru sizeof(p_local->local_port_id)); 7146ad8c632SSudarsana Reddy Kalluru } 7156ad8c632SSudarsana Reddy Kalluru 7166ad8c632SSudarsana Reddy Kalluru static void 7176ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_remote_lldp_params(struct qed_hwfn *p_hwfn, 7186ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_get *params) 7196ad8c632SSudarsana Reddy Kalluru { 7206ad8c632SSudarsana Reddy Kalluru struct lldp_status_params_s *p_remote; 7216ad8c632SSudarsana Reddy Kalluru 7226ad8c632SSudarsana Reddy Kalluru p_remote = &p_hwfn->p_dcbx_info->lldp_remote[LLDP_NEAREST_BRIDGE]; 7236ad8c632SSudarsana Reddy Kalluru 7246ad8c632SSudarsana Reddy Kalluru memcpy(params->lldp_remote.peer_chassis_id, p_remote->peer_chassis_id, 725cc9b27cdSSudarsana Reddy Kalluru sizeof(p_remote->peer_chassis_id)); 7266ad8c632SSudarsana Reddy Kalluru memcpy(params->lldp_remote.peer_port_id, p_remote->peer_port_id, 727cc9b27cdSSudarsana Reddy Kalluru sizeof(p_remote->peer_port_id)); 7286ad8c632SSudarsana Reddy Kalluru } 7296ad8c632SSudarsana Reddy Kalluru 7306ad8c632SSudarsana Reddy Kalluru static int 731270837b3Ssudarsana.kalluru@cavium.com qed_dcbx_get_params(struct qed_hwfn *p_hwfn, struct qed_dcbx_get *p_params, 7326ad8c632SSudarsana Reddy Kalluru enum qed_mib_read_type type) 7336ad8c632SSudarsana Reddy Kalluru { 7346ad8c632SSudarsana Reddy Kalluru switch (type) { 7356ad8c632SSudarsana Reddy Kalluru case QED_DCBX_REMOTE_MIB: 736270837b3Ssudarsana.kalluru@cavium.com qed_dcbx_get_remote_params(p_hwfn, p_params); 7376ad8c632SSudarsana Reddy Kalluru break; 7386ad8c632SSudarsana Reddy Kalluru case QED_DCBX_LOCAL_MIB: 739270837b3Ssudarsana.kalluru@cavium.com qed_dcbx_get_local_params(p_hwfn, p_params); 7406ad8c632SSudarsana Reddy Kalluru break; 7416ad8c632SSudarsana Reddy Kalluru case QED_DCBX_OPERATIONAL_MIB: 742270837b3Ssudarsana.kalluru@cavium.com qed_dcbx_get_operational_params(p_hwfn, p_params); 7436ad8c632SSudarsana Reddy Kalluru break; 7446ad8c632SSudarsana Reddy Kalluru case QED_DCBX_REMOTE_LLDP_MIB: 745270837b3Ssudarsana.kalluru@cavium.com qed_dcbx_get_remote_lldp_params(p_hwfn, p_params); 7466ad8c632SSudarsana Reddy Kalluru break; 7476ad8c632SSudarsana Reddy Kalluru case QED_DCBX_LOCAL_LLDP_MIB: 748270837b3Ssudarsana.kalluru@cavium.com qed_dcbx_get_local_lldp_params(p_hwfn, p_params); 7496ad8c632SSudarsana Reddy Kalluru break; 7506ad8c632SSudarsana Reddy Kalluru default: 7516ad8c632SSudarsana Reddy Kalluru DP_ERR(p_hwfn, "MIB read err, unknown mib type %d\n", type); 7526ad8c632SSudarsana Reddy Kalluru return -EINVAL; 7536ad8c632SSudarsana Reddy Kalluru } 7546ad8c632SSudarsana Reddy Kalluru 7556ad8c632SSudarsana Reddy Kalluru return 0; 7566ad8c632SSudarsana Reddy Kalluru } 7576ad8c632SSudarsana Reddy Kalluru 75839651abdSSudarsana Reddy Kalluru static int 75939651abdSSudarsana Reddy Kalluru qed_dcbx_read_local_lldp_mib(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt) 76039651abdSSudarsana Reddy Kalluru { 76139651abdSSudarsana Reddy Kalluru struct qed_dcbx_mib_meta_data data; 76239651abdSSudarsana Reddy Kalluru int rc = 0; 76339651abdSSudarsana Reddy Kalluru 76439651abdSSudarsana Reddy Kalluru memset(&data, 0, sizeof(data)); 76539651abdSSudarsana Reddy Kalluru data.addr = p_hwfn->mcp_info->port_addr + offsetof(struct public_port, 76639651abdSSudarsana Reddy Kalluru lldp_config_params); 76739651abdSSudarsana Reddy Kalluru data.lldp_local = p_hwfn->p_dcbx_info->lldp_local; 76839651abdSSudarsana Reddy Kalluru data.size = sizeof(struct lldp_config_params_s); 76939651abdSSudarsana Reddy Kalluru qed_memcpy_from(p_hwfn, p_ptt, data.lldp_local, data.addr, data.size); 77039651abdSSudarsana Reddy Kalluru 77139651abdSSudarsana Reddy Kalluru return rc; 77239651abdSSudarsana Reddy Kalluru } 77339651abdSSudarsana Reddy Kalluru 77439651abdSSudarsana Reddy Kalluru static int 77539651abdSSudarsana Reddy Kalluru qed_dcbx_read_remote_lldp_mib(struct qed_hwfn *p_hwfn, 77639651abdSSudarsana Reddy Kalluru struct qed_ptt *p_ptt, 77739651abdSSudarsana Reddy Kalluru enum qed_mib_read_type type) 77839651abdSSudarsana Reddy Kalluru { 77939651abdSSudarsana Reddy Kalluru struct qed_dcbx_mib_meta_data data; 78039651abdSSudarsana Reddy Kalluru int rc = 0; 78139651abdSSudarsana Reddy Kalluru 78239651abdSSudarsana Reddy Kalluru memset(&data, 0, sizeof(data)); 78339651abdSSudarsana Reddy Kalluru data.addr = p_hwfn->mcp_info->port_addr + offsetof(struct public_port, 78439651abdSSudarsana Reddy Kalluru lldp_status_params); 78539651abdSSudarsana Reddy Kalluru data.lldp_remote = p_hwfn->p_dcbx_info->lldp_remote; 78639651abdSSudarsana Reddy Kalluru data.size = sizeof(struct lldp_status_params_s); 78739651abdSSudarsana Reddy Kalluru rc = qed_dcbx_copy_mib(p_hwfn, p_ptt, &data, type); 78839651abdSSudarsana Reddy Kalluru 78939651abdSSudarsana Reddy Kalluru return rc; 79039651abdSSudarsana Reddy Kalluru } 79139651abdSSudarsana Reddy Kalluru 79239651abdSSudarsana Reddy Kalluru static int 79339651abdSSudarsana Reddy Kalluru qed_dcbx_read_operational_mib(struct qed_hwfn *p_hwfn, 79439651abdSSudarsana Reddy Kalluru struct qed_ptt *p_ptt, 79539651abdSSudarsana Reddy Kalluru enum qed_mib_read_type type) 79639651abdSSudarsana Reddy Kalluru { 79739651abdSSudarsana Reddy Kalluru struct qed_dcbx_mib_meta_data data; 79839651abdSSudarsana Reddy Kalluru int rc = 0; 79939651abdSSudarsana Reddy Kalluru 80039651abdSSudarsana Reddy Kalluru memset(&data, 0, sizeof(data)); 80139651abdSSudarsana Reddy Kalluru data.addr = p_hwfn->mcp_info->port_addr + 80239651abdSSudarsana Reddy Kalluru offsetof(struct public_port, operational_dcbx_mib); 80339651abdSSudarsana Reddy Kalluru data.mib = &p_hwfn->p_dcbx_info->operational; 80439651abdSSudarsana Reddy Kalluru data.size = sizeof(struct dcbx_mib); 80539651abdSSudarsana Reddy Kalluru rc = qed_dcbx_copy_mib(p_hwfn, p_ptt, &data, type); 80639651abdSSudarsana Reddy Kalluru 80739651abdSSudarsana Reddy Kalluru return rc; 80839651abdSSudarsana Reddy Kalluru } 80939651abdSSudarsana Reddy Kalluru 81039651abdSSudarsana Reddy Kalluru static int 81139651abdSSudarsana Reddy Kalluru qed_dcbx_read_remote_mib(struct qed_hwfn *p_hwfn, 81239651abdSSudarsana Reddy Kalluru struct qed_ptt *p_ptt, enum qed_mib_read_type type) 81339651abdSSudarsana Reddy Kalluru { 81439651abdSSudarsana Reddy Kalluru struct qed_dcbx_mib_meta_data data; 81539651abdSSudarsana Reddy Kalluru int rc = 0; 81639651abdSSudarsana Reddy Kalluru 81739651abdSSudarsana Reddy Kalluru memset(&data, 0, sizeof(data)); 81839651abdSSudarsana Reddy Kalluru data.addr = p_hwfn->mcp_info->port_addr + 81939651abdSSudarsana Reddy Kalluru offsetof(struct public_port, remote_dcbx_mib); 82039651abdSSudarsana Reddy Kalluru data.mib = &p_hwfn->p_dcbx_info->remote; 82139651abdSSudarsana Reddy Kalluru data.size = sizeof(struct dcbx_mib); 82239651abdSSudarsana Reddy Kalluru rc = qed_dcbx_copy_mib(p_hwfn, p_ptt, &data, type); 82339651abdSSudarsana Reddy Kalluru 82439651abdSSudarsana Reddy Kalluru return rc; 82539651abdSSudarsana Reddy Kalluru } 82639651abdSSudarsana Reddy Kalluru 82739651abdSSudarsana Reddy Kalluru static int 82839651abdSSudarsana Reddy Kalluru qed_dcbx_read_local_mib(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt) 82939651abdSSudarsana Reddy Kalluru { 83039651abdSSudarsana Reddy Kalluru struct qed_dcbx_mib_meta_data data; 83139651abdSSudarsana Reddy Kalluru int rc = 0; 83239651abdSSudarsana Reddy Kalluru 83339651abdSSudarsana Reddy Kalluru memset(&data, 0, sizeof(data)); 83439651abdSSudarsana Reddy Kalluru data.addr = p_hwfn->mcp_info->port_addr + 83539651abdSSudarsana Reddy Kalluru offsetof(struct public_port, local_admin_dcbx_mib); 83639651abdSSudarsana Reddy Kalluru data.local_admin = &p_hwfn->p_dcbx_info->local_admin; 83739651abdSSudarsana Reddy Kalluru data.size = sizeof(struct dcbx_local_params); 83839651abdSSudarsana Reddy Kalluru qed_memcpy_from(p_hwfn, p_ptt, data.local_admin, data.addr, data.size); 83939651abdSSudarsana Reddy Kalluru 84039651abdSSudarsana Reddy Kalluru return rc; 84139651abdSSudarsana Reddy Kalluru } 84239651abdSSudarsana Reddy Kalluru 84339651abdSSudarsana Reddy Kalluru static int qed_dcbx_read_mib(struct qed_hwfn *p_hwfn, 84439651abdSSudarsana Reddy Kalluru struct qed_ptt *p_ptt, enum qed_mib_read_type type) 84539651abdSSudarsana Reddy Kalluru { 84639651abdSSudarsana Reddy Kalluru int rc = -EINVAL; 84739651abdSSudarsana Reddy Kalluru 84839651abdSSudarsana Reddy Kalluru switch (type) { 84939651abdSSudarsana Reddy Kalluru case QED_DCBX_OPERATIONAL_MIB: 85039651abdSSudarsana Reddy Kalluru rc = qed_dcbx_read_operational_mib(p_hwfn, p_ptt, type); 85139651abdSSudarsana Reddy Kalluru break; 85239651abdSSudarsana Reddy Kalluru case QED_DCBX_REMOTE_MIB: 85339651abdSSudarsana Reddy Kalluru rc = qed_dcbx_read_remote_mib(p_hwfn, p_ptt, type); 85439651abdSSudarsana Reddy Kalluru break; 85539651abdSSudarsana Reddy Kalluru case QED_DCBX_LOCAL_MIB: 85639651abdSSudarsana Reddy Kalluru rc = qed_dcbx_read_local_mib(p_hwfn, p_ptt); 85739651abdSSudarsana Reddy Kalluru break; 85839651abdSSudarsana Reddy Kalluru case QED_DCBX_REMOTE_LLDP_MIB: 85939651abdSSudarsana Reddy Kalluru rc = qed_dcbx_read_remote_lldp_mib(p_hwfn, p_ptt, type); 86039651abdSSudarsana Reddy Kalluru break; 86139651abdSSudarsana Reddy Kalluru case QED_DCBX_LOCAL_LLDP_MIB: 86239651abdSSudarsana Reddy Kalluru rc = qed_dcbx_read_local_lldp_mib(p_hwfn, p_ptt); 86339651abdSSudarsana Reddy Kalluru break; 86439651abdSSudarsana Reddy Kalluru default: 86539651abdSSudarsana Reddy Kalluru DP_ERR(p_hwfn, "MIB read err, unknown mib type %d\n", type); 86639651abdSSudarsana Reddy Kalluru } 86739651abdSSudarsana Reddy Kalluru 86839651abdSSudarsana Reddy Kalluru return rc; 86939651abdSSudarsana Reddy Kalluru } 87039651abdSSudarsana Reddy Kalluru 871bf774d14SYueHaibing static void qed_dcbx_aen(struct qed_hwfn *hwfn, u32 mib_type) 8721e128c81SArun Easi { 8731e128c81SArun Easi struct qed_common_cb_ops *op = hwfn->cdev->protocol_ops.common; 8741e128c81SArun Easi void *cookie = hwfn->cdev->ops_cookie; 8751e128c81SArun Easi 8761e128c81SArun Easi if (cookie && op->dcbx_aen) 8771e128c81SArun Easi op->dcbx_aen(cookie, &hwfn->p_dcbx_info->get, mib_type); 8781e128c81SArun Easi } 8791e128c81SArun Easi 88039651abdSSudarsana Reddy Kalluru /* Read updated MIB. 88139651abdSSudarsana Reddy Kalluru * Reconfigure QM and invoke PF update ramrod command if operational MIB 88239651abdSSudarsana Reddy Kalluru * change is detected. 88339651abdSSudarsana Reddy Kalluru */ 88439651abdSSudarsana Reddy Kalluru int 88539651abdSSudarsana Reddy Kalluru qed_dcbx_mib_update_event(struct qed_hwfn *p_hwfn, 88639651abdSSudarsana Reddy Kalluru struct qed_ptt *p_ptt, enum qed_mib_read_type type) 88739651abdSSudarsana Reddy Kalluru { 88839651abdSSudarsana Reddy Kalluru int rc = 0; 88939651abdSSudarsana Reddy Kalluru 89039651abdSSudarsana Reddy Kalluru rc = qed_dcbx_read_mib(p_hwfn, p_ptt, type); 89139651abdSSudarsana Reddy Kalluru if (rc) 89239651abdSSudarsana Reddy Kalluru return rc; 89339651abdSSudarsana Reddy Kalluru 89439651abdSSudarsana Reddy Kalluru if (type == QED_DCBX_OPERATIONAL_MIB) { 89539651abdSSudarsana Reddy Kalluru rc = qed_dcbx_process_mib_info(p_hwfn); 89639651abdSSudarsana Reddy Kalluru if (!rc) { 89739651abdSSudarsana Reddy Kalluru /* reconfigure tcs of QM queues according 89839651abdSSudarsana Reddy Kalluru * to negotiation results 89939651abdSSudarsana Reddy Kalluru */ 90039651abdSSudarsana Reddy Kalluru qed_qm_reconf(p_hwfn, p_ptt); 90139651abdSSudarsana Reddy Kalluru 90239651abdSSudarsana Reddy Kalluru /* update storm FW with negotiation results */ 90339651abdSSudarsana Reddy Kalluru qed_sp_pf_update(p_hwfn); 9049331dad1SMintz, Yuval 9059331dad1SMintz, Yuval /* for roce PFs, we may want to enable/disable DPM 9069331dad1SMintz, Yuval * when DCBx change occurs 9079331dad1SMintz, Yuval */ 9089331dad1SMintz, Yuval if (p_hwfn->hw_info.personality == 9099331dad1SMintz, Yuval QED_PCI_ETH_ROCE) 9109331dad1SMintz, Yuval qed_roce_dpm_dcbx(p_hwfn, p_ptt); 91139651abdSSudarsana Reddy Kalluru } 91239651abdSSudarsana Reddy Kalluru } 913270837b3Ssudarsana.kalluru@cavium.com 914270837b3Ssudarsana.kalluru@cavium.com qed_dcbx_get_params(p_hwfn, &p_hwfn->p_dcbx_info->get, type); 91526462ad9SMintz, Yuval 91626462ad9SMintz, Yuval if (type == QED_DCBX_OPERATIONAL_MIB) { 91726462ad9SMintz, Yuval struct qed_dcbx_results *p_data; 91826462ad9SMintz, Yuval u16 val; 91926462ad9SMintz, Yuval 92026462ad9SMintz, Yuval /* Configure in NIG which protocols support EDPM and should 92126462ad9SMintz, Yuval * honor PFC. 92226462ad9SMintz, Yuval */ 92326462ad9SMintz, Yuval p_data = &p_hwfn->p_dcbx_info->results; 92426462ad9SMintz, Yuval val = (0x1 << p_data->arr[DCBX_PROTOCOL_ROCE].tc) | 92526462ad9SMintz, Yuval (0x1 << p_data->arr[DCBX_PROTOCOL_ROCE_V2].tc); 92626462ad9SMintz, Yuval val <<= NIG_REG_TX_EDPM_CTRL_TX_EDPM_TC_EN_SHIFT; 92726462ad9SMintz, Yuval val |= NIG_REG_TX_EDPM_CTRL_TX_EDPM_EN; 92826462ad9SMintz, Yuval qed_wr(p_hwfn, p_ptt, NIG_REG_TX_EDPM_CTRL, val); 92926462ad9SMintz, Yuval } 93026462ad9SMintz, Yuval 9311e128c81SArun Easi qed_dcbx_aen(p_hwfn, type); 93239651abdSSudarsana Reddy Kalluru 93339651abdSSudarsana Reddy Kalluru return rc; 93439651abdSSudarsana Reddy Kalluru } 93539651abdSSudarsana Reddy Kalluru 93639651abdSSudarsana Reddy Kalluru int qed_dcbx_info_alloc(struct qed_hwfn *p_hwfn) 93739651abdSSudarsana Reddy Kalluru { 93839651abdSSudarsana Reddy Kalluru p_hwfn->p_dcbx_info = kzalloc(sizeof(*p_hwfn->p_dcbx_info), GFP_KERNEL); 9392591c280SJoe Perches if (!p_hwfn->p_dcbx_info) 940270837b3Ssudarsana.kalluru@cavium.com return -ENOMEM; 94139651abdSSudarsana Reddy Kalluru 942270837b3Ssudarsana.kalluru@cavium.com return 0; 94339651abdSSudarsana Reddy Kalluru } 94439651abdSSudarsana Reddy Kalluru 945270837b3Ssudarsana.kalluru@cavium.com void qed_dcbx_info_free(struct qed_hwfn *p_hwfn) 94639651abdSSudarsana Reddy Kalluru { 94739651abdSSudarsana Reddy Kalluru kfree(p_hwfn->p_dcbx_info); 9483587cb87STomer Tayar p_hwfn->p_dcbx_info = NULL; 94939651abdSSudarsana Reddy Kalluru } 95039651abdSSudarsana Reddy Kalluru 95139651abdSSudarsana Reddy Kalluru static void qed_dcbx_update_protocol_data(struct protocol_dcb_data *p_data, 95239651abdSSudarsana Reddy Kalluru struct qed_dcbx_results *p_src, 95339651abdSSudarsana Reddy Kalluru enum dcbx_protocol_type type) 95439651abdSSudarsana Reddy Kalluru { 95539651abdSSudarsana Reddy Kalluru p_data->dcb_enable_flag = p_src->arr[type].enable; 95639651abdSSudarsana Reddy Kalluru p_data->dcb_priority = p_src->arr[type].priority; 95739651abdSSudarsana Reddy Kalluru p_data->dcb_tc = p_src->arr[type].tc; 95839651abdSSudarsana Reddy Kalluru } 95939651abdSSudarsana Reddy Kalluru 96039651abdSSudarsana Reddy Kalluru /* Set pf update ramrod command params */ 96139651abdSSudarsana Reddy Kalluru void qed_dcbx_set_pf_update_params(struct qed_dcbx_results *p_src, 96239651abdSSudarsana Reddy Kalluru struct pf_update_ramrod_data *p_dest) 96339651abdSSudarsana Reddy Kalluru { 96439651abdSSudarsana Reddy Kalluru struct protocol_dcb_data *p_dcb_data; 965da090917STomer Tayar u8 update_flag; 96639651abdSSudarsana Reddy Kalluru 96739651abdSSudarsana Reddy Kalluru update_flag = p_src->arr[DCBX_PROTOCOL_FCOE].update; 9687b6859fbSMintz, Yuval p_dest->update_fcoe_dcb_data_mode = update_flag; 96939651abdSSudarsana Reddy Kalluru 97039651abdSSudarsana Reddy Kalluru update_flag = p_src->arr[DCBX_PROTOCOL_ROCE].update; 9717b6859fbSMintz, Yuval p_dest->update_roce_dcb_data_mode = update_flag; 9727b6859fbSMintz, Yuval 97339651abdSSudarsana Reddy Kalluru update_flag = p_src->arr[DCBX_PROTOCOL_ROCE_V2].update; 9747b6859fbSMintz, Yuval p_dest->update_rroce_dcb_data_mode = update_flag; 97539651abdSSudarsana Reddy Kalluru 97639651abdSSudarsana Reddy Kalluru update_flag = p_src->arr[DCBX_PROTOCOL_ISCSI].update; 9777b6859fbSMintz, Yuval p_dest->update_iscsi_dcb_data_mode = update_flag; 97839651abdSSudarsana Reddy Kalluru update_flag = p_src->arr[DCBX_PROTOCOL_ETH].update; 9797b6859fbSMintz, Yuval p_dest->update_eth_dcb_data_mode = update_flag; 98039651abdSSudarsana Reddy Kalluru 98139651abdSSudarsana Reddy Kalluru p_dcb_data = &p_dest->fcoe_dcb_data; 98239651abdSSudarsana Reddy Kalluru qed_dcbx_update_protocol_data(p_dcb_data, p_src, DCBX_PROTOCOL_FCOE); 98339651abdSSudarsana Reddy Kalluru p_dcb_data = &p_dest->roce_dcb_data; 984449ad505Ssudarsana.kalluru@cavium.com qed_dcbx_update_protocol_data(p_dcb_data, p_src, DCBX_PROTOCOL_ROCE); 985449ad505Ssudarsana.kalluru@cavium.com p_dcb_data = &p_dest->rroce_dcb_data; 986449ad505Ssudarsana.kalluru@cavium.com qed_dcbx_update_protocol_data(p_dcb_data, p_src, DCBX_PROTOCOL_ROCE_V2); 98739651abdSSudarsana Reddy Kalluru p_dcb_data = &p_dest->iscsi_dcb_data; 98839651abdSSudarsana Reddy Kalluru qed_dcbx_update_protocol_data(p_dcb_data, p_src, DCBX_PROTOCOL_ISCSI); 98939651abdSSudarsana Reddy Kalluru p_dcb_data = &p_dest->eth_dcb_data; 99039651abdSSudarsana Reddy Kalluru qed_dcbx_update_protocol_data(p_dcb_data, p_src, DCBX_PROTOCOL_ETH); 99139651abdSSudarsana Reddy Kalluru } 9926ad8c632SSudarsana Reddy Kalluru 9932a1cb1bfSDenis Bolotin u8 qed_dcbx_get_priority_tc(struct qed_hwfn *p_hwfn, u8 pri) 9942a1cb1bfSDenis Bolotin { 9952a1cb1bfSDenis Bolotin struct qed_dcbx_get *dcbx_info = &p_hwfn->p_dcbx_info->get; 9962a1cb1bfSDenis Bolotin 9972a1cb1bfSDenis Bolotin if (pri >= QED_MAX_PFC_PRIORITIES) { 9982a1cb1bfSDenis Bolotin DP_ERR(p_hwfn, "Invalid priority %d\n", pri); 9992a1cb1bfSDenis Bolotin return QED_DCBX_DEFAULT_TC; 10002a1cb1bfSDenis Bolotin } 10012a1cb1bfSDenis Bolotin 10022a1cb1bfSDenis Bolotin if (!dcbx_info->operational.valid) { 10032a1cb1bfSDenis Bolotin DP_VERBOSE(p_hwfn, QED_MSG_DCB, 10042a1cb1bfSDenis Bolotin "Dcbx parameters not available\n"); 10052a1cb1bfSDenis Bolotin return QED_DCBX_DEFAULT_TC; 10062a1cb1bfSDenis Bolotin } 10072a1cb1bfSDenis Bolotin 10082a1cb1bfSDenis Bolotin return dcbx_info->operational.params.ets_pri_tc_tbl[pri]; 10092a1cb1bfSDenis Bolotin } 10102a1cb1bfSDenis Bolotin 10116ad8c632SSudarsana Reddy Kalluru #ifdef CONFIG_DCB 10126ad8c632SSudarsana Reddy Kalluru static int qed_dcbx_query_params(struct qed_hwfn *p_hwfn, 10136ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_get *p_get, 10146ad8c632SSudarsana Reddy Kalluru enum qed_mib_read_type type) 10156ad8c632SSudarsana Reddy Kalluru { 10166ad8c632SSudarsana Reddy Kalluru struct qed_ptt *p_ptt; 10176ad8c632SSudarsana Reddy Kalluru int rc; 10186ad8c632SSudarsana Reddy Kalluru 10195fe118c9SSudarsana Reddy Kalluru if (IS_VF(p_hwfn->cdev)) 10205fe118c9SSudarsana Reddy Kalluru return -EINVAL; 10215fe118c9SSudarsana Reddy Kalluru 10226ad8c632SSudarsana Reddy Kalluru p_ptt = qed_ptt_acquire(p_hwfn); 10236ad8c632SSudarsana Reddy Kalluru if (!p_ptt) 10246ad8c632SSudarsana Reddy Kalluru return -EBUSY; 10256ad8c632SSudarsana Reddy Kalluru 10266ad8c632SSudarsana Reddy Kalluru rc = qed_dcbx_read_mib(p_hwfn, p_ptt, type); 10276ad8c632SSudarsana Reddy Kalluru if (rc) 10286ad8c632SSudarsana Reddy Kalluru goto out; 10296ad8c632SSudarsana Reddy Kalluru 1030270837b3Ssudarsana.kalluru@cavium.com rc = qed_dcbx_get_params(p_hwfn, p_get, type); 10316ad8c632SSudarsana Reddy Kalluru 10326ad8c632SSudarsana Reddy Kalluru out: 10336ad8c632SSudarsana Reddy Kalluru qed_ptt_release(p_hwfn, p_ptt); 10346ad8c632SSudarsana Reddy Kalluru return rc; 10356ad8c632SSudarsana Reddy Kalluru } 10366ad8c632SSudarsana Reddy Kalluru 10376ad8c632SSudarsana Reddy Kalluru static void 10386ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_pfc_data(struct qed_hwfn *p_hwfn, 10396ad8c632SSudarsana Reddy Kalluru u32 *pfc, struct qed_dcbx_params *p_params) 10406ad8c632SSudarsana Reddy Kalluru { 10416ad8c632SSudarsana Reddy Kalluru u8 pfc_map = 0; 10426ad8c632SSudarsana Reddy Kalluru int i; 10436ad8c632SSudarsana Reddy Kalluru 10446cf75f1cSsudarsana.kalluru@cavium.com *pfc &= ~DCBX_PFC_ERROR_MASK; 10456cf75f1cSsudarsana.kalluru@cavium.com 10466ad8c632SSudarsana Reddy Kalluru if (p_params->pfc.willing) 10476ad8c632SSudarsana Reddy Kalluru *pfc |= DCBX_PFC_WILLING_MASK; 10486ad8c632SSudarsana Reddy Kalluru else 10496ad8c632SSudarsana Reddy Kalluru *pfc &= ~DCBX_PFC_WILLING_MASK; 10506ad8c632SSudarsana Reddy Kalluru 10516ad8c632SSudarsana Reddy Kalluru if (p_params->pfc.enabled) 10526ad8c632SSudarsana Reddy Kalluru *pfc |= DCBX_PFC_ENABLED_MASK; 10536ad8c632SSudarsana Reddy Kalluru else 10546ad8c632SSudarsana Reddy Kalluru *pfc &= ~DCBX_PFC_ENABLED_MASK; 10556ad8c632SSudarsana Reddy Kalluru 10566ad8c632SSudarsana Reddy Kalluru *pfc &= ~DCBX_PFC_CAPS_MASK; 10576ad8c632SSudarsana Reddy Kalluru *pfc |= (u32)p_params->pfc.max_tc << DCBX_PFC_CAPS_SHIFT; 10586ad8c632SSudarsana Reddy Kalluru 10596ad8c632SSudarsana Reddy Kalluru for (i = 0; i < QED_MAX_PFC_PRIORITIES; i++) 10606ad8c632SSudarsana Reddy Kalluru if (p_params->pfc.prio[i]) 10616ad8c632SSudarsana Reddy Kalluru pfc_map |= BIT(i); 10626ad8c632SSudarsana Reddy Kalluru 1063c5e801daSSudarsana Reddy Kalluru *pfc &= ~DCBX_PFC_PRI_EN_BITMAP_MASK; 10646ad8c632SSudarsana Reddy Kalluru *pfc |= (pfc_map << DCBX_PFC_PRI_EN_BITMAP_SHIFT); 10656ad8c632SSudarsana Reddy Kalluru 10666ad8c632SSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, "pfc = 0x%x\n", *pfc); 10676ad8c632SSudarsana Reddy Kalluru } 10686ad8c632SSudarsana Reddy Kalluru 10696ad8c632SSudarsana Reddy Kalluru static void 10706ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_ets_data(struct qed_hwfn *p_hwfn, 10716ad8c632SSudarsana Reddy Kalluru struct dcbx_ets_feature *p_ets, 10726ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_params *p_params) 10736ad8c632SSudarsana Reddy Kalluru { 10746ad8c632SSudarsana Reddy Kalluru u8 *bw_map, *tsa_map; 10756ad8c632SSudarsana Reddy Kalluru u32 val; 10766ad8c632SSudarsana Reddy Kalluru int i; 10776ad8c632SSudarsana Reddy Kalluru 10786ad8c632SSudarsana Reddy Kalluru if (p_params->ets_willing) 10796ad8c632SSudarsana Reddy Kalluru p_ets->flags |= DCBX_ETS_WILLING_MASK; 10806ad8c632SSudarsana Reddy Kalluru else 10816ad8c632SSudarsana Reddy Kalluru p_ets->flags &= ~DCBX_ETS_WILLING_MASK; 10826ad8c632SSudarsana Reddy Kalluru 10836ad8c632SSudarsana Reddy Kalluru if (p_params->ets_cbs) 10846ad8c632SSudarsana Reddy Kalluru p_ets->flags |= DCBX_ETS_CBS_MASK; 10856ad8c632SSudarsana Reddy Kalluru else 10866ad8c632SSudarsana Reddy Kalluru p_ets->flags &= ~DCBX_ETS_CBS_MASK; 10876ad8c632SSudarsana Reddy Kalluru 10886ad8c632SSudarsana Reddy Kalluru if (p_params->ets_enabled) 10896ad8c632SSudarsana Reddy Kalluru p_ets->flags |= DCBX_ETS_ENABLED_MASK; 10906ad8c632SSudarsana Reddy Kalluru else 10916ad8c632SSudarsana Reddy Kalluru p_ets->flags &= ~DCBX_ETS_ENABLED_MASK; 10926ad8c632SSudarsana Reddy Kalluru 10936ad8c632SSudarsana Reddy Kalluru p_ets->flags &= ~DCBX_ETS_MAX_TCS_MASK; 10946ad8c632SSudarsana Reddy Kalluru p_ets->flags |= (u32)p_params->max_ets_tc << DCBX_ETS_MAX_TCS_SHIFT; 10956ad8c632SSudarsana Reddy Kalluru 10966ad8c632SSudarsana Reddy Kalluru bw_map = (u8 *)&p_ets->tc_bw_tbl[0]; 10976ad8c632SSudarsana Reddy Kalluru tsa_map = (u8 *)&p_ets->tc_tsa_tbl[0]; 10986ad8c632SSudarsana Reddy Kalluru p_ets->pri_tc_tbl[0] = 0; 10996ad8c632SSudarsana Reddy Kalluru for (i = 0; i < QED_MAX_PFC_PRIORITIES; i++) { 11006ad8c632SSudarsana Reddy Kalluru bw_map[i] = p_params->ets_tc_bw_tbl[i]; 11016ad8c632SSudarsana Reddy Kalluru tsa_map[i] = p_params->ets_tc_tsa_tbl[i]; 11026ad8c632SSudarsana Reddy Kalluru /* Copy the priority value to the corresponding 4 bits in the 11036ad8c632SSudarsana Reddy Kalluru * traffic class table. 11046ad8c632SSudarsana Reddy Kalluru */ 11056ad8c632SSudarsana Reddy Kalluru val = (((u32)p_params->ets_pri_tc_tbl[i]) << ((7 - i) * 4)); 11066ad8c632SSudarsana Reddy Kalluru p_ets->pri_tc_tbl[0] |= val; 11076ad8c632SSudarsana Reddy Kalluru } 11086ad8c632SSudarsana Reddy Kalluru for (i = 0; i < 2; i++) { 11096ad8c632SSudarsana Reddy Kalluru p_ets->tc_bw_tbl[i] = cpu_to_be32(p_ets->tc_bw_tbl[i]); 11106ad8c632SSudarsana Reddy Kalluru p_ets->tc_tsa_tbl[i] = cpu_to_be32(p_ets->tc_tsa_tbl[i]); 11116ad8c632SSudarsana Reddy Kalluru } 11126ad8c632SSudarsana Reddy Kalluru } 11136ad8c632SSudarsana Reddy Kalluru 11146ad8c632SSudarsana Reddy Kalluru static void 11156ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_app_data(struct qed_hwfn *p_hwfn, 11166ad8c632SSudarsana Reddy Kalluru struct dcbx_app_priority_feature *p_app, 111759bcb797SSudarsana Reddy Kalluru struct qed_dcbx_params *p_params, bool ieee) 11186ad8c632SSudarsana Reddy Kalluru { 11196ad8c632SSudarsana Reddy Kalluru u32 *entry; 11206ad8c632SSudarsana Reddy Kalluru int i; 11216ad8c632SSudarsana Reddy Kalluru 11226ad8c632SSudarsana Reddy Kalluru if (p_params->app_willing) 11236ad8c632SSudarsana Reddy Kalluru p_app->flags |= DCBX_APP_WILLING_MASK; 11246ad8c632SSudarsana Reddy Kalluru else 11256ad8c632SSudarsana Reddy Kalluru p_app->flags &= ~DCBX_APP_WILLING_MASK; 11266ad8c632SSudarsana Reddy Kalluru 11276ad8c632SSudarsana Reddy Kalluru if (p_params->app_valid) 11286ad8c632SSudarsana Reddy Kalluru p_app->flags |= DCBX_APP_ENABLED_MASK; 11296ad8c632SSudarsana Reddy Kalluru else 11306ad8c632SSudarsana Reddy Kalluru p_app->flags &= ~DCBX_APP_ENABLED_MASK; 11316ad8c632SSudarsana Reddy Kalluru 11326ad8c632SSudarsana Reddy Kalluru p_app->flags &= ~DCBX_APP_NUM_ENTRIES_MASK; 11336ad8c632SSudarsana Reddy Kalluru p_app->flags |= (u32)p_params->num_app_entries << 11346ad8c632SSudarsana Reddy Kalluru DCBX_APP_NUM_ENTRIES_SHIFT; 11356ad8c632SSudarsana Reddy Kalluru 11366ad8c632SSudarsana Reddy Kalluru for (i = 0; i < DCBX_MAX_APP_PROTOCOL; i++) { 11376ad8c632SSudarsana Reddy Kalluru entry = &p_app->app_pri_tbl[i].entry; 1138c5e801daSSudarsana Reddy Kalluru *entry = 0; 113959bcb797SSudarsana Reddy Kalluru if (ieee) { 11405ec5dfa4SSudarsana Reddy Kalluru *entry &= ~(DCBX_APP_SF_IEEE_MASK | DCBX_APP_SF_MASK); 114159bcb797SSudarsana Reddy Kalluru switch (p_params->app_entry[i].sf_ieee) { 114259bcb797SSudarsana Reddy Kalluru case QED_DCBX_SF_IEEE_ETHTYPE: 114359bcb797SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_IEEE_ETHTYPE << 114459bcb797SSudarsana Reddy Kalluru DCBX_APP_SF_IEEE_SHIFT); 11455ec5dfa4SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_ETHTYPE << 11465ec5dfa4SSudarsana Reddy Kalluru DCBX_APP_SF_SHIFT); 114759bcb797SSudarsana Reddy Kalluru break; 114859bcb797SSudarsana Reddy Kalluru case QED_DCBX_SF_IEEE_TCP_PORT: 114959bcb797SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_IEEE_TCP_PORT << 115059bcb797SSudarsana Reddy Kalluru DCBX_APP_SF_IEEE_SHIFT); 11515ec5dfa4SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_PORT << 11525ec5dfa4SSudarsana Reddy Kalluru DCBX_APP_SF_SHIFT); 115359bcb797SSudarsana Reddy Kalluru break; 115459bcb797SSudarsana Reddy Kalluru case QED_DCBX_SF_IEEE_UDP_PORT: 115559bcb797SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_IEEE_UDP_PORT << 115659bcb797SSudarsana Reddy Kalluru DCBX_APP_SF_IEEE_SHIFT); 11575ec5dfa4SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_PORT << 11585ec5dfa4SSudarsana Reddy Kalluru DCBX_APP_SF_SHIFT); 115959bcb797SSudarsana Reddy Kalluru break; 116059bcb797SSudarsana Reddy Kalluru case QED_DCBX_SF_IEEE_TCP_UDP_PORT: 116159bcb797SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_IEEE_TCP_UDP_PORT << 116259bcb797SSudarsana Reddy Kalluru DCBX_APP_SF_IEEE_SHIFT); 11635ec5dfa4SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_PORT << 11645ec5dfa4SSudarsana Reddy Kalluru DCBX_APP_SF_SHIFT); 116559bcb797SSudarsana Reddy Kalluru break; 116659bcb797SSudarsana Reddy Kalluru } 116759bcb797SSudarsana Reddy Kalluru } else { 11686ad8c632SSudarsana Reddy Kalluru *entry &= ~DCBX_APP_SF_MASK; 11696ad8c632SSudarsana Reddy Kalluru if (p_params->app_entry[i].ethtype) 11706ad8c632SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_ETHTYPE << 11716ad8c632SSudarsana Reddy Kalluru DCBX_APP_SF_SHIFT); 11726ad8c632SSudarsana Reddy Kalluru else 117359bcb797SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_PORT << 117459bcb797SSudarsana Reddy Kalluru DCBX_APP_SF_SHIFT); 117559bcb797SSudarsana Reddy Kalluru } 117659bcb797SSudarsana Reddy Kalluru 11776ad8c632SSudarsana Reddy Kalluru *entry &= ~DCBX_APP_PROTOCOL_ID_MASK; 11786ad8c632SSudarsana Reddy Kalluru *entry |= ((u32)p_params->app_entry[i].proto_id << 11796ad8c632SSudarsana Reddy Kalluru DCBX_APP_PROTOCOL_ID_SHIFT); 11806ad8c632SSudarsana Reddy Kalluru *entry &= ~DCBX_APP_PRI_MAP_MASK; 11816ad8c632SSudarsana Reddy Kalluru *entry |= ((u32)(p_params->app_entry[i].prio) << 11826ad8c632SSudarsana Reddy Kalluru DCBX_APP_PRI_MAP_SHIFT); 11836ad8c632SSudarsana Reddy Kalluru } 11846ad8c632SSudarsana Reddy Kalluru } 11856ad8c632SSudarsana Reddy Kalluru 11866ad8c632SSudarsana Reddy Kalluru static void 11876ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_local_params(struct qed_hwfn *p_hwfn, 11886ad8c632SSudarsana Reddy Kalluru struct dcbx_local_params *local_admin, 11896ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_set *params) 11906ad8c632SSudarsana Reddy Kalluru { 119159bcb797SSudarsana Reddy Kalluru bool ieee = false; 119259bcb797SSudarsana Reddy Kalluru 11936ad8c632SSudarsana Reddy Kalluru local_admin->flags = 0; 11946ad8c632SSudarsana Reddy Kalluru memcpy(&local_admin->features, 11956ad8c632SSudarsana Reddy Kalluru &p_hwfn->p_dcbx_info->operational.features, 11966ad8c632SSudarsana Reddy Kalluru sizeof(local_admin->features)); 11976ad8c632SSudarsana Reddy Kalluru 119859bcb797SSudarsana Reddy Kalluru if (params->enabled) { 11996ad8c632SSudarsana Reddy Kalluru local_admin->config = params->ver_num; 120059bcb797SSudarsana Reddy Kalluru ieee = !!(params->ver_num & DCBX_CONFIG_VERSION_IEEE); 120159bcb797SSudarsana Reddy Kalluru } else { 12026ad8c632SSudarsana Reddy Kalluru local_admin->config = DCBX_CONFIG_VERSION_DISABLED; 120359bcb797SSudarsana Reddy Kalluru } 12046ad8c632SSudarsana Reddy Kalluru 1205dfbeb85fSsudarsana.kalluru@cavium.com DP_VERBOSE(p_hwfn, QED_MSG_DCB, "Dcbx version = %d\n", 1206dfbeb85fSsudarsana.kalluru@cavium.com local_admin->config); 1207dfbeb85fSsudarsana.kalluru@cavium.com 12086ad8c632SSudarsana Reddy Kalluru if (params->override_flags & QED_DCBX_OVERRIDE_PFC_CFG) 12096ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_pfc_data(p_hwfn, &local_admin->features.pfc, 12106ad8c632SSudarsana Reddy Kalluru ¶ms->config.params); 12116ad8c632SSudarsana Reddy Kalluru 12126ad8c632SSudarsana Reddy Kalluru if (params->override_flags & QED_DCBX_OVERRIDE_ETS_CFG) 12136ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_ets_data(p_hwfn, &local_admin->features.ets, 12146ad8c632SSudarsana Reddy Kalluru ¶ms->config.params); 12156ad8c632SSudarsana Reddy Kalluru 12166ad8c632SSudarsana Reddy Kalluru if (params->override_flags & QED_DCBX_OVERRIDE_APP_CFG) 12176ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_app_data(p_hwfn, &local_admin->features.app, 121859bcb797SSudarsana Reddy Kalluru ¶ms->config.params, ieee); 12196ad8c632SSudarsana Reddy Kalluru } 12206ad8c632SSudarsana Reddy Kalluru 12216ad8c632SSudarsana Reddy Kalluru int qed_dcbx_config_params(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, 12226ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_set *params, bool hw_commit) 12236ad8c632SSudarsana Reddy Kalluru { 12246ad8c632SSudarsana Reddy Kalluru struct dcbx_local_params local_admin; 12256ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_mib_meta_data data; 12266ad8c632SSudarsana Reddy Kalluru u32 resp = 0, param = 0; 12276ad8c632SSudarsana Reddy Kalluru int rc = 0; 12286ad8c632SSudarsana Reddy Kalluru 12296ad8c632SSudarsana Reddy Kalluru if (!hw_commit) { 12306ad8c632SSudarsana Reddy Kalluru memcpy(&p_hwfn->p_dcbx_info->set, params, 12316ad8c632SSudarsana Reddy Kalluru sizeof(struct qed_dcbx_set)); 12326ad8c632SSudarsana Reddy Kalluru return 0; 12336ad8c632SSudarsana Reddy Kalluru } 12346ad8c632SSudarsana Reddy Kalluru 12356ad8c632SSudarsana Reddy Kalluru /* clear set-parmas cache */ 12366ad8c632SSudarsana Reddy Kalluru memset(&p_hwfn->p_dcbx_info->set, 0, sizeof(p_hwfn->p_dcbx_info->set)); 12376ad8c632SSudarsana Reddy Kalluru 12386ad8c632SSudarsana Reddy Kalluru memset(&local_admin, 0, sizeof(local_admin)); 12396ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_local_params(p_hwfn, &local_admin, params); 12406ad8c632SSudarsana Reddy Kalluru 12416ad8c632SSudarsana Reddy Kalluru data.addr = p_hwfn->mcp_info->port_addr + 12426ad8c632SSudarsana Reddy Kalluru offsetof(struct public_port, local_admin_dcbx_mib); 12436ad8c632SSudarsana Reddy Kalluru data.local_admin = &local_admin; 12446ad8c632SSudarsana Reddy Kalluru data.size = sizeof(struct dcbx_local_params); 12456ad8c632SSudarsana Reddy Kalluru qed_memcpy_to(p_hwfn, p_ptt, data.addr, data.local_admin, data.size); 12466ad8c632SSudarsana Reddy Kalluru 12476ad8c632SSudarsana Reddy Kalluru rc = qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_SET_DCBX, 12486ad8c632SSudarsana Reddy Kalluru 1 << DRV_MB_PARAM_LLDP_SEND_SHIFT, &resp, ¶m); 12496ad8c632SSudarsana Reddy Kalluru if (rc) 12506ad8c632SSudarsana Reddy Kalluru DP_NOTICE(p_hwfn, "Failed to send DCBX update request\n"); 12516ad8c632SSudarsana Reddy Kalluru 12526ad8c632SSudarsana Reddy Kalluru return rc; 12536ad8c632SSudarsana Reddy Kalluru } 12546ad8c632SSudarsana Reddy Kalluru 12556ad8c632SSudarsana Reddy Kalluru int qed_dcbx_get_config_params(struct qed_hwfn *p_hwfn, 12566ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_set *params) 12576ad8c632SSudarsana Reddy Kalluru { 12586ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 12596ad8c632SSudarsana Reddy Kalluru int rc; 12606ad8c632SSudarsana Reddy Kalluru 12616ad8c632SSudarsana Reddy Kalluru if (p_hwfn->p_dcbx_info->set.config.valid) { 12626ad8c632SSudarsana Reddy Kalluru memcpy(params, &p_hwfn->p_dcbx_info->set, 12636ad8c632SSudarsana Reddy Kalluru sizeof(struct qed_dcbx_set)); 12646ad8c632SSudarsana Reddy Kalluru return 0; 12656ad8c632SSudarsana Reddy Kalluru } 12666ad8c632SSudarsana Reddy Kalluru 1267561ed233SWu Fengguang dcbx_info = kzalloc(sizeof(*dcbx_info), GFP_KERNEL); 12682591c280SJoe Perches if (!dcbx_info) 12696ad8c632SSudarsana Reddy Kalluru return -ENOMEM; 12706ad8c632SSudarsana Reddy Kalluru 12716ad8c632SSudarsana Reddy Kalluru rc = qed_dcbx_query_params(p_hwfn, dcbx_info, QED_DCBX_OPERATIONAL_MIB); 12726ad8c632SSudarsana Reddy Kalluru if (rc) { 12736ad8c632SSudarsana Reddy Kalluru kfree(dcbx_info); 12746ad8c632SSudarsana Reddy Kalluru return rc; 12756ad8c632SSudarsana Reddy Kalluru } 12766ad8c632SSudarsana Reddy Kalluru 12776ad8c632SSudarsana Reddy Kalluru p_hwfn->p_dcbx_info->set.override_flags = 0; 12786ad8c632SSudarsana Reddy Kalluru p_hwfn->p_dcbx_info->set.ver_num = DCBX_CONFIG_VERSION_DISABLED; 12796ad8c632SSudarsana Reddy Kalluru if (dcbx_info->operational.cee) 12806ad8c632SSudarsana Reddy Kalluru p_hwfn->p_dcbx_info->set.ver_num |= DCBX_CONFIG_VERSION_CEE; 12816ad8c632SSudarsana Reddy Kalluru if (dcbx_info->operational.ieee) 12826ad8c632SSudarsana Reddy Kalluru p_hwfn->p_dcbx_info->set.ver_num |= DCBX_CONFIG_VERSION_IEEE; 128349632b58Ssudarsana.kalluru@cavium.com if (dcbx_info->operational.local) 128449632b58Ssudarsana.kalluru@cavium.com p_hwfn->p_dcbx_info->set.ver_num |= DCBX_CONFIG_VERSION_STATIC; 12856ad8c632SSudarsana Reddy Kalluru 12866ad8c632SSudarsana Reddy Kalluru p_hwfn->p_dcbx_info->set.enabled = dcbx_info->operational.enabled; 12876ad8c632SSudarsana Reddy Kalluru memcpy(&p_hwfn->p_dcbx_info->set.config.params, 12886ad8c632SSudarsana Reddy Kalluru &dcbx_info->operational.params, 12896ad8c632SSudarsana Reddy Kalluru sizeof(struct qed_dcbx_admin_params)); 12906ad8c632SSudarsana Reddy Kalluru p_hwfn->p_dcbx_info->set.config.valid = true; 12916ad8c632SSudarsana Reddy Kalluru 12926ad8c632SSudarsana Reddy Kalluru memcpy(params, &p_hwfn->p_dcbx_info->set, sizeof(struct qed_dcbx_set)); 12936ad8c632SSudarsana Reddy Kalluru 12946ad8c632SSudarsana Reddy Kalluru kfree(dcbx_info); 12956ad8c632SSudarsana Reddy Kalluru 12966ad8c632SSudarsana Reddy Kalluru return 0; 12976ad8c632SSudarsana Reddy Kalluru } 1298a1d8d8a5SSudarsana Reddy Kalluru 1299a1d8d8a5SSudarsana Reddy Kalluru static struct qed_dcbx_get *qed_dcbnl_get_dcbx(struct qed_hwfn *hwfn, 1300a1d8d8a5SSudarsana Reddy Kalluru enum qed_mib_read_type type) 1301a1d8d8a5SSudarsana Reddy Kalluru { 1302a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1303a1d8d8a5SSudarsana Reddy Kalluru 1304c61a75acSColin Ian King dcbx_info = kzalloc(sizeof(*dcbx_info), GFP_ATOMIC); 13052591c280SJoe Perches if (!dcbx_info) 1306a1d8d8a5SSudarsana Reddy Kalluru return NULL; 1307a1d8d8a5SSudarsana Reddy Kalluru 1308a1d8d8a5SSudarsana Reddy Kalluru if (qed_dcbx_query_params(hwfn, dcbx_info, type)) { 1309a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1310a1d8d8a5SSudarsana Reddy Kalluru return NULL; 1311a1d8d8a5SSudarsana Reddy Kalluru } 1312a1d8d8a5SSudarsana Reddy Kalluru 1313a1d8d8a5SSudarsana Reddy Kalluru if ((type == QED_DCBX_OPERATIONAL_MIB) && 1314a1d8d8a5SSudarsana Reddy Kalluru !dcbx_info->operational.enabled) { 1315a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "DCBX is not enabled/operational\n"); 1316a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1317a1d8d8a5SSudarsana Reddy Kalluru return NULL; 1318a1d8d8a5SSudarsana Reddy Kalluru } 1319a1d8d8a5SSudarsana Reddy Kalluru 1320a1d8d8a5SSudarsana Reddy Kalluru return dcbx_info; 1321a1d8d8a5SSudarsana Reddy Kalluru } 1322a1d8d8a5SSudarsana Reddy Kalluru 1323a1d8d8a5SSudarsana Reddy Kalluru static u8 qed_dcbnl_getstate(struct qed_dev *cdev) 1324a1d8d8a5SSudarsana Reddy Kalluru { 1325a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1326a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1327a1d8d8a5SSudarsana Reddy Kalluru bool enabled; 1328a1d8d8a5SSudarsana Reddy Kalluru 1329a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 1330a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1331a1d8d8a5SSudarsana Reddy Kalluru return 0; 1332a1d8d8a5SSudarsana Reddy Kalluru 1333a1d8d8a5SSudarsana Reddy Kalluru enabled = dcbx_info->operational.enabled; 1334a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "DCB state = %d\n", enabled); 1335a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1336a1d8d8a5SSudarsana Reddy Kalluru 1337a1d8d8a5SSudarsana Reddy Kalluru return enabled; 1338a1d8d8a5SSudarsana Reddy Kalluru } 1339a1d8d8a5SSudarsana Reddy Kalluru 1340a1d8d8a5SSudarsana Reddy Kalluru static u8 qed_dcbnl_setstate(struct qed_dev *cdev, u8 state) 1341a1d8d8a5SSudarsana Reddy Kalluru { 1342a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1343a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 1344a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 1345a1d8d8a5SSudarsana Reddy Kalluru int rc; 1346a1d8d8a5SSudarsana Reddy Kalluru 1347a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "DCB state = %d\n", state); 1348a1d8d8a5SSudarsana Reddy Kalluru 1349a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 1350a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 1351a1d8d8a5SSudarsana Reddy Kalluru if (rc) 1352a1d8d8a5SSudarsana Reddy Kalluru return 1; 1353a1d8d8a5SSudarsana Reddy Kalluru 1354a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.enabled = !!state; 1355a1d8d8a5SSudarsana Reddy Kalluru 1356a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 1357a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 1358a1d8d8a5SSudarsana Reddy Kalluru return 1; 1359a1d8d8a5SSudarsana Reddy Kalluru 1360a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 1361a1d8d8a5SSudarsana Reddy Kalluru 1362a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 1363a1d8d8a5SSudarsana Reddy Kalluru 1364a1d8d8a5SSudarsana Reddy Kalluru return rc ? 1 : 0; 1365a1d8d8a5SSudarsana Reddy Kalluru } 1366a1d8d8a5SSudarsana Reddy Kalluru 1367a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_getpgtccfgtx(struct qed_dev *cdev, int tc, u8 *prio_type, 1368a1d8d8a5SSudarsana Reddy Kalluru u8 *pgid, u8 *bw_pct, u8 *up_map) 1369a1d8d8a5SSudarsana Reddy Kalluru { 1370a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1371a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1372a1d8d8a5SSudarsana Reddy Kalluru 1373a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "tc = %d\n", tc); 1374a1d8d8a5SSudarsana Reddy Kalluru *prio_type = *pgid = *bw_pct = *up_map = 0; 1375a1d8d8a5SSudarsana Reddy Kalluru if (tc < 0 || tc >= QED_MAX_PFC_PRIORITIES) { 1376a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "Invalid tc %d\n", tc); 1377a1d8d8a5SSudarsana Reddy Kalluru return; 1378a1d8d8a5SSudarsana Reddy Kalluru } 1379a1d8d8a5SSudarsana Reddy Kalluru 1380a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 1381a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1382a1d8d8a5SSudarsana Reddy Kalluru return; 1383a1d8d8a5SSudarsana Reddy Kalluru 1384a1d8d8a5SSudarsana Reddy Kalluru *pgid = dcbx_info->operational.params.ets_pri_tc_tbl[tc]; 1385a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1386a1d8d8a5SSudarsana Reddy Kalluru } 1387a1d8d8a5SSudarsana Reddy Kalluru 1388a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_getpgbwgcfgtx(struct qed_dev *cdev, int pgid, u8 *bw_pct) 1389a1d8d8a5SSudarsana Reddy Kalluru { 1390a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1391a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1392a1d8d8a5SSudarsana Reddy Kalluru 1393a1d8d8a5SSudarsana Reddy Kalluru *bw_pct = 0; 1394a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "pgid = %d\n", pgid); 1395a1d8d8a5SSudarsana Reddy Kalluru if (pgid < 0 || pgid >= QED_MAX_PFC_PRIORITIES) { 1396a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "Invalid pgid %d\n", pgid); 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 *bw_pct = dcbx_info->operational.params.ets_tc_bw_tbl[pgid]; 1405a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "bw_pct = %d\n", *bw_pct); 1406a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1407a1d8d8a5SSudarsana Reddy Kalluru } 1408a1d8d8a5SSudarsana Reddy Kalluru 1409a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_getpgtccfgrx(struct qed_dev *cdev, int tc, u8 *prio, 1410a1d8d8a5SSudarsana Reddy Kalluru u8 *bwg_id, u8 *bw_pct, u8 *up_map) 1411a1d8d8a5SSudarsana Reddy Kalluru { 1412a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(QED_LEADING_HWFN(cdev), "Rx ETS is not supported\n"); 1413a1d8d8a5SSudarsana Reddy Kalluru *prio = *bwg_id = *bw_pct = *up_map = 0; 1414a1d8d8a5SSudarsana Reddy Kalluru } 1415a1d8d8a5SSudarsana Reddy Kalluru 1416a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_getpgbwgcfgrx(struct qed_dev *cdev, 1417a1d8d8a5SSudarsana Reddy Kalluru int bwg_id, u8 *bw_pct) 1418a1d8d8a5SSudarsana Reddy Kalluru { 1419a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(QED_LEADING_HWFN(cdev), "Rx ETS is not supported\n"); 1420a1d8d8a5SSudarsana Reddy Kalluru *bw_pct = 0; 1421a1d8d8a5SSudarsana Reddy Kalluru } 1422a1d8d8a5SSudarsana Reddy Kalluru 1423a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_getpfccfg(struct qed_dev *cdev, 1424a1d8d8a5SSudarsana Reddy Kalluru int priority, u8 *setting) 1425a1d8d8a5SSudarsana Reddy Kalluru { 1426a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1427a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1428a1d8d8a5SSudarsana Reddy Kalluru 1429a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "priority = %d\n", priority); 1430a1d8d8a5SSudarsana Reddy Kalluru if (priority < 0 || priority >= QED_MAX_PFC_PRIORITIES) { 1431a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "Invalid priority %d\n", priority); 1432a1d8d8a5SSudarsana Reddy Kalluru return; 1433a1d8d8a5SSudarsana Reddy Kalluru } 1434a1d8d8a5SSudarsana Reddy Kalluru 1435a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 1436a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1437a1d8d8a5SSudarsana Reddy Kalluru return; 1438a1d8d8a5SSudarsana Reddy Kalluru 1439a1d8d8a5SSudarsana Reddy Kalluru *setting = dcbx_info->operational.params.pfc.prio[priority]; 1440a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "setting = %d\n", *setting); 1441a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1442a1d8d8a5SSudarsana Reddy Kalluru } 1443a1d8d8a5SSudarsana Reddy Kalluru 1444a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_setpfccfg(struct qed_dev *cdev, int priority, u8 setting) 1445a1d8d8a5SSudarsana Reddy Kalluru { 1446a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1447a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 1448a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 1449a1d8d8a5SSudarsana Reddy Kalluru int rc; 1450a1d8d8a5SSudarsana Reddy Kalluru 1451a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "priority = %d setting = %d\n", 1452a1d8d8a5SSudarsana Reddy Kalluru priority, setting); 1453a1d8d8a5SSudarsana Reddy Kalluru if (priority < 0 || priority >= QED_MAX_PFC_PRIORITIES) { 1454a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "Invalid priority %d\n", priority); 1455a1d8d8a5SSudarsana Reddy Kalluru return; 1456a1d8d8a5SSudarsana Reddy Kalluru } 1457a1d8d8a5SSudarsana Reddy Kalluru 1458a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 1459a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 1460a1d8d8a5SSudarsana Reddy Kalluru if (rc) 1461a1d8d8a5SSudarsana Reddy Kalluru return; 1462a1d8d8a5SSudarsana Reddy Kalluru 1463a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_PFC_CFG; 1464a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.pfc.prio[priority] = !!setting; 1465a1d8d8a5SSudarsana Reddy Kalluru 1466a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 1467a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 1468a1d8d8a5SSudarsana Reddy Kalluru return; 1469a1d8d8a5SSudarsana Reddy Kalluru 1470a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 1471a1d8d8a5SSudarsana Reddy Kalluru 1472a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 1473a1d8d8a5SSudarsana Reddy Kalluru } 1474a1d8d8a5SSudarsana Reddy Kalluru 1475a1d8d8a5SSudarsana Reddy Kalluru static u8 qed_dcbnl_getcap(struct qed_dev *cdev, int capid, u8 *cap) 1476a1d8d8a5SSudarsana Reddy Kalluru { 1477a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1478a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1479a1d8d8a5SSudarsana Reddy Kalluru int rc = 0; 1480a1d8d8a5SSudarsana Reddy Kalluru 1481a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "capid = %d\n", capid); 1482a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 1483a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1484a1d8d8a5SSudarsana Reddy Kalluru return 1; 1485a1d8d8a5SSudarsana Reddy Kalluru 1486a1d8d8a5SSudarsana Reddy Kalluru switch (capid) { 1487a1d8d8a5SSudarsana Reddy Kalluru case DCB_CAP_ATTR_PG: 1488a1d8d8a5SSudarsana Reddy Kalluru case DCB_CAP_ATTR_PFC: 1489a1d8d8a5SSudarsana Reddy Kalluru case DCB_CAP_ATTR_UP2TC: 1490a1d8d8a5SSudarsana Reddy Kalluru case DCB_CAP_ATTR_GSP: 1491a1d8d8a5SSudarsana Reddy Kalluru *cap = true; 1492a1d8d8a5SSudarsana Reddy Kalluru break; 1493a1d8d8a5SSudarsana Reddy Kalluru case DCB_CAP_ATTR_PG_TCS: 1494a1d8d8a5SSudarsana Reddy Kalluru case DCB_CAP_ATTR_PFC_TCS: 1495a1d8d8a5SSudarsana Reddy Kalluru *cap = 0x80; 1496a1d8d8a5SSudarsana Reddy Kalluru break; 1497a1d8d8a5SSudarsana Reddy Kalluru case DCB_CAP_ATTR_DCBX: 1498ff54d5cdSSudarsana Reddy Kalluru *cap = (DCB_CAP_DCBX_VER_CEE | DCB_CAP_DCBX_VER_IEEE | 1499ff54d5cdSSudarsana Reddy Kalluru DCB_CAP_DCBX_STATIC); 1500a1d8d8a5SSudarsana Reddy Kalluru break; 1501a1d8d8a5SSudarsana Reddy Kalluru default: 1502a1d8d8a5SSudarsana Reddy Kalluru *cap = false; 1503a1d8d8a5SSudarsana Reddy Kalluru rc = 1; 1504a1d8d8a5SSudarsana Reddy Kalluru } 1505a1d8d8a5SSudarsana Reddy Kalluru 1506a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "id = %d caps = %d\n", capid, *cap); 1507a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1508a1d8d8a5SSudarsana Reddy Kalluru 1509a1d8d8a5SSudarsana Reddy Kalluru return rc; 1510a1d8d8a5SSudarsana Reddy Kalluru } 1511a1d8d8a5SSudarsana Reddy Kalluru 1512a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_getnumtcs(struct qed_dev *cdev, int tcid, u8 *num) 1513a1d8d8a5SSudarsana Reddy Kalluru { 1514a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1515a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1516a1d8d8a5SSudarsana Reddy Kalluru int rc = 0; 1517a1d8d8a5SSudarsana Reddy Kalluru 1518a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "tcid = %d\n", tcid); 1519a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 1520a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1521a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 1522a1d8d8a5SSudarsana Reddy Kalluru 1523a1d8d8a5SSudarsana Reddy Kalluru switch (tcid) { 1524a1d8d8a5SSudarsana Reddy Kalluru case DCB_NUMTCS_ATTR_PG: 1525a1d8d8a5SSudarsana Reddy Kalluru *num = dcbx_info->operational.params.max_ets_tc; 1526a1d8d8a5SSudarsana Reddy Kalluru break; 1527a1d8d8a5SSudarsana Reddy Kalluru case DCB_NUMTCS_ATTR_PFC: 1528a1d8d8a5SSudarsana Reddy Kalluru *num = dcbx_info->operational.params.pfc.max_tc; 1529a1d8d8a5SSudarsana Reddy Kalluru break; 1530a1d8d8a5SSudarsana Reddy Kalluru default: 1531a1d8d8a5SSudarsana Reddy Kalluru rc = -EINVAL; 1532a1d8d8a5SSudarsana Reddy Kalluru } 1533a1d8d8a5SSudarsana Reddy Kalluru 1534a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1535a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "numtcs = %d\n", *num); 1536a1d8d8a5SSudarsana Reddy Kalluru 1537a1d8d8a5SSudarsana Reddy Kalluru return rc; 1538a1d8d8a5SSudarsana Reddy Kalluru } 1539a1d8d8a5SSudarsana Reddy Kalluru 1540a1d8d8a5SSudarsana Reddy Kalluru static u8 qed_dcbnl_getpfcstate(struct qed_dev *cdev) 1541a1d8d8a5SSudarsana Reddy Kalluru { 1542a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1543a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1544a1d8d8a5SSudarsana Reddy Kalluru bool enabled; 1545a1d8d8a5SSudarsana Reddy Kalluru 1546a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 1547a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1548a1d8d8a5SSudarsana Reddy Kalluru return 0; 1549a1d8d8a5SSudarsana Reddy Kalluru 1550a1d8d8a5SSudarsana Reddy Kalluru enabled = dcbx_info->operational.params.pfc.enabled; 1551a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "pfc state = %d\n", enabled); 1552a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1553a1d8d8a5SSudarsana Reddy Kalluru 1554a1d8d8a5SSudarsana Reddy Kalluru return enabled; 1555a1d8d8a5SSudarsana Reddy Kalluru } 1556a1d8d8a5SSudarsana Reddy Kalluru 1557a1d8d8a5SSudarsana Reddy Kalluru static u8 qed_dcbnl_getdcbx(struct qed_dev *cdev) 1558a1d8d8a5SSudarsana Reddy Kalluru { 1559a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1560a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1561a1d8d8a5SSudarsana Reddy Kalluru u8 mode = 0; 1562a1d8d8a5SSudarsana Reddy Kalluru 1563a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 1564a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1565a1d8d8a5SSudarsana Reddy Kalluru return 0; 1566a1d8d8a5SSudarsana Reddy Kalluru 1567a1d8d8a5SSudarsana Reddy Kalluru if (dcbx_info->operational.ieee) 1568a1d8d8a5SSudarsana Reddy Kalluru mode |= DCB_CAP_DCBX_VER_IEEE; 1569a1d8d8a5SSudarsana Reddy Kalluru if (dcbx_info->operational.cee) 1570a1d8d8a5SSudarsana Reddy Kalluru mode |= DCB_CAP_DCBX_VER_CEE; 157105930d18SSudarsana Reddy Kalluru if (dcbx_info->operational.local) 157205930d18SSudarsana Reddy Kalluru mode |= DCB_CAP_DCBX_STATIC; 1573a1d8d8a5SSudarsana Reddy Kalluru 1574a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "dcb mode = %d\n", mode); 1575a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1576a1d8d8a5SSudarsana Reddy Kalluru 1577a1d8d8a5SSudarsana Reddy Kalluru return mode; 1578a1d8d8a5SSudarsana Reddy Kalluru } 1579a1d8d8a5SSudarsana Reddy Kalluru 1580a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_setpgtccfgtx(struct qed_dev *cdev, 1581a1d8d8a5SSudarsana Reddy Kalluru int tc, 1582a1d8d8a5SSudarsana Reddy Kalluru u8 pri_type, u8 pgid, u8 bw_pct, u8 up_map) 1583a1d8d8a5SSudarsana Reddy Kalluru { 1584a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1585a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 1586a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 1587a1d8d8a5SSudarsana Reddy Kalluru int rc; 1588a1d8d8a5SSudarsana Reddy Kalluru 1589a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, 1590a1d8d8a5SSudarsana Reddy Kalluru "tc = %d pri_type = %d pgid = %d bw_pct = %d up_map = %d\n", 1591a1d8d8a5SSudarsana Reddy Kalluru tc, pri_type, pgid, bw_pct, up_map); 1592a1d8d8a5SSudarsana Reddy Kalluru 1593a1d8d8a5SSudarsana Reddy Kalluru if (tc < 0 || tc >= QED_MAX_PFC_PRIORITIES) { 1594a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "Invalid tc %d\n", tc); 1595a1d8d8a5SSudarsana Reddy Kalluru return; 1596a1d8d8a5SSudarsana Reddy Kalluru } 1597a1d8d8a5SSudarsana Reddy Kalluru 1598a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 1599a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 1600a1d8d8a5SSudarsana Reddy Kalluru if (rc) 1601a1d8d8a5SSudarsana Reddy Kalluru return; 1602a1d8d8a5SSudarsana Reddy Kalluru 1603a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_ETS_CFG; 1604a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.ets_pri_tc_tbl[tc] = pgid; 1605a1d8d8a5SSudarsana Reddy Kalluru 1606a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 1607a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 1608a1d8d8a5SSudarsana Reddy Kalluru return; 1609a1d8d8a5SSudarsana Reddy Kalluru 1610a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 1611a1d8d8a5SSudarsana Reddy Kalluru 1612a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 1613a1d8d8a5SSudarsana Reddy Kalluru } 1614a1d8d8a5SSudarsana Reddy Kalluru 1615a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_setpgtccfgrx(struct qed_dev *cdev, int prio, 1616a1d8d8a5SSudarsana Reddy Kalluru u8 pri_type, u8 pgid, u8 bw_pct, u8 up_map) 1617a1d8d8a5SSudarsana Reddy Kalluru { 1618a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(QED_LEADING_HWFN(cdev), "Rx ETS is not supported\n"); 1619a1d8d8a5SSudarsana Reddy Kalluru } 1620a1d8d8a5SSudarsana Reddy Kalluru 1621a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_setpgbwgcfgtx(struct qed_dev *cdev, int pgid, u8 bw_pct) 1622a1d8d8a5SSudarsana Reddy Kalluru { 1623a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1624a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 1625a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 1626a1d8d8a5SSudarsana Reddy Kalluru int rc; 1627a1d8d8a5SSudarsana Reddy Kalluru 1628a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "pgid = %d bw_pct = %d\n", pgid, bw_pct); 1629a1d8d8a5SSudarsana Reddy Kalluru if (pgid < 0 || pgid >= QED_MAX_PFC_PRIORITIES) { 1630a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "Invalid pgid %d\n", pgid); 1631a1d8d8a5SSudarsana Reddy Kalluru return; 1632a1d8d8a5SSudarsana Reddy Kalluru } 1633a1d8d8a5SSudarsana Reddy Kalluru 1634a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 1635a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 1636a1d8d8a5SSudarsana Reddy Kalluru if (rc) 1637a1d8d8a5SSudarsana Reddy Kalluru return; 1638a1d8d8a5SSudarsana Reddy Kalluru 1639a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_ETS_CFG; 1640a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.ets_tc_bw_tbl[pgid] = bw_pct; 1641a1d8d8a5SSudarsana Reddy Kalluru 1642a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 1643a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 1644a1d8d8a5SSudarsana Reddy Kalluru return; 1645a1d8d8a5SSudarsana Reddy Kalluru 1646a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 1647a1d8d8a5SSudarsana Reddy Kalluru 1648a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 1649a1d8d8a5SSudarsana Reddy Kalluru } 1650a1d8d8a5SSudarsana Reddy Kalluru 1651a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_setpgbwgcfgrx(struct qed_dev *cdev, int pgid, u8 bw_pct) 1652a1d8d8a5SSudarsana Reddy Kalluru { 1653a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(QED_LEADING_HWFN(cdev), "Rx ETS is not supported\n"); 1654a1d8d8a5SSudarsana Reddy Kalluru } 1655a1d8d8a5SSudarsana Reddy Kalluru 1656a1d8d8a5SSudarsana Reddy Kalluru static u8 qed_dcbnl_setall(struct qed_dev *cdev) 1657a1d8d8a5SSudarsana Reddy Kalluru { 1658a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1659a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 1660a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 1661a1d8d8a5SSudarsana Reddy Kalluru int rc; 1662a1d8d8a5SSudarsana Reddy Kalluru 1663a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 1664a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 1665a1d8d8a5SSudarsana Reddy Kalluru if (rc) 1666a1d8d8a5SSudarsana Reddy Kalluru return 1; 1667a1d8d8a5SSudarsana Reddy Kalluru 1668a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 1669a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 1670a1d8d8a5SSudarsana Reddy Kalluru return 1; 1671a1d8d8a5SSudarsana Reddy Kalluru 1672a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 1); 1673a1d8d8a5SSudarsana Reddy Kalluru 1674a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 1675a1d8d8a5SSudarsana Reddy Kalluru 1676a1d8d8a5SSudarsana Reddy Kalluru return rc; 1677a1d8d8a5SSudarsana Reddy Kalluru } 1678a1d8d8a5SSudarsana Reddy Kalluru 1679a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_setnumtcs(struct qed_dev *cdev, int tcid, u8 num) 1680a1d8d8a5SSudarsana Reddy Kalluru { 1681a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1682a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 1683a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 1684a1d8d8a5SSudarsana Reddy Kalluru int rc; 1685a1d8d8a5SSudarsana Reddy Kalluru 1686a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "tcid = %d num = %d\n", tcid, num); 1687a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 1688a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 1689a1d8d8a5SSudarsana Reddy Kalluru if (rc) 1690a1d8d8a5SSudarsana Reddy Kalluru return 1; 1691a1d8d8a5SSudarsana Reddy Kalluru 1692a1d8d8a5SSudarsana Reddy Kalluru switch (tcid) { 1693a1d8d8a5SSudarsana Reddy Kalluru case DCB_NUMTCS_ATTR_PG: 1694a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_ETS_CFG; 1695a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.max_ets_tc = num; 1696a1d8d8a5SSudarsana Reddy Kalluru break; 1697a1d8d8a5SSudarsana Reddy Kalluru case DCB_NUMTCS_ATTR_PFC: 1698a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_PFC_CFG; 1699a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.pfc.max_tc = num; 1700a1d8d8a5SSudarsana Reddy Kalluru break; 1701a1d8d8a5SSudarsana Reddy Kalluru default: 1702a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "Invalid tcid %d\n", tcid); 1703a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 1704a1d8d8a5SSudarsana Reddy Kalluru } 1705a1d8d8a5SSudarsana Reddy Kalluru 1706a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 1707a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 1708a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 1709a1d8d8a5SSudarsana Reddy Kalluru 1710a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 1711a1d8d8a5SSudarsana Reddy Kalluru 1712a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 1713a1d8d8a5SSudarsana Reddy Kalluru 1714a1d8d8a5SSudarsana Reddy Kalluru return 0; 1715a1d8d8a5SSudarsana Reddy Kalluru } 1716a1d8d8a5SSudarsana Reddy Kalluru 1717a1d8d8a5SSudarsana Reddy Kalluru static void qed_dcbnl_setpfcstate(struct qed_dev *cdev, u8 state) 1718a1d8d8a5SSudarsana Reddy Kalluru { 1719a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1720a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 1721a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 1722a1d8d8a5SSudarsana Reddy Kalluru int rc; 1723a1d8d8a5SSudarsana Reddy Kalluru 1724a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "new state = %d\n", state); 1725a1d8d8a5SSudarsana Reddy Kalluru 1726a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 1727a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 1728a1d8d8a5SSudarsana Reddy Kalluru if (rc) 1729a1d8d8a5SSudarsana Reddy Kalluru return; 1730a1d8d8a5SSudarsana Reddy Kalluru 1731a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_PFC_CFG; 1732a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.pfc.enabled = !!state; 1733a1d8d8a5SSudarsana Reddy Kalluru 1734a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 1735a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 1736a1d8d8a5SSudarsana Reddy Kalluru return; 1737a1d8d8a5SSudarsana Reddy Kalluru 1738a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 1739a1d8d8a5SSudarsana Reddy Kalluru 1740a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 1741a1d8d8a5SSudarsana Reddy Kalluru } 1742a1d8d8a5SSudarsana Reddy Kalluru 1743a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_getapp(struct qed_dev *cdev, u8 idtype, u16 idval) 1744a1d8d8a5SSudarsana Reddy Kalluru { 1745a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1746a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1747a1d8d8a5SSudarsana Reddy Kalluru struct qed_app_entry *entry; 1748a1d8d8a5SSudarsana Reddy Kalluru bool ethtype; 1749a1d8d8a5SSudarsana Reddy Kalluru u8 prio = 0; 1750a1d8d8a5SSudarsana Reddy Kalluru int i; 1751a1d8d8a5SSudarsana Reddy Kalluru 1752a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 1753a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1754a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 1755a1d8d8a5SSudarsana Reddy Kalluru 1756a1d8d8a5SSudarsana Reddy Kalluru ethtype = !!(idtype == DCB_APP_IDTYPE_ETHTYPE); 1757a1d8d8a5SSudarsana Reddy Kalluru for (i = 0; i < QED_DCBX_MAX_APP_PROTOCOL; i++) { 1758a1d8d8a5SSudarsana Reddy Kalluru entry = &dcbx_info->operational.params.app_entry[i]; 1759a1d8d8a5SSudarsana Reddy Kalluru if ((entry->ethtype == ethtype) && (entry->proto_id == idval)) { 1760a1d8d8a5SSudarsana Reddy Kalluru prio = entry->prio; 1761a1d8d8a5SSudarsana Reddy Kalluru break; 1762a1d8d8a5SSudarsana Reddy Kalluru } 1763a1d8d8a5SSudarsana Reddy Kalluru } 1764a1d8d8a5SSudarsana Reddy Kalluru 1765a1d8d8a5SSudarsana Reddy Kalluru if (i == QED_DCBX_MAX_APP_PROTOCOL) { 1766a1d8d8a5SSudarsana Reddy Kalluru DP_ERR(cdev, "App entry (%d, %d) not found\n", idtype, idval); 1767a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1768a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 1769a1d8d8a5SSudarsana Reddy Kalluru } 1770a1d8d8a5SSudarsana Reddy Kalluru 1771a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1772a1d8d8a5SSudarsana Reddy Kalluru 1773a1d8d8a5SSudarsana Reddy Kalluru return prio; 1774a1d8d8a5SSudarsana Reddy Kalluru } 1775a1d8d8a5SSudarsana Reddy Kalluru 1776a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_setapp(struct qed_dev *cdev, 1777a1d8d8a5SSudarsana Reddy Kalluru u8 idtype, u16 idval, u8 pri_map) 1778a1d8d8a5SSudarsana Reddy Kalluru { 1779a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1780a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 1781a1d8d8a5SSudarsana Reddy Kalluru struct qed_app_entry *entry; 1782a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 1783a1d8d8a5SSudarsana Reddy Kalluru bool ethtype; 1784a1d8d8a5SSudarsana Reddy Kalluru int rc, i; 1785a1d8d8a5SSudarsana Reddy Kalluru 1786a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 1787a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 1788a1d8d8a5SSudarsana Reddy Kalluru if (rc) 1789a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 1790a1d8d8a5SSudarsana Reddy Kalluru 1791a1d8d8a5SSudarsana Reddy Kalluru ethtype = !!(idtype == DCB_APP_IDTYPE_ETHTYPE); 1792a1d8d8a5SSudarsana Reddy Kalluru for (i = 0; i < QED_DCBX_MAX_APP_PROTOCOL; i++) { 1793a1d8d8a5SSudarsana Reddy Kalluru entry = &dcbx_set.config.params.app_entry[i]; 1794a1d8d8a5SSudarsana Reddy Kalluru if ((entry->ethtype == ethtype) && (entry->proto_id == idval)) 1795a1d8d8a5SSudarsana Reddy Kalluru break; 1796a1d8d8a5SSudarsana Reddy Kalluru /* First empty slot */ 17971d7406ceSSudarsana Reddy Kalluru if (!entry->proto_id) { 17981d7406ceSSudarsana Reddy Kalluru dcbx_set.config.params.num_app_entries++; 1799a1d8d8a5SSudarsana Reddy Kalluru break; 1800a1d8d8a5SSudarsana Reddy Kalluru } 18011d7406ceSSudarsana Reddy Kalluru } 1802a1d8d8a5SSudarsana Reddy Kalluru 1803a1d8d8a5SSudarsana Reddy Kalluru if (i == QED_DCBX_MAX_APP_PROTOCOL) { 1804a1d8d8a5SSudarsana Reddy Kalluru DP_ERR(cdev, "App table is full\n"); 1805a1d8d8a5SSudarsana Reddy Kalluru return -EBUSY; 1806a1d8d8a5SSudarsana Reddy Kalluru } 1807a1d8d8a5SSudarsana Reddy Kalluru 1808a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_APP_CFG; 1809a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.app_entry[i].ethtype = ethtype; 1810a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.app_entry[i].proto_id = idval; 1811a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.app_entry[i].prio = pri_map; 1812a1d8d8a5SSudarsana Reddy Kalluru 1813a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 1814a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 1815a1d8d8a5SSudarsana Reddy Kalluru return -EBUSY; 1816a1d8d8a5SSudarsana Reddy Kalluru 1817a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 1818a1d8d8a5SSudarsana Reddy Kalluru 1819a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 1820a1d8d8a5SSudarsana Reddy Kalluru 1821a1d8d8a5SSudarsana Reddy Kalluru return rc; 1822a1d8d8a5SSudarsana Reddy Kalluru } 1823a1d8d8a5SSudarsana Reddy Kalluru 1824a1d8d8a5SSudarsana Reddy Kalluru static u8 qed_dcbnl_setdcbx(struct qed_dev *cdev, u8 mode) 1825a1d8d8a5SSudarsana Reddy Kalluru { 1826a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1827a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 1828a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 1829a1d8d8a5SSudarsana Reddy Kalluru int rc; 1830a1d8d8a5SSudarsana Reddy Kalluru 1831a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "new mode = %x\n", mode); 1832a1d8d8a5SSudarsana Reddy Kalluru 183349632b58Ssudarsana.kalluru@cavium.com if (!(mode & DCB_CAP_DCBX_VER_IEEE) && 183449632b58Ssudarsana.kalluru@cavium.com !(mode & DCB_CAP_DCBX_VER_CEE) && !(mode & DCB_CAP_DCBX_STATIC)) { 183549632b58Ssudarsana.kalluru@cavium.com DP_INFO(hwfn, "Allowed modes are cee, ieee or static\n"); 1836a1d8d8a5SSudarsana Reddy Kalluru return 1; 1837a1d8d8a5SSudarsana Reddy Kalluru } 1838a1d8d8a5SSudarsana Reddy Kalluru 1839a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 1840a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 1841a1d8d8a5SSudarsana Reddy Kalluru if (rc) 1842a1d8d8a5SSudarsana Reddy Kalluru return 1; 1843a1d8d8a5SSudarsana Reddy Kalluru 1844a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.ver_num = 0; 1845a1d8d8a5SSudarsana Reddy Kalluru if (mode & DCB_CAP_DCBX_VER_CEE) { 1846a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.ver_num |= DCBX_CONFIG_VERSION_CEE; 1847a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.enabled = true; 1848a1d8d8a5SSudarsana Reddy Kalluru } 1849a1d8d8a5SSudarsana Reddy Kalluru 1850a1d8d8a5SSudarsana Reddy Kalluru if (mode & DCB_CAP_DCBX_VER_IEEE) { 1851a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.ver_num |= DCBX_CONFIG_VERSION_IEEE; 1852a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.enabled = true; 1853a1d8d8a5SSudarsana Reddy Kalluru } 1854a1d8d8a5SSudarsana Reddy Kalluru 185549632b58Ssudarsana.kalluru@cavium.com if (mode & DCB_CAP_DCBX_STATIC) { 185649632b58Ssudarsana.kalluru@cavium.com dcbx_set.ver_num |= DCBX_CONFIG_VERSION_STATIC; 185749632b58Ssudarsana.kalluru@cavium.com dcbx_set.enabled = true; 185849632b58Ssudarsana.kalluru@cavium.com } 185949632b58Ssudarsana.kalluru@cavium.com 1860a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 1861a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 1862a1d8d8a5SSudarsana Reddy Kalluru return 1; 1863a1d8d8a5SSudarsana Reddy Kalluru 1864a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 1865a1d8d8a5SSudarsana Reddy Kalluru 1866a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 1867a1d8d8a5SSudarsana Reddy Kalluru 186849632b58Ssudarsana.kalluru@cavium.com return rc; 1869a1d8d8a5SSudarsana Reddy Kalluru } 1870a1d8d8a5SSudarsana Reddy Kalluru 1871a1d8d8a5SSudarsana Reddy Kalluru static u8 qed_dcbnl_getfeatcfg(struct qed_dev *cdev, int featid, u8 *flags) 1872a1d8d8a5SSudarsana Reddy Kalluru { 1873a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1874a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1875a1d8d8a5SSudarsana Reddy Kalluru 1876a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "Feature id = %d\n", featid); 1877a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 1878a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1879a1d8d8a5SSudarsana Reddy Kalluru return 1; 1880a1d8d8a5SSudarsana Reddy Kalluru 1881a1d8d8a5SSudarsana Reddy Kalluru *flags = 0; 1882a1d8d8a5SSudarsana Reddy Kalluru switch (featid) { 1883a1d8d8a5SSudarsana Reddy Kalluru case DCB_FEATCFG_ATTR_PG: 1884a1d8d8a5SSudarsana Reddy Kalluru if (dcbx_info->operational.params.ets_enabled) 1885a1d8d8a5SSudarsana Reddy Kalluru *flags = DCB_FEATCFG_ENABLE; 1886a1d8d8a5SSudarsana Reddy Kalluru else 1887a1d8d8a5SSudarsana Reddy Kalluru *flags = DCB_FEATCFG_ERROR; 1888a1d8d8a5SSudarsana Reddy Kalluru break; 1889a1d8d8a5SSudarsana Reddy Kalluru case DCB_FEATCFG_ATTR_PFC: 1890a1d8d8a5SSudarsana Reddy Kalluru if (dcbx_info->operational.params.pfc.enabled) 1891a1d8d8a5SSudarsana Reddy Kalluru *flags = DCB_FEATCFG_ENABLE; 1892a1d8d8a5SSudarsana Reddy Kalluru else 1893a1d8d8a5SSudarsana Reddy Kalluru *flags = DCB_FEATCFG_ERROR; 1894a1d8d8a5SSudarsana Reddy Kalluru break; 1895a1d8d8a5SSudarsana Reddy Kalluru case DCB_FEATCFG_ATTR_APP: 1896a1d8d8a5SSudarsana Reddy Kalluru if (dcbx_info->operational.params.app_valid) 1897a1d8d8a5SSudarsana Reddy Kalluru *flags = DCB_FEATCFG_ENABLE; 1898a1d8d8a5SSudarsana Reddy Kalluru else 1899a1d8d8a5SSudarsana Reddy Kalluru *flags = DCB_FEATCFG_ERROR; 1900a1d8d8a5SSudarsana Reddy Kalluru break; 1901a1d8d8a5SSudarsana Reddy Kalluru default: 1902a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "Invalid feature-ID %d\n", featid); 1903a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1904a1d8d8a5SSudarsana Reddy Kalluru return 1; 1905a1d8d8a5SSudarsana Reddy Kalluru } 1906a1d8d8a5SSudarsana Reddy Kalluru 1907a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "flags = %d\n", *flags); 1908a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1909a1d8d8a5SSudarsana Reddy Kalluru 1910a1d8d8a5SSudarsana Reddy Kalluru return 0; 1911a1d8d8a5SSudarsana Reddy Kalluru } 1912a1d8d8a5SSudarsana Reddy Kalluru 1913a1d8d8a5SSudarsana Reddy Kalluru static u8 qed_dcbnl_setfeatcfg(struct qed_dev *cdev, int featid, u8 flags) 1914a1d8d8a5SSudarsana Reddy Kalluru { 1915a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1916a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 1917a1d8d8a5SSudarsana Reddy Kalluru bool enabled, willing; 1918a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 1919a1d8d8a5SSudarsana Reddy Kalluru int rc; 1920a1d8d8a5SSudarsana Reddy Kalluru 1921a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "featid = %d flags = %d\n", 1922a1d8d8a5SSudarsana Reddy Kalluru featid, flags); 1923a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 1924a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 1925a1d8d8a5SSudarsana Reddy Kalluru if (rc) 1926a1d8d8a5SSudarsana Reddy Kalluru return 1; 1927a1d8d8a5SSudarsana Reddy Kalluru 1928a1d8d8a5SSudarsana Reddy Kalluru enabled = !!(flags & DCB_FEATCFG_ENABLE); 1929a1d8d8a5SSudarsana Reddy Kalluru willing = !!(flags & DCB_FEATCFG_WILLING); 1930a1d8d8a5SSudarsana Reddy Kalluru switch (featid) { 1931a1d8d8a5SSudarsana Reddy Kalluru case DCB_FEATCFG_ATTR_PG: 1932a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_ETS_CFG; 1933a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.ets_enabled = enabled; 1934a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.ets_willing = willing; 1935a1d8d8a5SSudarsana Reddy Kalluru break; 1936a1d8d8a5SSudarsana Reddy Kalluru case DCB_FEATCFG_ATTR_PFC: 1937a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_PFC_CFG; 1938a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.pfc.enabled = enabled; 1939a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.pfc.willing = willing; 1940a1d8d8a5SSudarsana Reddy Kalluru break; 1941a1d8d8a5SSudarsana Reddy Kalluru case DCB_FEATCFG_ATTR_APP: 1942a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_APP_CFG; 1943a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.app_willing = willing; 1944a1d8d8a5SSudarsana Reddy Kalluru break; 1945a1d8d8a5SSudarsana Reddy Kalluru default: 1946a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "Invalid feature-ID %d\n", featid); 1947a1d8d8a5SSudarsana Reddy Kalluru return 1; 1948a1d8d8a5SSudarsana Reddy Kalluru } 1949a1d8d8a5SSudarsana Reddy Kalluru 1950a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 1951a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 1952a1d8d8a5SSudarsana Reddy Kalluru return 1; 1953a1d8d8a5SSudarsana Reddy Kalluru 1954a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 1955a1d8d8a5SSudarsana Reddy Kalluru 1956a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 1957a1d8d8a5SSudarsana Reddy Kalluru 1958a1d8d8a5SSudarsana Reddy Kalluru return 0; 1959a1d8d8a5SSudarsana Reddy Kalluru } 1960a1d8d8a5SSudarsana Reddy Kalluru 1961a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_peer_getappinfo(struct qed_dev *cdev, 1962a1d8d8a5SSudarsana Reddy Kalluru struct dcb_peer_app_info *info, 1963a1d8d8a5SSudarsana Reddy Kalluru u16 *app_count) 1964a1d8d8a5SSudarsana Reddy Kalluru { 1965a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1966a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1967a1d8d8a5SSudarsana Reddy Kalluru 1968a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_REMOTE_MIB); 1969a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1970a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 1971a1d8d8a5SSudarsana Reddy Kalluru 1972a1d8d8a5SSudarsana Reddy Kalluru info->willing = dcbx_info->remote.params.app_willing; 1973a1d8d8a5SSudarsana Reddy Kalluru info->error = dcbx_info->remote.params.app_error; 1974a1d8d8a5SSudarsana Reddy Kalluru *app_count = dcbx_info->remote.params.num_app_entries; 1975a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 1976a1d8d8a5SSudarsana Reddy Kalluru 1977a1d8d8a5SSudarsana Reddy Kalluru return 0; 1978a1d8d8a5SSudarsana Reddy Kalluru } 1979a1d8d8a5SSudarsana Reddy Kalluru 1980a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_peer_getapptable(struct qed_dev *cdev, 1981a1d8d8a5SSudarsana Reddy Kalluru struct dcb_app *table) 1982a1d8d8a5SSudarsana Reddy Kalluru { 1983a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 1984a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 1985a1d8d8a5SSudarsana Reddy Kalluru int i; 1986a1d8d8a5SSudarsana Reddy Kalluru 1987a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_REMOTE_MIB); 1988a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 1989a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 1990a1d8d8a5SSudarsana Reddy Kalluru 1991a1d8d8a5SSudarsana Reddy Kalluru for (i = 0; i < dcbx_info->remote.params.num_app_entries; i++) { 1992a1d8d8a5SSudarsana Reddy Kalluru if (dcbx_info->remote.params.app_entry[i].ethtype) 1993a1d8d8a5SSudarsana Reddy Kalluru table[i].selector = DCB_APP_IDTYPE_ETHTYPE; 1994a1d8d8a5SSudarsana Reddy Kalluru else 1995a1d8d8a5SSudarsana Reddy Kalluru table[i].selector = DCB_APP_IDTYPE_PORTNUM; 1996a1d8d8a5SSudarsana Reddy Kalluru table[i].priority = dcbx_info->remote.params.app_entry[i].prio; 1997a1d8d8a5SSudarsana Reddy Kalluru table[i].protocol = 1998a1d8d8a5SSudarsana Reddy Kalluru dcbx_info->remote.params.app_entry[i].proto_id; 1999a1d8d8a5SSudarsana Reddy Kalluru } 2000a1d8d8a5SSudarsana Reddy Kalluru 2001a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2002a1d8d8a5SSudarsana Reddy Kalluru 2003a1d8d8a5SSudarsana Reddy Kalluru return 0; 2004a1d8d8a5SSudarsana Reddy Kalluru } 2005a1d8d8a5SSudarsana Reddy Kalluru 2006a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_cee_peer_getpfc(struct qed_dev *cdev, struct cee_pfc *pfc) 2007a1d8d8a5SSudarsana Reddy Kalluru { 2008a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 2009a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 2010a1d8d8a5SSudarsana Reddy Kalluru int i; 2011a1d8d8a5SSudarsana Reddy Kalluru 2012a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_REMOTE_MIB); 2013a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 2014a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2015a1d8d8a5SSudarsana Reddy Kalluru 2016a1d8d8a5SSudarsana Reddy Kalluru for (i = 0; i < QED_MAX_PFC_PRIORITIES; i++) 2017a1d8d8a5SSudarsana Reddy Kalluru if (dcbx_info->remote.params.pfc.prio[i]) 2018a1d8d8a5SSudarsana Reddy Kalluru pfc->pfc_en |= BIT(i); 2019a1d8d8a5SSudarsana Reddy Kalluru 2020a1d8d8a5SSudarsana Reddy Kalluru pfc->tcs_supported = dcbx_info->remote.params.pfc.max_tc; 2021a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "pfc state = %d tcs_supported = %d\n", 2022a1d8d8a5SSudarsana Reddy Kalluru pfc->pfc_en, pfc->tcs_supported); 2023a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2024a1d8d8a5SSudarsana Reddy Kalluru 2025a1d8d8a5SSudarsana Reddy Kalluru return 0; 2026a1d8d8a5SSudarsana Reddy Kalluru } 2027a1d8d8a5SSudarsana Reddy Kalluru 2028a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_cee_peer_getpg(struct qed_dev *cdev, struct cee_pg *pg) 2029a1d8d8a5SSudarsana Reddy Kalluru { 2030a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 2031a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 2032a1d8d8a5SSudarsana Reddy Kalluru int i; 2033a1d8d8a5SSudarsana Reddy Kalluru 2034a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_REMOTE_MIB); 2035a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 2036a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2037a1d8d8a5SSudarsana Reddy Kalluru 2038a1d8d8a5SSudarsana Reddy Kalluru pg->willing = dcbx_info->remote.params.ets_willing; 2039a1d8d8a5SSudarsana Reddy Kalluru for (i = 0; i < QED_MAX_PFC_PRIORITIES; i++) { 2040a1d8d8a5SSudarsana Reddy Kalluru pg->pg_bw[i] = dcbx_info->remote.params.ets_tc_bw_tbl[i]; 2041a1d8d8a5SSudarsana Reddy Kalluru pg->prio_pg[i] = dcbx_info->remote.params.ets_pri_tc_tbl[i]; 2042a1d8d8a5SSudarsana Reddy Kalluru } 2043a1d8d8a5SSudarsana Reddy Kalluru 2044a1d8d8a5SSudarsana Reddy Kalluru DP_VERBOSE(hwfn, QED_MSG_DCB, "willing = %d", pg->willing); 2045a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2046a1d8d8a5SSudarsana Reddy Kalluru 2047a1d8d8a5SSudarsana Reddy Kalluru return 0; 2048a1d8d8a5SSudarsana Reddy Kalluru } 2049a1d8d8a5SSudarsana Reddy Kalluru 2050a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_get_ieee_pfc(struct qed_dev *cdev, 2051a1d8d8a5SSudarsana Reddy Kalluru struct ieee_pfc *pfc, bool remote) 2052a1d8d8a5SSudarsana Reddy Kalluru { 2053a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 2054a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_params *params; 2055a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 2056a1d8d8a5SSudarsana Reddy Kalluru int rc, i; 2057a1d8d8a5SSudarsana Reddy Kalluru 2058a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 2059a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 2060a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2061a1d8d8a5SSudarsana Reddy Kalluru 2062a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info->operational.ieee) { 2063a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "DCBX is not enabled/operational in IEEE mode\n"); 206402ee9b18SWei Yongjun kfree(dcbx_info); 2065a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2066a1d8d8a5SSudarsana Reddy Kalluru } 2067a1d8d8a5SSudarsana Reddy Kalluru 2068a1d8d8a5SSudarsana Reddy Kalluru if (remote) { 2069a1d8d8a5SSudarsana Reddy Kalluru memset(dcbx_info, 0, sizeof(*dcbx_info)); 2070a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_query_params(hwfn, dcbx_info, 2071a1d8d8a5SSudarsana Reddy Kalluru QED_DCBX_REMOTE_MIB); 2072a1d8d8a5SSudarsana Reddy Kalluru if (rc) { 2073a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2074a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2075a1d8d8a5SSudarsana Reddy Kalluru } 2076a1d8d8a5SSudarsana Reddy Kalluru 2077a1d8d8a5SSudarsana Reddy Kalluru params = &dcbx_info->remote.params; 2078a1d8d8a5SSudarsana Reddy Kalluru } else { 2079a1d8d8a5SSudarsana Reddy Kalluru params = &dcbx_info->operational.params; 2080a1d8d8a5SSudarsana Reddy Kalluru } 2081a1d8d8a5SSudarsana Reddy Kalluru 2082a1d8d8a5SSudarsana Reddy Kalluru pfc->pfc_cap = params->pfc.max_tc; 2083a1d8d8a5SSudarsana Reddy Kalluru pfc->pfc_en = 0; 2084a1d8d8a5SSudarsana Reddy Kalluru for (i = 0; i < QED_MAX_PFC_PRIORITIES; i++) 2085a1d8d8a5SSudarsana Reddy Kalluru if (params->pfc.prio[i]) 2086a1d8d8a5SSudarsana Reddy Kalluru pfc->pfc_en |= BIT(i); 2087a1d8d8a5SSudarsana Reddy Kalluru 2088a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2089a1d8d8a5SSudarsana Reddy Kalluru 2090a1d8d8a5SSudarsana Reddy Kalluru return 0; 2091a1d8d8a5SSudarsana Reddy Kalluru } 2092a1d8d8a5SSudarsana Reddy Kalluru 2093a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_ieee_getpfc(struct qed_dev *cdev, struct ieee_pfc *pfc) 2094a1d8d8a5SSudarsana Reddy Kalluru { 2095a1d8d8a5SSudarsana Reddy Kalluru return qed_dcbnl_get_ieee_pfc(cdev, pfc, false); 2096a1d8d8a5SSudarsana Reddy Kalluru } 2097a1d8d8a5SSudarsana Reddy Kalluru 2098a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_ieee_setpfc(struct qed_dev *cdev, struct ieee_pfc *pfc) 2099a1d8d8a5SSudarsana Reddy Kalluru { 2100a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 2101a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 2102a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 2103a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 2104a1d8d8a5SSudarsana Reddy Kalluru int rc, i; 2105a1d8d8a5SSudarsana Reddy Kalluru 2106a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 2107a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 2108a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2109a1d8d8a5SSudarsana Reddy Kalluru 2110a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info->operational.ieee) { 2111a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "DCBX is not enabled/operational in IEEE mode\n"); 2112a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2113a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2114a1d8d8a5SSudarsana Reddy Kalluru } 2115a1d8d8a5SSudarsana Reddy Kalluru 2116a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2117a1d8d8a5SSudarsana Reddy Kalluru 2118a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 2119a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 2120a1d8d8a5SSudarsana Reddy Kalluru if (rc) 2121a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2122a1d8d8a5SSudarsana Reddy Kalluru 2123a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_PFC_CFG; 2124a1d8d8a5SSudarsana Reddy Kalluru for (i = 0; i < QED_MAX_PFC_PRIORITIES; i++) 2125a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.pfc.prio[i] = !!(pfc->pfc_en & BIT(i)); 2126a1d8d8a5SSudarsana Reddy Kalluru 2127c0c5dbe7Ssudarsana.kalluru@cavium.com dcbx_set.config.params.pfc.max_tc = pfc->pfc_cap; 2128c0c5dbe7Ssudarsana.kalluru@cavium.com 2129a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 2130a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 2131a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2132a1d8d8a5SSudarsana Reddy Kalluru 2133a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 2134a1d8d8a5SSudarsana Reddy Kalluru 2135a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 2136a1d8d8a5SSudarsana Reddy Kalluru 2137a1d8d8a5SSudarsana Reddy Kalluru return rc; 2138a1d8d8a5SSudarsana Reddy Kalluru } 2139a1d8d8a5SSudarsana Reddy Kalluru 2140a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_get_ieee_ets(struct qed_dev *cdev, 2141a1d8d8a5SSudarsana Reddy Kalluru struct ieee_ets *ets, bool remote) 2142a1d8d8a5SSudarsana Reddy Kalluru { 2143a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 2144a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 2145a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_params *params; 2146a1d8d8a5SSudarsana Reddy Kalluru int rc; 2147a1d8d8a5SSudarsana Reddy Kalluru 2148a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 2149a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 2150a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2151a1d8d8a5SSudarsana Reddy Kalluru 2152a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info->operational.ieee) { 2153a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "DCBX is not enabled/operational in IEEE mode\n"); 2154a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2155a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2156a1d8d8a5SSudarsana Reddy Kalluru } 2157a1d8d8a5SSudarsana Reddy Kalluru 2158a1d8d8a5SSudarsana Reddy Kalluru if (remote) { 2159a1d8d8a5SSudarsana Reddy Kalluru memset(dcbx_info, 0, sizeof(*dcbx_info)); 2160a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_query_params(hwfn, dcbx_info, 2161a1d8d8a5SSudarsana Reddy Kalluru QED_DCBX_REMOTE_MIB); 2162a1d8d8a5SSudarsana Reddy Kalluru if (rc) { 2163a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2164a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2165a1d8d8a5SSudarsana Reddy Kalluru } 2166a1d8d8a5SSudarsana Reddy Kalluru 2167a1d8d8a5SSudarsana Reddy Kalluru params = &dcbx_info->remote.params; 2168a1d8d8a5SSudarsana Reddy Kalluru } else { 2169a1d8d8a5SSudarsana Reddy Kalluru params = &dcbx_info->operational.params; 2170a1d8d8a5SSudarsana Reddy Kalluru } 2171a1d8d8a5SSudarsana Reddy Kalluru 2172a1d8d8a5SSudarsana Reddy Kalluru ets->ets_cap = params->max_ets_tc; 2173a1d8d8a5SSudarsana Reddy Kalluru ets->willing = params->ets_willing; 2174a1d8d8a5SSudarsana Reddy Kalluru ets->cbs = params->ets_cbs; 2175a1d8d8a5SSudarsana Reddy Kalluru memcpy(ets->tc_tx_bw, params->ets_tc_bw_tbl, sizeof(ets->tc_tx_bw)); 2176a1d8d8a5SSudarsana Reddy Kalluru memcpy(ets->tc_tsa, params->ets_tc_tsa_tbl, sizeof(ets->tc_tsa)); 2177a1d8d8a5SSudarsana Reddy Kalluru memcpy(ets->prio_tc, params->ets_pri_tc_tbl, sizeof(ets->prio_tc)); 2178a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2179a1d8d8a5SSudarsana Reddy Kalluru 2180a1d8d8a5SSudarsana Reddy Kalluru return 0; 2181a1d8d8a5SSudarsana Reddy Kalluru } 2182a1d8d8a5SSudarsana Reddy Kalluru 2183a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_ieee_getets(struct qed_dev *cdev, struct ieee_ets *ets) 2184a1d8d8a5SSudarsana Reddy Kalluru { 2185a1d8d8a5SSudarsana Reddy Kalluru return qed_dcbnl_get_ieee_ets(cdev, ets, false); 2186a1d8d8a5SSudarsana Reddy Kalluru } 2187a1d8d8a5SSudarsana Reddy Kalluru 2188a1d8d8a5SSudarsana Reddy Kalluru static int qed_dcbnl_ieee_setets(struct qed_dev *cdev, struct ieee_ets *ets) 2189a1d8d8a5SSudarsana Reddy Kalluru { 2190a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 2191a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 2192a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 2193a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 2194a1d8d8a5SSudarsana Reddy Kalluru int rc; 2195a1d8d8a5SSudarsana Reddy Kalluru 2196a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 2197a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 2198a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2199a1d8d8a5SSudarsana Reddy Kalluru 2200a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info->operational.ieee) { 2201a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "DCBX is not enabled/operational in IEEE mode\n"); 2202a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2203a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2204a1d8d8a5SSudarsana Reddy Kalluru } 2205a1d8d8a5SSudarsana Reddy Kalluru 2206a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2207a1d8d8a5SSudarsana Reddy Kalluru 2208a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 2209a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 2210a1d8d8a5SSudarsana Reddy Kalluru if (rc) 2211a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2212a1d8d8a5SSudarsana Reddy Kalluru 2213a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_ETS_CFG; 2214a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.max_ets_tc = ets->ets_cap; 2215a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.ets_willing = ets->willing; 2216a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.ets_cbs = ets->cbs; 2217a1d8d8a5SSudarsana Reddy Kalluru memcpy(dcbx_set.config.params.ets_tc_bw_tbl, ets->tc_tx_bw, 2218a1d8d8a5SSudarsana Reddy Kalluru sizeof(ets->tc_tx_bw)); 2219a1d8d8a5SSudarsana Reddy Kalluru memcpy(dcbx_set.config.params.ets_tc_tsa_tbl, ets->tc_tsa, 2220a1d8d8a5SSudarsana Reddy Kalluru sizeof(ets->tc_tsa)); 2221a1d8d8a5SSudarsana Reddy Kalluru memcpy(dcbx_set.config.params.ets_pri_tc_tbl, ets->prio_tc, 2222a1d8d8a5SSudarsana Reddy Kalluru sizeof(ets->prio_tc)); 2223a1d8d8a5SSudarsana Reddy Kalluru 2224a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 2225a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 2226a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2227a1d8d8a5SSudarsana Reddy Kalluru 2228a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 2229a1d8d8a5SSudarsana Reddy Kalluru 2230a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 2231a1d8d8a5SSudarsana Reddy Kalluru 2232a1d8d8a5SSudarsana Reddy Kalluru return rc; 2233a1d8d8a5SSudarsana Reddy Kalluru } 2234a1d8d8a5SSudarsana Reddy Kalluru 2235ba56947aSBaoyou Xie static int 2236ba56947aSBaoyou Xie qed_dcbnl_ieee_peer_getets(struct qed_dev *cdev, struct ieee_ets *ets) 2237a1d8d8a5SSudarsana Reddy Kalluru { 2238a1d8d8a5SSudarsana Reddy Kalluru return qed_dcbnl_get_ieee_ets(cdev, ets, true); 2239a1d8d8a5SSudarsana Reddy Kalluru } 2240a1d8d8a5SSudarsana Reddy Kalluru 2241ba56947aSBaoyou Xie static int 2242ba56947aSBaoyou Xie qed_dcbnl_ieee_peer_getpfc(struct qed_dev *cdev, struct ieee_pfc *pfc) 2243a1d8d8a5SSudarsana Reddy Kalluru { 2244a1d8d8a5SSudarsana Reddy Kalluru return qed_dcbnl_get_ieee_pfc(cdev, pfc, true); 2245a1d8d8a5SSudarsana Reddy Kalluru } 2246a1d8d8a5SSudarsana Reddy Kalluru 224705a79f92Ssudarsana.kalluru@cavium.com static int qed_get_sf_ieee_value(u8 selector, u8 *sf_ieee) 224805a79f92Ssudarsana.kalluru@cavium.com { 224905a79f92Ssudarsana.kalluru@cavium.com switch (selector) { 225005a79f92Ssudarsana.kalluru@cavium.com case IEEE_8021QAZ_APP_SEL_ETHERTYPE: 225105a79f92Ssudarsana.kalluru@cavium.com *sf_ieee = QED_DCBX_SF_IEEE_ETHTYPE; 225205a79f92Ssudarsana.kalluru@cavium.com break; 225305a79f92Ssudarsana.kalluru@cavium.com case IEEE_8021QAZ_APP_SEL_STREAM: 225405a79f92Ssudarsana.kalluru@cavium.com *sf_ieee = QED_DCBX_SF_IEEE_TCP_PORT; 225505a79f92Ssudarsana.kalluru@cavium.com break; 225605a79f92Ssudarsana.kalluru@cavium.com case IEEE_8021QAZ_APP_SEL_DGRAM: 225705a79f92Ssudarsana.kalluru@cavium.com *sf_ieee = QED_DCBX_SF_IEEE_UDP_PORT; 225805a79f92Ssudarsana.kalluru@cavium.com break; 225905a79f92Ssudarsana.kalluru@cavium.com case IEEE_8021QAZ_APP_SEL_ANY: 226005a79f92Ssudarsana.kalluru@cavium.com *sf_ieee = QED_DCBX_SF_IEEE_TCP_UDP_PORT; 226105a79f92Ssudarsana.kalluru@cavium.com break; 226205a79f92Ssudarsana.kalluru@cavium.com default: 226305a79f92Ssudarsana.kalluru@cavium.com return -EINVAL; 226405a79f92Ssudarsana.kalluru@cavium.com } 226505a79f92Ssudarsana.kalluru@cavium.com 226605a79f92Ssudarsana.kalluru@cavium.com return 0; 226705a79f92Ssudarsana.kalluru@cavium.com } 226805a79f92Ssudarsana.kalluru@cavium.com 2269ba56947aSBaoyou Xie static int qed_dcbnl_ieee_getapp(struct qed_dev *cdev, struct dcb_app *app) 2270a1d8d8a5SSudarsana Reddy Kalluru { 2271a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 2272a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 2273a1d8d8a5SSudarsana Reddy Kalluru struct qed_app_entry *entry; 2274a1d8d8a5SSudarsana Reddy Kalluru u8 prio = 0; 227505a79f92Ssudarsana.kalluru@cavium.com u8 sf_ieee; 2276a1d8d8a5SSudarsana Reddy Kalluru int i; 2277a1d8d8a5SSudarsana Reddy Kalluru 227805a79f92Ssudarsana.kalluru@cavium.com DP_VERBOSE(hwfn, QED_MSG_DCB, "selector = %d protocol = %d\n", 227905a79f92Ssudarsana.kalluru@cavium.com app->selector, app->protocol); 228005a79f92Ssudarsana.kalluru@cavium.com 228105a79f92Ssudarsana.kalluru@cavium.com if (qed_get_sf_ieee_value(app->selector, &sf_ieee)) { 228205a79f92Ssudarsana.kalluru@cavium.com DP_INFO(cdev, "Invalid selector field value %d\n", 228305a79f92Ssudarsana.kalluru@cavium.com app->selector); 228405a79f92Ssudarsana.kalluru@cavium.com return -EINVAL; 228505a79f92Ssudarsana.kalluru@cavium.com } 228605a79f92Ssudarsana.kalluru@cavium.com 2287a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 2288a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 2289a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2290a1d8d8a5SSudarsana Reddy Kalluru 2291a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info->operational.ieee) { 2292a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "DCBX is not enabled/operational in IEEE mode\n"); 2293a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2294a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2295a1d8d8a5SSudarsana Reddy Kalluru } 2296a1d8d8a5SSudarsana Reddy Kalluru 2297a1d8d8a5SSudarsana Reddy Kalluru for (i = 0; i < QED_DCBX_MAX_APP_PROTOCOL; i++) { 2298a1d8d8a5SSudarsana Reddy Kalluru entry = &dcbx_info->operational.params.app_entry[i]; 229905a79f92Ssudarsana.kalluru@cavium.com if ((entry->sf_ieee == sf_ieee) && 2300a1d8d8a5SSudarsana Reddy Kalluru (entry->proto_id == app->protocol)) { 2301a1d8d8a5SSudarsana Reddy Kalluru prio = entry->prio; 2302a1d8d8a5SSudarsana Reddy Kalluru break; 2303a1d8d8a5SSudarsana Reddy Kalluru } 2304a1d8d8a5SSudarsana Reddy Kalluru } 2305a1d8d8a5SSudarsana Reddy Kalluru 2306a1d8d8a5SSudarsana Reddy Kalluru if (i == QED_DCBX_MAX_APP_PROTOCOL) { 2307a1d8d8a5SSudarsana Reddy Kalluru DP_ERR(cdev, "App entry (%d, %d) not found\n", app->selector, 2308a1d8d8a5SSudarsana Reddy Kalluru app->protocol); 2309a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2310a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2311a1d8d8a5SSudarsana Reddy Kalluru } 2312a1d8d8a5SSudarsana Reddy Kalluru 2313a1d8d8a5SSudarsana Reddy Kalluru app->priority = ffs(prio) - 1; 2314a1d8d8a5SSudarsana Reddy Kalluru 2315a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2316a1d8d8a5SSudarsana Reddy Kalluru 2317a1d8d8a5SSudarsana Reddy Kalluru return 0; 2318a1d8d8a5SSudarsana Reddy Kalluru } 2319a1d8d8a5SSudarsana Reddy Kalluru 2320ba56947aSBaoyou Xie static int qed_dcbnl_ieee_setapp(struct qed_dev *cdev, struct dcb_app *app) 2321a1d8d8a5SSudarsana Reddy Kalluru { 2322a1d8d8a5SSudarsana Reddy Kalluru struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); 2323a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 2324a1d8d8a5SSudarsana Reddy Kalluru struct qed_dcbx_set dcbx_set; 2325a1d8d8a5SSudarsana Reddy Kalluru struct qed_app_entry *entry; 2326a1d8d8a5SSudarsana Reddy Kalluru struct qed_ptt *ptt; 232705a79f92Ssudarsana.kalluru@cavium.com u8 sf_ieee; 2328a1d8d8a5SSudarsana Reddy Kalluru int rc, i; 2329a1d8d8a5SSudarsana Reddy Kalluru 233005a79f92Ssudarsana.kalluru@cavium.com DP_VERBOSE(hwfn, QED_MSG_DCB, "selector = %d protocol = %d pri = %d\n", 233105a79f92Ssudarsana.kalluru@cavium.com app->selector, app->protocol, app->priority); 2332c49c777fSChristos Gkekas if (app->priority >= QED_MAX_PFC_PRIORITIES) { 2333a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "Invalid priority %d\n", app->priority); 2334a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2335a1d8d8a5SSudarsana Reddy Kalluru } 2336a1d8d8a5SSudarsana Reddy Kalluru 233705a79f92Ssudarsana.kalluru@cavium.com if (qed_get_sf_ieee_value(app->selector, &sf_ieee)) { 233805a79f92Ssudarsana.kalluru@cavium.com DP_INFO(cdev, "Invalid selector field value %d\n", 233905a79f92Ssudarsana.kalluru@cavium.com app->selector); 234005a79f92Ssudarsana.kalluru@cavium.com return -EINVAL; 234105a79f92Ssudarsana.kalluru@cavium.com } 234205a79f92Ssudarsana.kalluru@cavium.com 2343a1d8d8a5SSudarsana Reddy Kalluru dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); 2344a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info) 2345a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2346a1d8d8a5SSudarsana Reddy Kalluru 2347a1d8d8a5SSudarsana Reddy Kalluru if (!dcbx_info->operational.ieee) { 2348a1d8d8a5SSudarsana Reddy Kalluru DP_INFO(hwfn, "DCBX is not enabled/operational in IEEE mode\n"); 2349a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2350a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2351a1d8d8a5SSudarsana Reddy Kalluru } 2352a1d8d8a5SSudarsana Reddy Kalluru 2353a1d8d8a5SSudarsana Reddy Kalluru kfree(dcbx_info); 2354a1d8d8a5SSudarsana Reddy Kalluru 2355a1d8d8a5SSudarsana Reddy Kalluru memset(&dcbx_set, 0, sizeof(dcbx_set)); 2356a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_get_config_params(hwfn, &dcbx_set); 2357a1d8d8a5SSudarsana Reddy Kalluru if (rc) 2358a1d8d8a5SSudarsana Reddy Kalluru return -EINVAL; 2359a1d8d8a5SSudarsana Reddy Kalluru 2360a1d8d8a5SSudarsana Reddy Kalluru for (i = 0; i < QED_DCBX_MAX_APP_PROTOCOL; i++) { 2361a1d8d8a5SSudarsana Reddy Kalluru entry = &dcbx_set.config.params.app_entry[i]; 236205a79f92Ssudarsana.kalluru@cavium.com if ((entry->sf_ieee == sf_ieee) && 2363a1d8d8a5SSudarsana Reddy Kalluru (entry->proto_id == app->protocol)) 2364a1d8d8a5SSudarsana Reddy Kalluru break; 2365a1d8d8a5SSudarsana Reddy Kalluru /* First empty slot */ 23661d7406ceSSudarsana Reddy Kalluru if (!entry->proto_id) { 23671d7406ceSSudarsana Reddy Kalluru dcbx_set.config.params.num_app_entries++; 2368a1d8d8a5SSudarsana Reddy Kalluru break; 2369a1d8d8a5SSudarsana Reddy Kalluru } 23701d7406ceSSudarsana Reddy Kalluru } 2371a1d8d8a5SSudarsana Reddy Kalluru 2372a1d8d8a5SSudarsana Reddy Kalluru if (i == QED_DCBX_MAX_APP_PROTOCOL) { 2373a1d8d8a5SSudarsana Reddy Kalluru DP_ERR(cdev, "App table is full\n"); 2374a1d8d8a5SSudarsana Reddy Kalluru return -EBUSY; 2375a1d8d8a5SSudarsana Reddy Kalluru } 2376a1d8d8a5SSudarsana Reddy Kalluru 2377a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.override_flags |= QED_DCBX_OVERRIDE_APP_CFG; 237805a79f92Ssudarsana.kalluru@cavium.com dcbx_set.config.params.app_entry[i].sf_ieee = sf_ieee; 2379a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.app_entry[i].proto_id = app->protocol; 2380a1d8d8a5SSudarsana Reddy Kalluru dcbx_set.config.params.app_entry[i].prio = BIT(app->priority); 2381a1d8d8a5SSudarsana Reddy Kalluru 2382a1d8d8a5SSudarsana Reddy Kalluru ptt = qed_ptt_acquire(hwfn); 2383a1d8d8a5SSudarsana Reddy Kalluru if (!ptt) 2384a1d8d8a5SSudarsana Reddy Kalluru return -EBUSY; 2385a1d8d8a5SSudarsana Reddy Kalluru 2386a1d8d8a5SSudarsana Reddy Kalluru rc = qed_dcbx_config_params(hwfn, ptt, &dcbx_set, 0); 2387a1d8d8a5SSudarsana Reddy Kalluru 2388a1d8d8a5SSudarsana Reddy Kalluru qed_ptt_release(hwfn, ptt); 2389a1d8d8a5SSudarsana Reddy Kalluru 2390a1d8d8a5SSudarsana Reddy Kalluru return rc; 2391a1d8d8a5SSudarsana Reddy Kalluru } 2392a1d8d8a5SSudarsana Reddy Kalluru 2393a1d8d8a5SSudarsana Reddy Kalluru const struct qed_eth_dcbnl_ops qed_dcbnl_ops_pass = { 2394a1d8d8a5SSudarsana Reddy Kalluru .getstate = qed_dcbnl_getstate, 2395a1d8d8a5SSudarsana Reddy Kalluru .setstate = qed_dcbnl_setstate, 2396a1d8d8a5SSudarsana Reddy Kalluru .getpgtccfgtx = qed_dcbnl_getpgtccfgtx, 2397a1d8d8a5SSudarsana Reddy Kalluru .getpgbwgcfgtx = qed_dcbnl_getpgbwgcfgtx, 2398a1d8d8a5SSudarsana Reddy Kalluru .getpgtccfgrx = qed_dcbnl_getpgtccfgrx, 2399a1d8d8a5SSudarsana Reddy Kalluru .getpgbwgcfgrx = qed_dcbnl_getpgbwgcfgrx, 2400a1d8d8a5SSudarsana Reddy Kalluru .getpfccfg = qed_dcbnl_getpfccfg, 2401a1d8d8a5SSudarsana Reddy Kalluru .setpfccfg = qed_dcbnl_setpfccfg, 2402a1d8d8a5SSudarsana Reddy Kalluru .getcap = qed_dcbnl_getcap, 2403a1d8d8a5SSudarsana Reddy Kalluru .getnumtcs = qed_dcbnl_getnumtcs, 2404a1d8d8a5SSudarsana Reddy Kalluru .getpfcstate = qed_dcbnl_getpfcstate, 2405a1d8d8a5SSudarsana Reddy Kalluru .getdcbx = qed_dcbnl_getdcbx, 2406a1d8d8a5SSudarsana Reddy Kalluru .setpgtccfgtx = qed_dcbnl_setpgtccfgtx, 2407a1d8d8a5SSudarsana Reddy Kalluru .setpgtccfgrx = qed_dcbnl_setpgtccfgrx, 2408a1d8d8a5SSudarsana Reddy Kalluru .setpgbwgcfgtx = qed_dcbnl_setpgbwgcfgtx, 2409a1d8d8a5SSudarsana Reddy Kalluru .setpgbwgcfgrx = qed_dcbnl_setpgbwgcfgrx, 2410a1d8d8a5SSudarsana Reddy Kalluru .setall = qed_dcbnl_setall, 2411a1d8d8a5SSudarsana Reddy Kalluru .setnumtcs = qed_dcbnl_setnumtcs, 2412a1d8d8a5SSudarsana Reddy Kalluru .setpfcstate = qed_dcbnl_setpfcstate, 2413a1d8d8a5SSudarsana Reddy Kalluru .setapp = qed_dcbnl_setapp, 2414a1d8d8a5SSudarsana Reddy Kalluru .setdcbx = qed_dcbnl_setdcbx, 2415a1d8d8a5SSudarsana Reddy Kalluru .setfeatcfg = qed_dcbnl_setfeatcfg, 2416a1d8d8a5SSudarsana Reddy Kalluru .getfeatcfg = qed_dcbnl_getfeatcfg, 2417a1d8d8a5SSudarsana Reddy Kalluru .getapp = qed_dcbnl_getapp, 2418a1d8d8a5SSudarsana Reddy Kalluru .peer_getappinfo = qed_dcbnl_peer_getappinfo, 2419a1d8d8a5SSudarsana Reddy Kalluru .peer_getapptable = qed_dcbnl_peer_getapptable, 2420a1d8d8a5SSudarsana Reddy Kalluru .cee_peer_getpfc = qed_dcbnl_cee_peer_getpfc, 2421a1d8d8a5SSudarsana Reddy Kalluru .cee_peer_getpg = qed_dcbnl_cee_peer_getpg, 2422a1d8d8a5SSudarsana Reddy Kalluru .ieee_getpfc = qed_dcbnl_ieee_getpfc, 2423a1d8d8a5SSudarsana Reddy Kalluru .ieee_setpfc = qed_dcbnl_ieee_setpfc, 2424a1d8d8a5SSudarsana Reddy Kalluru .ieee_getets = qed_dcbnl_ieee_getets, 2425a1d8d8a5SSudarsana Reddy Kalluru .ieee_setets = qed_dcbnl_ieee_setets, 2426a1d8d8a5SSudarsana Reddy Kalluru .ieee_peer_getpfc = qed_dcbnl_ieee_peer_getpfc, 2427a1d8d8a5SSudarsana Reddy Kalluru .ieee_peer_getets = qed_dcbnl_ieee_peer_getets, 2428a1d8d8a5SSudarsana Reddy Kalluru .ieee_getapp = qed_dcbnl_ieee_getapp, 2429a1d8d8a5SSudarsana Reddy Kalluru .ieee_setapp = qed_dcbnl_ieee_setapp, 2430a1d8d8a5SSudarsana Reddy Kalluru }; 2431a1d8d8a5SSudarsana Reddy Kalluru 24326ad8c632SSudarsana Reddy Kalluru #endif 2433