• Jeroen Hofstee's avatar
    can: ti_hecc: properly report state changes · 3b2d652d
    Jeroen Hofstee authored
    The HECC_CANES register handles the flags specially, it only updates
    the flags after a one is written to them. Since the interrupt for
    frame errors is not enabled an old error can hence been seen when a
    state interrupt arrives. For example if the device is not connected
    to the CAN-bus the error warning interrupt will have HECC_CANES
    indicating there is no ack. The error passive interrupt thereafter
    will have HECC_CANES flagging that there is a warning level. And if
    thereafter there is a message successfully send HECC_CANES points to
    an error passive event, while in reality it became error warning
    again. In summary, the state is not always reported correctly.
    
    So handle the state changes and frame errors separately. The state
    changes are now based on the interrupt flags and handled directly
    when they occur. The reporting of the frame errors is still done as
    before, as a side effect of another interrupt.
    
    note: the hecc_clear_bit will do a read, modify, write. So it will
    not only clear the bit, but also reset all other bits being set as
    a side affect, hence it is replaced with only clearing the flags.
    
    note: The HECC_CANMC_CCR is no longer cleared in the state change
    interrupt, it is completely unrelated.
    
    And use net_ratelimit to make checkpatch happy.
    Signed-off-by: default avatarJeroen Hofstee <jhofstee@victronenergy.com>
    Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
    3b2d652d
ti_hecc.c 30.3 KB