diff options
author | Wolfgang Grandegger <wg@grandegger.com> | 2016-06-13 15:44:19 +0200 |
---|---|---|
committer | Sasha Levin <sasha.levin@oracle.com> | 2016-07-10 20:20:00 -0400 |
commit | 1105110de5bac70124e63663c618cab9d4e5c3b7 (patch) | |
tree | b2c495bd4330b75d80ed03b39b20b16885a860be /drivers/net | |
parent | 293745be2931d248a1244918b2318b7cbcdda542 (diff) |
can: at91_can: RX queue could get stuck at high bus load
[ Upstream commit 43200a4480cbbe660309621817f54cbb93907108 ]
At high bus load it could happen that "at91_poll()" enters with all RX
message boxes filled up. If then at the end the "quota" is exceeded as
well, "rx_next" will not be reset to the first RX mailbox and hence the
interrupts remain disabled.
Signed-off-by: Wolfgang Grandegger <wg@grandegger.com>
Tested-by: Amr Bekhit <amrbekhit@gmail.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/can/at91_can.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/net/can/at91_can.c b/drivers/net/can/at91_can.c index f4e40aa4d2a2..35233aa5a88a 100644 --- a/drivers/net/can/at91_can.c +++ b/drivers/net/can/at91_can.c @@ -733,9 +733,10 @@ static int at91_poll_rx(struct net_device *dev, int quota) /* upper group completed, look again in lower */ if (priv->rx_next > get_mb_rx_low_last(priv) && - quota > 0 && mb > get_mb_rx_last(priv)) { + mb > get_mb_rx_last(priv)) { priv->rx_next = get_mb_rx_first(priv); - goto again; + if (quota > 0) + goto again; } return received; |