Skip to contentSkip to conversation

Dual SJA1000 can controllers on SMP system.

DISCUSSION Mirza Krak 2 participants 2 messages Jun 13, 2013 – Jun 16, 2013 CAN network drivers

lore
Share & tools
lore

Mirza Krak

author
#0 lore raw

Dear Sirs.

I am running a 3.1.10 kernel on Nvidia Tegra 2 CPU (Dual Core). Not vanilla kernel (Linux4Tegra).

We are using dual can controllers connected on th external data bus on our custom hardware. The can controllers are SJA1000.

Driver that is used is vanilla sja1000 driver (sja1000.c)

Now to the issue at hand. Will try my best to explain our scenario and issue:
1. The two can controllers are connected with each other with a
loop-back.
2. What we are attempting is to send data on both controllers in
two separate processes. We are using following command "cansequence can0 -p &" and "cansequence can1 -p &". With a bit-rate configured to 1 Mbit/s.
3. What we see when we attempt the above is that one of the
controllers stop sending and the software buffer gets filled up. When it stops varies but usually after a few packets are sent.

After some digging we came to this conclusion. The two cansequence processes end up on different CPU cores. The process that ends up in CPU1 is the one that always stops transmitting.

Workarounds that we have seen that works is
1. Disable dual core with kernel argument "maxcpus=1".
2. Forcing the cansequence processes to CPU0 with "taskset" command.

My question to you is if anyone has tested the SJA1000 driver on an SMP system or anything similar.

Signature · 15 lines
Med Vänliga Hälsningar / Best Regards
Mirza

*******************************************************************
Mirza Krak
Host Mobility AB
[email protected]
Anders Personsgatan 12, 416 64 Göteborg
Sweden
www.hostmobility.com <http://www.hostmobility.com>
Direct: +46 31 31 32 704
Phone: +46 31 31 32 700
Fax: +46 31 80 67 51
Mobile: +46 730 28 06 22
*******************************************************************
#1 lore raw
Quoted 7 lines · Mirza Krak

Dear Sirs.

I am running a 3.1.10 kernel on Nvidia Tegra 2 CPU (Dual Core). Not vanilla kernel (Linux4Tegra).

We are using dual can controllers connected on th external data bus on our custom hardware. The can controllers are SJA1000.

What external data bus is the CAN controller connected to? And which CAN controller board/card?

Quoted 1 line

Driver that is used is vanilla sja1000 driver (sja1000.c)

Which bus driver is used and how do you load the module?

Quoted 15 lines

Now to the issue at hand. Will try my best to explain our scenario and issue:
1. The two can controllers are connected with each other with a
loop-back.
2. What we are attempting is to send data on both controllers in two
separate processes. We are using following command "cansequence can0 -p &" and "cansequence can1 -p &". With a bit-rate configured to 1 Mbit/s.
3. What we see when we attempt the above is that one of the
controllers stop sending and the software buffer gets filled up. When it stops varies but usually after a few packets are sent.

After some digging we came to this conclusion. The two cansequence processes end up on different CPU cores. The process that ends up in CPU1 is the one that always stops transmitting.

Quoted 6 lines

Workarounds that we have seen that works is
1. Disable dual core with kernel argument "maxcpus=1".
2. Forcing the cansequence processes to CPU0 with "taskset" command.

My question to you is if anyone has tested the SJA1000 driver on an SMP system or anything similar.

Well, sending from two processes concurrently is not really a typical use case. ftrace is your friend. A function trace may help to find the root of the problem. Let me know if you need further help on that.

Wolfgang.