139651abdSSudarsana Reddy Kalluru /* QLogic qed NIC Driver 239651abdSSudarsana Reddy Kalluru * Copyright (c) 2015 QLogic Corporation 339651abdSSudarsana Reddy Kalluru * 439651abdSSudarsana Reddy Kalluru * This software is available under the terms of the GNU General Public License 539651abdSSudarsana Reddy Kalluru * (GPL) Version 2, available from the file COPYING in the main directory of 639651abdSSudarsana Reddy Kalluru * this source tree. 739651abdSSudarsana Reddy Kalluru */ 839651abdSSudarsana Reddy Kalluru 939651abdSSudarsana Reddy Kalluru #include <linux/types.h> 1039651abdSSudarsana Reddy Kalluru #include <asm/byteorder.h> 1139651abdSSudarsana Reddy Kalluru #include <linux/bitops.h> 1239651abdSSudarsana Reddy Kalluru #include <linux/errno.h> 1339651abdSSudarsana Reddy Kalluru #include <linux/kernel.h> 1439651abdSSudarsana Reddy Kalluru #include <linux/slab.h> 1539651abdSSudarsana Reddy Kalluru #include <linux/string.h> 1639651abdSSudarsana Reddy Kalluru #include "qed.h" 1739651abdSSudarsana Reddy Kalluru #include "qed_cxt.h" 1839651abdSSudarsana Reddy Kalluru #include "qed_dcbx.h" 1939651abdSSudarsana Reddy Kalluru #include "qed_hsi.h" 2039651abdSSudarsana Reddy Kalluru #include "qed_sp.h" 2139651abdSSudarsana Reddy Kalluru 2239651abdSSudarsana Reddy Kalluru #define QED_DCBX_MAX_MIB_READ_TRY (100) 2339651abdSSudarsana Reddy Kalluru #define QED_ETH_TYPE_DEFAULT (0) 2439651abdSSudarsana Reddy Kalluru #define QED_ETH_TYPE_ROCE (0x8915) 2539651abdSSudarsana Reddy Kalluru #define QED_UDP_PORT_TYPE_ROCE_V2 (0x12B7) 2639651abdSSudarsana Reddy Kalluru #define QED_ETH_TYPE_FCOE (0x8906) 2739651abdSSudarsana Reddy Kalluru #define QED_TCP_PORT_ISCSI (0xCBC) 2839651abdSSudarsana Reddy Kalluru 2939651abdSSudarsana Reddy Kalluru #define QED_DCBX_INVALID_PRIORITY 0xFF 3039651abdSSudarsana Reddy Kalluru 3139651abdSSudarsana Reddy Kalluru /* Get Traffic Class from priority traffic class table, 4 bits represent 3239651abdSSudarsana Reddy Kalluru * the traffic class corresponding to the priority. 3339651abdSSudarsana Reddy Kalluru */ 3439651abdSSudarsana Reddy Kalluru #define QED_DCBX_PRIO2TC(prio_tc_tbl, prio) \ 3539651abdSSudarsana Reddy Kalluru ((u32)(prio_tc_tbl >> ((7 - prio) * 4)) & 0x7) 3639651abdSSudarsana Reddy Kalluru 3739651abdSSudarsana Reddy Kalluru static const struct qed_dcbx_app_metadata qed_dcbx_app_update[] = { 3839651abdSSudarsana Reddy Kalluru {DCBX_PROTOCOL_ISCSI, "ISCSI", QED_PCI_DEFAULT}, 3939651abdSSudarsana Reddy Kalluru {DCBX_PROTOCOL_FCOE, "FCOE", QED_PCI_DEFAULT}, 4039651abdSSudarsana Reddy Kalluru {DCBX_PROTOCOL_ROCE, "ROCE", QED_PCI_DEFAULT}, 4139651abdSSudarsana Reddy Kalluru {DCBX_PROTOCOL_ROCE_V2, "ROCE_V2", QED_PCI_DEFAULT}, 4239651abdSSudarsana Reddy Kalluru {DCBX_PROTOCOL_ETH, "ETH", QED_PCI_ETH} 4339651abdSSudarsana Reddy Kalluru }; 4439651abdSSudarsana Reddy Kalluru 4539651abdSSudarsana Reddy Kalluru static bool qed_dcbx_app_ethtype(u32 app_info_bitmap) 4639651abdSSudarsana Reddy Kalluru { 4739651abdSSudarsana Reddy Kalluru return !!(QED_MFW_GET_FIELD(app_info_bitmap, DCBX_APP_SF) == 4839651abdSSudarsana Reddy Kalluru DCBX_APP_SF_ETHTYPE); 4939651abdSSudarsana Reddy Kalluru } 5039651abdSSudarsana Reddy Kalluru 5139651abdSSudarsana Reddy Kalluru static bool qed_dcbx_app_port(u32 app_info_bitmap) 5239651abdSSudarsana Reddy Kalluru { 5339651abdSSudarsana Reddy Kalluru return !!(QED_MFW_GET_FIELD(app_info_bitmap, DCBX_APP_SF) == 5439651abdSSudarsana Reddy Kalluru DCBX_APP_SF_PORT); 5539651abdSSudarsana Reddy Kalluru } 5639651abdSSudarsana Reddy Kalluru 5739651abdSSudarsana Reddy Kalluru static bool qed_dcbx_default_tlv(u32 app_info_bitmap, u16 proto_id) 5839651abdSSudarsana Reddy Kalluru { 5939651abdSSudarsana Reddy Kalluru return !!(qed_dcbx_app_ethtype(app_info_bitmap) && 6039651abdSSudarsana Reddy Kalluru proto_id == QED_ETH_TYPE_DEFAULT); 6139651abdSSudarsana Reddy Kalluru } 6239651abdSSudarsana Reddy Kalluru 6339651abdSSudarsana Reddy Kalluru static bool qed_dcbx_iscsi_tlv(u32 app_info_bitmap, u16 proto_id) 6439651abdSSudarsana Reddy Kalluru { 6539651abdSSudarsana Reddy Kalluru return !!(qed_dcbx_app_port(app_info_bitmap) && 6639651abdSSudarsana Reddy Kalluru proto_id == QED_TCP_PORT_ISCSI); 6739651abdSSudarsana Reddy Kalluru } 6839651abdSSudarsana Reddy Kalluru 6939651abdSSudarsana Reddy Kalluru static bool qed_dcbx_fcoe_tlv(u32 app_info_bitmap, u16 proto_id) 7039651abdSSudarsana Reddy Kalluru { 7139651abdSSudarsana Reddy Kalluru return !!(qed_dcbx_app_ethtype(app_info_bitmap) && 7239651abdSSudarsana Reddy Kalluru proto_id == QED_ETH_TYPE_FCOE); 7339651abdSSudarsana Reddy Kalluru } 7439651abdSSudarsana Reddy Kalluru 7539651abdSSudarsana Reddy Kalluru static bool qed_dcbx_roce_tlv(u32 app_info_bitmap, u16 proto_id) 7639651abdSSudarsana Reddy Kalluru { 7739651abdSSudarsana Reddy Kalluru return !!(qed_dcbx_app_ethtype(app_info_bitmap) && 7839651abdSSudarsana Reddy Kalluru proto_id == QED_ETH_TYPE_ROCE); 7939651abdSSudarsana Reddy Kalluru } 8039651abdSSudarsana Reddy Kalluru 8139651abdSSudarsana Reddy Kalluru static bool qed_dcbx_roce_v2_tlv(u32 app_info_bitmap, u16 proto_id) 8239651abdSSudarsana Reddy Kalluru { 8339651abdSSudarsana Reddy Kalluru return !!(qed_dcbx_app_port(app_info_bitmap) && 8439651abdSSudarsana Reddy Kalluru proto_id == QED_UDP_PORT_TYPE_ROCE_V2); 8539651abdSSudarsana Reddy Kalluru } 8639651abdSSudarsana Reddy Kalluru 8739651abdSSudarsana Reddy Kalluru static void 8839651abdSSudarsana Reddy Kalluru qed_dcbx_dp_protocol(struct qed_hwfn *p_hwfn, struct qed_dcbx_results *p_data) 8939651abdSSudarsana Reddy Kalluru { 9039651abdSSudarsana Reddy Kalluru enum dcbx_protocol_type id; 9139651abdSSudarsana Reddy Kalluru int i; 9239651abdSSudarsana Reddy Kalluru 9339651abdSSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, "DCBX negotiated: %d\n", 9439651abdSSudarsana Reddy Kalluru p_data->dcbx_enabled); 9539651abdSSudarsana Reddy Kalluru 9639651abdSSudarsana Reddy Kalluru for (i = 0; i < ARRAY_SIZE(qed_dcbx_app_update); i++) { 9739651abdSSudarsana Reddy Kalluru id = qed_dcbx_app_update[i].id; 9839651abdSSudarsana Reddy Kalluru 9939651abdSSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, 10039651abdSSudarsana Reddy Kalluru "%s info: update %d, enable %d, prio %d, tc %d, num_tc %d\n", 10139651abdSSudarsana Reddy Kalluru qed_dcbx_app_update[i].name, p_data->arr[id].update, 10239651abdSSudarsana Reddy Kalluru p_data->arr[id].enable, p_data->arr[id].priority, 10339651abdSSudarsana Reddy Kalluru p_data->arr[id].tc, p_hwfn->hw_info.num_tc); 10439651abdSSudarsana Reddy Kalluru } 10539651abdSSudarsana Reddy Kalluru } 10639651abdSSudarsana Reddy Kalluru 10739651abdSSudarsana Reddy Kalluru static void 10839651abdSSudarsana Reddy Kalluru qed_dcbx_set_params(struct qed_dcbx_results *p_data, 10939651abdSSudarsana Reddy Kalluru struct qed_hw_info *p_info, 11039651abdSSudarsana Reddy Kalluru bool enable, 11139651abdSSudarsana Reddy Kalluru bool update, 11239651abdSSudarsana Reddy Kalluru u8 prio, 11339651abdSSudarsana Reddy Kalluru u8 tc, 11439651abdSSudarsana Reddy Kalluru enum dcbx_protocol_type type, 11539651abdSSudarsana Reddy Kalluru enum qed_pci_personality personality) 11639651abdSSudarsana Reddy Kalluru { 11739651abdSSudarsana Reddy Kalluru /* PF update ramrod data */ 11839651abdSSudarsana Reddy Kalluru p_data->arr[type].update = update; 11939651abdSSudarsana Reddy Kalluru p_data->arr[type].enable = enable; 12039651abdSSudarsana Reddy Kalluru p_data->arr[type].priority = prio; 12139651abdSSudarsana Reddy Kalluru p_data->arr[type].tc = tc; 12239651abdSSudarsana Reddy Kalluru 12339651abdSSudarsana Reddy Kalluru /* QM reconf data */ 12439651abdSSudarsana Reddy Kalluru if (p_info->personality == personality) { 12539651abdSSudarsana Reddy Kalluru if (personality == QED_PCI_ETH) 12639651abdSSudarsana Reddy Kalluru p_info->non_offload_tc = tc; 12739651abdSSudarsana Reddy Kalluru else 12839651abdSSudarsana Reddy Kalluru p_info->offload_tc = tc; 12939651abdSSudarsana Reddy Kalluru } 13039651abdSSudarsana Reddy Kalluru } 13139651abdSSudarsana Reddy Kalluru 13239651abdSSudarsana Reddy Kalluru /* Update app protocol data and hw_info fields with the TLV info */ 13339651abdSSudarsana Reddy Kalluru static void 13439651abdSSudarsana Reddy Kalluru qed_dcbx_update_app_info(struct qed_dcbx_results *p_data, 13539651abdSSudarsana Reddy Kalluru struct qed_hwfn *p_hwfn, 13639651abdSSudarsana Reddy Kalluru bool enable, 13739651abdSSudarsana Reddy Kalluru bool update, 13839651abdSSudarsana Reddy Kalluru u8 prio, u8 tc, enum dcbx_protocol_type type) 13939651abdSSudarsana Reddy Kalluru { 14039651abdSSudarsana Reddy Kalluru struct qed_hw_info *p_info = &p_hwfn->hw_info; 14139651abdSSudarsana Reddy Kalluru enum qed_pci_personality personality; 14239651abdSSudarsana Reddy Kalluru enum dcbx_protocol_type id; 14339651abdSSudarsana Reddy Kalluru char *name; 14439651abdSSudarsana Reddy Kalluru int i; 14539651abdSSudarsana Reddy Kalluru 14639651abdSSudarsana Reddy Kalluru for (i = 0; i < ARRAY_SIZE(qed_dcbx_app_update); i++) { 14739651abdSSudarsana Reddy Kalluru id = qed_dcbx_app_update[i].id; 14839651abdSSudarsana Reddy Kalluru 14939651abdSSudarsana Reddy Kalluru if (type != id) 15039651abdSSudarsana Reddy Kalluru continue; 15139651abdSSudarsana Reddy Kalluru 15239651abdSSudarsana Reddy Kalluru personality = qed_dcbx_app_update[i].personality; 15339651abdSSudarsana Reddy Kalluru name = qed_dcbx_app_update[i].name; 15439651abdSSudarsana Reddy Kalluru 15539651abdSSudarsana Reddy Kalluru qed_dcbx_set_params(p_data, p_info, enable, update, 15639651abdSSudarsana Reddy Kalluru prio, tc, type, personality); 15739651abdSSudarsana Reddy Kalluru } 15839651abdSSudarsana Reddy Kalluru } 15939651abdSSudarsana Reddy Kalluru 16039651abdSSudarsana Reddy Kalluru static bool 16139651abdSSudarsana Reddy Kalluru qed_dcbx_get_app_protocol_type(struct qed_hwfn *p_hwfn, 16239651abdSSudarsana Reddy Kalluru u32 app_prio_bitmap, 16339651abdSSudarsana Reddy Kalluru u16 id, enum dcbx_protocol_type *type) 16439651abdSSudarsana Reddy Kalluru { 16539651abdSSudarsana Reddy Kalluru if (qed_dcbx_fcoe_tlv(app_prio_bitmap, id)) { 16639651abdSSudarsana Reddy Kalluru *type = DCBX_PROTOCOL_FCOE; 16739651abdSSudarsana Reddy Kalluru } else if (qed_dcbx_roce_tlv(app_prio_bitmap, id)) { 16839651abdSSudarsana Reddy Kalluru *type = DCBX_PROTOCOL_ROCE; 16939651abdSSudarsana Reddy Kalluru } else if (qed_dcbx_iscsi_tlv(app_prio_bitmap, id)) { 17039651abdSSudarsana Reddy Kalluru *type = DCBX_PROTOCOL_ISCSI; 17139651abdSSudarsana Reddy Kalluru } else if (qed_dcbx_default_tlv(app_prio_bitmap, id)) { 17239651abdSSudarsana Reddy Kalluru *type = DCBX_PROTOCOL_ETH; 17339651abdSSudarsana Reddy Kalluru } else if (qed_dcbx_roce_v2_tlv(app_prio_bitmap, id)) { 17439651abdSSudarsana Reddy Kalluru *type = DCBX_PROTOCOL_ROCE_V2; 17539651abdSSudarsana Reddy Kalluru } else { 17639651abdSSudarsana Reddy Kalluru *type = DCBX_MAX_PROTOCOL_TYPE; 17739651abdSSudarsana Reddy Kalluru DP_ERR(p_hwfn, 17839651abdSSudarsana Reddy Kalluru "No action required, App TLV id = 0x%x app_prio_bitmap = 0x%x\n", 17939651abdSSudarsana Reddy Kalluru id, app_prio_bitmap); 18039651abdSSudarsana Reddy Kalluru return false; 18139651abdSSudarsana Reddy Kalluru } 18239651abdSSudarsana Reddy Kalluru 18339651abdSSudarsana Reddy Kalluru return true; 18439651abdSSudarsana Reddy Kalluru } 18539651abdSSudarsana Reddy Kalluru 18639651abdSSudarsana Reddy Kalluru /* Parse app TLV's to update TC information in hw_info structure for 18739651abdSSudarsana Reddy Kalluru * reconfiguring QM. Get protocol specific data for PF update ramrod command. 18839651abdSSudarsana Reddy Kalluru */ 18939651abdSSudarsana Reddy Kalluru static int 19039651abdSSudarsana Reddy Kalluru qed_dcbx_process_tlv(struct qed_hwfn *p_hwfn, 19139651abdSSudarsana Reddy Kalluru struct qed_dcbx_results *p_data, 19239651abdSSudarsana Reddy Kalluru struct dcbx_app_priority_entry *p_tbl, 19339651abdSSudarsana Reddy Kalluru u32 pri_tc_tbl, int count, bool dcbx_enabled) 19439651abdSSudarsana Reddy Kalluru { 19554b9430fSDan Carpenter u8 tc, priority_map; 19639651abdSSudarsana Reddy Kalluru enum dcbx_protocol_type type; 19739651abdSSudarsana Reddy Kalluru u16 protocol_id; 19854b9430fSDan Carpenter int priority; 19939651abdSSudarsana Reddy Kalluru bool enable; 20039651abdSSudarsana Reddy Kalluru int i; 20139651abdSSudarsana Reddy Kalluru 20239651abdSSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, "Num APP entries = %d\n", count); 20339651abdSSudarsana Reddy Kalluru 20439651abdSSudarsana Reddy Kalluru /* Parse APP TLV */ 20539651abdSSudarsana Reddy Kalluru for (i = 0; i < count; i++) { 20639651abdSSudarsana Reddy Kalluru protocol_id = QED_MFW_GET_FIELD(p_tbl[i].entry, 20739651abdSSudarsana Reddy Kalluru DCBX_APP_PROTOCOL_ID); 20839651abdSSudarsana Reddy Kalluru priority_map = QED_MFW_GET_FIELD(p_tbl[i].entry, 20939651abdSSudarsana Reddy Kalluru DCBX_APP_PRI_MAP); 21039651abdSSudarsana Reddy Kalluru priority = ffs(priority_map) - 1; 21139651abdSSudarsana Reddy Kalluru if (priority < 0) { 21239651abdSSudarsana Reddy Kalluru DP_ERR(p_hwfn, "Invalid priority\n"); 21339651abdSSudarsana Reddy Kalluru return -EINVAL; 21439651abdSSudarsana Reddy Kalluru } 21539651abdSSudarsana Reddy Kalluru 21639651abdSSudarsana Reddy Kalluru tc = QED_DCBX_PRIO2TC(pri_tc_tbl, priority); 21739651abdSSudarsana Reddy Kalluru if (qed_dcbx_get_app_protocol_type(p_hwfn, p_tbl[i].entry, 21839651abdSSudarsana Reddy Kalluru protocol_id, &type)) { 21939651abdSSudarsana Reddy Kalluru /* ETH always have the enable bit reset, as it gets 22039651abdSSudarsana Reddy Kalluru * vlan information per packet. For other protocols, 22139651abdSSudarsana Reddy Kalluru * should be set according to the dcbx_enabled 22239651abdSSudarsana Reddy Kalluru * indication, but we only got here if there was an 22339651abdSSudarsana Reddy Kalluru * app tlv for the protocol, so dcbx must be enabled. 22439651abdSSudarsana Reddy Kalluru */ 225ec7c7f5cSSudarsana Reddy Kalluru enable = !(type == DCBX_PROTOCOL_ETH); 22639651abdSSudarsana Reddy Kalluru 22739651abdSSudarsana Reddy Kalluru qed_dcbx_update_app_info(p_data, p_hwfn, enable, true, 22839651abdSSudarsana Reddy Kalluru priority, tc, type); 22939651abdSSudarsana Reddy Kalluru } 23039651abdSSudarsana Reddy Kalluru } 23139651abdSSudarsana Reddy Kalluru 23239651abdSSudarsana Reddy Kalluru /* If RoCE-V2 TLV is not detected, driver need to use RoCE app 23339651abdSSudarsana Reddy Kalluru * data for RoCE-v2 not the default app data. 23439651abdSSudarsana Reddy Kalluru */ 23539651abdSSudarsana Reddy Kalluru if (!p_data->arr[DCBX_PROTOCOL_ROCE_V2].update && 23639651abdSSudarsana Reddy Kalluru p_data->arr[DCBX_PROTOCOL_ROCE].update) { 23739651abdSSudarsana Reddy Kalluru tc = p_data->arr[DCBX_PROTOCOL_ROCE].tc; 23839651abdSSudarsana Reddy Kalluru priority = p_data->arr[DCBX_PROTOCOL_ROCE].priority; 23939651abdSSudarsana Reddy Kalluru qed_dcbx_update_app_info(p_data, p_hwfn, true, true, 24039651abdSSudarsana Reddy Kalluru priority, tc, DCBX_PROTOCOL_ROCE_V2); 24139651abdSSudarsana Reddy Kalluru } 24239651abdSSudarsana Reddy Kalluru 24339651abdSSudarsana Reddy Kalluru /* Update ramrod protocol data and hw_info fields 24439651abdSSudarsana Reddy Kalluru * with default info when corresponding APP TLV's are not detected. 24539651abdSSudarsana Reddy Kalluru * The enabled field has a different logic for ethernet as only for 24639651abdSSudarsana Reddy Kalluru * ethernet dcb should disabled by default, as the information arrives 24739651abdSSudarsana Reddy Kalluru * from the OS (unless an explicit app tlv was present). 24839651abdSSudarsana Reddy Kalluru */ 24939651abdSSudarsana Reddy Kalluru tc = p_data->arr[DCBX_PROTOCOL_ETH].tc; 25039651abdSSudarsana Reddy Kalluru priority = p_data->arr[DCBX_PROTOCOL_ETH].priority; 25139651abdSSudarsana Reddy Kalluru for (type = 0; type < DCBX_MAX_PROTOCOL_TYPE; type++) { 25239651abdSSudarsana Reddy Kalluru if (p_data->arr[type].update) 25339651abdSSudarsana Reddy Kalluru continue; 25439651abdSSudarsana Reddy Kalluru 2556ad8c632SSudarsana Reddy Kalluru enable = !(type == DCBX_PROTOCOL_ETH); 25639651abdSSudarsana Reddy Kalluru qed_dcbx_update_app_info(p_data, p_hwfn, enable, true, 25739651abdSSudarsana Reddy Kalluru priority, tc, type); 25839651abdSSudarsana Reddy Kalluru } 25939651abdSSudarsana Reddy Kalluru 26039651abdSSudarsana Reddy Kalluru return 0; 26139651abdSSudarsana Reddy Kalluru } 26239651abdSSudarsana Reddy Kalluru 26339651abdSSudarsana Reddy Kalluru /* Parse app TLV's to update TC information in hw_info structure for 26439651abdSSudarsana Reddy Kalluru * reconfiguring QM. Get protocol specific data for PF update ramrod command. 26539651abdSSudarsana Reddy Kalluru */ 26639651abdSSudarsana Reddy Kalluru static int qed_dcbx_process_mib_info(struct qed_hwfn *p_hwfn) 26739651abdSSudarsana Reddy Kalluru { 26839651abdSSudarsana Reddy Kalluru struct dcbx_app_priority_feature *p_app; 26939651abdSSudarsana Reddy Kalluru struct dcbx_app_priority_entry *p_tbl; 27039651abdSSudarsana Reddy Kalluru struct qed_dcbx_results data = { 0 }; 27139651abdSSudarsana Reddy Kalluru struct dcbx_ets_feature *p_ets; 27239651abdSSudarsana Reddy Kalluru struct qed_hw_info *p_info; 27339651abdSSudarsana Reddy Kalluru u32 pri_tc_tbl, flags; 27439651abdSSudarsana Reddy Kalluru bool dcbx_enabled; 27539651abdSSudarsana Reddy Kalluru int num_entries; 27639651abdSSudarsana Reddy Kalluru int rc = 0; 27739651abdSSudarsana Reddy Kalluru 27839651abdSSudarsana Reddy Kalluru /* If DCBx version is non zero, then negotiation was 27939651abdSSudarsana Reddy Kalluru * successfuly performed 28039651abdSSudarsana Reddy Kalluru */ 28139651abdSSudarsana Reddy Kalluru flags = p_hwfn->p_dcbx_info->operational.flags; 28239651abdSSudarsana Reddy Kalluru dcbx_enabled = !!QED_MFW_GET_FIELD(flags, DCBX_CONFIG_VERSION); 28339651abdSSudarsana Reddy Kalluru 28439651abdSSudarsana Reddy Kalluru p_app = &p_hwfn->p_dcbx_info->operational.features.app; 28539651abdSSudarsana Reddy Kalluru p_tbl = p_app->app_pri_tbl; 28639651abdSSudarsana Reddy Kalluru 28739651abdSSudarsana Reddy Kalluru p_ets = &p_hwfn->p_dcbx_info->operational.features.ets; 28839651abdSSudarsana Reddy Kalluru pri_tc_tbl = p_ets->pri_tc_tbl[0]; 28939651abdSSudarsana Reddy Kalluru 29039651abdSSudarsana Reddy Kalluru p_info = &p_hwfn->hw_info; 29139651abdSSudarsana Reddy Kalluru num_entries = QED_MFW_GET_FIELD(p_app->flags, DCBX_APP_NUM_ENTRIES); 29239651abdSSudarsana Reddy Kalluru 29339651abdSSudarsana Reddy Kalluru rc = qed_dcbx_process_tlv(p_hwfn, &data, p_tbl, pri_tc_tbl, 29439651abdSSudarsana Reddy Kalluru num_entries, dcbx_enabled); 29539651abdSSudarsana Reddy Kalluru if (rc) 29639651abdSSudarsana Reddy Kalluru return rc; 29739651abdSSudarsana Reddy Kalluru 29839651abdSSudarsana Reddy Kalluru p_info->num_tc = QED_MFW_GET_FIELD(p_ets->flags, DCBX_ETS_MAX_TCS); 29939651abdSSudarsana Reddy Kalluru data.pf_id = p_hwfn->rel_pf_id; 30039651abdSSudarsana Reddy Kalluru data.dcbx_enabled = dcbx_enabled; 30139651abdSSudarsana Reddy Kalluru 30239651abdSSudarsana Reddy Kalluru qed_dcbx_dp_protocol(p_hwfn, &data); 30339651abdSSudarsana Reddy Kalluru 30439651abdSSudarsana Reddy Kalluru memcpy(&p_hwfn->p_dcbx_info->results, &data, 30539651abdSSudarsana Reddy Kalluru sizeof(struct qed_dcbx_results)); 30639651abdSSudarsana Reddy Kalluru 30739651abdSSudarsana Reddy Kalluru return 0; 30839651abdSSudarsana Reddy Kalluru } 30939651abdSSudarsana Reddy Kalluru 31039651abdSSudarsana Reddy Kalluru static int 31139651abdSSudarsana Reddy Kalluru qed_dcbx_copy_mib(struct qed_hwfn *p_hwfn, 31239651abdSSudarsana Reddy Kalluru struct qed_ptt *p_ptt, 31339651abdSSudarsana Reddy Kalluru struct qed_dcbx_mib_meta_data *p_data, 31439651abdSSudarsana Reddy Kalluru enum qed_mib_read_type type) 31539651abdSSudarsana Reddy Kalluru { 31639651abdSSudarsana Reddy Kalluru u32 prefix_seq_num, suffix_seq_num; 31739651abdSSudarsana Reddy Kalluru int read_count = 0; 31839651abdSSudarsana Reddy Kalluru int rc = 0; 31939651abdSSudarsana Reddy Kalluru 32039651abdSSudarsana Reddy Kalluru /* The data is considered to be valid only if both sequence numbers are 32139651abdSSudarsana Reddy Kalluru * the same. 32239651abdSSudarsana Reddy Kalluru */ 32339651abdSSudarsana Reddy Kalluru do { 32439651abdSSudarsana Reddy Kalluru if (type == QED_DCBX_REMOTE_LLDP_MIB) { 32539651abdSSudarsana Reddy Kalluru qed_memcpy_from(p_hwfn, p_ptt, p_data->lldp_remote, 32639651abdSSudarsana Reddy Kalluru p_data->addr, p_data->size); 32739651abdSSudarsana Reddy Kalluru prefix_seq_num = p_data->lldp_remote->prefix_seq_num; 32839651abdSSudarsana Reddy Kalluru suffix_seq_num = p_data->lldp_remote->suffix_seq_num; 32939651abdSSudarsana Reddy Kalluru } else { 33039651abdSSudarsana Reddy Kalluru qed_memcpy_from(p_hwfn, p_ptt, p_data->mib, 33139651abdSSudarsana Reddy Kalluru p_data->addr, p_data->size); 33239651abdSSudarsana Reddy Kalluru prefix_seq_num = p_data->mib->prefix_seq_num; 33339651abdSSudarsana Reddy Kalluru suffix_seq_num = p_data->mib->suffix_seq_num; 33439651abdSSudarsana Reddy Kalluru } 33539651abdSSudarsana Reddy Kalluru read_count++; 33639651abdSSudarsana Reddy Kalluru 33739651abdSSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, 33839651abdSSudarsana Reddy Kalluru QED_MSG_DCB, 33939651abdSSudarsana Reddy Kalluru "mib type = %d, try count = %d prefix seq num = %d suffix seq num = %d\n", 34039651abdSSudarsana Reddy Kalluru type, read_count, prefix_seq_num, suffix_seq_num); 34139651abdSSudarsana Reddy Kalluru } while ((prefix_seq_num != suffix_seq_num) && 34239651abdSSudarsana Reddy Kalluru (read_count < QED_DCBX_MAX_MIB_READ_TRY)); 34339651abdSSudarsana Reddy Kalluru 34439651abdSSudarsana Reddy Kalluru if (read_count >= QED_DCBX_MAX_MIB_READ_TRY) { 34539651abdSSudarsana Reddy Kalluru DP_ERR(p_hwfn, 34639651abdSSudarsana Reddy Kalluru "MIB read err, mib type = %d, try count = %d prefix seq num = %d suffix seq num = %d\n", 34739651abdSSudarsana Reddy Kalluru type, read_count, prefix_seq_num, suffix_seq_num); 34839651abdSSudarsana Reddy Kalluru rc = -EIO; 34939651abdSSudarsana Reddy Kalluru } 35039651abdSSudarsana Reddy Kalluru 35139651abdSSudarsana Reddy Kalluru return rc; 35239651abdSSudarsana Reddy Kalluru } 35339651abdSSudarsana Reddy Kalluru 3546ad8c632SSudarsana Reddy Kalluru #ifdef CONFIG_DCB 3556ad8c632SSudarsana Reddy Kalluru static void 3566ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_priority_info(struct qed_hwfn *p_hwfn, 3576ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_app_prio *p_prio, 3586ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_results *p_results) 3596ad8c632SSudarsana Reddy Kalluru { 3606ad8c632SSudarsana Reddy Kalluru u8 val; 3616ad8c632SSudarsana Reddy Kalluru 3626ad8c632SSudarsana Reddy Kalluru p_prio->roce = QED_DCBX_INVALID_PRIORITY; 3636ad8c632SSudarsana Reddy Kalluru p_prio->roce_v2 = QED_DCBX_INVALID_PRIORITY; 3646ad8c632SSudarsana Reddy Kalluru p_prio->iscsi = QED_DCBX_INVALID_PRIORITY; 3656ad8c632SSudarsana Reddy Kalluru p_prio->fcoe = QED_DCBX_INVALID_PRIORITY; 3666ad8c632SSudarsana Reddy Kalluru 3676ad8c632SSudarsana Reddy Kalluru if (p_results->arr[DCBX_PROTOCOL_ROCE].update && 3686ad8c632SSudarsana Reddy Kalluru p_results->arr[DCBX_PROTOCOL_ROCE].enable) 3696ad8c632SSudarsana Reddy Kalluru p_prio->roce = p_results->arr[DCBX_PROTOCOL_ROCE].priority; 3706ad8c632SSudarsana Reddy Kalluru 3716ad8c632SSudarsana Reddy Kalluru if (p_results->arr[DCBX_PROTOCOL_ROCE_V2].update && 3726ad8c632SSudarsana Reddy Kalluru p_results->arr[DCBX_PROTOCOL_ROCE_V2].enable) { 3736ad8c632SSudarsana Reddy Kalluru val = p_results->arr[DCBX_PROTOCOL_ROCE_V2].priority; 3746ad8c632SSudarsana Reddy Kalluru p_prio->roce_v2 = val; 3756ad8c632SSudarsana Reddy Kalluru } 3766ad8c632SSudarsana Reddy Kalluru 3776ad8c632SSudarsana Reddy Kalluru if (p_results->arr[DCBX_PROTOCOL_ISCSI].update && 3786ad8c632SSudarsana Reddy Kalluru p_results->arr[DCBX_PROTOCOL_ISCSI].enable) 3796ad8c632SSudarsana Reddy Kalluru p_prio->iscsi = p_results->arr[DCBX_PROTOCOL_ISCSI].priority; 3806ad8c632SSudarsana Reddy Kalluru 3816ad8c632SSudarsana Reddy Kalluru if (p_results->arr[DCBX_PROTOCOL_FCOE].update && 3826ad8c632SSudarsana Reddy Kalluru p_results->arr[DCBX_PROTOCOL_FCOE].enable) 3836ad8c632SSudarsana Reddy Kalluru p_prio->fcoe = p_results->arr[DCBX_PROTOCOL_FCOE].priority; 3846ad8c632SSudarsana Reddy Kalluru 3856ad8c632SSudarsana Reddy Kalluru if (p_results->arr[DCBX_PROTOCOL_ETH].update && 3866ad8c632SSudarsana Reddy Kalluru p_results->arr[DCBX_PROTOCOL_ETH].enable) 3876ad8c632SSudarsana Reddy Kalluru p_prio->eth = p_results->arr[DCBX_PROTOCOL_ETH].priority; 3886ad8c632SSudarsana Reddy Kalluru 3896ad8c632SSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, 3906ad8c632SSudarsana Reddy Kalluru "Priorities: iscsi %d, roce %d, roce v2 %d, fcoe %d, eth %d\n", 3916ad8c632SSudarsana Reddy Kalluru p_prio->iscsi, p_prio->roce, p_prio->roce_v2, p_prio->fcoe, 3926ad8c632SSudarsana Reddy Kalluru p_prio->eth); 3936ad8c632SSudarsana Reddy Kalluru } 3946ad8c632SSudarsana Reddy Kalluru 3956ad8c632SSudarsana Reddy Kalluru static void 3966ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_app_data(struct qed_hwfn *p_hwfn, 3976ad8c632SSudarsana Reddy Kalluru struct dcbx_app_priority_feature *p_app, 3986ad8c632SSudarsana Reddy Kalluru struct dcbx_app_priority_entry *p_tbl, 3996ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_params *p_params) 4006ad8c632SSudarsana Reddy Kalluru { 4016ad8c632SSudarsana Reddy Kalluru struct qed_app_entry *entry; 4026ad8c632SSudarsana Reddy Kalluru u8 pri_map; 4036ad8c632SSudarsana Reddy Kalluru int i; 4046ad8c632SSudarsana Reddy Kalluru 4056ad8c632SSudarsana Reddy Kalluru p_params->app_willing = QED_MFW_GET_FIELD(p_app->flags, 4066ad8c632SSudarsana Reddy Kalluru DCBX_APP_WILLING); 4076ad8c632SSudarsana Reddy Kalluru p_params->app_valid = QED_MFW_GET_FIELD(p_app->flags, DCBX_APP_ENABLED); 4086ad8c632SSudarsana Reddy Kalluru p_params->app_error = QED_MFW_GET_FIELD(p_app->flags, DCBX_APP_ERROR); 4096ad8c632SSudarsana Reddy Kalluru p_params->num_app_entries = QED_MFW_GET_FIELD(p_app->flags, 4106ad8c632SSudarsana Reddy Kalluru DCBX_APP_NUM_ENTRIES); 4116ad8c632SSudarsana Reddy Kalluru for (i = 0; i < DCBX_MAX_APP_PROTOCOL; i++) { 4126ad8c632SSudarsana Reddy Kalluru entry = &p_params->app_entry[i]; 4136ad8c632SSudarsana Reddy Kalluru entry->ethtype = !(QED_MFW_GET_FIELD(p_tbl[i].entry, 4146ad8c632SSudarsana Reddy Kalluru DCBX_APP_SF)); 4156ad8c632SSudarsana Reddy Kalluru pri_map = QED_MFW_GET_FIELD(p_tbl[i].entry, DCBX_APP_PRI_MAP); 4166ad8c632SSudarsana Reddy Kalluru entry->prio = ffs(pri_map) - 1; 4176ad8c632SSudarsana Reddy Kalluru entry->proto_id = QED_MFW_GET_FIELD(p_tbl[i].entry, 4186ad8c632SSudarsana Reddy Kalluru DCBX_APP_PROTOCOL_ID); 4196ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_app_protocol_type(p_hwfn, p_tbl[i].entry, 4206ad8c632SSudarsana Reddy Kalluru entry->proto_id, 4216ad8c632SSudarsana Reddy Kalluru &entry->proto_type); 4226ad8c632SSudarsana Reddy Kalluru } 4236ad8c632SSudarsana Reddy Kalluru 4246ad8c632SSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, 4256ad8c632SSudarsana Reddy Kalluru "APP params: willing %d, valid %d error = %d\n", 4266ad8c632SSudarsana Reddy Kalluru p_params->app_willing, p_params->app_valid, 4276ad8c632SSudarsana Reddy Kalluru p_params->app_error); 4286ad8c632SSudarsana Reddy Kalluru } 4296ad8c632SSudarsana Reddy Kalluru 4306ad8c632SSudarsana Reddy Kalluru static void 4316ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_pfc_data(struct qed_hwfn *p_hwfn, 4326ad8c632SSudarsana Reddy Kalluru u32 pfc, struct qed_dcbx_params *p_params) 4336ad8c632SSudarsana Reddy Kalluru { 4346ad8c632SSudarsana Reddy Kalluru u8 pfc_map; 4356ad8c632SSudarsana Reddy Kalluru 4366ad8c632SSudarsana Reddy Kalluru p_params->pfc.willing = QED_MFW_GET_FIELD(pfc, DCBX_PFC_WILLING); 4376ad8c632SSudarsana Reddy Kalluru p_params->pfc.max_tc = QED_MFW_GET_FIELD(pfc, DCBX_PFC_CAPS); 4386ad8c632SSudarsana Reddy Kalluru p_params->pfc.enabled = QED_MFW_GET_FIELD(pfc, DCBX_PFC_ENABLED); 4396ad8c632SSudarsana Reddy Kalluru pfc_map = QED_MFW_GET_FIELD(pfc, DCBX_PFC_PRI_EN_BITMAP); 4406ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[0] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_0); 4416ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[1] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_1); 4426ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[2] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_2); 4436ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[3] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_3); 4446ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[4] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_4); 4456ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[5] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_5); 4466ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[6] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_6); 4476ad8c632SSudarsana Reddy Kalluru p_params->pfc.prio[7] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_7); 4486ad8c632SSudarsana Reddy Kalluru 4496ad8c632SSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, 4506ad8c632SSudarsana Reddy Kalluru "PFC params: willing %d, pfc_bitmap %d\n", 4516ad8c632SSudarsana Reddy Kalluru p_params->pfc.willing, pfc_map); 4526ad8c632SSudarsana Reddy Kalluru } 4536ad8c632SSudarsana Reddy Kalluru 4546ad8c632SSudarsana Reddy Kalluru static void 4556ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_ets_data(struct qed_hwfn *p_hwfn, 4566ad8c632SSudarsana Reddy Kalluru struct dcbx_ets_feature *p_ets, 4576ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_params *p_params) 4586ad8c632SSudarsana Reddy Kalluru { 4596ad8c632SSudarsana Reddy Kalluru u32 bw_map[2], tsa_map[2], pri_map; 4606ad8c632SSudarsana Reddy Kalluru int i; 4616ad8c632SSudarsana Reddy Kalluru 4626ad8c632SSudarsana Reddy Kalluru p_params->ets_willing = QED_MFW_GET_FIELD(p_ets->flags, 4636ad8c632SSudarsana Reddy Kalluru DCBX_ETS_WILLING); 4646ad8c632SSudarsana Reddy Kalluru p_params->ets_enabled = QED_MFW_GET_FIELD(p_ets->flags, 4656ad8c632SSudarsana Reddy Kalluru DCBX_ETS_ENABLED); 4666ad8c632SSudarsana Reddy Kalluru p_params->ets_cbs = QED_MFW_GET_FIELD(p_ets->flags, DCBX_ETS_CBS); 4676ad8c632SSudarsana Reddy Kalluru p_params->max_ets_tc = QED_MFW_GET_FIELD(p_ets->flags, 4686ad8c632SSudarsana Reddy Kalluru DCBX_ETS_MAX_TCS); 4696ad8c632SSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, 4706ad8c632SSudarsana Reddy Kalluru "ETS params: willing %d, ets_cbs %d pri_tc_tbl_0 %x max_ets_tc %d\n", 4716ad8c632SSudarsana Reddy Kalluru p_params->ets_willing, 4726ad8c632SSudarsana Reddy Kalluru p_params->ets_cbs, 4736ad8c632SSudarsana Reddy Kalluru p_ets->pri_tc_tbl[0], p_params->max_ets_tc); 4746ad8c632SSudarsana Reddy Kalluru 4756ad8c632SSudarsana Reddy Kalluru /* 8 bit tsa and bw data corresponding to each of the 8 TC's are 4766ad8c632SSudarsana Reddy Kalluru * encoded in a type u32 array of size 2. 4776ad8c632SSudarsana Reddy Kalluru */ 4786ad8c632SSudarsana Reddy Kalluru bw_map[0] = be32_to_cpu(p_ets->tc_bw_tbl[0]); 4796ad8c632SSudarsana Reddy Kalluru bw_map[1] = be32_to_cpu(p_ets->tc_bw_tbl[1]); 4806ad8c632SSudarsana Reddy Kalluru tsa_map[0] = be32_to_cpu(p_ets->tc_tsa_tbl[0]); 4816ad8c632SSudarsana Reddy Kalluru tsa_map[1] = be32_to_cpu(p_ets->tc_tsa_tbl[1]); 4826ad8c632SSudarsana Reddy Kalluru pri_map = be32_to_cpu(p_ets->pri_tc_tbl[0]); 4836ad8c632SSudarsana Reddy Kalluru for (i = 0; i < QED_MAX_PFC_PRIORITIES; i++) { 4846ad8c632SSudarsana Reddy Kalluru p_params->ets_tc_bw_tbl[i] = ((u8 *)bw_map)[i]; 4856ad8c632SSudarsana Reddy Kalluru p_params->ets_tc_tsa_tbl[i] = ((u8 *)tsa_map)[i]; 4866ad8c632SSudarsana Reddy Kalluru p_params->ets_pri_tc_tbl[i] = QED_DCBX_PRIO2TC(pri_map, i); 4876ad8c632SSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, 4886ad8c632SSudarsana Reddy Kalluru "elem %d bw_tbl %x tsa_tbl %x\n", 4896ad8c632SSudarsana Reddy Kalluru i, p_params->ets_tc_bw_tbl[i], 4906ad8c632SSudarsana Reddy Kalluru p_params->ets_tc_tsa_tbl[i]); 4916ad8c632SSudarsana Reddy Kalluru } 4926ad8c632SSudarsana Reddy Kalluru } 4936ad8c632SSudarsana Reddy Kalluru 4946ad8c632SSudarsana Reddy Kalluru static void 4956ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_common_params(struct qed_hwfn *p_hwfn, 4966ad8c632SSudarsana Reddy Kalluru struct dcbx_app_priority_feature *p_app, 4976ad8c632SSudarsana Reddy Kalluru struct dcbx_app_priority_entry *p_tbl, 4986ad8c632SSudarsana Reddy Kalluru struct dcbx_ets_feature *p_ets, 4996ad8c632SSudarsana Reddy Kalluru u32 pfc, struct qed_dcbx_params *p_params) 5006ad8c632SSudarsana Reddy Kalluru { 5016ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_app_data(p_hwfn, p_app, p_tbl, p_params); 5026ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_ets_data(p_hwfn, p_ets, p_params); 5036ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_pfc_data(p_hwfn, pfc, p_params); 5046ad8c632SSudarsana Reddy Kalluru } 5056ad8c632SSudarsana Reddy Kalluru 5066ad8c632SSudarsana Reddy Kalluru static void 5076ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_local_params(struct qed_hwfn *p_hwfn, 5086ad8c632SSudarsana Reddy Kalluru struct qed_ptt *p_ptt, struct qed_dcbx_get *params) 5096ad8c632SSudarsana Reddy Kalluru { 5106ad8c632SSudarsana Reddy Kalluru struct dcbx_features *p_feat; 5116ad8c632SSudarsana Reddy Kalluru 5126ad8c632SSudarsana Reddy Kalluru p_feat = &p_hwfn->p_dcbx_info->local_admin.features; 5136ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_common_params(p_hwfn, &p_feat->app, 5146ad8c632SSudarsana Reddy Kalluru p_feat->app.app_pri_tbl, &p_feat->ets, 5156ad8c632SSudarsana Reddy Kalluru p_feat->pfc, ¶ms->local.params); 5166ad8c632SSudarsana Reddy Kalluru params->local.valid = true; 5176ad8c632SSudarsana Reddy Kalluru } 5186ad8c632SSudarsana Reddy Kalluru 5196ad8c632SSudarsana Reddy Kalluru static void 5206ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_remote_params(struct qed_hwfn *p_hwfn, 5216ad8c632SSudarsana Reddy Kalluru struct qed_ptt *p_ptt, struct qed_dcbx_get *params) 5226ad8c632SSudarsana Reddy Kalluru { 5236ad8c632SSudarsana Reddy Kalluru struct dcbx_features *p_feat; 5246ad8c632SSudarsana Reddy Kalluru 5256ad8c632SSudarsana Reddy Kalluru p_feat = &p_hwfn->p_dcbx_info->remote.features; 5266ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_common_params(p_hwfn, &p_feat->app, 5276ad8c632SSudarsana Reddy Kalluru p_feat->app.app_pri_tbl, &p_feat->ets, 5286ad8c632SSudarsana Reddy Kalluru p_feat->pfc, ¶ms->remote.params); 5296ad8c632SSudarsana Reddy Kalluru params->remote.valid = true; 5306ad8c632SSudarsana Reddy Kalluru } 5316ad8c632SSudarsana Reddy Kalluru 5326ad8c632SSudarsana Reddy Kalluru static void 5336ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_operational_params(struct qed_hwfn *p_hwfn, 5346ad8c632SSudarsana Reddy Kalluru struct qed_ptt *p_ptt, 5356ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_get *params) 5366ad8c632SSudarsana Reddy Kalluru { 5376ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_operational_params *p_operational; 5386ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_results *p_results; 5396ad8c632SSudarsana Reddy Kalluru struct dcbx_features *p_feat; 5406ad8c632SSudarsana Reddy Kalluru bool enabled, err; 5416ad8c632SSudarsana Reddy Kalluru u32 flags; 5426ad8c632SSudarsana Reddy Kalluru bool val; 5436ad8c632SSudarsana Reddy Kalluru 5446ad8c632SSudarsana Reddy Kalluru flags = p_hwfn->p_dcbx_info->operational.flags; 5456ad8c632SSudarsana Reddy Kalluru 5466ad8c632SSudarsana Reddy Kalluru /* If DCBx version is non zero, then negotiation 5476ad8c632SSudarsana Reddy Kalluru * was successfuly performed 5486ad8c632SSudarsana Reddy Kalluru */ 5496ad8c632SSudarsana Reddy Kalluru p_operational = ¶ms->operational; 5506ad8c632SSudarsana Reddy Kalluru enabled = !!(QED_MFW_GET_FIELD(flags, DCBX_CONFIG_VERSION) != 5516ad8c632SSudarsana Reddy Kalluru DCBX_CONFIG_VERSION_DISABLED); 5526ad8c632SSudarsana Reddy Kalluru if (!enabled) { 5536ad8c632SSudarsana Reddy Kalluru p_operational->enabled = enabled; 5546ad8c632SSudarsana Reddy Kalluru p_operational->valid = false; 5556ad8c632SSudarsana Reddy Kalluru return; 5566ad8c632SSudarsana Reddy Kalluru } 5576ad8c632SSudarsana Reddy Kalluru 5586ad8c632SSudarsana Reddy Kalluru p_feat = &p_hwfn->p_dcbx_info->operational.features; 5596ad8c632SSudarsana Reddy Kalluru p_results = &p_hwfn->p_dcbx_info->results; 5606ad8c632SSudarsana Reddy Kalluru 5616ad8c632SSudarsana Reddy Kalluru val = !!(QED_MFW_GET_FIELD(flags, DCBX_CONFIG_VERSION) == 5626ad8c632SSudarsana Reddy Kalluru DCBX_CONFIG_VERSION_IEEE); 5636ad8c632SSudarsana Reddy Kalluru p_operational->ieee = val; 5646ad8c632SSudarsana Reddy Kalluru val = !!(QED_MFW_GET_FIELD(flags, DCBX_CONFIG_VERSION) == 5656ad8c632SSudarsana Reddy Kalluru DCBX_CONFIG_VERSION_CEE); 5666ad8c632SSudarsana Reddy Kalluru p_operational->cee = val; 5676ad8c632SSudarsana Reddy Kalluru 5686ad8c632SSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, "Version support: ieee %d, cee %d\n", 5696ad8c632SSudarsana Reddy Kalluru p_operational->ieee, p_operational->cee); 5706ad8c632SSudarsana Reddy Kalluru 5716ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_common_params(p_hwfn, &p_feat->app, 5726ad8c632SSudarsana Reddy Kalluru p_feat->app.app_pri_tbl, &p_feat->ets, 5736ad8c632SSudarsana Reddy Kalluru p_feat->pfc, ¶ms->operational.params); 5746ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_priority_info(p_hwfn, &p_operational->app_prio, p_results); 5756ad8c632SSudarsana Reddy Kalluru err = QED_MFW_GET_FIELD(p_feat->app.flags, DCBX_APP_ERROR); 5766ad8c632SSudarsana Reddy Kalluru p_operational->err = err; 5776ad8c632SSudarsana Reddy Kalluru p_operational->enabled = enabled; 5786ad8c632SSudarsana Reddy Kalluru p_operational->valid = true; 5796ad8c632SSudarsana Reddy Kalluru } 5806ad8c632SSudarsana Reddy Kalluru 5816ad8c632SSudarsana Reddy Kalluru static void 5826ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_local_lldp_params(struct qed_hwfn *p_hwfn, 5836ad8c632SSudarsana Reddy Kalluru struct qed_ptt *p_ptt, 5846ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_get *params) 5856ad8c632SSudarsana Reddy Kalluru { 5866ad8c632SSudarsana Reddy Kalluru struct lldp_config_params_s *p_local; 5876ad8c632SSudarsana Reddy Kalluru 5886ad8c632SSudarsana Reddy Kalluru p_local = &p_hwfn->p_dcbx_info->lldp_local[LLDP_NEAREST_BRIDGE]; 5896ad8c632SSudarsana Reddy Kalluru 5906ad8c632SSudarsana Reddy Kalluru memcpy(params->lldp_local.local_chassis_id, p_local->local_chassis_id, 5916ad8c632SSudarsana Reddy Kalluru ARRAY_SIZE(p_local->local_chassis_id)); 5926ad8c632SSudarsana Reddy Kalluru memcpy(params->lldp_local.local_port_id, p_local->local_port_id, 5936ad8c632SSudarsana Reddy Kalluru ARRAY_SIZE(p_local->local_port_id)); 5946ad8c632SSudarsana Reddy Kalluru } 5956ad8c632SSudarsana Reddy Kalluru 5966ad8c632SSudarsana Reddy Kalluru static void 5976ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_remote_lldp_params(struct qed_hwfn *p_hwfn, 5986ad8c632SSudarsana Reddy Kalluru struct qed_ptt *p_ptt, 5996ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_get *params) 6006ad8c632SSudarsana Reddy Kalluru { 6016ad8c632SSudarsana Reddy Kalluru struct lldp_status_params_s *p_remote; 6026ad8c632SSudarsana Reddy Kalluru 6036ad8c632SSudarsana Reddy Kalluru p_remote = &p_hwfn->p_dcbx_info->lldp_remote[LLDP_NEAREST_BRIDGE]; 6046ad8c632SSudarsana Reddy Kalluru 6056ad8c632SSudarsana Reddy Kalluru memcpy(params->lldp_remote.peer_chassis_id, p_remote->peer_chassis_id, 6066ad8c632SSudarsana Reddy Kalluru ARRAY_SIZE(p_remote->peer_chassis_id)); 6076ad8c632SSudarsana Reddy Kalluru memcpy(params->lldp_remote.peer_port_id, p_remote->peer_port_id, 6086ad8c632SSudarsana Reddy Kalluru ARRAY_SIZE(p_remote->peer_port_id)); 6096ad8c632SSudarsana Reddy Kalluru } 6106ad8c632SSudarsana Reddy Kalluru 6116ad8c632SSudarsana Reddy Kalluru static int 6126ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_params(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, 6136ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_get *p_params, 6146ad8c632SSudarsana Reddy Kalluru enum qed_mib_read_type type) 6156ad8c632SSudarsana Reddy Kalluru { 6166ad8c632SSudarsana Reddy Kalluru switch (type) { 6176ad8c632SSudarsana Reddy Kalluru case QED_DCBX_REMOTE_MIB: 6186ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_remote_params(p_hwfn, p_ptt, p_params); 6196ad8c632SSudarsana Reddy Kalluru break; 6206ad8c632SSudarsana Reddy Kalluru case QED_DCBX_LOCAL_MIB: 6216ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_local_params(p_hwfn, p_ptt, p_params); 6226ad8c632SSudarsana Reddy Kalluru break; 6236ad8c632SSudarsana Reddy Kalluru case QED_DCBX_OPERATIONAL_MIB: 6246ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_operational_params(p_hwfn, p_ptt, p_params); 6256ad8c632SSudarsana Reddy Kalluru break; 6266ad8c632SSudarsana Reddy Kalluru case QED_DCBX_REMOTE_LLDP_MIB: 6276ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_remote_lldp_params(p_hwfn, p_ptt, p_params); 6286ad8c632SSudarsana Reddy Kalluru break; 6296ad8c632SSudarsana Reddy Kalluru case QED_DCBX_LOCAL_LLDP_MIB: 6306ad8c632SSudarsana Reddy Kalluru qed_dcbx_get_local_lldp_params(p_hwfn, p_ptt, p_params); 6316ad8c632SSudarsana Reddy Kalluru break; 6326ad8c632SSudarsana Reddy Kalluru default: 6336ad8c632SSudarsana Reddy Kalluru DP_ERR(p_hwfn, "MIB read err, unknown mib type %d\n", type); 6346ad8c632SSudarsana Reddy Kalluru return -EINVAL; 6356ad8c632SSudarsana Reddy Kalluru } 6366ad8c632SSudarsana Reddy Kalluru 6376ad8c632SSudarsana Reddy Kalluru return 0; 6386ad8c632SSudarsana Reddy Kalluru } 6396ad8c632SSudarsana Reddy Kalluru #endif 6406ad8c632SSudarsana Reddy Kalluru 64139651abdSSudarsana Reddy Kalluru static int 64239651abdSSudarsana Reddy Kalluru qed_dcbx_read_local_lldp_mib(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt) 64339651abdSSudarsana Reddy Kalluru { 64439651abdSSudarsana Reddy Kalluru struct qed_dcbx_mib_meta_data data; 64539651abdSSudarsana Reddy Kalluru int rc = 0; 64639651abdSSudarsana Reddy Kalluru 64739651abdSSudarsana Reddy Kalluru memset(&data, 0, sizeof(data)); 64839651abdSSudarsana Reddy Kalluru data.addr = p_hwfn->mcp_info->port_addr + offsetof(struct public_port, 64939651abdSSudarsana Reddy Kalluru lldp_config_params); 65039651abdSSudarsana Reddy Kalluru data.lldp_local = p_hwfn->p_dcbx_info->lldp_local; 65139651abdSSudarsana Reddy Kalluru data.size = sizeof(struct lldp_config_params_s); 65239651abdSSudarsana Reddy Kalluru qed_memcpy_from(p_hwfn, p_ptt, data.lldp_local, data.addr, data.size); 65339651abdSSudarsana Reddy Kalluru 65439651abdSSudarsana Reddy Kalluru return rc; 65539651abdSSudarsana Reddy Kalluru } 65639651abdSSudarsana Reddy Kalluru 65739651abdSSudarsana Reddy Kalluru static int 65839651abdSSudarsana Reddy Kalluru qed_dcbx_read_remote_lldp_mib(struct qed_hwfn *p_hwfn, 65939651abdSSudarsana Reddy Kalluru struct qed_ptt *p_ptt, 66039651abdSSudarsana Reddy Kalluru enum qed_mib_read_type type) 66139651abdSSudarsana Reddy Kalluru { 66239651abdSSudarsana Reddy Kalluru struct qed_dcbx_mib_meta_data data; 66339651abdSSudarsana Reddy Kalluru int rc = 0; 66439651abdSSudarsana Reddy Kalluru 66539651abdSSudarsana Reddy Kalluru memset(&data, 0, sizeof(data)); 66639651abdSSudarsana Reddy Kalluru data.addr = p_hwfn->mcp_info->port_addr + offsetof(struct public_port, 66739651abdSSudarsana Reddy Kalluru lldp_status_params); 66839651abdSSudarsana Reddy Kalluru data.lldp_remote = p_hwfn->p_dcbx_info->lldp_remote; 66939651abdSSudarsana Reddy Kalluru data.size = sizeof(struct lldp_status_params_s); 67039651abdSSudarsana Reddy Kalluru rc = qed_dcbx_copy_mib(p_hwfn, p_ptt, &data, type); 67139651abdSSudarsana Reddy Kalluru 67239651abdSSudarsana Reddy Kalluru return rc; 67339651abdSSudarsana Reddy Kalluru } 67439651abdSSudarsana Reddy Kalluru 67539651abdSSudarsana Reddy Kalluru static int 67639651abdSSudarsana Reddy Kalluru qed_dcbx_read_operational_mib(struct qed_hwfn *p_hwfn, 67739651abdSSudarsana Reddy Kalluru struct qed_ptt *p_ptt, 67839651abdSSudarsana Reddy Kalluru enum qed_mib_read_type type) 67939651abdSSudarsana Reddy Kalluru { 68039651abdSSudarsana Reddy Kalluru struct qed_dcbx_mib_meta_data data; 68139651abdSSudarsana Reddy Kalluru int rc = 0; 68239651abdSSudarsana Reddy Kalluru 68339651abdSSudarsana Reddy Kalluru memset(&data, 0, sizeof(data)); 68439651abdSSudarsana Reddy Kalluru data.addr = p_hwfn->mcp_info->port_addr + 68539651abdSSudarsana Reddy Kalluru offsetof(struct public_port, operational_dcbx_mib); 68639651abdSSudarsana Reddy Kalluru data.mib = &p_hwfn->p_dcbx_info->operational; 68739651abdSSudarsana Reddy Kalluru data.size = sizeof(struct dcbx_mib); 68839651abdSSudarsana Reddy Kalluru rc = qed_dcbx_copy_mib(p_hwfn, p_ptt, &data, type); 68939651abdSSudarsana Reddy Kalluru 69039651abdSSudarsana Reddy Kalluru return rc; 69139651abdSSudarsana Reddy Kalluru } 69239651abdSSudarsana Reddy Kalluru 69339651abdSSudarsana Reddy Kalluru static int 69439651abdSSudarsana Reddy Kalluru qed_dcbx_read_remote_mib(struct qed_hwfn *p_hwfn, 69539651abdSSudarsana Reddy Kalluru struct qed_ptt *p_ptt, enum qed_mib_read_type type) 69639651abdSSudarsana Reddy Kalluru { 69739651abdSSudarsana Reddy Kalluru struct qed_dcbx_mib_meta_data data; 69839651abdSSudarsana Reddy Kalluru int rc = 0; 69939651abdSSudarsana Reddy Kalluru 70039651abdSSudarsana Reddy Kalluru memset(&data, 0, sizeof(data)); 70139651abdSSudarsana Reddy Kalluru data.addr = p_hwfn->mcp_info->port_addr + 70239651abdSSudarsana Reddy Kalluru offsetof(struct public_port, remote_dcbx_mib); 70339651abdSSudarsana Reddy Kalluru data.mib = &p_hwfn->p_dcbx_info->remote; 70439651abdSSudarsana Reddy Kalluru data.size = sizeof(struct dcbx_mib); 70539651abdSSudarsana Reddy Kalluru rc = qed_dcbx_copy_mib(p_hwfn, p_ptt, &data, type); 70639651abdSSudarsana Reddy Kalluru 70739651abdSSudarsana Reddy Kalluru return rc; 70839651abdSSudarsana Reddy Kalluru } 70939651abdSSudarsana Reddy Kalluru 71039651abdSSudarsana Reddy Kalluru static int 71139651abdSSudarsana Reddy Kalluru qed_dcbx_read_local_mib(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt) 71239651abdSSudarsana Reddy Kalluru { 71339651abdSSudarsana Reddy Kalluru struct qed_dcbx_mib_meta_data data; 71439651abdSSudarsana Reddy Kalluru int rc = 0; 71539651abdSSudarsana Reddy Kalluru 71639651abdSSudarsana Reddy Kalluru memset(&data, 0, sizeof(data)); 71739651abdSSudarsana Reddy Kalluru data.addr = p_hwfn->mcp_info->port_addr + 71839651abdSSudarsana Reddy Kalluru offsetof(struct public_port, local_admin_dcbx_mib); 71939651abdSSudarsana Reddy Kalluru data.local_admin = &p_hwfn->p_dcbx_info->local_admin; 72039651abdSSudarsana Reddy Kalluru data.size = sizeof(struct dcbx_local_params); 72139651abdSSudarsana Reddy Kalluru qed_memcpy_from(p_hwfn, p_ptt, data.local_admin, data.addr, data.size); 72239651abdSSudarsana Reddy Kalluru 72339651abdSSudarsana Reddy Kalluru return rc; 72439651abdSSudarsana Reddy Kalluru } 72539651abdSSudarsana Reddy Kalluru 72639651abdSSudarsana Reddy Kalluru static int qed_dcbx_read_mib(struct qed_hwfn *p_hwfn, 72739651abdSSudarsana Reddy Kalluru struct qed_ptt *p_ptt, enum qed_mib_read_type type) 72839651abdSSudarsana Reddy Kalluru { 72939651abdSSudarsana Reddy Kalluru int rc = -EINVAL; 73039651abdSSudarsana Reddy Kalluru 73139651abdSSudarsana Reddy Kalluru switch (type) { 73239651abdSSudarsana Reddy Kalluru case QED_DCBX_OPERATIONAL_MIB: 73339651abdSSudarsana Reddy Kalluru rc = qed_dcbx_read_operational_mib(p_hwfn, p_ptt, type); 73439651abdSSudarsana Reddy Kalluru break; 73539651abdSSudarsana Reddy Kalluru case QED_DCBX_REMOTE_MIB: 73639651abdSSudarsana Reddy Kalluru rc = qed_dcbx_read_remote_mib(p_hwfn, p_ptt, type); 73739651abdSSudarsana Reddy Kalluru break; 73839651abdSSudarsana Reddy Kalluru case QED_DCBX_LOCAL_MIB: 73939651abdSSudarsana Reddy Kalluru rc = qed_dcbx_read_local_mib(p_hwfn, p_ptt); 74039651abdSSudarsana Reddy Kalluru break; 74139651abdSSudarsana Reddy Kalluru case QED_DCBX_REMOTE_LLDP_MIB: 74239651abdSSudarsana Reddy Kalluru rc = qed_dcbx_read_remote_lldp_mib(p_hwfn, p_ptt, type); 74339651abdSSudarsana Reddy Kalluru break; 74439651abdSSudarsana Reddy Kalluru case QED_DCBX_LOCAL_LLDP_MIB: 74539651abdSSudarsana Reddy Kalluru rc = qed_dcbx_read_local_lldp_mib(p_hwfn, p_ptt); 74639651abdSSudarsana Reddy Kalluru break; 74739651abdSSudarsana Reddy Kalluru default: 74839651abdSSudarsana Reddy Kalluru DP_ERR(p_hwfn, "MIB read err, unknown mib type %d\n", type); 74939651abdSSudarsana Reddy Kalluru } 75039651abdSSudarsana Reddy Kalluru 75139651abdSSudarsana Reddy Kalluru return rc; 75239651abdSSudarsana Reddy Kalluru } 75339651abdSSudarsana Reddy Kalluru 75439651abdSSudarsana Reddy Kalluru /* Read updated MIB. 75539651abdSSudarsana Reddy Kalluru * Reconfigure QM and invoke PF update ramrod command if operational MIB 75639651abdSSudarsana Reddy Kalluru * change is detected. 75739651abdSSudarsana Reddy Kalluru */ 75839651abdSSudarsana Reddy Kalluru int 75939651abdSSudarsana Reddy Kalluru qed_dcbx_mib_update_event(struct qed_hwfn *p_hwfn, 76039651abdSSudarsana Reddy Kalluru struct qed_ptt *p_ptt, enum qed_mib_read_type type) 76139651abdSSudarsana Reddy Kalluru { 76239651abdSSudarsana Reddy Kalluru int rc = 0; 76339651abdSSudarsana Reddy Kalluru 76439651abdSSudarsana Reddy Kalluru rc = qed_dcbx_read_mib(p_hwfn, p_ptt, type); 76539651abdSSudarsana Reddy Kalluru if (rc) 76639651abdSSudarsana Reddy Kalluru return rc; 76739651abdSSudarsana Reddy Kalluru 76839651abdSSudarsana Reddy Kalluru if (type == QED_DCBX_OPERATIONAL_MIB) { 76939651abdSSudarsana Reddy Kalluru rc = qed_dcbx_process_mib_info(p_hwfn); 77039651abdSSudarsana Reddy Kalluru if (!rc) { 77139651abdSSudarsana Reddy Kalluru /* reconfigure tcs of QM queues according 77239651abdSSudarsana Reddy Kalluru * to negotiation results 77339651abdSSudarsana Reddy Kalluru */ 77439651abdSSudarsana Reddy Kalluru qed_qm_reconf(p_hwfn, p_ptt); 77539651abdSSudarsana Reddy Kalluru 77639651abdSSudarsana Reddy Kalluru /* update storm FW with negotiation results */ 77739651abdSSudarsana Reddy Kalluru qed_sp_pf_update(p_hwfn); 77839651abdSSudarsana Reddy Kalluru } 77939651abdSSudarsana Reddy Kalluru } 78039651abdSSudarsana Reddy Kalluru 78139651abdSSudarsana Reddy Kalluru return rc; 78239651abdSSudarsana Reddy Kalluru } 78339651abdSSudarsana Reddy Kalluru 78439651abdSSudarsana Reddy Kalluru int qed_dcbx_info_alloc(struct qed_hwfn *p_hwfn) 78539651abdSSudarsana Reddy Kalluru { 78639651abdSSudarsana Reddy Kalluru int rc = 0; 78739651abdSSudarsana Reddy Kalluru 78839651abdSSudarsana Reddy Kalluru p_hwfn->p_dcbx_info = kzalloc(sizeof(*p_hwfn->p_dcbx_info), GFP_KERNEL); 78939651abdSSudarsana Reddy Kalluru if (!p_hwfn->p_dcbx_info) { 79039651abdSSudarsana Reddy Kalluru DP_NOTICE(p_hwfn, 79139651abdSSudarsana Reddy Kalluru "Failed to allocate 'struct qed_dcbx_info'\n"); 79239651abdSSudarsana Reddy Kalluru rc = -ENOMEM; 79339651abdSSudarsana Reddy Kalluru } 79439651abdSSudarsana Reddy Kalluru 79539651abdSSudarsana Reddy Kalluru return rc; 79639651abdSSudarsana Reddy Kalluru } 79739651abdSSudarsana Reddy Kalluru 79839651abdSSudarsana Reddy Kalluru void qed_dcbx_info_free(struct qed_hwfn *p_hwfn, 79939651abdSSudarsana Reddy Kalluru struct qed_dcbx_info *p_dcbx_info) 80039651abdSSudarsana Reddy Kalluru { 80139651abdSSudarsana Reddy Kalluru kfree(p_hwfn->p_dcbx_info); 80239651abdSSudarsana Reddy Kalluru } 80339651abdSSudarsana Reddy Kalluru 80439651abdSSudarsana Reddy Kalluru static void qed_dcbx_update_protocol_data(struct protocol_dcb_data *p_data, 80539651abdSSudarsana Reddy Kalluru struct qed_dcbx_results *p_src, 80639651abdSSudarsana Reddy Kalluru enum dcbx_protocol_type type) 80739651abdSSudarsana Reddy Kalluru { 80839651abdSSudarsana Reddy Kalluru p_data->dcb_enable_flag = p_src->arr[type].enable; 80939651abdSSudarsana Reddy Kalluru p_data->dcb_priority = p_src->arr[type].priority; 81039651abdSSudarsana Reddy Kalluru p_data->dcb_tc = p_src->arr[type].tc; 81139651abdSSudarsana Reddy Kalluru } 81239651abdSSudarsana Reddy Kalluru 81339651abdSSudarsana Reddy Kalluru /* Set pf update ramrod command params */ 81439651abdSSudarsana Reddy Kalluru void qed_dcbx_set_pf_update_params(struct qed_dcbx_results *p_src, 81539651abdSSudarsana Reddy Kalluru struct pf_update_ramrod_data *p_dest) 81639651abdSSudarsana Reddy Kalluru { 81739651abdSSudarsana Reddy Kalluru struct protocol_dcb_data *p_dcb_data; 81839651abdSSudarsana Reddy Kalluru bool update_flag = false; 81939651abdSSudarsana Reddy Kalluru 82039651abdSSudarsana Reddy Kalluru p_dest->pf_id = p_src->pf_id; 82139651abdSSudarsana Reddy Kalluru 82239651abdSSudarsana Reddy Kalluru update_flag = p_src->arr[DCBX_PROTOCOL_FCOE].update; 82339651abdSSudarsana Reddy Kalluru p_dest->update_fcoe_dcb_data_flag = update_flag; 82439651abdSSudarsana Reddy Kalluru 82539651abdSSudarsana Reddy Kalluru update_flag = p_src->arr[DCBX_PROTOCOL_ROCE].update; 82639651abdSSudarsana Reddy Kalluru p_dest->update_roce_dcb_data_flag = update_flag; 82739651abdSSudarsana Reddy Kalluru update_flag = p_src->arr[DCBX_PROTOCOL_ROCE_V2].update; 82839651abdSSudarsana Reddy Kalluru p_dest->update_roce_dcb_data_flag = update_flag; 82939651abdSSudarsana Reddy Kalluru 83039651abdSSudarsana Reddy Kalluru update_flag = p_src->arr[DCBX_PROTOCOL_ISCSI].update; 83139651abdSSudarsana Reddy Kalluru p_dest->update_iscsi_dcb_data_flag = update_flag; 83239651abdSSudarsana Reddy Kalluru update_flag = p_src->arr[DCBX_PROTOCOL_ETH].update; 83339651abdSSudarsana Reddy Kalluru p_dest->update_eth_dcb_data_flag = update_flag; 83439651abdSSudarsana Reddy Kalluru 83539651abdSSudarsana Reddy Kalluru p_dcb_data = &p_dest->fcoe_dcb_data; 83639651abdSSudarsana Reddy Kalluru qed_dcbx_update_protocol_data(p_dcb_data, p_src, DCBX_PROTOCOL_FCOE); 83739651abdSSudarsana Reddy Kalluru p_dcb_data = &p_dest->roce_dcb_data; 83839651abdSSudarsana Reddy Kalluru 83939651abdSSudarsana Reddy Kalluru if (p_src->arr[DCBX_PROTOCOL_ROCE].update) 84039651abdSSudarsana Reddy Kalluru qed_dcbx_update_protocol_data(p_dcb_data, p_src, 84139651abdSSudarsana Reddy Kalluru DCBX_PROTOCOL_ROCE); 84239651abdSSudarsana Reddy Kalluru if (p_src->arr[DCBX_PROTOCOL_ROCE_V2].update) 84339651abdSSudarsana Reddy Kalluru qed_dcbx_update_protocol_data(p_dcb_data, p_src, 84439651abdSSudarsana Reddy Kalluru DCBX_PROTOCOL_ROCE_V2); 84539651abdSSudarsana Reddy Kalluru 84639651abdSSudarsana Reddy Kalluru p_dcb_data = &p_dest->iscsi_dcb_data; 84739651abdSSudarsana Reddy Kalluru qed_dcbx_update_protocol_data(p_dcb_data, p_src, DCBX_PROTOCOL_ISCSI); 84839651abdSSudarsana Reddy Kalluru p_dcb_data = &p_dest->eth_dcb_data; 84939651abdSSudarsana Reddy Kalluru qed_dcbx_update_protocol_data(p_dcb_data, p_src, DCBX_PROTOCOL_ETH); 85039651abdSSudarsana Reddy Kalluru } 8516ad8c632SSudarsana Reddy Kalluru 8526ad8c632SSudarsana Reddy Kalluru #ifdef CONFIG_DCB 8536ad8c632SSudarsana Reddy Kalluru static int qed_dcbx_query_params(struct qed_hwfn *p_hwfn, 8546ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_get *p_get, 8556ad8c632SSudarsana Reddy Kalluru enum qed_mib_read_type type) 8566ad8c632SSudarsana Reddy Kalluru { 8576ad8c632SSudarsana Reddy Kalluru struct qed_ptt *p_ptt; 8586ad8c632SSudarsana Reddy Kalluru int rc; 8596ad8c632SSudarsana Reddy Kalluru 8606ad8c632SSudarsana Reddy Kalluru p_ptt = qed_ptt_acquire(p_hwfn); 8616ad8c632SSudarsana Reddy Kalluru if (!p_ptt) 8626ad8c632SSudarsana Reddy Kalluru return -EBUSY; 8636ad8c632SSudarsana Reddy Kalluru 8646ad8c632SSudarsana Reddy Kalluru rc = qed_dcbx_read_mib(p_hwfn, p_ptt, type); 8656ad8c632SSudarsana Reddy Kalluru if (rc) 8666ad8c632SSudarsana Reddy Kalluru goto out; 8676ad8c632SSudarsana Reddy Kalluru 8686ad8c632SSudarsana Reddy Kalluru rc = qed_dcbx_get_params(p_hwfn, p_ptt, p_get, type); 8696ad8c632SSudarsana Reddy Kalluru 8706ad8c632SSudarsana Reddy Kalluru out: 8716ad8c632SSudarsana Reddy Kalluru qed_ptt_release(p_hwfn, p_ptt); 8726ad8c632SSudarsana Reddy Kalluru return rc; 8736ad8c632SSudarsana Reddy Kalluru } 8746ad8c632SSudarsana Reddy Kalluru 8756ad8c632SSudarsana Reddy Kalluru static void 8766ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_pfc_data(struct qed_hwfn *p_hwfn, 8776ad8c632SSudarsana Reddy Kalluru u32 *pfc, struct qed_dcbx_params *p_params) 8786ad8c632SSudarsana Reddy Kalluru { 8796ad8c632SSudarsana Reddy Kalluru u8 pfc_map = 0; 8806ad8c632SSudarsana Reddy Kalluru int i; 8816ad8c632SSudarsana Reddy Kalluru 8826ad8c632SSudarsana Reddy Kalluru if (p_params->pfc.willing) 8836ad8c632SSudarsana Reddy Kalluru *pfc |= DCBX_PFC_WILLING_MASK; 8846ad8c632SSudarsana Reddy Kalluru else 8856ad8c632SSudarsana Reddy Kalluru *pfc &= ~DCBX_PFC_WILLING_MASK; 8866ad8c632SSudarsana Reddy Kalluru 8876ad8c632SSudarsana Reddy Kalluru if (p_params->pfc.enabled) 8886ad8c632SSudarsana Reddy Kalluru *pfc |= DCBX_PFC_ENABLED_MASK; 8896ad8c632SSudarsana Reddy Kalluru else 8906ad8c632SSudarsana Reddy Kalluru *pfc &= ~DCBX_PFC_ENABLED_MASK; 8916ad8c632SSudarsana Reddy Kalluru 8926ad8c632SSudarsana Reddy Kalluru *pfc &= ~DCBX_PFC_CAPS_MASK; 8936ad8c632SSudarsana Reddy Kalluru *pfc |= (u32)p_params->pfc.max_tc << DCBX_PFC_CAPS_SHIFT; 8946ad8c632SSudarsana Reddy Kalluru 8956ad8c632SSudarsana Reddy Kalluru for (i = 0; i < QED_MAX_PFC_PRIORITIES; i++) 8966ad8c632SSudarsana Reddy Kalluru if (p_params->pfc.prio[i]) 8976ad8c632SSudarsana Reddy Kalluru pfc_map |= BIT(i); 8986ad8c632SSudarsana Reddy Kalluru 8996ad8c632SSudarsana Reddy Kalluru *pfc |= (pfc_map << DCBX_PFC_PRI_EN_BITMAP_SHIFT); 9006ad8c632SSudarsana Reddy Kalluru 9016ad8c632SSudarsana Reddy Kalluru DP_VERBOSE(p_hwfn, QED_MSG_DCB, "pfc = 0x%x\n", *pfc); 9026ad8c632SSudarsana Reddy Kalluru } 9036ad8c632SSudarsana Reddy Kalluru 9046ad8c632SSudarsana Reddy Kalluru static void 9056ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_ets_data(struct qed_hwfn *p_hwfn, 9066ad8c632SSudarsana Reddy Kalluru struct dcbx_ets_feature *p_ets, 9076ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_params *p_params) 9086ad8c632SSudarsana Reddy Kalluru { 9096ad8c632SSudarsana Reddy Kalluru u8 *bw_map, *tsa_map; 9106ad8c632SSudarsana Reddy Kalluru u32 val; 9116ad8c632SSudarsana Reddy Kalluru int i; 9126ad8c632SSudarsana Reddy Kalluru 9136ad8c632SSudarsana Reddy Kalluru if (p_params->ets_willing) 9146ad8c632SSudarsana Reddy Kalluru p_ets->flags |= DCBX_ETS_WILLING_MASK; 9156ad8c632SSudarsana Reddy Kalluru else 9166ad8c632SSudarsana Reddy Kalluru p_ets->flags &= ~DCBX_ETS_WILLING_MASK; 9176ad8c632SSudarsana Reddy Kalluru 9186ad8c632SSudarsana Reddy Kalluru if (p_params->ets_cbs) 9196ad8c632SSudarsana Reddy Kalluru p_ets->flags |= DCBX_ETS_CBS_MASK; 9206ad8c632SSudarsana Reddy Kalluru else 9216ad8c632SSudarsana Reddy Kalluru p_ets->flags &= ~DCBX_ETS_CBS_MASK; 9226ad8c632SSudarsana Reddy Kalluru 9236ad8c632SSudarsana Reddy Kalluru if (p_params->ets_enabled) 9246ad8c632SSudarsana Reddy Kalluru p_ets->flags |= DCBX_ETS_ENABLED_MASK; 9256ad8c632SSudarsana Reddy Kalluru else 9266ad8c632SSudarsana Reddy Kalluru p_ets->flags &= ~DCBX_ETS_ENABLED_MASK; 9276ad8c632SSudarsana Reddy Kalluru 9286ad8c632SSudarsana Reddy Kalluru p_ets->flags &= ~DCBX_ETS_MAX_TCS_MASK; 9296ad8c632SSudarsana Reddy Kalluru p_ets->flags |= (u32)p_params->max_ets_tc << DCBX_ETS_MAX_TCS_SHIFT; 9306ad8c632SSudarsana Reddy Kalluru 9316ad8c632SSudarsana Reddy Kalluru bw_map = (u8 *)&p_ets->tc_bw_tbl[0]; 9326ad8c632SSudarsana Reddy Kalluru tsa_map = (u8 *)&p_ets->tc_tsa_tbl[0]; 9336ad8c632SSudarsana Reddy Kalluru p_ets->pri_tc_tbl[0] = 0; 9346ad8c632SSudarsana Reddy Kalluru for (i = 0; i < QED_MAX_PFC_PRIORITIES; i++) { 9356ad8c632SSudarsana Reddy Kalluru bw_map[i] = p_params->ets_tc_bw_tbl[i]; 9366ad8c632SSudarsana Reddy Kalluru tsa_map[i] = p_params->ets_tc_tsa_tbl[i]; 9376ad8c632SSudarsana Reddy Kalluru /* Copy the priority value to the corresponding 4 bits in the 9386ad8c632SSudarsana Reddy Kalluru * traffic class table. 9396ad8c632SSudarsana Reddy Kalluru */ 9406ad8c632SSudarsana Reddy Kalluru val = (((u32)p_params->ets_pri_tc_tbl[i]) << ((7 - i) * 4)); 9416ad8c632SSudarsana Reddy Kalluru p_ets->pri_tc_tbl[0] |= val; 9426ad8c632SSudarsana Reddy Kalluru } 9436ad8c632SSudarsana Reddy Kalluru p_ets->pri_tc_tbl[0] = cpu_to_be32(p_ets->pri_tc_tbl[0]); 9446ad8c632SSudarsana Reddy Kalluru for (i = 0; i < 2; i++) { 9456ad8c632SSudarsana Reddy Kalluru p_ets->tc_bw_tbl[i] = cpu_to_be32(p_ets->tc_bw_tbl[i]); 9466ad8c632SSudarsana Reddy Kalluru p_ets->tc_tsa_tbl[i] = cpu_to_be32(p_ets->tc_tsa_tbl[i]); 9476ad8c632SSudarsana Reddy Kalluru } 9486ad8c632SSudarsana Reddy Kalluru } 9496ad8c632SSudarsana Reddy Kalluru 9506ad8c632SSudarsana Reddy Kalluru static void 9516ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_app_data(struct qed_hwfn *p_hwfn, 9526ad8c632SSudarsana Reddy Kalluru struct dcbx_app_priority_feature *p_app, 9536ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_params *p_params) 9546ad8c632SSudarsana Reddy Kalluru { 9556ad8c632SSudarsana Reddy Kalluru u32 *entry; 9566ad8c632SSudarsana Reddy Kalluru int i; 9576ad8c632SSudarsana Reddy Kalluru 9586ad8c632SSudarsana Reddy Kalluru if (p_params->app_willing) 9596ad8c632SSudarsana Reddy Kalluru p_app->flags |= DCBX_APP_WILLING_MASK; 9606ad8c632SSudarsana Reddy Kalluru else 9616ad8c632SSudarsana Reddy Kalluru p_app->flags &= ~DCBX_APP_WILLING_MASK; 9626ad8c632SSudarsana Reddy Kalluru 9636ad8c632SSudarsana Reddy Kalluru if (p_params->app_valid) 9646ad8c632SSudarsana Reddy Kalluru p_app->flags |= DCBX_APP_ENABLED_MASK; 9656ad8c632SSudarsana Reddy Kalluru else 9666ad8c632SSudarsana Reddy Kalluru p_app->flags &= ~DCBX_APP_ENABLED_MASK; 9676ad8c632SSudarsana Reddy Kalluru 9686ad8c632SSudarsana Reddy Kalluru p_app->flags &= ~DCBX_APP_NUM_ENTRIES_MASK; 9696ad8c632SSudarsana Reddy Kalluru p_app->flags |= (u32)p_params->num_app_entries << 9706ad8c632SSudarsana Reddy Kalluru DCBX_APP_NUM_ENTRIES_SHIFT; 9716ad8c632SSudarsana Reddy Kalluru 9726ad8c632SSudarsana Reddy Kalluru for (i = 0; i < DCBX_MAX_APP_PROTOCOL; i++) { 9736ad8c632SSudarsana Reddy Kalluru entry = &p_app->app_pri_tbl[i].entry; 9746ad8c632SSudarsana Reddy Kalluru *entry &= ~DCBX_APP_SF_MASK; 9756ad8c632SSudarsana Reddy Kalluru if (p_params->app_entry[i].ethtype) 9766ad8c632SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_ETHTYPE << 9776ad8c632SSudarsana Reddy Kalluru DCBX_APP_SF_SHIFT); 9786ad8c632SSudarsana Reddy Kalluru else 9796ad8c632SSudarsana Reddy Kalluru *entry |= ((u32)DCBX_APP_SF_PORT << DCBX_APP_SF_SHIFT); 9806ad8c632SSudarsana Reddy Kalluru *entry &= ~DCBX_APP_PROTOCOL_ID_MASK; 9816ad8c632SSudarsana Reddy Kalluru *entry |= ((u32)p_params->app_entry[i].proto_id << 9826ad8c632SSudarsana Reddy Kalluru DCBX_APP_PROTOCOL_ID_SHIFT); 9836ad8c632SSudarsana Reddy Kalluru *entry &= ~DCBX_APP_PRI_MAP_MASK; 9846ad8c632SSudarsana Reddy Kalluru *entry |= ((u32)(p_params->app_entry[i].prio) << 9856ad8c632SSudarsana Reddy Kalluru DCBX_APP_PRI_MAP_SHIFT); 9866ad8c632SSudarsana Reddy Kalluru } 9876ad8c632SSudarsana Reddy Kalluru } 9886ad8c632SSudarsana Reddy Kalluru 9896ad8c632SSudarsana Reddy Kalluru static void 9906ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_local_params(struct qed_hwfn *p_hwfn, 9916ad8c632SSudarsana Reddy Kalluru struct dcbx_local_params *local_admin, 9926ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_set *params) 9936ad8c632SSudarsana Reddy Kalluru { 9946ad8c632SSudarsana Reddy Kalluru local_admin->flags = 0; 9956ad8c632SSudarsana Reddy Kalluru memcpy(&local_admin->features, 9966ad8c632SSudarsana Reddy Kalluru &p_hwfn->p_dcbx_info->operational.features, 9976ad8c632SSudarsana Reddy Kalluru sizeof(local_admin->features)); 9986ad8c632SSudarsana Reddy Kalluru 9996ad8c632SSudarsana Reddy Kalluru if (params->enabled) 10006ad8c632SSudarsana Reddy Kalluru local_admin->config = params->ver_num; 10016ad8c632SSudarsana Reddy Kalluru else 10026ad8c632SSudarsana Reddy Kalluru local_admin->config = DCBX_CONFIG_VERSION_DISABLED; 10036ad8c632SSudarsana Reddy Kalluru 10046ad8c632SSudarsana Reddy Kalluru if (params->override_flags & QED_DCBX_OVERRIDE_PFC_CFG) 10056ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_pfc_data(p_hwfn, &local_admin->features.pfc, 10066ad8c632SSudarsana Reddy Kalluru ¶ms->config.params); 10076ad8c632SSudarsana Reddy Kalluru 10086ad8c632SSudarsana Reddy Kalluru if (params->override_flags & QED_DCBX_OVERRIDE_ETS_CFG) 10096ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_ets_data(p_hwfn, &local_admin->features.ets, 10106ad8c632SSudarsana Reddy Kalluru ¶ms->config.params); 10116ad8c632SSudarsana Reddy Kalluru 10126ad8c632SSudarsana Reddy Kalluru if (params->override_flags & QED_DCBX_OVERRIDE_APP_CFG) 10136ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_app_data(p_hwfn, &local_admin->features.app, 10146ad8c632SSudarsana Reddy Kalluru ¶ms->config.params); 10156ad8c632SSudarsana Reddy Kalluru } 10166ad8c632SSudarsana Reddy Kalluru 10176ad8c632SSudarsana Reddy Kalluru int qed_dcbx_config_params(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, 10186ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_set *params, bool hw_commit) 10196ad8c632SSudarsana Reddy Kalluru { 10206ad8c632SSudarsana Reddy Kalluru struct dcbx_local_params local_admin; 10216ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_mib_meta_data data; 10226ad8c632SSudarsana Reddy Kalluru u32 resp = 0, param = 0; 10236ad8c632SSudarsana Reddy Kalluru int rc = 0; 10246ad8c632SSudarsana Reddy Kalluru 10256ad8c632SSudarsana Reddy Kalluru if (!hw_commit) { 10266ad8c632SSudarsana Reddy Kalluru memcpy(&p_hwfn->p_dcbx_info->set, params, 10276ad8c632SSudarsana Reddy Kalluru sizeof(struct qed_dcbx_set)); 10286ad8c632SSudarsana Reddy Kalluru return 0; 10296ad8c632SSudarsana Reddy Kalluru } 10306ad8c632SSudarsana Reddy Kalluru 10316ad8c632SSudarsana Reddy Kalluru /* clear set-parmas cache */ 10326ad8c632SSudarsana Reddy Kalluru memset(&p_hwfn->p_dcbx_info->set, 0, sizeof(p_hwfn->p_dcbx_info->set)); 10336ad8c632SSudarsana Reddy Kalluru 10346ad8c632SSudarsana Reddy Kalluru memset(&local_admin, 0, sizeof(local_admin)); 10356ad8c632SSudarsana Reddy Kalluru qed_dcbx_set_local_params(p_hwfn, &local_admin, params); 10366ad8c632SSudarsana Reddy Kalluru 10376ad8c632SSudarsana Reddy Kalluru data.addr = p_hwfn->mcp_info->port_addr + 10386ad8c632SSudarsana Reddy Kalluru offsetof(struct public_port, local_admin_dcbx_mib); 10396ad8c632SSudarsana Reddy Kalluru data.local_admin = &local_admin; 10406ad8c632SSudarsana Reddy Kalluru data.size = sizeof(struct dcbx_local_params); 10416ad8c632SSudarsana Reddy Kalluru qed_memcpy_to(p_hwfn, p_ptt, data.addr, data.local_admin, data.size); 10426ad8c632SSudarsana Reddy Kalluru 10436ad8c632SSudarsana Reddy Kalluru rc = qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_SET_DCBX, 10446ad8c632SSudarsana Reddy Kalluru 1 << DRV_MB_PARAM_LLDP_SEND_SHIFT, &resp, ¶m); 10456ad8c632SSudarsana Reddy Kalluru if (rc) 10466ad8c632SSudarsana Reddy Kalluru DP_NOTICE(p_hwfn, "Failed to send DCBX update request\n"); 10476ad8c632SSudarsana Reddy Kalluru 10486ad8c632SSudarsana Reddy Kalluru return rc; 10496ad8c632SSudarsana Reddy Kalluru } 10506ad8c632SSudarsana Reddy Kalluru 10516ad8c632SSudarsana Reddy Kalluru int qed_dcbx_get_config_params(struct qed_hwfn *p_hwfn, 10526ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_set *params) 10536ad8c632SSudarsana Reddy Kalluru { 10546ad8c632SSudarsana Reddy Kalluru struct qed_dcbx_get *dcbx_info; 10556ad8c632SSudarsana Reddy Kalluru int rc; 10566ad8c632SSudarsana Reddy Kalluru 10576ad8c632SSudarsana Reddy Kalluru if (p_hwfn->p_dcbx_info->set.config.valid) { 10586ad8c632SSudarsana Reddy Kalluru memcpy(params, &p_hwfn->p_dcbx_info->set, 10596ad8c632SSudarsana Reddy Kalluru sizeof(struct qed_dcbx_set)); 10606ad8c632SSudarsana Reddy Kalluru return 0; 10616ad8c632SSudarsana Reddy Kalluru } 10626ad8c632SSudarsana Reddy Kalluru 10636ad8c632SSudarsana Reddy Kalluru dcbx_info = kmalloc(sizeof(*dcbx_info), GFP_KERNEL); 10646ad8c632SSudarsana Reddy Kalluru if (!dcbx_info) { 10656ad8c632SSudarsana Reddy Kalluru DP_ERR(p_hwfn, "Failed to allocate struct qed_dcbx_info\n"); 10666ad8c632SSudarsana Reddy Kalluru return -ENOMEM; 10676ad8c632SSudarsana Reddy Kalluru } 10686ad8c632SSudarsana Reddy Kalluru 10696ad8c632SSudarsana Reddy Kalluru rc = qed_dcbx_query_params(p_hwfn, dcbx_info, QED_DCBX_OPERATIONAL_MIB); 10706ad8c632SSudarsana Reddy Kalluru if (rc) { 10716ad8c632SSudarsana Reddy Kalluru kfree(dcbx_info); 10726ad8c632SSudarsana Reddy Kalluru return rc; 10736ad8c632SSudarsana Reddy Kalluru } 10746ad8c632SSudarsana Reddy Kalluru 10756ad8c632SSudarsana Reddy Kalluru p_hwfn->p_dcbx_info->set.override_flags = 0; 10766ad8c632SSudarsana Reddy Kalluru p_hwfn->p_dcbx_info->set.ver_num = DCBX_CONFIG_VERSION_DISABLED; 10776ad8c632SSudarsana Reddy Kalluru if (dcbx_info->operational.cee) 10786ad8c632SSudarsana Reddy Kalluru p_hwfn->p_dcbx_info->set.ver_num |= DCBX_CONFIG_VERSION_CEE; 10796ad8c632SSudarsana Reddy Kalluru if (dcbx_info->operational.ieee) 10806ad8c632SSudarsana Reddy Kalluru p_hwfn->p_dcbx_info->set.ver_num |= DCBX_CONFIG_VERSION_IEEE; 10816ad8c632SSudarsana Reddy Kalluru 10826ad8c632SSudarsana Reddy Kalluru p_hwfn->p_dcbx_info->set.enabled = dcbx_info->operational.enabled; 10836ad8c632SSudarsana Reddy Kalluru memcpy(&p_hwfn->p_dcbx_info->set.config.params, 10846ad8c632SSudarsana Reddy Kalluru &dcbx_info->operational.params, 10856ad8c632SSudarsana Reddy Kalluru sizeof(struct qed_dcbx_admin_params)); 10866ad8c632SSudarsana Reddy Kalluru p_hwfn->p_dcbx_info->set.config.valid = true; 10876ad8c632SSudarsana Reddy Kalluru 10886ad8c632SSudarsana Reddy Kalluru memcpy(params, &p_hwfn->p_dcbx_info->set, sizeof(struct qed_dcbx_set)); 10896ad8c632SSudarsana Reddy Kalluru 10906ad8c632SSudarsana Reddy Kalluru kfree(dcbx_info); 10916ad8c632SSudarsana Reddy Kalluru 10926ad8c632SSudarsana Reddy Kalluru return 0; 10936ad8c632SSudarsana Reddy Kalluru } 10946ad8c632SSudarsana Reddy Kalluru #endif 1095