diff --git a/components/mlme/core/inc/wlan_mlme_vdev_mgr_interface.h b/components/mlme/core/inc/wlan_mlme_vdev_mgr_interface.h index bf69395737ba..c777ce194d01 100644 --- a/components/mlme/core/inc/wlan_mlme_vdev_mgr_interface.h +++ b/components/mlme/core/inc/wlan_mlme_vdev_mgr_interface.h @@ -74,5 +74,26 @@ QDF_STATUS ap_mlme_set_chan_switch_in_progress(struct wlan_objmgr_vdev *vdev, */ bool ap_mlme_get_chan_switch_in_progress(struct wlan_objmgr_vdev *vdev); +/** + * ap_mlme_set_hidden_ssid_restart_in_progress() - set mlme priv hidden ssid + * restart in progress + * @vdev: vdev pointer + * @val: value to be set + * + * Return: QDF_STATUS + */ +QDF_STATUS +ap_mlme_set_hidden_ssid_restart_in_progress(struct wlan_objmgr_vdev *vdev, + bool val); + +/** + * ap_mlme_get_hidden_ssid_restart_in_progress() - get mlme priv hidden ssid + * restart in progress + * @vdev: vdev pointer + * + * Return: value of mlme priv hidden ssid restart in progress + */ +bool ap_mlme_get_hidden_ssid_restart_in_progress(struct wlan_objmgr_vdev *vdev); + #endif #endif diff --git a/components/mlme/core/src/wlan_mlme_vdev_mgr_interface.c b/components/mlme/core/src/wlan_mlme_vdev_mgr_interface.c index 0c2842984bd2..e527da27d66c 100644 --- a/components/mlme/core/src/wlan_mlme_vdev_mgr_interface.c +++ b/components/mlme/core/src/wlan_mlme_vdev_mgr_interface.c @@ -517,6 +517,42 @@ bool ap_mlme_get_chan_switch_in_progress(struct wlan_objmgr_vdev *vdev) return mlme_priv->chan_switch_in_progress; } +QDF_STATUS +ap_mlme_set_hidden_ssid_restart_in_progress(struct wlan_objmgr_vdev *vdev, + bool val) +{ + struct vdev_mlme_obj *vdev_mlme; + struct mlme_legacy_priv *mlme_priv; + + vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); + if (!vdev_mlme) { + mlme_err("vdev component object is NULL"); + return QDF_STATUS_E_FAILURE; + } + + mlme_priv = (struct mlme_legacy_priv *)vdev_mlme->legacy_vdev_ptr; + + mlme_priv->hidden_ssid_restart_in_progress = val; + + return QDF_STATUS_SUCCESS; +} + +bool ap_mlme_get_hidden_ssid_restart_in_progress(struct wlan_objmgr_vdev *vdev) +{ + struct vdev_mlme_obj *vdev_mlme; + struct mlme_legacy_priv *mlme_priv; + + vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); + if (!vdev_mlme) { + mlme_err("vdev component object is NULL"); + return false; + } + + mlme_priv = (struct mlme_legacy_priv *)vdev_mlme->legacy_vdev_ptr; + + return mlme_priv->hidden_ssid_restart_in_progress; +} + /** * ap_mlme_vdev_legacy_hdl_create () - Create sap mlme legacy priv object * @vdev_mlme: vdev mlme object 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 dfd212435c6f..429ac29c41b9 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 @@ -2661,7 +2661,7 @@ void lim_process_mlm_update_hidden_ssid_rsp(tpAniSirGlobal mac_ctx, } /* Update beacon */ sch_set_fixed_beacon_fields(mac_ctx, session_entry); - lim_send_beacon_ind(mac_ctx, session_entry); + lim_send_beacon(mac_ctx, session_entry); free_req: if (NULL != hidden_ssid_vdev_restart) { 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 b83d00737671..f86e1db4467a 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 @@ -3873,8 +3873,16 @@ static void lim_handle_update_ssid_hidden(tpAniSirGlobal mac_ctx, return; } +#ifdef CONFIG_VDEV_SM + ap_mlme_set_hidden_ssid_restart_in_progress(session->vdev, true); + wlan_vdev_mlme_sm_deliver_evt(session->vdev, + WLAN_VDEV_SM_EV_FW_VDEV_RESTART, + sizeof(*session), session); +#else + /* Send vdev restart */ lim_send_vdev_restart(mac_ctx, session, session->smeSessionId); +#endif return; } diff --git a/core/mac/src/pe/lim/lim_utils.c b/core/mac/src/pe/lim/lim_utils.c index 3b93acd482ff..66577d522e02 100644 --- a/core/mac/src/pe/lim/lim_utils.c +++ b/core/mac/src/pe/lim/lim_utils.c @@ -8544,13 +8544,16 @@ QDF_STATUS lim_ap_mlme_vdev_restart_send(struct vdev_mlme_obj *vdev_mlme, return QDF_STATUS_E_INVAL; } - lim_set_channel(session->mac_ctx, session->currentOperChannel, - session->ch_center_freq_seg0, - session->ch_center_freq_seg1, - session->ch_width, - session->maxTxPower, session->peSessionId, - session->cac_duration_ms, - session->dfs_regdomain); + if (ap_mlme_get_hidden_ssid_restart_in_progress(vdev_mlme->vdev)) + lim_send_vdev_restart(session->mac_ctx, session, + session->smeSessionId); + else + lim_set_channel(session->mac_ctx, session->currentOperChannel, + session->ch_center_freq_seg0, + session->ch_center_freq_seg1, + session->ch_width, session->maxTxPower, + session->peSessionId, session->cac_duration_ms, + session->dfs_regdomain); return QDF_STATUS_SUCCESS; } diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c index aa2448aa8f7d..f3cb3bc04c4d 100644 --- a/core/wma/src/wma_dev_if.c +++ b/core/wma/src/wma_dev_if.c @@ -1223,9 +1223,15 @@ int wma_vdev_start_resp_handler(void *handle, uint8_t *cmd_param_info, __func__); qdf_atomic_set(&iface->vdev_restart_params. hidden_ssid_restart_in_progress, 0); - +#ifdef CONFIG_VDEV_SM + wlan_vdev_mlme_sm_deliver_evt(iface->vdev, + WLAN_VDEV_SM_EV_RESTART_RESP, + sizeof(*hidden_ssid_restart), + hidden_ssid_restart); +#else wma_send_msg(wma, WMA_HIDDEN_SSID_RESTART_RSP, (void *)hidden_ssid_restart, 0); +#endif } #ifdef FEATURE_AP_MCC_CH_AVOIDANCE diff --git a/core/wma/src/wma_utils.c b/core/wma/src/wma_utils.c index 4b2cd063e4c4..972f73ae7074 100644 --- a/core/wma/src/wma_utils.c +++ b/core/wma/src/wma_utils.c @@ -4817,11 +4817,15 @@ QDF_STATUS wma_ap_mlme_vdev_start_continue(struct vdev_mlme_obj *vdev_mlme, { tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA); QDF_STATUS status = QDF_STATUS_SUCCESS; + struct wlan_objmgr_vdev *vdev = vdev_mlme->vdev; - if (ap_mlme_get_chan_switch_in_progress(vdev_mlme->vdev)) { + if (ap_mlme_get_chan_switch_in_progress(vdev)) { wma_send_msg_high_priority(wma, WMA_SWITCH_CHANNEL_RSP, data, 0); - ap_mlme_set_chan_switch_in_progress(vdev_mlme->vdev, false); + ap_mlme_set_chan_switch_in_progress(vdev, false); + } else if (ap_mlme_get_hidden_ssid_restart_in_progress(vdev)) { + wma_send_msg(wma, WMA_HIDDEN_SSID_RESTART_RSP, data, 0); + ap_mlme_set_hidden_ssid_restart_in_progress(vdev, false); } else { status = wma_ap_vdev_send_start_resp(vdev_mlme, data); }