]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
kernel: add backport to fix broken PHY LEDs
authorDaniel Golle <daniel@makrotopia.org>
Thu, 31 Jul 2025 18:48:32 +0000 (19:48 +0100)
committerDaniel Golle <daniel@makrotopia.org>
Thu, 31 Jul 2025 18:52:33 +0000 (19:52 +0100)
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 <daniel@makrotopia.org>
target/linux/generic/backport-6.12/830-v6.17-Revert-leds-trigger-netdev-Configure-LED-blink-inter.patch [new file with mode: 0644]
target/linux/generic/backport-6.6/847-v6.17-Revert-leds-trigger-netdev-Configure-LED-blink-inter.patch [new file with mode: 0644]

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 (file)
index 0000000..ba83b8e
--- /dev/null
@@ -0,0 +1,81 @@
+From 26f732791f2bcab18f59c61915bbe35225f30136 Mon Sep 17 00:00:00 2001
+From: Daniel Golle <daniel@makrotopia.org>
+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 <andrew@lunn.ch>
+Cc: stable@vger.kernel.org
+Signed-off-by: Daniel Golle <daniel@makrotopia.org>
+Reviewed-by: Andrew Lunn <andrew@lunn.ch>
+Link: https://lore.kernel.org/r/6dcc77ee1c9676891d6250d8994850f521426a0f.1752334655.git.daniel@makrotopia.org
+Signed-off-by: Lee Jones <lee@kernel.org>
+---
+ 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 (file)
index 0000000..192f12d
--- /dev/null
@@ -0,0 +1,81 @@
+From 26f732791f2bcab18f59c61915bbe35225f30136 Mon Sep 17 00:00:00 2001
+From: Daniel Golle <daniel@makrotopia.org>
+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 <andrew@lunn.ch>
+Cc: stable@vger.kernel.org
+Signed-off-by: Daniel Golle <daniel@makrotopia.org>
+Reviewed-by: Andrew Lunn <andrew@lunn.ch>
+Link: https://lore.kernel.org/r/6dcc77ee1c9676891d6250d8994850f521426a0f.1752334655.git.daniel@makrotopia.org
+Signed-off-by: Lee Jones <lee@kernel.org>
+---
+ 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 */
+       }