aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/generic/backport-4.19
diff options
context:
space:
mode:
authorChristian Lamparter <chunkeey@gmail.com>2019-01-18 13:51:09 +0100
committerChristian Lamparter <chunkeey@gmail.com>2019-01-24 15:53:03 +0100
commitb5f6ede3c4e4f7cc0d2127982a0ad320d8ebd164 (patch)
tree879eea434c51729f1e36b7dbce5333a416af54a3 /target/linux/generic/backport-4.19
parent6928d06a7edabf7679c4f69a50051d891084e1d9 (diff)
downloadupstream-b5f6ede3c4e4f7cc0d2127982a0ad320d8ebd164.tar.gz
upstream-b5f6ede3c4e4f7cc0d2127982a0ad320d8ebd164.tar.bz2
upstream-b5f6ede3c4e4f7cc0d2127982a0ad320d8ebd164.zip
kernel: 4.19: use upstream usbport led trigger fix
This patch replaces the current hack with a better version of the RFC patch has been accepted upstream. Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
Diffstat (limited to 'target/linux/generic/backport-4.19')
-rw-r--r--target/linux/generic/backport-4.19/800-v5.0-usb-leds-fix-regression-in-usbport-led-trigger.patch91
1 files changed, 91 insertions, 0 deletions
diff --git a/target/linux/generic/backport-4.19/800-v5.0-usb-leds-fix-regression-in-usbport-led-trigger.patch b/target/linux/generic/backport-4.19/800-v5.0-usb-leds-fix-regression-in-usbport-led-trigger.patch
new file mode 100644
index 0000000000..112a01a8dc
--- /dev/null
+++ b/target/linux/generic/backport-4.19/800-v5.0-usb-leds-fix-regression-in-usbport-led-trigger.patch
@@ -0,0 +1,91 @@
+From 91f7d2e89868fcac0e750a28230fdb1ad4512137 Mon Sep 17 00:00:00 2001
+From: Christian Lamparter <chunkeey@gmail.com>
+Date: Fri, 11 Jan 2019 17:29:45 +0100
+Subject: USB: leds: fix regression in usbport led trigger
+
+The patch "usb: simplify usbport trigger" together with "leds: triggers:
+add device attribute support" caused an regression for the usbport
+trigger. it will no longer enumerate any active usb hub ports under the
+"ports" directory in the sysfs class directory, if the usb host drivers
+are fully initialized before the usbport trigger was loaded.
+
+The reason is that the usbport driver tries to register the sysfs
+entries during the activate() callback. And this will fail with -2 /
+ENOENT because the patch "leds: triggers: add device attribute support"
+made it so that the sysfs "ports" group was only being added after the
+activate() callback succeeded.
+
+This version of the patch reverts parts of the "usb: simplify usbport
+trigger" patch and restores usbport trigger's functionality.
+
+Fixes: 6f7b0bad8839 ("usb: simplify usbport trigger")
+Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
+Cc: stable <stable@vger.kernel.org>
+Acked-by: Jacek Anaszewski <jacek.anaszewski@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+--- a/drivers/usb/core/ledtrig-usbport.c
++++ b/drivers/usb/core/ledtrig-usbport.c
+@@ -119,11 +119,6 @@ static const struct attribute_group ports_group = {
+ .attrs = ports_attrs,
+ };
+
+-static const struct attribute_group *ports_groups[] = {
+- &ports_group,
+- NULL
+-};
+-
+ /***************************************
+ * Adding & removing ports
+ ***************************************/
+@@ -307,6 +302,7 @@ static int usbport_trig_notify(struct notifier_block *nb, unsigned long action,
+ static int usbport_trig_activate(struct led_classdev *led_cdev)
+ {
+ struct usbport_trig_data *usbport_data;
++ int err;
+
+ usbport_data = kzalloc(sizeof(*usbport_data), GFP_KERNEL);
+ if (!usbport_data)
+@@ -315,6 +311,9 @@ static int usbport_trig_activate(struct led_classdev *led_cdev)
+
+ /* List of ports */
+ INIT_LIST_HEAD(&usbport_data->ports);
++ err = sysfs_create_group(&led_cdev->dev->kobj, &ports_group);
++ if (err)
++ goto err_free;
+ usb_for_each_dev(usbport_data, usbport_trig_add_usb_dev_ports);
+ usbport_trig_update_count(usbport_data);
+
+@@ -322,8 +321,11 @@ static int usbport_trig_activate(struct led_classdev *led_cdev)
+ usbport_data->nb.notifier_call = usbport_trig_notify;
+ led_set_trigger_data(led_cdev, usbport_data);
+ usb_register_notify(&usbport_data->nb);
+-
+ return 0;
++
++err_free:
++ kfree(usbport_data);
++ return err;
+ }
+
+ static void usbport_trig_deactivate(struct led_classdev *led_cdev)
+@@ -335,6 +337,8 @@ static void usbport_trig_deactivate(struct led_classdev *led_cdev)
+ usbport_trig_remove_port(usbport_data, port);
+ }
+
++ sysfs_remove_group(&led_cdev->dev->kobj, &ports_group);
++
+ usb_unregister_notify(&usbport_data->nb);
+
+ kfree(usbport_data);
+@@ -344,7 +348,6 @@ static struct led_trigger usbport_led_trigger = {
+ .name = "usbport",
+ .activate = usbport_trig_activate,
+ .deactivate = usbport_trig_deactivate,
+- .groups = ports_groups,
+ };
+
+ static int __init usbport_trig_init(void)
+--
+cgit 1.2-0.3.lf.el7
+