• Lukas Wunner's avatar
    can: hi311x: Work around TX complete interrupt erratum · 32bee8f4
    Lukas Wunner authored
    When sending packets as fast as possible using "cangen -g 0 -i -x", the
    HI-3110 occasionally latches the interrupt pin high on completion of a
    packet, but doesn't set the TXCPLT bit in the INTF register.  The INTF
    register contains 0x00 as if no interrupt has occurred.  Even waiting
    for a few milliseconds after the interrupt doesn't help.
    
    Work around this apparent erratum by instead checking the TXMTY bit in
    the STATF register ("TX FIFO empty").  We know that we've queued up a
    packet for transmission if priv->tx_len is nonzero.  If the TX FIFO is
    empty, transmission of that packet must have completed.
    
    Note that this is congruent with our handling of received packets, which
    likewise gleans from the STATF register whether a packet is waiting in
    the RX FIFO, instead of looking at the INTF register.
    
    Cc: Mathias Duckeck <m.duckeck@kunbus.de>
    Cc: Akshay Bhat <akshay.bhat@timesys.com>
    Cc: Casey Fitzpatrick <casey.fitzpatrick@timesys.com>
    Cc: stable@vger.kernel.org # v4.12+
    Signed-off-by: default avatarLukas Wunner <lukas@wunner.de>
    Acked-by: default avatarAkshay Bhat <akshay.bhat@timesys.com>
    Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
    32bee8f4
hi311x.c 26.6 KB