[PATCH net] net: mdio: realtek-rtl9300: fix RTL931x C22 extended page selection

Jonas Jelonek posted 1 patch 6 days, 1 hour ago
drivers/net/mdio/mdio-realtek-rtl9300.c | 6 ++++++
1 file changed, 6 insertions(+)
[PATCH net] net: mdio: realtek-rtl9300: fix RTL931x C22 extended page selection
Posted by Jonas Jelonek 6 days, 1 hour ago
The RTL931x indirect access engine has a separate nine-bit extended page
field. The driver leaves it at zero, and otto_emdio_run_cmd() therefore
programs extended page zero for every Clause 22 transaction. This
overrides page selection made through PHY register 30, causing accesses
to private PHY pages to hit extended page zero instead.

Set the field to its 0x1ff "do not change" value for RTL931x Clause 22
reads and writes. This preserves extended page selection made through
PHY register 30 and restores access to its private register pages.

Fixes: 5ebdcac59aff ("net: mdio: realtek-rtl9300: Add support for RTL931x")
Signed-off-by: Jonas Jelonek <jonas@jonasjelonek.de>
---
 drivers/net/mdio/mdio-realtek-rtl9300.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/net/mdio/mdio-realtek-rtl9300.c b/drivers/net/mdio/mdio-realtek-rtl9300.c
index afd52a1cd7f8..9ce2b7807532 100644
--- a/drivers/net/mdio/mdio-realtek-rtl9300.c
+++ b/drivers/net/mdio/mdio-realtek-rtl9300.c
@@ -88,6 +88,8 @@
 #define RTL9310_SMI_INDRT_ACCESS_BC_PHYID_CTRL	0x0c14
 #define   RTL9310_BC_PORT_ID			GENMASK(10, 5)
 #define RTL9310_SMI_INDRT_ACCESS_CTRL_1		0x0c04
+#define   RTL9310_SMI_INDRT_EXT_PAGE		GENMASK(8, 0)
+#define   RTL9310_SMI_INDRT_EXT_PAGE_NO_CHANGE	0x1ff
 #define RTL9310_SMI_INDRT_ACCESS_CTRL_2_LOW	0x0c08
 #define RTL9310_SMI_INDRT_ACCESS_CTRL_2_HIGH	0x0c0c
 #define RTL9310_SMI_INDRT_ACCESS_CTRL_3		0x0c10 /* I/O fields flipped */
@@ -325,6 +327,8 @@ static int otto_emdio_9310_read_c22(struct mii_bus *bus, int port, int regnum, u
 		.broadcast	= FIELD_PREP(RTL9310_BC_PORT_ID, port),
 		.c22_data	= FIELD_PREP(RTL9310_PHY_CTRL_REG_ADDR, regnum) |
 				  FIELD_PREP(RTL9310_PHY_CTRL_MAIN_PAGE, RAW_PAGE(priv)),
+		.ext_page	= FIELD_PREP(RTL9310_SMI_INDRT_EXT_PAGE,
+					     RTL9310_SMI_INDRT_EXT_PAGE_NO_CHANGE),
 	};
 
 	return otto_emdio_read_cmd(bus, RTL9310_PHY_CTRL_TYPE_C22, &cmd_data,
@@ -337,6 +341,8 @@ static int otto_emdio_9310_write_c22(struct mii_bus *bus, int port, int regnum,
 	struct otto_emdio_cmd_regs cmd_data = {
 		.c22_data	= FIELD_PREP(RTL9310_PHY_CTRL_REG_ADDR, regnum) |
 				  FIELD_PREP(RTL9310_PHY_CTRL_MAIN_PAGE, RAW_PAGE(priv)),
+		.ext_page	= FIELD_PREP(RTL9310_SMI_INDRT_EXT_PAGE,
+					     RTL9310_SMI_INDRT_EXT_PAGE_NO_CHANGE),
 		.io_data	= FIELD_PREP(RTL9310_PHY_CTRL_INDATA, value),
 		.port_mask_high	= (u32)(BIT_ULL(port) >> 32),
 		.port_mask_low	= (u32)(BIT_ULL(port)),

base-commit: 46bc52d13594848023e681860df8700c8db14354
-- 
2.53.0
AW: [PATCH net] net: mdio: realtek-rtl9300: fix RTL931x C22 extended page selection
Posted by Markus Stockhausen 5 days, 15 hours ago
> Von: Jonas Jelonek <jonas@jonasjelonek.de> 
> Gesendet: Freitag, 18. September 2026 23:20
> Betreff: [PATCH net] net: mdio: realtek-rtl9300: fix RTL931x C22 extended
page selection
>
> The RTL931x indirect access engine has a separate nine-bit extended page
> field. The driver leaves it at zero, and otto_emdio_run_cmd() therefore
> programs extended page zero for every Clause 22 transaction. This
> overrides page selection made through PHY register 30, causing accesses
> to private PHY pages to hit extended page zero instead.
>
> Set the field to its 0x1ff "do not change" value for RTL931x Clause 22
> reads and writes. This preserves extended page selection made through
> PHY register 30 and restores access to its private register pages.
>
> Fixes: 5ebdcac59aff ("net: mdio: realtek-rtl9300: Add support for
RTL931x")
> Signed-off-by: Jonas Jelonek <jonas@jonasjelonek.de>

Acked-by: Markus Stockhausen <markus.stockhausen@gmx.de>