Skip to content

Commit 34e6cb0

Browse files
Suraj JaiswalNipaLocal
Suraj Jaiswal
authored and
NipaLocal
committed
net: stmmac: Add driver support for DWMAC5 common safety IRQ
Add support to listen HW safety IRQ like ECC(error correction code), DPP(data path parity), FSM(finite state machine) fault in common IRQ line. Signed-off-by: Suraj Jaiswal <[email protected]> Signed-off-by: NipaLocal <nipa@local>
1 parent 7558813 commit 34e6cb0

File tree

4 files changed

+34
-0
lines changed

4 files changed

+34
-0
lines changed

drivers/net/ethernet/stmicro/stmmac/common.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,7 @@ enum request_irq_err {
344344
REQ_IRQ_ERR_ALL,
345345
REQ_IRQ_ERR_TX,
346346
REQ_IRQ_ERR_RX,
347+
REQ_IRQ_ERR_SFTY,
347348
REQ_IRQ_ERR_SFTY_UE,
348349
REQ_IRQ_ERR_SFTY_CE,
349350
REQ_IRQ_ERR_LPI,

drivers/net/ethernet/stmicro/stmmac/stmmac.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ struct stmmac_resources {
3131
int wol_irq;
3232
int lpi_irq;
3333
int irq;
34+
int sfty_irq;
3435
int sfty_ce_irq;
3536
int sfty_ue_irq;
3637
int rx_irq[MTL_MAX_RX_QUEUES];
@@ -297,6 +298,7 @@ struct stmmac_priv {
297298
void __iomem *ptpaddr;
298299
void __iomem *estaddr;
299300
unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];
301+
int sfty_irq;
300302
int sfty_ce_irq;
301303
int sfty_ue_irq;
302304
int rx_irq[MTL_MAX_RX_QUEUES];
@@ -305,6 +307,7 @@ struct stmmac_priv {
305307
char int_name_mac[IFNAMSIZ + 9];
306308
char int_name_wol[IFNAMSIZ + 9];
307309
char int_name_lpi[IFNAMSIZ + 9];
310+
char int_name_sfty[IFNAMSIZ + 10];
308311
char int_name_sfty_ce[IFNAMSIZ + 10];
309312
char int_name_sfty_ue[IFNAMSIZ + 10];
310313
char int_name_rx_irq[MTL_MAX_TX_QUEUES][IFNAMSIZ + 14];

drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3592,6 +3592,10 @@ static void stmmac_free_irq(struct net_device *dev,
35923592
if (priv->wol_irq > 0 && priv->wol_irq != dev->irq)
35933593
free_irq(priv->wol_irq, dev);
35943594
fallthrough;
3595+
case REQ_IRQ_ERR_SFTY:
3596+
if (priv->sfty_irq > 0 && priv->sfty_irq != dev->irq)
3597+
free_irq(priv->sfty_irq, dev);
3598+
fallthrough;
35953599
case REQ_IRQ_ERR_WOL:
35963600
free_irq(dev->irq, dev);
35973601
fallthrough;
@@ -3759,6 +3763,7 @@ static int stmmac_request_irq_single(struct net_device *dev)
37593763
struct stmmac_priv *priv = netdev_priv(dev);
37603764
enum request_irq_err irq_err;
37613765
int ret;
3766+
char *int_name;
37623767

37633768
ret = request_irq(dev->irq, stmmac_interrupt,
37643769
IRQF_SHARED, dev->name, dev);
@@ -3798,6 +3803,20 @@ static int stmmac_request_irq_single(struct net_device *dev)
37983803
}
37993804
}
38003805

3806+
if (priv->sfty_irq > 0 && priv->sfty_irq != dev->irq) {
3807+
int_name = priv->int_name_sfty;
3808+
sprintf(int_name, "%s:%s", dev->name, "safety");
3809+
ret = request_irq(priv->sfty_irq, stmmac_safety_interrupt,
3810+
0, int_name, dev);
3811+
if (unlikely(ret < 0)) {
3812+
netdev_err(priv->dev,
3813+
"%s: alloc safety failed %d (error: %d)\n",
3814+
__func__, priv->sfty_irq, ret);
3815+
irq_err = REQ_IRQ_ERR_SFTY;
3816+
goto irq_error;
3817+
}
3818+
}
3819+
38013820
return 0;
38023821

38033822
irq_error:
@@ -7462,8 +7481,10 @@ int stmmac_dvr_probe(struct device *device,
74627481
priv->dev->irq = res->irq;
74637482
priv->wol_irq = res->wol_irq;
74647483
priv->lpi_irq = res->lpi_irq;
7484+
priv->sfty_irq = res->sfty_irq;
74657485
priv->sfty_ce_irq = res->sfty_ce_irq;
74667486
priv->sfty_ue_irq = res->sfty_ue_irq;
7487+
74677488
for (i = 0; i < MTL_MAX_RX_QUEUES; i++)
74687489
priv->rx_irq[i] = res->rx_irq[i];
74697490
for (i = 0; i < MTL_MAX_TX_QUEUES; i++)

drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -726,6 +726,15 @@ int stmmac_get_platform_resources(struct platform_device *pdev,
726726
dev_info(&pdev->dev, "IRQ eth_lpi not found\n");
727727
}
728728

729+
stmmac_res->sfty_irq =
730+
platform_get_irq_byname_optional(pdev, "sfty");
731+
732+
if (stmmac_res->sfty_irq < 0) {
733+
if (stmmac_res->sfty_irq == -EPROBE_DEFER)
734+
return -EPROBE_DEFER;
735+
dev_info(&pdev->dev, "IRQ safety IRQ not found\n");
736+
}
737+
729738
stmmac_res->addr = devm_platform_ioremap_resource(pdev, 0);
730739

731740
return PTR_ERR_OR_ZERO(stmmac_res->addr);

0 commit comments

Comments
 (0)