| From 43200a4480cbbe660309621817f54cbb93907108 Mon Sep 17 00:00:00 2001 |
| From: Wolfgang Grandegger <wg@grandegger.com> |
| Date: Mon, 13 Jun 2016 15:44:19 +0200 |
| Subject: can: at91_can: RX queue could get stuck at high bus load |
| |
| From: Wolfgang Grandegger <wg@grandegger.com> |
| |
| commit 43200a4480cbbe660309621817f54cbb93907108 upstream. |
| |
| 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> |
| Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/net/can/at91_can.c | 5 +++-- |
| 1 file changed, 3 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/net/can/at91_can.c |
| +++ b/drivers/net/can/at91_can.c |
| @@ -712,9 +712,10 @@ static int at91_poll_rx(struct net_devic |
| |
| /* 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; |