Skip to content

Commit 2985749

Browse files
thanhquan1kuba-moo
authored andcommitted
net: phy: dp83869: fix STRAP_OPMODE bitmask
According to the TI DP83869HM datasheet Revision D (June 2025), section 7.6.1.41 STRAP_STS Register, the STRAP_OPMODE bitmask is bit [11:9]. Fix this. In case the PHY is auto-detected via PHY ID registers, or not described in DT, or, in case the PHY is described in DT but the optional DT property "ti,op-mode" is not present, then the driver reads out the PHY functional mode (RGMII, SGMII, ...) from hardware straps. Currently, all upstream users of this PHY specify both DT compatible string "ethernet-phy-id2000.a0f1" and ti,op-mode = <DP83869_RGMII_COPPER_ETHERNET> property, therefore it seems no upstream users are affected by this bug. The driver currently interprets bits [2:0] of STRAP_STS register as PHY functional mode. Those bits are controlled by ANEG_DIS, ANEGSEL_0 straps and an always-zero reserved bit. Systems that use RGMII-to-Copper functional mode are unlikely to disable auto-negotiation via ANEG_DIS strap, or change auto-negotiation behavior via ANEGSEL_0 strap. Therefore, even with this bug in place, the STRAP_STS register content is likely going to be interpreted by the driver as RGMII-to-Copper mode. However, for a system with PHY functional mode strapping set to other mode than RGMII-to-Copper, the driver is likely to misinterpret the strapping as RGMII-to-Copper and misconfigure the PHY. For example, on a system with SGMII-to-Copper strapping, the STRAP_STS register reads as 0x0c20, but the PHY ends up being configured for incompatible RGMII-to-Copper mode. Fixes: 0eaf8cc ("net: phy: dp83869: Set opmode from straps") Reviewed-by: Andrew Lunn <[email protected]> Signed-off-by: Thanh Quan <[email protected]> Signed-off-by: Hai Pham <[email protected]> Signed-off-by: Marek Vasut <[email protected]> # Port from U-Boot to Linux Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 9311e95 commit 2985749

1 file changed

Lines changed: 2 additions & 2 deletions

File tree

drivers/net/phy/dp83869.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@
8484
#define DP83869_CLK_DELAY_DEF 7
8585

8686
/* STRAP_STS1 bits */
87-
#define DP83869_STRAP_OP_MODE_MASK GENMASK(2, 0)
87+
#define DP83869_STRAP_OP_MODE_MASK GENMASK(11, 9)
8888
#define DP83869_STRAP_STS1_RESERVED BIT(11)
8989
#define DP83869_STRAP_MIRROR_ENABLED BIT(12)
9090

@@ -528,7 +528,7 @@ static int dp83869_set_strapped_mode(struct phy_device *phydev)
528528
if (val < 0)
529529
return val;
530530

531-
dp83869->mode = val & DP83869_STRAP_OP_MODE_MASK;
531+
dp83869->mode = FIELD_GET(DP83869_STRAP_OP_MODE_MASK, val);
532532

533533
return 0;
534534
}

0 commit comments

Comments
 (0)