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

Commit 49670500 authored by Subash Abhinov Kasiviswanathan's avatar Subash Abhinov Kasiviswanathan Committed by Gerrit - the friendly Code Review server
Browse files

soc: qcom: wda: Timeout and wq change



Previously timeout for powersave reqs were 10s.
Changing to 20ms which is more inline with
transaction latency. This will prevent rtnl
from being held to long in the case of dropped
or ignored request. Module param added to
change powersave check interval.

Change-Id: Ie34745b80f9f1f1405d555a3a37efbf74da3d773
CRs-Fixed: 2303862
Acked-by: default avatarRaul Martinez <mraul@qti.qualcomm.com>
Signed-off-by: default avatarSubash Abhinov Kasiviswanathan <subashab@codeaurora.org>
parent 315ed7f6
Loading
Loading
Loading
Loading
+30 −3
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
#include <net/pkt_sched.h>
#include "qmi_rmnet_i.h"
#include <trace/events/dfc.h>
#include <linux/module.h>
#include <linux/moduleparam.h>

#define NLMSG_FLOW_ACTIVATE 1
@@ -30,7 +31,11 @@
#define FLAG_POWERSAVE_MASK 0x0010
#define DFC_MODE_MULTIQ 2

#define PS_INTERVAL (0x0004 * HZ)
unsigned int rmnet_wq_frequency __read_mostly = 4;
module_param(rmnet_wq_frequency, uint, 0644);
MODULE_PARM_DESC(rmnet_wq_frequency, "Frequency of PS check");

#define PS_INTERVAL (((!rmnet_wq_frequency) ? 1 : rmnet_wq_frequency) * HZ)
#define NO_DELAY (0x0000 * HZ)

#ifdef CONFIG_QCOM_QMI_DFC
@@ -684,6 +689,7 @@ static void qmi_rmnet_check_stats(struct work_struct *work)
	if (unlikely(!real_work || !real_work->port))
		return;

	/* Min Delay for retry errors */
	lock_delay = qmi_rmnet_work_get_active(real_work->port) ?
			PS_INTERVAL : (HZ / 50);

@@ -693,7 +699,18 @@ static void qmi_rmnet_check_stats(struct work_struct *work)
	}
	if (!qmi_rmnet_work_get_active(real_work->port)) {
		qmi_rmnet_work_set_active(real_work->port, 1);
		qmi_rmnet_set_powersave_mode(real_work->port, 0);
		/* Retry after small delay if qmi error
		 * This resumes UL grants by disabling
		 * powersave mode if successful.
		 */
		if (qmi_rmnet_set_powersave_mode(real_work->port, 0) < 0) {
			qmi_rmnet_work_set_active(real_work->port, 0);
			queue_delayed_work(rmnet_ps_wq,
					   &real_work->work, lock_delay);
			rtnl_unlock();
			return;

		}
		goto end;
	}

@@ -705,7 +722,17 @@ static void qmi_rmnet_check_stats(struct work_struct *work)

	if (!rxd && !txd) {
		qmi_rmnet_work_set_active(real_work->port, 0);
		qmi_rmnet_set_powersave_mode(real_work->port, 1);
		/* Retry after lock delay if enabling powersave fails.
		 * This will cause UL grants to continue being sent
		 * suboptimally. Keeps wq active until successful.
		 */
		if (qmi_rmnet_set_powersave_mode(real_work->port, 1) < 0) {
			qmi_rmnet_work_set_active(real_work->port, 1);
			queue_delayed_work(rmnet_ps_wq,
					   &real_work->work, PS_INTERVAL);

		}

		rtnl_unlock();
		return;
	}
+1 −1
Original line number Diff line number Diff line
@@ -29,7 +29,7 @@ static void wda_svc_config(struct work_struct *work);
/* **************************************************** */
#define WDA_SERVICE_ID_V01 0x1A
#define WDA_SERVICE_VERS_V01 0x01
#define WDA_TIMEOUT_MS  10000
#define WDA_TIMEOUT_MS  20

#define QMI_WDA_SET_POWERSAVE_CONFIG_REQ_V01 0x002D
#define QMI_WDA_SET_POWERSAVE_CONFIG_RESP_V01 0x002D