]> git.baikalelectronics.ru Git - kernel.git/commit
net: macb: simplify/cleanup NAPI reschedule checking
authorRobert Hancock <robert.hancock@calian.com>
Mon, 9 May 2022 19:46:34 +0000 (13:46 -0600)
committerJakub Kicinski <kuba@kernel.org>
Wed, 11 May 2022 23:14:13 +0000 (16:14 -0700)
commita677214eb72cbb6f9b33df6e8af0950c5a3b19a1
tree0d3906225d20d7e2e172a386cccda8661abe544d
parentfacd1f0e7877baf2df3ba647cd7701b6546e0f14
net: macb: simplify/cleanup NAPI reschedule checking

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: Robert Hancock <robert.hancock@calian.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/cadence/macb_main.c