* can: fix sja1000 post_irq handling and resulting return value
@ 2013-11-21 17:03 Oliver Hartkopp
2013-11-21 17:07 ` Oliver Hartkopp
0 siblings, 1 reply; 2+ messages in thread
From: Oliver Hartkopp @ 2013-11-21 17:03 UTC (permalink / raw)
To: linux-can@vger.kernel.org; +Cc: Wolfgang Grandegger, Kurt Van Dijck
This patch fixes the issue that the sja1000_interrupt() function may have
returned IRQ_NONE without processing the optional post_irq function before.
Additionally the irq processing counter 'n' is moved to the end of the while
statement to return correct IRQ_[NONE|HANDLED] values at error conditions.
---
diff --git a/drivers/net/can/sja1000/sja1000.c b/drivers/net/can/sja1000/sja1000.c
index 7164a99..f17c301 100644
--- a/drivers/net/can/sja1000/sja1000.c
+++ b/drivers/net/can/sja1000/sja1000.c
@@ -494,20 +494,20 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id)
uint8_t isrc, status;
int n = 0;
- /* Shared interrupts and IRQ off? */
- if (priv->read_reg(priv, SJA1000_IER) == IRQ_OFF)
- return IRQ_NONE;
-
if (priv->pre_irq)
priv->pre_irq(priv);
+ /* Shared interrupts and IRQ off? */
+ if (priv->read_reg(priv, SJA1000_IER) == IRQ_OFF)
+ goto out;
+
while ((isrc = priv->read_reg(priv, SJA1000_IR)) &&
(n < SJA1000_MAX_IRQ)) {
- n++;
+
status = priv->read_reg(priv, SJA1000_SR);
/* check for absent controller due to hw unplug */
if (status == 0xFF && sja1000_is_absent(priv))
- return IRQ_NONE;
+ goto out;
if (isrc & IRQ_WUI)
netdev_warn(dev, "wakeup interrupt\n");
@@ -535,7 +535,7 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id)
status = priv->read_reg(priv, SJA1000_SR);
/* check for absent controller */
if (status == 0xFF && sja1000_is_absent(priv))
- return IRQ_NONE;
+ goto out;
}
}
if (isrc & (IRQ_DOI | IRQ_EI | IRQ_BEI | IRQ_EPI | IRQ_ALI)) {
@@ -543,8 +543,9 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id)
if (sja1000_err(dev, isrc, status))
break;
}
+ n++;
}
-
+out:
if (priv->post_irq)
priv->post_irq(priv);
^ permalink raw reply related [flat|nested] 2+ messages in thread* Re: can: fix sja1000 post_irq handling and resulting return value
2013-11-21 17:03 can: fix sja1000 post_irq handling and resulting return value Oliver Hartkopp
@ 2013-11-21 17:07 ` Oliver Hartkopp
0 siblings, 0 replies; 2+ messages in thread
From: Oliver Hartkopp @ 2013-11-21 17:07 UTC (permalink / raw)
To: linux-can@vger.kernel.org; +Cc: Wolfgang Grandegger, Kurt Van Dijck
On 21.11.2013 18:03, Oliver Hartkopp wrote:
> This patch fixes the issue that the sja1000_interrupt() function may have
> returned IRQ_NONE without processing the optional post_irq function before.
> Additionally the irq processing counter 'n' is moved to the end of the while
> statement to return correct IRQ_[NONE|HANDLED] values at error conditions.
>
Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
8-)
> ---
>
> diff --git a/drivers/net/can/sja1000/sja1000.c b/drivers/net/can/sja1000/sja1000.c
> index 7164a99..f17c301 100644
> --- a/drivers/net/can/sja1000/sja1000.c
> +++ b/drivers/net/can/sja1000/sja1000.c
> @@ -494,20 +494,20 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id)
> uint8_t isrc, status;
> int n = 0;
>
> - /* Shared interrupts and IRQ off? */
> - if (priv->read_reg(priv, SJA1000_IER) == IRQ_OFF)
> - return IRQ_NONE;
> -
> if (priv->pre_irq)
> priv->pre_irq(priv);
>
> + /* Shared interrupts and IRQ off? */
> + if (priv->read_reg(priv, SJA1000_IER) == IRQ_OFF)
> + goto out;
> +
> while ((isrc = priv->read_reg(priv, SJA1000_IR)) &&
> (n < SJA1000_MAX_IRQ)) {
> - n++;
> +
> status = priv->read_reg(priv, SJA1000_SR);
> /* check for absent controller due to hw unplug */
> if (status == 0xFF && sja1000_is_absent(priv))
> - return IRQ_NONE;
> + goto out;
>
> if (isrc & IRQ_WUI)
> netdev_warn(dev, "wakeup interrupt\n");
> @@ -535,7 +535,7 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id)
> status = priv->read_reg(priv, SJA1000_SR);
> /* check for absent controller */
> if (status == 0xFF && sja1000_is_absent(priv))
> - return IRQ_NONE;
> + goto out;
> }
> }
> if (isrc & (IRQ_DOI | IRQ_EI | IRQ_BEI | IRQ_EPI | IRQ_ALI)) {
> @@ -543,8 +543,9 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id)
> if (sja1000_err(dev, isrc, status))
> break;
> }
> + n++;
> }
> -
> +out:
> if (priv->post_irq)
> priv->post_irq(priv);
>
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-can" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2013-11-21 17:07 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-11-21 17:03 can: fix sja1000 post_irq handling and resulting return value Oliver Hartkopp
2013-11-21 17:07 ` Oliver Hartkopp
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).