123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- From ef9df47b449e32e06501a11272809be49019bdb6 Mon Sep 17 00:00:00 2001
- From: Christian Marangi <[email protected]>
- 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 <[email protected]>
- Signed-off-by: David S. Miller <[email protected]>
- ---
- 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,
|