[PATCH v3] can: grcan: Add device driver for GRCAN and GRHCAN cores

Wolfgang Grandegger wg at grandegger.com
Wed Nov 7 22:15:36 EST 2012


On 11/07/2012 08:32 AM, Andreas Larsson wrote:
> On 11/05/2012 10:28 AM, Wolfgang Grandegger wrote:
>> On 11/01/2012 05:08 PM, Andreas Larsson wrote:
>>> On 2012-10-31 21:21, Wolfgang Grandegger wrote:
> ...
>>> Yes, the hardware becomes error active after having monitored 11
>>> consecutive recessive bits on the bus 128 times (as allowed by the 2.0
>>> CAN spec). There is no way of turning this off, so to conform to the
>>> normal linux procedure of not doing this, I shut down the device on bus
>>> off interrupt.
>>
>> This should be handled in the following way:
>>
>> 1. If priv->can.restart_ms == 0: do *not* allow automatic restart
>>     That's what you alredy have implemented.
>>
>> 2. If priv->can.restart_ms  > 0 : do allow automatic restart.
>>     This requires to send CAN_ERR_RESTARTED when the system goes
>>     bus-on. See at91_can and mcp251x as example.
>>
>>> In addition I have thrown out the arbitration lost error frame
>>> generation as arbitration errors can not be singled out. The TXLOSS
>>> interrupt might be due to arbitration error, but is also triggered in
>>> great numbers when there is no one else on the can bus or when there is
>>> a problem with the hardware interface or the bus itself.
>>>
>>> This is how things look currently with no one else on the bus:
>>> ~ # cansend can0 123#45
>>>    can0  20000004  [8] 00 08 00 00 00 00 60 00   ERRORFRAME
>>>          controller-problem{tx-error-warning}
>>>          error-counter-tx-rx{{96}{0}}
>>>    can0  20000004  [8] 00 20 00 00 00 00 80 00   ERRORFRAME
>>>          controller-problem{tx-error-passive}
>>>          error-counter-tx-rx{{128}{0}}
>>> ~ #
>>>
>>> And this is how it looks with a short-circuited bus:
>>> ~ # cansend can0 123#45
>>>    can0  20000004  [8] 00 08 00 00 00 00 90 00   ERRORFRAME
>>>          controller-problem{tx-error-warning}
>>>          error-counter-tx-rx{{144}{0}}
>>>    can0  20000004  [8] 00 20 00 00 00 00 98 00   ERRORFRAME
>>>          controller-problem{tx-error-passive}
>>>          error-counter-tx-rx{{152}{0}}
>>>    can0  20000040  [8] 00 00 00 00 00 00 00 00   ERRORFRAME
>>>          bus-off
>>> ~ #
>>
>> This looks good now. Just the automatic restart is missing as described
>> above.
> 
> When doing the bus_off handling as in at91_can, on a short-circuited bus
> with restart-ms != 0, the result of a cansend is an endless and frequent
> stream of
> 
>   can0  20000004  [8] 00 20 00 00 00 00 88 00   ERRORFRAME
>         controller-problem{tx-error-passive}
>         error-counter-tx-rx{{136}{0}}
>   can0  20000040  [8] 00 00 00 00 00 00 80 00   ERRORFRAME
>         bus-off
>         error-counter-tx-rx{{128}{0}}
>   can0  20000104  [8] 00 00 00 00 00 00 10 00   ERRORFRAME
>         controller-problem{}
>         restarted-after-bus-off
>         error-counter-tx-rx{{16}{0}}
>   can0  20000004  [8] 00 10 00 00 00 00 57 80   ERRORFRAME
>         controller-problem{rx-error-passive}
>         error-counter-tx-rx{{87}{128}}
>   can0  20000040  [8] 00 00 00 00 00 00 80 00   ERRORFRAME
>         bus-off
>         error-counter-tx-rx{{128}{0}}
>   can0  20000104  [8] 00 00 00 00 00 00 08 00   ERRORFRAME
>         controller-problem{}
>         restarted-after-bus-off
>         error-counter-tx-rx{{8}{0}}
>   can0  20000004  [8] 00 10 00 00 00 00 57 80   ERRORFRAME
>         controller-problem{rx-error-passive}
>         error-counter-tx-rx{{87}{128}}
>   can0  20000040  [8] 00 00 00 00 00 00 80 00   ERRORFRAME
>         bus-off
>         error-counter-tx-rx{{128}{0}}
>   can0  20000104  [8] 00 00 00 00 00 00 08 00   ERRORFRAME
>         controller-problem{}
>         restarted-after-bus-off
>         error-counter-tx-rx{{8}{0}}
>   [...]
> 
> as the grcan core continues to try to resend the frame when it comes
> back again. To mimic the sja1000 behavior as closely as possible, I
> guess that the driver also would need to make sure that the tx and rx
> buffers are cleaned out so that this resending does not happen, right?

No, what you see is the normal behavior for automatic restart by the
hardware. A bus-off recovery is *not* the same than a controller restart.

> To do this, the hardware needs to be stopped anyway. Therefore, in my
> opinion it is much simpler to handle it as it is in v5: always shut down
> the hardware on bus off and, in the case of a non-zero restart_ms, let
> restart timer trigger can_restart that will call grcan_set_mode which
> will restart the hardware with empty buffers. Do you see any problems
> with this approach?

The application will start to send frames anyway and will again trigger
a bus-off as long as the electronic problem persists. Flushing the
buffers will not cure the problem.

> The added benefit of this approach is that then the actual millisecond
> value of the non-zero restart_ms is used instead of having the hardware
> quickly restart regardless of the value.

See above.

> In any case I have some other fixes for v6.

OK.

Wolfgang.



More information about the devicetree-discuss mailing list