Przeglądaj źródła

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
Kiran Kumar Lokere 8 lat temu
rodzic
commit
5ea22bcb56
1 zmienionych plików z 25 dodań i 16 usunięć
  1. 25 16
      core/wma/src/wma_dev_if.c

+ 25 - 16
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",