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

Commit 92b7d9cd authored by qctecmdr Service's avatar qctecmdr Service Committed by Gerrit - the friendly Code Review server
Browse files

Merge "usb: f_gsi: Initiate remote-wakeup if notification already queued"

parents 1faefad9 15fb272e
Loading
Loading
Loading
Loading
+35 −31
Original line number Diff line number Diff line
@@ -188,26 +188,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));
	}
}

@@ -260,7 +257,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
@@ -268,21 +265,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__);
	}

@@ -301,7 +291,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;
}
@@ -349,7 +339,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;
}
@@ -357,7 +347,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) {
@@ -365,11 +354,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;
}
@@ -2485,6 +2470,9 @@ static void gsi_disable(struct usb_function *f)

	atomic_set(&gsi->connected, 0);

	del_timer(&gsi->gsi_rw_timer);
	gsi->debugfs_rw_timer_enable = 0;

	if (gsi->prot_id == IPA_USB_RNDIS)
		rndis_uninit(gsi->params);

@@ -2533,6 +2521,16 @@ static void gsi_suspend(struct usb_function *f)
	post_event(&gsi->d_port, EVT_SUSPEND);
	queue_work(gsi->d_port.ipa_usb_wq, &gsi->d_port.usb_ipa_w);
	log_event_dbg("gsi suspended");

	/*
	 * If host suspended bus without receiving notification request then
	 * initiate remote-wakeup. As driver won't be able to do it later since
	 * notification request is already queued.
	 */
	if (gsi->c_port.notify_req_queued && usb_gsi_remote_wakeup_allowed(f)) {
		mod_timer(&gsi->gsi_rw_timer, jiffies + msecs_to_jiffies(2000));
		log_event_dbg("%s: pending response, arm rw_timer\n", __func__);
	}
}

static void gsi_resume(struct usb_function *f)
@@ -2550,6 +2548,10 @@ static void gsi_resume(struct usb_function *f)
		f->func_is_suspended)
		return;

	/* Keep timer enabled if user enabled using debugfs */
	if (!gsi->debugfs_rw_timer_enable)
		del_timer(&gsi->gsi_rw_timer);

	if (gsi->c_port.notify && !gsi->c_port.notify->desc)
		config_ep_by_speed(cdev->gadget, f, gsi->c_port.notify);

@@ -3286,6 +3288,8 @@ static struct f_gsi *gsi_function_init(enum ipa_usb_teth_prot prot_id)
		kfree(gsi);
		goto error;
	}
	gsi->gsi_rw_timer_interval = DEFAULT_RW_TIMER_INTERVAL;
	setup_timer(&gsi->gsi_rw_timer, gsi_rw_timer_func, (unsigned long) gsi);

	return gsi;
error:
+5 −3
Original line number Diff line number Diff line
@@ -281,10 +281,12 @@ struct f_gsi {
	struct gsi_ctrl_port c_port;
	void *ipc_log_ctxt;
	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;

};

static inline struct f_gsi *func_to_gsi(struct usb_function *f)