فهرست منبع

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
Himanshu Agarwal 7 سال پیش
والد
کامیت
fc4dab9c75
1فایلهای تغییر یافته به همراه34 افزوده شده و 3 حذف شده
  1. 34 3
      core/wma/src/wma_dev_if.c

+ 34 - 3
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;