|
|
@@ -0,0 +1,81 @@
|
|
|
+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
|
|
|
+@@ -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 */
|
|
|
+ }
|
|
|
+
|