[PATCH net-next 1/3] leds: trigger: netdev: Extend speeds up to 100G

From: mike . marciniszyn

Date: Wed May 20 2026 - 16:04:47 EST


From: "Mike Marciniszyn (Meta)" <mike.marciniszyn@xxxxxxxxx>

Add 25G, 40G, 50G, and 100G as available speeds to the netdev LED trigger.

Signed-off-by: Mike Marciniszyn (Meta) <mike.marciniszyn@xxxxxxxxx>
---
drivers/leds/trigger/ledtrig-netdev.c | 46 ++++++++++++++++++++++++++-
include/linux/leds.h | 4 +++
2 files changed, 49 insertions(+), 1 deletion(-)

diff --git a/drivers/leds/trigger/ledtrig-netdev.c b/drivers/leds/trigger/ledtrig-netdev.c
index 12cb3311ea22..3c758a4cbaec 100644
--- a/drivers/leds/trigger/ledtrig-netdev.c
+++ b/drivers/leds/trigger/ledtrig-netdev.c
@@ -128,6 +128,22 @@ static void set_baseline_state(struct led_netdev_data *trigger_data)
trigger_data->link_speed == SPEED_10000)
blink_on = true;

+ if (test_bit(TRIGGER_NETDEV_LINK_25000, &trigger_data->mode) &&
+ trigger_data->link_speed == SPEED_25000)
+ blink_on = true;
+
+ if (test_bit(TRIGGER_NETDEV_LINK_40000, &trigger_data->mode) &&
+ trigger_data->link_speed == SPEED_40000)
+ blink_on = true;
+
+ if (test_bit(TRIGGER_NETDEV_LINK_50000, &trigger_data->mode) &&
+ trigger_data->link_speed == SPEED_50000)
+ blink_on = true;
+
+ if (test_bit(TRIGGER_NETDEV_LINK_100000, &trigger_data->mode) &&
+ trigger_data->link_speed == SPEED_100000)
+ blink_on = true;
+
if (test_bit(TRIGGER_NETDEV_HALF_DUPLEX, &trigger_data->mode) &&
trigger_data->duplex == DUPLEX_HALF)
blink_on = true;
@@ -337,6 +353,10 @@ static ssize_t netdev_led_attr_show(struct device *dev, char *buf,
case TRIGGER_NETDEV_LINK_2500:
case TRIGGER_NETDEV_LINK_5000:
case TRIGGER_NETDEV_LINK_10000:
+ case TRIGGER_NETDEV_LINK_25000:
+ case TRIGGER_NETDEV_LINK_40000:
+ case TRIGGER_NETDEV_LINK_50000:
+ case TRIGGER_NETDEV_LINK_100000:
case TRIGGER_NETDEV_HALF_DUPLEX:
case TRIGGER_NETDEV_FULL_DUPLEX:
case TRIGGER_NETDEV_TX:
@@ -373,6 +393,10 @@ static ssize_t netdev_led_attr_store(struct device *dev, const char *buf,
case TRIGGER_NETDEV_LINK_2500:
case TRIGGER_NETDEV_LINK_5000:
case TRIGGER_NETDEV_LINK_10000:
+ case TRIGGER_NETDEV_LINK_25000:
+ case TRIGGER_NETDEV_LINK_40000:
+ case TRIGGER_NETDEV_LINK_50000:
+ case TRIGGER_NETDEV_LINK_100000:
case TRIGGER_NETDEV_HALF_DUPLEX:
case TRIGGER_NETDEV_FULL_DUPLEX:
case TRIGGER_NETDEV_TX:
@@ -396,7 +420,11 @@ static ssize_t netdev_led_attr_store(struct device *dev, const char *buf,
test_bit(TRIGGER_NETDEV_LINK_1000, &mode) ||
test_bit(TRIGGER_NETDEV_LINK_2500, &mode) ||
test_bit(TRIGGER_NETDEV_LINK_5000, &mode) ||
- test_bit(TRIGGER_NETDEV_LINK_10000, &mode)))
+ test_bit(TRIGGER_NETDEV_LINK_10000, &mode) ||
+ test_bit(TRIGGER_NETDEV_LINK_25000, &mode) ||
+ test_bit(TRIGGER_NETDEV_LINK_40000, &mode) ||
+ test_bit(TRIGGER_NETDEV_LINK_50000, &mode) ||
+ test_bit(TRIGGER_NETDEV_LINK_100000, &mode)))
return -EINVAL;

cancel_delayed_work_sync(&trigger_data->work);
@@ -433,6 +461,10 @@ DEFINE_NETDEV_TRIGGER(link_1000, TRIGGER_NETDEV_LINK_1000);
DEFINE_NETDEV_TRIGGER(link_2500, TRIGGER_NETDEV_LINK_2500);
DEFINE_NETDEV_TRIGGER(link_5000, TRIGGER_NETDEV_LINK_5000);
DEFINE_NETDEV_TRIGGER(link_10000, TRIGGER_NETDEV_LINK_10000);
+DEFINE_NETDEV_TRIGGER(link_25000, TRIGGER_NETDEV_LINK_25000);
+DEFINE_NETDEV_TRIGGER(link_40000, TRIGGER_NETDEV_LINK_40000);
+DEFINE_NETDEV_TRIGGER(link_50000, TRIGGER_NETDEV_LINK_50000);
+DEFINE_NETDEV_TRIGGER(link_100000, TRIGGER_NETDEV_LINK_100000);
DEFINE_NETDEV_TRIGGER(half_duplex, TRIGGER_NETDEV_HALF_DUPLEX);
DEFINE_NETDEV_TRIGGER(full_duplex, TRIGGER_NETDEV_FULL_DUPLEX);
DEFINE_NETDEV_TRIGGER(tx, TRIGGER_NETDEV_TX);
@@ -521,6 +553,10 @@ static umode_t netdev_trig_link_speed_visible(struct kobject *kobj,
CHECK_LINK_MODE_ATTR(2500);
CHECK_LINK_MODE_ATTR(5000);
CHECK_LINK_MODE_ATTR(10000);
+ CHECK_LINK_MODE_ATTR(25000);
+ CHECK_LINK_MODE_ATTR(40000);
+ CHECK_LINK_MODE_ATTR(50000);
+ CHECK_LINK_MODE_ATTR(100000);
}

return 0;
@@ -533,6 +569,10 @@ static struct attribute *netdev_trig_link_speed_attrs[] = {
&dev_attr_link_2500.attr,
&dev_attr_link_5000.attr,
&dev_attr_link_10000.attr,
+ &dev_attr_link_25000.attr,
+ &dev_attr_link_40000.attr,
+ &dev_attr_link_50000.attr,
+ &dev_attr_link_100000.attr,
NULL
};

@@ -668,6 +708,10 @@ static void netdev_trig_work(struct work_struct *work)
test_bit(TRIGGER_NETDEV_LINK_2500, &trigger_data->mode) ||
test_bit(TRIGGER_NETDEV_LINK_5000, &trigger_data->mode) ||
test_bit(TRIGGER_NETDEV_LINK_10000, &trigger_data->mode) ||
+ test_bit(TRIGGER_NETDEV_LINK_25000, &trigger_data->mode) ||
+ test_bit(TRIGGER_NETDEV_LINK_40000, &trigger_data->mode) ||
+ test_bit(TRIGGER_NETDEV_LINK_50000, &trigger_data->mode) ||
+ test_bit(TRIGGER_NETDEV_LINK_100000, &trigger_data->mode) ||
test_bit(TRIGGER_NETDEV_HALF_DUPLEX, &trigger_data->mode) ||
test_bit(TRIGGER_NETDEV_FULL_DUPLEX, &trigger_data->mode);
interval = jiffies_to_msecs(
diff --git a/include/linux/leds.h b/include/linux/leds.h
index b16b803cc1ac..bf31c246d9e2 100644
--- a/include/linux/leds.h
+++ b/include/linux/leds.h
@@ -607,6 +607,10 @@ enum led_trigger_netdev_modes {
TRIGGER_NETDEV_LINK_2500,
TRIGGER_NETDEV_LINK_5000,
TRIGGER_NETDEV_LINK_10000,
+ TRIGGER_NETDEV_LINK_25000,
+ TRIGGER_NETDEV_LINK_40000,
+ TRIGGER_NETDEV_LINK_50000,
+ TRIGGER_NETDEV_LINK_100000,
TRIGGER_NETDEV_HALF_DUPLEX,
TRIGGER_NETDEV_FULL_DUPLEX,
TRIGGER_NETDEV_TX,
--
2.43.0