
On Fri, Jul 13, 2018 at 9:40 AM, Pankaj Bansal pankaj.bansal@nxp.com wrote:
when there is no phy present for a dpmac, a dummy phy device is created. when we move to multiple phy method, we need to create as many dummy phy devices.
Change this method so that we don't need to create dummy phy devices. We always report linkup if no phy is present.
Signed-off-by: Pankaj Bansal pankaj.bansal@nxp.com
drivers/net/ldpaa_eth/ldpaa_eth.c | 121 +++++++++++++--------------- 1 file changed, 58 insertions(+), 63 deletions(-)
diff --git a/drivers/net/ldpaa_eth/ldpaa_eth.c b/drivers/net/ldpaa_eth/ldpaa_eth.c index 8fcb948ee8..d2a6d90f18 100644 --- a/drivers/net/ldpaa_eth/ldpaa_eth.c +++ b/drivers/net/ldpaa_eth/ldpaa_eth.c @@ -386,6 +386,60 @@ error: return err; }
+static int ldpaa_get_dpmac_state(struct ldpaa_eth_priv *priv,
struct dpmac_link_state *state)
+{
struct phy_device *phydev = NULL;
phy_interface_t enet_if;
int err;
/* let's start off with maximum capabilities
*/
enet_if = wriop_get_enet_if(priv->dpmac_id);
switch (enet_if) {
case PHY_INTERFACE_MODE_XGMII:
state->rate = SPEED_10000;
break;
default:
state->rate = SPEED_1000;
break;
}
state->up = 1;
+#ifdef CONFIG_PHYLIB
state->options |= DPMAC_LINK_OPT_AUTONEG;
phydev = wriop_get_phy_dev(priv->dpmac_id);
if (phydev) {
err = phy_startup(phydev);
if (err) {
printf("%s: Could not initialize\n", phydev->dev->name);
state->up = 0;
}
if (phydev->link == 1) {
Just "phydev->link"
state->rate = state->rate < phydev->speed ?
state->rate : phydev->speed;
MIN(state->rate, phydev->speed);
if (!phydev->duplex)
state->options |= DPMAC_LINK_OPT_HALF_DUPLEX;
if (!phydev->autoneg)
state->options &= ~DPMAC_LINK_OPT_AUTONEG;
} else {
state->up = 0;
}
}
+#endif
if (!phydev)
state->options &= ~DPMAC_LINK_OPT_AUTONEG;
if (state->up == 0) {
state->rate = 0;
state->options = 0;
return -1;
return -ENODEV;
}
return 0;
+}
static int ldpaa_eth_open(struct eth_device *net_dev, bd_t *bd) { struct ldpaa_eth_priv *priv = (struct ldpaa_eth_priv *)net_dev->priv; @@ -394,10 +448,7 @@ static int ldpaa_eth_open(struct eth_device *net_dev, bd_t *bd) struct dpni_link_state link_state; #endif int err = 0;
struct mii_dev *bus;
phy_interface_t enet_if; struct dpni_queue d_queue;
struct phy_device *phydev = NULL; if (net_dev->state == ETH_STATE_ACTIVE) return 0;
@@ -417,45 +468,9 @@ static int ldpaa_eth_open(struct eth_device *net_dev, bd_t *bd) if (err < 0) goto err_dpmac_setup;
-#ifdef CONFIG_PHYLIB
phydev = wriop_get_phy_dev(priv->dpmac_id);
if (phydev) {
err = phy_startup(phydev);
if (err) {
printf("%s: Could not initialize\n",
phydev->dev->name);
goto err_dpmac_bind;
}
}
-#else
phydev = (struct phy_device *)malloc(sizeof(struct phy_device));
memset(phydev, 0, sizeof(struct phy_device));
wriop_set_phy_dev(priv->dpmac_id, phydev);
phydev->speed = SPEED_1000;
phydev->link = 1;
phydev->duplex = DUPLEX_FULL;
-#endif
bus = wriop_get_mdio(priv->dpmac_id);
enet_if = wriop_get_enet_if(priv->dpmac_id);
if ((bus == NULL) &&
(enet_if == PHY_INTERFACE_MODE_XGMII)) {
phydev = (struct phy_device *)
malloc(sizeof(struct phy_device));
memset(phydev, 0, sizeof(struct phy_device));
wriop_set_phy_dev(priv->dpmac_id, phydev);
phydev->speed = SPEED_10000;
phydev->link = 1;
phydev->duplex = DUPLEX_FULL;
}
if (!phydev->link) {
printf("%s: No link.\n", phydev->dev->name);
err = -1;
err = ldpaa_get_dpmac_state(priv, &dpmac_link_state);
if (err < 0) goto err_dpmac_bind;
} /* DPMAC binding DPNI */ err = ldpaa_dpmac_bind(priv);
@@ -489,18 +504,6 @@ static int ldpaa_eth_open(struct eth_device *net_dev, bd_t *bd) return err; }
dpmac_link_state.rate = phydev->speed;
if (phydev->autoneg == AUTONEG_DISABLE)
dpmac_link_state.options &= ~DPMAC_LINK_OPT_AUTONEG;
else
dpmac_link_state.options |= DPMAC_LINK_OPT_AUTONEG;
if (phydev->duplex == DUPLEX_HALF)
dpmac_link_state.options |= DPMAC_LINK_OPT_HALF_DUPLEX;
dpmac_link_state.up = phydev->link;
err = dpmac_set_link_state(dflt_mc_io, MC_CMD_NO_FLAGS, priv->dpmac_handle, &dpmac_link_state); if (err < 0) {
@@ -543,7 +546,7 @@ static int ldpaa_eth_open(struct eth_device *net_dev, bd_t *bd) goto err_qdid; }
return phydev->link;
return dpmac_link_state.up;
err_qdid: err_get_queue: @@ -566,9 +569,6 @@ static void ldpaa_eth_stop(struct eth_device *net_dev) { struct ldpaa_eth_priv *priv = (struct ldpaa_eth_priv *)net_dev->priv; int err = 0; -#ifdef CONFIG_PHYLIB
struct mii_dev *bus = wriop_get_mdio(priv->dpmac_id);
-#endif struct phy_device *phydev = NULL;
if ((net_dev->state == ETH_STATE_PASSIVE) ||
@@ -603,13 +603,8 @@ static void ldpaa_eth_stop(struct eth_device *net_dev)
#ifdef CONFIG_PHYLIB phydev = wriop_get_phy_dev(priv->dpmac_id);
if (phydev && bus != NULL)
if (phydev) phy_shutdown(phydev);
else {
free(phydev);
phydev = NULL;
wriop_set_phy_dev(priv->dpmac_id, phydev);
}
#endif
/* Free DPBP handle and reset. */
-- 2.17.1
U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot