can: add combined rx/tx LED trigger support
authorYegor Yefremov <yegorslists@googlemail.com>
Mon, 16 Mar 2015 08:38:13 +0000 (09:38 +0100)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Sun, 22 Mar 2015 22:50:11 +0000 (23:50 +0100)
Add <ifname>-rxtx trigger, that will be activated both for tx
as rx events. This trigger mimics "activity" LED for Ethernet
devices.

Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/led.c
include/linux/can/dev.h
include/linux/can/led.h

index ab7f1b01be499a50266d5998c404f15b06cbdad6..c1b667675fa1becc2e9e190c6423eb7f3c10b181 100644 (file)
@@ -30,20 +30,28 @@ void can_led_event(struct net_device *netdev, enum can_led_event event)
        case CAN_LED_EVENT_OPEN:
                led_trigger_event(priv->tx_led_trig, LED_FULL);
                led_trigger_event(priv->rx_led_trig, LED_FULL);
+               led_trigger_event(priv->rxtx_led_trig, LED_FULL);
                break;
        case CAN_LED_EVENT_STOP:
                led_trigger_event(priv->tx_led_trig, LED_OFF);
                led_trigger_event(priv->rx_led_trig, LED_OFF);
+               led_trigger_event(priv->rxtx_led_trig, LED_OFF);
                break;
        case CAN_LED_EVENT_TX:
-               if (led_delay)
+               if (led_delay) {
                        led_trigger_blink_oneshot(priv->tx_led_trig,
                                                  &led_delay, &led_delay, 1);
+                       led_trigger_blink_oneshot(priv->rxtx_led_trig,
+                                                 &led_delay, &led_delay, 1);
+               }
                break;
        case CAN_LED_EVENT_RX:
-               if (led_delay)
+               if (led_delay) {
                        led_trigger_blink_oneshot(priv->rx_led_trig,
                                                  &led_delay, &led_delay, 1);
+                       led_trigger_blink_oneshot(priv->rxtx_led_trig,
+                                                 &led_delay, &led_delay, 1);
+               }
                break;
        }
 }
@@ -55,6 +63,7 @@ static void can_led_release(struct device *gendev, void *res)
 
        led_trigger_unregister_simple(priv->tx_led_trig);
        led_trigger_unregister_simple(priv->rx_led_trig);
+       led_trigger_unregister_simple(priv->rxtx_led_trig);
 }
 
 /* Register CAN LED triggers for a CAN device
@@ -76,11 +85,15 @@ void devm_can_led_init(struct net_device *netdev)
                 "%s-tx", netdev->name);
        snprintf(priv->rx_led_trig_name, sizeof(priv->rx_led_trig_name),
                 "%s-rx", netdev->name);
+       snprintf(priv->rxtx_led_trig_name, sizeof(priv->rxtx_led_trig_name),
+                "%s-rxtx", netdev->name);
 
        led_trigger_register_simple(priv->tx_led_trig_name,
                                    &priv->tx_led_trig);
        led_trigger_register_simple(priv->rx_led_trig_name,
                                    &priv->rx_led_trig);
+       led_trigger_register_simple(priv->rxtx_led_trig_name,
+                                   &priv->rxtx_led_trig);
 
        devres_add(&netdev->dev, res);
 }
@@ -97,7 +110,7 @@ static int can_led_notifier(struct notifier_block *nb, unsigned long msg,
        if (!priv)
                return NOTIFY_DONE;
 
-       if (!priv->tx_led_trig || !priv->rx_led_trig)
+       if (!priv->tx_led_trig || !priv->rx_led_trig || !priv->rxtx_led_trig)
                return NOTIFY_DONE;
 
        if (msg == NETDEV_CHANGENAME) {
@@ -106,6 +119,9 @@ static int can_led_notifier(struct notifier_block *nb, unsigned long msg,
 
                snprintf(name, sizeof(name), "%s-rx", netdev->name);
                led_trigger_rename_static(name, priv->rx_led_trig);
+
+               snprintf(name, sizeof(name), "%s-rxtx", netdev->name);
+               led_trigger_rename_static(name, priv->rxtx_led_trig);
        }
 
        return NOTIFY_DONE;
index c05ff0f9f9a55afec230435183dcce0d93bd5725..c3a9c8fc60fa620395751b994e117dc1ac9f0712 100644 (file)
@@ -61,6 +61,8 @@ struct can_priv {
        char tx_led_trig_name[CAN_LED_NAME_SZ];
        struct led_trigger *rx_led_trig;
        char rx_led_trig_name[CAN_LED_NAME_SZ];
+       struct led_trigger *rxtx_led_trig;
+       char rxtx_led_trig_name[CAN_LED_NAME_SZ];
 #endif
 };
 
index e0475c5cbb92aac6fe1163bc2ac65a4664048152..146de4506d211285b82a5b3554154c4e6fc4a8a1 100644 (file)
@@ -21,8 +21,10 @@ enum can_led_event {
 
 #ifdef CONFIG_CAN_LEDS
 
-/* keep space for interface name + "-tx"/"-rx" suffix and null terminator */
-#define CAN_LED_NAME_SZ (IFNAMSIZ + 4)
+/* keep space for interface name + "-tx"/"-rx"/"-rxtx"
+ * suffix and null terminator
+ */
+#define CAN_LED_NAME_SZ (IFNAMSIZ + 6)
 
 void can_led_event(struct net_device *netdev, enum can_led_event event);
 void devm_can_led_init(struct net_device *netdev);