Browse Source

qcacld-3.0: Resolve assert when sending D0WOW disable command

Currently while sending wmi command when target is suspend, it will
check whether command is WMI_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID/
WMI_PDEV_RESUME_CMDID, but D0WOW command is an exception, to keep align
with legacy code so don't set wmi_handle->is_target_suspended if it is
D0WOW enable command.

Move out logic of checking D0WOW status from PMO tgt to core layer.

Change-Id: I164f24ea733e54e5e0dbdb77344917df5d039e53
CRs-Fixed: 2254047
Will Huang 6 years ago
parent
commit
c312328512

+ 12 - 1
components/pmo/core/src/wlan_pmo_suspend_resume.c

@@ -609,13 +609,24 @@ pmo_core_enable_wow_in_fw(struct wlan_objmgr_psoc *psoc,
 		break;
 	}
 
+	if (psoc_ctx->psoc_cfg.d0_wow_supported &&
+	    !psoc_ctx->caps.unified_wow &&
+	    !param.can_suspend_link) {
+		psoc_ctx->wow.wow_state = pmo_wow_state_legacy_d0;
+	} else if (param.can_suspend_link) {
+		psoc_ctx->wow.wow_state = pmo_wow_state_unified_d3;
+	} else {
+		psoc_ctx->wow.wow_state = pmo_wow_state_unified_d0;
+	}
+
 	status = pmo_tgt_psoc_send_wow_enable_req(psoc, &param);
 	if (status != QDF_STATUS_SUCCESS) {
 		pmo_err("Failed to enable wow in fw");
 		goto out;
 	}
 
-	pmo_tgt_update_target_suspend_flag(psoc, true);
+	if (psoc_ctx->wow.wow_state != pmo_wow_state_legacy_d0)
+		pmo_tgt_update_target_suspend_flag(psoc, true);
 
 	status = qdf_wait_for_event_completion(&psoc_ctx->wow.target_suspend,
 					       PMO_TARGET_SUSPEND_TIMEOUT);

+ 1 - 6
components/pmo/dispatcher/src/wlan_pmo_tgt_suspend_resume.c

@@ -140,14 +140,11 @@ QDF_STATUS pmo_tgt_psoc_send_wow_enable_req(struct wlan_objmgr_psoc *psoc,
 	psoc_ctx = pmo_psoc_get_priv(psoc);
 	pmo_tx_ops = GET_PMO_TX_OPS_FROM_PSOC(psoc);
 
-	if (psoc_ctx->psoc_cfg.d0_wow_supported &&
-	    !psoc_ctx->caps.unified_wow &&
-	    !param->can_suspend_link) {
+	if (psoc_ctx->wow.wow_state == pmo_wow_state_legacy_d0) {
 		if (!pmo_tx_ops.psoc_send_d0wow_enable_req) {
 			pmo_err("psoc_send_d0wow_enable_req is null");
 			return QDF_STATUS_E_NULL_VALUE;
 		}
-		psoc_ctx->wow.wow_state = pmo_wow_state_legacy_d0;
 		pmo_debug("Sending D0WOW enable command...");
 		return pmo_tx_ops.psoc_send_d0wow_enable_req(psoc);
 	}
@@ -156,8 +153,6 @@ QDF_STATUS pmo_tgt_psoc_send_wow_enable_req(struct wlan_objmgr_psoc *psoc,
 		pmo_err("psoc_send_wow_enable_req is null");
 		return QDF_STATUS_E_NULL_VALUE;
 	}
-	psoc_ctx->wow.wow_state = param->can_suspend_link ?
-		pmo_wow_state_unified_d3 : pmo_wow_state_unified_d0;
 	return pmo_tx_ops.psoc_send_wow_enable_req(psoc, param);
 }