Commit 1fc4d180 authored by David S. Miller's avatar David S. Miller

Merge branch 'phy-marvell-cleanups'

Andrew Lunn says:

====================
net: phy: marvell: Checkpatch cleanup

I will be contributing a few new features to the Marvell PHY driver
soon. Start by making the code mostly checkpatch clean. There should
not be any functional changes. Just comments set into the correct
format, missing blank lines, turn some comparisons around, and
refactoring to reduce indentation depth.

There is still one camel in the code, but it actually makes sense, so
leave it in piece.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents e26925ec 23beb38f
...@@ -189,6 +189,16 @@ struct marvell_priv { ...@@ -189,6 +189,16 @@ struct marvell_priv {
struct device *hwmon_dev; struct device *hwmon_dev;
}; };
static int marvell_get_page(struct phy_device *phydev)
{
return phy_read(phydev, MII_MARVELL_PHY_PAGE);
}
static int marvell_set_page(struct phy_device *phydev, int page)
{
return phy_write(phydev, MII_MARVELL_PHY_PAGE, page);
}
static int marvell_ack_interrupt(struct phy_device *phydev) static int marvell_ack_interrupt(struct phy_device *phydev)
{ {
int err; int err;
...@@ -207,9 +217,11 @@ static int marvell_config_intr(struct phy_device *phydev) ...@@ -207,9 +217,11 @@ static int marvell_config_intr(struct phy_device *phydev)
int err; int err;
if (phydev->interrupts == PHY_INTERRUPT_ENABLED) if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
err = phy_write(phydev, MII_M1011_IMASK, MII_M1011_IMASK_INIT); err = phy_write(phydev, MII_M1011_IMASK,
MII_M1011_IMASK_INIT);
else else
err = phy_write(phydev, MII_M1011_IMASK, MII_M1011_IMASK_CLEAR); err = phy_write(phydev, MII_M1011_IMASK,
MII_M1011_IMASK_CLEAR);
return err; return err;
} }
...@@ -257,7 +269,8 @@ static int marvell_config_aneg(struct phy_device *phydev) ...@@ -257,7 +269,8 @@ static int marvell_config_aneg(struct phy_device *phydev)
/* The Marvell PHY has an errata which requires /* The Marvell PHY has an errata which requires
* that certain registers get written in order * that certain registers get written in order
* to restart autonegotiation */ * to restart autonegotiation
*/
err = phy_write(phydev, MII_BMCR, BMCR_RESET); err = phy_write(phydev, MII_BMCR, BMCR_RESET);
if (err < 0) if (err < 0)
...@@ -299,8 +312,7 @@ static int marvell_config_aneg(struct phy_device *phydev) ...@@ -299,8 +312,7 @@ static int marvell_config_aneg(struct phy_device *phydev)
if (phydev->autoneg != AUTONEG_ENABLE) { if (phydev->autoneg != AUTONEG_ENABLE) {
int bmcr; int bmcr;
/* /* A write to speed/duplex bits (that is performed by
* A write to speed/duplex bits (that is performed by
* genphy_config_aneg() call above) must be followed by * genphy_config_aneg() call above) must be followed by
* a software reset. Otherwise, the write has no effect. * a software reset. Otherwise, the write has no effect.
*/ */
...@@ -359,8 +371,7 @@ static int m88e1111_config_aneg(struct phy_device *phydev) ...@@ -359,8 +371,7 @@ static int m88e1111_config_aneg(struct phy_device *phydev)
} }
#ifdef CONFIG_OF_MDIO #ifdef CONFIG_OF_MDIO
/* /* Set and/or override some configuration registers based on the
* Set and/or override some configuration registers based on the
* marvell,reg-init property stored in the of_node for the phydev. * marvell,reg-init property stored in the of_node for the phydev.
* *
* marvell,reg-init = <reg-page reg mask value>,...; * marvell,reg-init = <reg-page reg mask value>,...;
...@@ -386,7 +397,7 @@ static int marvell_of_reg_init(struct phy_device *phydev) ...@@ -386,7 +397,7 @@ static int marvell_of_reg_init(struct phy_device *phydev)
if (!paddr || len < (4 * sizeof(*paddr))) if (!paddr || len < (4 * sizeof(*paddr)))
return 0; return 0;
saved_page = phy_read(phydev, MII_MARVELL_PHY_PAGE); saved_page = marvell_get_page(phydev);
if (saved_page < 0) if (saved_page < 0)
return saved_page; return saved_page;
current_page = saved_page; current_page = saved_page;
...@@ -394,15 +405,15 @@ static int marvell_of_reg_init(struct phy_device *phydev) ...@@ -394,15 +405,15 @@ static int marvell_of_reg_init(struct phy_device *phydev)
ret = 0; ret = 0;
len /= sizeof(*paddr); len /= sizeof(*paddr);
for (i = 0; i < len - 3; i += 4) { for (i = 0; i < len - 3; i += 4) {
u16 reg_page = be32_to_cpup(paddr + i); u16 page = be32_to_cpup(paddr + i);
u16 reg = be32_to_cpup(paddr + i + 1); u16 reg = be32_to_cpup(paddr + i + 1);
u16 mask = be32_to_cpup(paddr + i + 2); u16 mask = be32_to_cpup(paddr + i + 2);
u16 val_bits = be32_to_cpup(paddr + i + 3); u16 val_bits = be32_to_cpup(paddr + i + 3);
int val; int val;
if (reg_page != current_page) { if (page != current_page) {
current_page = reg_page; current_page = page;
ret = phy_write(phydev, MII_MARVELL_PHY_PAGE, reg_page); ret = marvell_set_page(phydev, page);
if (ret < 0) if (ret < 0)
goto err; goto err;
} }
...@@ -421,11 +432,10 @@ static int marvell_of_reg_init(struct phy_device *phydev) ...@@ -421,11 +432,10 @@ static int marvell_of_reg_init(struct phy_device *phydev)
ret = phy_write(phydev, reg, val); ret = phy_write(phydev, reg, val);
if (ret < 0) if (ret < 0)
goto err; goto err;
} }
err: err:
if (current_page != saved_page) { if (current_page != saved_page) {
i = phy_write(phydev, MII_MARVELL_PHY_PAGE, saved_page); i = marvell_set_page(phydev, saved_page);
if (ret == 0) if (ret == 0)
ret = i; ret = i;
} }
...@@ -442,15 +452,13 @@ static int m88e1121_config_aneg(struct phy_device *phydev) ...@@ -442,15 +452,13 @@ static int m88e1121_config_aneg(struct phy_device *phydev)
{ {
int err, oldpage, mscr; int err, oldpage, mscr;
oldpage = phy_read(phydev, MII_MARVELL_PHY_PAGE); oldpage = marvell_get_page(phydev);
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, err = marvell_set_page(phydev, MII_88E1121_PHY_MSCR_PAGE);
MII_88E1121_PHY_MSCR_PAGE);
if (err < 0) if (err < 0)
return err; return err;
if (phy_interface_is_rgmii(phydev)) { if (phy_interface_is_rgmii(phydev)) {
mscr = phy_read(phydev, MII_88E1121_PHY_MSCR_REG) & mscr = phy_read(phydev, MII_88E1121_PHY_MSCR_REG) &
MII_88E1121_PHY_MSCR_DELAY_MASK; MII_88E1121_PHY_MSCR_DELAY_MASK;
...@@ -467,7 +475,7 @@ static int m88e1121_config_aneg(struct phy_device *phydev) ...@@ -467,7 +475,7 @@ static int m88e1121_config_aneg(struct phy_device *phydev)
return err; return err;
} }
phy_write(phydev, MII_MARVELL_PHY_PAGE, oldpage); marvell_set_page(phydev, oldpage);
err = phy_write(phydev, MII_BMCR, BMCR_RESET); err = phy_write(phydev, MII_BMCR, BMCR_RESET);
if (err < 0) if (err < 0)
...@@ -485,10 +493,9 @@ static int m88e1318_config_aneg(struct phy_device *phydev) ...@@ -485,10 +493,9 @@ static int m88e1318_config_aneg(struct phy_device *phydev)
{ {
int err, oldpage, mscr; int err, oldpage, mscr;
oldpage = phy_read(phydev, MII_MARVELL_PHY_PAGE); oldpage = marvell_get_page(phydev);
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, err = marvell_set_page(phydev, MII_88E1121_PHY_MSCR_PAGE);
MII_88E1121_PHY_MSCR_PAGE);
if (err < 0) if (err < 0)
return err; return err;
...@@ -499,7 +506,7 @@ static int m88e1318_config_aneg(struct phy_device *phydev) ...@@ -499,7 +506,7 @@ static int m88e1318_config_aneg(struct phy_device *phydev)
if (err < 0) if (err < 0)
return err; return err;
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, oldpage); err = marvell_set_page(phydev, oldpage);
if (err < 0) if (err < 0)
return err; return err;
...@@ -599,7 +606,7 @@ static int m88e1510_config_aneg(struct phy_device *phydev) ...@@ -599,7 +606,7 @@ static int m88e1510_config_aneg(struct phy_device *phydev)
{ {
int err; int err;
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_COPPER); err = marvell_set_page(phydev, MII_M1111_COPPER);
if (err < 0) if (err < 0)
goto error; goto error;
...@@ -609,7 +616,7 @@ static int m88e1510_config_aneg(struct phy_device *phydev) ...@@ -609,7 +616,7 @@ static int m88e1510_config_aneg(struct phy_device *phydev)
goto error; goto error;
/* Then the fiber link */ /* Then the fiber link */
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_FIBER); err = marvell_set_page(phydev, MII_M1111_FIBER);
if (err < 0) if (err < 0)
goto error; goto error;
...@@ -617,10 +624,10 @@ static int m88e1510_config_aneg(struct phy_device *phydev) ...@@ -617,10 +624,10 @@ static int m88e1510_config_aneg(struct phy_device *phydev)
if (err < 0) if (err < 0)
goto error; goto error;
return phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_COPPER); return marvell_set_page(phydev, MII_M1111_COPPER);
error: error:
phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_COPPER); marvell_set_page(phydev, MII_M1111_COPPER);
return err; return err;
} }
...@@ -643,7 +650,7 @@ static int m88e1116r_config_init(struct phy_device *phydev) ...@@ -643,7 +650,7 @@ static int m88e1116r_config_init(struct phy_device *phydev)
mdelay(500); mdelay(500);
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 0); err = marvell_set_page(phydev, 0);
if (err < 0) if (err < 0)
return err; return err;
...@@ -655,7 +662,7 @@ static int m88e1116r_config_init(struct phy_device *phydev) ...@@ -655,7 +662,7 @@ static int m88e1116r_config_init(struct phy_device *phydev)
if (err < 0) if (err < 0)
return err; return err;
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 2); err = marvell_set_page(phydev, 2);
if (err < 0) if (err < 0)
return err; return err;
temp = phy_read(phydev, MII_M1116R_CONTROL_REG_MAC); temp = phy_read(phydev, MII_M1116R_CONTROL_REG_MAC);
...@@ -664,7 +671,7 @@ static int m88e1116r_config_init(struct phy_device *phydev) ...@@ -664,7 +671,7 @@ static int m88e1116r_config_init(struct phy_device *phydev)
err = phy_write(phydev, MII_M1116R_CONTROL_REG_MAC, temp); err = phy_write(phydev, MII_M1116R_CONTROL_REG_MAC, temp);
if (err < 0) if (err < 0)
return err; return err;
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 0); err = marvell_set_page(phydev, 0);
if (err < 0) if (err < 0)
return err; return err;
...@@ -698,13 +705,11 @@ static int m88e3016_config_init(struct phy_device *phydev) ...@@ -698,13 +705,11 @@ static int m88e3016_config_init(struct phy_device *phydev)
return marvell_config_init(phydev); return marvell_config_init(phydev);
} }
static int m88e1111_config_init(struct phy_device *phydev) static int m88e1111_config_init_rgmii(struct phy_device *phydev)
{ {
int err; int err;
int temp; int temp;
if (phy_interface_is_rgmii(phydev)) {
temp = phy_read(phydev, MII_M1111_PHY_EXT_CR); temp = phy_read(phydev, MII_M1111_PHY_EXT_CR);
if (temp < 0) if (temp < 0)
return temp; return temp;
...@@ -734,12 +739,14 @@ static int m88e1111_config_init(struct phy_device *phydev) ...@@ -734,12 +739,14 @@ static int m88e1111_config_init(struct phy_device *phydev)
else else
temp |= MII_M1111_HWCFG_MODE_COPPER_RGMII; temp |= MII_M1111_HWCFG_MODE_COPPER_RGMII;
err = phy_write(phydev, MII_M1111_PHY_EXT_SR, temp); return phy_write(phydev, MII_M1111_PHY_EXT_SR, temp);
if (err < 0) }
return err;
} static int m88e1111_config_init_sgmii(struct phy_device *phydev)
{
int err;
int temp;
if (phydev->interface == PHY_INTERFACE_MODE_SGMII) {
temp = phy_read(phydev, MII_M1111_PHY_EXT_SR); temp = phy_read(phydev, MII_M1111_PHY_EXT_SR);
if (temp < 0) if (temp < 0)
return temp; return temp;
...@@ -757,16 +764,18 @@ static int m88e1111_config_init(struct phy_device *phydev) ...@@ -757,16 +764,18 @@ static int m88e1111_config_init(struct phy_device *phydev)
if (err < 0) if (err < 0)
return err; return err;
err = phy_write(phydev, MII_M1145_PHY_EXT_ADDR_PAGE, return phy_write(phydev, MII_M1145_PHY_EXT_ADDR_PAGE, err & (~0xff));
err & (~0xff)); }
if (err < 0)
return err; static int m88e1111_config_init_rtbi(struct phy_device *phydev)
} {
int err;
int temp;
if (phydev->interface == PHY_INTERFACE_MODE_RTBI) {
temp = phy_read(phydev, MII_M1111_PHY_EXT_CR); temp = phy_read(phydev, MII_M1111_PHY_EXT_CR);
if (temp < 0) if (temp < 0)
return temp; return temp;
temp |= (MII_M1111_RX_DELAY | MII_M1111_TX_DELAY); temp |= (MII_M1111_RX_DELAY | MII_M1111_TX_DELAY);
err = phy_write(phydev, MII_M1111_PHY_EXT_CR, temp); err = phy_write(phydev, MII_M1111_PHY_EXT_CR, temp);
if (err < 0) if (err < 0)
...@@ -775,8 +784,11 @@ static int m88e1111_config_init(struct phy_device *phydev) ...@@ -775,8 +784,11 @@ static int m88e1111_config_init(struct phy_device *phydev)
temp = phy_read(phydev, MII_M1111_PHY_EXT_SR); temp = phy_read(phydev, MII_M1111_PHY_EXT_SR);
if (temp < 0) if (temp < 0)
return temp; return temp;
temp &= ~(MII_M1111_HWCFG_MODE_MASK | MII_M1111_HWCFG_FIBER_COPPER_RES);
temp &= ~(MII_M1111_HWCFG_MODE_MASK |
MII_M1111_HWCFG_FIBER_COPPER_RES);
temp |= 0x7 | MII_M1111_HWCFG_FIBER_COPPER_AUTO; temp |= 0x7 | MII_M1111_HWCFG_FIBER_COPPER_AUTO;
err = phy_write(phydev, MII_M1111_PHY_EXT_SR, temp); err = phy_write(phydev, MII_M1111_PHY_EXT_SR, temp);
if (err < 0) if (err < 0)
return err; return err;
...@@ -785,6 +797,7 @@ static int m88e1111_config_init(struct phy_device *phydev) ...@@ -785,6 +797,7 @@ static int m88e1111_config_init(struct phy_device *phydev)
err = phy_write(phydev, MII_BMCR, BMCR_RESET); err = phy_write(phydev, MII_BMCR, BMCR_RESET);
if (err < 0) if (err < 0)
return err; return err;
do do
temp = phy_read(phydev, MII_BMCR); temp = phy_read(phydev, MII_BMCR);
while (temp & BMCR_RESET); while (temp & BMCR_RESET);
...@@ -792,9 +805,33 @@ static int m88e1111_config_init(struct phy_device *phydev) ...@@ -792,9 +805,33 @@ static int m88e1111_config_init(struct phy_device *phydev)
temp = phy_read(phydev, MII_M1111_PHY_EXT_SR); temp = phy_read(phydev, MII_M1111_PHY_EXT_SR);
if (temp < 0) if (temp < 0)
return temp; return temp;
temp &= ~(MII_M1111_HWCFG_MODE_MASK | MII_M1111_HWCFG_FIBER_COPPER_RES);
temp |= MII_M1111_HWCFG_MODE_COPPER_RTBI | MII_M1111_HWCFG_FIBER_COPPER_AUTO; temp &= ~(MII_M1111_HWCFG_MODE_MASK |
err = phy_write(phydev, MII_M1111_PHY_EXT_SR, temp); MII_M1111_HWCFG_FIBER_COPPER_RES);
temp |= MII_M1111_HWCFG_MODE_COPPER_RTBI |
MII_M1111_HWCFG_FIBER_COPPER_AUTO;
return phy_write(phydev, MII_M1111_PHY_EXT_SR, temp);
}
static int m88e1111_config_init(struct phy_device *phydev)
{
int err;
if (phy_interface_is_rgmii(phydev)) {
err = m88e1111_config_init_rgmii(phydev);
if (err)
return err;
}
if (phydev->interface == PHY_INTERFACE_MODE_SGMII) {
err = m88e1111_config_init_sgmii(phydev);
if (err < 0)
return err;
}
if (phydev->interface == PHY_INTERFACE_MODE_RTBI) {
err = m88e1111_config_init_rtbi(phydev);
if (err < 0) if (err < 0)
return err; return err;
} }
...@@ -810,9 +847,9 @@ static int m88e1121_config_init(struct phy_device *phydev) ...@@ -810,9 +847,9 @@ static int m88e1121_config_init(struct phy_device *phydev)
{ {
int err, oldpage; int err, oldpage;
oldpage = phy_read(phydev, MII_MARVELL_PHY_PAGE); oldpage = marvell_get_page(phydev);
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_88E1121_PHY_LED_PAGE); err = marvell_set_page(phydev, MII_88E1121_PHY_LED_PAGE);
if (err < 0) if (err < 0)
return err; return err;
...@@ -822,7 +859,7 @@ static int m88e1121_config_init(struct phy_device *phydev) ...@@ -822,7 +859,7 @@ static int m88e1121_config_init(struct phy_device *phydev)
if (err < 0) if (err < 0)
return err; return err;
phy_write(phydev, MII_MARVELL_PHY_PAGE, oldpage); marvell_set_page(phydev, oldpage);
/* Set marvell,reg-init configuration from device tree */ /* Set marvell,reg-init configuration from device tree */
return marvell_config_init(phydev); return marvell_config_init(phydev);
...@@ -836,7 +873,7 @@ static int m88e1510_config_init(struct phy_device *phydev) ...@@ -836,7 +873,7 @@ static int m88e1510_config_init(struct phy_device *phydev)
/* SGMII-to-Copper mode initialization */ /* SGMII-to-Copper mode initialization */
if (phydev->interface == PHY_INTERFACE_MODE_SGMII) { if (phydev->interface == PHY_INTERFACE_MODE_SGMII) {
/* Select page 18 */ /* Select page 18 */
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 18); err = marvell_set_page(phydev, 18);
if (err < 0) if (err < 0)
return err; return err;
...@@ -855,7 +892,7 @@ static int m88e1510_config_init(struct phy_device *phydev) ...@@ -855,7 +892,7 @@ static int m88e1510_config_init(struct phy_device *phydev)
return err; return err;
/* Reset page selection */ /* Reset page selection */
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 0); err = marvell_set_page(phydev, 0);
if (err < 0) if (err < 0)
return err; return err;
} }
...@@ -885,7 +922,7 @@ static int m88e1118_config_init(struct phy_device *phydev) ...@@ -885,7 +922,7 @@ static int m88e1118_config_init(struct phy_device *phydev)
int err; int err;
/* Change address */ /* Change address */
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 0x0002); err = marvell_set_page(phydev, 2);
if (err < 0) if (err < 0)
return err; return err;
...@@ -895,7 +932,7 @@ static int m88e1118_config_init(struct phy_device *phydev) ...@@ -895,7 +932,7 @@ static int m88e1118_config_init(struct phy_device *phydev)
return err; return err;
/* Change address */ /* Change address */
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 0x0003); err = marvell_set_page(phydev, 3);
if (err < 0) if (err < 0)
return err; return err;
...@@ -912,7 +949,7 @@ static int m88e1118_config_init(struct phy_device *phydev) ...@@ -912,7 +949,7 @@ static int m88e1118_config_init(struct phy_device *phydev)
return err; return err;
/* Reset address */ /* Reset address */
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 0x0); err = marvell_set_page(phydev, 0);
if (err < 0) if (err < 0)
return err; return err;
...@@ -924,7 +961,7 @@ static int m88e1149_config_init(struct phy_device *phydev) ...@@ -924,7 +961,7 @@ static int m88e1149_config_init(struct phy_device *phydev)
int err; int err;
/* Change address */ /* Change address */
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 0x0002); err = marvell_set_page(phydev, 2);
if (err < 0) if (err < 0)
return err; return err;
...@@ -938,37 +975,18 @@ static int m88e1149_config_init(struct phy_device *phydev) ...@@ -938,37 +975,18 @@ static int m88e1149_config_init(struct phy_device *phydev)
return err; return err;
/* Reset address */ /* Reset address */
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 0x0); err = marvell_set_page(phydev, 0);
if (err < 0) if (err < 0)
return err; return err;
return phy_write(phydev, MII_BMCR, BMCR_RESET); return phy_write(phydev, MII_BMCR, BMCR_RESET);
} }
static int m88e1145_config_init(struct phy_device *phydev) static int m88e1145_config_init_rgmii(struct phy_device *phydev)
{ {
int err; int err;
int temp;
/* Take care of errata E0 & E1 */
err = phy_write(phydev, 0x1d, 0x001b);
if (err < 0)
return err;
err = phy_write(phydev, 0x1e, 0x418f);
if (err < 0)
return err;
err = phy_write(phydev, 0x1d, 0x0016);
if (err < 0)
return err;
err = phy_write(phydev, 0x1e, 0xa2da);
if (err < 0)
return err;
if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) {
int temp = phy_read(phydev, MII_M1145_PHY_EXT_CR); int temp = phy_read(phydev, MII_M1145_PHY_EXT_CR);
if (temp < 0) if (temp < 0)
return temp; return temp;
...@@ -1000,13 +1018,14 @@ static int m88e1145_config_init(struct phy_device *phydev) ...@@ -1000,13 +1018,14 @@ static int m88e1145_config_init(struct phy_device *phydev)
return err; return err;
err = phy_write(phydev, 0x1e, 0x8000); err = phy_write(phydev, 0x1e, 0x8000);
if (err < 0)
return err;
}
} }
return err;
}
static int m88e1145_config_init_sgmii(struct phy_device *phydev)
{
int temp = phy_read(phydev, MII_M1145_PHY_EXT_SR);
if (phydev->interface == PHY_INTERFACE_MODE_SGMII) {
temp = phy_read(phydev, MII_M1145_PHY_EXT_SR);
if (temp < 0) if (temp < 0)
return temp; return temp;
...@@ -1014,7 +1033,38 @@ static int m88e1145_config_init(struct phy_device *phydev) ...@@ -1014,7 +1033,38 @@ static int m88e1145_config_init(struct phy_device *phydev)
temp |= MII_M1145_HWCFG_MODE_SGMII_NO_CLK; temp |= MII_M1145_HWCFG_MODE_SGMII_NO_CLK;
temp |= MII_M1145_HWCFG_FIBER_COPPER_AUTO; temp |= MII_M1145_HWCFG_FIBER_COPPER_AUTO;
err = phy_write(phydev, MII_M1145_PHY_EXT_SR, temp); return phy_write(phydev, MII_M1145_PHY_EXT_SR, temp);
}
static int m88e1145_config_init(struct phy_device *phydev)
{
int err;
/* Take care of errata E0 & E1 */
err = phy_write(phydev, 0x1d, 0x001b);
if (err < 0)
return err;
err = phy_write(phydev, 0x1e, 0x418f);
if (err < 0)
return err;
err = phy_write(phydev, 0x1d, 0x0016);
if (err < 0)
return err;
err = phy_write(phydev, 0x1e, 0xa2da);
if (err < 0)
return err;
if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) {
err = m88e1145_config_init_rgmii(phydev);
if (err < 0)
return err;
}
if (phydev->interface == PHY_INTERFACE_MODE_SGMII) {
err = m88e1145_config_init_sgmii(phydev);
if (err < 0) if (err < 0)
return err; return err;
} }
...@@ -1057,7 +1107,8 @@ static int marvell_update_link(struct phy_device *phydev, int fiber) ...@@ -1057,7 +1107,8 @@ static int marvell_update_link(struct phy_device *phydev, int fiber)
int status; int status;
/* Use the generic register for copper link, or specific /* Use the generic register for copper link, or specific
* register for fiber case */ * register for fiber case
*/
if (fiber) { if (fiber) {
status = phy_read(phydev, MII_M1011_PHY_STATUS); status = phy_read(phydev, MII_M1011_PHY_STATUS);
if (status < 0) if (status < 0)
...@@ -1074,35 +1125,14 @@ static int marvell_update_link(struct phy_device *phydev, int fiber) ...@@ -1074,35 +1125,14 @@ static int marvell_update_link(struct phy_device *phydev, int fiber)
return 0; return 0;
} }
/* marvell_read_status_page static int marvell_read_status_page_an(struct phy_device *phydev,
* int fiber)
* Description:
* Check the link, then figure out the current state
* by comparing what we advertise with what the link partner
* advertises. Start by checking the gigabit possibilities,
* then move on to 10/100.
*/
static int marvell_read_status_page(struct phy_device *phydev, int page)
{ {
int adv; int status;
int err;
int lpa; int lpa;
int lpagb; int lpagb;
int status = 0; int adv;
int fiber;
/* Detect and update the link, but return if there
* was an error */
if (page == MII_M1111_FIBER)
fiber = 1;
else
fiber = 0;
err = marvell_update_link(phydev, fiber);
if (err)
return err;
if (AUTONEG_ENABLE == phydev->autoneg) {
status = phy_read(phydev, MII_M1011_PHY_STATUS); status = phy_read(phydev, MII_M1011_PHY_STATUS);
if (status < 0) if (status < 0)
return status; return status;
...@@ -1127,7 +1157,8 @@ static int marvell_read_status_page(struct phy_device *phydev, int page) ...@@ -1127,7 +1157,8 @@ static int marvell_read_status_page(struct phy_device *phydev, int page)
phydev->duplex = DUPLEX_HALF; phydev->duplex = DUPLEX_HALF;
status = status & MII_M1011_PHY_STATUS_SPD_MASK; status = status & MII_M1011_PHY_STATUS_SPD_MASK;
phydev->pause = phydev->asym_pause = 0; phydev->pause = 0;
phydev->asym_pause = 0;
switch (status) { switch (status) {
case MII_M1011_PHY_STATUS_1000: case MII_M1011_PHY_STATUS_1000:
...@@ -1144,7 +1175,8 @@ static int marvell_read_status_page(struct phy_device *phydev, int page) ...@@ -1144,7 +1175,8 @@ static int marvell_read_status_page(struct phy_device *phydev, int page)
} }
if (!fiber) { if (!fiber) {
phydev->lp_advertising = mii_stat1000_to_ethtool_lpa_t(lpagb) | phydev->lp_advertising =
mii_stat1000_to_ethtool_lpa_t(lpagb) |
mii_lpa_to_ethtool_lpa_t(lpa); mii_lpa_to_ethtool_lpa_t(lpa);
if (phydev->duplex == DUPLEX_FULL) { if (phydev->duplex == DUPLEX_FULL) {
...@@ -1168,7 +1200,11 @@ static int marvell_read_status_page(struct phy_device *phydev, int page) ...@@ -1168,7 +1200,11 @@ static int marvell_read_status_page(struct phy_device *phydev, int page)
} }
} }
} }
} else { return 0;
}
static int marvell_read_status_page_fixed(struct phy_device *phydev)
{
int bmcr = phy_read(phydev, MII_BMCR); int bmcr = phy_read(phydev, MII_BMCR);
if (bmcr < 0) if (bmcr < 0)
...@@ -1186,13 +1222,46 @@ static int marvell_read_status_page(struct phy_device *phydev, int page) ...@@ -1186,13 +1222,46 @@ static int marvell_read_status_page(struct phy_device *phydev, int page)
else else
phydev->speed = SPEED_10; phydev->speed = SPEED_10;
phydev->pause = phydev->asym_pause = 0; phydev->pause = 0;
phydev->asym_pause = 0;
phydev->lp_advertising = 0; phydev->lp_advertising = 0;
}
return 0; return 0;
} }
/* marvell_read_status_page
*
* Description:
* Check the link, then figure out the current state
* by comparing what we advertise with what the link partner
* advertises. Start by checking the gigabit possibilities,
* then move on to 10/100.
*/
static int marvell_read_status_page(struct phy_device *phydev, int page)
{
int fiber;
int err;
/* Detect and update the link, but return if there
* was an error
*/
if (page == MII_M1111_FIBER)
fiber = 1;
else
fiber = 0;
err = marvell_update_link(phydev, fiber);
if (err)
return err;
if (phydev->autoneg == AUTONEG_ENABLE)
err = marvell_read_status_page_an(phydev, fiber);
else
err = marvell_read_status_page_fixed(phydev);
return err;
}
/* marvell_read_status /* marvell_read_status
* *
* Some Marvell's phys have two modes: fiber and copper. * Some Marvell's phys have two modes: fiber and copper.
...@@ -1209,7 +1278,7 @@ static int marvell_read_status(struct phy_device *phydev) ...@@ -1209,7 +1278,7 @@ static int marvell_read_status(struct phy_device *phydev)
/* Check the fiber mode first */ /* Check the fiber mode first */
if (phydev->supported & SUPPORTED_FIBRE && if (phydev->supported & SUPPORTED_FIBRE &&
phydev->interface != PHY_INTERFACE_MODE_SGMII) { phydev->interface != PHY_INTERFACE_MODE_SGMII) {
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_FIBER); err = marvell_set_page(phydev, MII_M1111_FIBER);
if (err < 0) if (err < 0)
goto error; goto error;
...@@ -1217,17 +1286,18 @@ static int marvell_read_status(struct phy_device *phydev) ...@@ -1217,17 +1286,18 @@ static int marvell_read_status(struct phy_device *phydev)
if (err < 0) if (err < 0)
goto error; goto error;
/* If the fiber link is up, it is the selected and used link. /* If the fiber link is up, it is the selected and
* In this case, we need to stay in the fiber page. * used link. In this case, we need to stay in the
* Please to be careful about that, avoid to restore Copper page * fiber page. Please to be careful about that, avoid
* in other functions which could break the behaviour * to restore Copper page in other functions which
* for some fiber phy like 88E1512. * could break the behaviour for some fiber phy like
* */ * 88E1512.
*/
if (phydev->link) if (phydev->link)
return 0; return 0;
/* If fiber link is down, check and save copper mode state */ /* If fiber link is down, check and save copper mode state */
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_COPPER); err = marvell_set_page(phydev, MII_M1111_COPPER);
if (err < 0) if (err < 0)
goto error; goto error;
} }
...@@ -1235,7 +1305,7 @@ static int marvell_read_status(struct phy_device *phydev) ...@@ -1235,7 +1305,7 @@ static int marvell_read_status(struct phy_device *phydev)
return marvell_read_status_page(phydev, MII_M1111_COPPER); return marvell_read_status_page(phydev, MII_M1111_COPPER);
error: error:
phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_COPPER); marvell_set_page(phydev, MII_M1111_COPPER);
return err; return err;
} }
...@@ -1250,7 +1320,7 @@ static int marvell_suspend(struct phy_device *phydev) ...@@ -1250,7 +1320,7 @@ static int marvell_suspend(struct phy_device *phydev)
/* Suspend the fiber mode first */ /* Suspend the fiber mode first */
if (!(phydev->supported & SUPPORTED_FIBRE)) { if (!(phydev->supported & SUPPORTED_FIBRE)) {
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_FIBER); err = marvell_set_page(phydev, MII_M1111_FIBER);
if (err < 0) if (err < 0)
goto error; goto error;
...@@ -1260,7 +1330,7 @@ static int marvell_suspend(struct phy_device *phydev) ...@@ -1260,7 +1330,7 @@ static int marvell_suspend(struct phy_device *phydev)
goto error; goto error;
/* Then, the copper link */ /* Then, the copper link */
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_COPPER); err = marvell_set_page(phydev, MII_M1111_COPPER);
if (err < 0) if (err < 0)
goto error; goto error;
} }
...@@ -1269,7 +1339,7 @@ static int marvell_suspend(struct phy_device *phydev) ...@@ -1269,7 +1339,7 @@ static int marvell_suspend(struct phy_device *phydev)
return genphy_suspend(phydev); return genphy_suspend(phydev);
error: error:
phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_COPPER); marvell_set_page(phydev, MII_M1111_COPPER);
return err; return err;
} }
...@@ -1284,7 +1354,7 @@ static int marvell_resume(struct phy_device *phydev) ...@@ -1284,7 +1354,7 @@ static int marvell_resume(struct phy_device *phydev)
/* Resume the fiber mode first */ /* Resume the fiber mode first */
if (!(phydev->supported & SUPPORTED_FIBRE)) { if (!(phydev->supported & SUPPORTED_FIBRE)) {
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_FIBER); err = marvell_set_page(phydev, MII_M1111_FIBER);
if (err < 0) if (err < 0)
goto error; goto error;
...@@ -1294,7 +1364,7 @@ static int marvell_resume(struct phy_device *phydev) ...@@ -1294,7 +1364,7 @@ static int marvell_resume(struct phy_device *phydev)
goto error; goto error;
/* Then, the copper link */ /* Then, the copper link */
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_COPPER); err = marvell_set_page(phydev, MII_M1111_COPPER);
if (err < 0) if (err < 0)
goto error; goto error;
} }
...@@ -1303,13 +1373,14 @@ static int marvell_resume(struct phy_device *phydev) ...@@ -1303,13 +1373,14 @@ static int marvell_resume(struct phy_device *phydev)
return genphy_resume(phydev); return genphy_resume(phydev);
error: error:
phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_COPPER); marvell_set_page(phydev, MII_M1111_COPPER);
return err; 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);
return (retval < 0) ? retval : (retval & MII_M1011_PHY_STATUS_RESOLVED); return (retval < 0) ? retval : (retval & MII_M1011_PHY_STATUS_RESOLVED);
} }
...@@ -1325,32 +1396,33 @@ static int m88e1121_did_interrupt(struct phy_device *phydev) ...@@ -1325,32 +1396,33 @@ static int m88e1121_did_interrupt(struct phy_device *phydev)
return 0; return 0;
} }
static void m88e1318_get_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol) static void m88e1318_get_wol(struct phy_device *phydev,
struct ethtool_wolinfo *wol)
{ {
wol->supported = WAKE_MAGIC; wol->supported = WAKE_MAGIC;
wol->wolopts = 0; wol->wolopts = 0;
if (phy_write(phydev, MII_MARVELL_PHY_PAGE, if (marvell_set_page(phydev, MII_88E1318S_PHY_WOL_PAGE) < 0)
MII_88E1318S_PHY_WOL_PAGE) < 0)
return; return;
if (phy_read(phydev, MII_88E1318S_PHY_WOL_CTRL) & if (phy_read(phydev, MII_88E1318S_PHY_WOL_CTRL) &
MII_88E1318S_PHY_WOL_CTRL_MAGIC_PACKET_MATCH_ENABLE) MII_88E1318S_PHY_WOL_CTRL_MAGIC_PACKET_MATCH_ENABLE)
wol->wolopts |= WAKE_MAGIC; wol->wolopts |= WAKE_MAGIC;
if (phy_write(phydev, MII_MARVELL_PHY_PAGE, 0x00) < 0) if (marvell_set_page(phydev, 0x00) < 0)
return; return;
} }
static int m88e1318_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol) static int m88e1318_set_wol(struct phy_device *phydev,
struct ethtool_wolinfo *wol)
{ {
int err, oldpage, temp; int err, oldpage, temp;
oldpage = phy_read(phydev, MII_MARVELL_PHY_PAGE); oldpage = marvell_get_page(phydev);
if (wol->wolopts & WAKE_MAGIC) { if (wol->wolopts & WAKE_MAGIC) {
/* Explicitly switch to page 0x00, just to be sure */ /* Explicitly switch to page 0x00, just to be sure */
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 0x00); err = marvell_set_page(phydev, 0x00);
if (err < 0) if (err < 0)
return err; return err;
...@@ -1361,8 +1433,7 @@ static int m88e1318_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *w ...@@ -1361,8 +1433,7 @@ static int m88e1318_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *w
if (err < 0) if (err < 0)
return err; return err;
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, err = marvell_set_page(phydev, MII_88E1318S_PHY_LED_PAGE);
MII_88E1318S_PHY_LED_PAGE);
if (err < 0) if (err < 0)
return err; return err;
...@@ -1375,8 +1446,7 @@ static int m88e1318_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *w ...@@ -1375,8 +1446,7 @@ static int m88e1318_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *w
if (err < 0) if (err < 0)
return err; return err;
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, err = marvell_set_page(phydev, MII_88E1318S_PHY_WOL_PAGE);
MII_88E1318S_PHY_WOL_PAGE);
if (err < 0) if (err < 0)
return err; return err;
...@@ -1405,8 +1475,7 @@ static int m88e1318_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *w ...@@ -1405,8 +1475,7 @@ static int m88e1318_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *w
if (err < 0) if (err < 0)
return err; return err;
} else { } else {
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, err = marvell_set_page(phydev, MII_88E1318S_PHY_WOL_PAGE);
MII_88E1318S_PHY_WOL_PAGE);
if (err < 0) if (err < 0)
return err; return err;
...@@ -1419,7 +1488,7 @@ static int m88e1318_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *w ...@@ -1419,7 +1488,7 @@ static int m88e1318_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *w
return err; return err;
} }
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, oldpage); err = marvell_set_page(phydev, oldpage);
if (err < 0) if (err < 0)
return err; return err;
...@@ -1454,9 +1523,8 @@ static u64 marvell_get_stat(struct phy_device *phydev, int i) ...@@ -1454,9 +1523,8 @@ static u64 marvell_get_stat(struct phy_device *phydev, int i)
int err, oldpage, val; int err, oldpage, val;
u64 ret; u64 ret;
oldpage = phy_read(phydev, MII_MARVELL_PHY_PAGE); oldpage = marvell_get_page(phydev);
err = phy_write(phydev, MII_MARVELL_PHY_PAGE, err = marvell_set_page(phydev, stat.page);
stat.page);
if (err < 0) if (err < 0)
return UINT64_MAX; return UINT64_MAX;
...@@ -1469,7 +1537,7 @@ static u64 marvell_get_stat(struct phy_device *phydev, int i) ...@@ -1469,7 +1537,7 @@ static u64 marvell_get_stat(struct phy_device *phydev, int i)
ret = priv->stats[i]; ret = priv->stats[i];
} }
phy_write(phydev, MII_MARVELL_PHY_PAGE, oldpage); marvell_set_page(phydev, oldpage);
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment