|
28 | 28 | #define DP83867_CTRL 0x1f
|
29 | 29 |
|
30 | 30 | /* Extended Registers */
|
31 |
| -#define DP83867_CFG4 0x0031 |
| 31 | +#define DP83867_FLD_THR_CFG 0x002e |
| 32 | +#define DP83867_CFG4 0x0031 |
32 | 33 | #define DP83867_CFG4_SGMII_ANEG_MASK (BIT(5) | BIT(6))
|
33 | 34 | #define DP83867_CFG4_SGMII_ANEG_TIMER_11MS (3 << 5)
|
34 | 35 | #define DP83867_CFG4_SGMII_ANEG_TIMER_800US (2 << 5)
|
|
91 | 92 | #define DP83867_STRAP_STS2_CLK_SKEW_RX_MASK GENMASK(2, 0)
|
92 | 93 | #define DP83867_STRAP_STS2_CLK_SKEW_RX_SHIFT 0
|
93 | 94 | #define DP83867_STRAP_STS2_CLK_SKEW_NONE BIT(2)
|
| 95 | +#define DP83867_STRAP_STS2_STRAP_FLD BIT(10) |
94 | 96 |
|
95 | 97 | /* PHY CTRL bits */
|
96 | 98 | #define DP83867_PHYCR_TX_FIFO_DEPTH_SHIFT 14
|
|
125 | 127 | /* CFG4 bits */
|
126 | 128 | #define DP83867_CFG4_PORT_MIRROR_EN BIT(0)
|
127 | 129 |
|
| 130 | +/* FLD_THR_CFG */ |
| 131 | +#define DP83867_FLD_THR_CFG_ENERGY_LOST_THR_MASK 0x7 |
| 132 | + |
128 | 133 | enum {
|
129 | 134 | DP83867_PORT_MIRROING_KEEP,
|
130 | 135 | DP83867_PORT_MIRROING_EN,
|
@@ -476,6 +481,20 @@ static int dp83867_config_init(struct phy_device *phydev)
|
476 | 481 | phy_clear_bits_mmd(phydev, DP83867_DEVADDR, DP83867_CFG4,
|
477 | 482 | BIT(7));
|
478 | 483 |
|
| 484 | + bs = phy_read_mmd(phydev, DP83867_DEVADDR, DP83867_STRAP_STS2); |
| 485 | + if (bs & DP83867_STRAP_STS2_STRAP_FLD) { |
| 486 | + /* When using strap to enable FLD, the ENERGY_LOST_FLD_THR will |
| 487 | + * be set to 0x2. This may causes the PHY link to be unstable - |
| 488 | + * the default value 0x1 need to be restored. |
| 489 | + */ |
| 490 | + ret = phy_modify_mmd(phydev, DP83867_DEVADDR, |
| 491 | + DP83867_FLD_THR_CFG, |
| 492 | + DP83867_FLD_THR_CFG_ENERGY_LOST_THR_MASK, |
| 493 | + 0x1); |
| 494 | + if (ret) |
| 495 | + return ret; |
| 496 | + } |
| 497 | + |
479 | 498 | if (phy_interface_is_rgmii(phydev) ||
|
480 | 499 | phydev->interface == PHY_INTERFACE_MODE_SGMII) {
|
481 | 500 | val = phy_read(phydev, MII_DP83867_PHYCTRL);
|
|
0 commit comments