[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20190605090556.17792-1-erosca@de.adit-jv.com>
Date: Wed, 5 Jun 2019 11:05:56 +0200
From: Eugeniu Rosca <erosca@...adit-jv.com>
To: <linux-usb@...r.kernel.org>, <linux-kernel@...r.kernel.org>,
Greg Kroah-Hartman <gregkh@...uxfoundation.org>,
Alan Stern <stern@...land.harvard.edu>,
Mathias Nyman <mathias.nyman@...ux.intel.com>,
Kai-Heng Feng <kai.heng.feng@...onical.com>,
Felipe Balbi <felipe.balbi@...ux.intel.com>,
Nicolas Boichat <drinkcat@...omium.org>,
Mathias Payer <mathias.payer@...elwelt.net>,
Kento Kobayashi <Kento.A.Kobayashi@...y.com>,
Hui Peng <benquike@...il.com>,
Raul E Rangel <rrangel@...omium.org>,
Douglas Anderson <dianders@...omium.org>,
Jan-Marek Glogowski <glogow@...home.de>,
Bin Liu <b-liu@...com>,
Colin Ian King <colin.king@...onical.com>,
Nicolas Saenz Julienne <nsaenzjulienne@...e.de>,
Jon Flatley <jflat@...omium.org>,
Mathieu Malaterre <malat@...ian.org>
CC: Spyridon Papageorgiou <spapageorgiou@...adit-jv.com>,
Eugeniu Rosca <erosca@...adit-jv.com>,
Eugeniu Rosca <roscaeugeniu@...il.com>,
Joshua Frkuska <joshua_frkuska@...tor.com>,
"George G . Davis" <george_davis@...tor.com>,
<yuichi.kusakabe@...so-ten.com>, <yohhei.fukui@...so-ten.com>,
<natsumi.kamei@...so-ten.com>, <yasano@...adit-jv.com>
Subject: [PATCH] usb: hub: report failure to enumerate uevent to userspace
From: Spyridon Papageorgiou <spapageorgiou@...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@...adit-jv.com>
Signed-off-by: Eugeniu Rosca <erosca@...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@...omium.org
+
+What: Raise a uevent when USB device enumeration has failed
+Date: 2019-06-05
+KernelVersion: 5.2
+Contact: linux-usb@...r.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@...a0000
+ 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
Powered by blists - more mailing lists