net: stmmac: Fix wrapper drivers not detecting PHY
authorJose Abreu <Jose.Abreu@synopsys.com>
Fri, 14 Jun 2019 15:06:57 +0000 (17:06 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sat, 15 Jun 2019 20:58:28 +0000 (13:58 -0700)
Because of PHYLINK conversion we stopped parsing the phy-handle property
from DT. Unfortunatelly, some wrapper drivers still rely on this phy
node to configure the PHY.

Let's restore the parsing of PHY handle while these wrapper drivers are
not fully converted to PHYLINK.

Fixes: 74371272f97f ("net: stmmac: Convert to phylink and remove phylib logic")
Reported-by: Corentin Labbe <clabbe.montjoie@gmail.com>
Signed-off-by: Jose Abreu <joabreu@synopsys.com>
Cc: Joao Pinto <jpinto@synopsys.com>
Cc: David S. Miller <davem@davemloft.net>
Cc: Giuseppe Cavallaro <peppe.cavallaro@st.com>
Cc: Alexandre Torgue <alexandre.torgue@st.com>
Tested-by: Corentin Labbe <clabbe.montjoie@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
include/linux/stmmac.h

index ad007d8bf9d702ffa8783236e2f31a46f9186d73..06995159001868fa8d4c7da5e8cd37d2e49f019c 100644 (file)
@@ -958,7 +958,7 @@ static int stmmac_init_phy(struct net_device *dev)
        struct device_node *node;
        int ret;
 
-       node = priv->plat->phy_node;
+       node = priv->plat->phylink_node;
 
        if (node) {
                ret = phylink_of_phy_connect(priv->phylink, node, 0);
@@ -980,7 +980,7 @@ static int stmmac_init_phy(struct net_device *dev)
 
 static int stmmac_phy_setup(struct stmmac_priv *priv)
 {
-       struct device_node *node = priv->plat->phy_node;
+       struct device_node *node = priv->plat->phylink_node;
        int mode = priv->plat->interface;
        struct phylink *phylink;
 
index 898f94aced5331da5aec11cc56f77602404e8070..49adda9b0ad8cb93380d51f14781233c094b670b 100644 (file)
@@ -381,7 +381,13 @@ stmmac_probe_config_dt(struct platform_device *pdev, const char **mac)
 
        *mac = of_get_mac_address(np);
        plat->interface = of_get_phy_mode(np);
-       plat->phy_node = np;
+
+       /* Some wrapper drivers still rely on phy_node. Let's save it while
+        * they are not converted to phylink. */
+       plat->phy_node = of_parse_phandle(np, "phy-handle", 0);
+
+       /* PHYLINK automatically parses the phy-handle property */
+       plat->phylink_node = np;
 
        /* Get max speed of operation from device tree */
        if (of_property_read_u32(np, "max-speed", &plat->max_speed))
@@ -577,6 +583,7 @@ error_pclk_get:
 void stmmac_remove_config_dt(struct platform_device *pdev,
                             struct plat_stmmacenet_data *plat)
 {
+       of_node_put(plat->phy_node);
        of_node_put(plat->mdio_node);
 }
 #else
index 816edb545592752618df30fcbc2e32c306f32417..a3c2d9945bcfcab3499b4dbf275ab96fdd8af379 100644 (file)
@@ -151,6 +151,7 @@ struct plat_stmmacenet_data {
        int interface;
        struct stmmac_mdio_bus_data *mdio_bus_data;
        struct device_node *phy_node;
+       struct device_node *phylink_node;
        struct device_node *mdio_node;
        struct stmmac_dma_cfg *dma_cfg;
        int clk_csr;