Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3758be3d authored by Charles-Antoine Couret's avatar Charles-Antoine Couret Committed by David S. Miller
Browse files

Marvell phy: add functions to suspend and resume both interfaces: fiber and copper links.



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

Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
Signed-off-by: default avatarCharles-Antoine Couret <charles-antoine.couret@nexvision.fr>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 78301ebe
Loading
Loading
Loading
Loading
+71 −2
Original line number Original line Diff line number Diff line
@@ -1224,6 +1224,75 @@ static int marvell_read_status(struct phy_device *phydev)
	phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_COPPER);
	phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_COPPER);
	return err;
	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)
static int marvell_aneg_done(struct phy_device *phydev)
{
{
	int retval = phy_read(phydev, MII_M1011_PHY_STATUS);
	int retval = phy_read(phydev, MII_M1011_PHY_STATUS);
@@ -1611,8 +1680,8 @@ static struct phy_driver marvell_drivers[] = {
		.ack_interrupt = &marvell_ack_interrupt,
		.ack_interrupt = &marvell_ack_interrupt,
		.config_intr = &marvell_config_intr,
		.config_intr = &marvell_config_intr,
		.did_interrupt = &m88e1121_did_interrupt,
		.did_interrupt = &m88e1121_did_interrupt,
		.resume = &genphy_resume,
		.resume = &marvell_resume,
		.suspend = &genphy_suspend,
		.suspend = &marvell_suspend,
		.get_sset_count = marvell_get_sset_count,
		.get_sset_count = marvell_get_sset_count,
		.get_strings = marvell_get_strings,
		.get_strings = marvell_get_strings,
		.get_stats = marvell_get_stats,
		.get_stats = marvell_get_stats,