• Andri Yngvason's avatar
    can: cc770: Fix queue stall & dropped RTR reply · 74620123
    Andri Yngvason authored
    While waiting for the TX object to send an RTR, an external message with a
    matching id can overwrite the TX data. In this case we must call the rx
    routine and then try transmitting the message that was overwritten again.
    
    The queue was being stalled because the RX event did not generate an
    interrupt to wake up the queue again and the TX event did not happen
    because the TXRQST flag is reset by the chip when new data is received.
    
    According to the CC770 datasheet the id of a message object should not be
    changed while the MSGVAL bit is set. This has been fixed by resetting the
    MSGVAL bit before modifying the object in the transmit function and setting
    it after. It is not enough to set & reset CPUUPD.
    
    It is important to keep the MSGVAL bit reset while the message object is
    being modified. Otherwise, during RTR transmission, a frame with matching
    id could trigger an rx-interrupt, which would cause a race condition
    between the interrupt routine and the transmit function.
    Signed-off-by: default avatarAndri Yngvason <andri.yngvason@marel.com>
    Tested-by: default avatarRichard Weinberger <richard@nod.at>
    Cc: linux-stable <stable@vger.kernel.org>
    Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
    74620123
cc770.c 23.1 KB