net: stmmac: Fix wrapper drivers not detecting PHY

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: 74371272f9 ("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>
This commit is contained in:
Jose Abreu 2019-06-14 17:06:57 +02:00 committed by David S. Miller
parent 91d0a48a48
commit 4838a54050
3 changed files with 11 additions and 3 deletions

View File

@ -958,7 +958,7 @@ static int stmmac_init_phy(struct net_device *dev)
struct device_node *node; struct device_node *node;
int ret; int ret;
node = priv->plat->phy_node; node = priv->plat->phylink_node;
if (node) { if (node) {
ret = phylink_of_phy_connect(priv->phylink, node, 0); 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) 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; int mode = priv->plat->interface;
struct phylink *phylink; struct phylink *phylink;

View File

@ -381,7 +381,13 @@ stmmac_probe_config_dt(struct platform_device *pdev, const char **mac)
*mac = of_get_mac_address(np); *mac = of_get_mac_address(np);
plat->interface = of_get_phy_mode(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 */ /* Get max speed of operation from device tree */
if (of_property_read_u32(np, "max-speed", &plat->max_speed)) 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, void stmmac_remove_config_dt(struct platform_device *pdev,
struct plat_stmmacenet_data *plat) struct plat_stmmacenet_data *plat)
{ {
of_node_put(plat->phy_node);
of_node_put(plat->mdio_node); of_node_put(plat->mdio_node);
} }
#else #else

View File

@ -151,6 +151,7 @@ struct plat_stmmacenet_data {
int interface; int interface;
struct stmmac_mdio_bus_data *mdio_bus_data; struct stmmac_mdio_bus_data *mdio_bus_data;
struct device_node *phy_node; struct device_node *phy_node;
struct device_node *phylink_node;
struct device_node *mdio_node; struct device_node *mdio_node;
struct stmmac_dma_cfg *dma_cfg; struct stmmac_dma_cfg *dma_cfg;
int clk_csr; int clk_csr;