public inbox for linux-usb@vger.kernel.org
 help / color / mirror / Atom feed
* USB Gadget EEM Suspend/Resume
@ 2020-11-16 23:11 Neuenschwander, Bowe
  2020-11-17  1:39 ` Peter Chen
  0 siblings, 1 reply; 5+ messages in thread
From: Neuenschwander, Bowe @ 2020-11-16 23:11 UTC (permalink / raw)
  To: linux-usb@vger.kernel.org

[-- Attachment #1: Type: text/plain, Size: 708 bytes --]

Hello,

I was hoping for some input  on how USB Ethernet Gadget drivers should handle USB suspend/resume  events.  We have a case where the USB suspend hook is being called for  an EEM Gadget; but since that hook is currently unimplemented, the interface remains in an active/enabled state.  I have  attached a patch that seems to fix this issue for EEM devices by  calling gether_disconnect() on suspend and gether_connect() on resume;  but I do not if this is actually correct behavior, so I was looking for some advice on that.  It seems that since the gadget driver cannot send data until the USB host resumes the USB link,  that the interface should be considered disconnected.

Thanks,
-Bowe
    

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-usb-gadget-eem-Add-suspend-resume-handling.patch --]
[-- Type: text/x-patch; name="0001-usb-gadget-eem-Add-suspend-resume-handling.patch", Size: 2023 bytes --]

From 7cdc1cebe4092393e1de33f59fd2f1cd4355d494 Mon Sep 17 00:00:00 2001
From: Bowe Neuenschwander <bowe.neuenschwander@garmin.com>
Date: Tue, 10 Nov 2020 15:55:51 -0600
Subject: [PATCH 1/2] usb: gadget: eem: Add suspend/resume handling

Add suspend/resume handling to the USB Gadget EEM driver.  On suspend,
disconnect the interface; on resume, attempt to reconnect the interface.

Change-Id: I1c7a2bb1d68a99c774a415b13f6cdabb507ada92
---
 drivers/usb/gadget/function/f_eem.c | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/drivers/usb/gadget/function/f_eem.c b/drivers/usb/gadget/function/f_eem.c
index cad35a502d3f..4fbdbb8ee295 100644
--- a/drivers/usb/gadget/function/f_eem.c
+++ b/drivers/usb/gadget/function/f_eem.c
@@ -238,6 +238,33 @@ static void eem_disable(struct usb_function *f)
 		gether_disconnect(&eem->port);
 }
 
+static void eem_suspend(struct usb_function *f)
+{
+	struct f_eem		*eem = func_to_eem(f);
+	struct usb_composite_dev *cdev = f->config->cdev;
+
+	DBG(cdev, "eem suspended\n");
+
+	if (eem->port.in_ep->enabled)
+		gether_disconnect(&eem->port);
+}
+
+static void eem_resume(struct usb_function *f)
+{
+	struct f_eem		*eem = func_to_eem(f);
+	struct usb_composite_dev *cdev = f->config->cdev;
+	struct net_device	*net;
+
+	DBG(cdev, "eem resumed\n");
+
+	if (!eem->port.in_ep->enabled) {
+		net = gether_connect(&eem->port);
+		if (IS_ERR(net))
+			ERROR(cdev, "%s: eem resume failed, err %d\n",
+			      f->name, PTR_ERR(net));
+	}
+}
+
 /*-------------------------------------------------------------------------*/
 
 /* EEM function driver setup/binding */
@@ -636,6 +663,8 @@ static struct usb_function *eem_alloc(struct usb_function_instance *fi)
 	eem->port.func.set_alt = eem_set_alt;
 	eem->port.func.setup = eem_setup;
 	eem->port.func.disable = eem_disable;
+	eem->port.func.suspend = eem_suspend;
+	eem->port.func.resume = eem_resume;
 	eem->port.func.free_func = eem_free;
 	eem->port.wrap = eem_wrap;
 	eem->port.unwrap = eem_unwrap;
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2020-12-03 18:42 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-11-16 23:11 USB Gadget EEM Suspend/Resume Neuenschwander, Bowe
2020-11-17  1:39 ` Peter Chen
2020-11-17 18:30   ` Neuenschwander, Bowe
2020-11-25  1:53     ` Peter Chen
2020-12-03 18:41       ` Neuenschwander, Bowe

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox