Skip to content

Commit 84ea9c0

Browse files
grygoriySdavem330
authored andcommitted
net: ethernet: ti: cpsw: enable cpts irq
The CPSW misc IRQ need be enabled for CPTS event_pend IRQs processing. This patch adds corresponding support to CPSW driver. Signed-off-by: Grygorii Strashko <[email protected]> Acked-by: Richard Cochran <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent b78aba4 commit 84ea9c0

File tree

4 files changed

+55
-0
lines changed

4 files changed

+55
-0
lines changed

drivers/net/ethernet/ti/cpsw.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1569,6 +1569,12 @@ static int cpsw_probe(struct platform_device *pdev)
15691569
return irq;
15701570
cpsw->irqs_table[1] = irq;
15711571

1572+
/* get misc irq*/
1573+
irq = platform_get_irq(pdev, 3);
1574+
if (irq <= 0)
1575+
return irq;
1576+
cpsw->misc_irq = irq;
1577+
15721578
/*
15731579
* This may be required here for child devices.
15741580
*/
@@ -1703,6 +1709,21 @@ static int cpsw_probe(struct platform_device *pdev)
17031709
goto clean_unregister_netdev_ret;
17041710
}
17051711

1712+
if (!cpsw->cpts)
1713+
goto skip_cpts;
1714+
1715+
ret = devm_request_irq(&pdev->dev, cpsw->misc_irq, cpsw_misc_interrupt,
1716+
0, dev_name(&pdev->dev), cpsw);
1717+
if (ret < 0) {
1718+
dev_err(dev, "error attaching misc irq (%d)\n", ret);
1719+
goto clean_unregister_netdev_ret;
1720+
}
1721+
1722+
/* Enable misc CPTS evnt_pend IRQ */
1723+
cpts_set_irqpoll(cpsw->cpts, false);
1724+
writel(0x10, &cpsw->wr_regs->misc_en);
1725+
1726+
skip_cpts:
17061727
cpsw_notice(priv, probe,
17071728
"initialized device (regs %pa, irq %d, pool size %d)\n",
17081729
&ss_res->start, cpsw->irqs_table[0], descs_pool_size);

drivers/net/ethernet/ti/cpsw_new.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1896,6 +1896,11 @@ static int cpsw_probe(struct platform_device *pdev)
18961896
return irq;
18971897
cpsw->irqs_table[1] = irq;
18981898

1899+
irq = platform_get_irq_byname(pdev, "misc");
1900+
if (irq <= 0)
1901+
return irq;
1902+
cpsw->misc_irq = irq;
1903+
18991904
platform_set_drvdata(pdev, cpsw);
19001905
/* This may be required here for child devices. */
19011906
pm_runtime_enable(dev);
@@ -1975,6 +1980,21 @@ static int cpsw_probe(struct platform_device *pdev)
19751980
goto clean_unregister_netdev;
19761981
}
19771982

1983+
if (!cpsw->cpts)
1984+
goto skip_cpts;
1985+
1986+
ret = devm_request_irq(dev, cpsw->misc_irq, cpsw_misc_interrupt,
1987+
0, dev_name(&pdev->dev), cpsw);
1988+
if (ret < 0) {
1989+
dev_err(dev, "error attaching misc irq (%d)\n", ret);
1990+
goto clean_unregister_netdev;
1991+
}
1992+
1993+
/* Enable misc CPTS evnt_pend IRQ */
1994+
cpts_set_irqpoll(cpsw->cpts, false);
1995+
writel(0x10, &cpsw->wr_regs->misc_en);
1996+
1997+
skip_cpts:
19781998
ret = cpsw_register_notifiers(cpsw);
19791999
if (ret)
19802000
goto clean_unregister_netdev;

drivers/net/ethernet/ti/cpsw_priv.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,18 @@ irqreturn_t cpsw_rx_interrupt(int irq, void *dev_id)
114114
return IRQ_HANDLED;
115115
}
116116

117+
irqreturn_t cpsw_misc_interrupt(int irq, void *dev_id)
118+
{
119+
struct cpsw_common *cpsw = dev_id;
120+
121+
writel(0, &cpsw->wr_regs->misc_en);
122+
cpdma_ctlr_eoi(cpsw->dma, CPDMA_EOI_MISC);
123+
cpts_misc_interrupt(cpsw->cpts);
124+
writel(0x10, &cpsw->wr_regs->misc_en);
125+
126+
return IRQ_HANDLED;
127+
}
128+
117129
int cpsw_tx_mq_poll(struct napi_struct *napi_tx, int budget)
118130
{
119131
struct cpsw_common *cpsw = napi_to_cpsw(napi_tx);

drivers/net/ethernet/ti/cpsw_priv.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,7 @@ struct cpsw_common {
350350
bool rx_irq_disabled;
351351
bool tx_irq_disabled;
352352
u32 irqs_table[IRQ_NUM];
353+
int misc_irq;
353354
struct cpts *cpts;
354355
struct devlink *devlink;
355356
int rx_ch_num, tx_ch_num;
@@ -442,6 +443,7 @@ int cpsw_run_xdp(struct cpsw_priv *priv, int ch, struct xdp_buff *xdp,
442443
struct page *page, int port);
443444
irqreturn_t cpsw_tx_interrupt(int irq, void *dev_id);
444445
irqreturn_t cpsw_rx_interrupt(int irq, void *dev_id);
446+
irqreturn_t cpsw_misc_interrupt(int irq, void *dev_id);
445447
int cpsw_tx_mq_poll(struct napi_struct *napi_tx, int budget);
446448
int cpsw_tx_poll(struct napi_struct *napi_tx, int budget);
447449
int cpsw_rx_mq_poll(struct napi_struct *napi_rx, int budget);

0 commit comments

Comments
 (0)