Colibri IMX6ULL CAN Bus-off after sending message on CAN

Hi,

We have here Colibri imx6ull + custom carrier board in which trying run FlexCAN.

As described in the CAN (Linux) | Toradex Developer Center do the changes in the device tree.

After booting the image we got both CAN0 and CAN1 interface.

root@colibri-imx6ull-14797323:~# ifconfig -a
can0: flags=193<UP,RUNNING,NOARP>  mtu 16  metric 1
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 10  (UNSPEC)
        RX packets 37863  bytes 302904 (295.8 KiB)
        RX errors 0  dropped 383  overruns 0  frame 0
        TX packets 1  bytes 8 (8.0 B)
        TX errors 0  dropped 1 overruns 0  carrier 1  collisions 0
        device interrupt 25  

can1: flags=128<NOARP>  mtu 16  metric 1
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 10  (UNSPEC)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 26  

eth0: flags=-28605<UP,BROADCAST,RUNNING,MULTICAST,DYNAMIC>  mtu 1500  metric 1
        inet 192.168.4.51  netmask 255.255.0.0  broadcast 192.168.255.255
        inet6 fe80::214:2dff:fee1:ca0b  prefixlen 64  scopeid 0x20<link>
        ether 00:14:2d:e1:ca:0b  txqueuelen 1000  (Ethernet)
        RX packets 49350  bytes 5638443 (5.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 96  bytes 12388 (12.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536  metric 1
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 86  bytes 6592 (6.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 86  bytes 6592 (6.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

mlan0: flags=4098<BROADCAST,MULTICAST>  mtu 1500  metric 1
        ether e8:fb:1c:aa:55:ef  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

uap0: flags=4098<BROADCAST,MULTICAST>  mtu 1500  metric 1
        ether e8:fb:1c:aa:57:ef  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

usb0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500  metric 1
        ether 22:54:bc:81:71:63  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

root@colibri-imx6ull-14797323:~# 

After setting up CAN0 and its bitrate, I can receive the messages, but once I send a message to the CAN bus, it goes in to bus-off state.

root@colibri-imx6ull-14797323:~# cangen can0 -v
  can0  216#39.9B.BD.7B.2E.FD.3A[  870.818114] flexcan 2090000.flexcan can0: bus-off

  can0  07F#AF.FB.ED.2A
  can0  4A5#87
  can0  418#CE.96.71.3E.AC.9F.8E.64
  can0  708#F1.98.78.10.F6.E9.1B.21
  can0  450#08.3E.3A.77.2E.48.F4.6C
  can0  7F4#8E.6B.19
^Croot@colibri-imx6ull-14797323:~# dmesg | grep flexcan
[   11.293036] flexcan 2090000.flexcan: 2090000.flexcan supply xceiver not found, using dummy regulator
[   11.481864] flexcan 2094000.flexcan: 2094000.flexcan supply xceiver not found, using dummy regulator
[   53.348671] flexcan 2090000.flexcan can0: bus-off
[  870.818114] flexcan 2090000.flexcan can0: bus-off
root@colibri-imx6ull-14797323:~# ip -details link show can0
3: can0: <NO-CARRIER,NOARP,UP,ECHO> mtu 16 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 10
    link/can  promiscuity 0 minmtu 0 maxmtu 0 
    can state BUS-OFF (berr-counter tx 0 rx 0) restart-ms 0 
	  bitrate 500000 sample-point 0.866 
	  tq 133 prop-seg 6 phase-seg1 6 phase-seg2 2 sjw 1
	  flexcan: tseg1 4..16 tseg2 2..8 sjw 1..4 brp 1..256 brp-inc 1
	  clock 30000000 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 
root@colibri-imx6ull-14797323:~# 

Also, When I boot the same image using the NFS server on Colibri at that time, CAN is working fine even after sending a message on CAN bus remains active.

For more information about the version, I have added the output of /etc/os-release and /etc/issue.

root@colibri-imx6ull-14797323:~# cat /etc/os-release
ID=tdx-xwayland
NAME="TDX Wayland with XWayland"
VERSION="5.7.2-devel-20230526090406+build.0 (dunfell)"
VERSION_ID=5.7.2-devel-20230526090406-build.0
PRETTY_NAME="TDX Wayland with XWayland 5.7.2-devel-20230526090406+build.0 (dunfell)"
DISTRO_CODENAME="dunfell"
root@colibri-imx6ull-14797323:~# cat /etc/issue
TDX Wayland with XWayland 5.7.2-devel-20230526090406+build.0 (dunfell) \n \l
Colibri-iMX6ULL_Reference-Multimedia-Image

device tree diff :

diff --git a/arch/arm/boot/dts/imx6ul.dtsi b/arch/arm/boot/dts/imx6ul.dtsi
index 3a9985cb0dd9..7b6a9b96b34d 100644
--- a/arch/arm/boot/dts/imx6ul.dtsi
+++ b/arch/arm/boot/dts/imx6ul.dtsi
@@ -485,7 +485,7 @@
                                         <&clks IMX6UL_CLK_CAN1_SERIAL>;
                                clock-names = "ipg", "per";
                                fsl,stop-mode = <&gpr 0x10 1 0x10 17>;
-                               status = "disabled";
+                               status = "okay";
                        };
 
                        can2: flexcan@2094000 {
@@ -496,7 +496,7 @@
                                         <&clks IMX6UL_CLK_CAN2_SERIAL>;
                                clock-names = "ipg", "per";
                                fsl,stop-mode = <&gpr 0x10 2 0x10 18>;
-                               status = "disabled";
+                               status = "okay";
                        };
 
                        gpt1: gpt@2098000 {
diff --git a/arch/arm/boot/dts/imx6ull-colibri-eval-v3.dtsi b/arch/arm/boot/dts/imx6ull-colibri-eval-v3.dtsi
index 821523a12423..0d45324878fa 100644
--- a/arch/arm/boot/dts/imx6ull-colibri-eval-v3.dtsi
+++ b/arch/arm/boot/dts/imx6ull-colibri-eval-v3.dtsi
@@ -73,7 +73,7 @@
 };
 
 &ecspi1 {
-       status = "okay";
+       status = "disabled";
 
        mcp2515: can@0 {
                compatible = "microchip,mcp2515";
@@ -86,7 +86,7 @@
                spi-max-frequency = <10000000>;
                vdd-supply = <&reg_3v3>;
                xceiver-supply = <&reg_5v0>;
-               status = "okay";
+               status = "disabled";
        };
 
        /* To keep the CAN controller enabled by default,
@@ -100,13 +100,13 @@
 &can1 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_flexcan1>;
-       status = "disabled";
+       status = "okay";
 };
 
 &can2 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_flexcan2>;
-       status = "disabled";
+       status = "okay";
 };
 
 &i2c1 {
diff --git a/arch/arm/boot/dts/imx6ull-colibri-wifi.dtsi b/arch/arm/boot/dts/imx6ull-colibri-wifi.dtsi
index 237757d7df8b..0d5704176f27 100644
--- a/arch/arm/boot/dts/imx6ull-colibri-wifi.dtsi
+++ b/arch/arm/boot/dts/imx6ull-colibri-wifi.dtsi
@@ -173,8 +173,11 @@
 
 &iomuxc {
        pinctrl-names = "default";
+#if 0
        pinctrl-0 = <&pinctrl_gpio1 &pinctrl_gpio2 &pinctrl_gpio3
                &pinctrl_gpio4 &pinctrl_gpio7>;
+#endif
+       pinctrl-0 = <&pinctrl_gpio1 &pinctrl_gpio2 &pinctrl_gpio4>; 
 
 };
 
diff --git a/arch/arm/boot/dts/imx6ull-colibri.dtsi b/arch/arm/boot/dts/imx6ull-colibri.dtsi
index 06d4270e4c13..2593165acdb2 100644
--- a/arch/arm/boot/dts/imx6ull-colibri.dtsi
+++ b/arch/arm/boot/dts/imx6ull-colibri.dtsi
@@ -369,8 +369,8 @@
 
                pinctrl_flexcan1: flexcan1-grp {
                        fsl,pins = <
-                               MX6UL_PAD_ENET1_RX_DATA0__FLEXCAN1_TX   0x1b020
-                               MX6UL_PAD_ENET1_RX_DATA1__FLEXCAN1_RX   0x1b020
+                               MX6UL_PAD_ENET1_RX_DATA0__FLEXCAN1_TX   0x1b0b0
+                               MX6UL_PAD_ENET1_RX_DATA1__FLEXCAN1_RX   0x1b0b0
                        >;
                };

Thanks,
Vishvas

Hi @vishvas,

Can you confirm if both images are identical, ideally it does not matter from where image is booting and should not effect CAN communication.

Also please let us know if you are testing/running CAN command using serial terminal or ssh and dmesg/journalctl logs for both testing setup to further check.

Best Regards
Ritesh Kumar

Thanks for Replying,

It’s solved now. The issue is from the hardware side.
The CAN transceiver IC which we were using has some issues.

Thanks,
Vishvas