ramips: mt7620: fix external PHY autopolling
[openwrt/staging/mkresin.git] / target / linux / ramips / files-4.14 / drivers / net / ethernet / mediatek / soc_mt7620.c
index da8e71c21e7e4f836e0f9edc6c0bb6c9936c96fb..fb2d45a56e5b6b3cf2e9029c6ef734ce2f23e16f 100644 (file)
@@ -118,7 +118,7 @@ static void mt7620_set_mac(struct fe_priv *priv, unsigned char *mac)
        spin_unlock_irqrestore(&priv->page_lock, flags);
 }
 
-static void mt7620_auto_poll(struct mt7620_gsw *gsw)
+static void mt7620_auto_poll(struct mt7620_gsw *gsw, int port)
 {
        int phy;
        int lsb = -1, msb = 0;
@@ -129,7 +129,9 @@ static void mt7620_auto_poll(struct mt7620_gsw *gsw)
                msb = phy;
        }
 
-       if (lsb == msb)
+       if (lsb == msb && port ==  4)
+               msb++;
+       else if (lsb == msb && port ==  5)
                lsb--;
 
        mtk_switch_w32(gsw, PHY_AN_EN | PHY_PRE_EN | PMY_MDC_CONF(5) |
@@ -242,8 +244,8 @@ static void mt7620_port_init(struct fe_priv *priv, struct device_node *np)
 
                mtk_switch_w32(gsw, val, GSW_REG_PORT_PMCR(id));
                fe_connect_phy_node(priv, priv->phy->phy_node[id], id);
-               gsw->autopoll |= BIT(id);
-               mt7620_auto_poll(gsw);
+               gsw->autopoll |= BIT(be32_to_cpup(phy_addr));
+               mt7620_auto_poll(gsw,id);
                return;
        }
 }