<p dir="ltr"><br>
On 1 Jul 2016 20:55, "Benjamin Herrenschmidt" <<a href="mailto:benh@kernel.crashing.org">benh@kernel.crashing.org</a>> wrote:<br>
><br>
> On Thu, 2016-06-30 at 23:35 +0930, Joel Stanley wrote:<br>
> > On Thu, Jun 30, 2016 at 7:57 PM, Gavin Shan  wrote:<br>
> > > The device is assigned with random MAC address. It isn't reasonable.<br>
> > > An valid MAC address might have been in the chip. It's reasonable<br>
> > > to use it to maintain consistency.<br>
> > ><br>
> > > This uses the MAC address in the chip if it's valid. Otherwise, a<br>
> > > random MAC address is given as before.<br>
><br>
> If that is a worry we could use a device-tree property. Does our<br>
> uboot update the DT ? If yes it can set the local-mac-address prop.</p>
<p dir="ltr">It doesn't currently, but we will be adding that soon we need to update the memory node for systems where board revisions change the DRAM size.</p>
<p dir="ltr">Cheers,</p>
<p dir="ltr">Joel<br></p>
<p dir="ltr">><br>
> > > Signed-off-by: Gavin Shan <<a href="mailto:gwshan@linux.vnet.ibm.com">gwshan@linux.vnet.ibm.com</a>><br>
> > > ---<br>
> > >  drivers/net/ethernet/faraday/ftgmac100.c | 60 ++++++++++++++++++++++++++++----<br>
> > >  1 file changed, 53 insertions(+), 7 deletions(-)<br>
> > ><br>
> > > diff --git a/drivers/net/ethernet/faraday/ftgmac100.c b/drivers/net/ethernet/faraday/ftgmac100.c<br>
> > > index 2c22f74..120993e 100644<br>
> > > --- a/drivers/net/ethernet/faraday/ftgmac100.c<br>
> > > +++ b/drivers/net/ethernet/faraday/ftgmac100.c<br>
> > > @@ -141,6 +141,55 @@ static void ftgmac100_set_mac(struct ftgmac100 *priv, const unsigned char *mac)<br>
> > >         iowrite32(laddr, priv->base + FTGMAC100_OFFSET_MAC_LADR);<br>
> > >  }<br>
> > ><br>
> > > +static void ftgmac100_setup_mac(struct ftgmac100 *priv)<br>
> > > +{<br>
> > > +       unsigned char mac[6];<br>
> > > +       unsigned int m;<br>
> > > +       unsigned int l;<br>
> > > +<br>
> > > +       m = ioread32(priv->base + FTGMAC100_OFFSET_MAC_MADR);<br>
> > > +       l = ioread32(priv->base + FTGMAC100_OFFSET_MAC_LADR);<br>
> > > +<br>
> > > +       mac[0] = (m >> 8) & 0xff;<br>
> > > +       mac[1] = m & 0xff;<br>
> > > +       mac[2] = (l >> 24) & 0xff;<br>
> > > +       mac[3] = (l >> 16) & 0xff;<br>
> > > +       mac[4] = (l >> 8) & 0xff;<br>
> > > +       mac[5] = l & 0xff;<br>
> > > +<br>
> > > +       if (!is_valid_ether_addr(mac)) {<br>
> > > +               mac[5] = (m >> 8) & 0xff;<br>
> > > +               mac[4] = m & 0xff;<br>
> > > +               mac[3] = (l >> 24) & 0xff;<br>
> > > +               mac[2] = (l >> 16) & 0xff;<br>
> > > +               mac[1] = (l >>  8) & 0xff;<br>
> > > +               mac[0] = l & 0xff;<br>
> > > +       }<br>
> > > +<br>
> > > +       if (!is_valid_ether_addr(mac)) {<br>
> > > +               eth_hw_addr_random(priv->netdev);<br>
> > > +               dev_info(priv->dev, "Generated random MAC address %pM\n",<br>
> > > +                        priv->netdev->dev_addr);<br>
> > > +       } else {<br>
> > > +               memcpy(priv->netdev->dev_addr, mac, 6);<br>
> > > +               dev_info(priv->dev, "Read MAC address from chip %pM\n", mac);<br>
> > > +       }<br>
> > > +}<br>
> > > +<br>
> > > +static int ftgmac100_set_mac_addr(struct net_device *dev, void *p)<br>
> > > +{<br>
> > > +       int ret;<br>
> > > +<br>
> > > +       ret = eth_prepare_mac_addr_change(dev, p);<br>
> > > +       if (ret < 0)<br>
> > > +               return ret;<br>
> > > +<br>
> > > +       eth_commit_mac_addr_change(dev, p);<br>
> > > +       ftgmac100_set_mac(netdev_priv(dev), dev->dev_addr);<br>
> > > +<br>
> > > +       return 0;<br>
> > > +}<br>
> > > +<br>
> > >  static void ftgmac100_init_hw(struct ftgmac100 *priv)<br>
> > >  {<br>
> > >         /* setup ring buffer base registers */<br>
> > > @@ -1141,7 +1190,7 @@ static const struct net_device_ops ftgmac100_netdev_ops = {<br>
> > >         .ndo_open               = ftgmac100_open,<br>
> > >         .ndo_stop               = ftgmac100_stop,<br>
> > >         .ndo_start_xmit         = ftgmac100_hard_start_xmit,<br>
> > > -       .ndo_set_mac_address    = eth_mac_addr,<br>
> > > +       .ndo_set_mac_address    = ftgmac100_set_mac_addr,<br>
> > >         .ndo_validate_addr      = eth_validate_addr,<br>
> > >         .ndo_do_ioctl           = ftgmac100_do_ioctl,<br>
> > >  };<br>
> > > @@ -1263,6 +1312,9 @@ static int ftgmac100_probe(struct platform_device *pdev)<br>
> > ><br>
> > >         priv->irq = irq;<br>
> > ><br>
> > > +       /* MAC address from chip or random one */<br>
> > > +       ftgmac100_setup_mac(priv);<br>
> > > +<br>
> > >         err = ftgmac100_setup_mdio(netdev);<br>
> > >         if (err)<br>
> > >                 goto err_setup_mdio;<br>
> > > @@ -1276,12 +1328,6 @@ static int ftgmac100_probe(struct platform_device *pdev)<br>
> > ><br>
> > >         netdev_info(netdev, "irq %d, mapped at %p\n", priv->irq, priv->base);<br>
> > ><br>
> > > -       if (!is_valid_ether_addr(netdev->dev_addr)) {<br>
> > > -               eth_hw_addr_random(netdev);<br>
> > > -               netdev_info(netdev, "generated random MAC address %pM\n",<br>
> > > -                           netdev->dev_addr);<br>
> > > -       }<br>
> > > -<br>
> > >         return 0;<br>
> > ><br>
> > >  err_register_netdev:<br>
> > > --<br>
> > > 2.1.0<br>
> > ><br>
</p>