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

Commit 6dfb56e0 authored by Hemant Kumar's avatar Hemant Kumar Committed by Azhar Shaikh
Browse files

net: usbnet: Add RM call for request/release of resources



Calls for RM request and release of producer and consumer
resources are missing. RM stats are incorrectly showing
the resource state as released. Hence fix this by calling
request abd release RM APIs upon connect/disconnect.

CRs-Fixed: 875275
Change-Id: I5d5e98f6d300596ec94bc088855902e415a3a039
Signed-off-by: default avatarHemant Kumar <hemantk@codeaurora.org>
parent f13d38f2
Loading
Loading
Loading
Loading
+60 −5
Original line number Diff line number Diff line
@@ -78,6 +78,9 @@
// between wakeups
#define UNLINK_TIMEOUT_MS	3

/* timeout value for odu bridge resources */
#define IPA_ODU_RM_TIMEOUT_MSEC 10000

/*-------------------------------------------------------------------------*/

// randomly generated ethernet address
@@ -1660,10 +1663,26 @@ void usbnet_debugfs_exit(struct usbnet *dev)
	debugfs_remove_recursive(dev->pusbnet_ipa->debugfs_dir);
}

static void usbnet_ipa_cleanup_rm(void)
static void usbnet_ipa_cleanup_rm(struct usbnet *dev)
{
	int ret;

	init_completion(&dev->rm_prod_release_comp);

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

		ret = wait_for_completion_timeout(&dev->rm_prod_release_comp,
						  msecs_to_jiffies(
						  IPA_ODU_RM_TIMEOUT_MSEC));
		if (ret == 0)
			dev_err(&dev->udev->dev,
				"Timeout releasing ODU prod resource\n");
	}

	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",
@@ -1713,7 +1732,7 @@ void usbnet_disconnect (struct usb_interface *intf)
			dev_dbg(&dev->udev->dev,
				"%s ODU bridge cleanup failed.\n",
				__func__);
		usbnet_ipa_cleanup_rm();
		usbnet_ipa_cleanup_rm(dev);
		usbnet_debugfs_exit(dev);
		kfree(dev->pusbnet_ipa);
	}
@@ -1756,7 +1775,22 @@ static struct device_type wwan_type = {
static void usbnet_ipa_rm_notify(void *user_data, enum ipa_rm_event event,
				 unsigned long data)
{
	struct usbnet *dev = (struct usbnet *)user_data;

	pr_debug(" %s IPA RM Evt: %d\n", __func__, event);

	switch (event) {
	case IPA_RM_RESOURCE_GRANTED:
		complete(&dev->rm_prod_granted_comp);
		break;
	case  IPA_RM_RESOURCE_RELEASED:
		complete(&dev->rm_prod_release_comp);
		break;
	default:
		dev_dbg(&dev->udev->dev,
			"Un-expected event %d\n", event);
		break;
	}
}

static int usbnet_ipa_rm_cons_request(void)
@@ -1783,7 +1817,7 @@ static int usbnet_ipa_setup_rm(struct usbnet *dev)

	ret = ipa_rm_create_resource(&create_params);
	if (ret) {
		dev_dbg(&dev->udev->dev,
		dev_err(&dev->udev->dev,
			"Create ODU PROD RM resource failed: %d\n", ret);
		goto prod_fail;
	}
@@ -1796,16 +1830,37 @@ static int usbnet_ipa_setup_rm(struct usbnet *dev)

	ret = ipa_rm_create_resource(&create_params);
	if (ret) {
		dev_dbg(&dev->udev->dev,
		dev_err(&dev->udev->dev,
			"Create ODU CONC RM resource failed: %d\n", ret);
		goto delete_prod;
	}

	init_completion(&dev->rm_prod_granted_comp);

	ret =  ipa_rm_request_resource(IPA_RM_RESOURCE_ODU_ADAPT_PROD);
	if (ret) {
		if (ret != EINPROGRESS) {
			dev_err(&dev->udev->dev,
				"Request ODU PROD resource failed: %d\n", ret);
			goto delete_cons;
		}
		ret = wait_for_completion_timeout(&dev->rm_prod_granted_comp,
						  msecs_to_jiffies(
						  IPA_ODU_RM_TIMEOUT_MSEC));
		if (ret == 0) {
			dev_err(&dev->udev->dev,
				"timeout requesting ODU prod resource\n");
			ret = -ETIMEDOUT;
			goto delete_cons;
		}
	}

	return ret;

delete_cons:
	ipa_rm_delete_resource(IPA_RM_RESOURCE_ODU_ADAPT_CONS);
delete_prod:
	ipa_rm_delete_resource(IPA_RM_RESOURCE_ODU_ADAPT_PROD);

prod_fail:
	return ret;
}
+3 −0
Original line number Diff line number Diff line
@@ -108,6 +108,9 @@ struct usbnet {
#		define EVENT_LINK_CHANGE	11
#		define EVENT_SET_RX_MODE	12

	struct completion rm_prod_granted_comp;
	struct completion rm_prod_release_comp;

	u16 ipa_free_desc_cnt;
	u16 ipa_high_watermark;
	u16 ipa_low_watermark;