Re: [PATCH v3 4/4] can: flexcan: add vf610 support for FlexCAN
From: Marc Kleine-Budde <mkl@pengutronix.de>
Date: 2014-08-14 10:39:14
Also in:
linux-arm-kernel, lkml
On 08/04/2014 06:01 PM, Stefan Agner wrote:
Am 2014-08-04 16:27, schrieb Marc Kleine-Budde:quoted
On 08/04/2014 03:43 PM, Stefan Agner wrote: [...]quoted
quoted
Thanks for the test, so far looks promising :) With this setup the other CAN node repeats the CAN frame until it's ACKed. Because there is no node with a compatible bitrate, there is no ACking CAN node. Can you add a third CAN node to the network. The second and third node should use the same bitrate, while your vf610 uses a different one. With the new setup it should take more than one frame until the vf610 goes into error warning and even more frames to error passive. This way we can see it the error warning interrupt is connected or not. The error counters should increase with each "wrong" bitrate frame it sees, you can check with: ip -details link show can0 The output looks like this:quoted
4: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT qlen 10 link/can can state ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms 0^^^^^^^^^^^^^^^^^^^^^^quoted
bitrate 1000000 sample-point 0.750 tq 125 prop-seg 2 phase-seg1 3 phase-seg2 2 sjw 1 sja1000: tseg1 1..16 tseg2 1..8 sjw 1..4 brp 1..64 brp-inc 1 clock 8000000When one of the berr-counter crosses 96 (and stays below 128) a warning interrupt should be generated.Ok, created this setup, could successfully communicate with all three nodes. I then set the Vybrid to half of the bitrate. When I send a frame from Vybrid, the berr-counter tx immediately ends up at 128 and the device is in ERROR-PASSIVE:This is expected.quoted
root@colibri-vf:~# ip -details link show can1 3: can1: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 10 link/can promiscuity 0 can state ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms 0 bitrate 124990 sample-point 0.739 tq 347 prop-seg 8 phase-seg1 8 phase-seg2 6 sjw 1 flexcan: tseg1 4..16 tseg2 2..8 sjw 1..4 brp 1..256 brp-inc 1 clock 83368421^^^^^^^^ BTW: the can core has a really weird clock rate, have a look at the datasheet if you manage to route a 24 MHz clock (or another multiple of 8MHz) to the flexcan core. I had a quick glance at the datasheet, if I understand it correctly the Fast OSC clock runs with 24 MHz.This pinmux is actually part of the IPs CTRL register (see CLKSRC). Currently this is set unconditionally to peripheral clock, which is on my device 83.3 MHz (500MHz/6). This would be a bit bigger change. Just thinking how to implement this. Maybe we have to reference a third clock "osc" and a device tree property fsl,can-clock-osc which one can choose between "osc" and "per" what do you think?quoted
quoted
root@colibri-vf:~# cansend can1 1F334455#1122334455667788 interface = can1, family = 29, type = 3, proto = 1 root@colibri-vf:~# [ 818.886664] flexcan_irq, esr=00062242 [ 818.890365] flexcan_irq, ctrl=1c3dac57 root@colibri-vf:~# ip -details link show can1 3: can1: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 10 link/can promiscuity 0 can state ERROR-PASSIVE (berr-counter tx 128 rx 0) restart-ms 0 bitrate 124990 sample-point 0.739 tq 347 prop-seg 8 phase-seg1 8 phase-seg2 6 sjw 1 flexcan: tseg1 4..16 tseg2 2..8 sjw 1..4 brp 1..256 brp-inc 1 clock 83368421 When I send the frames from another device on the bus, I can see the rx count incrementing by one on each frame I send. As you expected, the device changes to ERROR-WARNING when crossing the 96 frame boundary:This is correctJust found out when using too high bitrate (500000 vs 125000), the error counter immediately goes up to 128 (or even beyond) and ends up in ERROR-PASSIVE: # ip -details link show can1 [ 292.164820] flexcan_get_berr_counter, esr=00000000 [ 292.169715] flexcan_get_berr_counter, esr=00040190 3: can1: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 10 link/can promiscuity 0 can state ERROR-PASSIVE (berr-counter tx 0 rx 135) restart-ms 0 bitrate 298811 sample-point 0.777 tq 371 prop-seg 3 phase-seg1 3 phase-seg2 2 sjw 1 flexcan: tseg1 4..16 tseg2 2..8 sjw 1..4 brp 1..256 brp-inc 1 clock 83368421quoted
quoted
root@colibri-vf:~# ip -details link show can1 3: can1: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 10 link/can promiscuity 0 can state ERROR-ACTIVE (berr-counter tx 0 rx 92) restart-ms 0 bitrate 124990 sample-point 0.739 tq 347 prop-seg 8 phase-seg1 8 phase-seg2 6 sjw 1 flexcan: tseg1 4..16 tseg2 2..8 sjw 1..4 brp 1..256 brp-inc 1 clock 83368421 root@colibri-vf:~# [ 448.331150] flexcan_irq, esr=0005050a [ 448.334851] flexcan_irq, ctrl=1c3dac57 ip -details link show can1 3: can1: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 10 link/can promiscuity 0 can state ERROR-WARNING (berr-counter tx 0 rx 102) restart-ms 0 bitrate 124990 sample-point 0.739 tq 347 prop-seg 8 phase-seg1 8 phase-seg2 6 sjw 1 flexcan: tseg1 4..16 tseg2 2..8 sjw 1..4 brp 1..256 brp-inc 1 clock 83368421quoted
However, once reaching 128, I don't get another interrupt and the device stays in ERROR-WARNING:The contents of the esr reg would be interesting, especially the FLT_CONF part.root@vybridvf61-v11:~# [ 222.221651] flexcan_irq, esr=0005050a [ 222.225349] flexcan_irq, ctrl=1c3dac57 ip -details link show can1 [ 223.791082] flexcan_get_berr_counter, esr=00000000 [ 223.796246] flexcan_get_berr_counter, esr=00040180 3: can1: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 10 link/can promiscuity 0 can state ERROR-WARNING (berr-counter tx 0 rx 96) restart-ms 0 bitrate 124990 sample-point 0.739 tq 347 prop-seg 8 phase-seg1 8 phase-seg2 6 sjw 1 flexcan: tseg1 4..16 tseg2 2..8 sjw 1..4 brp 1..256 brp-inc 1 clock 83368421 root@vybridvf61-v11:~# ip -details link show can1 [ 243.571175] flexcan_get_berr_counter, esr=00000000 [ 243.576343] flexcan_get_berr_counter, esr=00040582 3: can1: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 10 link/can promiscuity 0 can state ERROR-WARNING (berr-counter tx 0 rx 104) restart-ms 0 bitrate 124990 sample-point 0.739 tq 347 prop-seg 8 phase-seg1 8 phase-seg2 6 sjw 1 flexcan: tseg1 4..16 tseg2 2..8 sjw 1..4 brp 1..256 brp-inc 1 clock 83368421 ... root@vybridvf61-v11:~# ip -details link show can1 [ 299.831192] flexcan_get_berr_counter, esr=00000000 [ 299.836358] flexcan_get_berr_counter, esr=00040582 3: can1: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 10 link/can promiscuity 0 can state ERROR-WARNING (berr-counter tx 0 rx 126) restart-ms 0 bitrate 124990 sample-point 0.739 tq 347 prop-seg 8 phase-seg1 8 phase-seg2 6 sjw 1 flexcan: tseg1 4..16 tseg2 2..8 sjw 1..4 brp 1..256 brp-inc 1 clock 83368421 root@vybridvf61-v11:~# ip -details link show can1 [ 302.411025] flexcan_get_berr_counter, esr=00000000 [ 302.416195] flexcan_get_berr_counter, esr=00040592 3: can1: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 10 link/can promiscuity 0 can state ERROR-WARNING (berr-counter tx 0 rx 128) restart-ms 0 bitrate 124990 sample-point 0.739 tq 347 prop-seg 8 phase-seg1 8 phase-seg2 6 sjw 1 flexcan: tseg1 4..16 tseg2 2..8 sjw 1..4 brp 1..256 brp-inc 1 clock 83368421 The FLTCONF is in Error Passive, however the stack did not received that information. I still have the printk in the interrupt, however I did not get an interrupt here (while I get one when it switched to ERROR-WARNING... But it looks like the ERRINT is still pending...
Can you apply Alexander Stein's "[PATCH 2/4] can: flexcan: Detect error passive state change" and recheck? 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 |
Attachments
- signature.asc [application/pgp-signature] 181 bytes