From c042e9dadc4a5c6740b3ba0bc1b0b9ea1804122f Mon Sep 17 00:00:00 2001 From: Kurt Van Dijck Date: Tue, 18 Dec 2012 18:50:57 +0100 Subject: [PATCH] --- yaml --- r: 351685 b: refs/heads/master c: a1ef7bd9fce8aba8e4701e60208148fb3bc9bdd4 h: refs/heads/master i: 351683: 8e6b3cddb84a046ef8df08494798e290052bfc26 v: v3 --- [refs] | 2 +- trunk/drivers/net/can/dev.c | 5 +++++ trunk/drivers/net/can/led.c | 38 +++++++++++++++++++++++++++++++++++ trunk/include/linux/can/led.h | 9 +++++++++ 4 files changed, 53 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 0d046671b7dd..58be80df73f3 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: bf03a5379cd3492fbeca42111340581ba9dee0b8 +refs/heads/master: a1ef7bd9fce8aba8e4701e60208148fb3bc9bdd4 diff --git a/trunk/drivers/net/can/dev.c b/trunk/drivers/net/can/dev.c index 13e738098fbe..6abc6e59778e 100644 --- a/trunk/drivers/net/can/dev.c +++ b/trunk/drivers/net/can/dev.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #define MOD_DESC "CAN device driver interface" @@ -811,6 +812,8 @@ static __init int can_dev_init(void) { int err; + can_led_notifier_init(); + err = rtnl_link_register(&can_link_ops); if (!err) printk(KERN_INFO MOD_DESC "\n"); @@ -822,6 +825,8 @@ module_init(can_dev_init); static __exit void can_dev_exit(void) { rtnl_link_unregister(&can_link_ops); + + can_led_notifier_exit(); } module_exit(can_dev_exit); diff --git a/trunk/drivers/net/can/led.c b/trunk/drivers/net/can/led.c index c50a0d741c57..f27fca65dc4a 100644 --- a/trunk/drivers/net/can/led.c +++ b/trunk/drivers/net/can/led.c @@ -1,5 +1,6 @@ /* * Copyright 2012, Fabio Baltieri + * Copyright 2012, Kurt Van Dijck * * 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 @@ -84,3 +85,40 @@ void devm_can_led_init(struct net_device *netdev) devres_add(&netdev->dev, res); } EXPORT_SYMBOL_GPL(devm_can_led_init); + +/* NETDEV rename notifier to rename the associated led triggers too */ +static int can_led_notifier(struct notifier_block *nb, unsigned long msg, + void *data) +{ + struct net_device *netdev = data; + struct can_priv *priv = safe_candev_priv(netdev); + char name[CAN_LED_NAME_SZ]; + + if (!priv) + return NOTIFY_DONE; + + if (msg == NETDEV_CHANGENAME) { + snprintf(name, sizeof(name), "%s-tx", netdev->name); + led_trigger_rename_static(name, priv->tx_led_trig); + + snprintf(name, sizeof(name), "%s-rx", netdev->name); + led_trigger_rename_static(name, priv->rx_led_trig); + } + + return NOTIFY_DONE; +} + +/* notifier block for netdevice event */ +static struct notifier_block can_netdev_notifier __read_mostly = { + .notifier_call = can_led_notifier, +}; + +int __init can_led_notifier_init(void) +{ + return register_netdevice_notifier(&can_netdev_notifier); +} + +void __exit can_led_notifier_exit(void) +{ + unregister_netdevice_notifier(&can_netdev_notifier); +} diff --git a/trunk/include/linux/can/led.h b/trunk/include/linux/can/led.h index 12d5549abb95..9c1167baf273 100644 --- a/trunk/include/linux/can/led.h +++ b/trunk/include/linux/can/led.h @@ -26,6 +26,8 @@ enum can_led_event { void can_led_event(struct net_device *netdev, enum can_led_event event); void devm_can_led_init(struct net_device *netdev); +int __init can_led_notifier_init(void); +void __exit can_led_notifier_exit(void); #else @@ -36,6 +38,13 @@ static inline void can_led_event(struct net_device *netdev, static inline void devm_can_led_init(struct net_device *netdev) { } +static inline int can_led_notifier_init(void) +{ + return 0; +} +static inline void can_led_notifier_exit(void) +{ +} #endif