[U-Boot] [PATCH v2 03/12] net: designware: Add a fix_mac_speed hook

Simon Glass sjg at chromium.org
Tue Mar 1 03:03:38 CET 2016


Hi Sjoerd,

On 28 February 2016 at 14:24, Sjoerd Simons
<sjoerd.simons at collabora.co.uk> wrote:
> Add the ability for e.g. drivers subclassing to register a function to
> be called after phy link negotiation. This is useful if e.g. the driver
> needs to change the mac configuration based on the negotiated speed.
>
> Signed-off-by: Sjoerd Simons <sjoerd.simons at collabora.co.uk>
>
> ---
>
> Changes in v2:
> - Move the hook into the dw_adjust_link function
> - Rename the hook to fix_mac_speed, similar to Linux
>
>  drivers/net/designware.c | 8 ++++++--
>  drivers/net/designware.h | 4 ++++
>  2 files changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/designware.c b/drivers/net/designware.c
> index 8834506..5eaa1de 100644
> --- a/drivers/net/designware.c
> +++ b/drivers/net/designware.c
> @@ -231,7 +231,8 @@ static int _dw_write_hwaddr(struct dw_eth_dev *priv, u8 *mac_id)
>         return 0;
>  }
>
> -static void dw_adjust_link(struct eth_mac_regs *mac_p,
> +static void dw_adjust_link(struct dw_eth_dev *priv,
> +                          struct eth_mac_regs *mac_p,
>                            struct phy_device *phydev)
>  {
>         u32 conf = readl(&mac_p->conf) | FRAMEBURSTENABLE | DISABLERXOWN;
> @@ -257,6 +258,9 @@ static void dw_adjust_link(struct eth_mac_regs *mac_p,
>         printf("Speed: %d, %s duplex%s\n", phydev->speed,
>                (phydev->duplex) ? "full" : "half",
>                (phydev->port == PORT_FIBRE) ? ", fiber mode" : "");
> +
> +       if (priv->fix_mac_speed)
> +               priv->fix_mac_speed(priv);
>  }
>
>  static void _dw_eth_halt(struct dw_eth_dev *priv)
> @@ -322,7 +326,7 @@ static int _dw_eth_init(struct dw_eth_dev *priv, u8 *enetaddr)
>                 return ret;
>         }
>
> -       dw_adjust_link(mac_p, priv->phydev);
> +       dw_adjust_link(priv, mac_p, priv->phydev);
>
>         if (!priv->phydev->link)
>                 return -EIO;
> diff --git a/drivers/net/designware.h b/drivers/net/designware.h
> index 6b4bfd7..792af7c 100644
> --- a/drivers/net/designware.h
> +++ b/drivers/net/designware.h
> @@ -237,6 +237,10 @@ struct dw_eth_dev {
>         struct gpio_desc reset_gpio;
>         struct phy_device *phydev;
>         struct mii_dev *bus;
> +
> +#ifdef CONFIG_DM_ETH
> +       int (*fix_mac_speed)(struct dw_eth_dev *priv);
> +#endif

I'd really like to avoid function pointers with driver model. This
seems to be called at the end of init. Can it be handled in your
driver instead?

>  };
>
>  #ifdef CONFIG_DM_ETH
> --
> 2.7.0
>

Regards,
Simon


More information about the U-Boot mailing list