diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig index 80acd08..25d2b58 100644 --- a/drivers/leds/Kconfig +++ b/drivers/leds/Kconfig @@ -127,5 +127,12 @@ config LEDS_TRIGGER_HEARTBEAT load average. If unsure, say Y. +config LEDS_TRIGGER_NETWORK_ACT + tristate "LED Network Activity Trigger" + depends on LEDS_TRIGGER && NET + help + This allow LEDs to be controlled by network activity at layer-3 networking. + If unsure, say Y. + endmenu diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile index aa2c18e..bc899d3 100644 --- a/drivers/leds/Makefile +++ b/drivers/leds/Makefile @@ -21,3 +21,4 @@ obj-$(CONFIG_LEDS_COBALT) += leds-cobalt.o obj-$(CONFIG_LEDS_TRIGGER_TIMER) += ledtrig-timer.o obj-$(CONFIG_LEDS_TRIGGER_IDE_DISK) += ledtrig-ide-disk.o obj-$(CONFIG_LEDS_TRIGGER_HEARTBEAT) += ledtrig-heartbeat.o +obj-$(CONFIG_LEDS_TRIGGER_NETWORK_ACT) += ledtrig-network-activity.o diff --git a/drivers/leds/ledtrig-network-activity.c b/drivers/leds/ledtrig-network-activity.c new file mode 100644 index 0000000..88d17bb --- /dev/null +++ b/drivers/leds/ledtrig-network-activity.c @@ -0,0 +1,61 @@ +/* + * LED Network Activity Trigger + * based on ledtrig-ide-disk by Richard Purdie + * + * Copyright 2007 Florian Fainelli + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#include +#include +#include +#include +#include +#include + +static void ledtrig_network_timerfunc(unsigned long data); + +DEFINE_LED_TRIGGER(ledtrig_network); +static DEFINE_TIMER(ledtrig_network_timer, ledtrig_network_timerfunc, 0, 0); +static int network_activity, network_lastactivity; + +void ledtrig_network_activity(void) +{ + network_activity++; + if (!timer_pending(&ledtrig_network_timer)) + mod_timer(&ledtrig_network_timer, jiffies + msecs_to_jiffies(10)); +} +EXPORT_SYMBOL(ledtrig_network_activity); + +static void ledtrig_network_timerfunc(unsigned long data) +{ + if (network_lastactivity != network_activity) { + network_lastactivity = network_activity; + led_trigger_event(ledtrig_network, LED_FULL); + mod_timer(&ledtrig_network_timer, jiffies + msecs_to_jiffies(10)); + } else { + led_trigger_event(ledtrig_network, LED_OFF); + } +} + +static int __init ledtrig_network_init(void) +{ + led_trigger_register_simple("network-activity", &ledtrig_network); + return 0; +} + +static void __exit ledtrig_network_exit(void) +{ + led_trigger_unregister_simple(ledtrig_network); +} + +module_init(ledtrig_network_init); +module_exit(ledtrig_network_exit); + +MODULE_AUTHOR("Florian Fainelli "); +MODULE_DESCRIPTION("LED Network Activity trigger"); +MODULE_LICENSE("GPL"); diff --git a/include/linux/leds.h b/include/linux/leds.h index 88afcef..ed3774e 100644 --- a/include/linux/leds.h +++ b/include/linux/leds.h @@ -110,4 +110,10 @@ extern void ledtrig_ide_activity(void); #define ledtrig_ide_activity() do {} while(0) #endif +#ifdef CONFIG_LEDS_TRIGGER_NETWORK_ACT +extern void ledtrig_network_activity(void); +#else +#define ledtrig_network_activity() do {} while(0) +#endif + #endif /* __LINUX_LEDS_H_INCLUDED */ diff --git a/net/core/dev.c b/net/core/dev.c index 4317c1b..9423b26 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -116,6 +116,7 @@ #include #include #include +#include /* * The list of packet types we will receive (as opposed to discard) @@ -1451,6 +1452,8 @@ int dev_queue_xmit(struct sk_buff *skb) gso: spin_lock_prefetch(&dev->queue_lock); + ledtrig_network_activity(); + /* Disable soft irqs for various locks below. Also * stops preemption for RCU. */