Skip to content

Commit

Permalink
net: phy: allow PHY drivers to implement their own software reset
Browse files Browse the repository at this point in the history
As pointed out by Shaohui, most 10G PHYs out there have a non-standard
compliant software reset sequence, eventually something much more
complex than just toggling the BMCR_RESET bit. Allow PHY driver to
implement their own soft_reset() callback to deal with that. If no
callback is provided, call into genphy_soft_reset() which makes sure the
existing behavior is kept intact.

Reported-by: Shaohui Xie <Shaohui.Xie@freescale.com>
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Florian Fainelli authored and David S. Miller committed Feb 17, 2014
1 parent 797ac07 commit 9df81dd
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 2 deletions.
16 changes: 14 additions & 2 deletions drivers/net/phy/phy_device.c
Original file line number Diff line number Diff line change
Expand Up @@ -535,12 +535,16 @@ static int phy_poll_reset(struct phy_device *phydev)

int phy_init_hw(struct phy_device *phydev)
{
int ret;
int ret = 0;

if (!phydev->drv || !phydev->drv->config_init)
return 0;

ret = genphy_soft_reset(phydev);
if (phydev->drv->soft_reset)
ret = phydev->drv->soft_reset(phydev);
else
ret = genphy_soft_reset(phydev);

if (ret < 0)
return ret;

Expand Down Expand Up @@ -1108,6 +1112,12 @@ static int genphy_config_init(struct phy_device *phydev)
return 0;
}

static int gen10g_soft_reset(struct phy_device *phydev)
{
/* Do nothing for now */
return 0;
}

static int gen10g_config_init(struct phy_device *phydev)
{
/* Temporarily just say we support everything */
Expand Down Expand Up @@ -1282,6 +1292,7 @@ static struct phy_driver genphy_driver[] = {
.phy_id = 0xffffffff,
.phy_id_mask = 0xffffffff,
.name = "Generic PHY",
.soft_reset = genphy_soft_reset,
.config_init = genphy_config_init,
.features = 0,
.config_aneg = genphy_config_aneg,
Expand All @@ -1294,6 +1305,7 @@ static struct phy_driver genphy_driver[] = {
.phy_id = 0xffffffff,
.phy_id_mask = 0xffffffff,
.name = "Generic 10G PHY",
.soft_reset = gen10g_soft_reset,
.config_init = gen10g_config_init,
.features = 0,
.config_aneg = gen10g_config_aneg,
Expand Down
5 changes: 5 additions & 0 deletions include/linux/phy.h
Original file line number Diff line number Diff line change
Expand Up @@ -439,6 +439,11 @@ struct phy_driver {
u32 features;
u32 flags;

/*
* Called to issue a PHY software reset
*/
int (*soft_reset)(struct phy_device *phydev);

/*
* Called to initialize the PHY,
* including after a reset
Expand Down

0 comments on commit 9df81dd

Please sign in to comment.