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

Commit d87d2e66 authored by Mayank Rana's avatar Mayank Rana
Browse files

usb: gsi: Queue control notification on gsi_resume



There is delay seen in queueing notification when response is
available after performing function remote wakeup. This change
queues control notification from gsi_resume() for RMNET/MBIM and
ECM case when notify_count is 1 (i.e. remote wakeup is performed
but notify request is not queued.) to make sure that host is
notified before it timeouts for response and starts data transfer.

CRs-Fixed: 1033093
Change-Id: Ic55667df93c8bd51df06b48709bc420c082fbcf5
Signed-off-by: default avatarMayank Rana <mrana@codeaurora.org>
parent d5fa91ad
Loading
Loading
Loading
Loading
+25 −12
Original line number Diff line number Diff line
@@ -1588,6 +1588,12 @@ static int gsi_ctrl_send_notification(struct f_gsi *gsi,
		return -ENODEV;
	}

	if (atomic_inc_return(&gsi->c_port.notify_count) != 1) {
		log_event_dbg("delay ep_queue: notify req is busy %d",
				atomic_read(&gsi->c_port.notify_count));
		return 0;
	}

	event = req->buf;

	switch (state) {
@@ -1643,12 +1649,6 @@ static int gsi_ctrl_send_notification(struct f_gsi *gsi,

	log_event_dbg("send Notify type %02x", event->bNotificationType);

	if (atomic_inc_return(&gsi->c_port.notify_count) != 1) {
		log_event_dbg("delay ep_queue: notify req is busy %d",
			atomic_read(&gsi->c_port.notify_count));
		return 0;
	}

	return queue_notification_request(gsi);
}

@@ -1698,7 +1698,8 @@ static void gsi_rndis_response_available(void *_rndis)
{
	struct f_gsi *gsi = _rndis;

	gsi_ctrl_send_notification(gsi, GSI_CTRL_NOTIFY_RESPONSE_AVAILABLE);
	gsi_ctrl_send_notification(gsi,
			GSI_CTRL_NOTIFY_RESPONSE_AVAILABLE);
}

static void gsi_rndis_command_complete(struct usb_ep *ep,
@@ -2294,6 +2295,8 @@ static void gsi_suspend(struct usb_function *f)
		queue_work(gsi->d_port.ipa_usb_wq, &gsi->d_port.usb_ipa_w);
	}

	log_event_dbg("%s: notify_count = %d\n",
		__func__, atomic_read(&gsi->c_port.notify_count));
	log_event_dbg("gsi suspended");
}

@@ -2323,6 +2326,21 @@ static void gsi_resume(struct usb_function *f)
	else
		remote_wakeup_allowed = f->config->cdev->gadget->remote_wakeup;

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

	log_event_dbg("%s: notify_count = %d\n",
		__func__, atomic_read(&gsi->c_port.notify_count));

	/* Send notification to host for RMNET, RNDIS and MBIM Interface */
	if ((gsi->prot_id == IPA_USB_MBIM ||
			gsi->prot_id == IPA_USB_RNDIS ||
			gsi->prot_id == IPA_USB_RMNET) &&
			(atomic_read(&gsi->c_port.notify_count) >= 1)) {
		log_event_dbg("%s: force_queue\n", __func__);
		queue_notification_request(gsi);
	}

	if (!remote_wakeup_allowed) {

		/* Configure EPs for GSI */
@@ -2353,11 +2371,6 @@ static void gsi_resume(struct usb_function *f)
		post_event(&gsi->d_port, EVT_RESUMED);

	queue_work(gsi->d_port.ipa_usb_wq, &gsi->d_port.usb_ipa_w);

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

	atomic_set(&gsi->c_port.notify_count, 0);
	log_event_dbg("%s: completed", __func__);
}