|
20 | 20 | #define PHY_ID_AQCS109 0x03a1b5c2
|
21 | 21 | #define PHY_ID_AQR405 0x03a1b4b0
|
22 | 22 |
|
| 23 | +#define MDIO_AN_VEND_PROV 0xc400 |
| 24 | +#define MDIO_AN_VEND_PROV_1000BASET_FULL BIT(15) |
| 25 | +#define MDIO_AN_VEND_PROV_1000BASET_HALF BIT(14) |
| 26 | + |
23 | 27 | #define MDIO_AN_TX_VEND_STATUS1 0xc800
|
24 | 28 | #define MDIO_AN_TX_VEND_STATUS1_10BASET (0x0 << 1)
|
25 | 29 | #define MDIO_AN_TX_VEND_STATUS1_100BASETX (0x1 << 1)
|
|
64 | 68 |
|
65 | 69 | static int aqr_config_aneg(struct phy_device *phydev)
|
66 | 70 | {
|
67 |
| - linkmode_copy(phydev->supported, phy_10gbit_features); |
68 |
| - linkmode_copy(phydev->advertising, phydev->supported); |
| 71 | + bool changed = false; |
| 72 | + u16 reg; |
| 73 | + int ret; |
69 | 74 |
|
70 |
| - return 0; |
| 75 | + if (phydev->autoneg == AUTONEG_DISABLE) |
| 76 | + return genphy_c45_pma_setup_forced(phydev); |
| 77 | + |
| 78 | + ret = genphy_c45_an_config_aneg(phydev); |
| 79 | + if (ret < 0) |
| 80 | + return ret; |
| 81 | + if (ret > 0) |
| 82 | + changed = true; |
| 83 | + |
| 84 | + /* Clause 45 has no standardized support for 1000BaseT, therefore |
| 85 | + * use vendor registers for this mode. |
| 86 | + */ |
| 87 | + reg = 0; |
| 88 | + if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, |
| 89 | + phydev->advertising)) |
| 90 | + reg |= MDIO_AN_VEND_PROV_1000BASET_FULL; |
| 91 | + |
| 92 | + if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT, |
| 93 | + phydev->advertising)) |
| 94 | + reg |= MDIO_AN_VEND_PROV_1000BASET_HALF; |
| 95 | + |
| 96 | + ret = phy_modify_mmd_changed(phydev, MDIO_MMD_AN, MDIO_AN_VEND_PROV, |
| 97 | + MDIO_AN_VEND_PROV_1000BASET_HALF | |
| 98 | + MDIO_AN_VEND_PROV_1000BASET_FULL, reg); |
| 99 | + if (ret < 0) |
| 100 | + return ret; |
| 101 | + if (ret > 0) |
| 102 | + changed = true; |
| 103 | + |
| 104 | + return genphy_c45_check_and_restart_aneg(phydev, changed); |
71 | 105 | }
|
72 | 106 |
|
73 | 107 | static int aqr_config_intr(struct phy_device *phydev)
|
|
0 commit comments