|
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 |
@@ -144,7 +146,9 @@ static void set_baseline_state(struct led_netdev_data *trigger_data) |
144 | 146 | * checking stats |
145 | 147 | */ |
146 | 148 | 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)) |
148 | 152 | schedule_delayed_work(&trigger_data->work, 0); |
149 | 153 | } |
150 | 154 | } |
@@ -337,6 +341,8 @@ static ssize_t netdev_led_attr_show(struct device *dev, char *buf, |
337 | 341 | case TRIGGER_NETDEV_FULL_DUPLEX: |
338 | 342 | case TRIGGER_NETDEV_TX: |
339 | 343 | case TRIGGER_NETDEV_RX: |
| 344 | + case TRIGGER_NETDEV_TX_ERR: |
| 345 | + case TRIGGER_NETDEV_RX_ERR: |
340 | 346 | bit = attr; |
341 | 347 | break; |
342 | 348 | default: |
@@ -371,6 +377,8 @@ static ssize_t netdev_led_attr_store(struct device *dev, const char *buf, |
371 | 377 | case TRIGGER_NETDEV_FULL_DUPLEX: |
372 | 378 | case TRIGGER_NETDEV_TX: |
373 | 379 | case TRIGGER_NETDEV_RX: |
| 380 | + case TRIGGER_NETDEV_TX_ERR: |
| 381 | + case TRIGGER_NETDEV_RX_ERR: |
374 | 382 | bit = attr; |
375 | 383 | break; |
376 | 384 | default: |
@@ -429,6 +437,8 @@ DEFINE_NETDEV_TRIGGER(half_duplex, TRIGGER_NETDEV_HALF_DUPLEX); |
429 | 437 | DEFINE_NETDEV_TRIGGER(full_duplex, TRIGGER_NETDEV_FULL_DUPLEX); |
430 | 438 | DEFINE_NETDEV_TRIGGER(tx, TRIGGER_NETDEV_TX); |
431 | 439 | 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); |
432 | 442 |
|
433 | 443 | static ssize_t interval_show(struct device *dev, |
434 | 444 | struct device_attribute *attr, char *buf) |
@@ -538,6 +548,8 @@ static struct attribute *netdev_trig_attrs[] = { |
538 | 548 | &dev_attr_half_duplex.attr, |
539 | 549 | &dev_attr_rx.attr, |
540 | 550 | &dev_attr_tx.attr, |
| 551 | + &dev_attr_rx_err.attr, |
| 552 | + &dev_attr_tx_err.attr, |
541 | 553 | &dev_attr_interval.attr, |
542 | 554 | &dev_attr_offloaded.attr, |
543 | 555 | NULL |
@@ -628,15 +640,21 @@ static void netdev_trig_work(struct work_struct *work) |
628 | 640 |
|
629 | 641 | /* If we are not looking for RX/TX then return */ |
630 | 642 | 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)) |
632 | 646 | return; |
633 | 647 |
|
634 | 648 | dev_stats = dev_get_stats(trigger_data->net_dev, &temp); |
635 | 649 | new_activity = |
636 | 650 | (test_bit(TRIGGER_NETDEV_TX, &trigger_data->mode) ? |
637 | 651 | dev_stats->tx_packets : 0) + |
638 | 652 | (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); |
640 | 658 |
|
641 | 659 | if (trigger_data->last_activity != new_activity) { |
642 | 660 | led_stop_software_blink(trigger_data->led_cdev); |
|
0 commit comments