12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- From 7cc3209558002d95c0d45a1276ba4f5f741eec42 Mon Sep 17 00:00:00 2001
- From: Luo Jie <[email protected]>
- Date: Sun, 16 Jul 2023 16:49:21 +0800
- Subject: [PATCH 3/6] net: phy: at803x: enable qca8081 slave seed conditionally
- qca8081 is the single port PHY, the slave prefer mode is used
- by default.
- if the phy master perfer mode is configured, the slave seed
- configuration should not be enabled, since the slave seed
- enablement is for making PHY linked as slave mode easily.
- disable slave seed if the master mode is preferred.
- Signed-off-by: Luo Jie <[email protected]>
- Reviewed-by: Andrew Lunn <[email protected]>
- Signed-off-by: David S. Miller <[email protected]>
- ---
- drivers/net/phy/at803x.c | 25 ++++++++++++++++++++-----
- 1 file changed, 20 insertions(+), 5 deletions(-)
- --- a/drivers/net/phy/at803x.c
- +++ b/drivers/net/phy/at803x.c
- @@ -1745,6 +1745,12 @@ static int qca808x_phy_ms_seed_enable(st
- QCA808X_MASTER_SLAVE_SEED_ENABLE);
- }
-
- +static bool qca808x_is_prefer_master(struct phy_device *phydev)
- +{
- + return (phydev->master_slave_get == MASTER_SLAVE_CFG_MASTER_FORCE) ||
- + (phydev->master_slave_get == MASTER_SLAVE_CFG_MASTER_PREFERRED);
- +}
- +
- static int qca808x_config_init(struct phy_device *phydev)
- {
- int ret;
- @@ -1766,11 +1772,17 @@ static int qca808x_config_init(struct ph
- if (ret)
- return ret;
-
- - /* Enable seed and configure lower ramdom seed to make phy linked as slave mode */
- - ret = qca808x_phy_ms_seed_enable(phydev, true);
- - if (ret)
- + ret = genphy_read_master_slave(phydev);
- + if (ret < 0)
- return ret;
-
- + if (!qca808x_is_prefer_master(phydev)) {
- + /* Enable seed and configure lower ramdom seed to make phy linked as slave mode */
- + ret = qca808x_phy_ms_seed_enable(phydev, true);
- + if (ret)
- + return ret;
- + }
- +
- /* Configure adc threshold as 100mv for the link 10M */
- return at803x_debug_reg_mask(phydev, QCA808X_PHY_DEBUG_ADC_THRESHOLD,
- QCA808X_ADC_THRESHOLD_MASK, QCA808X_ADC_THRESHOLD_100MV);
- @@ -1802,13 +1814,16 @@ static int qca808x_read_status(struct ph
- phydev->interface = PHY_INTERFACE_MODE_SGMII;
- } else {
- /* generate seed as a lower random value to make PHY linked as SLAVE easily,
- - * except for master/slave configuration fault detected.
- + * except for master/slave configuration fault detected or the master mode
- + * preferred.
- + *
- * the reason for not putting this code into the function link_change_notify is
- * the corner case where the link partner is also the qca8081 PHY and the seed
- * value is configured as the same value, the link can't be up and no link change
- * occurs.
- */
- - if (phydev->master_slave_state == MASTER_SLAVE_STATE_ERR) {
- + if (phydev->master_slave_state == MASTER_SLAVE_STATE_ERR ||
- + qca808x_is_prefer_master(phydev)) {
- qca808x_phy_ms_seed_enable(phydev, false);
- } else {
- qca808x_phy_ms_seed_enable(phydev, true);
|