Hi, On Sat, Dec 18, 2010 at 4:15 PM, Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> wrote: > This patch allows to associate LEDs with certain triggers, such > as heartbeat or network activity. > > Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> > --- > Âdrivers/led/Kconfig Â|  Â3 +++ > Âdrivers/led/Makefile |  Â1 + > Âinclude/led.h    Â|  26 ++++++++++++++++++++++++++ > Âinclude/net.h    Â|  Â3 +++ > Âlib/vsprintf.c    |  Â4 ++++ > Ânet/eth.c      Â|  20 +++++++++++++++++++- > Ânet/net.c      Â|  21 ++++++++++++++++----- > Â7 files changed, 72 insertions(+), 6 deletions(-) > > diff --git a/drivers/led/Kconfig b/drivers/led/Kconfig > index b5e2f97..d8540c5 100644 > --- a/drivers/led/Kconfig > +++ b/drivers/led/Kconfig > @@ -7,4 +7,7 @@ config LED_GPIO >    Âbool "gpio LED support" >    Âdepends on GENERIC_GPIO > > +config LED_TRIGGERS > +    bool "LED triggers support" > + > Âendif > diff --git a/drivers/led/Makefile b/drivers/led/Makefile > index 29b9fd5..6aafa6d 100644 > --- a/drivers/led/Makefile > +++ b/drivers/led/Makefile > @@ -1,2 +1,3 @@ > Âobj-$(CONFIG_LED) += core.o > Âobj-$(CONFIG_LED_GPIO) += led-gpio.o > +obj-$(CONFIG_LED_TRIGGERS) += led-triggers.o > diff --git a/include/led.h b/include/led.h > index 98b8c2e..2dc0f9d 100644 > --- a/include/led.h > +++ b/include/led.h > @@ -22,6 +22,32 @@ int led_register(struct led *led); > Âvoid led_unregister(struct led *led); > Âvoid led_unregister(struct led *led); > > +/* LED trigger support */ > +enum led_trigger { > +    led_trigger_panic, > +    led_trigger_heartbeat, > +    led_trigger_net_rx, > +    led_trigger_net_tx, > +    led_trigger_net_txrx, > +    led_trigger_max, > +}; shouldn't be enums uppercase? > + > +#ifdef CONFIG_LED_TRIGGERS > +int led_set_trigger(enum led_trigger trigger, struct led *led); > +void led_trigger(enum led_trigger trigger, bool enable); > +#else > +static inline int led_set_trigger(enum led_trigger trigger, struct led *led) > +{ > +    return 0; > +} > + > +static inline void led_trigger(enum led_trigger trigger, bool enable) > +{ > +} > +#endif > + > +int led_get_trigger(enum led_trigger trigger); > + > Â/* gpio LED support */ > Âstruct gpio_led { >    Âint gpio; > diff --git a/include/net.h b/include/net.h > index c695e5f..71c314e 100644 > --- a/include/net.h > +++ b/include/net.h > @@ -18,6 +18,7 @@ > Â#include <malloc.h> > Â#include <stdlib.h> > Â#include <clock.h> > +#include <led.h> > Â#include <asm/byteorder.h>   /* for nton* / ntoh* stuff */ > > > @@ -417,4 +418,6 @@ static inline unsigned char *net_udp_get_payload(struct net_connection *con) > Âint net_udp_send(struct net_connection *con, int len); > Âint net_icmp_send(struct net_connection *con, int len); > > +void led_trigger_network(enum led_trigger trigger, int active); > + > Â#endif /* __NET_H__ */ > diff --git a/lib/vsprintf.c b/lib/vsprintf.c > index e2ea84d..6117337 100644 > --- a/lib/vsprintf.c > +++ b/lib/vsprintf.c > @@ -17,6 +17,7 @@ > Â#include <malloc.h> > > Â#include <common.h> > +#include <led.h> > Â#include <reloc.h> > > Âunsigned long simple_strtoul(const char *cp,char **endp,unsigned int base) > @@ -625,6 +626,9 @@ void __noreturn panic(const char *fmt, ...) >    Âvprintf(fmt, args); >    Âputchar('\n'); >    Âva_end(args); > + > +    led_trigger(led_trigger_panic, 1); > + > Â#if defined (CONFIG_PANIC_HANG) >    Âhang(); > Â#else > diff --git a/net/eth.c b/net/eth.c > index a82a263..6ac4f09 100644 > --- a/net/eth.c > +++ b/net/eth.c > @@ -77,7 +77,13 @@ int eth_send(void *packet, int length) >        Âeth_current->active = 1; >    Â} > > -    return eth_current->send(eth_current, packet, length); > +    led_trigger_network(led_trigger_net_tx, 1); > + > +    ret = eth_current->send(eth_current, packet, length); > + > +    led_trigger_network(led_trigger_net_tx, 0); > + > +    return ret; > Â} > > Âint eth_rx(void) > @@ -183,4 +189,16 @@ void eth_unregister(struct eth_device *edev) >    Âlist_del(&edev->list); > Â} > > +void led_trigger_network(enum led_trigger trigger, int enable) > +{ > +    static bool rx_active, tx_active; > > +    led_trigger(trigger, enable); > + > +    if (trigger == led_trigger_net_tx) > +        tx_active = enable; > +    if (trigger == led_trigger_net_rx) > +        rx_active = enable; > + > +    led_trigger(led_trigger_net_txrx, tx_active || rx_active); > +} > diff --git a/net/net.c b/net/net.c > index a613d1d..afd5964 100644 > --- a/net/net.c > +++ b/net/net.c > @@ -628,19 +628,30 @@ int net_receive(unsigned char *pkt, int len) > Â{ >    Âstruct ethernet *et = (struct ethernet *)pkt; >    Âint et_protlen = ntohs(et->et_protlen); > +    int ret; > > -    if (len < ETHER_HDR_SIZE) > -        return 0; > +    led_trigger_network(led_trigger_net_rx, 1); > + > +    if (len < ETHER_HDR_SIZE) { > +        ret = 0; > +        goto out; > +    } > >    Âswitch (et_protlen) { >    Âcase PROT_ARP: > -        return net_handle_arp(pkt, len); > +        ret = net_handle_arp(pkt, len); > +        break; >    Âcase PROT_IP: > -        return net_handle_ip(pkt, len); > +        ret = net_handle_ip(pkt, len); > +        break; >    Âdefault: >        Âdebug("%s: got unknown protocol type: %d\n", __func__, et_protlen); > -        return 1; > +        ret = 1; > +        break; >    Â} > +out: > +    led_trigger_network(led_trigger_net_rx, 0); > +    return ret; > Â} > > Âstatic int net_init(void) > -- > 1.7.2.3 > > > _______________________________________________ > barebox mailing list > barebox@xxxxxxxxxxxxxxxxxxx > http://lists.infradead.org/mailman/listinfo/barebox > thanks, marek -- as simple and primitive as possible ------------------------------------------------- Marek Belisko - OPEN-NANDRA Freelance Developer Ruska Nova Ves 219 | Presov, 08005 Slovak Republic Tel: +421 915 052 184 skype: marekwhite icq: 290551086 web: http://open-nandra.com _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox