12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- From 91f7d2e89868fcac0e750a28230fdb1ad4512137 Mon Sep 17 00:00:00 2001
- From: Christian Lamparter <[email protected]>
- 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 <[email protected]>
- Cc: stable <[email protected]>
- Acked-by: Jacek Anaszewski <[email protected]>
- Signed-off-by: Greg Kroah-Hartman <[email protected]>
- ---
- --- a/drivers/usb/core/ledtrig-usbport.c
- +++ b/drivers/usb/core/ledtrig-usbport.c
- @@ -119,11 +119,6 @@ static const struct attribute_group port
- .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 no
- 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
-
- /* 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
- 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(stru
- 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_tr
- .name = "usbport",
- .activate = usbport_trig_activate,
- .deactivate = usbport_trig_deactivate,
- - .groups = ports_groups,
- };
-
- static int __init usbport_trig_init(void)
|