From: Daniel Golle Date: Thu, 31 Jul 2025 18:48:32 +0000 (+0100) Subject: kernel: add backport to fix broken PHY LEDs X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1de1df1bea94547150f01006062358ebe68ae874;p=thirdparty%2Fopenwrt.git kernel: add backport to fix broken PHY LEDs A commit which broke netdev trigger LEDs offloaded to PHYs recently made it all the way down to the Linux 6.6 stable branch. The revert has been accepted to linux-next, however, a backport to the various -stable trees is still pending. Import the backported revert commit to fix in OpenWrt in the meantime until the revert also gets picked to linux-stable. Link: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=26f732791f2bcab18f59c61915bbe35225f30136 Signed-off-by: Daniel Golle --- diff --git a/target/linux/generic/backport-6.12/830-v6.17-Revert-leds-trigger-netdev-Configure-LED-blink-inter.patch b/target/linux/generic/backport-6.12/830-v6.17-Revert-leds-trigger-netdev-Configure-LED-blink-inter.patch new file mode 100644 index 00000000000..ba83b8e0699 --- /dev/null +++ b/target/linux/generic/backport-6.12/830-v6.17-Revert-leds-trigger-netdev-Configure-LED-blink-inter.patch @@ -0,0 +1,81 @@ +From 26f732791f2bcab18f59c61915bbe35225f30136 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +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/c6134e26-2e45-4121-aa15-58aaef327201@lunn.ch/T/#m9d6fe81bbcb273e59f12bbedbd633edd32118387 +Suggested-by: Andrew Lunn +Cc: stable@vger.kernel.org +Signed-off-by: Daniel Golle +Reviewed-by: Andrew Lunn +Link: https://lore.kernel.org/r/6dcc77ee1c9676891d6250d8994850f521426a0f.1752334655.git.daniel@makrotopia.org +Signed-off-by: Lee Jones +--- + 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 */ + } + diff --git a/target/linux/generic/backport-6.6/847-v6.17-Revert-leds-trigger-netdev-Configure-LED-blink-inter.patch b/target/linux/generic/backport-6.6/847-v6.17-Revert-leds-trigger-netdev-Configure-LED-blink-inter.patch new file mode 100644 index 00000000000..192f12d5c8f --- /dev/null +++ b/target/linux/generic/backport-6.6/847-v6.17-Revert-leds-trigger-netdev-Configure-LED-blink-inter.patch @@ -0,0 +1,81 @@ +From 26f732791f2bcab18f59c61915bbe35225f30136 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +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/c6134e26-2e45-4121-aa15-58aaef327201@lunn.ch/T/#m9d6fe81bbcb273e59f12bbedbd633edd32118387 +Suggested-by: Andrew Lunn +Cc: stable@vger.kernel.org +Signed-off-by: Daniel Golle +Reviewed-by: Andrew Lunn +Link: https://lore.kernel.org/r/6dcc77ee1c9676891d6250d8994850f521426a0f.1752334655.git.daniel@makrotopia.org +Signed-off-by: Lee Jones +--- + 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 +@@ -54,7 +54,6 @@ struct led_netdev_data { + unsigned int last_activity; + + unsigned long mode; +- unsigned long blink_delay; + int link_speed; + u8 duplex; + +@@ -70,10 +69,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; + } +@@ -415,11 +410,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); +@@ -428,13 +422,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 */ + } +