Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c736cf6f authored by Mayank Rana's avatar Mayank Rana
Browse files

net: usbnet: Add IPA RM dependency between ODU_ADAPT_PROD and APPS_CONS



With ODU bridge functionality, it is client (here usbnet) responsibility
to create and delete IPA RM dependency between ODU_ADAPT_PROD and
APPS_CONS. Without this dependency, IPA may not able to clock ON and OFF
when IPA clock gating is enabled. This results into ODU bridge
functionality failure with USB host mode usecase.

Also correct return value check by using -EINPROGRESS instead of
EINPROGRESS with ipa_rm_request_resource() and ipa_rm_release_resource().

Also make sure to return success when wait_for_completion_timeout() is not
timeout to avoid failing of usbnet_probe() as wait_for_completion_timeout()
returns remaining jiffies if completion is received.

CRs-Fixed: 1018189
Change-Id: I323db587706335765e32b6ac1ab018d4f3a95487
Signed-off-by: default avatarMayank Rana <mrana@codeaurora.org>
parent 50239ba4
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -1683,7 +1683,7 @@ static void usbnet_ipa_cleanup_rm(struct usbnet *dev)

	ret =  ipa_rm_release_resource(IPA_RM_RESOURCE_ODU_ADAPT_PROD);
	if (ret) {
		if (ret != EINPROGRESS)
		if (ret != -EINPROGRESS)
			dev_err(&dev->udev->dev,
				"Release ODU PROD resource failed:%d\n", ret);

@@ -1695,6 +1695,9 @@ static void usbnet_ipa_cleanup_rm(struct usbnet *dev)
				"Timeout releasing ODU prod resource\n");
	}

	ipa_rm_delete_dependency(IPA_RM_RESOURCE_ODU_ADAPT_PROD,
				 IPA_RM_RESOURCE_APPS_CONS);

	ret = ipa_rm_delete_resource(IPA_RM_RESOURCE_ODU_ADAPT_PROD);
	if (ret)
		pr_warn("Resource:IPA_RM_RESOURCE_ODU_ADAPT_PROD del fail %d\n",
@@ -1849,9 +1852,12 @@ static int usbnet_ipa_setup_rm(struct usbnet *dev)

	init_completion(&dev->rm_prod_granted_comp);

	ipa_rm_add_dependency(IPA_RM_RESOURCE_ODU_ADAPT_PROD,
			      IPA_RM_RESOURCE_APPS_CONS);

	ret =  ipa_rm_request_resource(IPA_RM_RESOURCE_ODU_ADAPT_PROD);
	if (ret) {
		if (ret != EINPROGRESS) {
		if (ret != -EINPROGRESS) {
			dev_err(&dev->udev->dev,
				"Request ODU PROD resource failed: %d\n", ret);
			goto delete_cons;
@@ -1865,6 +1871,8 @@ static int usbnet_ipa_setup_rm(struct usbnet *dev)
			ret = -ETIMEDOUT;
			goto delete_cons;
		}
		/* return success when it is not timeout */
		ret = 0;
	}

	return ret;