[U-Boot] [PATCH 4/6] driver: net: fsl-mc: Modify the dpmac link detection method

Joe Hershberger joe.hershberger at ni.com
Wed Jul 25 20:13:07 UTC 2018


On Fri, Jul 13, 2018 at 9:40 AM, Pankaj Bansal <pankaj.bansal at 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 at 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 at lists.denx.de
> https://lists.denx.de/listinfo/u-boot


More information about the U-Boot mailing list