From: Wolfgang Grandegger <wg@grandegger.com>
To: Oliver Hartkopp <socketcan@hartkopp.net>,
"linux-can@vger.kernel.org" <linux-can@vger.kernel.org>
Subject: Re: [PATCH] can: fix sja1000 pre_irq/post_irq handling
Date: Sun, 17 Nov 2013 21:51:02 +0100 [thread overview]
Message-ID: <52892C36.8060709@grandegger.com> (raw)
In-Reply-To: <5288CFEF.3060701@hartkopp.net>
Hi Oliver,
On 11/17/2013 03:17 PM, Oliver Hartkopp wrote:
> The SJA1000 driver provides optional function pointers to handle specific
> hardware setups at interrupt time.
>
> This patch fixes the issue that the sja1000_interrupt() function may have
> returned IRQ_NONE without processing the post_irq function. Additionally
> an introduced return value from the pre_irq function is checked to skip the
> entire interrupt handling on pre_irq function errors.
>
> Reported-by: Wolfgang Grandegger <wg@grandegger.com>
> Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
>
> ---
>
> diff --git a/drivers/net/can/sja1000/sja1000.c b/drivers/net/can/sja1000/sja1000.c
> index 7164a99..bb20470 100644
> --- a/drivers/net/can/sja1000/sja1000.c
> +++ b/drivers/net/can/sja1000/sja1000.c
> @@ -494,12 +494,12 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id)
> uint8_t isrc, status;
> int n = 0;
>
> + if (priv->pre_irq && priv->pre_irq(priv))
> + goto out;
> +
Well, not sure if we need that. Looks like a fatal error to me.
> /* 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);
> + goto out;
>
> while ((isrc = priv->read_reg(priv, SJA1000_IR)) &&
> (n < SJA1000_MAX_IRQ)) {
> @@ -507,7 +507,7 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id)
> 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;
Be aware that the function will return IRQ_HANDLED if n > 0... which may
happen. Not exactly the same behaviour.
>
> 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;
Ditto.
> }
> }
> if (isrc & (IRQ_DOI | IRQ_EI | IRQ_BEI | IRQ_EPI | IRQ_ALI)) {
> @@ -544,7 +544,7 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id)
> break;
> }
> }
> -
> +out:
> if (priv->post_irq)
> priv->post_irq(priv);
Wolfgang.
next prev parent reply other threads:[~2013-11-17 20:51 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-17 14:17 [PATCH] can: fix sja1000 pre_irq/post_irq handling Oliver Hartkopp
2013-11-17 20:51 ` Wolfgang Grandegger [this message]
2013-11-18 6:17 ` Oliver Hartkopp
2013-11-18 7:48 ` Wolfgang Grandegger
2013-11-18 13:13 ` Oliver Hartkopp
2013-11-18 13:33 ` Wolfgang Grandegger
2013-11-18 19:48 ` Kurt Van Dijck
2013-11-18 20:04 ` Wolfgang Grandegger
2013-11-19 0:05 ` Pavel Pisa
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=52892C36.8060709@grandegger.com \
--to=wg@grandegger.com \
--cc=linux-can@vger.kernel.org \
--cc=socketcan@hartkopp.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.