| From 7cecd9ab80f43972c056dc068338f7bcc407b71c Mon Sep 17 00:00:00 2001 |
| From: Mirza Krak <mirza.krak@hostmobility.com> |
| Date: Tue, 10 Nov 2015 14:59:34 +0100 |
| Subject: can: sja1000: clear interrupts on start |
| |
| From: Mirza Krak <mirza.krak@hostmobility.com> |
| |
| commit 7cecd9ab80f43972c056dc068338f7bcc407b71c upstream. |
| |
| According to SJA1000 data sheet error-warning (EI) interrupt is not |
| cleared by setting the controller in to reset-mode. |
| |
| Then if we have the following case: |
| - system is suspended (echo mem > /sys/power/state) and SJA1000 is left |
| in operating state |
| - A bus error condition occurs which activates EI interrupt, system is |
| still suspended which means EI interrupt will be not be handled nor |
| cleared. |
| |
| If the above two events occur, on resume there is no way to return the |
| SJA1000 to operating state, except to cycle power to it. |
| |
| By simply reading the IR register on start we will clear any previous |
| conditions that could be present. |
| |
| Signed-off-by: Mirza Krak <mirza.krak@hostmobility.com> |
| Reported-by: Christian Magnusson <Christian.Magnusson@semcon.com> |
| Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/net/can/sja1000/sja1000.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| --- a/drivers/net/can/sja1000/sja1000.c |
| +++ b/drivers/net/can/sja1000/sja1000.c |
| @@ -184,6 +184,9 @@ static void sja1000_start(struct net_dev |
| priv->write_reg(priv, SJA1000_RXERR, 0x0); |
| priv->read_reg(priv, SJA1000_ECC); |
| |
| + /* clear interrupt flags */ |
| + priv->read_reg(priv, SJA1000_IR); |
| + |
| /* leave reset mode */ |
| set_normal_mode(dev); |
| } |