From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail.cjdns.fr (mail.cjdns.fr [5.135.140.105]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0182E429CCF; Tue, 15 Sep 2026 17:47:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=5.135.140.105 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789494452; cv=none; b=a46vCGj3tZO+2me6eNVcJ03niAZipF2LbowMOAI30BmcF1LQHjxwG1SIGjp6zNtuZ+1N8rPvACWeTXSRfwPdZ+o7jSH45xmEkD/yQ4571GOP8+2oJTokX0BS5e6K4O9EdBe7kG9K3Pm3iu//P5bP0AIO0waQqqPX39FXBGqxzek= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789494452; c=relaxed/simple; bh=ndKyiTc9a815gB3eWMfUb/cAVaKXG+E4YJVBzapvRk8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=AMrMhkCdX2xKTcR5Akidy5GwyQkW5DnI6e/mH4U27xHp2IVoo5nWz0CD/cxzYtsO9FtRmAxWaDUkWttACAk2RM9SrsvHj6CoRO+k/EiQFnMOFFnv1hhaDucXEVHHiFtMflqIqzLFiV7o2elnvtbtqUMgGZkDgfK3To/VVxx6FpU= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=cjdns.fr; spf=none smtp.mailfrom=cjdns.fr; dkim=pass (2048-bit key) header.d=cjdns.fr header.i=@cjdns.fr header.b=PCBxyxZm; arc=none smtp.client-ip=5.135.140.105 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=cjdns.fr Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=cjdns.fr Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=cjdns.fr header.i=@cjdns.fr header.b="PCBxyxZm" Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 546B848DAF7; Tue, 15 Sep 2026 19:47:21 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cjdns.fr; s=dkim; t=1789494446; h=from:subject:date:message-id:to:cc:mime-version: content-transfer-encoding:in-reply-to:references; bh=GMESSO5uRX+BzGOQEPo7sGcRIjoMAuqIfwV5Ju1NceI=; b=PCBxyxZmsZ9p0ZoT7lAV1pmvyKUa8WO3gEnQU390/z2piesrzcQ57X7rAjNSk22EbXJ+im jH8woiC9991zRxSmaH47CwgJy7MXBh6HrEhhK1Th6ZBlNzAMe+VzYhqSw5O+7UmRgCZzKP WWlinS1s2itKlo8A69V0Q6bAOVucWqEjjfFlTdbkj2ewyhF/62gX03Vaxhc2cgqW9HegPN IeTnSmi+hV3LHjLdbXY76qwGsazkhOa+ETYJw+PHQ4Fjy8FbNKGxL8YCAALkZDioMqpCFp i6sVSfFudX0/ZzoH5rdI/LaPbLrFrBd28dTmgtkPsKwTHXChkz2R124BEVlRiQ== From: Caleb James DeLisle To: netdev@vger.kernel.org Cc: andrew@lunn.ch, olteanv@gmail.com, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, matthias.bgg@gmail.com, angelogioacchino.delregno@collabora.com, chester.a.unal@arinc9.com, daniel@makrotopia.org, linux@armlinux.org.uk, arinc.unal@arinc9.com, Landen.Chao@mediatek.com, dqfext@gmail.com, sean.wang@mediatek.com, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, naseefkm@gmail.com, b.larsson@gmx.com, Caleb James DeLisle Subject: [PATCH v2 net-next 5/7] net: dsa: mediatek: support MDIO switch downstream of MMIO switch Date: Tue, 15 Sep 2026 17:46:41 +0000 Message-Id: <20260915174643.253660-6-cjd@cjdns.fr> In-Reply-To: <20260915174643.253660-1-cjd@cjdns.fr> References: <20260915174643.253660-1-cjd@cjdns.fr> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Last-TLS-Session-Version: TLSv1.3 The MT7530 / MT7531 can connect via either MDIO or MMIO. In MMIO mode the switch provides its own MDIO bus which connects to its integrated PHYs, but also can be connected to other things, such as another switch. If the MDIO bus contains another switch, then the upstream switch will register but it will not setup the DSA tree because the downstream switch is missing. Without the complete DSA tree, mt753x_setup() will not be called on the switch and therefore mt7530_setup_mdio() is never called so the downstream switch never registers. Update mt7530_setup_mdio() so that it can be called multiple times, export the symbol, and call it again after dsa_register_switch() from mt7988_probe(). Signed-off-by: Caleb James DeLisle --- drivers/net/dsa/mt7530-mmio.c | 9 ++++++++- drivers/net/dsa/mt7530.c | 13 +++++++++---- drivers/net/dsa/mt7530.h | 10 ++++++++++ 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/drivers/net/dsa/mt7530-mmio.c b/drivers/net/dsa/mt7530-mmio.c index cf3bdb23a2d5..f387190a9539 100644 --- a/drivers/net/dsa/mt7530-mmio.c +++ b/drivers/net/dsa/mt7530-mmio.c @@ -61,7 +61,14 @@ mt7988_probe(struct platform_device *pdev) if (IS_ERR(priv->regmap)) return PTR_ERR(priv->regmap); - return dsa_register_switch(priv->ds); + ret = dsa_register_switch(priv->ds); + + if (ret) + return ret; + + mt7530_setup_mdio(priv); + + return 0; } static void mt7988_remove(struct platform_device *pdev) diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c index b152b73315d5..fe93be1ece7d 100644 --- a/drivers/net/dsa/mt7530.c +++ b/drivers/net/dsa/mt7530.c @@ -2404,7 +2404,7 @@ mt7530_free_mdio_irq(struct mt7530_priv *priv) } } -static int +int mt7530_setup_mdio(struct mt7530_priv *priv) { struct device_node *mnp, *np = priv->dev->of_node; @@ -2414,6 +2414,10 @@ mt7530_setup_mdio(struct mt7530_priv *priv) static int idx; int ret = 0; + /* Already done */ + if (priv->child_bus) + return 0; + mnp = of_get_child_by_name(np, "mdio"); if (mnp && !of_device_is_available(mnp)) @@ -2438,9 +2442,6 @@ mt7530_setup_mdio(struct mt7530_priv *priv) bus->parent = dev; bus->phy_mask = ~ds->phys_mii_mask; - if (priv->irq_domain && !mnp) - mt7530_setup_mdio_irq(priv); - priv->child_bus = bus; ret = devm_of_mdiobus_register(dev, bus, mnp); @@ -2455,6 +2456,7 @@ mt7530_setup_mdio(struct mt7530_priv *priv) of_node_put(mnp); return ret; } +EXPORT_SYMBOL_GPL(mt7530_setup_mdio); static int mt7530_setup(struct dsa_switch *ds) @@ -3285,6 +3287,9 @@ mt753x_setup(struct dsa_switch *ds) if (ret) return ret; + if (priv->irq_domain && ds->user_mii_bus) + mt7530_setup_mdio_irq(priv); + /* Initialise the PCS devices */ for (i = 0; i < priv->ds->num_ports; i++) { priv->pcs[i].pcs.ops = priv->info->pcs_ops; diff --git a/drivers/net/dsa/mt7530.h b/drivers/net/dsa/mt7530.h index 5b7394f6383c..c86bc4bca29b 100644 --- a/drivers/net/dsa/mt7530.h +++ b/drivers/net/dsa/mt7530.h @@ -969,6 +969,16 @@ struct mt7530_hw_stats { int mt7530_probe_common(struct mt7530_priv *priv); void mt7530_remove_common(struct mt7530_priv *priv); +/* + * When an MMIO based switch has an MDIO bus which contains a downstream MDIO + * switch, the MDIO bus is not normally setup until mt753x_setup() has been + * called. But mt753x_setup() is not called until DSA sees that every switch in + * the tree has been probed. Calling mt7530_setup_mdio() after at the end of + * the MMIO probe function allows the downstream switch to register, completing + * the tree. + */ +int mt7530_setup_mdio(struct mt7530_priv *priv); + extern const struct mt753x_info mt753x_table[]; #endif /* __MT7530_H */ -- 2.39.5