Message ID | 20190222125654.12478-1-vkoul@kernel.org |
---|---|
State | New |
Headers | show |
Series | net: dsa: Inherit dev addr from master | expand |
On 2019-02-22 22:30, Andrew Lunn wrote: > On Fri, Feb 22, 2019 at 06:26:54PM +0530, Vinod Koul wrote: >> From: Xiaofei Shen <xiaofeis@codeaurora.org> >> >> When we create slave netdevice, the dev addr is inherited from master >> but the master dev addr maybe NULL at that time, so inherit it again >> while opening the slave. > > Hi Xiaofei, Vinod > > Inheriting it twice seems a bit clumsy. Can the first inherit be > removed? Can you change your MAC driver to set its MAC address in > probe? > > Andrew Hi Andrew Some mac driver set its MAC address in probe while some MAC driver do it in the open function in the kernel. This patch is checking whether the address is valid firstly, if it already inherits a valid mac address, it will not inherit again. I think we can remove the first inherit, but if keep it, we can see consistent address output by ifconfig -a before open master and slave interface. Xiaofeis
> I think we can remove the first inherit, but if keep it, we can see > consistent address output by ifconfig -a before open master and slave > interface. True But it also means we see inconsistent MAC addresses on the master. The MAC address changes on open. Maybe it would be better to change your master so it sets its MAC address during probe? Everything is then consistent all the time. Andrew
On 2019-02-25 21:21, Andrew Lunn wrote: >> I think we can remove the first inherit, but if keep it, we can see >> consistent address output by ifconfig -a before open master and slave >> interface. > > True > > But it also means we see inconsistent MAC addresses on the master. The > MAC address changes on open. > > Maybe it would be better to change your master so it sets its MAC > address during probe? Everything is then consistent all the time. > > Andrew I'm trying to suggest our master driver owner to set MAC address during probe. I found in kernel, different driver has different implementation, some set it in probe, while some in open. DSA should be generic to work with all these master drivers. I think this change can help. Thanks.
diff --git a/net/dsa/slave.c b/net/dsa/slave.c index 8e64c4e947c6..5f95c538b58c 100644 --- a/net/dsa/slave.c +++ b/net/dsa/slave.c @@ -77,7 +77,9 @@ static int dsa_slave_open(struct net_device *dev) if (!(master->flags & IFF_UP)) return -ENETDOWN; - if (!ether_addr_equal(dev->dev_addr, master->dev_addr)) { + if (!is_valid_ether_addr(dev->dev_addr)) { + eth_hw_addr_inherit(dev, master); + } else if (!ether_addr_equal(dev->dev_addr, master->dev_addr)) { err = dev_uc_add(master, dev->dev_addr); if (err < 0) goto out;