From: AnilKumar Ch <anilkumar@ti.com>
To: wg@grandegger.com, mkl@pengutronix.de, linux-can@vger.kernel.org
Cc: anantgole@ti.com, nsekhar@ti.com, AnilKumar Ch <anilkumar@ti.com>
Subject: [RESEND PATCH v3 2/5] can: c_can: fix an interrupt thrash issue with c_can driver
Date: Wed, 23 May 2012 17:45:10 +0530 [thread overview]
Message-ID: <1337775313-28219-3-git-send-email-anilkumar@ti.com> (raw)
In-Reply-To: <1337775313-28219-1-git-send-email-anilkumar@ti.com>
This patch fixes an interrupt thrash issue with c_can driver.
In c_can_isr() function interrupts are disabled and enabled only in
c_can_poll() function. c_can_isr() & c_can_poll() both read the
irqstatus flag. However, irqstatus is always read as 0 in c_can_poll()
because all C_CAN interrupts are disabled in c_can_isr(). This causes
all interrupts to be re-enabled in c_can_poll() which in turn causes
another interrupt since the event is not really handled. This keeps
happening causing a flood of interrupts.
To fix this, read the irqstatus register in isr and use the same cached
value in the poll function.
Signed-off-by: AnilKumar Ch <anilkumar@ti.com>
---
Link to previous submission
http://marc.info/?t=133664994000003&r=1&w=2
drivers/net/can/c_can/c_can.c | 7 +++----
drivers/net/can/c_can/c_can.h | 1 +
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c
index 9ac28df..fa01621 100644
--- a/drivers/net/can/c_can/c_can.c
+++ b/drivers/net/can/c_can/c_can.c
@@ -952,7 +952,7 @@ static int c_can_poll(struct napi_struct *napi, int quota)
struct net_device *dev = napi->dev;
struct c_can_priv *priv = netdev_priv(dev);
- irqstatus = priv->read_reg(priv, &priv->regs->interrupt);
+ irqstatus = priv->irqstatus;
if (!irqstatus)
goto end;
@@ -1030,12 +1030,11 @@ end:
static irqreturn_t c_can_isr(int irq, void *dev_id)
{
- u16 irqstatus;
struct net_device *dev = (struct net_device *)dev_id;
struct c_can_priv *priv = netdev_priv(dev);
- irqstatus = priv->read_reg(priv, &priv->regs->interrupt);
- if (!irqstatus)
+ priv->irqstatus = priv->read_reg(priv, &priv->regs->interrupt);
+ if (!priv->irqstatus)
return IRQ_NONE;
/* disable all interrupts and schedule the NAPI */
diff --git a/drivers/net/can/c_can/c_can.h b/drivers/net/can/c_can/c_can.h
index 9b7fbef..5f32d34 100644
--- a/drivers/net/can/c_can/c_can.h
+++ b/drivers/net/can/c_can/c_can.h
@@ -76,6 +76,7 @@ struct c_can_priv {
unsigned int tx_next;
unsigned int tx_echo;
void *priv; /* for board-specific data */
+ u16 irqstatus;
};
struct net_device *alloc_c_can_dev(void);
--
1.7.0.4
next prev parent reply other threads:[~2012-05-23 12:15 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-05-23 12:15 [PATCH v4 0/5] can: c_can: Add support for Bosch D_CAN controller AnilKumar Ch
2012-05-23 12:15 ` [RESEND PATCH v3 1/5] can: c_can: fix "BUG! echo_skb is occupied!" during transmit AnilKumar Ch
2012-05-23 12:15 ` AnilKumar Ch [this message]
2012-05-23 12:15 ` [RESEND PATCH v3 3/5] can: c_can: fix race condition in c_can_open() AnilKumar Ch
2012-05-23 12:15 ` [PATCH v4 4/5] can: c_can: Move overlay structure to array with offset as index AnilKumar Ch
2012-05-23 12:15 ` [RESEND PATCH v3 5/5] can: c_can: Add support for Bosch D_CAN controller AnilKumar Ch
2012-05-23 19:49 ` Wolfgang Grandegger
2012-05-23 20:35 ` Wolfgang Grandegger
2012-05-23 20:39 ` Marc Kleine-Budde
2012-05-24 7:01 ` Wolfgang Grandegger
2012-05-24 7:18 ` Marc Kleine-Budde
2012-05-24 8:20 ` [PATCH v4 0/5] " Marc Kleine-Budde
2012-05-24 8:25 ` Wolfgang Grandegger
2012-05-24 8:28 ` Marc Kleine-Budde
2012-05-29 5:38 ` AnilKumar, Chimata
-- strict thread matches above, loose matches on Subject: below --
2012-05-23 9:36 [RESEND PATCH v3 " AnilKumar Ch
2012-05-23 9:36 ` [RESEND PATCH v3 2/5] can: c_can: fix an interrupt thrash issue with c_can driver AnilKumar Ch
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=1337775313-28219-3-git-send-email-anilkumar@ti.com \
--to=anilkumar@ti.com \
--cc=anantgole@ti.com \
--cc=linux-can@vger.kernel.org \
--cc=mkl@pengutronix.de \
--cc=nsekhar@ti.com \
--cc=wg@grandegger.com \
/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.