소스 검색

qcacmn: Release RTPM refcount if force wake fails

Currently RTPM refcount is not released if force
wake fails. This leads to mismatch in number of
RTPM get and put during RTPM de-init.

Fix this refcount release if force wake fails.

Change-Id: Ia6d2b4541347615afe46c79ae76114009f7805ad
CRs-Fixed: 3289451
Rakesh Pillai 2 년 전
부모
커밋
99372a8149
1개의 변경된 파일15개의 추가작업 그리고 2개의 파일을 삭제
  1. 15 2
      hif/src/pcie/if_pci.c

+ 15 - 2
hif/src/pcie/if_pci.c

@@ -3992,6 +3992,7 @@ int hif_force_wake_request(struct hif_opaque_softc *hif_handle)
 	uint32_t timeout, value;
 	struct hif_softc *scn = (struct hif_softc *)hif_handle;
 	struct hif_pci_softc *pci_scn = HIF_GET_PCI_SOFTC(scn);
+	int ret, status = 0;
 
 	/* Prevent runtime PM or trigger resume firstly */
 	if (hif_rtpm_get(HIF_RTPM_GET_SYNC, HIF_RTPM_ID_FORCE_WAKE)) {
@@ -4008,7 +4009,8 @@ int hif_force_wake_request(struct hif_opaque_softc *hif_handle)
 	if (pld_force_wake_request_sync(scn->qdf_dev->dev, timeout)) {
 		hif_err("force wake request send failed");
 		HIF_STATS_INC(pci_scn, mhi_force_wake_failure, 1);
-		return -EINVAL;
+		status = -EINVAL;
+		goto release_rtpm_ref;
 	}
 
 	/* If device's M1 state-change event races here, it can be ignored,
@@ -4040,11 +4042,22 @@ int hif_force_wake_request(struct hif_opaque_softc *hif_handle)
 		hif_err("force wake handshake failed, reg value = 0x%x",
 			value);
 		HIF_STATS_INC(pci_scn, soc_force_wake_failure, 1);
-		return -ETIMEDOUT;
+		status = -ETIMEDOUT;
+		goto release_rtpm_ref;
 	}
 
 	HIF_STATS_INC(pci_scn, soc_force_wake_success, 1);
 	return 0;
+
+release_rtpm_ref:
+	/* Release runtime PM force wake */
+	ret = hif_rtpm_put(HIF_RTPM_PUT_ASYNC, HIF_RTPM_ID_FORCE_WAKE);
+	if (ret) {
+		hif_err("runtime pm put failure: %d", ret);
+		return ret;
+	}
+
+	return status;
 }
 
 int hif_force_wake_release(struct hif_opaque_softc *hif_handle)