| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- From 26f732791f2bcab18f59c61915bbe35225f30136 Mon Sep 17 00:00:00 2001
- From: Daniel Golle <[email protected]>
- Date: Sat, 12 Jul 2025 16:39:21 +0100
- Subject: [PATCH] Revert "leds: trigger: netdev: Configure LED blink interval
- for HW offload"
- This reverts commit c629c972b310af41e9e072febb6dae9a299edde6.
- While .led_blink_set() would previously put an LED into an unconditional
- permanently blinking state, the offending commit now uses same operation
- to (also?) set the blink timing of the netdev trigger when offloading.
- This breaks many if not all of the existing PHY drivers which offer
- offloading LED operations, as those drivers would just put the LED into
- blinking state after .led_blink_set() has been called.
- Unfortunately the change even made it into stable kernels for unknown
- reasons, so it should be reverted there as well.
- Fixes: c629c972b310a ("leds: trigger: netdev: Configure LED blink interval for HW offload")
- Link: https://lore.kernel.org/linux-leds/[email protected]/T/#m9d6fe81bbcb273e59f12bbedbd633edd32118387
- Suggested-by: Andrew Lunn <[email protected]>
- Cc: [email protected]
- Signed-off-by: Daniel Golle <[email protected]>
- Reviewed-by: Andrew Lunn <[email protected]>
- Link: https://lore.kernel.org/r/6dcc77ee1c9676891d6250d8994850f521426a0f.1752334655.git.daniel@makrotopia.org
- Signed-off-by: Lee Jones <[email protected]>
- ---
- drivers/leds/trigger/ledtrig-netdev.c | 16 +++-------------
- 1 file changed, 3 insertions(+), 13 deletions(-)
- --- a/drivers/leds/trigger/ledtrig-netdev.c
- +++ b/drivers/leds/trigger/ledtrig-netdev.c
- @@ -68,7 +68,6 @@ struct led_netdev_data {
- unsigned int last_activity;
-
- unsigned long mode;
- - unsigned long blink_delay;
- int link_speed;
- __ETHTOOL_DECLARE_LINK_MODE_MASK(supported_link_modes);
- u8 duplex;
- @@ -87,10 +86,6 @@ static void set_baseline_state(struct le
- /* Already validated, hw control is possible with the requested mode */
- if (trigger_data->hw_control) {
- led_cdev->hw_control_set(led_cdev, trigger_data->mode);
- - if (led_cdev->blink_set) {
- - led_cdev->blink_set(led_cdev, &trigger_data->blink_delay,
- - &trigger_data->blink_delay);
- - }
-
- return;
- }
- @@ -459,11 +454,10 @@ static ssize_t interval_store(struct dev
- size_t size)
- {
- struct led_netdev_data *trigger_data = led_trigger_get_drvdata(dev);
- - struct led_classdev *led_cdev = trigger_data->led_cdev;
- unsigned long value;
- int ret;
-
- - if (trigger_data->hw_control && !led_cdev->blink_set)
- + if (trigger_data->hw_control)
- return -EINVAL;
-
- ret = kstrtoul(buf, 0, &value);
- @@ -472,13 +466,9 @@ static ssize_t interval_store(struct dev
-
- /* impose some basic bounds on the timer interval */
- if (value >= 5 && value <= 10000) {
- - if (trigger_data->hw_control) {
- - trigger_data->blink_delay = value;
- - } else {
- - cancel_delayed_work_sync(&trigger_data->work);
- + cancel_delayed_work_sync(&trigger_data->work);
-
- - atomic_set(&trigger_data->interval, msecs_to_jiffies(value));
- - }
- + atomic_set(&trigger_data->interval, msecs_to_jiffies(value));
- set_baseline_state(trigger_data); /* resets timer */
- }
-
|