Skip to content

Commit 6b08d07

Browse files
Lukasz Majewskilag-linaro
authored andcommitted
leds: trigger: netdev: Add support for tx_err and rx_err notification with LEDs
This patch provides support for enabling blinking of LEDs when RX or TX errors are detected. Approach taken in this patch is similar to one for TX or RX data transmission indication (i.e. TRIGGER_NETDEV_TX/RX attribute). One can inspect transmission errors with: ip -s link show eth0 Example LED configuration: cd /sys/devices/platform/amba_pl@0/a001a000.leds/leds/ echo netdev > mode:blue/trigger && \ echo eth0 > mode:blue/device_name && \ echo 1 > mode:blue/tx_err Signed-off-by: Lukasz Majewski <lukma@denx.de> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Link: https://lore.kernel.org/r/20240710100651.4059887-1-lukma@denx.de Signed-off-by: Lee Jones <lee@kernel.org>
1 parent b5a7fc2 commit 6b08d07

2 files changed

Lines changed: 23 additions & 3 deletions

File tree

drivers/leds/trigger/ledtrig-netdev.c

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
* (has carrier) or not
4040
* tx - LED blinks on transmitted data
4141
* rx - LED blinks on receive data
42+
* tx_err - LED blinks on transmit error
43+
* rx_err - LED blinks on receive error
4244
*
4345
* Note: If the user selects a mode that is not supported by hw, default
4446
* behavior is to fall back to software control of the LED. However not every
@@ -144,7 +146,9 @@ static void set_baseline_state(struct led_netdev_data *trigger_data)
144146
* checking stats
145147
*/
146148
if (test_bit(TRIGGER_NETDEV_TX, &trigger_data->mode) ||
147-
test_bit(TRIGGER_NETDEV_RX, &trigger_data->mode))
149+
test_bit(TRIGGER_NETDEV_RX, &trigger_data->mode) ||
150+
test_bit(TRIGGER_NETDEV_TX_ERR, &trigger_data->mode) ||
151+
test_bit(TRIGGER_NETDEV_RX_ERR, &trigger_data->mode))
148152
schedule_delayed_work(&trigger_data->work, 0);
149153
}
150154
}
@@ -337,6 +341,8 @@ static ssize_t netdev_led_attr_show(struct device *dev, char *buf,
337341
case TRIGGER_NETDEV_FULL_DUPLEX:
338342
case TRIGGER_NETDEV_TX:
339343
case TRIGGER_NETDEV_RX:
344+
case TRIGGER_NETDEV_TX_ERR:
345+
case TRIGGER_NETDEV_RX_ERR:
340346
bit = attr;
341347
break;
342348
default:
@@ -371,6 +377,8 @@ static ssize_t netdev_led_attr_store(struct device *dev, const char *buf,
371377
case TRIGGER_NETDEV_FULL_DUPLEX:
372378
case TRIGGER_NETDEV_TX:
373379
case TRIGGER_NETDEV_RX:
380+
case TRIGGER_NETDEV_TX_ERR:
381+
case TRIGGER_NETDEV_RX_ERR:
374382
bit = attr;
375383
break;
376384
default:
@@ -429,6 +437,8 @@ DEFINE_NETDEV_TRIGGER(half_duplex, TRIGGER_NETDEV_HALF_DUPLEX);
429437
DEFINE_NETDEV_TRIGGER(full_duplex, TRIGGER_NETDEV_FULL_DUPLEX);
430438
DEFINE_NETDEV_TRIGGER(tx, TRIGGER_NETDEV_TX);
431439
DEFINE_NETDEV_TRIGGER(rx, TRIGGER_NETDEV_RX);
440+
DEFINE_NETDEV_TRIGGER(tx_err, TRIGGER_NETDEV_TX_ERR);
441+
DEFINE_NETDEV_TRIGGER(rx_err, TRIGGER_NETDEV_RX_ERR);
432442

433443
static ssize_t interval_show(struct device *dev,
434444
struct device_attribute *attr, char *buf)
@@ -538,6 +548,8 @@ static struct attribute *netdev_trig_attrs[] = {
538548
&dev_attr_half_duplex.attr,
539549
&dev_attr_rx.attr,
540550
&dev_attr_tx.attr,
551+
&dev_attr_rx_err.attr,
552+
&dev_attr_tx_err.attr,
541553
&dev_attr_interval.attr,
542554
&dev_attr_offloaded.attr,
543555
NULL
@@ -628,15 +640,21 @@ static void netdev_trig_work(struct work_struct *work)
628640

629641
/* If we are not looking for RX/TX then return */
630642
if (!test_bit(TRIGGER_NETDEV_TX, &trigger_data->mode) &&
631-
!test_bit(TRIGGER_NETDEV_RX, &trigger_data->mode))
643+
!test_bit(TRIGGER_NETDEV_RX, &trigger_data->mode) &&
644+
!test_bit(TRIGGER_NETDEV_TX_ERR, &trigger_data->mode) &&
645+
!test_bit(TRIGGER_NETDEV_RX_ERR, &trigger_data->mode))
632646
return;
633647

634648
dev_stats = dev_get_stats(trigger_data->net_dev, &temp);
635649
new_activity =
636650
(test_bit(TRIGGER_NETDEV_TX, &trigger_data->mode) ?
637651
dev_stats->tx_packets : 0) +
638652
(test_bit(TRIGGER_NETDEV_RX, &trigger_data->mode) ?
639-
dev_stats->rx_packets : 0);
653+
dev_stats->rx_packets : 0) +
654+
(test_bit(TRIGGER_NETDEV_TX_ERR, &trigger_data->mode) ?
655+
dev_stats->tx_errors : 0) +
656+
(test_bit(TRIGGER_NETDEV_RX_ERR, &trigger_data->mode) ?
657+
dev_stats->rx_errors : 0);
640658

641659
if (trigger_data->last_activity != new_activity) {
642660
led_stop_software_blink(trigger_data->led_cdev);

include/linux/leds.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -611,6 +611,8 @@ enum led_trigger_netdev_modes {
611611
TRIGGER_NETDEV_FULL_DUPLEX,
612612
TRIGGER_NETDEV_TX,
613613
TRIGGER_NETDEV_RX,
614+
TRIGGER_NETDEV_TX_ERR,
615+
TRIGGER_NETDEV_RX_ERR,
614616

615617
/* Keep last */
616618
__TRIGGER_NETDEV_MAX,

0 commit comments

Comments
 (0)