ramips: mt7620: fix external PHY autopolling
authorPawel Dembicki <paweldembicki@gmail.com>
Mon, 29 Oct 2018 17:30:22 +0000 (17:30 +0000)
committerPetr Štetiar <ynezz@true.cz>
Thu, 20 Jun 2019 06:48:19 +0000 (08:48 +0200)
The port initialisation is based on assumption that phy address and
port number is the same. SoC allow different numbers and some board
have it.

Use phy address instead the port number to make sure that correct
addresses are polled.

In situation when only one PHY with address 0x0 is conected to
port 4, autopolling is broken.

This patch make autopolling correct when port number and phy address
are different.

Signed-off-by: Pawel Dembicki <paweldembicki@gmail.com>
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;
        }
 }