]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
realtek: pcs: rtl931x: fix MII mode setting
authorJonas Jelonek <jelonek.jonas@gmail.com>
Sat, 20 Dec 2025 21:42:34 +0000 (21:42 +0000)
committerRobert Marko <robimarko@gmail.com>
Mon, 29 Dec 2025 16:06:19 +0000 (17:06 +0100)
The function 'rtpcs_931x_sds_mii_mode_set' does not correctly write the
register. It just write a plain value at the determined register
address. While this works for SerDes with (id mod 4 == 0), it doesn't
for the other SerDes.

Fix that by using a corresponding shift and writing only some bits
instead of the whole register.

While at it, drop an unneeded blank line, add comment to explain a bit
that is set and use the BIT(..) helper for that instead of manual shift.

Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/20736
Signed-off-by: Robert Marko <robimarko@gmail.com>
target/linux/realtek/files-6.12/drivers/net/pcs/pcs-rtl-otto.c

index bf2110ef534162975ac494121ad5fed53b0f98be..48b890114f9439109744e8fe7b36ce1eacb64b60 100644 (file)
@@ -2381,6 +2381,7 @@ static void rtpcs_931x_sds_mii_mode_set(struct rtpcs_serdes *sds,
                                        phy_interface_t mode)
 {
        u32 val;
+       int shift = ((sds->id & 0x3) << 3);
 
        switch (mode) {
        case PHY_INTERFACE_MODE_QSGMII:
@@ -2400,10 +2401,10 @@ static void rtpcs_931x_sds_mii_mode_set(struct rtpcs_serdes *sds,
                return;
        }
 
-       val |= (1 << 7);
-
-       regmap_write(sds->ctrl->map,
-                    RTL931X_SERDES_MODE_CTRL + 4 * (sds->id >> 2), val);
+       val |= BIT(7); /* force mode bit */
+       regmap_write_bits(sds->ctrl->map,
+                         RTL931X_SERDES_MODE_CTRL + 4 * (sds->id >> 2),
+                         0xff << shift, val << shift);
 }
 
 static void rtpcs_931x_sds_disable(struct rtpcs_serdes *sds)