From 5798bfac82b7f9e2acfd26a2ef24fead089c589d Mon Sep 17 00:00:00 2001 From: Kiran Kumar Lokere Date: Thu, 27 Apr 2017 20:49:39 -0700 Subject: [PATCH] qcacld-3.0: Send beacon template after the vdev restart response Vdev restart cmd is sent in vdev stop response handler during the hidden ssid restart process. Lim sends beacon template cmd after it sends the hidden ssid restart cmd so beacon template is sent to FW after the vdev stop cmd and before the vdev restart cmd as vdev restart is sent during vdev stop response handler. Send the beacon template after vdev restart is successful during the hidden ssid restart process. Change-Id: Ia75bde4ce8c564133e2b2a7bd4011089e52808e7 CRs-Fixed: 2039224 --- core/mac/src/include/sir_params.h | 2 + .../src/pe/lim/lim_process_message_queue.c | 3 + .../src/pe/lim/lim_process_mlm_rsp_messages.c | 32 ++++++++++ .../src/pe/lim/lim_process_sme_req_messages.c | 13 ++-- core/mac/src/pe/lim/lim_types.h | 3 + core/wma/inc/wma_if.h | 1 + core/wma/inc/wma_types.h | 1 + core/wma/src/wma_dev_if.c | 63 +++++++++---------- core/wma/src/wma_main.c | 1 - 9 files changed, 77 insertions(+), 42 deletions(-) diff --git a/core/mac/src/include/sir_params.h b/core/mac/src/include/sir_params.h index b828da5364ac..e823b15b3899 100644 --- a/core/mac/src/include/sir_params.h +++ b/core/mac/src/include/sir_params.h @@ -644,6 +644,8 @@ typedef struct sSirMbMsgP2p { #endif #define SIR_HAL_SET_DBS_SCAN_SEL_PARAMS (SIR_HAL_ITC_MSG_TYPES_BEGIN + 379) +#define SIR_HAL_HIDDEN_SSID_RESTART_RSP (SIR_HAL_ITC_MSG_TYPES_BEGIN + 379) + #define SIR_HAL_MSG_TYPES_END (SIR_HAL_MSG_TYPES_BEGIN + 0x1FF) /* CFG message types */ diff --git a/core/mac/src/pe/lim/lim_process_message_queue.c b/core/mac/src/pe/lim/lim_process_message_queue.c index 05143fe73717..89056ba1c88a 100644 --- a/core/mac/src/pe/lim/lim_process_message_queue.c +++ b/core/mac/src/pe/lim/lim_process_message_queue.c @@ -1682,6 +1682,9 @@ static void lim_process_messages(tpAniSirGlobal mac_ctx, case WMA_ADD_BSS_RSP: lim_process_mlm_add_bss_rsp(mac_ctx, msg); break; + case WMA_HIDDEN_SSID_RESTART_RSP: + lim_process_mlm_update_hidden_ssid_rsp(mac_ctx, msg); + break; case WMA_ADD_STA_RSP: lim_process_add_sta_rsp(mac_ctx, msg); break; diff --git a/core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c b/core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c index fd58d1623774..4fe0df4632aa 100644 --- a/core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c +++ b/core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c @@ -2610,6 +2610,38 @@ void lim_process_mlm_add_bss_rsp(tpAniSirGlobal mac_ctx, #endif } +void lim_process_mlm_update_hidden_ssid_rsp(tpAniSirGlobal mac_ctx, + struct scheduler_msg *msg) +{ + tpPESession session_entry; + tpHalHiddenSsidVdevRestart hidden_ssid_vdev_restart; + + hidden_ssid_vdev_restart = (tpHalHiddenSsidVdevRestart)(msg->bodyptr); + + if (NULL == hidden_ssid_vdev_restart) { + pe_err("NULL msg pointer"); + return; + } + + session_entry = pe_find_session_by_session_id(mac_ctx, + hidden_ssid_vdev_restart->pe_session_id); + + if (session_entry == NULL) { + pe_err("SessionId:%d Session Doesn't exist", + hidden_ssid_vdev_restart->pe_session_id); + goto free_req; + } + /* Update beacon */ + sch_set_fixed_beacon_fields(mac_ctx, session_entry); + lim_send_beacon_ind(mac_ctx, session_entry); + +free_req: + if (NULL != hidden_ssid_vdev_restart) { + qdf_mem_free(hidden_ssid_vdev_restart); + msg->bodyptr = NULL; + } +} + /** * lim_process_mlm_set_sta_key_rsp() - Process STA key response * diff --git a/core/mac/src/pe/lim/lim_process_sme_req_messages.c b/core/mac/src/pe/lim/lim_process_sme_req_messages.c index 93b659586660..eee8ec918077 100644 --- a/core/mac/src/pe/lim/lim_process_sme_req_messages.c +++ b/core/mac/src/pe/lim/lim_process_sme_req_messages.c @@ -3960,6 +3960,7 @@ lim_send_vdev_restart(tpAniSirGlobal pMac, pHalHiddenSsidVdevRestart->ssidHidden = psessionEntry->ssidHidden; pHalHiddenSsidVdevRestart->sessionId = sessionId; + pHalHiddenSsidVdevRestart->pe_session_id = psessionEntry->peSessionId; msgQ.type = WMA_HIDDEN_SSID_VDEV_RESTART; msgQ.bodyptr = pHalHiddenSsidVdevRestart; @@ -4036,23 +4037,19 @@ static void __lim_process_roam_scan_offload_req(tpAniSirGlobal mac_ctx, static void lim_handle_update_ssid_hidden(tpAniSirGlobal mac_ctx, tpPESession session, uint8_t ssid_hidden) { - pe_debug("received HIDE_SSID message old HIDE_SSID: %d new HIDE_SSID: %d", + pe_debug("rcvd HIDE_SSID message old HIDE_SSID: %d new HIDE_SSID: %d", session->ssidHidden, ssid_hidden); - if (ssid_hidden != session->ssidHidden) + if (ssid_hidden != session->ssidHidden) { session->ssidHidden = ssid_hidden; - else { - pe_debug("Same config already present!"); + } else { + pe_debug("Dont process HIDE_SSID msg with existing setting"); return; } /* Send vdev restart */ lim_send_vdev_restart(mac_ctx, session, session->smeSessionId); - /* Update beacon */ - sch_set_fixed_beacon_fields(mac_ctx, session); - lim_send_beacon_ind(mac_ctx, session); - return; } diff --git a/core/mac/src/pe/lim/lim_types.h b/core/mac/src/pe/lim/lim_types.h index b019a748006b..2435b71d33bc 100644 --- a/core/mac/src/pe/lim/lim_types.h +++ b/core/mac/src/pe/lim/lim_types.h @@ -498,6 +498,9 @@ void lim_send_disassoc_mgmt_frame(tpAniSirGlobal, uint16_t, tSirMacAddr, void lim_send_deauth_mgmt_frame(tpAniSirGlobal, uint16_t, tSirMacAddr, tpPESession, bool waitForAck); +void lim_process_mlm_update_hidden_ssid_rsp(tpAniSirGlobal mac_ctx, + struct scheduler_msg *msg); + tSirResultCodes lim_mlm_add_bss(tpAniSirGlobal, tLimMlmStartReq *, tpPESession psessionEntry); diff --git a/core/wma/inc/wma_if.h b/core/wma/inc/wma_if.h index 61a5caf45c27..7c4a05696063 100644 --- a/core/wma/inc/wma_if.h +++ b/core/wma/inc/wma_if.h @@ -1395,6 +1395,7 @@ typedef struct sTdlsLinkEstablishParams { typedef struct tHalHiddenSsidVdevRestart { uint8_t ssidHidden; uint8_t sessionId; + uint16_t pe_session_id; } tHalHiddenSsidVdevRestart, *tpHalHiddenSsidVdevRestart; diff --git a/core/wma/inc/wma_types.h b/core/wma/inc/wma_types.h index 12098c5f9c7e..5b32ad101361 100644 --- a/core/wma/inc/wma_types.h +++ b/core/wma/inc/wma_types.h @@ -176,6 +176,7 @@ #define WMA_ENTER_PS_REQ SIR_HAL_ENTER_PS_REQ #define WMA_EXIT_PS_REQ SIR_HAL_EXIT_PS_REQ +#define WMA_HIDDEN_SSID_RESTART_RSP SIR_HAL_HIDDEN_SSID_RESTART_RSP #define WMA_SWITCH_CHANNEL_RSP SIR_HAL_SWITCH_CHANNEL_RSP #define WMA_P2P_NOA_ATTR_IND SIR_HAL_P2P_NOA_ATTR_IND #define WMA_P2P_NOA_START_IND SIR_HAL_P2P_NOA_START_IND diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c index 0b130df80f48..befaec8bd770 100644 --- a/core/wma/src/wma_dev_if.c +++ b/core/wma/src/wma_dev_if.c @@ -914,29 +914,33 @@ int wma_vdev_start_resp_handler(void *handle, uint8_t *cmd_param_info, iface = &wma->interfaces[resp_event->vdev_id]; + req_msg = wma_find_vdev_req(wma, resp_event->vdev_id, + WMA_TARGET_REQ_TYPE_VDEV_START); + + if (!req_msg) { + WMA_LOGE("%s: Failed to lookup request message for vdev %d", + __func__, resp_event->vdev_id); + policy_mgr_set_do_hw_mode_change_flag(wma->psoc, false); + return -EINVAL; + } + if ((resp_event->vdev_id <= wma->max_bssid) && (qdf_atomic_read( &wma->interfaces[resp_event->vdev_id].vdev_restart_params.hidden_ssid_restart_in_progress)) && (wma_is_vdev_in_ap_mode(wma, resp_event->vdev_id) == true)) { + tpHalHiddenSsidVdevRestart hidden_ssid_restart = + (tpHalHiddenSsidVdevRestart)req_msg->user_data; WMA_LOGE("%s: vdev restart event recevied for hidden ssid set using IOCTL", __func__); param.vdev_id = resp_event->vdev_id; param.assoc_id = 0; - if (wmi_unified_vdev_up_send - (wma->wmi_handle, - wma->interfaces[resp_event->vdev_id].bssid, - ¶m) != QDF_STATUS_SUCCESS) { - WMA_LOGE("%s : failed to send vdev up", __func__); - policy_mgr_set_do_hw_mode_change_flag( - wma->psoc, false); - return -EEXIST; - } qdf_atomic_set(&wma->interfaces[resp_event->vdev_id]. vdev_restart_params. hidden_ssid_restart_in_progress, 0); - wma_vdev_set_mlme_state(wma, resp_event->vdev_id, - WLAN_VDEV_S_RUN); + + wma_send_msg(wma, WMA_HIDDEN_SSID_RESTART_RSP, + (void *)hidden_ssid_restart, 0); /* * Unpause TX queue in SAP case while configuring hidden ssid * enable or disable, else the data path is paused forever @@ -948,17 +952,6 @@ int wma_vdev_start_resp_handler(void *handle, uint8_t *cmd_param_info, wma_vdev_clear_pause_bit(resp_event->vdev_id, PAUSE_TYPE_HOST); } - req_msg = wma_find_vdev_req(wma, resp_event->vdev_id, - WMA_TARGET_REQ_TYPE_VDEV_START); - - if (!req_msg) { - WMA_LOGE("%s: Failed to lookup request message for vdev %d", - __func__, resp_event->vdev_id); - policy_mgr_set_do_hw_mode_change_flag( - wma->psoc, false); - return -EINVAL; - } - qdf_mc_timer_stop(&req_msg->event_timeout); #ifdef FEATURE_AP_MCC_CH_AVOIDANCE @@ -1643,7 +1636,7 @@ int wma_vdev_stop_resp_handler(void *handle, uint8_t *cmd_param_info, tp_wma_handle wma = (tp_wma_handle) handle; WMI_VDEV_STOPPED_EVENTID_param_tlvs *param_buf; wmi_vdev_stopped_event_fixed_param *resp_event; - struct wma_target_req *req_msg, *del_req; + struct wma_target_req *req_msg, *del_req, *new_req_msg; struct cdp_pdev *pdev; void *peer; uint8_t peer_id; @@ -1672,6 +1665,14 @@ int wma_vdev_stop_resp_handler(void *handle, uint8_t *cmd_param_info, } resp_event = param_buf->fixed_param; + req_msg = wma_find_vdev_req(wma, resp_event->vdev_id, + WMA_TARGET_REQ_TYPE_VDEV_STOP); + if (!req_msg) { + WMA_LOGE("%s: Failed to lookup vdev request for vdev id %d", + __func__, resp_event->vdev_id); + return -EINVAL; + } + if ((resp_event->vdev_id <= wma->max_bssid) && (qdf_atomic_read (&wma->interfaces[resp_event->vdev_id].vdev_restart_params. @@ -1681,11 +1682,14 @@ int wma_vdev_stop_resp_handler(void *handle, uint8_t *cmd_param_info, WMA_LOGE("%s: vdev stop event recevied for hidden ssid set using IOCTL ", __func__); - req_msg = wma_fill_vdev_req(wma, resp_event->vdev_id, + wma_vdev_set_mlme_state(wma, + resp_event->vdev_id, WLAN_VDEV_S_STOP); + new_req_msg = wma_fill_vdev_req(wma, resp_event->vdev_id, WMA_HIDDEN_SSID_VDEV_RESTART, - WMA_TARGET_REQ_TYPE_VDEV_START, resp_event, + WMA_TARGET_REQ_TYPE_VDEV_START, + req_msg->user_data, WMA_VDEV_START_REQUEST_TIMEOUT); - if (!req_msg) { + if (!new_req_msg) { WMA_LOGE("%s: Failed to fill vdev request, vdev_id %d", __func__, resp_event->vdev_id); return -EINVAL; @@ -1695,13 +1699,6 @@ int wma_vdev_stop_resp_handler(void *handle, uint8_t *cmd_param_info, resp_event->vdev_id); } - req_msg = wma_find_vdev_req(wma, resp_event->vdev_id, - WMA_TARGET_REQ_TYPE_VDEV_STOP); - if (!req_msg) { - WMA_LOGE("%s: Failed to lookup vdev request for vdev id %d", - __func__, resp_event->vdev_id); - return -EINVAL; - } pdev = cds_get_context(QDF_MODULE_ID_TXRX); if (!pdev) { WMA_LOGE("%s: pdev is NULL", __func__); diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c index 4a1360974230..3dd51f33b35f 100644 --- a/core/wma/src/wma_main.c +++ b/core/wma/src/wma_main.c @@ -6693,7 +6693,6 @@ QDF_STATUS wma_mc_process_msg(void *cds_context, struct scheduler_msg *msg) case WMA_HIDDEN_SSID_VDEV_RESTART: wma_hidden_ssid_vdev_restart(wma_handle, (tHalHiddenSsidVdevRestart *) msg->bodyptr); - qdf_mem_free(msg->bodyptr); break; #ifdef WLAN_FEATURE_EXTWOW_SUPPORT case WMA_WLAN_EXT_WOW: