|
@@ -36,52 +36,6 @@ static char *mv88e6171_probe(struct device *host_dev, int sw_addr)
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
-static int mv88e6171_switch_reset(struct dsa_switch *ds)
|
|
|
-{
|
|
|
- struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
|
|
|
- int i;
|
|
|
- int ret;
|
|
|
- unsigned long timeout;
|
|
|
-
|
|
|
- /* Set all ports to the disabled state. */
|
|
|
- for (i = 0; i < ps->num_ports; i++) {
|
|
|
- ret = REG_READ(REG_PORT(i), 0x04);
|
|
|
- REG_WRITE(REG_PORT(i), 0x04, ret & 0xfffc);
|
|
|
- }
|
|
|
-
|
|
|
- /* Wait for transmit queues to drain. */
|
|
|
- usleep_range(2000, 4000);
|
|
|
-
|
|
|
- /* Reset the switch. Keep PPU active. The PPU needs to be
|
|
|
- * 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. */
|
|
|
- timeout = jiffies + 1 * HZ;
|
|
|
- while (time_before(jiffies, timeout)) {
|
|
|
- ret = REG_READ(REG_GLOBAL, 0x00);
|
|
|
- if ((ret & 0xc800) == 0xc800)
|
|
|
- break;
|
|
|
-
|
|
|
- usleep_range(1000, 2000);
|
|
|
- }
|
|
|
- if (time_after(jiffies, timeout))
|
|
|
- return -ETIMEDOUT;
|
|
|
-
|
|
|
- /* Enable ports not under DSA, e.g. WAN port */
|
|
|
- for (i = 0; i < ps->num_ports; i++) {
|
|
|
- if (dsa_is_cpu_port(ds, i) || ds->phys_port_mask & (1 << i))
|
|
|
- continue;
|
|
|
-
|
|
|
- ret = REG_READ(REG_PORT(i), 0x04);
|
|
|
- REG_WRITE(REG_PORT(i), 0x04, ret | 0x03);
|
|
|
- }
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
static int mv88e6171_setup_global(struct dsa_switch *ds)
|
|
|
{
|
|
|
struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
|
|
@@ -282,7 +236,7 @@ static int mv88e6171_setup(struct dsa_switch *ds)
|
|
|
|
|
|
ps->num_ports = 7;
|
|
|
|
|
|
- ret = mv88e6171_switch_reset(ds);
|
|
|
+ ret = mv88e6xxx_switch_reset(ds, true);
|
|
|
if (ret < 0)
|
|
|
return ret;
|
|
|
|