• Robert Hancock's avatar
    net: macb: simplify/cleanup NAPI reschedule checking · 1900e30d
    Robert Hancock authored
    
    
    Previously the macb_poll method was checking the RSR register after
    completing its RX receive work to see if additional packets had been
    received since IRQs were disabled, since this controller does not
    maintain the pending IRQ status across IRQ disable. It also had to
    double-check the register after re-enabling IRQs to detect if packets
    were received after the first check but before IRQs were enabled.
    
    Using the RSR register for this purpose is problematic since it reflects
    the global device state rather than the per-queue state, so if packets
    are being received on multiple queues it may end up retriggering receive
    on a queue where the packets did not actually arrive and not on the one
    where they did arrive. This will also cause problems with an upcoming
    change to use NAPI for the TX path where use of multiple queues is more
    likely.
    
    Add a macb_rx_pending function to check the RX ring to see if more
    packets have arrived in the queue, and use that to check if NAPI should
    be rescheduled rather than the RSR register. By doing this, we can just
    ignore the global RSR register entirely, and thus save some extra device
    register accesses at the same time.
    
    This also makes the previous first check for pending packets rather
    redundant, since it would be checking the RX ring state which was just
    checked in the receive work function. Therefore we can get rid of it and
    just check after enabling interrupts whether packets are already
    pending.
    Signed-off-by: default avatarRobert Hancock <robert.hancock@calian.com>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    1900e30d
macb_main.c 131 KB