From 84fa93893113405eba36a1dfa439a4bfffcc62ec Mon Sep 17 00:00:00 2001 From: Paul Zhang Date: Fri, 10 Nov 2017 21:18:21 +0800 Subject: [PATCH] qcacld-3.0: Remove purge_sme_cmd_list API & reset scan ops in SSR case wlan_serialization_remove_all_cmd_from_queue() is getting called two times which causes reference count to be decreased two times. 1) 1st time from sme_stop() -> purge_sme_cmd_list() -> wlan_serialization_remove_all_cmd_from_queue() 2) 2nd time from wlan_serialization_vdev_obj_destroy_notification() -> serialization_purge_cmd_list() -> wlan_serialization_remove_all_cmd_from_queue() 1st path has been there for quite a long time as per the old serialization design but with new serialization design, it won't be required. Change-Id: Ia8bd91c665340e7f7628ad73af64fa0044b45dde CRs-Fixed: 2134851 --- core/hdd/src/wlan_hdd_main.c | 27 +++++++++++++++++++++++++++ core/sme/src/common/sme_api.c | 10 ---------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 31e9e7512b64..317fa30fe75b 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -4562,6 +4562,32 @@ QDF_STATUS hdd_stop_all_adapters(struct hdd_context *hdd_ctx, return QDF_STATUS_SUCCESS; } +static void hdd_reset_scan_operation(struct hdd_context *hdd_ctx, + struct hdd_adapter *adapter) +{ + switch (adapter->device_mode) { + case QDF_STA_MODE: + case QDF_P2P_CLIENT_MODE: + case QDF_IBSS_MODE: + case QDF_P2P_DEVICE_MODE: + case QDF_NDI_MODE: + wlan_hdd_scan_abort(adapter); + wlan_hdd_cleanup_remain_on_channel_ctx(adapter); + if (adapter->device_mode == QDF_STA_MODE) + wlan_cfg80211_sched_scan_stop(hdd_ctx->hdd_pdev, + adapter->dev); + break; + case QDF_P2P_GO_MODE: + wlan_hdd_cleanup_remain_on_channel_ctx(adapter); + break; + case QDF_SAP_MODE: + wlan_hdd_undo_acs(adapter); + break; + default: + break; + } +} + QDF_STATUS hdd_reset_all_adapters(struct hdd_context *hdd_ctx) { hdd_adapter_list_node_t *adapterNode = NULL, *pNext = NULL; @@ -4603,6 +4629,7 @@ QDF_STATUS hdd_reset_all_adapters(struct hdd_context *hdd_ctx) WLAN_CONTROL_PATH); } + hdd_reset_scan_operation(hdd_ctx, adapter); adapter->session.station.hdd_reassoc_scenario = false; hdd_deinit_tx_rx(adapter); diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index d2f13633d7a1..3c20d868b9d6 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -346,19 +346,10 @@ void sme_release_command(tpAniSirGlobal mac_ctx, tSmeCmd *sme_cmd) LL_ACCESS_LOCK); } -static void purge_sme_cmd_list(tpAniSirGlobal pMac) -{ - /* purge all command lists */ - sme_debug("Purging all queues"); - wlan_serialization_purge_cmd_list(pMac->psoc, NULL, - false, false, false, false, true); -} - static QDF_STATUS free_sme_cmd_list(tpAniSirGlobal pMac) { QDF_STATUS status = QDF_STATUS_SUCCESS; - purge_sme_cmd_list(pMac); csr_ll_close(&pMac->sme.smeCmdFreeList); status = qdf_mutex_acquire(&pMac->sme.lkSmeGlobalLock); @@ -2570,7 +2561,6 @@ QDF_STATUS sme_stop(tHalHandle hHal, tHalStopType stopType) sme_err("csr_stop failed with status: %d", status); fail_status = status; } - purge_sme_cmd_list(pMac); if (!QDF_IS_STATUS_SUCCESS(fail_status)) status = fail_status;