Wolfgang Grandegger wrote: > Marc Kleine-Budde wrote: >> Wolfgang Grandegger wrote: >>> Marc Kleine-Budde wrote: >>>> christian pellegrin wrote: >>>>> The following patch adds the possibility to monitor TEC/REC. I found >>>>> it quite useful for understanding how the bus works. I see that not >>>>> all controllers support is but for those that do it might be useful. >>>>> >>>>> >From 8a1260a1ac881aa49c0e8ebd92e56d83c722a7fd Mon Sep 17 00:00:00 2001 >>>>> From: Christian Pellegrin <[email protected]> >>>>> Date: Sun, 7 Feb 2010 09:57:47 +0100 >>>>> Subject: [PATCH] rec tec >>>>> >>>>> --- >>>>> drivers/net/can/dev.c | 3 +++ >>>>> drivers/net/can/mcp251x.c | 13 +++++++++++++ >>>>> include/linux/can/dev.h | 1 + >>>>> include/linux/can/netlink.h | 2 ++ >>>>> 4 files changed, 19 insertions(+), 0 deletions(-) >>>>> >>>>> diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c >>>>> index f08f120..900a467 100644 >>>>> --- a/drivers/net/can/dev.c >>>>> +++ b/drivers/net/can/dev.c >>>>> @@ -688,6 +688,9 @@ static int can_fill_xstats(struct sk_buff *skb, >>>>> const struct net_device *dev) >>>>> { >>>>> struct can_priv *priv = netdev_priv(dev); >>>>> >>>>> + if (priv->do_update_stats) >>>>> + priv->do_update_stats(dev); >>>>> + >>>>> NLA_PUT(skb, IFLA_INFO_XSTATS, >>>>> sizeof(priv->can_stats), &priv->can_stats); >>>>> >>>>> diff --git a/drivers/net/can/mcp251x.c b/drivers/net/can/mcp251x.c >>>>> index 2608817..e343bbf 100644 >>>>> --- a/drivers/net/can/mcp251x.c >>>>> +++ b/drivers/net/can/mcp251x.c >>>>> @@ -506,6 +506,18 @@ static int mcp251x_do_set_mode(struct net_device >>>>> *net, enum can_mode mode) >>>>> return 0; >>>>> } >>>>> >>>>> +static int mcp251x_do_update_stats(struct net_device *net) >>>>> +{ >>>>> + struct mcp251x_priv *priv = netdev_priv(net); >>>>> + >>>>> + mutex_lock(&priv->mcp_lock); >>>>> + priv->can.can_stats.tec = mcp251x_read_reg(priv->spi, TEC); >>>>> + priv->can.can_stats.rec = mcp251x_read_reg(priv->spi, REC); >>>>> + mutex_unlock(&priv->mcp_lock); >>>>> + return 0; >>>>> +} >>>>> + >>>>> + >>>>> static int mcp251x_set_normal_mode(struct spi_device *spi) >>>>> { >>>>> struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); >>>>> @@ -1015,6 +1027,7 @@ static int __devinit mcp251x_can_probe(struct >>>>> spi_device *spi) >>>>> priv = netdev_priv(net); >>>>> priv->can.bittiming_const = &mcp251x_bittiming_const; >>>>> priv->can.do_set_mode = mcp251x_do_set_mode; >>>>> + priv->can.do_update_stats = mcp251x_do_update_stats; >>>>> priv->can.clock.freq = pdata->oscillator_frequency / 2; >>>>> priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES | >>>>> CAN_CTRLMODE_LOOPBACK | CAN_CTRLMODE_LISTENONLY | >>>>> diff --git a/include/linux/can/dev.h b/include/linux/can/dev.h >>>>> index 4cb4f72..2bfecab 100644 >>>>> --- a/include/linux/can/dev.h >>>>> +++ b/include/linux/can/dev.h >>>>> @@ -47,6 +47,7 @@ struct can_priv { >>>>> int (*do_set_mode)(struct net_device *dev, enum can_mode mode); >>>>> int (*do_get_state)(const struct net_device *dev, >>>>> enum can_state *state); >>>>> + int (*do_update_stats)(const struct net_device *dev); >>>>> >>>>> unsigned int echo_skb_max; >>>>> struct sk_buff **echo_skb; >>>>> diff --git a/include/linux/can/netlink.h b/include/linux/can/netlink.h >>>>> index 49960e4..ef6fbf1 100644 >>>>> --- a/include/linux/can/netlink.h >>>>> +++ b/include/linux/can/netlink.h >>>>> @@ -93,6 +93,8 @@ struct can_device_stats { >>>>> __u32 bus_off; /* Changes to bus off state */ >>>>> __u32 arbitration_lost; /* Arbitration lost errors */ >>>>> __u32 restarts; /* CAN controller re-starts */ >>>>> + __u8 tec; >>>>> + __u8 rec; >>>> One of these errors can go to 255 which is 0x100, and doesn't fit into >>>> an u8. >>> Hm, I think 255 == 0xff !? >> Indeed, off by one, but it can go to 256 which is 0x100. > > On which CAN controller? On the AT91 CAN and SJA1000 it is a 8-bit > field. 256 means bus-off. Should the TEC or REC be set to 256 by > software if we are in bus-off? Hm, seems overkill to me.
Yes, on the at91 the field is only 8 bit long and in case of an bus error it shows "0", due to an overflow. The atmel support confirmed that problem; the next chip revision will have at least 9 bit wide field. cheers, 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 |
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Socketcan-users mailing list [email protected] https://lists.berlios.de/mailman/listinfo/socketcan-users
