From d912e80971f061f96b6e3f8d06d1efccfd7f36c1 Mon Sep 17 00:00:00 2001 From: Saket Jha Date: Thu, 10 Dec 2020 21:27:11 -0800 Subject: [PATCH] qcacld-3.0: Request fw stats for monitor mode Periodically request pdev stats from FW to receive channel noise floor information after monitor vdev has been brought up, based on the band currently being sniffed. Use the band information as a secondary parameter when sending periodic request to fw so a single noise floor value is sent to host. Pass this noise floor information to dp_pdev to be populated in radiotap header. Change-Id: I488e4985392cb646ffdee914359fa995dbeb025e CRs-Fixed: 2833458 --- .../dispatcher/inc/wlan_cp_stats_mc_tgt_api.h | 16 +++++++ .../cp_stats/src/target_if_mc_cp_stats.c | 18 +++++++ core/wma/src/wma_main.c | 2 +- core/wma/src/wma_utils.c | 47 +++++++++++++++++++ 4 files changed, 82 insertions(+), 1 deletion(-) diff --git a/components/cp_stats/dispatcher/inc/wlan_cp_stats_mc_tgt_api.h b/components/cp_stats/dispatcher/inc/wlan_cp_stats_mc_tgt_api.h index 651314ad31a8..1244dfece80a 100644 --- a/components/cp_stats/dispatcher/inc/wlan_cp_stats_mc_tgt_api.h +++ b/components/cp_stats/dispatcher/inc/wlan_cp_stats_mc_tgt_api.h @@ -27,6 +27,22 @@ #ifdef QCA_SUPPORT_CP_STATS #include "wlan_cp_stats_mc_defs.h" +#ifdef QCA_WIFI_QCA6490 +#define TGT_MAC_ID_24G 2 +#define TGT_MAC_ID_5G 1 +#else +#define TGT_MAC_ID_24G 0 +#define TGT_MAC_ID_5G 0 +#endif + +/** + * target_if_mc_cp_get_mac_id(): API to get mac id + * @vdev_mlme: vdev mlme pointer + * + * Return: mac id + */ +uint8_t target_if_mc_cp_get_mac_id(struct vdev_mlme_obj *vdev_mlme); + /** * tgt_mc_cp_stats_process_stats_event(): API to process stats event * @psoc: pointer to psoc object diff --git a/components/target_if/cp_stats/src/target_if_mc_cp_stats.c b/components/target_if/cp_stats/src/target_if_mc_cp_stats.c index 4f6695ed8951..ea88f463c402 100644 --- a/components/target_if/cp_stats/src/target_if_mc_cp_stats.c +++ b/components/target_if/cp_stats/src/target_if_mc_cp_stats.c @@ -38,6 +38,7 @@ #include #include #include +#include #include #ifdef WLAN_SUPPORT_TWT @@ -349,6 +350,8 @@ static QDF_STATUS target_if_cp_stats_extract_pdev_stats( uint32_t i; QDF_STATUS status; wmi_host_pdev_stats pdev_stats; + void *soc = cds_get_context(QDF_MODULE_ID_SOC); + cdp_config_param_type val; ev->num_pdev_stats = stats_param->num_pdev_stats; if (!ev->num_pdev_stats) @@ -370,6 +373,9 @@ static QDF_STATUS target_if_cp_stats_extract_pdev_stats( return status; } ev->pdev_stats[i].max_pwr = pdev_stats.chan_tx_pwr; + + val.cdp_pdev_param_chn_noise_flr = pdev_stats.chan_nf; + cdp_txrx_set_pdev_param(soc, 0, CDP_CHAN_NOISE_FLOOR, val); } return QDF_STATUS_SUCCESS; @@ -798,6 +804,18 @@ static QDF_STATUS target_if_cp_stats_extract_event(struct wmi_unified *wmi_hdl, return status; } +uint8_t target_if_mc_cp_get_mac_id(struct vdev_mlme_obj *vdev_mlme) +{ + uint8_t mac_id = 0; + + if (wlan_reg_is_24ghz_ch_freq(vdev_mlme->vdev->vdev_mlme.des_chan->ch_freq)) + mac_id = TGT_MAC_ID_24G; + else + mac_id = TGT_MAC_ID_5G; + + return mac_id; +} + /** * target_if_mc_cp_stats_stats_event_handler() - function to handle stats event * from firmware. diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c index ee77bb8deb74..6a8acdb88f46 100644 --- a/core/wma/src/wma_main.c +++ b/core/wma/src/wma_main.c @@ -906,7 +906,7 @@ static void wma_process_cli_set_cmd(tp_wma_handle wma, pdev_param.param_value = privcmd->param_value; ret = wmi_unified_pdev_param_send(wma->wmi_handle, &pdev_param, - WMA_WILDCARD_PDEV_ID); + privcmd->param_sec_value); if (QDF_IS_STATUS_ERROR(ret)) { wma_err("wma_vdev_set_param failed ret %d", ret); return; diff --git a/core/wma/src/wma_utils.c b/core/wma/src/wma_utils.c index 506999a63a5e..9bcb18863c64 100644 --- a/core/wma/src/wma_utils.c +++ b/core/wma/src/wma_utils.c @@ -67,6 +67,7 @@ #include "cdp_txrx_misc.h" #include #include "wlan_mlme_ucfg_api.h" +#include /* MCS Based rate table */ /* HT MCS parameters with Nss = 1 */ @@ -4527,6 +4528,51 @@ QDF_STATUS wma_ap_mlme_vdev_stop_start_send(struct vdev_mlme_obj *vdev_mlme, return wma_vdev_send_start_resp(wma, add_bss_rsp); } +#ifdef QCA_SUPPORT_CP_STATS +QDF_STATUS wma_mon_mlme_vdev_start_continue(struct vdev_mlme_obj *vdev_mlme, + uint16_t data_len, void *data) +{ + tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA); + struct request_info info = {0}; + uint8_t interval = 1; + QDF_STATUS status; + int pdev; + + if (!wma) + return QDF_STATUS_E_INVAL; + + if (mlme_is_chan_switch_in_progress(vdev_mlme->vdev)) + mlme_set_chan_switch_in_progress(vdev_mlme->vdev, false); + + pdev = target_if_mc_cp_get_mac_id(vdev_mlme); + + /* Cancel periodic pdev stats update if running for other mac */ + status = wma_cli_set_command(vdev_mlme->vdev->vdev_objmgr.vdev_id, + WMI_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD, + 0, PDEV_CMD); + if (status != QDF_STATUS_SUCCESS) + pe_err("failed to clear fw stats request = %d", status); + + /* send periodic fw stats to get chan noise floor for monitor mode */ + info.vdev_id = vdev_mlme->vdev->vdev_objmgr.vdev_id; + info.pdev_id = pdev; + status = tgt_send_mc_cp_stats_req((wlan_vdev_get_psoc(vdev_mlme->vdev)), + TYPE_STATION_STATS, + &info); + if (status != QDF_STATUS_SUCCESS) + pe_err("failed to send fw stats request = %d", status); + + status = wma_cli_set2_command(vdev_mlme->vdev->vdev_objmgr.vdev_id, + WMI_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD, + interval * 2000, pdev, PDEV_CMD); + if (status != QDF_STATUS_SUCCESS) + pe_err("failed to send fw stats request = %d", status); + + lim_process_switch_channel_rsp(wma->mac_context, data); + + return QDF_STATUS_SUCCESS; +} +#else QDF_STATUS wma_mon_mlme_vdev_start_continue(struct vdev_mlme_obj *vdev_mlme, uint16_t data_len, void *data) { @@ -4544,6 +4590,7 @@ QDF_STATUS wma_mon_mlme_vdev_start_continue(struct vdev_mlme_obj *vdev_mlme, return QDF_STATUS_SUCCESS; } +#endif /* QCA_SUPPORT_CP_STATS */ QDF_STATUS wma_mon_mlme_vdev_up_send(struct vdev_mlme_obj *vdev_mlme, uint16_t data_len, void *data)