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

Commit 5a49d53d authored by Mohammed Javid's avatar Mohammed Javid
Browse files

msm: ipa: Release wlan cons resource



Couple of code changes,
 - During wdi disable, ipa driver set suspend on
   wdi TX ep, i.e IPA --> WLAN cons ep.
   Get suspend handler due this suspend bit set,
   and during which ipa driver invoke wlan callback for resource request.
   In turn wlan driver returned failure due to wlan driver unloading.
   Due to this failure ipa driver was not releasing resources
   and WLAN CONS's ep's are not suspended even though wdi is
   disabled. Go ahead and handle suspend of resources in case
   of -EPERM return.

 - Delayed work which is responsible for releasing resources
   has been scheduled after resources been deleted.
   so, flush the work before we delete the resources.

Change-Id: I0c31c7dab0a3174cba13a9f6d657c3e991f8b612
Signed-off-by: default avatarMohammed Javid <mjavid@codeaurora.org>
parent 1a292e47
Loading
Loading
Loading
Loading
+27 −9
Original line number Diff line number Diff line
/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved.
/* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -155,6 +155,21 @@ int ipa_rm_delete_resource(enum ipa_rm_resource_name resource_name)
		result = -EINVAL;
		goto bail;
	}

	if (resource->state == IPA_RM_GRANTED) {
		/* There might pending timer work to
		 * release release the resource
		 */
		if (resource->release_work != NULL) {
			if (flush_delayed_work(&resource->release_work->work)
				== true) {
				IPA_RM_DBG("Flushed the pending work\n");
			} else {
				IPA_RM_DBG("Work was already idle\n");
			}
		}
	}

	result = ipa_rm_resource_delete(resource);
	if (result) {
		IPA_RM_ERR("ipa_rm_resource_delete() failed\n");
@@ -464,6 +479,8 @@ void delayed_release_work_func(struct work_struct *work)
bail:
	spin_unlock_irqrestore(&ipa_rm_ctx->ipa_rm_lock, flags);
	kfree(rwork);
	if (resource)
		resource->release_work = NULL;

}

@@ -478,7 +495,6 @@ int ipa_rm_request_resource_with_timer(enum ipa_rm_resource_name resource_name)
{
	unsigned long flags;
	struct ipa_rm_resource *resource;
	struct ipa_rm_delayed_release_work_type *release_work;
	int result;

	if (!IPA_RM_RESORCE_IS_CONS(resource_name)) {
@@ -502,16 +518,18 @@ int ipa_rm_request_resource_with_timer(enum ipa_rm_resource_name resource_name)
		goto bail;
	}

	release_work = kzalloc(sizeof(*release_work), GFP_ATOMIC);
	if (!release_work) {
	resource->release_work =
		kzalloc(sizeof(*resource->release_work), GFP_ATOMIC);
	if (!resource->release_work) {
		result = -ENOMEM;
		goto bail;
	}
	release_work->resource_name = resource->name;
	release_work->needed_bw = 0;
	release_work->dec_usage_count = false;
	INIT_DELAYED_WORK(&release_work->work, delayed_release_work_func);
	schedule_delayed_work(&release_work->work,
	resource->release_work->resource_name = resource->name;
	resource->release_work->needed_bw = 0;
	resource->release_work->dec_usage_count = false;
	INIT_DELAYED_WORK(&resource->release_work->work,
		delayed_release_work_func);
	schedule_delayed_work(&resource->release_work->work,
			msecs_to_jiffies(IPA_RM_RELEASE_DELAY_IN_MSEC));
	result = 0;
bail:
+15 −4
Original line number Diff line number Diff line
/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved.
/* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -122,11 +122,20 @@ int ipa_rm_resource_consumer_request_work(struct ipa_rm_resource_cons *consumer,
		bool dec_client_on_err)
{
	int driver_result;
	int result = 0;

	IPA_RM_DBG_LOW("calling driver CB\n");
	driver_result = consumer->request_resource();
	IPA_RM_DBG_LOW("driver CB returned with %d\n", driver_result);
	if (driver_result == 0) {

	if (driver_result == 0 ||
		driver_result == -EPERM) {
		/*
		 * Go ahead and handle suspend of
		 * resources in case of -EPERM return,
		 * as the client driver is unloaded and
		 * Holb drop is enabled
		 */
		if (notify_completion) {
			ipa_rm_resource_consumer_handle_cb(consumer,
					IPA_RM_RESOURCE_GRANTED);
@@ -140,9 +149,11 @@ int ipa_rm_resource_consumer_request_work(struct ipa_rm_resource_cons *consumer,
		consumer->resource.needed_bw -= prod_needed_bw;
		if (dec_client_on_err)
			consumer->usage_count--;
	}
		result = driver_result;
	} else
		result = driver_result;

	return driver_result;
	return result;
}

int ipa_rm_resource_consumer_request(
+2 −1
Original line number Diff line number Diff line
/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
/* Copyright (c) 2013-2016,2018 The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -65,6 +65,7 @@ struct ipa_rm_resource {
	u32				needed_bw;
	enum ipa_rm_resource_state	state;
	struct ipa_rm_peers_list	*peers_list;
	struct ipa_rm_delayed_release_work_type *release_work;
};

/**