From 5ea22bcb56336898ea8798e65044c3d366d13c0d Mon Sep 17 00:00:00 2001 From: Kiran Kumar Lokere Date: Thu, 4 Aug 2016 18:47:33 -0700 Subject: [PATCH] qcacld-3.0: Check if vdev is up before sending vdev down to FW When auth timeout failure happens, as part of clean up process vdev down is sent to FW but the vdev up happens only after the assoc response is received. Sending the vdev down to without vdev up leads to negative vdev up count value in the FW. Check if vdev is up before sending the vdev down. Change-Id: Ia5394390d376c638b3976d446a6ecc98d0584159 CRs-Fixed: 1051760 --- core/wma/src/wma_dev_if.c | 41 ++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c index 2af766ed6a4a..57b9c351c38d 100644 --- a/core/wma/src/wma_dev_if.c +++ b/core/wma/src/wma_dev_if.c @@ -1400,17 +1400,21 @@ int wma_vdev_stop_resp_handler(void *handle, uint8_t *cmd_param_info, peer, false); } - if (wmi_unified_vdev_down_send(wma->wmi_handle, + if (wma->interfaces[resp_event->vdev_id].vdev_up) { + if (wmi_unified_vdev_down_send(wma->wmi_handle, resp_event->vdev_id) != - QDF_STATUS_SUCCESS) { - WMA_LOGE("Failed to send vdev down cmd: vdev %d", - resp_event->vdev_id); - } else { - wma->interfaces[resp_event->vdev_id].vdev_up = false; + QDF_STATUS_SUCCESS) { + WMA_LOGE("Failed to send vdev down: vdev %d", + resp_event->vdev_id); + } else { + wma->interfaces[resp_event->vdev_id].vdev_up = + false; #ifdef FEATURE_AP_MCC_CH_AVOIDANCE - if (mac_ctx->sap.sap_channel_avoidance) - wma_find_mcc_ap(wma, resp_event->vdev_id, false); + if (mac_ctx->sap.sap_channel_avoidance) + wma_find_mcc_ap(wma, + resp_event->vdev_id, false); #endif /* FEATURE_AP_MCC_CH_AVOIDANCE */ + } } ol_txrx_vdev_flush(iface->handle); WMA_LOGD("%s, vdev_id: %d, un-pausing tx_ll_queue for VDEV_STOP rsp", @@ -2400,16 +2404,21 @@ void wma_vdev_resp_timer(void *data) peer, false); } - if (wmi_unified_vdev_down_send(wma->wmi_handle, - tgt_req->vdev_id) != QDF_STATUS_SUCCESS) { - WMA_LOGE("Failed to send vdev down cmd: vdev %d", - tgt_req->vdev_id); - } else { - wma->interfaces[tgt_req->vdev_id].vdev_up = false; + if (wma->interfaces[tgt_req->vdev_id].vdev_up) { + if (wmi_unified_vdev_down_send(wma->wmi_handle, + tgt_req->vdev_id) != + QDF_STATUS_SUCCESS) { + WMA_LOGE("Failed to send vdev down: vdev %d", + tgt_req->vdev_id); + } else { + wma->interfaces[tgt_req->vdev_id].vdev_up = + false; #ifdef FEATURE_AP_MCC_CH_AVOIDANCE - if (mac_ctx->sap.sap_channel_avoidance) - wma_find_mcc_ap(wma, tgt_req->vdev_id, false); + if (mac_ctx->sap.sap_channel_avoidance) + wma_find_mcc_ap(wma, tgt_req->vdev_id, + false); #endif /* FEATURE_AP_MCC_CH_AVOIDANCE */ + } } ol_txrx_vdev_flush(iface->handle); WMA_LOGD("%s, vdev_id: %d, un-pausing tx_ll_queue for WDA_DELETE_BSS_REQ timeout",