[PATCH 07/10] net/farady: Read MAC address from chip
Joel Stanley
joel at jms.id.au
Fri Jul 1 00:05:46 AEST 2016
On Thu, Jun 30, 2016 at 7:57 PM, Gavin Shan <gwshan at linux.vnet.ibm.com> wrote:
> The device is assigned with random MAC address. It isn't reasonable.
> An valid MAC address might have been in the chip. It's reasonable
> to use it to maintain consistency.
>
> This uses the MAC address in the chip if it's valid. Otherwise, a
> random MAC address is given as before.
>
> Signed-off-by: Gavin Shan <gwshan at linux.vnet.ibm.com>
> ---
> drivers/net/ethernet/faraday/ftgmac100.c | 60 ++++++++++++++++++++++++++++----
> 1 file changed, 53 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/net/ethernet/faraday/ftgmac100.c b/drivers/net/ethernet/faraday/ftgmac100.c
> index 2c22f74..120993e 100644
> --- a/drivers/net/ethernet/faraday/ftgmac100.c
> +++ b/drivers/net/ethernet/faraday/ftgmac100.c
> @@ -141,6 +141,55 @@ static void ftgmac100_set_mac(struct ftgmac100 *priv, const unsigned char *mac)
> iowrite32(laddr, priv->base + FTGMAC100_OFFSET_MAC_LADR);
> }
>
> +static void ftgmac100_setup_mac(struct ftgmac100 *priv)
> +{
> + unsigned char mac[6];
> + unsigned int m;
> + unsigned int l;
> +
> + m = ioread32(priv->base + FTGMAC100_OFFSET_MAC_MADR);
> + l = ioread32(priv->base + FTGMAC100_OFFSET_MAC_LADR);
> +
> + mac[0] = (m >> 8) & 0xff;
> + mac[1] = m & 0xff;
> + mac[2] = (l >> 24) & 0xff;
> + mac[3] = (l >> 16) & 0xff;
> + mac[4] = (l >> 8) & 0xff;
> + mac[5] = l & 0xff;
> +
> + if (!is_valid_ether_addr(mac)) {
> + mac[5] = (m >> 8) & 0xff;
> + mac[4] = m & 0xff;
> + mac[3] = (l >> 24) & 0xff;
> + mac[2] = (l >> 16) & 0xff;
> + mac[1] = (l >> 8) & 0xff;
> + mac[0] = l & 0xff;
> + }
> +
> + if (!is_valid_ether_addr(mac)) {
> + eth_hw_addr_random(priv->netdev);
> + dev_info(priv->dev, "Generated random MAC address %pM\n",
> + priv->netdev->dev_addr);
> + } else {
> + memcpy(priv->netdev->dev_addr, mac, 6);
> + dev_info(priv->dev, "Read MAC address from chip %pM\n", mac);
> + }
> +}
> +
> +static int ftgmac100_set_mac_addr(struct net_device *dev, void *p)
> +{
> + int ret;
> +
> + ret = eth_prepare_mac_addr_change(dev, p);
> + if (ret < 0)
> + return ret;
> +
> + eth_commit_mac_addr_change(dev, p);
> + ftgmac100_set_mac(netdev_priv(dev), dev->dev_addr);
> +
> + return 0;
> +}
> +
> static void ftgmac100_init_hw(struct ftgmac100 *priv)
> {
> /* setup ring buffer base registers */
> @@ -1141,7 +1190,7 @@ static const struct net_device_ops ftgmac100_netdev_ops = {
> .ndo_open = ftgmac100_open,
> .ndo_stop = ftgmac100_stop,
> .ndo_start_xmit = ftgmac100_hard_start_xmit,
> - .ndo_set_mac_address = eth_mac_addr,
> + .ndo_set_mac_address = ftgmac100_set_mac_addr,
> .ndo_validate_addr = eth_validate_addr,
> .ndo_do_ioctl = ftgmac100_do_ioctl,
> };
> @@ -1263,6 +1312,9 @@ static int ftgmac100_probe(struct platform_device *pdev)
>
> priv->irq = irq;
>
> + /* MAC address from chip or random one */
> + ftgmac100_setup_mac(priv);
> +
> err = ftgmac100_setup_mdio(netdev);
> if (err)
> goto err_setup_mdio;
> @@ -1276,12 +1328,6 @@ static int ftgmac100_probe(struct platform_device *pdev)
>
> netdev_info(netdev, "irq %d, mapped at %p\n", priv->irq, priv->base);
>
> - if (!is_valid_ether_addr(netdev->dev_addr)) {
> - eth_hw_addr_random(netdev);
> - netdev_info(netdev, "generated random MAC address %pM\n",
> - netdev->dev_addr);
> - }
> -
> return 0;
>
> err_register_netdev:
> --
> 2.1.0
>
More information about the openbmc
mailing list