diff options
Diffstat (limited to 'target/linux/layerscape/patches-5.4/701-net-0317-staging-fsl_ppfe-eth-separate-mdio-init-from-mac-ini.patch')
-rw-r--r-- | target/linux/layerscape/patches-5.4/701-net-0317-staging-fsl_ppfe-eth-separate-mdio-init-from-mac-ini.patch | 650 |
1 files changed, 0 insertions, 650 deletions
diff --git a/target/linux/layerscape/patches-5.4/701-net-0317-staging-fsl_ppfe-eth-separate-mdio-init-from-mac-ini.patch b/target/linux/layerscape/patches-5.4/701-net-0317-staging-fsl_ppfe-eth-separate-mdio-init-from-mac-ini.patch deleted file mode 100644 index 74fb01ce0b..0000000000 --- a/target/linux/layerscape/patches-5.4/701-net-0317-staging-fsl_ppfe-eth-separate-mdio-init-from-mac-ini.patch +++ /dev/null @@ -1,650 +0,0 @@ -From 8848f975ce42674b8bc8dedb5c7b326a42088e99 Mon Sep 17 00:00:00 2001 -From: Calvin Johnson <calvin.johnson@nxp.com> -Date: Mon, 10 Dec 2018 10:22:33 +0530 -Subject: [PATCH] staging: fsl_ppfe/eth: separate mdio init from mac init - -- separate mdio initialization from mac initialization -- Define pfe_mdio_priv_s structure to hold mii_bus structure and other - related data. -- Modify functions to work with the separted mdio init model. - -Signed-off-by: Calvin Johnson <calvin.johnson@nxp.com> ---- - drivers/staging/fsl_ppfe/pfe_eth.c | 232 ++++++++++-------------- - drivers/staging/fsl_ppfe/pfe_eth.h | 17 +- - drivers/staging/fsl_ppfe/pfe_ls1012a_platform.c | 50 ++--- - drivers/staging/fsl_ppfe/pfe_mod.h | 1 + - 4 files changed, 126 insertions(+), 174 deletions(-) - ---- a/drivers/staging/fsl_ppfe/pfe_eth.c -+++ b/drivers/staging/fsl_ppfe/pfe_eth.c -@@ -790,10 +790,9 @@ const struct ethtool_ops pfe_ethtool_ops - */ - int pfe_eth_mdio_reset(struct mii_bus *bus) - { -- struct pfe_eth_priv_s *priv = (struct pfe_eth_priv_s *)bus->priv; -+ struct pfe_mdio_priv_s *priv = (struct pfe_mdio_priv_s *)bus->priv; - u32 phy_speed; - -- netif_info(priv, hw, priv->ndev, "%s\n", __func__); - - mutex_lock(&bus->mdio_lock); - -@@ -806,25 +805,25 @@ int pfe_eth_mdio_reset(struct mii_bus *b - phy_speed = (DIV_ROUND_UP((pfe->ctrl.sys_clk * 1000), 4000000) - << EMAC_MII_SPEED_SHIFT); - phy_speed |= EMAC_HOLDTIME(0x5); -- __raw_writel(phy_speed, priv->PHY_baseaddr + EMAC_MII_CTRL_REG); -+ __raw_writel(phy_speed, priv->mdio_base + EMAC_MII_CTRL_REG); - - mutex_unlock(&bus->mdio_lock); - - return 0; - } - --/* pfe_eth_gemac_phy_timeout -+/* pfe_eth_mdio_timeout - * - */ --static int pfe_eth_gemac_phy_timeout(struct pfe_eth_priv_s *priv, int timeout) -+static int pfe_eth_mdio_timeout(struct pfe_mdio_priv_s *priv, int timeout) - { -- while (!(__raw_readl(priv->PHY_baseaddr + EMAC_IEVENT_REG) & -+ while (!(__raw_readl(priv->mdio_base + EMAC_IEVENT_REG) & - EMAC_IEVENT_MII)) { - if (timeout-- <= 0) - return -1; - usleep_range(10, 20); - } -- __raw_writel(EMAC_IEVENT_MII, priv->PHY_baseaddr + EMAC_IEVENT_REG); -+ __raw_writel(EMAC_IEVENT_MII, priv->mdio_base + EMAC_IEVENT_REG); - return 0; - } - -@@ -856,16 +855,15 @@ static int pfe_eth_mdio_mux(u8 muxval) - static int pfe_eth_mdio_write_addr(struct mii_bus *bus, int mii_id, - int dev_addr, int regnum) - { -- struct pfe_eth_priv_s *priv = (struct pfe_eth_priv_s *)bus->priv; -+ struct pfe_mdio_priv_s *priv = (struct pfe_mdio_priv_s *)bus->priv; - - __raw_writel(EMAC_MII_DATA_PA(mii_id) | - EMAC_MII_DATA_RA(dev_addr) | - EMAC_MII_DATA_TA | EMAC_MII_DATA(regnum), -- priv->PHY_baseaddr + EMAC_MII_DATA_REG); -+ priv->mdio_base + EMAC_MII_DATA_REG); - -- if (pfe_eth_gemac_phy_timeout(priv, EMAC_MDIO_TIMEOUT)) { -- netdev_err(priv->ndev, "%s: phy MDIO address write timeout\n", -- __func__); -+ if (pfe_eth_mdio_timeout(priv, EMAC_MDIO_TIMEOUT)) { -+ dev_err(&bus->dev, "phy MDIO address write timeout\n"); - return -1; - } - -@@ -875,7 +873,7 @@ static int pfe_eth_mdio_write_addr(struc - static int pfe_eth_mdio_write(struct mii_bus *bus, int mii_id, int regnum, - u16 value) - { -- struct pfe_eth_priv_s *priv = (struct pfe_eth_priv_s *)bus->priv; -+ struct pfe_mdio_priv_s *priv = (struct pfe_mdio_priv_s *)bus->priv; - - /*To access external PHYs on QDS board mux needs to be configured*/ - if ((mii_id) && (pfe->mdio_muxval[mii_id])) -@@ -888,30 +886,26 @@ static int pfe_eth_mdio_write(struct mii - EMAC_MII_DATA_PA(mii_id) | - EMAC_MII_DATA_RA((regnum >> 16) & 0x1f) | - EMAC_MII_DATA_TA | EMAC_MII_DATA(value), -- priv->PHY_baseaddr + EMAC_MII_DATA_REG); -+ priv->mdio_base + EMAC_MII_DATA_REG); - } else { - /* start a write op */ - __raw_writel(EMAC_MII_DATA_ST | EMAC_MII_DATA_OP_WR | - EMAC_MII_DATA_PA(mii_id) | - EMAC_MII_DATA_RA(regnum) | - EMAC_MII_DATA_TA | EMAC_MII_DATA(value), -- priv->PHY_baseaddr + EMAC_MII_DATA_REG); -+ priv->mdio_base + EMAC_MII_DATA_REG); - } - -- if (pfe_eth_gemac_phy_timeout(priv, EMAC_MDIO_TIMEOUT)) { -- netdev_err(priv->ndev, "%s: phy MDIO write timeout\n", -- __func__); -+ if (pfe_eth_mdio_timeout(priv, EMAC_MDIO_TIMEOUT)) { -+ dev_err(&bus->dev, "%s: phy MDIO write timeout\n", __func__); - return -1; - } -- netif_info(priv, hw, priv->ndev, "%s: phy %x reg %x val %x\n", __func__, -- mii_id, regnum, value); -- - return 0; - } - - static int pfe_eth_mdio_read(struct mii_bus *bus, int mii_id, int regnum) - { -- struct pfe_eth_priv_s *priv = (struct pfe_eth_priv_s *)bus->priv; -+ struct pfe_mdio_priv_s *priv = (struct pfe_mdio_priv_s *)bus->priv; - u16 value = 0; - - /*To access external PHYs on QDS board mux needs to be configured*/ -@@ -925,65 +919,67 @@ static int pfe_eth_mdio_read(struct mii_ - EMAC_MII_DATA_PA(mii_id) | - EMAC_MII_DATA_RA((regnum >> 16) & 0x1f) | - EMAC_MII_DATA_TA, -- priv->PHY_baseaddr + EMAC_MII_DATA_REG); -+ priv->mdio_base + EMAC_MII_DATA_REG); - } else { - /* start a read op */ - __raw_writel(EMAC_MII_DATA_ST | EMAC_MII_DATA_OP_RD | - EMAC_MII_DATA_PA(mii_id) | - EMAC_MII_DATA_RA(regnum) | -- EMAC_MII_DATA_TA, priv->PHY_baseaddr + -+ EMAC_MII_DATA_TA, priv->mdio_base + - EMAC_MII_DATA_REG); - } - -- if (pfe_eth_gemac_phy_timeout(priv, EMAC_MDIO_TIMEOUT)) { -- netdev_err(priv->ndev, "%s: phy MDIO read timeout\n", __func__); -+ if (pfe_eth_mdio_timeout(priv, EMAC_MDIO_TIMEOUT)) { -+ dev_err(&bus->dev, "%s: phy MDIO read timeout\n", __func__); - return -1; - } - -- value = EMAC_MII_DATA(__raw_readl(priv->PHY_baseaddr + -+ value = EMAC_MII_DATA(__raw_readl(priv->mdio_base + - EMAC_MII_DATA_REG)); -- netif_info(priv, hw, priv->ndev, "%s: phy %x reg %x val %x\n", __func__, -- mii_id, regnum, value); - return value; - } - --static int pfe_eth_mdio_init(struct pfe_eth_priv_s *priv, -- struct ls1012a_mdio_platform_data *minfo) -+static int pfe_eth_mdio_init(struct pfe *pfe, -+ struct ls1012a_pfe_platform_data *pfe_info, -+ int ii) - { -+ struct pfe_mdio_priv_s *priv = NULL; -+ struct ls1012a_mdio_platform_data *mdio_info; - struct mii_bus *bus; - struct device_node *mdio_node; -- int rc = 0, ii; -- struct phy_device *phydev; -+ int rc = 0; - -- netif_info(priv, drv, priv->ndev, "%s\n", __func__); -- pr_info("%s\n", __func__); -+ mdio_info = (struct ls1012a_mdio_platform_data *) -+ pfe_info->ls1012a_mdio_pdata; -+ mdio_info->id = ii; - -- bus = mdiobus_alloc(); -+ bus = mdiobus_alloc_size(sizeof(struct pfe_mdio_priv_s)); - if (!bus) { -- netdev_err(priv->ndev, "mdiobus_alloc() failed\n"); -+ pr_err("mdiobus_alloc() failed\n"); - rc = -ENOMEM; -- goto err0; -+ goto err_mdioalloc; - } - - bus->name = "ls1012a MDIO Bus"; -- snprintf(bus->id, MII_BUS_ID_SIZE, "ls1012a-%x", priv->id); -+ snprintf(bus->id, MII_BUS_ID_SIZE, "ls1012a-%x", mdio_info->id); - -- bus->priv = priv; - bus->read = &pfe_eth_mdio_read; - bus->write = &pfe_eth_mdio_write; - bus->reset = &pfe_eth_mdio_reset; -- bus->parent = priv->pfe->dev; -- bus->phy_mask = minfo->phy_mask; -- bus->irq[0] = minfo->irq[0]; -+ bus->parent = pfe->dev; -+ bus->phy_mask = mdio_info->phy_mask; -+ bus->irq[0] = mdio_info->irq[0]; -+ priv = bus->priv; -+ priv->mdio_base = cbus_emac_base[ii]; - -- priv->mdc_div = minfo->mdc_div; -+ priv->mdc_div = mdio_info->mdc_div; - if (!priv->mdc_div) - priv->mdc_div = 64; -- netif_info(priv, drv, priv->ndev, "%s: mdc_div: %d, phy_mask: %x\n", -- __func__, priv->mdc_div, bus->phy_mask); -+ dev_info(bus->parent, "%s: mdc_div: %d, phy_mask: %x\n", -+ __func__, priv->mdc_div, bus->phy_mask); - -- mdio_node = of_get_child_by_name(priv->pfe->dev->of_node, "mdio"); -- if (mdio_node) { -+ mdio_node = of_get_child_by_name(pfe->dev->of_node, "mdio"); -+ if ((mdio_info->id == 0) && mdio_node) { - rc = of_mdiobus_register(bus, mdio_node); - of_node_put(mdio_node); - } else { -@@ -991,56 +987,34 @@ static int pfe_eth_mdio_init(struct pfe_ - } - - if (rc) { -- netdev_err(priv->ndev, "mdiobus_register(%s) failed\n", -- bus->name); -- goto err1; -+ dev_err(bus->parent, "mdiobus_register(%s) failed\n", -+ bus->name); -+ goto err_mdioregister; - } - - priv->mii_bus = bus; -- -- /* For clause 45 we need to call get_phy_device() with it's -- * 3rd argument as true and then register the phy device -- * via phy_device_register() -- */ -- if (priv->einfo->mii_config == PHY_INTERFACE_MODE_2500SGMII) { -- for (ii = 0; ii < NUM_GEMAC_SUPPORT; ii++) { -- phydev = get_phy_device(priv->mii_bus, -- priv->einfo->phy_id + ii, true); -- if (!phydev || IS_ERR(phydev)) { -- rc = -EIO; -- netdev_err(priv->ndev, "fail to get device\n"); -- goto err1; -- } -- rc = phy_device_register(phydev); -- if (rc) { -- phy_device_free(phydev); -- netdev_err(priv->ndev, -- "phy_device_register() failed\n"); -- goto err1; -- } -- } -- } -+ pfe->mdio.mdio_priv[ii] = priv; - - pfe_eth_mdio_reset(bus); - - return 0; - --err1: -+err_mdioregister: - mdiobus_free(bus); --err0: -+err_mdioalloc: - return rc; - } - - /* pfe_eth_mdio_exit - */ --static void pfe_eth_mdio_exit(struct mii_bus *bus) -+static void pfe_eth_mdio_exit(struct pfe *pfe, -+ int ii) - { -+ struct pfe_mdio_priv_s *mdio_priv = pfe->mdio.mdio_priv[ii]; -+ struct mii_bus *bus = mdio_priv->mii_bus; -+ - if (!bus) - return; -- -- netif_info((struct pfe_eth_priv_s *)bus->priv, drv, ((struct -- pfe_eth_priv_s *)(bus->priv))->ndev, "%s\n", __func__); -- - mdiobus_unregister(bus); - mdiobus_free(bus); - } -@@ -1221,15 +1195,16 @@ static int pfe_eth_start(struct pfe_eth_ - */ - static void ls1012a_configure_serdes(struct net_device *ndev) - { -- struct pfe_eth_priv_s *priv = pfe->eth.eth_priv[0]; -+ struct pfe_eth_priv_s *eth_priv = netdev_priv(ndev); -+ struct pfe_mdio_priv_s *mdio_priv = pfe->mdio.mdio_priv[eth_priv->id]; - int sgmii_2500 = 0; -- struct mii_bus *bus = priv->mii_bus; -+ struct mii_bus *bus = mdio_priv->mii_bus; - u16 value = 0; - -- if (priv->einfo->mii_config == PHY_INTERFACE_MODE_2500SGMII) -+ if (eth_priv->einfo->mii_config == PHY_INTERFACE_MODE_2500SGMII) - sgmii_2500 = 1; - -- netif_info(priv, drv, ndev, "%s\n", __func__); -+ netif_info(eth_priv, drv, ndev, "%s\n", __func__); - /* PCS configuration done with corresponding GEMAC */ - - pfe_eth_mdio_read(bus, 0, MDIO_SGMII_CR); -@@ -2333,26 +2308,15 @@ static const struct net_device_ops pfe_n - - /* pfe_eth_init_one - */ --static int pfe_eth_init_one(struct pfe *pfe, int id) -+static int pfe_eth_init_one(struct pfe *pfe, -+ struct ls1012a_pfe_platform_data *pfe_info, -+ int id) - { - struct net_device *ndev = NULL; - struct pfe_eth_priv_s *priv = NULL; - struct ls1012a_eth_platform_data *einfo; -- struct ls1012a_mdio_platform_data *minfo; -- struct ls1012a_pfe_platform_data *pfe_info; - int err; - -- /* Extract pltform data */ -- pfe_info = (struct ls1012a_pfe_platform_data *) -- pfe->dev->platform_data; -- if (!pfe_info) { -- pr_err( -- "%s: pfe missing additional platform data\n" -- , __func__); -- err = -ENODEV; -- goto err0; -- } -- - einfo = (struct ls1012a_eth_platform_data *) - pfe_info->ls1012a_eth_pdata; - -@@ -2365,18 +2329,6 @@ static int pfe_eth_init_one(struct pfe * - goto err0; - } - -- minfo = (struct ls1012a_mdio_platform_data *) -- pfe_info->ls1012a_mdio_pdata; -- -- /* einfo never be NULL, but no harm in having this check */ -- if (!minfo) { -- pr_err( -- "%s: pfe missing additional mdios platform data\n", -- __func__); -- err = -ENODEV; -- goto err0; -- } -- - if (us) - emac_txq_cnt = EMAC_TXQ_CNT; - /* Create an ethernet device instance */ -@@ -2402,7 +2354,6 @@ static int pfe_eth_init_one(struct pfe * - /* Set the info in the priv to the current info */ - priv->einfo = &einfo[id]; - priv->EMAC_baseaddr = cbus_emac_base[id]; -- priv->PHY_baseaddr = cbus_emac_base[0]; - priv->GPI_baseaddr = cbus_gpi_base[id]; - - spin_lock_init(&priv->lock); -@@ -2412,13 +2363,6 @@ static int pfe_eth_init_one(struct pfe * - /* Copy the station address into the dev structure, */ - memcpy(ndev->dev_addr, einfo[id].mac_addr, ETH_ALEN); - -- /* Initialize mdio */ -- err = pfe_eth_mdio_init(priv, &minfo[id]); -- if (err) { -- netdev_err(ndev, "%s: pfe_eth_mdio_init() failed\n", __func__); -- goto err1; -- } -- - if (us) - goto phy_init; - -@@ -2463,7 +2407,7 @@ static int pfe_eth_init_one(struct pfe * - err = register_netdev(ndev); - if (err) { - netdev_err(ndev, "register_netdev() failed\n"); -- goto err2; -+ goto err1; - } - - if ((!(pfe_use_old_dts_phy) && !(priv->phy_node)) || -@@ -2480,7 +2424,7 @@ phy_init: - if (err) { - netdev_err(ndev, "%s: pfe_phy_init() failed\n", - __func__); -- goto err3; -+ goto err2; - } - - if (us) { -@@ -2494,21 +2438,19 @@ phy_init: - skip_phy_init: - /* Create all the sysfs files */ - if (pfe_eth_sysfs_init(ndev)) -- goto err4; -+ goto err3; - - netif_info(priv, probe, ndev, "%s: created interface, baseaddr: %p\n", - __func__, priv->EMAC_baseaddr); - - return 0; - --err4: -- pfe_phy_exit(priv->ndev); - err3: -+ pfe_phy_exit(priv->ndev); -+err2: - if (us) -- goto err2; -+ goto err1; - unregister_netdev(ndev); --err2: -- pfe_eth_mdio_exit(priv->mii_bus); - err1: - free_netdev(priv->ndev); - err0: -@@ -2521,6 +2463,7 @@ int pfe_eth_init(struct pfe *pfe) - { - int ii = 0; - int err; -+ struct ls1012a_pfe_platform_data *pfe_info; - - pr_info("%s\n", __func__); - -@@ -2530,24 +2473,43 @@ int pfe_eth_init(struct pfe *pfe) - cbus_gpi_base[0] = EGPI1_BASE_ADDR; - cbus_gpi_base[1] = EGPI2_BASE_ADDR; - -+ pfe_info = (struct ls1012a_pfe_platform_data *) -+ pfe->dev->platform_data; -+ if (!pfe_info) { -+ pr_err("%s: pfe missing additional platform data\n", __func__); -+ err = -ENODEV; -+ goto err_pdata; -+ } -+ -+ for (ii = 0; ii < NUM_GEMAC_SUPPORT; ii++) { -+ err = pfe_eth_mdio_init(pfe, pfe_info, ii); -+ if (err) { -+ pr_err("%s: pfe_eth_mdio_init() failed\n", __func__); -+ goto err_mdio_init; -+ } -+ } -+ - if (fsl_guts_get_svr() == LS1012A_REV_1_0) - pfe_errata_a010897 = true; - else - pfe_errata_a010897 = false; - - for (ii = 0; ii < NUM_GEMAC_SUPPORT; ii++) { -- err = pfe_eth_init_one(pfe, ii); -+ err = pfe_eth_init_one(pfe, pfe_info, ii); - if (err) -- goto err0; -+ goto err_eth_init; - } - - return 0; - --err0: -- while (ii--) -+err_eth_init: -+ while (ii--) { - pfe_eth_exit_one(pfe->eth.eth_priv[ii]); -+ pfe_eth_mdio_exit(pfe, ii); -+ } - -- /* Register three network devices in the kernel */ -+err_mdio_init: -+err_pdata: - return err; - } - -@@ -2573,9 +2535,6 @@ skip_phy_exit: - if (!us) - unregister_netdev(priv->ndev); - -- if (priv->mii_bus) -- pfe_eth_mdio_exit(priv->mii_bus); -- - free_netdev(priv->ndev); - } - -@@ -2589,4 +2548,7 @@ void pfe_eth_exit(struct pfe *pfe) - - for (ii = NUM_GEMAC_SUPPORT - 1; ii >= 0; ii--) - pfe_eth_exit_one(pfe->eth.eth_priv[ii]); -+ -+ for (ii = NUM_GEMAC_SUPPORT - 1; ii >= 0; ii--) -+ pfe_eth_mdio_exit(pfe, ii); - } ---- a/drivers/staging/fsl_ppfe/pfe_eth.h -+++ b/drivers/staging/fsl_ppfe/pfe_eth.h -@@ -48,7 +48,7 @@ struct ls1012a_eth_platform_data { - }; - - struct ls1012a_mdio_platform_data { -- int enabled; -+ int id; - int irq[32]; - u32 phy_mask; - int mdc_div; -@@ -120,8 +120,6 @@ struct pfe_eth_priv_s { - unsigned int event_status; - int irq; - void *EMAC_baseaddr; -- /* This points to the EMAC base from where we access PHY */ -- void *PHY_baseaddr; - void *GPI_baseaddr; - /* PHY stuff */ - struct phy_device *phydev; -@@ -129,9 +127,6 @@ struct pfe_eth_priv_s { - int oldduplex; - int oldlink; - struct device_node *phy_node; -- /* mdio info */ -- int mdc_div; -- struct mii_bus *mii_bus; - struct clk *gemtx_clk; - int wol; - int pause_flag; -@@ -161,6 +156,16 @@ struct pfe_eth { - struct pfe_eth_priv_s *eth_priv[3]; - }; - -+struct pfe_mdio_priv_s { -+ void __iomem *mdio_base; -+ int mdc_div; -+ struct mii_bus *mii_bus; -+}; -+ -+struct pfe_mdio { -+ struct pfe_mdio_priv_s *mdio_priv[3]; -+}; -+ - int pfe_eth_init(struct pfe *pfe); - void pfe_eth_exit(struct pfe *pfe); - int pfe_eth_suspend(struct net_device *dev); ---- a/drivers/staging/fsl_ppfe/pfe_ls1012a_platform.c -+++ b/drivers/staging/fsl_ppfe/pfe_ls1012a_platform.c -@@ -21,30 +21,17 @@ - extern bool pfe_use_old_dts_phy; - struct ls1012a_pfe_platform_data pfe_platform_data; - --static int pfe_get_gemac_if_properties(struct device_node *parent, int port, int -- if_cnt, -- struct ls1012a_pfe_platform_data -- *pdata) -+static int pfe_get_gemac_if_properties(struct device_node *gem, -+ int port, -+ struct ls1012a_pfe_platform_data *pdata) - { -- struct device_node *gem = NULL, *phy = NULL, *phy_node = NULL; -+ struct device_node *phy_node = NULL; - int size; -- int ii = 0, phy_id = 0; -+ int phy_id = 0; - const u32 *addr; - -- for (ii = 0; ii < if_cnt; ii++) { -- gem = of_get_next_child(parent, gem); -- if (!gem) -- goto err; -- addr = of_get_property(gem, "reg", &size); -- if (addr && (be32_to_cpup(addr) == port)) -- break; -- } -- -- if (ii >= if_cnt) { -- pr_err("%s:%d Failed to find interface = %d\n", -- __func__, __LINE__, if_cnt); -- goto err; -- } -+ addr = of_get_property(gem, "reg", &size); -+ port = be32_to_cpup(addr); - - pdata->ls1012a_eth_pdata[port].gem_id = port; - -@@ -83,14 +70,6 @@ static int pfe_get_gemac_if_properties(s - if (pdata->ls1012a_eth_pdata[port].phy_flags & GEMAC_NO_PHY) - goto done; - -- phy = of_get_next_child(gem, NULL); -- addr = of_get_property(phy, "reg", &size); -- if (!addr) -- pr_err("%s:%d Invalid phy enable flag....\n", -- __func__, __LINE__); -- else -- pdata->ls1012a_mdio_pdata[port].enabled = -- be32_to_cpup(addr); - } else { - pr_info("%s: No PHY or fixed-link\n", __func__); - return 0; -@@ -135,7 +114,7 @@ static int pfe_platform_probe(struct pla - struct resource res; - int ii, rc, interface_count = 0, size = 0; - const u32 *prop; -- struct device_node *np; -+ struct device_node *np, *gem = NULL; - struct clk *pfe_clk; - - np = pdev->dev.of_node; -@@ -219,8 +198,13 @@ static int pfe_platform_probe(struct pla - pfe_platform_data.ls1012a_mdio_pdata[0].phy_mask = 0xffffffff; - - for (ii = 0; ii < interface_count; ii++) { -- pfe_get_gemac_if_properties(np, ii, interface_count, -- &pfe_platform_data); -+ gem = of_get_next_child(np, gem); -+ if (gem) -+ pfe_get_gemac_if_properties(gem, ii, -+ &pfe_platform_data); -+ else -+ pr_err("Unable to find interface %d\n", ii); -+ - } - - pfe->dev = &pdev->dev; -@@ -342,8 +326,8 @@ static int pfe_platform_resume(struct de - for (i = 0; i < (NUM_GEMAC_SUPPORT); i++) { - netdev = pfe->eth.eth_priv[i]->ndev; - -- if (pfe->eth.eth_priv[i]->mii_bus) -- pfe_eth_mdio_reset(pfe->eth.eth_priv[i]->mii_bus); -+ if (pfe->mdio.mdio_priv[i]->mii_bus) -+ pfe_eth_mdio_reset(pfe->mdio.mdio_priv[i]->mii_bus); - - if (netif_running(netdev)) - pfe_eth_resume(netdev); ---- a/drivers/staging/fsl_ppfe/pfe_mod.h -+++ b/drivers/staging/fsl_ppfe/pfe_mod.h -@@ -52,6 +52,7 @@ struct pfe { - struct pfe_ctrl ctrl; - struct pfe_hif hif; - struct pfe_eth eth; -+ struct pfe_mdio mdio; - struct hif_client_s *hif_client[HIF_CLIENTS_MAX]; - #if defined(CFG_DIAGS) - struct pfe_diags diags; |