From fc4dab9c75fa852c8b32968033be22a0d936288b Mon Sep 17 00:00:00 2001 From: Himanshu Agarwal Date: Thu, 28 Dec 2017 21:46:29 +0530 Subject: [PATCH] qcacld-3.0: Do recovery/assert on vdev delete/start if bss started In wma_vdev_detach(), ignore vdev delete request at present if it is received before VDEV_STOP and VDEV_DOWN which results in fw assert on VDEV_START as no VDEV_DELETE is present before VDEV_START on the same vdev. Do cds recovery or assert on vdev deletion or on vdev start if BSS is already in started state and no VDEV_STOP is queued in the queue. Change-Id: I273e6240840e7a0a54c2d7ad3de12c8a30d42a18 CRs-Fixed: 2164701 --- core/wma/src/wma_dev_if.c | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c index 458b4c4473b8..1c2229d6aa72 100644 --- a/core/wma/src/wma_dev_if.c +++ b/core/wma/src/wma_dev_if.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -708,8 +708,18 @@ QDF_STATUS wma_vdev_detach(tp_wma_handle wma_handle, return status; send_fail_rsp: - WMA_LOGE("rcvd del_self_sta without del_bss, send fail rsp, vdev_id %d", - vdev_id); + if (!cds_is_driver_recovering()) { + if (cds_is_self_recovery_enabled()) { + WMA_LOGE("rcvd del_self_sta without del_bss, trigger recovery, vdev_id %d", + vdev_id); + cds_trigger_recovery(QDF_REASON_UNSPECIFIED); + } else { + WMA_LOGE("rcvd del_self_sta without del_bss, BUG_ON(), vdev_id %d", + vdev_id); + QDF_BUG(0); + } + } + pdel_sta_self_req_param->status = QDF_STATUS_E_FAILURE; wma_send_del_sta_self_resp(pdel_sta_self_req_param); return status; @@ -2349,6 +2359,8 @@ QDF_STATUS wma_vdev_start(tp_wma_handle wma, uint32_t temp_reg_info_1 = 0; uint32_t temp_reg_info_2 = 0; uint16_t bw_val; + struct wma_txrx_node *iface = &wma->interfaces[req->vdev_id]; + struct wma_target_req *req_msg; mac_ctx = cds_get_context(QDF_MODULE_ID_PE); if (mac_ctx == NULL) { @@ -2356,6 +2368,25 @@ QDF_STATUS wma_vdev_start(tp_wma_handle wma, return QDF_STATUS_E_FAILURE; } + if (!isRestart && + qdf_atomic_read(&iface->bss_status) == WMA_BSS_STATUS_STARTED) { + req_msg = wma_find_vdev_req(wma, req->vdev_id, + WMA_TARGET_REQ_TYPE_VDEV_STOP, + false); + if (!req_msg || req_msg->msg_type != WMA_DELETE_BSS_REQ) { + if (!cds_is_driver_recovering()) { + if (cds_is_self_recovery_enabled()) { + WMA_LOGE("BSS is in started state before vdev start, trigger recovery"); + cds_trigger_recovery( + QDF_REASON_UNSPECIFIED); + } else { + WMA_LOGE("BSS is in started state before vdev start, BUG_ON()"); + QDF_BUG(0); + } + } + } + } + WMA_LOGD("%s: Enter isRestart=%d vdev=%d", __func__, isRestart, req->vdev_id); params.vdev_id = req->vdev_id;