Skip to content

Commit

Permalink
Marvell phy: add functions to suspend and resume both interfaces: fib…
Browse files Browse the repository at this point in the history
…er and copper links.

These functions used standards registers in a different page
for both interfaces: copper and fiber.

Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: Charles-Antoine Couret <charles-antoine.couret@nexvision.fr>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Charles-Antoine Couret authored and davem330 committed Jul 19, 2016
1 parent 78301eb commit 3758be3
Showing 1 changed file with 71 additions and 2 deletions.
73 changes: 71 additions & 2 deletions drivers/net/phy/marvell.c
Original file line number Diff line number Diff line change
Expand Up @@ -1224,6 +1224,75 @@ static int marvell_read_status(struct phy_device *phydev)
phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_COPPER);
return err;
}

/* marvell_suspend
*
* Some Marvell's phys have two modes: fiber and copper.
* Both need to be suspended
*/
static int marvell_suspend(struct phy_device *phydev)
{
int err;

/* Suspend the fiber mode first */
if (!(phydev->supported & SUPPORTED_FIBRE)) {
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_FIBER);
if (err < 0)
goto error;

/* With the page set, use the generic suspend */
err = genphy_suspend(phydev);
if (err < 0)
goto error;

/* Then, the copper link */
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_COPPER);
if (err < 0)
goto error;
}

/* With the page set, use the generic suspend */
return genphy_suspend(phydev);

error:
phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_COPPER);
return err;
}

/* marvell_resume
*
* Some Marvell's phys have two modes: fiber and copper.
* Both need to be resumed
*/
static int marvell_resume(struct phy_device *phydev)
{
int err;

/* Resume the fiber mode first */
if (!(phydev->supported & SUPPORTED_FIBRE)) {
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_FIBER);
if (err < 0)
goto error;

/* With the page set, use the generic resume */
err = genphy_resume(phydev);
if (err < 0)
goto error;

/* Then, the copper link */
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_COPPER);
if (err < 0)
goto error;
}

/* With the page set, use the generic resume */
return genphy_resume(phydev);

error:
phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_COPPER);
return err;
}

static int marvell_aneg_done(struct phy_device *phydev)
{
int retval = phy_read(phydev, MII_M1011_PHY_STATUS);
Expand Down Expand Up @@ -1611,8 +1680,8 @@ static struct phy_driver marvell_drivers[] = {
.ack_interrupt = &marvell_ack_interrupt,
.config_intr = &marvell_config_intr,
.did_interrupt = &m88e1121_did_interrupt,
.resume = &genphy_resume,
.suspend = &genphy_suspend,
.resume = &marvell_resume,
.suspend = &marvell_suspend,
.get_sset_count = marvell_get_sset_count,
.get_strings = marvell_get_strings,
.get_stats = marvell_get_stats,
Expand Down

0 comments on commit 3758be3

Please sign in to comment.