mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-23 07:22:33 +00:00
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>
98 lines
3.0 KiB
Diff
98 lines
3.0 KiB
Diff
From 38eb804e8458ba181a03a0498ce4bf84eebd1931 Mon Sep 17 00:00:00 2001
|
|
From: Christian Marangi <ansuelsmth@gmail.com>
|
|
Date: Thu, 14 Dec 2023 01:44:32 +0100
|
|
Subject: [PATCH 2/2] net: phy: at803x: make read specific status function more
|
|
generic
|
|
|
|
Rework read specific status function to be more generic. The function
|
|
apply different speed mask based on the PHY ID. Make it more generic by
|
|
adding an additional arg to pass the specific speed (ss) mask and use
|
|
the provided mask to parse the speed value.
|
|
|
|
This is needed to permit an easier deatch of qca808x code from the
|
|
at803x driver.
|
|
|
|
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
---
|
|
drivers/net/phy/at803x.c | 26 ++++++++++++++++++--------
|
|
1 file changed, 18 insertions(+), 8 deletions(-)
|
|
|
|
--- a/drivers/net/phy/at803x.c
|
|
+++ b/drivers/net/phy/at803x.c
|
|
@@ -301,6 +301,11 @@ static struct at803x_hw_stat qca83xx_hw_
|
|
{ "eee_wake_errors", 0x16, GENMASK(15, 0), MMD},
|
|
};
|
|
|
|
+struct at803x_ss_mask {
|
|
+ u16 speed_mask;
|
|
+ u8 speed_shift;
|
|
+};
|
|
+
|
|
struct at803x_priv {
|
|
int flags;
|
|
u16 clk_25m_reg;
|
|
@@ -921,7 +926,8 @@ static void at803x_link_change_notify(st
|
|
}
|
|
}
|
|
|
|
-static int at803x_read_specific_status(struct phy_device *phydev)
|
|
+static int at803x_read_specific_status(struct phy_device *phydev,
|
|
+ struct at803x_ss_mask ss_mask)
|
|
{
|
|
int ss;
|
|
|
|
@@ -940,11 +946,8 @@ static int at803x_read_specific_status(s
|
|
if (sfc < 0)
|
|
return sfc;
|
|
|
|
- /* qca8081 takes the different bits for speed value from at803x */
|
|
- if (phydev->drv->phy_id == QCA8081_PHY_ID)
|
|
- speed = FIELD_GET(QCA808X_SS_SPEED_MASK, ss);
|
|
- else
|
|
- speed = FIELD_GET(AT803X_SS_SPEED_MASK, ss);
|
|
+ speed = ss & ss_mask.speed_mask;
|
|
+ speed >>= ss_mask.speed_shift;
|
|
|
|
switch (speed) {
|
|
case AT803X_SS_SPEED_10:
|
|
@@ -989,6 +992,7 @@ static int at803x_read_specific_status(s
|
|
static int at803x_read_status(struct phy_device *phydev)
|
|
{
|
|
struct at803x_priv *priv = phydev->priv;
|
|
+ struct at803x_ss_mask ss_mask = { 0 };
|
|
int err, old_link = phydev->link;
|
|
|
|
if (priv->is_1000basex)
|
|
@@ -1012,7 +1016,9 @@ static int at803x_read_status(struct phy
|
|
if (err < 0)
|
|
return err;
|
|
|
|
- err = at803x_read_specific_status(phydev);
|
|
+ ss_mask.speed_mask = AT803X_SS_SPEED_MASK;
|
|
+ ss_mask.speed_shift = __bf_shf(AT803X_SS_SPEED_MASK);
|
|
+ err = at803x_read_specific_status(phydev, ss_mask);
|
|
if (err < 0)
|
|
return err;
|
|
|
|
@@ -1869,6 +1875,7 @@ static int qca808x_config_init(struct ph
|
|
|
|
static int qca808x_read_status(struct phy_device *phydev)
|
|
{
|
|
+ struct at803x_ss_mask ss_mask = { 0 };
|
|
int ret;
|
|
|
|
ret = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_STAT);
|
|
@@ -1882,7 +1889,10 @@ static int qca808x_read_status(struct ph
|
|
if (ret)
|
|
return ret;
|
|
|
|
- ret = at803x_read_specific_status(phydev);
|
|
+ /* qca8081 takes the different bits for speed value from at803x */
|
|
+ ss_mask.speed_mask = QCA808X_SS_SPEED_MASK;
|
|
+ ss_mask.speed_shift = __bf_shf(QCA808X_SS_SPEED_MASK);
|
|
+ ret = at803x_read_specific_status(phydev, ss_mask);
|
|
if (ret < 0)
|
|
return ret;
|
|
|