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

Commit 102b2cf1 authored by Manu Gautam's avatar Manu Gautam
Browse files

usb: f_gsi: Simplify handling of remote_wakeup timer



Driver uses a timer to initiate remote-wakeup after
USB bus gets suspended (U3 or function suspend state).
This timer is currently enabled by user using debugfs.
Simplify handling of this timer and also have a generic
name for timer_fn so that it can be invoked from elsewhere
as well.

Change-Id: Ic535aa2ef84c864bf59919631c438df4f1249a11
Signed-off-by: default avatarManu Gautam <mgautam@codeaurora.org>
parent 80d63754
Loading
Loading
Loading
Loading
+22 −36
Original line number Diff line number Diff line
/* Copyright (c) 2015-2017, Linux Foundation. All rights reserved.
/* Copyright (c) 2015-2018, 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
@@ -372,26 +372,22 @@ static const struct file_operations fops_usb_gsi = {
		.llseek = default_llseek,
};

static void debugfs_rw_timer_func(unsigned long arg)
static void gsi_rw_timer_func(unsigned long arg)
{
	struct f_gsi *gsi;

	gsi = (struct f_gsi *)arg;
	struct f_gsi *gsi = (struct f_gsi *)arg;

	if (gsi && atomic_read(&gsi->connected)) {
		log_event_dbg("%s: calling gsi_wakeup_host\n", __func__);
		gsi_wakeup_host(gsi);
	} else {
		log_event_dbg("%s: gsi not connected..del timer\n", __func__);
		gsi->debugfs_rw_enable = 0;
		del_timer(&gsi->debugfs_rw_timer);
	if (!atomic_read(&gsi->connected)) {
		log_event_dbg("%s: gsi not connected.. bail-out\n", __func__);
		gsi->debugfs_rw_timer_enable = 0;
		return;
	}

	if (gsi->debugfs_rw_enable) {
	gsi_wakeup_host(gsi);

	if (gsi->debugfs_rw_timer_enable) {
		log_event_dbg("%s: re-arm the timer\n", __func__);
		mod_timer(&gsi->debugfs_rw_timer,
			jiffies + msecs_to_jiffies(gsi->debugfs_rw_interval));
		mod_timer(&gsi->gsi_rw_timer,
			jiffies + msecs_to_jiffies(gsi->gsi_rw_timer_interval));
	}
}

@@ -440,7 +436,7 @@ static ssize_t usb_gsi_rw_write(struct file *file,
		goto err;
	}

	if (gsi->debugfs_rw_enable == !!input) {
	if (gsi->debugfs_rw_timer_enable == !!input) {
		if (!!input)
			log_event_dbg("%s: RW already enabled\n", __func__);
		else
@@ -448,21 +444,14 @@ static ssize_t usb_gsi_rw_write(struct file *file,
		goto err;
	}

	gsi->debugfs_rw_enable = !!input;
	if (gsi->debugfs_rw_enable) {
		init_timer(&gsi->debugfs_rw_timer);
		gsi->debugfs_rw_timer.data = (unsigned long) gsi;
		gsi->debugfs_rw_timer.function = debugfs_rw_timer_func;
	gsi->debugfs_rw_timer_enable = !!input;

		/* Use default remote wakeup timer interval if it is not set */
		if (!gsi->debugfs_rw_interval)
			gsi->debugfs_rw_interval = DEFAULT_RW_TIMER_INTERVAL;
		gsi->debugfs_rw_timer.expires = jiffies +
				msecs_to_jiffies(gsi->debugfs_rw_interval);
		add_timer(&gsi->debugfs_rw_timer);
	if (gsi->debugfs_rw_timer_enable) {
		mod_timer(&gsi->gsi_rw_timer, jiffies +
			  msecs_to_jiffies(gsi->gsi_rw_timer_interval));
		log_event_dbg("%s: timer initialized\n", __func__);
	} else {
		del_timer_sync(&gsi->debugfs_rw_timer);
		del_timer_sync(&gsi->gsi_rw_timer);
		log_event_dbg("%s: timer deleted\n", __func__);
	}

@@ -481,7 +470,7 @@ static int usb_gsi_rw_show(struct seq_file *s, void *unused)
		return 0;
	}

	seq_printf(s, "%d\n", gsi->debugfs_rw_enable);
	seq_printf(s, "%d\n", gsi->debugfs_rw_timer_enable);

	return 0;
}
@@ -529,7 +518,7 @@ static ssize_t usb_gsi_rw_timer_write(struct file *file,
		goto err;
	}

	gsi->debugfs_rw_interval = timer_val;
	gsi->gsi_rw_timer_interval = timer_val;
err:
	return count;
}
@@ -537,7 +526,6 @@ err:
static int usb_gsi_rw_timer_show(struct seq_file *s, void *unused)
{
	struct f_gsi *gsi;
	unsigned timer_interval;

	gsi = get_connected_gsi();
	if (!gsi) {
@@ -545,11 +533,7 @@ static int usb_gsi_rw_timer_show(struct seq_file *s, void *unused)
		return 0;
	}

	timer_interval = DEFAULT_RW_TIMER_INTERVAL;
	if (gsi->debugfs_rw_interval)
		timer_interval = gsi->debugfs_rw_interval;

	seq_printf(s, "%ums\n", timer_interval);
	seq_printf(s, "%ums\n", gsi->gsi_rw_timer_interval);

	return 0;
}
@@ -3371,6 +3355,8 @@ static int gsi_function_init(enum ipa_usb_teth_prot prot_id)
	gsi_prot_ctx[prot_id] = gsi;

	gsi->d_port.ipa_usb_wq = ipa_usb_wq;
	gsi->gsi_rw_timer_interval = DEFAULT_RW_TIMER_INTERVAL;
	setup_timer(&gsi->gsi_rw_timer, gsi_rw_timer_func, (unsigned long) gsi);

	ret = gsi_function_ctrl_port_init(prot_id);
	if (ret) {
+3 −3
Original line number Diff line number Diff line
@@ -228,9 +228,9 @@ struct f_gsi {
	struct gsi_data_port d_port;
	struct gsi_ctrl_port c_port;
	/* To test remote wakeup using debugfs */
	struct timer_list debugfs_rw_timer;
	u8 debugfs_rw_enable;
	u16 debugfs_rw_interval;
	struct timer_list gsi_rw_timer;
	u8 debugfs_rw_timer_enable;
	u16 gsi_rw_timer_interval;
};

static struct f_gsi *gsi_prot_ctx[IPA_USB_MAX_TETH_PROT_SIZE];