mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-23 15:32:33 +00:00
220 lines
7.2 KiB
Diff
220 lines
7.2 KiB
Diff
|
From ef9df47b449e32e06501a11272809be49019bdb6 Mon Sep 17 00:00:00 2001
|
||
|
From: Christian Marangi <ansuelsmth@gmail.com>
|
||
|
Date: Fri, 8 Dec 2023 15:52:00 +0100
|
||
|
Subject: [PATCH 13/13] net: phy: at803x: drop specific PHY ID check from cable
|
||
|
test functions
|
||
|
|
||
|
Drop specific PHY ID check for cable test functions for at803x. This is
|
||
|
done to make functions more generic. While at it better describe what
|
||
|
the functions does by using more symbolic function names.
|
||
|
|
||
|
PHYs that requires to set additional reg are moved to specific function
|
||
|
calling the more generic one.
|
||
|
|
||
|
cdt_start and cdt_wait_for_completion are changed to take an additional
|
||
|
arg to pass specific values specific to the PHY.
|
||
|
|
||
|
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||
|
---
|
||
|
drivers/net/phy/at803x.c | 95 +++++++++++++++++++++-------------------
|
||
|
1 file changed, 50 insertions(+), 45 deletions(-)
|
||
|
|
||
|
--- a/drivers/net/phy/at803x.c
|
||
|
+++ b/drivers/net/phy/at803x.c
|
||
|
@@ -1222,31 +1222,16 @@ static int at803x_cdt_fault_length(u16 s
|
||
|
return (dt * 824) / 10;
|
||
|
}
|
||
|
|
||
|
-static int at803x_cdt_start(struct phy_device *phydev, int pair)
|
||
|
+static int at803x_cdt_start(struct phy_device *phydev,
|
||
|
+ u32 cdt_start)
|
||
|
{
|
||
|
- u16 cdt;
|
||
|
-
|
||
|
- /* qca8081 takes the different bit 15 to enable CDT test */
|
||
|
- if (phydev->drv->phy_id == QCA8081_PHY_ID)
|
||
|
- cdt = QCA808X_CDT_ENABLE_TEST |
|
||
|
- QCA808X_CDT_LENGTH_UNIT |
|
||
|
- QCA808X_CDT_INTER_CHECK_DIS;
|
||
|
- else
|
||
|
- cdt = FIELD_PREP(AT803X_CDT_MDI_PAIR_MASK, pair) |
|
||
|
- AT803X_CDT_ENABLE_TEST;
|
||
|
-
|
||
|
- return phy_write(phydev, AT803X_CDT, cdt);
|
||
|
+ return phy_write(phydev, AT803X_CDT, cdt_start);
|
||
|
}
|
||
|
|
||
|
-static int at803x_cdt_wait_for_completion(struct phy_device *phydev)
|
||
|
+static int at803x_cdt_wait_for_completion(struct phy_device *phydev,
|
||
|
+ u32 cdt_en)
|
||
|
{
|
||
|
int val, ret;
|
||
|
- u16 cdt_en;
|
||
|
-
|
||
|
- if (phydev->drv->phy_id == QCA8081_PHY_ID)
|
||
|
- cdt_en = QCA808X_CDT_ENABLE_TEST;
|
||
|
- else
|
||
|
- cdt_en = AT803X_CDT_ENABLE_TEST;
|
||
|
|
||
|
/* One test run takes about 25ms */
|
||
|
ret = phy_read_poll_timeout(phydev, AT803X_CDT, val,
|
||
|
@@ -1266,11 +1251,13 @@ static int at803x_cable_test_one_pair(st
|
||
|
};
|
||
|
int ret, val;
|
||
|
|
||
|
- ret = at803x_cdt_start(phydev, pair);
|
||
|
+ val = FIELD_PREP(AT803X_CDT_MDI_PAIR_MASK, pair) |
|
||
|
+ AT803X_CDT_ENABLE_TEST;
|
||
|
+ ret = at803x_cdt_start(phydev, val);
|
||
|
if (ret)
|
||
|
return ret;
|
||
|
|
||
|
- ret = at803x_cdt_wait_for_completion(phydev);
|
||
|
+ ret = at803x_cdt_wait_for_completion(phydev, AT803X_CDT_ENABLE_TEST);
|
||
|
if (ret)
|
||
|
return ret;
|
||
|
|
||
|
@@ -1292,19 +1279,11 @@ static int at803x_cable_test_one_pair(st
|
||
|
}
|
||
|
|
||
|
static int at803x_cable_test_get_status(struct phy_device *phydev,
|
||
|
- bool *finished)
|
||
|
+ bool *finished, unsigned long pair_mask)
|
||
|
{
|
||
|
- unsigned long pair_mask;
|
||
|
int retries = 20;
|
||
|
int pair, ret;
|
||
|
|
||
|
- if (phydev->phy_id == ATH9331_PHY_ID ||
|
||
|
- phydev->phy_id == ATH8032_PHY_ID ||
|
||
|
- phydev->phy_id == QCA9561_PHY_ID)
|
||
|
- pair_mask = 0x3;
|
||
|
- else
|
||
|
- pair_mask = 0xf;
|
||
|
-
|
||
|
*finished = false;
|
||
|
|
||
|
/* According to the datasheet the CDT can be performed when
|
||
|
@@ -1331,7 +1310,7 @@ static int at803x_cable_test_get_status(
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
-static int at803x_cable_test_start(struct phy_device *phydev)
|
||
|
+static void at803x_cable_test_autoneg(struct phy_device *phydev)
|
||
|
{
|
||
|
/* Enable auto-negotiation, but advertise no capabilities, no link
|
||
|
* will be established. A restart of the auto-negotiation is not
|
||
|
@@ -1339,11 +1318,11 @@ static int at803x_cable_test_start(struc
|
||
|
*/
|
||
|
phy_write(phydev, MII_BMCR, BMCR_ANENABLE);
|
||
|
phy_write(phydev, MII_ADVERTISE, ADVERTISE_CSMA);
|
||
|
- if (phydev->phy_id != ATH9331_PHY_ID &&
|
||
|
- phydev->phy_id != ATH8032_PHY_ID &&
|
||
|
- phydev->phy_id != QCA9561_PHY_ID)
|
||
|
- phy_write(phydev, MII_CTRL1000, 0);
|
||
|
+}
|
||
|
|
||
|
+static int at803x_cable_test_start(struct phy_device *phydev)
|
||
|
+{
|
||
|
+ at803x_cable_test_autoneg(phydev);
|
||
|
/* we do all the (time consuming) work later */
|
||
|
return 0;
|
||
|
}
|
||
|
@@ -1618,6 +1597,29 @@ static int at8031_config_intr(struct phy
|
||
|
return at803x_config_intr(phydev);
|
||
|
}
|
||
|
|
||
|
+/* AR8031 and AR8035 share the same cable test get status reg */
|
||
|
+static int at8031_cable_test_get_status(struct phy_device *phydev,
|
||
|
+ bool *finished)
|
||
|
+{
|
||
|
+ return at803x_cable_test_get_status(phydev, finished, 0xf);
|
||
|
+}
|
||
|
+
|
||
|
+/* AR8031 and AR8035 share the same cable test start logic */
|
||
|
+static int at8031_cable_test_start(struct phy_device *phydev)
|
||
|
+{
|
||
|
+ at803x_cable_test_autoneg(phydev);
|
||
|
+ phy_write(phydev, MII_CTRL1000, 0);
|
||
|
+ /* we do all the (time consuming) work later */
|
||
|
+ return 0;
|
||
|
+}
|
||
|
+
|
||
|
+/* AR8032, AR9331 and QCA9561 share the same cable test get status reg */
|
||
|
+static int at8032_cable_test_get_status(struct phy_device *phydev,
|
||
|
+ bool *finished)
|
||
|
+{
|
||
|
+ return at803x_cable_test_get_status(phydev, finished, 0x3);
|
||
|
+}
|
||
|
+
|
||
|
static int at8035_parse_dt(struct phy_device *phydev)
|
||
|
{
|
||
|
struct at803x_priv *priv = phydev->priv;
|
||
|
@@ -2041,11 +2043,14 @@ static int qca808x_cable_test_get_status
|
||
|
|
||
|
*finished = false;
|
||
|
|
||
|
- ret = at803x_cdt_start(phydev, 0);
|
||
|
+ val = QCA808X_CDT_ENABLE_TEST |
|
||
|
+ QCA808X_CDT_LENGTH_UNIT |
|
||
|
+ QCA808X_CDT_INTER_CHECK_DIS;
|
||
|
+ ret = at803x_cdt_start(phydev, val);
|
||
|
if (ret)
|
||
|
return ret;
|
||
|
|
||
|
- ret = at803x_cdt_wait_for_completion(phydev);
|
||
|
+ ret = at803x_cdt_wait_for_completion(phydev, QCA808X_CDT_ENABLE_TEST);
|
||
|
if (ret)
|
||
|
return ret;
|
||
|
|
||
|
@@ -2143,8 +2148,8 @@ static struct phy_driver at803x_driver[]
|
||
|
.handle_interrupt = at803x_handle_interrupt,
|
||
|
.get_tunable = at803x_get_tunable,
|
||
|
.set_tunable = at803x_set_tunable,
|
||
|
- .cable_test_start = at803x_cable_test_start,
|
||
|
- .cable_test_get_status = at803x_cable_test_get_status,
|
||
|
+ .cable_test_start = at8031_cable_test_start,
|
||
|
+ .cable_test_get_status = at8031_cable_test_get_status,
|
||
|
}, {
|
||
|
/* Qualcomm Atheros AR8030 */
|
||
|
.phy_id = ATH8030_PHY_ID,
|
||
|
@@ -2181,8 +2186,8 @@ static struct phy_driver at803x_driver[]
|
||
|
.handle_interrupt = at803x_handle_interrupt,
|
||
|
.get_tunable = at803x_get_tunable,
|
||
|
.set_tunable = at803x_set_tunable,
|
||
|
- .cable_test_start = at803x_cable_test_start,
|
||
|
- .cable_test_get_status = at803x_cable_test_get_status,
|
||
|
+ .cable_test_start = at8031_cable_test_start,
|
||
|
+ .cable_test_get_status = at8031_cable_test_get_status,
|
||
|
}, {
|
||
|
/* Qualcomm Atheros AR8032 */
|
||
|
PHY_ID_MATCH_EXACT(ATH8032_PHY_ID),
|
||
|
@@ -2197,7 +2202,7 @@ static struct phy_driver at803x_driver[]
|
||
|
.config_intr = at803x_config_intr,
|
||
|
.handle_interrupt = at803x_handle_interrupt,
|
||
|
.cable_test_start = at803x_cable_test_start,
|
||
|
- .cable_test_get_status = at803x_cable_test_get_status,
|
||
|
+ .cable_test_get_status = at8032_cable_test_get_status,
|
||
|
}, {
|
||
|
/* ATHEROS AR9331 */
|
||
|
PHY_ID_MATCH_EXACT(ATH9331_PHY_ID),
|
||
|
@@ -2210,7 +2215,7 @@ static struct phy_driver at803x_driver[]
|
||
|
.config_intr = at803x_config_intr,
|
||
|
.handle_interrupt = at803x_handle_interrupt,
|
||
|
.cable_test_start = at803x_cable_test_start,
|
||
|
- .cable_test_get_status = at803x_cable_test_get_status,
|
||
|
+ .cable_test_get_status = at8032_cable_test_get_status,
|
||
|
.read_status = at803x_read_status,
|
||
|
.soft_reset = genphy_soft_reset,
|
||
|
.config_aneg = at803x_config_aneg,
|
||
|
@@ -2226,7 +2231,7 @@ static struct phy_driver at803x_driver[]
|
||
|
.config_intr = at803x_config_intr,
|
||
|
.handle_interrupt = at803x_handle_interrupt,
|
||
|
.cable_test_start = at803x_cable_test_start,
|
||
|
- .cable_test_get_status = at803x_cable_test_get_status,
|
||
|
+ .cable_test_get_status = at8032_cable_test_get_status,
|
||
|
.read_status = at803x_read_status,
|
||
|
.soft_reset = genphy_soft_reset,
|
||
|
.config_aneg = at803x_config_aneg,
|