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: