Skip to content

Commit

Permalink
net: phy: at803x: make read specific status function more generic
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Christian Marangi authored and David S. Miller committed Dec 15, 2023
1 parent 8e732f1 commit 38eb804
Showing 1 changed file with 18 additions and 8 deletions.
26 changes: 18 additions & 8 deletions drivers/net/phy/at803x.c
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,11 @@ static struct at803x_hw_stat qca83xx_hw_stats[] = {
{ "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;
Expand Down Expand Up @@ -921,7 +926,8 @@ static void at803x_link_change_notify(struct phy_device *phydev)
}
}

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;

Expand All @@ -940,11 +946,8 @@ static int at803x_read_specific_status(struct phy_device *phydev)
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:
Expand Down Expand Up @@ -989,6 +992,7 @@ static int at803x_read_specific_status(struct phy_device *phydev)
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)
Expand All @@ -1012,7 +1016,9 @@ static int at803x_read_status(struct phy_device *phydev)
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;

Expand Down Expand Up @@ -1869,6 +1875,7 @@ static int qca808x_config_init(struct phy_device *phydev)

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);
Expand All @@ -1882,7 +1889,10 @@ static int qca808x_read_status(struct phy_device *phydev)
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;

Expand Down

0 comments on commit 38eb804

Please sign in to comment.