From: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
To: Yoshihiro Kaneko <ykaneko0929@gmail.com>, netdev@vger.kernel.org
Cc: "David S. Miller" <davem@davemloft.net>,
Simon Horman <horms@verge.net.au>,
Magnus Damm <magnus.damm@gmail.com>,
linux-renesas-soc@vger.kernel.org, linux-sh@vger.kernel.org
Subject: Re: [PATCH/RFC v5 net-next] ravb: Add dma queue interrupt support
Date: Sun, 21 Feb 2016 19:05:12 +0000 [thread overview]
Message-ID: <56CA0A68.2020709@cogentembedded.com> (raw)
In-Reply-To: <1455478769-16084-1-git-send-email-ykaneko0929@gmail.com>
On 02/14/2016 10:39 PM, Yoshihiro Kaneko wrote:
> From: Kazuya Mizuguchi <kazuya.mizuguchi.ks@renesas.com>
>
> This patch supports the following interrupts.
>
> - One interrupt for multiple (error, gPTP)
> - One interrupt for emac
> - Four interrupts for dma queue (best effort rx/tx, network control rx/tx)
>
> This patch improve efficiency of the interrupt handler by adding the
> interrupt handler corresponding to each interrupt source described
> above. Additionally, it reduces the number of times of the access to
> EthernetAVB IF.
> Also this patch prevent this driver depends on the whim of a boot loader.
>
> [ykaneko0929@gmail.com: define bit names of registers]
> [ykaneko0929@gmail.com: add comment for gen3 only registers]
> [ykaneko0929@gmail.com: fix coding style]
> [ykaneko0929@gmail.com: update changelog]
> [ykaneko0929@gmail.com: gen3: fix initialization of interrupts]
> [ykaneko0929@gmail.com: gen3: fix clearing interrupts]
> [ykaneko0929@gmail.com: gen3: add helper function for request_irq()]
> [ykaneko0929@gmail.com: revert ravb_close() and ravb_ptp_stop()]
> [ykaneko0929@gmail.com: avoid calling free_irq() to non-hooked interrupts]
> [ykaneko0929@gmail.com: make NC/BE interrupt handler a function]
> Signed-off-by: Kazuya Mizuguchi <kazuya.mizuguchi.ks@renesas.com>
> Signed-off-by: Yoshihiro Kaneko <ykaneko0929@gmail.com>
[...]
> diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c
> index c936682..1bec71e 100644
> --- a/drivers/net/ethernet/renesas/ravb_main.c
> +++ b/drivers/net/ethernet/renesas/ravb_main.c
[...]
> @@ -697,6 +726,39 @@ static void ravb_error_interrupt(struct net_device *ndev)
> }
> }
>
> +static int ravb_nc_be_interrupt(struct net_device *ndev, int ravb_queue,
I'd call this function e.g. ravb_queue_interrupt(). And make it return
'bool' or even 'irqreturn_t' directly. And I'd suggest a shorter name for the
'ravb_queue' parameter, like 'queue' or even 'q'...
> + u32 ris0, u32 *ric0, u32 tis, u32 *tic)
You don't seem to need 'ric0' and 'tic' past the call sites, so no real
need to pass them by reference.
[...]
> @@ -725,31 +787,15 @@ static irqreturn_t ravb_interrupt(int irq, void *dev_id)
>
> /* Network control and best effort queue RX/TX */
> for (q = RAVB_NC; q >= RAVB_BE; q--) {
> - if (((ris0 & ric0) & BIT(q)) ||
> - ((tis & tic) & BIT(q))) {
> - if (napi_schedule_prep(&priv->napi[q])) {
> - /* Mask RX and TX interrupts */
> - ric0 &= ~BIT(q);
> - tic &= ~BIT(q);
> - ravb_write(ndev, ric0, RIC0);
> - ravb_write(ndev, tic, TIC);
> - __napi_schedule(&priv->napi[q]);
> - } else {
> - netdev_warn(ndev,
> - "ignoring interrupt, rx status 0x%08x, rx mask 0x%08x,\n",
> - ris0, ric0);
> - netdev_warn(ndev,
> - " tx status 0x%08x, tx mask 0x%08x.\n",
> - tis, tic);
> - }
> + if (ravb_nc_be_interrupt(ndev, q, ris0, &ric0, tis,
> + &tic))
> result = IRQ_HANDLED;
> - }
> }
Unroll this *for* loop please...
> }
[...]
> @@ -767,6 +813,73 @@ static irqreturn_t ravb_interrupt(int irq, void *dev_id)
> return result;
> }
>
> +/* Descriptor IRQ/Error/Management interrupt handler */
You don't handle the descriptor interrupt, do you?
> +static irqreturn_t ravb_multi_interrupt(int irq, void *dev_id)
[...]
> +static irqreturn_t ravb_dmaq_interrupt(int irq, void *dev_id, int ravb_queue)
Perhaps, ravb_rx_tx_interrupt()?
> +{
> + struct net_device *ndev = dev_id;
> + struct ravb_private *priv = netdev_priv(ndev);
> + irqreturn_t result = IRQ_NONE;
> + u32 ris0, ric0, tis, tic;
> +
> + spin_lock(&priv->lock);
> +
> + ris0 = ravb_read(ndev, RIS0);
> + ric0 = ravb_read(ndev, RIC0);
> + tis = ravb_read(ndev, TIS);
> + tic = ravb_read(ndev, TIC);
> +
> + /* Timestamp updated */
> + if (tis & TIS_TFUF) {
> + ravb_write(ndev, ~TIS_TFUF, TIS);
> + ravb_get_tx_tstamp(ndev);
> + result = IRQ_HANDLED;
> + }
Hm, why this interrupt is handled here? It has no relation to the TX
queues; the manual says it belongs to group 2 (management related interrupts),
and should probably be routed to ch22. Sorry for not noticing this before...
[...]
> @@ -1208,29 +1326,66 @@ static const struct ethtool_ops ravb_ethtool_ops = {
[...]
> @@ -1257,8 +1412,17 @@ out_ptp_stop:
> if (priv->chip_id = RCAR_GEN2)
> ravb_ptp_stop(ndev);
> out_free_irq2:
Rename to 'out_free_irq_nc_tx' please.
> - if (priv->chip_id = RCAR_GEN3)
> - free_irq(priv->emac_irq, ndev);
> + if (priv->chip_id = RCAR_GEN2)
> + goto out_free_irq;
> + free_irq(priv->tx_irqs[RAVB_NC], ndev);
> +out_free_irq_nc_rx:
> + free_irq(priv->rx_irqs[RAVB_NC], ndev);
> +out_free_irq_be_tx:
> + free_irq(priv->tx_irqs[RAVB_BE], ndev);
> +out_free_irq_be_rx:
> + free_irq(priv->rx_irqs[RAVB_BE], ndev);
> +out_free_irq_emac:
> + free_irq(priv->emac_irq, ndev);
> out_free_irq:
> free_irq(ndev->irq, ndev);
> out_napi_off:
Seems correct now, thanks.
[...]
> diff --git a/drivers/net/ethernet/renesas/ravb_ptp.c b/drivers/net/ethernet/renesas/ravb_ptp.c
> index 57992cc..7cb1cc4 100644
> --- a/drivers/net/ethernet/renesas/ravb_ptp.c
> +++ b/drivers/net/ethernet/renesas/ravb_ptp.c
> @@ -194,7 +194,14 @@ static int ravb_ptp_extts(struct ptp_clock_info *ptp,
> priv->ptp.extts[req->index] = on;
>
> spin_lock_irqsave(&priv->lock, flags);
> - ravb_modify(ndev, GIC, GIC_PTCE, on ? GIC_PTCE : 0);
> + if (priv->chip_id = RCAR_GEN2) {
> + ravb_modify(ndev, GIC, GIC_PTCE, on ? GIC_PTCE : 0);
> + } else {
> + if (on)
Could be folded into one line with one less tab for the indentation below
and no {} whatsoever...
> + ravb_write(ndev, GIE_PTCS, GIE);
> + else
> + ravb_write(ndev, GID_PTCD, GID);
> + }
> mmiowb();
> spin_unlock_irqrestore(&priv->lock, flags);
>
[...]
MBR, Sergei
next prev parent reply other threads:[~2016-02-21 19:05 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-02-14 19:39 [PATCH/RFC v5 net-next] ravb: Add dma queue interrupt support Yoshihiro Kaneko
2016-02-21 19:05 ` Sergei Shtylyov [this message]
2016-02-28 14:13 ` Yoshihiro Kaneko
2016-02-29 20:55 ` Sergei Shtylyov
2016-03-02 18:32 ` Yoshihiro Kaneko
2016-03-02 18:42 ` Sergei Shtylyov
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=56CA0A68.2020709@cogentembedded.com \
--to=sergei.shtylyov@cogentembedded.com \
--cc=davem@davemloft.net \
--cc=horms@verge.net.au \
--cc=linux-renesas-soc@vger.kernel.org \
--cc=linux-sh@vger.kernel.org \
--cc=magnus.damm@gmail.com \
--cc=netdev@vger.kernel.org \
--cc=ykaneko0929@gmail.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).