Skip to content

Commit 09c4c57

Browse files
lunndavem330
authored andcommitted
net: phy: aquantia: add support for auto-negotiation configuration
Make use of the generic c45 code, plus code specific to the Aquantia phy for 1000BaseT negotiation. Signed-off-by: Andrew Lunn <[email protected]> Signed-off-by: Heiner Kallweit <[email protected]> Reviewed-by: Florian Fainelli <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 0974f1f commit 09c4c57

File tree

1 file changed

+37
-3
lines changed

1 file changed

+37
-3
lines changed

drivers/net/phy/aquantia.c

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
2020
#define PHY_ID_AQCS109 0x03a1b5c2
2121
#define PHY_ID_AQR405 0x03a1b4b0
2222

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+
2327
#define MDIO_AN_TX_VEND_STATUS1 0xc800
2428
#define MDIO_AN_TX_VEND_STATUS1_10BASET (0x0 << 1)
2529
#define MDIO_AN_TX_VEND_STATUS1_100BASETX (0x1 << 1)
@@ -64,10 +68,40 @@
6468

6569
static int aqr_config_aneg(struct phy_device *phydev)
6670
{
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;
6974

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);
71105
}
72106

73107
static int aqr_config_intr(struct phy_device *phydev)

0 commit comments

Comments
 (0)