• Lukas Wunner's avatar
    net: ks8851: Dequeue RX packets explicitly · 536d3680
    Lukas Wunner authored
    The ks8851 driver lets the chip auto-dequeue received packets once they
    have been read in full. It achieves that by setting the ADRFE flag in
    the RXQCR register ("Auto-Dequeue RXQ Frame Enable").
    
    However if allocation of a packet's socket buffer or retrieval of the
    packet over the SPI bus fails, the packet will not have been read in
    full and is not auto-dequeued. Such partial retrieval of a packet
    confuses the chip's RX queue management:  On the next RX interrupt,
    the first packet read from the queue will be the one left there
    previously and this one can be retrieved without issues. But for any
    newly received packets, the frame header status and byte count registers
    (RXFHSR and RXFHBCR) contain bogus values, preventing their retrieval.
    
    The chip allows explicitly dequeueing a packet from the RX queue by
    setting the RRXEF flag in the RXQCR register ("Release RX Error Frame").
    This could be used to dequeue the packet in case of an error, but if
    that error is a failed SPI transfer, it is unknown if the packet was
    transferred in full and was auto-dequeued or if it was only transferred
    in part and requires an explicit dequeue. The safest approach is thus
    to always dequeue packets explicitly and forgo auto-dequeueing.
    
    Without this change, I've witnessed packet retrieval break completely
    when an SPI DMA transfer fails, requiring a chip reset. Explicit
    dequeueing magically fixes this and makes packet retrieval absolutely
    robust for me.
    
    The chip's documentation suggests auto-dequeuing and uses the RRXEF
    flag only to dequeue error frames which the driver doesn't want to
    retrieve. But that seems to be a fair-weather approach.
    Signed-off-by: default avatarLukas Wunner <lukas@wunner.de>
    Cc: Frank Pavlic <f.pavlic@kunbus.de>
    Cc: Ben Dooks <ben.dooks@codethink.co.uk>
    Cc: Tristram Ha <Tristram.Ha@microchip.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    536d3680
ks8851.c 40.1 KB