• Anssi Hannula's avatar
    can: xilinx_can: fix RX loop if RXNEMP is asserted without RXOK · 32852c56
    Anssi Hannula authored
    If the device gets into a state where RXNEMP (RX FIFO not empty)
    interrupt is asserted without RXOK (new frame received successfully)
    interrupt being asserted, xcan_rx_poll() will continue to try to clear
    RXNEMP without actually reading frames from RX FIFO. If the RX FIFO is
    not empty, the interrupt will not be cleared and napi_schedule() will
    just be called again.
    
    This situation can occur when:
    
    (a) xcan_rx() returns without reading RX FIFO due to an error condition.
    The code tries to clear both RXOK and RXNEMP but RXNEMP will not clear
    due to a frame still being in the FIFO. The frame will never be read
    from the FIFO as RXOK is no longer set.
    
    (b) A frame is received between xcan_rx_poll() reading interrupt status
    and clearing RXOK. RXOK will be cleared, but RXNEMP will again remain
    set as the new message is still in the FIFO.
    
    I'm able to trigger case (b) by flooding the bus with frames under load.
    
    There does not seem to be any benefit in using both RXNEMP and RXOK in
    the way the driver does, and the polling example in the reference manual
    (UG585 v1.10 18.3.7 Read Messages from RxFIFO) also says that either
    RXOK or RXNEMP can be used for detecting incoming messages.
    
    Fix the issue and simplify the RX processing by only using RXNEMP
    without RXOK.
    
    Tested with the integrated CAN on Zynq-7000 SoC.
    
    Fixes: b1201e44 ("can: xilinx CAN controller support")
    Signed-off-by: default avatarAnssi Hannula <anssi.hannula@bitwise.fi>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
    32852c56
xilinx_can.c 33.8 KB