diff --git a/wmi_unified_api.c b/wmi_unified_api.c index 9ea40e0ea8..faacc7711c 100644 --- a/wmi_unified_api.c +++ b/wmi_unified_api.c @@ -6570,3 +6570,24 @@ wmi_unified_dfs_phyerr_offload_dis_cmd(void *wmi_hdl, return QDF_STATUS_E_FAILURE; } + +/* + * wmi_extract_chainmask_tables_tlv() - extract chain mask tables + * @wmi_handle: wmi handle + * @evt_buf: pointer to event buffer. + * @chainmask_table: pointer to struct wlan_psoc_host_chainmask_table + * + * + * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_** on error + */ +QDF_STATUS wmi_extract_chainmask_tables(void *wmi_hdl, uint8_t *evt_buf, + struct wlan_psoc_host_chainmask_table *chainmask_table) +{ + wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl; + + if (wmi_handle->ops->extract_chainmask_tables) + return wmi_handle->ops->extract_chainmask_tables(wmi_handle, + evt_buf, chainmask_table); + + return QDF_STATUS_E_FAILURE; +} diff --git a/wmi_unified_tlv.c b/wmi_unified_tlv.c index 3d766dd446..af28a68588 100644 --- a/wmi_unified_tlv.c +++ b/wmi_unified_tlv.c @@ -16016,6 +16016,87 @@ static QDF_STATUS extract_pdev_utf_event_tlv(wmi_unified_t wmi_handle, return QDF_STATUS_SUCCESS; } +/** + * extract_chainmask_tables_tlv() - extract chain mask tables from event + * @wmi_handle: wmi handle + * @param evt_buf: pointer to event buffer + * @param param: Pointer to hold evt buf + * + * Return: QDF_STATUS_SUCCESS for success or error code + */ +static QDF_STATUS extract_chainmask_tables_tlv(wmi_unified_t wmi_handle, + uint8_t *event, struct wlan_psoc_host_chainmask_table *chainmask_table) +{ + WMI_SERVICE_READY_EXT_EVENTID_param_tlvs *param_buf; + WMI_MAC_PHY_CHAINMASK_CAPABILITY *chainmask_caps; + WMI_SOC_MAC_PHY_HW_MODE_CAPS *hw_caps; + uint8_t i = 0, j = 0; + + param_buf = (WMI_SERVICE_READY_EXT_EVENTID_param_tlvs *) event; + if (!param_buf) + return QDF_STATUS_E_INVAL; + + hw_caps = param_buf->soc_hw_mode_caps; + if (!hw_caps) + return QDF_STATUS_E_INVAL; + + if (!hw_caps->num_chainmask_tables) + return QDF_STATUS_E_INVAL; + + chainmask_caps = param_buf->mac_phy_chainmask_caps; + + if (chainmask_caps == NULL) + return QDF_STATUS_E_INVAL; + + for (i = 0; i < hw_caps->num_chainmask_tables; i++) { + + qdf_print("Dumping chain mask combo data for table : %d\n", i); + for (j = 0; j < chainmask_table[i].num_valid_chainmasks; j++) { + + chainmask_table[i].cap_list[j].chainmask = + chainmask_caps->chainmask; + + chainmask_table[i].cap_list[j].supports_chan_width_20 = + WMI_SUPPORT_CHAN_WIDTH_20_GET(chainmask_caps->supported_flags); + + chainmask_table[i].cap_list[j].supports_chan_width_40 = + WMI_SUPPORT_CHAN_WIDTH_40_GET(chainmask_caps->supported_flags); + + chainmask_table[i].cap_list[j].supports_chan_width_80 = + WMI_SUPPORT_CHAN_WIDTH_80_GET(chainmask_caps->supported_flags); + + chainmask_table[i].cap_list[j].supports_chan_width_160 = + WMI_SUPPORT_CHAN_WIDTH_160_GET(chainmask_caps->supported_flags); + + chainmask_table[i].cap_list[j].supports_chan_width_80P80 = + WMI_SUPPORT_CHAN_WIDTH_80P80_GET(chainmask_caps->supported_flags); + + chainmask_table[i].cap_list[j].chain_mask_2G = + WMI_SUPPORT_CHAIN_MASK_2G_GET(chainmask_caps->supported_flags); + + chainmask_table[i].cap_list[j].chain_mask_5G = + WMI_SUPPORT_CHAIN_MASK_5G_GET(chainmask_caps->supported_flags); + + chainmask_table[i].cap_list[j].chain_mask_tx = + WMI_SUPPORT_CHAIN_MASK_TX_GET(chainmask_caps->supported_flags); + + chainmask_table[i].cap_list[j].chain_mask_rx = + WMI_SUPPORT_CHAIN_MASK_RX_GET(chainmask_caps->supported_flags); + + chainmask_table[i].cap_list[j].supports_aDFS = + WMI_SUPPORT_CHAIN_MASK_ADFS_GET(chainmask_caps->supported_flags); + + qdf_print("supported_flags: 0x%08x chainmasks: 0x%08x\n", + chainmask_caps->supported_flags, + chainmask_caps->chainmask + ); + chainmask_caps++; + } + } + + return QDF_STATUS_SUCCESS; +} + /** * extract_service_ready_ext_tlv() - extract basic extended service ready params * from event @@ -16032,6 +16113,8 @@ static QDF_STATUS extract_service_ready_ext_tlv(wmi_unified_t wmi_handle, wmi_service_ready_ext_event_fixed_param *ev; WMI_SOC_MAC_PHY_HW_MODE_CAPS *hw_caps; WMI_SOC_HAL_REG_CAPABILITIES *reg_caps; + WMI_MAC_PHY_CHAINMASK_COMBO *chain_mask_combo; + uint8_t i = 0; param_buf = (WMI_SERVICE_READY_EXT_EVENTID_param_tlvs *) event; if (!param_buf) @@ -16062,6 +16145,32 @@ static QDF_STATUS extract_service_ready_ext_tlv(wmi_unified_t wmi_handle, else param->num_phy = 0; + param->num_chainmask_tables = hw_caps->num_chainmask_tables; + + qdf_print("Num chain mask tables: %d\n", hw_caps->num_chainmask_tables); + + chain_mask_combo = param_buf->mac_phy_chainmask_combo; + + if (chain_mask_combo == NULL) + return QDF_STATUS_SUCCESS; + + qdf_print("Dumping chain mask combo data\n"); + + for (i = 0; i < hw_caps->num_chainmask_tables; i++) { + + qdf_print("table_id : %d Num valid chainmasks: %d\n", + chain_mask_combo->chainmask_table_id, + chain_mask_combo->num_valid_chainmask + ); + + param->chainmask_table[i].table_id = + chain_mask_combo->chainmask_table_id; + param->chainmask_table[i].num_valid_chainmasks = + chain_mask_combo->num_valid_chainmask; + chain_mask_combo++; + } + qdf_print("chain mask combo end\n"); + return QDF_STATUS_SUCCESS; } @@ -16197,6 +16306,7 @@ static QDF_STATUS extract_mac_phy_cap_service_ready_ext_tlv( sizeof(param->he_ppet2G)); qdf_mem_copy(¶m->he_ppet5G, &mac_phy_caps->he_ppet5G, sizeof(param->he_ppet5G)); + param->chainmask_table_id = mac_phy_caps->chainmask_table_id; return QDF_STATUS_SUCCESS; } @@ -17185,7 +17295,9 @@ struct wmi_ops tlv_ops = { .send_dfs_phyerr_offload_en_cmd = send_dfs_phyerr_offload_en_cmd_tlv, .send_dfs_phyerr_offload_dis_cmd = send_dfs_phyerr_offload_dis_cmd_tlv, .extract_reg_chan_list_update_event = - extract_reg_chan_list_update_event_tlv, + extract_reg_chan_list_update_event_tlv, + .extract_chainmask_tables = + extract_chainmask_tables_tlv, }; /**