diff --git a/target/linux/ramips/files-4.14/drivers/net/ethernet/mtk/gsw_mt7621.c b/target/linux/ramips/files-4.14/drivers/net/ethernet/mtk/gsw_mt7621.c index ef0b79e09d..c9fea0caa2 100644 --- a/target/linux/ramips/files-4.14/drivers/net/ethernet/mtk/gsw_mt7621.c +++ b/target/linux/ramips/files-4.14/drivers/net/ethernet/mtk/gsw_mt7621.c @@ -41,6 +41,7 @@ static irqreturn_t gsw_interrupt_mt7621(int irq, void *_priv) u32 reg, i; reg = mt7530_mdio_r32(gsw, 0x700c); + mt7530_mdio_w32(gsw, 0x700c, reg); for (i = 0; i < 5; i++) if (reg & BIT(i)) { @@ -61,7 +62,6 @@ static irqreturn_t gsw_interrupt_mt7621(int irq, void *_priv) } mt7620_handle_carrier(priv); - mt7530_mdio_w32(gsw, 0x700c, 0x1f); return IRQ_HANDLED; } @@ -193,9 +193,8 @@ static void mt7621_hw_init(struct mt7620_gsw *gsw, struct device_node *np) _mt7620_mii_write(gsw, i, 0, val); } - /* mask irq */ - mt7530_mdio_w32(gsw, 0x7008, 0x1f); /* enable irq */ + mt7530_mdio_w32(gsw, 0x7008, 0x1f); val = mt7530_mdio_r32(gsw, 0x7808); val |= 3 << 16; mt7530_mdio_w32(gsw, 0x7808, val); @@ -225,10 +224,14 @@ int mtk_gsw_init(struct fe_priv *priv) if (gsw->irq) { request_irq(gsw->irq, gsw_interrupt_mt7621, 0, "gsw", priv); - mt7530_mdio_w32(gsw, 0x7008, ~0x1f); + disable_irq(gsw->irq); } + mt7621_hw_init(gsw, np); + if (gsw->irq) + enable_irq(gsw->irq); + return 0; }