diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h index 9eff5fc20de4..149fd56f940a 100644 --- a/core/hdd/inc/wlan_hdd_main.h +++ b/core/hdd/inc/wlan_hdd_main.h @@ -227,11 +227,7 @@ enum hdd_driver_flags { #define WLAN_WAIT_TIME_COUNTRY 1000 #define WLAN_WAIT_TIME_LINK_STATUS 800 #define WLAN_WAIT_TIME_POWER_STATS 800 -/* Amount of time to wait for sme close session callback. - * This value should be larger than the timeout used by WDI to wait for - * a response from WCNSS - */ -#define WLAN_WAIT_TIME_SESSIONOPENCLOSE 15000 + #define WLAN_WAIT_TIME_ABORTSCAN 2000 /** Maximum time(ms) to wait for mc thread suspend **/ diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 9d168850e629..c99538b2c239 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -3780,7 +3780,7 @@ int hdd_vdev_destroy(struct hdd_adapter *adapter) /* block on a completion variable until sme session is closed */ status = qdf_wait_for_event_completion( &adapter->qdf_session_close_event, - WLAN_WAIT_TIME_SESSIONOPENCLOSE); + SME_CMD_VDEV_CREATE_DELETE_TIMEOUT); if (QDF_IS_STATUS_ERROR(status)) { clear_bit(SME_SESSION_OPENED, &adapter->event_flags); @@ -3879,7 +3879,7 @@ int hdd_vdev_create(struct hdd_adapter *adapter, /* block on a completion variable until sme session is opened */ status = qdf_wait_for_event_completion(&adapter->qdf_session_open_event, - WLAN_WAIT_TIME_SESSIONOPENCLOSE); + SME_CMD_VDEV_CREATE_DELETE_TIMEOUT); if (QDF_STATUS_SUCCESS != status) { if (adapter->qdf_session_open_event.force_set) { /* diff --git a/core/sme/inc/csr_internal.h b/core/sme/inc/csr_internal.h index 91b7814e2613..a7d85c332986 100644 --- a/core/sme/inc/csr_internal.h +++ b/core/sme/inc/csr_internal.h @@ -1320,16 +1320,49 @@ void csr_nonscan_active_ll_insert_head( tListElem *csr_nonscan_pending_ll_next( struct sAniSirGlobal *mac_ctx, tListElem *entry, bool inter_locked); -void purge_sme_session_pending_cmd_list( - struct sAniSirGlobal *mac_ctx, - uint32_t session_id); -void purge_sme_session_active_cmd_list( - struct sAniSirGlobal *mac_ctx, - uint32_t session_id); -void purge_sme_session_pending_scan_cmd_list(struct sAniSirGlobal *mac_ctx, - uint32_t session_id); -void purge_sme_session_active_scan_cmd_list(struct sAniSirGlobal *mac_ctx, - uint32_t session_id); + +/** + * csr_purge_vdev_pending_ser_cmd_list() - purge all scan and non-scan + * pending cmds for the vdev id + * @mac_ctx: pointer to global MAC context + * @vdev_id : vdev id for which the pending cmds need to be purged + * + * Return : none + */ +void csr_purge_vdev_pending_ser_cmd_list(struct sAniSirGlobal *mac_ctx, + uint32_t vdev_id); + +/** + * csr_purge_vdev_all_ser_cmd_list() - purge all scan and non-scan + * active and pending cmds for the vdev id + * @mac_ctx: pointer to global MAC context + * @vdev_id : vdev id for which cmds need to be purged + * + * Return : none + */ +void csr_purge_vdev_all_ser_cmd_list(struct sAniSirGlobal *mac_ctx, + uint32_t vdev_id); + +/** + * csr_purge_vdev_all_scan_ser_cmd_list() - purge all scan active and pending + * cmds for the vdev id + * @mac_ctx: pointer to global MAC context + * @vdev_id : vdev id for which cmds need to be purged + * + * Return : none + */ +void csr_purge_vdev_all_scan_ser_cmd_list(struct sAniSirGlobal *mac_ctx, + uint32_t vdev_id); + +/** + * csr_purge_pdev_all_ser_cmd_list() - purge all scan and non-scan + * active and pending cmds for all vdevs in pdev + * @mac_ctx: pointer to global MAC context + * + * Return : none + */ +void csr_purge_pdev_all_ser_cmd_list(struct sAniSirGlobal *mac_ctx); + bool csr_wait_for_connection_update(tpAniSirGlobal mac, bool do_release_reacquire_lock); enum QDF_OPMODE csr_get_session_persona(tpAniSirGlobal pmac, @@ -1358,5 +1391,4 @@ QDF_STATUS csr_roam_update_config( * Return : true if channel causes MCC, else false */ bool csr_is_mcc_channel(tpAniSirGlobal mac_ctx, uint8_t channel); - #endif diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h index cf10ec7b2c3d..f8b585f26f71 100644 --- a/core/sme/inc/sme_api.h +++ b/core/sme/inc/sme_api.h @@ -105,6 +105,11 @@ /* SME timeout for Start/Stop BSS commands is set to 10 secs */ #define SME_START_STOP_BSS_CMD_TIMEOUT (10 * 1000) #define SME_CMD_START_STOP_BSS_TIMEOUT (SME_START_STOP_BSS_CMD_TIMEOUT + 1000) + +/* SME timeout for vdev delete is set to 10 secs */ +#define SME_VDEV_DELETE_CMD_TIMEOUT (10 * 1000) +#define SME_CMD_VDEV_CREATE_DELETE_TIMEOUT (SME_VDEV_DELETE_CMD_TIMEOUT + 1000) + /*-------------------------------------------------------------------------- Type declarations ------------------------------------------------------------------------*/ diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 06ad30ef1c6a..fdb896a1774a 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -1259,6 +1259,11 @@ QDF_STATUS csr_stop(tpAniSirGlobal pMac) ucfg_scan_set_enable(pMac->psoc, false); ucfg_scan_unregister_requester(pMac->psoc, pMac->scan.requester_id); + /* + * purge all serialization commnad if there are any pending to make + * sure memory and vdev ref are freed. + */ + csr_purge_pdev_all_ser_cmd_list(pMac); for (sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++) csr_roam_close_session(pMac, sessionId, true); @@ -1421,6 +1426,11 @@ static QDF_STATUS csr_roam_close(tpAniSirGlobal pMac) { uint32_t sessionId; + /* + * purge all serialization commnad if there are any pending to make + * sure memory and vdev ref are freed. + */ + csr_purge_pdev_all_ser_cmd_list(pMac); for (sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++) csr_roam_close_session(pMac, sessionId, true); @@ -17116,7 +17126,13 @@ QDF_STATUS csr_process_del_sta_session_rsp(tpAniSirGlobal mac_ctx, rsp = (struct del_sta_self_params *) pMsg; sessionId = rsp->session_id; sme_debug("Del Sta rsp status = %d", rsp->status); - /* This session is done. */ + + /* + * This session is done. This will also flush all the pending command + * for this vdev, as vdev is deleted and no command should be sent + * for this vdev. Active cmnd is e_sme_command_del_sta_session and will + * be removed anyway next. + */ csr_cleanup_session(mac_ctx, sessionId); /* Remove this command out of the non scan active list */ @@ -17187,8 +17203,7 @@ void csr_cleanup_session(tpAniSirGlobal pMac, uint32_t sessionId) #ifdef FEATURE_WLAN_BTAMP_UT_RF qdf_mc_timer_destroy(&pSession->hTimerJoinRetry); #endif - purge_sme_session_pending_cmd_list(pMac, sessionId); - purge_sme_session_pending_scan_cmd_list(pMac, sessionId); + csr_purge_vdev_pending_ser_cmd_list(pMac, sessionId); csr_init_session(pMac, sessionId); } } @@ -17219,10 +17234,11 @@ QDF_STATUS csr_roam_close_session(tpAniSirGlobal mac_ctx, session_id); } - purge_sme_session_pending_cmd_list(mac_ctx, session_id); - purge_sme_session_active_cmd_list(mac_ctx, session_id); - purge_sme_session_pending_scan_cmd_list(mac_ctx, session_id); - purge_sme_session_active_scan_cmd_list(mac_ctx, session_id); + /* + * Flush only scan commands. Non scan commands should go in sequence + * as expected by firmware and should not be flushed. + */ + csr_purge_vdev_all_scan_ser_cmd_list(mac_ctx, session_id); if (!session->session_close_cb) { sme_err("no close session callback registered"); return QDF_STATUS_E_FAILURE; @@ -20263,6 +20279,8 @@ QDF_STATUS csr_set_serialization_params_to_cmd(tpAniSirGlobal mac_ctx, ((cmd->cmd_type == WLAN_SER_CMD_HDD_ISSUED) || (cmd->cmd_type == WLAN_SER_CMD_VDEV_STOP_BSS))) cmd->cmd_timeout_duration = SME_START_STOP_BSS_CMD_TIMEOUT; + else if (cmd->cmd_type == WLAN_SER_CMD_DEL_STA_SESSION) + cmd->cmd_timeout_duration = SME_VDEV_DELETE_CMD_TIMEOUT; else cmd->cmd_timeout_duration = SME_DEFAULT_CMD_TIMEOUT; diff --git a/core/sme/src/csr/csr_util.c b/core/sme/src/csr/csr_util.c index fd0aa4e082a9..6a765133c33d 100644 --- a/core/sme/src/csr/csr_util.c +++ b/core/sme/src/csr/csr_util.c @@ -409,40 +409,34 @@ const char *csr_phy_mode_str(eCsrPhyMode phy_mode) } } -void purge_sme_session_active_scan_cmd_list(struct sAniSirGlobal *mac_ctx, - uint32_t session_id) +void csr_purge_vdev_pending_ser_cmd_list(struct sAniSirGlobal *mac_ctx, + uint32_t vdev_id) { - uint8_t vdev_id = session_id; - wlan_serialization_purge_cmd_list_by_vdev_id(mac_ctx->psoc, vdev_id, - true, false, false, false, false); + false, true, false, + true, false); } -void purge_sme_session_pending_scan_cmd_list(struct sAniSirGlobal *mac_ctx, - uint32_t session_id) +void csr_purge_vdev_all_ser_cmd_list(struct sAniSirGlobal *mac_ctx, + uint32_t vdev_id) { - uint8_t vdev_id = session_id; - wlan_serialization_purge_cmd_list_by_vdev_id(mac_ctx->psoc, vdev_id, - false, true, false, false, false); + true, true, true, + true, true); } -void purge_sme_session_pending_cmd_list(struct sAniSirGlobal *mac_ctx, - uint32_t session_id) +void csr_purge_vdev_all_scan_ser_cmd_list(struct sAniSirGlobal *mac_ctx, + uint32_t vdev_id) { - uint8_t vdev_id = session_id; - wlan_serialization_purge_cmd_list_by_vdev_id(mac_ctx->psoc, vdev_id, - false, false, false, true, false); + true, true, false, + false, false); } -void purge_sme_session_active_cmd_list(struct sAniSirGlobal *mac_ctx, - uint32_t session_id) +void csr_purge_pdev_all_ser_cmd_list(struct sAniSirGlobal *mac_ctx) { - uint8_t vdev_id = session_id; - - wlan_serialization_purge_cmd_list_by_vdev_id(mac_ctx->psoc, vdev_id, - false, false, true, false, false); + wlan_serialization_purge_cmd_list(mac_ctx->psoc, NULL, true, true, + true, true, true); } void csr_nonscan_active_ll_insert_head(struct sAniSirGlobal *mac_ctx,