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

Commit d44dcc1f 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 8f554946
Loading
Loading
Loading
Loading
+19 −31
Original line number Diff line number Diff line
@@ -211,26 +211,23 @@ static int gsi_wakeup_host(struct f_gsi *gsi)
	return ret;
}

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 (!atomic_read(&gsi->connected)) {
		log_event_dbg("%s: gsi not connected..del timer\n", __func__);
		gsi->debugfs_rw_enable = 0;
		del_timer(&gsi->debugfs_rw_timer);
		log_event_dbg("%s: gsi not connected.. bail-out\n", __func__);
		gsi->debugfs_rw_timer_enable = 0;
		return;
	}

	log_event_dbg("%s: calling gsi_wakeup_host\n", __func__);
	gsi_wakeup_host(gsi);

	if (gsi->debugfs_rw_enable) {
	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));
	}
}

@@ -279,7 +276,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
@@ -287,21 +284,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__);
	}

@@ -320,7 +310,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;
}
@@ -368,7 +358,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;
}
@@ -376,7 +366,6 @@ static ssize_t usb_gsi_rw_timer_write(struct file *file,
static int usb_gsi_rw_timer_show(struct seq_file *s, void *unused)
{
	struct f_gsi *gsi;
	unsigned int timer_interval;

	gsi = get_connected_gsi();
	if (!gsi) {
@@ -384,11 +373,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;
}
@@ -3354,6 +3339,9 @@ static struct f_gsi *gsi_function_init(void)

	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);

	return gsi;
}

+5 −3
Original line number Diff line number Diff line
@@ -278,10 +278,12 @@ struct f_gsi {
	struct gsi_data_port d_port;
	struct gsi_ctrl_port c_port;
	bool rmnet_dtr_status;

	/* 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;

	bool host_supports_flow_control;
};