* [PATCH v3 net-next 1/1] drivers: net: davinci_cpdma: acknowledge interrupt properly
@ 2013-02-18 8:19 Mugunthan V N
2013-02-18 19:52 ` David Miller
2013-03-13 9:34 ` Mark Jackson
0 siblings, 2 replies; 5+ messages in thread
From: Mugunthan V N @ 2013-02-18 8:19 UTC (permalink / raw)
To: linux-arm-kernel
CPDMA interrupts are not properly acknowledged which leads to interrupt
storm, only cpdma interrupt 0 is acknowledged in Davinci CPDMA driver.
Changed cpdma_ctlr_eoi api to acknowledge 1 and 2 interrupts which are
used for rx and tx respectively.
Reported-by: Pantelis Antoniou <panto@antoniou-consulting.com>
Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
---
Changes from v2:
* Changed the hardware register values from enumeration to defines
drivers/net/ethernet/ti/cpsw.c | 25 ++++++++++++++++---------
drivers/net/ethernet/ti/davinci_cpdma.c | 4 ++--
drivers/net/ethernet/ti/davinci_cpdma.h | 7 ++++++-
3 files changed, 24 insertions(+), 12 deletions(-)
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c
index 4ceed6e..7e93df6 100644
--- a/drivers/net/ethernet/ti/cpsw.c
+++ b/drivers/net/ethernet/ti/cpsw.c
@@ -510,19 +510,21 @@ static int cpsw_poll(struct napi_struct *napi, int budget)
int num_tx, num_rx;
num_tx = cpdma_chan_process(priv->txch, 128);
- num_rx = cpdma_chan_process(priv->rxch, budget);
-
- if (num_rx || num_tx)
- cpsw_dbg(priv, intr, "poll %d rx, %d tx pkts\n",
- num_rx, num_tx);
+ if (num_tx)
+ cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX);
+ num_rx = cpdma_chan_process(priv->rxch, budget);
if (num_rx < budget) {
napi_complete(napi);
cpsw_intr_enable(priv);
- cpdma_ctlr_eoi(priv->dma);
+ cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_RX);
cpsw_enable_irq(priv);
}
+ if (num_rx || num_tx)
+ cpsw_dbg(priv, intr, "poll %d rx, %d tx pkts\n",
+ num_rx, num_tx);
+
return num_rx;
}
@@ -835,7 +837,8 @@ static int cpsw_ndo_open(struct net_device *ndev)
cpdma_ctlr_start(priv->dma);
cpsw_intr_enable(priv);
napi_enable(&priv->napi);
- cpdma_ctlr_eoi(priv->dma);
+ cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_RX);
+ cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX);
if (priv->data.dual_emac)
priv->slaves[priv->emac_port].open_stat = true;
@@ -1075,7 +1078,9 @@ static void cpsw_ndo_tx_timeout(struct net_device *ndev)
cpdma_chan_start(priv->txch);
cpdma_ctlr_int_ctrl(priv->dma, true);
cpsw_intr_enable(priv);
- cpdma_ctlr_eoi(priv->dma);
+ cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_RX);
+ cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX);
+
}
static struct net_device_stats *cpsw_ndo_get_stats(struct net_device *ndev)
@@ -1094,7 +1099,9 @@ static void cpsw_ndo_poll_controller(struct net_device *ndev)
cpsw_interrupt(ndev->irq, priv);
cpdma_ctlr_int_ctrl(priv->dma, true);
cpsw_intr_enable(priv);
- cpdma_ctlr_eoi(priv->dma);
+ cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_RX);
+ cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX);
+
}
#endif
diff --git a/drivers/net/ethernet/ti/davinci_cpdma.c b/drivers/net/ethernet/ti/davinci_cpdma.c
index 7d3bffd..68c3418 100644
--- a/drivers/net/ethernet/ti/davinci_cpdma.c
+++ b/drivers/net/ethernet/ti/davinci_cpdma.c
@@ -493,9 +493,9 @@ int cpdma_ctlr_int_ctrl(struct cpdma_ctlr *ctlr, bool enable)
return 0;
}
-void cpdma_ctlr_eoi(struct cpdma_ctlr *ctlr)
+void cpdma_ctlr_eoi(struct cpdma_ctlr *ctlr, u32 value)
{
- dma_reg_write(ctlr, CPDMA_MACEOIVECTOR, 0);
+ dma_reg_write(ctlr, CPDMA_MACEOIVECTOR, value);
}
struct cpdma_chan *cpdma_chan_create(struct cpdma_ctlr *ctlr, int chan_num,
diff --git a/drivers/net/ethernet/ti/davinci_cpdma.h b/drivers/net/ethernet/ti/davinci_cpdma.h
index a97d6ab..d9bcc60 100644
--- a/drivers/net/ethernet/ti/davinci_cpdma.h
+++ b/drivers/net/ethernet/ti/davinci_cpdma.h
@@ -26,6 +26,11 @@
#define CPDMA_RX_SOURCE_PORT(__status__) ((__status__ >> 16) & 0x7)
+#define CPDMA_EOI_RX_THRESH 0x0
+#define CPDMA_EOI_RX 0x1
+#define CPDMA_EOI_TX 0x2
+#define CPDMA_EOI_MISC 0x3
+
struct cpdma_params {
struct device *dev;
void __iomem *dmaregs;
@@ -88,7 +93,7 @@ int cpdma_chan_submit(struct cpdma_chan *chan, void *token, void *data,
int cpdma_chan_process(struct cpdma_chan *chan, int quota);
int cpdma_ctlr_int_ctrl(struct cpdma_ctlr *ctlr, bool enable);
-void cpdma_ctlr_eoi(struct cpdma_ctlr *ctlr);
+void cpdma_ctlr_eoi(struct cpdma_ctlr *ctlr, u32 value);
int cpdma_chan_int_ctrl(struct cpdma_chan *chan, bool enable);
bool cpdma_check_free_tx_desc(struct cpdma_chan *chan);
--
1.7.9.5
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v3 net-next 1/1] drivers: net: davinci_cpdma: acknowledge interrupt properly
2013-02-18 8:19 [PATCH v3 net-next 1/1] drivers: net: davinci_cpdma: acknowledge interrupt properly Mugunthan V N
@ 2013-02-18 19:52 ` David Miller
2013-03-13 9:34 ` Mark Jackson
1 sibling, 0 replies; 5+ messages in thread
From: David Miller @ 2013-02-18 19:52 UTC (permalink / raw)
To: linux-arm-kernel
From: Mugunthan V N <mugunthanvnm@ti.com>
Date: Mon, 18 Feb 2013 13:49:20 +0530
> CPDMA interrupts are not properly acknowledged which leads to interrupt
> storm, only cpdma interrupt 0 is acknowledged in Davinci CPDMA driver.
> Changed cpdma_ctlr_eoi api to acknowledge 1 and 2 interrupts which are
> used for rx and tx respectively.
>
> Reported-by: Pantelis Antoniou <panto@antoniou-consulting.com>
> Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
Applied, thanks.
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v3 net-next 1/1] drivers: net: davinci_cpdma: acknowledge interrupt properly
2013-02-18 8:19 [PATCH v3 net-next 1/1] drivers: net: davinci_cpdma: acknowledge interrupt properly Mugunthan V N
2013-02-18 19:52 ` David Miller
@ 2013-03-13 9:34 ` Mark Jackson
2013-03-14 10:21 ` Mugunthan V N
1 sibling, 1 reply; 5+ messages in thread
From: Mark Jackson @ 2013-03-13 9:34 UTC (permalink / raw)
To: linux-arm-kernel
On 18/02/13 08:19, Mugunthan V N wrote:
> CPDMA interrupts are not properly acknowledged which leads to interrupt
> storm, only cpdma interrupt 0 is acknowledged in Davinci CPDMA driver.
> Changed cpdma_ctlr_eoi api to acknowledge 1 and 2 interrupts which are
> used for rx and tx respectively.
>
> Reported-by: Pantelis Antoniou <panto@antoniou-consulting.com>
> Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
Not sure if I'm seeing this same problem [1], but it doesn't appear fixed to me.
I've tried both mainline -rc2 and -next.
[1] https://lkml.org/lkml/2013/3/12/376
Regards
Mark J.
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v3 net-next 1/1] drivers: net: davinci_cpdma: acknowledge interrupt properly
2013-03-13 9:34 ` Mark Jackson
@ 2013-03-14 10:21 ` Mugunthan V N
2013-03-14 10:27 ` Mark Jackson
0 siblings, 1 reply; 5+ messages in thread
From: Mugunthan V N @ 2013-03-14 10:21 UTC (permalink / raw)
To: linux-arm-kernel
On 3/13/2013 3:04 PM, Mark Jackson wrote:
> On 18/02/13 08:19, Mugunthan V N wrote:
>> >CPDMA interrupts are not properly acknowledged which leads to interrupt
>> >storm, only cpdma interrupt 0 is acknowledged in Davinci CPDMA driver.
>> >Changed cpdma_ctlr_eoi api to acknowledge 1 and 2 interrupts which are
>> >used for rx and tx respectively.
>> >
>> >Reported-by: Pantelis Antoniou<panto@antoniou-consulting.com>
>> >Signed-off-by: Mugunthan V N<mugunthanvnm@ti.com>
> Not sure if I'm seeing this same problem [1], but it doesn't appear fixed to me.
>
> I've tried both mainline -rc2 and -next.
>
> [1]https://lkml.org/lkml/2013/3/12/376
Without this patch, PG2.0 was not usable as CPSW interrupt was never acked
and CPU spent most of the time in CPSW ISR.
I have checked -rc2 and it is working fine.
Regards
Mugunthan V N
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v3 net-next 1/1] drivers: net: davinci_cpdma: acknowledge interrupt properly
2013-03-14 10:21 ` Mugunthan V N
@ 2013-03-14 10:27 ` Mark Jackson
0 siblings, 0 replies; 5+ messages in thread
From: Mark Jackson @ 2013-03-14 10:27 UTC (permalink / raw)
To: linux-arm-kernel
On 14/03/13 10:21, Mugunthan V N wrote:
> On 3/13/2013 3:04 PM, Mark Jackson wrote:
>> On 18/02/13 08:19, Mugunthan V N wrote:
>>> >CPDMA interrupts are not properly acknowledged which leads to interrupt
>>> >storm, only cpdma interrupt 0 is acknowledged in Davinci CPDMA driver.
>>> >Changed cpdma_ctlr_eoi api to acknowledge 1 and 2 interrupts which are
>>> >used for rx and tx respectively.
>>> >
>>> >Reported-by: Pantelis Antoniou<panto@antoniou-consulting.com>
>>> >Signed-off-by: Mugunthan V N<mugunthanvnm@ti.com>
>> Not sure if I'm seeing this same problem [1], but it doesn't appear fixed to me.
>>
>> I've tried both mainline -rc2 and -next.
>>
>> [1]https://lkml.org/lkml/2013/3/12/376
> Without this patch, PG2.0 was not usable as CPSW interrupt was never acked
> and CPU spent most of the time in CPSW ISR.
>
> I have checked -rc2 and it is working fine.
I needed to add patch [1] to fix my problem. See thread [2].
[1] https://git.kernel.org/cgit/linux/kernel/git/davem/net.git/commit/?id=d35162f89b8f00537d7b240b76d2d0e8b8d29aa0
[2] https://lkml.org/lkml/2013/3/13/146
Cheers
Mark J.
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2013-03-14 10:27 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-02-18 8:19 [PATCH v3 net-next 1/1] drivers: net: davinci_cpdma: acknowledge interrupt properly Mugunthan V N
2013-02-18 19:52 ` David Miller
2013-03-13 9:34 ` Mark Jackson
2013-03-14 10:21 ` Mugunthan V N
2013-03-14 10:27 ` Mark Jackson
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).