return 0;
 }
 
+static int mvneta_comphy_init(struct mvneta_port *pp)
+{
+       int ret;
+
+       if (!pp->comphy)
+               return 0;
+
+       ret = phy_set_mode_ext(pp->comphy, PHY_MODE_ETHERNET,
+                              pp->phy_interface);
+       if (ret)
+               return ret;
+
+       return phy_power_on(pp->comphy);
+}
+
 static void mvneta_start_dev(struct mvneta_port *pp)
 {
        int cpu;
 
-       WARN_ON(phy_power_on(pp->comphy));
+       WARN_ON(mvneta_comphy_init(pp));
 
        mvneta_max_rx_size_set(pp, pp->pkt_size);
        mvneta_txq_max_tx_size_set(pp, pp->pkt_size);
        if (state->speed == SPEED_2500)
                new_ctrl4 |= MVNETA_GMAC4_SHORT_PREAMBLE_ENABLE;
 
-       if (pp->comphy &&
+       if (pp->comphy && pp->phy_interface != state->interface &&
            (state->interface == PHY_INTERFACE_MODE_SGMII ||
             state->interface == PHY_INTERFACE_MODE_1000BASEX ||
-            state->interface == PHY_INTERFACE_MODE_2500BASEX))
-               WARN_ON(phy_set_mode_ext(pp->comphy, PHY_MODE_ETHERNET,
-                                        state->interface));
+            state->interface == PHY_INTERFACE_MODE_2500BASEX)) {
+               pp->phy_interface = state->interface;
+
+               WARN_ON(phy_power_off(pp->comphy));
+               WARN_ON(mvneta_comphy_init(pp));
+       }
 
        if (new_ctrl0 != gmac_ctrl0)
                mvreg_write(pp, MVNETA_GMAC_CTRL_0, new_ctrl0);