From: Marc Kleine-Budde <mkl@pengutronix.de>
To: "qiang.zhao@freescale.com" <qiang.zhao@freescale.com>,
"linuxppc-dev@lists.ozlabs.org" <linuxppc-dev@lists.ozlabs.org>,
"linux-can@vger.kernel.org" <linux-can@vger.kernel.org>,
"wg@grandegger.com" <wg@grandegger.com>,
Scott Wood <scottwood@freescale.com>
Subject: Re: [PATCH v3 1/2] flexcan: add err_irq handler for flexcan
Date: Mon, 23 Jun 2014 09:37:18 +0200 [thread overview]
Message-ID: <53A7D92E.4060708@pengutronix.de> (raw)
In-Reply-To: <d7e8cae0bc584530bedc8febf5476fcf@BLUPR03MB341.namprd03.prod.outlook.com>
[-- Attachment #1: Type: text/plain, Size: 2901 bytes --]
On 06/23/2014 09:26 AM, qiang.zhao@freescale.com wrote:
>
> On 06/23/2014 03:18 PM, Marc Kleine-Budde wrote:
>
>>
>> On 06/23/2014 09:11 AM, Zhao Qiang wrote:
>>> when flexcan is not physically linked, command 'cantest' will trigger
>>> an err_irq, add err_irq handler for it.
>>>
>>> Signed-off-by: Zhao Qiang <B45475@freescale.com>
>>> ---
>>> Changes for v2:
>>> - use a space instead of tab
>>> - use flexcan_poll_state instead of print Changes for v3:
>>> - return IRQ_HANDLED if err is triggered
>>> - stop transmitted packets when there is an err_interrupt
>>>
>>> drivers/net/can/flexcan.c | 35 ++++++++++++++++++++++++++++++++++-
>>> 1 file changed, 34 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c
>>> index f425ec2..6802a25 100644
>>> --- a/drivers/net/can/flexcan.c
>>> +++ b/drivers/net/can/flexcan.c
>>> @@ -208,6 +208,7 @@ struct flexcan_priv {
>>> void __iomem *base;
>>> u32 reg_esr;
>>> u32 reg_ctrl_default;
>>> + unsigned int err_irq;
>>>
>>> struct clk *clk_ipg;
>>> struct clk *clk_per;
>>> @@ -744,6 +745,24 @@ static irqreturn_t flexcan_irq(int irq, void
>> *dev_id)
>>> return IRQ_HANDLED;
>>> }
>>>
>>> +static irqreturn_t flexcan_err_irq(int irq, void *dev_id) {
>>> + struct net_device *dev = dev_id;
>>> + struct flexcan_priv *priv = netdev_priv(dev);
>>> + struct flexcan_regs __iomem *regs = priv->base;
>>> + u32 reg_ctrl, reg_esr;
>>> +
>>> + reg_esr = flexcan_read(®s->esr);
>>> + reg_ctrl = flexcan_read(®s->ctrl);
>>> + if (reg_esr & FLEXCAN_ESR_TX_WRN) {
>>
>> When does the hardware trigger the interrupt?
>
> When there is no wire link between tx and rx, tx start transfer and doesn’t get the ack.
You are testing for the warning interrupt, not for the
FLEXCAN_ESR_ACK_ERR (which is triggered there isn't any ACK).
>>> + flexcan_write(reg_esr & ~FLEXCAN_ESR_TX_WRN, ®s->esr);
>>> + flexcan_write(reg_ctrl & ~FLEXCAN_CTRL_ERR_MSK, ®s->ctrl);
>>> + netif_stop_queue(dev);
>>
>> Why are you stopping the txqueue?
>
> There is no wire link, tx can't transfer successfully.
You are testing for the warning interrupt, which is triggered if the
error counter increases from 95 to 96. And the error counter can
increase due to several reasons. No link is only one of them. If the CAN
core cannot transmit new packages any more the flow control in the
driver will take care.
What about calling the normal interrupt if er err_irq occurs, as this
function will take care of both normal and error interrupts anyway?
Marc
--
Pengutronix e.K. | Marc Kleine-Budde |
Industrial Linux Solutions | Phone: +49-231-2826-924 |
Vertretung West/Dortmund | Fax: +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686 | http://www.pengutronix.de |
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 242 bytes --]
next prev parent reply other threads:[~2014-06-23 7:37 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-23 7:11 [PATCH v3 1/2] flexcan: add err_irq handler for flexcan Zhao Qiang
2014-06-23 7:11 ` [PATCH v3 2/2] flexcan: add err interrupt for p1010rdb Zhao Qiang
2014-06-23 7:17 ` [PATCH v3 1/2] flexcan: add err_irq handler for flexcan Marc Kleine-Budde
2014-06-23 7:26 ` qiang.zhao
2014-06-23 7:37 ` Marc Kleine-Budde [this message]
2014-06-23 8:15 ` qiang.zhao
2014-06-23 8:31 ` Marc Kleine-Budde
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=53A7D92E.4060708@pengutronix.de \
--to=mkl@pengutronix.de \
--cc=linux-can@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=qiang.zhao@freescale.com \
--cc=scottwood@freescale.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 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).