From 6d0331de8f4777dd9f388b223567c24b8d21586a Mon Sep 17 00:00:00 2001 From: Srinivas Pitla Date: Tue, 12 Feb 2019 16:41:28 +0530 Subject: [PATCH 1/7] qcacmn: Add flag for Multi VDEV restart synchronization In current code, channel number is checked to enable multivdev restart synchronization, this assumption is not valid as channel width change can also be requested. To fix this, used a flag to enable multivdev restart synchronization. Change-Id: I2633ee42ae7d8c127d8369f36f14e861431a21cc CRs-Fixed: 2400987 --- umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h index aaa4e9fc546f..f8f3e70348ea 100644 --- a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h +++ b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h @@ -117,6 +117,8 @@ #define WLAN_PDEV_OP_MIN_RSSI_ENABLE 0x00010000 /* PDEV VDEV restart is in progress */ #define WLAN_PDEV_OP_RESTART_INPROGRESS 0x00020000 + /* PDEV MBSSID VDEV restart trigger */ +#define WLAN_PDEV_OP_MBSSID_RESTART 0x00040000 struct osif_pdev_priv; From 23bb63a3a9fa8180407d028f14a5268803816e1b Mon Sep 17 00:00:00 2001 From: nobelj Date: Tue, 28 Aug 2018 16:19:33 -0700 Subject: [PATCH 2/7] qcacmn: Do not flush tlv if we get same tlv for MUMIMO For MUMIMO and OFDMA, we get same tlv multiple times. So flush not required. Change-Id: I532f4893320c28083d0f29d319fbc0db5b5d14b8 --- dp/wifi3.0/dp_htt.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/dp/wifi3.0/dp_htt.c b/dp/wifi3.0/dp_htt.c index fba43624bab7..9f98868ade55 100644 --- a/dp/wifi3.0/dp_htt.c +++ b/dp/wifi3.0/dp_htt.c @@ -2634,15 +2634,23 @@ struct ppdu_info *dp_get_ppdu_desc(struct dp_pdev *pdev, uint32_t ppdu_id, } if (ppdu_info) { - /** - * if we get tlv_type that is already been processed for ppdu, - * that means we got a new ppdu with same ppdu id. - * Hence Flush the older ppdu - */ - if (ppdu_info->tlv_bitmap & (1 << tlv_type)) + if (ppdu_info->tlv_bitmap & (1 << tlv_type)) { + /** + * if we get tlv_type that is already been processed + * for ppdu, that means we got a new ppdu with same + * ppdu id. Hence Flush the older ppdu + * for MUMIMO and OFDMA, In a PPDU we have + * multiple user with same tlv types. tlv bitmap is + * used to check whether SU or MU_MIMO/OFDMA + */ + if (!(ppdu_info->tlv_bitmap & + (1 << HTT_PPDU_STATS_SCH_CMD_STATUS_TLV))) + return ppdu_info; + dp_ppdu_desc_deliver(pdev, ppdu_info); - else + } else { return ppdu_info; + } } /** From cad74add80728fef166ad222b665e8b6ead1a5d9 Mon Sep 17 00:00:00 2001 From: Venkata Sharath Chandra Manchala Date: Mon, 28 Jan 2019 11:36:47 -0800 Subject: [PATCH 3/7] qcacmn: Add support for full pktlog 1. Enable CE5 and allow it to service pktlog messages from the firmware. 2. Register full pktlog callback handlers for handling sw_events and full tx pktlog. Change-Id: Ifb70ac0993f2402201f88758845f730cf677b1a0 CRs-Fixed: 2388906 --- dp/wifi3.0/dp_main.c | 2 +- dp/wifi3.0/dp_rx_mon_status.c | 14 +++++++-- dp/wifi3.0/dp_wdi_event.c | 6 +--- hif/src/ce/ce_assignment.h | 2 +- hif/src/ce/ce_main.c | 1 + utils/pktlog/pktlog_ac.c | 56 +++++++++++++++++++++++----------- utils/pktlog/pktlog_internal.c | 3 +- 7 files changed, 55 insertions(+), 29 deletions(-) diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 0ae319f1c83a..6d0c6679269b 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -415,7 +415,7 @@ void dp_pkt_log_init(struct cdp_pdev *ppdev, void *scn) } pktlog_sethandle(&handle->pl_dev, scn); - pktlog_set_callback_regtype(PKTLOG_LITE_CALLBACK_REGISTRATION); + pktlog_set_callback_regtype(PKTLOG_DEFAULT_CALLBACK_REGISTRATION); if (pktlogmod_init(scn)) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, diff --git a/dp/wifi3.0/dp_rx_mon_status.c b/dp/wifi3.0/dp_rx_mon_status.c index 10a182446f01..a72dacc4e6f8 100644 --- a/dp/wifi3.0/dp_rx_mon_status.c +++ b/dp/wifi3.0/dp_rx_mon_status.c @@ -518,6 +518,7 @@ dp_rx_mon_status_process_tlv(struct dp_soc *soc, uint32_t mac_id, QDF_STATUS m_copy_status = QDF_STATUS_SUCCESS; struct cdp_pdev_mon_stats *rx_mon_stats; int smart_mesh_status; + enum WDI_EVENT pktlog_mode = WDI_NO_VAL; ppdu_info = &pdev->ppdu_info; rx_mon_stats = &pdev->rx_mon_stats; @@ -553,9 +554,16 @@ dp_rx_mon_status_process_tlv(struct dp_soc *soc, uint32_t mac_id, dp_rx_process_peer_based_pktlog(soc, ppdu_info, status_nbuf, mac_id); } else { - dp_wdi_event_handler(WDI_EVENT_RX_DESC, soc, - status_nbuf, HTT_INVALID_PEER, - WDI_NO_VAL, mac_id); + if (pdev->rx_pktlog_mode == DP_RX_PKTLOG_FULL) + pktlog_mode = WDI_EVENT_RX_DESC; + else if (pdev->rx_pktlog_mode == DP_RX_PKTLOG_LITE) + pktlog_mode = WDI_EVENT_LITE_RX; + + if (pktlog_mode != WDI_NO_VAL) + dp_wdi_event_handler(pktlog_mode, soc, + status_nbuf, + HTT_INVALID_PEER, + WDI_NO_VAL, mac_id); } /* smart monitor vap and m_copy cannot co-exist */ diff --git a/dp/wifi3.0/dp_wdi_event.c b/dp/wifi3.0/dp_wdi_event.c index e50f67b15276..8448b7e0044b 100644 --- a/dp/wifi3.0/dp_wdi_event.c +++ b/dp/wifi3.0/dp_wdi_event.c @@ -137,11 +137,7 @@ dp_wdi_event_handler( * Subscribers must do the sanity based on the requirements */ event_index = event - WDI_EVENT_BASE; - if (!(txrx_pdev->wdi_event_list[event_index]) && - (event == WDI_EVENT_RX_DESC)) { - /* WDI_EVEN_RX_DESC is indicated for RX_LITE also */ - event_index = WDI_EVENT_LITE_RX - WDI_EVENT_BASE; - } + wdi_sub = txrx_pdev->wdi_event_list[event_index]; /* Find the subscriber */ diff --git a/hif/src/ce/ce_assignment.h b/hif/src/ce/ce_assignment.h index 006e127f5e47..45c27a9e2d30 100644 --- a/hif/src/ce/ce_assignment.h +++ b/hif/src/ce/ce_assignment.h @@ -905,7 +905,7 @@ static struct CE_attr host_ce_config_wlan_qca6390[] = { { /* CE4 */ (CE_ATTR_FLAGS | CE_ATTR_DISABLE_INTR), 0, CE_HTT_H2T_MSG_SRC_NENTRIES, 256, 0, NULL,}, /* target -> host PKTLOG */ - { /* CE5 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL,}, + { /* CE5 */ CE_ATTR_FLAGS, 0, 0, 2048, 512, NULL,}, /* Target autonomous HIF_memcpy */ { /* CE6 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL,}, /* ce_diag, the Diagnostic Window */ diff --git a/hif/src/ce/ce_main.c b/hif/src/ce/ce_main.c index 2ee20dd17752..a3749fb70dee 100644 --- a/hif/src/ce/ce_main.c +++ b/hif/src/ce/ce_main.c @@ -578,6 +578,7 @@ static struct service_to_pipe target_service_to_ce_map_qca6390[] = { { HTC_CTRL_RSVD_SVC, PIPEDIR_IN, 2, }, { HTT_DATA_MSG_SVC, PIPEDIR_OUT, 4, }, { HTT_DATA_MSG_SVC, PIPEDIR_IN, 1, }, + { PACKET_LOG_SVC, PIPEDIR_IN, 5, }, /* (Additions here) */ { 0, 0, 0, }, }; diff --git a/utils/pktlog/pktlog_ac.c b/utils/pktlog/pktlog_ac.c index 2e8ecc89af8f..77f6f6d51194 100644 --- a/utils/pktlog/pktlog_ac.c +++ b/utils/pktlog/pktlog_ac.c @@ -235,7 +235,7 @@ wdi_pktlog_subscribe(struct cdp_pdev *cdp_pdev, int32_t log_state) if ((log_state & ATH_PKTLOG_TX) || (log_state & ATH_PKTLOG_RCFIND) || (log_state & ATH_PKTLOG_RCUPDATE) || - (log_state & ATH_PKTLOG_RX)) { + (log_state & ATH_PKTLOG_SW_EVENT)) { if (cdp_wdi_event_sub(soc, cdp_pdev, &PKTLOG_OFFLOAD_SUBSCRIBER, @@ -246,8 +246,8 @@ wdi_pktlog_subscribe(struct cdp_pdev *cdp_pdev, int32_t log_state) if (log_state & ATH_PKTLOG_RX) { if (cdp_wdi_event_sub(soc, cdp_pdev, - &PKTLOG_RX_SUBSCRIBER, - WDI_EVENT_RX_DESC)) { + &PKTLOG_RX_SUBSCRIBER, + WDI_EVENT_RX_DESC)) { return A_ERROR; } } @@ -465,7 +465,7 @@ wdi_pktlog_unsubscribe(struct cdp_pdev *pdev, uint32_t log_state) if ((log_state & ATH_PKTLOG_TX) || (log_state & ATH_PKTLOG_RCFIND) || (log_state & ATH_PKTLOG_RCUPDATE) || - (log_state & ATH_PKTLOG_RX)) { + (log_state & ATH_PKTLOG_SW_EVENT)) { if (cdp_wdi_event_unsub(soc, pdev, &PKTLOG_OFFLOAD_SUBSCRIBER, @@ -557,6 +557,39 @@ int pktlog_disable(struct hif_opaque_softc *scn) return 0; } +#ifdef HELIUMPLUS +/** + * pktlog_callback_registration() - Register pktlog handlers based on + * on callback type + * @callback_type: pktlog full or lite registration + * + * Return: None + */ +static void pktlog_callback_registration(uint8_t callback_type) +{ + if (callback_type == PKTLOG_DEFAULT_CALLBACK_REGISTRATION) { + PKTLOG_TX_SUBSCRIBER.callback = pktlog_callback; + PKTLOG_RX_SUBSCRIBER.callback = pktlog_callback; + PKTLOG_RX_REMOTE_SUBSCRIBER.callback = pktlog_callback; + PKTLOG_RCFIND_SUBSCRIBER.callback = pktlog_callback; + PKTLOG_RCUPDATE_SUBSCRIBER.callback = pktlog_callback; + PKTLOG_SW_EVENT_SUBSCRIBER.callback = pktlog_callback; + } +} +#else +static void pktlog_callback_registration(uint8_t callback_type) +{ + if (callback_type == PKTLOG_DEFAULT_CALLBACK_REGISTRATION) { + PKTLOG_RX_SUBSCRIBER.callback = lit_pktlog_callback; + PKTLOG_LITE_T2H_SUBSCRIBER.callback = lit_pktlog_callback; + PKTLOG_OFFLOAD_SUBSCRIBER.callback = pktlog_callback; + } else if (callback_type == PKTLOG_LITE_CALLBACK_REGISTRATION) { + PKTLOG_LITE_T2H_SUBSCRIBER.callback = lit_pktlog_callback; + PKTLOG_LITE_RX_SUBSCRIBER.callback = lit_pktlog_callback; + } +} +#endif + void pktlog_init(struct hif_opaque_softc *scn) { struct pktlog_dev_t *pl_dev = get_pktlog_handle(); @@ -589,18 +622,7 @@ void pktlog_init(struct hif_opaque_softc *scn) pl_info->start_time_per = 0; pl_dev->vendor_cmd_send = false; - if (pl_dev->callback_type == PKTLOG_DEFAULT_CALLBACK_REGISTRATION) { - PKTLOG_TX_SUBSCRIBER.callback = pktlog_callback; - PKTLOG_RX_SUBSCRIBER.callback = pktlog_callback; - PKTLOG_RX_REMOTE_SUBSCRIBER.callback = pktlog_callback; - PKTLOG_RCFIND_SUBSCRIBER.callback = pktlog_callback; - PKTLOG_RCUPDATE_SUBSCRIBER.callback = pktlog_callback; - PKTLOG_SW_EVENT_SUBSCRIBER.callback = pktlog_callback; - } else if (pl_dev->callback_type == PKTLOG_LITE_CALLBACK_REGISTRATION) { - PKTLOG_LITE_T2H_SUBSCRIBER.callback = lit_pktlog_callback; - PKTLOG_LITE_RX_SUBSCRIBER.callback = lit_pktlog_callback; - PKTLOG_OFFLOAD_SUBSCRIBER.callback = pktlog_callback; - } + pktlog_callback_registration(pl_dev->callback_type); } static int __pktlog_enable(struct hif_opaque_softc *scn, int32_t log_state, @@ -764,7 +786,7 @@ int pktlog_enable(struct hif_opaque_softc *scn, int32_t log_state, } #define ONE_MEGABYTE (1024 * 1024) -#define MAX_ALLOWED_PKTLOG_SIZE (16 * ONE_MEGABYTE) +#define MAX_ALLOWED_PKTLOG_SIZE (64 * ONE_MEGABYTE) static int __pktlog_setsize(struct hif_opaque_softc *scn, int32_t size) { diff --git a/utils/pktlog/pktlog_internal.c b/utils/pktlog/pktlog_internal.c index d5f7681b28c0..2f67b435e482 100644 --- a/utils/pktlog/pktlog_internal.c +++ b/utils/pktlog/pktlog_internal.c @@ -1455,8 +1455,7 @@ process_pktlog_lite(void *context, void *log_data, uint16_t log_type) pl_hdr.timestamp = 0; log_size = pl_hdr.size; rxstat_log.rx_desc = (void *)pktlog_getbuf(pl_dev, pl_info, - log_size, &pl_hdr); - + log_size, &pl_hdr); if (rxstat_log.rx_desc == NULL) { QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_DEBUG, "%s: Rx descriptor is NULL", __func__); From 975303cc41ae71cb46ddb46833cc7e8cc8ff3826 Mon Sep 17 00:00:00 2001 From: Abhiram Jogadenu Date: Wed, 23 Jan 2019 11:55:10 +0530 Subject: [PATCH 4/7] qcacmn: Add wmi support for CFR capture command Add wmi support for CFR capture command. CRs-Fixed: 2372061 Change-Id: Icaeb30ccf619058383314317864be65380a551fd --- dp/inc/cdp_txrx_stats_struct.h | 2 +- wmi/inc/wmi_unified_api.h | 14 +++++++++ wmi/inc/wmi_unified_param.h | 28 ++++++++++++++++- wmi/inc/wmi_unified_priv.h | 4 +++ wmi/src/wmi_unified_api.c | 14 +++++++++ wmi/src/wmi_unified_tlv.c | 55 ++++++++++++++++++++++++++++++++++ 6 files changed, 115 insertions(+), 2 deletions(-) diff --git a/dp/inc/cdp_txrx_stats_struct.h b/dp/inc/cdp_txrx_stats_struct.h index 84fafc8b7544..1091581939ad 100644 --- a/dp/inc/cdp_txrx_stats_struct.h +++ b/dp/inc/cdp_txrx_stats_struct.h @@ -1565,7 +1565,7 @@ enum _ol_ath_param_t { OL_ATH_PARAM_HE_SR = 401, OL_ATH_PARAM_HE_UL_PPDU_DURATION = 402, OL_ATH_PARAM_HE_UL_RU_ALLOCATION = 403, - + OL_ATH_PARAM_PERIODIC_CFR_CAPTURE = 404, }; /* Enumeration of PDEV Configuration parameter */ diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h index 0370d8311598..7f72523b3cd3 100644 --- a/wmi/inc/wmi_unified_api.h +++ b/wmi/inc/wmi_unified_api.h @@ -1730,4 +1730,18 @@ enum cdp_sec_type wlan_crypto_cipher_to_cdp_sec_type( enum wlan_crypto_cipher_type crypto_cipher); #endif + +#ifdef WLAN_CFR_ENABLE +/** + * wmi_unified_send_peer_cfr_capture_cmd() - WMI function to start CFR capture + * for a peer + * @wmi_hdl: WMI handle + * @param: configuration params for capture + * + * Return: QDF_STATUS_SUCCESS if success, else returns proper error code. + */ +QDF_STATUS +wmi_unified_send_peer_cfr_capture_cmd(void *wmi_hdl, + struct peer_cfr_params *param); +#endif /* WLAN_CFR_ENABLE */ #endif /* _WMI_UNIFIED_API_H_ */ diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index abcf7a21ef32..63429c0dfeef 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -875,6 +875,31 @@ struct hidden_ssid_vdev_restart_params { #endif }; +#ifdef WLAN_CFR_ENABLE + +#define WMI_HOST_PEER_CFR_TIMER_ENABLE 1 +#define WMI_HOST_PEER_CFR_TIMER_DISABLE 0 + +/** + * struct peer_cfr_params - peer cfr capture cmd parameter + * @request: enable/disable cfr capture + * @macaddr: macaddr of the client + * @vdev_id: vdev id + * @periodicity: cfr capture period + * @bandwidth: bandwidth of cfr capture + * @capture_method: cfr capture method/type + */ +struct peer_cfr_params { + uint32_t request; + uint8_t *macaddr; + uint32_t vdev_id; + uint32_t periodicity; + uint32_t bandwidth; + uint32_t capture_method; +}; + +#endif /* WLAN_CFR_ENABLE */ + #ifndef CMN_VDEV_MGR_TGT_IF_ENABLE /** * struct vdev_set_params - vdev set cmd parameter @@ -4882,7 +4907,7 @@ typedef enum { wmi_pdev_param_sub_channel_marking, wmi_pdev_param_ul_ppdu_duration, wmi_pdev_param_equal_ru_allocation_enable, - + wmi_pdev_param_per_peer_prd_cfr_enable, wmi_pdev_param_max, } wmi_conv_pdev_params_id; @@ -5198,6 +5223,7 @@ typedef enum { wmi_service_hw_db2dbm_support, wmi_service_wlm_stats_support, wmi_service_ul_ru26_allowed, + wmi_service_cfr_capture_support, wmi_services_max, } wmi_conv_service_ids; #define WMI_SERVICE_UNAVAILABLE 0xFFFF diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index 8a7ceda5f937..cee8d3e577ef 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -1896,6 +1896,10 @@ QDF_STATUS QDF_STATUS (*send_peer_del_all_wds_entries_cmd)(wmi_unified_t wmi_handle, struct peer_del_all_wds_entries_params *param); +#ifdef WLAN_CFR_ENABLE +QDF_STATUS (*send_peer_cfr_capture_cmd)(wmi_unified_t wmi_handle, + struct peer_cfr_params *param); +#endif }; /* Forward declartion for psoc*/ diff --git a/wmi/src/wmi_unified_api.c b/wmi/src/wmi_unified_api.c index 055ace1fe476..a974eafa343a 100644 --- a/wmi/src/wmi_unified_api.c +++ b/wmi/src/wmi_unified_api.c @@ -4622,3 +4622,17 @@ QDF_STATUS wmi_unified_extract_obss_color_collision_info(void *wmi_hdl, return QDF_STATUS_E_FAILURE; } + +#ifdef WLAN_CFR_ENABLE +QDF_STATUS wmi_unified_send_peer_cfr_capture_cmd(void *wmi_hdl, + struct peer_cfr_params *param) +{ + wmi_unified_t wmi_handle = (wmi_unified_t)wmi_hdl; + + if (wmi_handle->ops->send_peer_cfr_capture_cmd) + return wmi_handle->ops->send_peer_cfr_capture_cmd(wmi_hdl, + param); + + return QDF_STATUS_E_FAILURE; +} +#endif /* WLAN_CFR_ENABLE */ diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 6132148ebb83..bf775133510f 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -10676,6 +10676,52 @@ static QDF_STATUS extract_single_phyerr_tlv(wmi_unified_t wmi_handle, return QDF_STATUS_SUCCESS; } +#ifdef WLAN_CFR_ENABLE +/** + * send_peer_cfr_capture_cmd_tlv() - configure cfr params in fw + * @wmi_handle: wmi handle + * @param: pointer to hold peer cfr config parameter + * + * Return: 0 for success or error code + */ +static QDF_STATUS send_peer_cfr_capture_cmd_tlv(wmi_unified_t wmi_handle, + struct peer_cfr_params *param) +{ + wmi_peer_cfr_capture_cmd_fixed_param *cmd; + wmi_buf_t buf; + int len = sizeof(*cmd); + int ret; + + buf = wmi_buf_alloc(wmi_handle, len); + if (!buf) { + qdf_print("%s:wmi_buf_alloc failed\n", __func__); + return QDF_STATUS_E_NOMEM; + } + + cmd = (wmi_peer_cfr_capture_cmd_fixed_param *)wmi_buf_data(buf); + WMITLV_SET_HDR(&cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_peer_cfr_capture_cmd_fixed_param, + WMITLV_GET_STRUCT_TLVLEN + (wmi_peer_cfr_capture_cmd_fixed_param)); + + WMI_CHAR_ARRAY_TO_MAC_ADDR(param->macaddr, &cmd->mac_addr); + cmd->request = param->request; + cmd->vdev_id = param->vdev_id; + cmd->periodicity = param->periodicity; + cmd->bandwidth = param->bandwidth; + cmd->capture_method = param->capture_method; + + ret = wmi_unified_cmd_send(wmi_handle, buf, len, + WMI_PEER_CFR_CAPTURE_CMDID); + if (QDF_IS_STATUS_ERROR(ret)) { + WMI_LOGE("Failed to send WMI_PEER_CFR_CAPTURE_CMDID"); + wmi_buf_free(buf); + } + + return ret; +} +#endif /* WLAN_CFR_ENABLE */ + /** * extract_esp_estimation_ev_param_tlv() - extract air time from event * @wmi_handle: wmi handle @@ -11137,6 +11183,11 @@ struct wmi_ops tlv_ops = { .extract_offload_bcn_tx_status_evt = extract_offload_bcn_tx_status_evt, .extract_ctl_failsafe_check_ev_param = extract_ctl_failsafe_check_ev_param_tlv, +#ifdef WLAN_CFR_ENABLE + .send_peer_cfr_capture_cmd = + send_peer_cfr_capture_cmd_tlv, +#endif + }; /** @@ -11689,6 +11740,8 @@ static void populate_tlv_service(uint32_t *wmi_service) WMI_SERVICE_WLM_STATS_REQUEST; wmi_service[wmi_service_infra_mbssid] = WMI_SERVICE_INFRA_MBSSID; wmi_service[wmi_service_ul_ru26_allowed] = WMI_SERVICE_UL_RU26_ALLOWED; + wmi_service[wmi_service_cfr_capture_support] = + WMI_SERVICE_CFR_CAPTURE_SUPPORT; } #ifndef CONFIG_MCL @@ -11948,6 +12001,8 @@ static void populate_pdev_param_tlv(uint32_t *pdev_param) WMI_PDEV_PARAM_SET_UL_PPDU_DURATION; pdev_param[wmi_pdev_param_equal_ru_allocation_enable] = WMI_PDEV_PARAM_EQUAL_RU_ALLOCATION_ENABLE; + pdev_param[wmi_pdev_param_per_peer_prd_cfr_enable] = + WMI_PDEV_PARAM_PER_PEER_PERIODIC_CFR_ENABLE; } /** From b692339f5aa57dfe8d12dc831ac573080bc6c8d4 Mon Sep 17 00:00:00 2001 From: Abhiram Jogadenu Date: Tue, 12 Feb 2019 13:54:42 +0530 Subject: [PATCH 5/7] qcacmn: Add umac support for CFR Add UMAC support for CFR module. CRs-Fixed: 2372061 Change-Id: Idf5991d2cb43e8165ae4eed12d675f1039f4bc77 --- umac/cmn_services/inc/wlan_cmn.h | 1 + .../obj_mgr/inc/wlan_objmgr_cmn.h | 2 ++ .../lmac_if/inc/wlan_lmac_if_def.h | 32 +++++++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/umac/cmn_services/inc/wlan_cmn.h b/umac/cmn_services/inc/wlan_cmn.h index 60f074012ae8..f0a6d832ea25 100644 --- a/umac/cmn_services/inc/wlan_cmn.h +++ b/umac/cmn_services/inc/wlan_cmn.h @@ -306,6 +306,7 @@ enum wlan_umac_comp_id { WLAN_UMAC_COMP_CP_STATS = 27, WLAN_UMAC_COMP_ACTION_OUI = 28, WLAN_UMAC_COMP_FWOL = 29, + WLAN_UMAC_COMP_CFR = 30, WLAN_UMAC_COMP_ID_MAX, }; diff --git a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_cmn.h b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_cmn.h index 8f15a573bd90..fcc16ddb77b0 100644 --- a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_cmn.h +++ b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_cmn.h @@ -286,6 +286,7 @@ typedef enum { WLAN_TGT_IF_DP_PEER_REF_ID = 45, WLAN_MLME_SER_IF_ID = 46, WLAN_SCHEDULER_ID = 47, + WLAN_CFR_ID = 48, WLAN_REF_ID_MAX, } wlan_objmgr_ref_dbgid; @@ -347,6 +348,7 @@ static inline char *string_from_dbgid(wlan_objmgr_ref_dbgid id) "WLAN_TGT_IF_DP_PEER_REF_ID", "WLAN_MLME_SER_IF_ID", "WLAN_SCHEDULER_ID", + "WLAN_CFR_ID", "WLAN_REF_ID_MAX"}; return (char *)strings[id]; diff --git a/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h b/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h index 7462940f2a21..a7d32c8911ae 100644 --- a/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h +++ b/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h @@ -47,6 +47,10 @@ #include "wlan_crypto_global_def.h" #endif +#ifdef WLAN_CFR_ENABLE +#include "wlan_cfr_utils_api.h" +#endif + #include #include @@ -456,6 +460,30 @@ struct wlan_lmac_if_sa_api_tx_ops { #endif +#ifdef WLAN_CFR_ENABLE +/** + * struct wlan_lmac_if_cfr_tx_ops - CFR specific tx function pointers + * @cfr_init_pdev: Initialize CFR + * @cfr_deinit_pdev: De-initialize CFR + * @cfr_enable_cfr_timer: Function to enable CFR timer + * @cfr_start_capture: Function to start CFR capture + * @cfr_stop_capture: Function to stop CFR capture + */ +struct wlan_lmac_if_cfr_tx_ops { + int (*cfr_init_pdev)(struct wlan_objmgr_psoc *psoc, + struct wlan_objmgr_pdev *pdev); + int (*cfr_deinit_pdev)(struct wlan_objmgr_psoc *psoc, + struct wlan_objmgr_pdev *pdev); + int (*cfr_enable_cfr_timer)(struct wlan_objmgr_pdev *pdev, + uint32_t cfr_timer); + int (*cfr_start_capture)(struct wlan_objmgr_pdev *pdev, + struct wlan_objmgr_peer *peer, + struct cfr_capture_params *params); + int (*cfr_stop_capture)(struct wlan_objmgr_pdev *pdev, + struct wlan_objmgr_peer *peer); +}; +#endif /* WLAN_CFR_ENABLE */ + #ifdef WLAN_CONV_SPECTRAL_ENABLE struct wmi_spectral_cmd_ops; /** @@ -819,6 +847,10 @@ struct wlan_lmac_if_tx_ops { struct wlan_lmac_if_sa_api_tx_ops sa_api_tx_ops; #endif +#ifdef WLAN_CFR_ENABLE + struct wlan_lmac_if_cfr_tx_ops cfr_tx_ops; +#endif + #ifdef WLAN_CONV_SPECTRAL_ENABLE struct wlan_lmac_if_sptrl_tx_ops sptrl_tx_ops; #endif From 9c8c20f6c053c1740cb1ec5a2dcd3ca98209f53b Mon Sep 17 00:00:00 2001 From: Paul Zhang Date: Wed, 13 Feb 2019 16:12:59 +0800 Subject: [PATCH 6/7] qcacmn: Clean CONFIG_MCL for send_flush_completion_to_user The aim is to remove CONFIG_MCL or CONFIG_WIN from cmn component. This change takes care send_flush_completion_to_user. Cleaning up cmn code by replacing the CONFIG_MCL with macro FEATURE_WLAN_DIAG_SUPPORT. CRs-Fixed: 2397824 Change-Id: I57a82fec17210b49f778a950034ca442d11eb511 --- utils/logging/src/wlan_logging_sock_svc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/utils/logging/src/wlan_logging_sock_svc.c b/utils/logging/src/wlan_logging_sock_svc.c index f9cc10d87006..4d800a34a7b3 100644 --- a/utils/logging/src/wlan_logging_sock_svc.c +++ b/utils/logging/src/wlan_logging_sock_svc.c @@ -736,7 +736,7 @@ void wlan_report_log_completion(uint32_t is_fatal, } #endif -#ifdef CONFIG_MCL +#ifdef FEATURE_WLAN_DIAG_SUPPORT /** * send_flush_completion_to_user() - Indicate flush completion to the user * @ring_id: Ring id of logging entities @@ -823,7 +823,7 @@ static int wlan_logging_thread(void *Arg) ret = send_filled_buffers_to_user(); if (-ENOMEM == ret) msleep(200); -#ifdef CONFIG_MCL +#ifdef FEATURE_WLAN_DIAG_SUPPORT if (WLAN_LOG_INDICATOR_HOST_ONLY == cds_get_log_indicator()) { send_flush_completion_to_user( @@ -848,7 +848,7 @@ static int wlan_logging_thread(void *Arg) */ if (gwlan_logging.is_flush_complete == true) { gwlan_logging.is_flush_complete = false; -#ifdef CONFIG_MCL +#ifdef FEATURE_WLAN_DIAG_SUPPORT send_flush_completion_to_user( RING_ID_DRIVER_DEBUG); #endif From 38a0c9fe446aa66f5b638e8d8357c64eb25b8e1d Mon Sep 17 00:00:00 2001 From: Ashish Kumar Dhanotiya Date: Fri, 19 Jan 2018 20:17:02 +0530 Subject: [PATCH 7/7] qcacmn: Send STA authorized status to supplicant for AP Currently there is no support from driver to send STA authorized event to supplicant. Use QCA_NL80211_VENDOR_SUBCMD_LINK_PROPERTIES vendor command to send STA authorized event to supplicant. Change-Id: I46416949f04dd28a1713cbebf1f7d0e84b5efda2 CRs-Fixed: 2175481 --- os_if/linux/qca_vendor.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/os_if/linux/qca_vendor.h b/os_if/linux/qca_vendor.h index 6653dbed4daf..ead97444bb7d 100644 --- a/os_if/linux/qca_vendor.h +++ b/os_if/linux/qca_vendor.h @@ -904,6 +904,7 @@ enum qca_nl80211_vendor_subcmds_index { QCA_NL80211_VENDOR_SUBCMD_WLAN_MAC_INFO_INDEX, QCA_NL80211_VENDOR_SUBCMD_NAN_EXT_INDEX, QCA_NL80211_VENDOR_SUBCMD_THROUGHPUT_CHANGE_EVENT_INDEX, + QCA_NL80211_VENDOR_SUBCMD_LINK_PROPERTIES_INDEX, }; /** @@ -2932,6 +2933,12 @@ enum qca_wlan_vendor_attr_get_logger_features { * to specify negotiated rate flags i.e. ht, vht and channel width * @QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_FREQ: Unsigned 32bit value to * specify the operating frequency + * @QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_MAC_ADDR: MAC Address of the peer + * (STA / AP ) for the connected link. + * @QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_STA_FLAGS: Attribute containing a + * &struct nl80211_sta_flag_update for the respective connected link. MAC + * address of the peer represented by + * QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_MAC_ADDR. * @QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_AFTER_LAST: after last * @QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_MAX: max value */ @@ -2940,6 +2947,8 @@ enum qca_wlan_vendor_attr_link_properties { QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_NSS = 1, QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_RATE_FLAGS = 2, QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_FREQ = 3, + QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_MAC_ADDR = 4, + QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_STA_FLAGS = 5, /* KEEP LAST */ QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_AFTER_LAST,