Commit 4c732668 authored by Andrew Lunn's avatar Andrew Lunn Committed by David S. Miller

net: dsa: mv88e6171: Enable access to phys via internal mdio bus

When the device is configured to use single chip addressing mode, the
phy devices of the port are not accessible on the host MDIO
bus. Instead the switch internal MDIO bus must be used. For this to
work, the phy polling unit must be enabled.
Signed-off-by: default avatarAndrew Lunn <andrew@lunn.ch>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f3044683
...@@ -51,8 +51,11 @@ static int mv88e6171_switch_reset(struct dsa_switch *ds) ...@@ -51,8 +51,11 @@ static int mv88e6171_switch_reset(struct dsa_switch *ds)
/* Wait for transmit queues to drain. */ /* Wait for transmit queues to drain. */
usleep_range(2000, 4000); usleep_range(2000, 4000);
/* Reset the switch. */ /* Reset the switch. Keep PPU active. The PPU needs to be
REG_WRITE(REG_GLOBAL, 0x04, 0xc400); * active to support indirect phy register accesses through
* global registers 0x18 and 0x19.
*/
REG_WRITE(REG_GLOBAL, 0x04, 0xc000);
/* Wait up to one second for reset to complete. */ /* Wait up to one second for reset to complete. */
timeout = jiffies + 1 * HZ; timeout = jiffies + 1 * HZ;
...@@ -83,11 +86,10 @@ static int mv88e6171_setup_global(struct dsa_switch *ds) ...@@ -83,11 +86,10 @@ static int mv88e6171_setup_global(struct dsa_switch *ds)
int ret; int ret;
int i; int i;
/* Disable the PHY polling unit (since there won't be any /* Discard packets with excessive collisions, mask all
* external PHYs to poll), don't discard packets with * interrupt sources, enable PPU.
* excessive collisions, and mask all interrupt sources.
*/ */
REG_WRITE(REG_GLOBAL, 0x04, 0x0000); REG_WRITE(REG_GLOBAL, 0x04, 0x6000);
/* Set the default address aging time to 5 minutes, and /* Set the default address aging time to 5 minutes, and
* enable address learn messages to be sent to all message * enable address learn messages to be sent to all message
...@@ -336,7 +338,7 @@ mv88e6171_phy_read(struct dsa_switch *ds, int port, int regnum) ...@@ -336,7 +338,7 @@ mv88e6171_phy_read(struct dsa_switch *ds, int port, int regnum)
int ret; int ret;
mutex_lock(&ps->phy_mutex); mutex_lock(&ps->phy_mutex);
ret = mv88e6xxx_phy_read(ds, addr, regnum); ret = mv88e6xxx_phy_read_indirect(ds, addr, regnum);
mutex_unlock(&ps->phy_mutex); mutex_unlock(&ps->phy_mutex);
return ret; return ret;
} }
...@@ -350,7 +352,7 @@ mv88e6171_phy_write(struct dsa_switch *ds, ...@@ -350,7 +352,7 @@ mv88e6171_phy_write(struct dsa_switch *ds,
int ret; int ret;
mutex_lock(&ps->phy_mutex); mutex_lock(&ps->phy_mutex);
ret = mv88e6xxx_phy_write(ds, addr, regnum, val); ret = mv88e6xxx_phy_write_indirect(ds, addr, regnum, val);
mutex_unlock(&ps->phy_mutex); mutex_unlock(&ps->phy_mutex);
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