mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-23 23:42:43 +00:00
77 lines
2.8 KiB
Diff
77 lines
2.8 KiB
Diff
|
From 7cc3209558002d95c0d45a1276ba4f5f741eec42 Mon Sep 17 00:00:00 2001
|
||
|
From: Luo Jie <quic_luoj@quicinc.com>
|
||
|
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 <quic_luoj@quicinc.com>
|
||
|
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
|
||
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||
|
---
|
||
|
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);
|