Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Lukasz Majewski and committed by
Lee Jones
6b08d07c b5a7fc28

+23 -3
+21 -3
drivers/leds/trigger/ledtrig-netdev.c
··· 39 39 * (has carrier) or not 40 40 * tx - LED blinks on transmitted data 41 41 * rx - LED blinks on receive data 42 + * tx_err - LED blinks on transmit error 43 + * rx_err - LED blinks on receive error 42 44 * 43 45 * Note: If the user selects a mode that is not supported by hw, default 44 46 * behavior is to fall back to software control of the LED. However not every ··· 146 144 * checking stats 147 145 */ 148 146 if (test_bit(TRIGGER_NETDEV_TX, &trigger_data->mode) || 149 - test_bit(TRIGGER_NETDEV_RX, &trigger_data->mode)) 147 + test_bit(TRIGGER_NETDEV_RX, &trigger_data->mode) || 148 + test_bit(TRIGGER_NETDEV_TX_ERR, &trigger_data->mode) || 149 + test_bit(TRIGGER_NETDEV_RX_ERR, &trigger_data->mode)) 150 150 schedule_delayed_work(&trigger_data->work, 0); 151 151 } 152 152 } ··· 341 337 case TRIGGER_NETDEV_FULL_DUPLEX: 342 338 case TRIGGER_NETDEV_TX: 343 339 case TRIGGER_NETDEV_RX: 340 + case TRIGGER_NETDEV_TX_ERR: 341 + case TRIGGER_NETDEV_RX_ERR: 344 342 bit = attr; 345 343 break; 346 344 default: ··· 377 371 case TRIGGER_NETDEV_FULL_DUPLEX: 378 372 case TRIGGER_NETDEV_TX: 379 373 case TRIGGER_NETDEV_RX: 374 + case TRIGGER_NETDEV_TX_ERR: 375 + case TRIGGER_NETDEV_RX_ERR: 380 376 bit = attr; 381 377 break; 382 378 default: ··· 437 429 DEFINE_NETDEV_TRIGGER(full_duplex, TRIGGER_NETDEV_FULL_DUPLEX); 438 430 DEFINE_NETDEV_TRIGGER(tx, TRIGGER_NETDEV_TX); 439 431 DEFINE_NETDEV_TRIGGER(rx, TRIGGER_NETDEV_RX); 432 + DEFINE_NETDEV_TRIGGER(tx_err, TRIGGER_NETDEV_TX_ERR); 433 + DEFINE_NETDEV_TRIGGER(rx_err, TRIGGER_NETDEV_RX_ERR); 440 434 441 435 static ssize_t interval_show(struct device *dev, 442 436 struct device_attribute *attr, char *buf) ··· 548 538 &dev_attr_half_duplex.attr, 549 539 &dev_attr_rx.attr, 550 540 &dev_attr_tx.attr, 541 + &dev_attr_rx_err.attr, 542 + &dev_attr_tx_err.attr, 551 543 &dev_attr_interval.attr, 552 544 &dev_attr_offloaded.attr, 553 545 NULL ··· 640 628 641 629 /* If we are not looking for RX/TX then return */ 642 630 if (!test_bit(TRIGGER_NETDEV_TX, &trigger_data->mode) && 643 - !test_bit(TRIGGER_NETDEV_RX, &trigger_data->mode)) 631 + !test_bit(TRIGGER_NETDEV_RX, &trigger_data->mode) && 632 + !test_bit(TRIGGER_NETDEV_TX_ERR, &trigger_data->mode) && 633 + !test_bit(TRIGGER_NETDEV_RX_ERR, &trigger_data->mode)) 644 634 return; 645 635 646 636 dev_stats = dev_get_stats(trigger_data->net_dev, &temp); ··· 650 636 (test_bit(TRIGGER_NETDEV_TX, &trigger_data->mode) ? 651 637 dev_stats->tx_packets : 0) + 652 638 (test_bit(TRIGGER_NETDEV_RX, &trigger_data->mode) ? 653 - dev_stats->rx_packets : 0); 639 + dev_stats->rx_packets : 0) + 640 + (test_bit(TRIGGER_NETDEV_TX_ERR, &trigger_data->mode) ? 641 + dev_stats->tx_errors : 0) + 642 + (test_bit(TRIGGER_NETDEV_RX_ERR, &trigger_data->mode) ? 643 + dev_stats->rx_errors : 0); 654 644 655 645 if (trigger_data->last_activity != new_activity) { 656 646 led_stop_software_blink(trigger_data->led_cdev);
+2
include/linux/leds.h
··· 611 611 TRIGGER_NETDEV_FULL_DUPLEX, 612 612 TRIGGER_NETDEV_TX, 613 613 TRIGGER_NETDEV_RX, 614 + TRIGGER_NETDEV_TX_ERR, 615 + TRIGGER_NETDEV_RX_ERR, 614 616 615 617 /* Keep last */ 616 618 __TRIGGER_NETDEV_MAX,