All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] usb: hub: report failure to enumerate uevent to userspace
@ 2019-06-05  9:05 Eugeniu Rosca
  2019-06-05 10:03 ` Greg Kroah-Hartman
  0 siblings, 1 reply; 6+ messages in thread
From: Eugeniu Rosca @ 2019-06-05  9:05 UTC (permalink / raw)
  To: linux-usb, linux-kernel, Greg Kroah-Hartman, Alan Stern,
	Mathias Nyman, Kai-Heng Feng, Felipe Balbi, Nicolas Boichat,
	Mathias Payer, Kento Kobayashi, Hui Peng, Raul E Rangel,
	Douglas Anderson, Jan-Marek Glogowski, Bin Liu, Colin Ian King,
	Nicolas Saenz Julienne, Jon Flatley, Mathieu Malaterre
  Cc: Spyridon Papageorgiou, Eugeniu Rosca, Eugeniu Rosca,
	Joshua Frkuska, George G . Davis, yuichi.kusakabe, yohhei.fukui,
	natsumi.kamei, yasano

From: Spyridon Papageorgiou <spapageorgiou@de.adit-jv.com>

When a USB device fails to enumerate, only a kernel message is printed.
With this patch, a uevent is also generated to notify userspace.
Services can monitor for the event through udev and handle failures
accordingly.

The "port_enumerate_fail_notify()" function name follows the syntax of
"port_over_current_notify()" used in v4.20-rc1
commit 201af55da8a398 ("usb: core: added uevent for over-current").

Signed-off-by: Spyridon Papageorgiou <spapageorgiou@de.adit-jv.com>
Signed-off-by: Eugeniu Rosca <erosca@de.adit-jv.com>
---
 Documentation/ABI/testing/usb-uevent | 36 ++++++++++++++++++++++++++++
 drivers/usb/core/hub.c               | 15 +++++++++++-
 2 files changed, 50 insertions(+), 1 deletion(-)

diff --git a/Documentation/ABI/testing/usb-uevent b/Documentation/ABI/testing/usb-uevent
index d35c3cad892c..23e618227d31 100644
--- a/Documentation/ABI/testing/usb-uevent
+++ b/Documentation/ABI/testing/usb-uevent
@@ -25,3 +25,39 @@ Description:	When the USB Host Controller has entered a state where it is no
 		TYPE=9/0/1
 
 Users:		chromium-os-dev@chromium.org
+
+What:		Raise a uevent when USB device enumeration has failed
+Date:		2019-06-05
+KernelVersion:	5.2
+Contact:	linux-usb@vger.kernel.org
+Description:	When a USB device has failed to enumerate, a uevent will be generated.
+		The uevent will contain ACTION=change, ENUMERATION_FAILURE=1 and
+		ENUMERATION_FAIL_PORT=<port_id>. Services can monitor for the event
+		through udev and handle failures accordingly.
+
+		Here is an example taken using udevadm monitor -p (R-Car H3ULCB):
+
+		UDEV  [47.298493] change   /devices/platform/soc/ee0a0000.usb/usb4/4-0:1.0 (usb)
+		ACTION=change
+		DEVPATH=/devices/platform/soc/ee0a0000.usb/usb4/4-0:1.0
+		DEVTYPE=usb_interface
+		DRIVER=hub
+		ENUMERATION_FAILURE=1
+		ENUMERATION_FAIL_PORT=1
+		ID_MODEL_FROM_DATABASE=1.1 root hub
+		ID_USB_CLASS_FROM_DATABASE=Hub
+		ID_USB_PROTOCOL_FROM_DATABASE=Full speed (or root) hub
+		ID_VENDOR_FROM_DATABASE=Linux Foundation
+		INTERFACE=9/0/0
+		MODALIAS=usb:v1D6Bp0001d0502dc09dsc00dp00ic09isc00ip00in00
+		OF_COMPATIBLE_0=generic-ohci
+		OF_COMPATIBLE_N=1
+		OF_FULLNAME=/soc/usb@ee0a0000
+		OF_NAME=usb
+		PRODUCT=1d6b/1/502
+		SEQNUM=1762
+		SUBSYSTEM=usb
+		TYPE=9/0/0
+		USEC_INITIALIZED=24344435
+
+Users:		ADIT, DENSO TEN
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 2f94568ba385..da1a3d47a071 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -4921,6 +4921,17 @@ hub_power_remaining(struct usb_hub *hub)
 	return remaining;
 }
 
+static void port_enumerate_fail_notify(struct usb_port *port)
+{
+	char env_port[32];
+	char *envp[3] = { "ENUMERATION_FAILURE=1", env_port, NULL };
+
+	snprintf(env_port, sizeof(env_port), "ENUMERATION_FAIL_PORT=%d",
+		 port->portnum);
+
+	kobject_uevent_env(&port->dev.parent->kobj, KOBJ_CHANGE, envp);
+}
+
 static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
 		u16 portchange)
 {
@@ -5131,9 +5142,11 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
 	if (hub->hdev->parent ||
 			!hcd->driver->port_handed_over ||
 			!(hcd->driver->port_handed_over)(hcd, port1)) {
-		if (status != -ENOTCONN && status != -ENODEV)
+		if (status != -ENOTCONN && status != -ENODEV) {
+			port_enumerate_fail_notify(port_dev);
 			dev_err(&port_dev->dev,
 					"unable to enumerate USB device\n");
+		}
 	}
 
 done:
-- 
2.21.0


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

end of thread, other threads:[~2019-06-05 21:23 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-06-05  9:05 [PATCH] usb: hub: report failure to enumerate uevent to userspace Eugeniu Rosca
2019-06-05 10:03 ` Greg Kroah-Hartman
2019-06-05 16:55   ` Eugeniu Rosca
2019-06-05 17:48     ` Greg Kroah-Hartman
2019-06-05 21:19   ` David Howells
2019-06-05 21:22   ` David Howells

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.