From: Marc Kleine-Budde <mkl@pengutronix.de>
To: Fabio Baltieri <fabio.baltieri@gmail.com>
Cc: linux-can@vger.kernel.org, linux-kernel@vger.kernel.org,
Oliver Hartkopp <socketcan@hartkopp.net>,
Wolfgang Grandegger <wg@grandegger.com>
Subject: Re: [PATCH can-next v4] can: add tx/rx LED trigger support
Date: Wed, 01 Aug 2012 11:36:51 +0200 [thread overview]
Message-ID: <5018F8B3.6080404@pengutronix.de> (raw)
In-Reply-To: <1343772338-1526-1-git-send-email-fabio.baltieri@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 7593 bytes --]
On 08/01/2012 12:05 AM, Fabio Baltieri wrote:
> This patch implements the functions to add two LED triggers, named
> <ifname>-tx and <ifname>-rx, to a canbus device driver.
>
> Triggers are called from specific handlers by each CAN device driver and
> can be disabled altogether with a Kconfig option.
>
> The implementation keeps the LED on when the interface is UP and blinks
> the LED on network activity at a configurable rate.
>
> This only supports can-dev based drivers, as it uses some support field
> in the can_priv structure.
>
> Supported drivers should call can_led_init() and can_led_event() as
> needed.
>
> Cleanup is handled automatically by devres, so no *_exit function is
> needed.
>
> Supported events are:
> - CAN_LED_EVENT_OPEN: turn on tx/rx LEDs
> - CAN_LED_EVENT_STOP: turn off tx/rx LEDs
> - CAN_LED_EVENT_TX: trigger tx LED blink
> - CAN_LED_EVENT_RX: trigger tx LED blink
>
> Cc: Oliver Hartkopp <socketcan@hartkopp.net>
> Cc: Wolfgang Grandegger <wg@grandegger.com>
> Cc: Marc Kleine-Budde <mkl@pengutronix.de>
> Signed-off-by: Fabio Baltieri <fabio.baltieri@gmail.com>
> ---
>
> Hi!
>
> So, here is the v4.
>
> Changes against v3:
> - add a netdev_err message in kasprintf error path
> - implement a devres_alloc release function to de-allocate strings and trigger
> - can_led_exit is now unneeded and gone
>
> Is that what you had in mind Marc?
Yes, that's it. Can you add a devm_ prefix to can_led_init() please.
> I like the devres implementation, as callers don't have to care about exit
> function anymore... still it looks like a bit of an hack to me.
No :)
> Also, I made an initial version with the four pointers in a separate can_led
> struct to be allocated as a payload of devres_alloc - but I think this one
> looks cleaner and is more cache-friendly.
If you allocate the 4 pointers in a separate struct you only save 3
points, as you need the pointer to the struct anyways.
> What you think about this?
Looks good. See comment inline,
Marc
> drivers/net/can/Kconfig | 12 ++++++
> drivers/net/can/Makefile | 2 +
> drivers/net/can/led.c | 102 +++++++++++++++++++++++++++++++++++++++++++++++
> include/linux/can/dev.h | 8 ++++
> include/linux/can/led.h | 34 ++++++++++++++++
> 5 files changed, 158 insertions(+)
> create mode 100644 drivers/net/can/led.c
> create mode 100644 include/linux/can/led.h
>
> diff --git a/drivers/net/can/Kconfig b/drivers/net/can/Kconfig
> index bb709fd..19dec19 100644
> --- a/drivers/net/can/Kconfig
> +++ b/drivers/net/can/Kconfig
> @@ -54,6 +54,18 @@ config CAN_CALC_BITTIMING
> arguments "tq", "prop_seg", "phase_seg1", "phase_seg2" and "sjw".
> If unsure, say Y.
>
> +config CAN_LEDS
> + bool "Enable LED triggers for Netlink based drivers"
> + depends on CAN_DEV
> + depends on LEDS_CLASS
> + select LEDS_TRIGGERS
> + ---help---
> + This option adds two LED triggers for packet receive and transmit
> + events on each supported CAN device.
> +
> + Say Y here if you are working on a system with led-class supported
> + LEDs and you want to use them as canbus activity indicators.
> +
> config CAN_AT91
> tristate "Atmel AT91 onchip CAN controller"
> depends on CAN_DEV && (ARCH_AT91SAM9263 || ARCH_AT91SAM9X5)
> diff --git a/drivers/net/can/Makefile b/drivers/net/can/Makefile
> index 938be37..24ee98b 100644
> --- a/drivers/net/can/Makefile
> +++ b/drivers/net/can/Makefile
> @@ -8,6 +8,8 @@ obj-$(CONFIG_CAN_SLCAN) += slcan.o
> obj-$(CONFIG_CAN_DEV) += can-dev.o
> can-dev-y := dev.o
>
> +can-dev-$(CONFIG_CAN_LEDS) += led.o
> +
> obj-y += usb/
> obj-y += softing/
>
> diff --git a/drivers/net/can/led.c b/drivers/net/can/led.c
> new file mode 100644
> index 0000000..4fa8a47
> --- /dev/null
> +++ b/drivers/net/can/led.c
> @@ -0,0 +1,102 @@
> +/*
> + * Copyright 2012, Fabio Baltieri <fabio.baltieri@gmail.com>
> + *
> + * 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 <linux/module.h>
> +#include <linux/device.h>
> +#include <linux/kernel.h>
> +#include <linux/slab.h>
> +#include <linux/netdevice.h>
> +#include <linux/can/dev.h>
> +
> +#include <linux/can/led.h>
> +
> +static unsigned long led_delay = 50;
> +module_param(led_delay, ulong, 0644);
> +MODULE_PARM_DESC(led_delay,
> + "blink delay time for activity leds (msecs, default: 50).");
> +
> +/*
> + * Trigger a LED event in response to a CAN device event
> + */
> +void can_led_event(struct net_device *netdev, enum can_led_event event)
> +{
> + struct can_priv *priv = netdev_priv(netdev);
> +
> + switch (event) {
> + case CAN_LED_EVENT_OPEN:
> + led_trigger_event(priv->tx_led_trig, LED_FULL);
> + led_trigger_event(priv->rx_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);
> + break;
> + case CAN_LED_EVENT_TX:
> + if (led_delay)
> + led_trigger_blink_oneshot(priv->tx_led_trig,
> + &led_delay, &led_delay, 1);
> + break;
> + case CAN_LED_EVENT_RX:
> + if (led_delay)
> + led_trigger_blink_oneshot(priv->rx_led_trig,
> + &led_delay, &led_delay, 1);
> + break;
> + }
> +}
> +EXPORT_SYMBOL_GPL(can_led_event);
> +
> +static void can_led_release(struct device *gendev, void *res)
> +{
> + struct can_priv *priv = netdev_priv(to_net_dev(gendev));
> +
> + led_trigger_unregister_simple(priv->tx_led_trig);
> + led_trigger_unregister_simple(priv->rx_led_trig);
> +
> + kfree(priv->tx_led_trig_name);
> + kfree(priv->rx_led_trig_name);
> +}
> +
> +/*
> + * Register CAN LED triggers for a CAN device
> + *
> + * This is normally called from a driver's probe function
> + */
> +void can_led_init(struct net_device *netdev)
> +{
> + struct can_priv *priv = netdev_priv(netdev);
> + void *res;
> +
> + res = devres_alloc(can_led_release, 0, GFP_KERNEL);
^
I'm not really sure if this is working. For example, pinctrl [1]
allocates a double pointer here. The res pointer here and in
can_led_release simply points to invalid memory. But as long as you
don't dereference it, it should work.
[1] http://lxr.free-electrons.com/source/drivers/pinctrl/core.c#L862
> + if (!res)
> + goto err_out;
> +
> + priv->tx_led_trig_name = kasprintf(GFP_KERNEL, "%s-tx", netdev->name);
> + if (!priv->tx_led_trig_name)
> + goto err_out;
> +
> + priv->rx_led_trig_name = kasprintf(GFP_KERNEL, "%s-rx", netdev->name);
> + if (!priv->rx_led_trig_name)
> + goto err_out_rx;
> +
> + 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);
> +
> + devres_add(&netdev->dev, res);
> +
> + return;
> +
> +err_out_rx:
> + kfree(priv->tx_led_trig_name);
> + priv->tx_led_trig_name = NULL;
> +err_out:
> + netdev_err(netdev, "cannot register LED triggers\n");
> + devres_free(res);
> +}
> +EXPORT_SYMBOL_GPL(can_led_init);
Marc
--
Pengutronix e.K. | Marc Kleine-Budde |
Industrial Linux Solutions | Phone: +49-231-2826-924 |
Vertretung West/Dortmund | Fax: +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686 | http://www.pengutronix.de |
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 262 bytes --]
next prev parent reply other threads:[~2012-08-01 9:37 UTC|newest]
Thread overview: 71+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-07-30 19:20 [PATCH can-next v3 1/2] can: add tx/rx LED trigger support Fabio Baltieri
2012-07-30 19:20 ` [PATCH can-next v3 2/2] can: flexcan: add " Fabio Baltieri
2012-07-30 21:17 ` [PATCH can-next v3 1/2] can: add tx/rx " Marc Kleine-Budde
2012-07-31 6:57 ` Fabio Baltieri
2012-07-31 7:10 ` Marc Kleine-Budde
2012-07-31 11:57 ` Fabio Baltieri
2012-07-31 12:00 ` Marc Kleine-Budde
2012-07-31 22:05 ` [PATCH can-next v4] " Fabio Baltieri
2012-08-01 9:36 ` Marc Kleine-Budde [this message]
2012-08-01 10:07 ` Marc Kleine-Budde
2012-08-01 10:30 ` Fabio Baltieri
2012-08-01 11:37 ` Marc Kleine-Budde
2012-08-01 11:49 ` [PATCH can-next v5 1/2] " Fabio Baltieri
2012-08-01 11:49 ` [PATCH can-next v5 2/2] can: flexcan: add " Fabio Baltieri
2012-08-01 11:53 ` Marc Kleine-Budde
2012-08-01 12:24 ` Fabio Baltieri
2012-08-01 12:30 ` Marc Kleine-Budde
2012-08-01 21:02 ` Marc Kleine-Budde
2012-08-01 11:59 ` [PATCH can-next v5 1/2] can: add tx/rx " Marc Kleine-Budde
2012-08-01 12:06 ` Oliver Hartkopp
2012-08-01 12:18 ` Marc Kleine-Budde
2012-08-01 18:21 ` [PATCH can-next v6] " Fabio Baltieri
2012-08-01 21:00 ` Marc Kleine-Budde
2012-08-01 22:38 ` Fabio Baltieri
2012-08-01 21:05 ` Oliver Hartkopp
2012-08-24 5:10 ` Kurt Van Dijck
2012-08-24 11:28 ` Marc Kleine-Budde
2012-08-24 12:42 ` Kurt Van Dijck
2012-08-24 12:42 ` Kurt Van Dijck
2012-08-24 22:01 ` Fabio Baltieri
2012-08-25 20:25 ` Kurt Van Dijck
2012-09-03 12:40 ` Marc Kleine-Budde
2012-09-03 18:13 ` Kurt Van Dijck
2012-09-03 18:29 ` Fabio Baltieri
2012-09-03 20:54 ` Oliver Hartkopp
2012-09-04 7:11 ` Kurt Van Dijck
2012-09-04 9:29 ` [PATCH] can: rename LED trigger name on netdev renames Kurt Van Dijck
2012-09-06 18:59 ` Fabio Baltieri
2012-09-06 19:31 ` Oliver Hartkopp
2012-09-06 20:46 ` Fabio Baltieri
2012-09-07 7:19 ` Kurt Van Dijck
2012-09-09 16:17 ` [PATCH v2] " Fabio Baltieri
2012-09-10 14:25 ` [PATCH] can: export a safe netdev_priv wrapper for candev Kurt Van Dijck
2012-09-10 14:25 ` Kurt Van Dijck
2012-09-10 18:22 ` Oliver Hartkopp
2012-09-10 18:29 ` Fabio Baltieri
2012-09-10 19:55 ` [PATCH v2] " Kurt Van Dijck
2012-09-10 14:28 ` [PATCH v3] can: rename LED trigger name on netdev renames Kurt Van Dijck
2012-09-10 14:28 ` Kurt Van Dijck
2012-09-10 18:25 ` Oliver Hartkopp
2012-09-10 18:40 ` Fabio Baltieri
2012-09-10 19:01 ` Oliver Hartkopp
2012-09-10 20:08 ` Kurt Van Dijck
2012-09-11 5:42 ` Oliver Hartkopp
2012-09-11 7:13 ` Fabio Baltieri
2012-09-12 7:22 ` Kurt Van Dijck
2012-09-12 7:22 ` Kurt Van Dijck
2012-09-11 8:05 ` Kurt Van Dijck
2012-09-10 20:06 ` [PATCH v4] " Kurt Van Dijck
2012-09-11 21:04 ` Fabio Baltieri
2012-09-04 20:15 ` [PATCH can-next v6] can: add tx/rx LED trigger support Fabio Baltieri
2012-09-06 10:33 ` Kurt Van Dijck
2012-09-06 11:17 ` Fabio Baltieri
2012-09-06 15:11 ` Kurt Van Dijck
2012-09-06 20:57 ` Fabio Baltieri
2012-09-07 7:04 ` Kurt Van Dijck
2012-09-07 18:59 ` Fabio Baltieri
2012-07-31 8:46 ` [PATCH can-next v3 1/2] " Wolfgang Grandegger
2012-07-31 10:12 ` Marc Kleine-Budde
2012-07-31 11:55 ` Fabio Baltieri
2012-07-31 12:14 ` Fabio Baltieri
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5018F8B3.6080404@pengutronix.de \
--to=mkl@pengutronix.de \
--cc=fabio.baltieri@gmail.com \
--cc=linux-can@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=socketcan@hartkopp.net \
--cc=wg@grandegger.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.