From mboxrd@z Thu Jan 1 00:00:00 1970 From: Florian Fainelli Subject: [RFT/RFC net-next 2/2] net: dsa: bcm_sf2: Kick PHYLINK upon link interrupts Date: Thu, 14 Dec 2017 16:28:50 -0800 Message-ID: <20171215002850.27862-3-f.fainelli@gmail.com> References: <20171215002850.27862-1-f.fainelli@gmail.com> Cc: rmk+kernel@armlinux.org.uk, sean.wang@mediatek.com, john@phrozen.org, kernel@pengutronix.de, privat@egil-hjelmeland.no, Woojung.Huh@microchip.com, vivien.didelot@savoirfairelinux.com, andrew@lunn.ch, Florian Fainelli To: netdev@vger.kernel.org Return-path: Received: from mail-oi0-f68.google.com ([209.85.218.68]:42986 "EHLO mail-oi0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754431AbdLOA3B (ORCPT ); Thu, 14 Dec 2017 19:29:01 -0500 Received: by mail-oi0-f68.google.com with SMTP id o64so5133434oia.9 for ; Thu, 14 Dec 2017 16:29:01 -0800 (PST) In-Reply-To: <20171215002850.27862-1-f.fainelli@gmail.com> Sender: netdev-owner@vger.kernel.org List-ID: In order to signal MoCA port link interrupts the same way we used to do (through polling a fixed PHY and having an fixed_link_update callback run), we just need to call phylink_mac_change() when that happens, and have our custom fixed_link_update callback run to obtain the link state. Signed-off-by: Florian Fainelli --- drivers/net/dsa/bcm_sf2.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c index a22a32a724b3..36e1cda0e0b2 100644 --- a/drivers/net/dsa/bcm_sf2.c +++ b/drivers/net/dsa/bcm_sf2.c @@ -307,7 +307,8 @@ static int bcm_sf2_sw_mdio_write(struct mii_bus *bus, int addr, int regnum, static irqreturn_t bcm_sf2_switch_0_isr(int irq, void *dev_id) { - struct bcm_sf2_priv *priv = dev_id; + struct dsa_switch *ds = dev_id; + struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds); priv->irq0_stat = intrl2_0_readl(priv, INTRL2_CPU_STATUS) & ~priv->irq0_mask; @@ -318,16 +319,21 @@ static irqreturn_t bcm_sf2_switch_0_isr(int irq, void *dev_id) static irqreturn_t bcm_sf2_switch_1_isr(int irq, void *dev_id) { - struct bcm_sf2_priv *priv = dev_id; + struct dsa_switch *ds = dev_id; + struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds); priv->irq1_stat = intrl2_1_readl(priv, INTRL2_CPU_STATUS) & ~priv->irq1_mask; intrl2_1_writel(priv, priv->irq1_stat, INTRL2_CPU_CLEAR); - if (priv->irq1_stat & P_LINK_UP_IRQ(P7_IRQ_OFF)) + if (priv->irq1_stat & P_LINK_UP_IRQ(P7_IRQ_OFF)) { priv->port_sts[7].link = 1; - if (priv->irq1_stat & P_LINK_DOWN_IRQ(P7_IRQ_OFF)) + dsa_port_phylink_mac_change(ds, 7, true); + } + if (priv->irq1_stat & P_LINK_DOWN_IRQ(P7_IRQ_OFF)) { priv->port_sts[7].link = 0; + dsa_port_phylink_mac_change(ds, 7, false); + } return IRQ_HANDLED; } @@ -1060,14 +1066,14 @@ static int bcm_sf2_sw_probe(struct platform_device *pdev) bcm_sf2_intr_disable(priv); ret = devm_request_irq(&pdev->dev, priv->irq0, bcm_sf2_switch_0_isr, 0, - "switch_0", priv); + "switch_0", ds); if (ret < 0) { pr_err("failed to request switch_0 IRQ\n"); goto out_mdio; } ret = devm_request_irq(&pdev->dev, priv->irq1, bcm_sf2_switch_1_isr, 0, - "switch_1", priv); + "switch_1", ds); if (ret < 0) { pr_err("failed to request switch_1 IRQ\n"); goto out_mdio; -- 2.14.1