|
33 | 33 | #define MV_PHY_ALASKA_NBT_QUIRK_REV (MARVELL_PHY_ID_88X3310 | 0xa)
|
34 | 34 |
|
35 | 35 | enum {
|
| 36 | + MV_PMA_FW_VER0 = 0xc011, |
| 37 | + MV_PMA_FW_VER1 = 0xc012, |
36 | 38 | MV_PMA_BOOT = 0xc050,
|
37 | 39 | MV_PMA_BOOT_FATAL = BIT(0),
|
38 | 40 |
|
|
73 | 75 |
|
74 | 76 | /* Vendor2 MMD registers */
|
75 | 77 | MV_V2_PORT_CTRL = 0xf001,
|
76 |
| - MV_V2_PORT_CTRL_PWRDOWN = 0x0800, |
| 78 | + MV_V2_PORT_CTRL_SWRST = BIT(15), |
| 79 | + MV_V2_PORT_CTRL_PWRDOWN = BIT(11), |
77 | 80 | MV_V2_TEMP_CTRL = 0xf08a,
|
78 | 81 | MV_V2_TEMP_CTRL_MASK = 0xc000,
|
79 | 82 | MV_V2_TEMP_CTRL_SAMPLE = 0x0000,
|
|
83 | 86 | };
|
84 | 87 |
|
85 | 88 | struct mv3310_priv {
|
| 89 | + u32 firmware_ver; |
| 90 | + |
86 | 91 | struct device *hwmon_dev;
|
87 | 92 | char *hwmon_name;
|
88 | 93 | };
|
@@ -235,8 +240,17 @@ static int mv3310_power_down(struct phy_device *phydev)
|
235 | 240 |
|
236 | 241 | static int mv3310_power_up(struct phy_device *phydev)
|
237 | 242 | {
|
238 |
| - return phy_clear_bits_mmd(phydev, MDIO_MMD_VEND2, MV_V2_PORT_CTRL, |
239 |
| - MV_V2_PORT_CTRL_PWRDOWN); |
| 243 | + struct mv3310_priv *priv = dev_get_drvdata(&phydev->mdio.dev); |
| 244 | + int ret; |
| 245 | + |
| 246 | + ret = phy_clear_bits_mmd(phydev, MDIO_MMD_VEND2, MV_V2_PORT_CTRL, |
| 247 | + MV_V2_PORT_CTRL_PWRDOWN); |
| 248 | + |
| 249 | + if (priv->firmware_ver < 0x00030000) |
| 250 | + return ret; |
| 251 | + |
| 252 | + return phy_set_bits_mmd(phydev, MDIO_MMD_VEND2, MV_V2_PORT_CTRL, |
| 253 | + MV_V2_PORT_CTRL_SWRST); |
240 | 254 | }
|
241 | 255 |
|
242 | 256 | static int mv3310_reset(struct phy_device *phydev, u32 unit)
|
@@ -355,6 +369,22 @@ static int mv3310_probe(struct phy_device *phydev)
|
355 | 369 |
|
356 | 370 | dev_set_drvdata(&phydev->mdio.dev, priv);
|
357 | 371 |
|
| 372 | + ret = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MV_PMA_FW_VER0); |
| 373 | + if (ret < 0) |
| 374 | + return ret; |
| 375 | + |
| 376 | + priv->firmware_ver = ret << 16; |
| 377 | + |
| 378 | + ret = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MV_PMA_FW_VER1); |
| 379 | + if (ret < 0) |
| 380 | + return ret; |
| 381 | + |
| 382 | + priv->firmware_ver |= ret; |
| 383 | + |
| 384 | + phydev_info(phydev, "Firmware version %u.%u.%u.%u\n", |
| 385 | + priv->firmware_ver >> 24, (priv->firmware_ver >> 16) & 255, |
| 386 | + (priv->firmware_ver >> 8) & 255, priv->firmware_ver & 255); |
| 387 | + |
358 | 388 | /* Powering down the port when not in use saves about 600mW */
|
359 | 389 | ret = mv3310_power_down(phydev);
|
360 | 390 | if (ret)
|
|
0 commit comments