forked from Openwrt/openwrt
c2c741ccce
Initial backport of at803x PHY driver cleanup. This is in preparation for split and addition of new PHY Family based on at803x needed for ipq807x and other IPQ Series SoC. Other affected patch are automatically refreshed with make target/linux/refresh Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
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);
|