Skip to content

Commit

Permalink
net: phy: marvell: Align set_loopback() implementation
Browse files Browse the repository at this point in the history
Use genphy_loopback() to disable loopback like ksz9031_set_loopback().
This way disable loopback is implemented only once within
genphy_loopback() and the set_loopback() implementations look similar.

Also fix comment about msleep() in the out-of loopback case which is not
executed in the out-of loopback case.

Suggested-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: Gerhard Engleder <gerhard@engleder-embedded.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Link: https://patch.msgid.link/20250312203010.47429-5-gerhard@engleder-embedded.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
  • Loading branch information
Gerhard Engleder authored and Paolo Abeni committed Mar 20, 2025
1 parent fe4bf60 commit 1a0df6c
Showing 1 changed file with 33 additions and 39 deletions.
72 changes: 33 additions & 39 deletions drivers/net/phy/marvell.c
Original file line number Diff line number Diff line change
Expand Up @@ -2133,56 +2133,50 @@ static void marvell_get_stats_simple(struct phy_device *phydev,

static int m88e1510_loopback(struct phy_device *phydev, bool enable, int speed)
{
u16 bmcr_ctl, mscr2_ctl = 0;
int err;

if (enable) {
u16 bmcr_ctl, mscr2_ctl = 0;
if (!enable)
return genphy_loopback(phydev, enable, 0);

if (speed == SPEED_10 || speed == SPEED_100 ||
speed == SPEED_1000)
phydev->speed = speed;
else if (speed)
return -EINVAL;

bmcr_ctl = mii_bmcr_encode_fixed(phydev->speed, phydev->duplex);

err = phy_write(phydev, MII_BMCR, bmcr_ctl);
if (err < 0)
return err;
if (speed == SPEED_10 || speed == SPEED_100 || speed == SPEED_1000)
phydev->speed = speed;
else if (speed)
return -EINVAL;

if (phydev->speed == SPEED_1000)
mscr2_ctl = BMCR_SPEED1000;
else if (phydev->speed == SPEED_100)
mscr2_ctl = BMCR_SPEED100;
bmcr_ctl = mii_bmcr_encode_fixed(phydev->speed, phydev->duplex);

err = phy_modify_paged(phydev, MII_MARVELL_MSCR_PAGE,
MII_88E1510_MSCR_2, BMCR_SPEED1000 |
BMCR_SPEED100, mscr2_ctl);
if (err < 0)
return err;
err = phy_write(phydev, MII_BMCR, bmcr_ctl);
if (err < 0)
return err;

/* Need soft reset to have speed configuration takes effect */
err = genphy_soft_reset(phydev);
if (err < 0)
return err;
if (phydev->speed == SPEED_1000)
mscr2_ctl = BMCR_SPEED1000;
else if (phydev->speed == SPEED_100)
mscr2_ctl = BMCR_SPEED100;

err = phy_modify(phydev, MII_BMCR, BMCR_LOOPBACK,
BMCR_LOOPBACK);
err = phy_modify_paged(phydev, MII_MARVELL_MSCR_PAGE,
MII_88E1510_MSCR_2, BMCR_SPEED1000 |
BMCR_SPEED100, mscr2_ctl);
if (err < 0)
return err;

if (!err) {
/* It takes some time for PHY device to switch
* into/out-of loopback mode.
*/
msleep(1000);
}
/* Need soft reset to have speed configuration takes effect */
err = genphy_soft_reset(phydev);
if (err < 0)
return err;
} else {
err = phy_modify(phydev, MII_BMCR, BMCR_LOOPBACK, 0);
if (err < 0)
return err;

return phy_config_aneg(phydev);
err = phy_modify(phydev, MII_BMCR, BMCR_LOOPBACK,
BMCR_LOOPBACK);

if (!err) {
/*
* It takes some time for PHY device to switch into loopback
* mode.
*/
msleep(1000);
}
return err;
}

static int marvell_vct5_wait_complete(struct phy_device *phydev)
Expand Down

0 comments on commit 1a0df6c

Please sign in to comment.