return ps;
 }
 
+static int mv88e6xxx_smi_init(struct mv88e6xxx_priv_state *ps,
+                             struct mii_bus *bus, int sw_addr)
+{
+       /* ADDR[0] pin is unavailable externally and considered zero */
+       if (sw_addr & 0x1)
+               return -EINVAL;
+
+       ps->bus = bus;
+       ps->sw_addr = sw_addr;
+
+       return 0;
+}
+
 static const char *mv88e6xxx_drv_probe(struct device *dsa_dev,
                                       struct device *host_dev, int sw_addr,
                                       void **priv)
        if (!ps)
                return NULL;
 
-       id = __mv88e6xxx_reg_read(bus, sw_addr, REG_PORT(0), PORT_SWITCH_ID);
+       err = mv88e6xxx_smi_init(ps, bus, sw_addr);
+       if (err)
+               goto free;
+
+       id = mv88e6xxx_reg_read(ps, REG_PORT(0), PORT_SWITCH_ID);
        if (id < 0)
                goto free;
 
 
        name = info->name;
 
-       ps->bus = bus;
-       ps->sw_addr = sw_addr;
        ps->info = info;
 
        err = mv88e6xxx_mdio_register(ps, NULL);
        if (!ps)
                return -ENOMEM;
 
-       ps->bus = mdiodev->bus;
-       ps->sw_addr = mdiodev->addr;
+       err = mv88e6xxx_smi_init(ps, mdiodev->bus, mdiodev->addr);
+       if (err)
+               return err;
 
        id = mv88e6xxx_reg_read(ps, REG_PORT(0), PORT_SWITCH_ID);
        if (id < 0)