marvell10g.c (07fa3fa2572f2dee85beb8137f90ccf33d7206af) | marvell10g.c (3c1bcc8614db10803f1f57ef0295363917448cb2) |
---|---|
1/* 2 * Marvell 10G 88x3310 PHY driver 3 * 4 * Based upon the ID registers, this PHY appears to be a mixture of IPs 5 * from two different companies. 6 * 7 * There appears to be several different data paths through the PHY which 8 * are automatically managed by the PHY. The following has been determined --- 238 unchanged lines hidden (view full) --- 247static int mv3310_resume(struct phy_device *phydev) 248{ 249 return mv3310_hwmon_config(phydev, true); 250} 251 252static int mv3310_config_init(struct phy_device *phydev) 253{ 254 __ETHTOOL_DECLARE_LINK_MODE_MASK(supported) = { 0, }; | 1/* 2 * Marvell 10G 88x3310 PHY driver 3 * 4 * Based upon the ID registers, this PHY appears to be a mixture of IPs 5 * from two different companies. 6 * 7 * There appears to be several different data paths through the PHY which 8 * are automatically managed by the PHY. The following has been determined --- 238 unchanged lines hidden (view full) --- 247static int mv3310_resume(struct phy_device *phydev) 248{ 249 return mv3310_hwmon_config(phydev, true); 250} 251 252static int mv3310_config_init(struct phy_device *phydev) 253{ 254 __ETHTOOL_DECLARE_LINK_MODE_MASK(supported) = { 0, }; |
255 u32 mask; | |
256 int val; 257 258 /* Check that the PHY interface type is compatible */ 259 if (phydev->interface != PHY_INTERFACE_MODE_SGMII && 260 phydev->interface != PHY_INTERFACE_MODE_XAUI && 261 phydev->interface != PHY_INTERFACE_MODE_RXAUI && 262 phydev->interface != PHY_INTERFACE_MODE_10GKR) 263 return -ENODEV; --- 67 unchanged lines hidden (view full) --- 331 if (val & MDIO_PMA_EXTABLE_10BT) { 332 __set_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, 333 supported); 334 __set_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, 335 supported); 336 } 337 } 338 | 255 int val; 256 257 /* Check that the PHY interface type is compatible */ 258 if (phydev->interface != PHY_INTERFACE_MODE_SGMII && 259 phydev->interface != PHY_INTERFACE_MODE_XAUI && 260 phydev->interface != PHY_INTERFACE_MODE_RXAUI && 261 phydev->interface != PHY_INTERFACE_MODE_10GKR) 262 return -ENODEV; --- 67 unchanged lines hidden (view full) --- 330 if (val & MDIO_PMA_EXTABLE_10BT) { 331 __set_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, 332 supported); 333 __set_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, 334 supported); 335 } 336 } 337 |
339 if (!ethtool_convert_link_mode_to_legacy_u32(&mask, supported)) 340 phydev_warn(phydev, 341 "PHY supports (%*pb) more modes than phylib supports, some modes not supported.\n", 342 __ETHTOOL_LINK_MODE_MASK_NBITS, supported); | 338 linkmode_copy(phydev->supported, supported); 339 linkmode_and(phydev->advertising, phydev->advertising, 340 phydev->supported); |
343 | 341 |
344 phydev->supported &= mask; 345 phydev->advertising &= phydev->supported; 346 | |
347 return 0; 348} 349 350static int mv3310_config_aneg(struct phy_device *phydev) 351{ 352 bool changed = false; | 342 return 0; 343} 344 345static int mv3310_config_aneg(struct phy_device *phydev) 346{ 347 bool changed = false; |
353 u32 advertising; | 348 u16 reg; |
354 int ret; 355 356 /* We don't support manual MDI control */ 357 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; 358 359 if (phydev->autoneg == AUTONEG_DISABLE) { 360 ret = genphy_c45_pma_setup_forced(phydev); 361 if (ret < 0) 362 return ret; 363 364 return genphy_c45_an_disable_aneg(phydev); 365 } 366 | 349 int ret; 350 351 /* We don't support manual MDI control */ 352 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; 353 354 if (phydev->autoneg == AUTONEG_DISABLE) { 355 ret = genphy_c45_pma_setup_forced(phydev); 356 if (ret < 0) 357 return ret; 358 359 return genphy_c45_an_disable_aneg(phydev); 360 } 361 |
367 phydev->advertising &= phydev->supported; 368 advertising = phydev->advertising; | 362 linkmode_and(phydev->advertising, phydev->advertising, 363 phydev->supported); |
369 370 ret = mv3310_modify(phydev, MDIO_MMD_AN, MDIO_AN_ADVERTISE, 371 ADVERTISE_ALL | ADVERTISE_100BASE4 | 372 ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM, | 364 365 ret = mv3310_modify(phydev, MDIO_MMD_AN, MDIO_AN_ADVERTISE, 366 ADVERTISE_ALL | ADVERTISE_100BASE4 | 367 ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM, |
373 ethtool_adv_to_mii_adv_t(advertising)); | 368 linkmode_adv_to_mii_adv_t(phydev->advertising)); |
374 if (ret < 0) 375 return ret; 376 if (ret > 0) 377 changed = true; 378 | 369 if (ret < 0) 370 return ret; 371 if (ret > 0) 372 changed = true; 373 |
374 reg = linkmode_adv_to_mii_ctrl1000_t(phydev->advertising); |
|
379 ret = mv3310_modify(phydev, MDIO_MMD_AN, MV_AN_CTRL1000, | 375 ret = mv3310_modify(phydev, MDIO_MMD_AN, MV_AN_CTRL1000, |
380 ADVERTISE_1000FULL | ADVERTISE_1000HALF, 381 ethtool_adv_to_mii_ctrl1000_t(advertising)); | 376 ADVERTISE_1000FULL | ADVERTISE_1000HALF, reg); |
382 if (ret < 0) 383 return ret; 384 if (ret > 0) 385 changed = true; 386 387 /* 10G control register */ | 377 if (ret < 0) 378 return ret; 379 if (ret > 0) 380 changed = true; 381 382 /* 10G control register */ |
383 if (linkmode_test_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT, 384 phydev->advertising)) 385 reg = MDIO_AN_10GBT_CTRL_ADV10G; 386 else 387 reg = 0; 388 |
|
388 ret = mv3310_modify(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_CTRL, | 389 ret = mv3310_modify(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_CTRL, |
389 MDIO_AN_10GBT_CTRL_ADV10G, 390 advertising & ADVERTISED_10000baseT_Full ? 391 MDIO_AN_10GBT_CTRL_ADV10G : 0); | 390 MDIO_AN_10GBT_CTRL_ADV10G, reg); |
392 if (ret < 0) 393 return ret; 394 if (ret > 0) 395 changed = true; 396 397 if (changed) 398 ret = genphy_c45_restart_aneg(phydev); 399 --- 159 unchanged lines hidden --- | 391 if (ret < 0) 392 return ret; 393 if (ret > 0) 394 changed = true; 395 396 if (changed) 397 ret = genphy_c45_restart_aneg(phydev); 398 --- 159 unchanged lines hidden --- |