On 14/02/14 19:18, Andrew Lunn wrote:
Are you 100% sure that the NETDEV_UP event was sent within those 3 seconds and not after? If you use a serial console you should see the kernel output mixed with your test. (just to be 100% sure..)
http://lxr.free-electrons.com/source/net/core/dev.c#L1286
1286 int dev_open(struct net_device *dev) 1287 { 1288 int ret; 1289 1290 if (dev->flags & IFF_UP) 1291 return 0; 1292 1293 ret = __dev_open(dev); 1294 if (ret < 0) 1295 return ret; 1296 1297 rtmsg_ifinfo(RTM_NEWLINK, dev, IFF_UP|IFF_RUNNING, GFP_KERNEL); 1298 call_netdevice_notifiers(NETDEV_UP, dev); 1299 1300 return ret; 1301 }
So the NETDEV_UP is sent as soon as __dev_open() returns, i.e. ndo_open().
Yeah, I hoped that the negotiation was performed within dev_open() :-(
What i do see is:
half 1000 half 1000 half 1000 half 1000 half 1000 half 1000 mv643xx_eth_port mv643xx_eth_port.0 eth0: link up, 1000 Mb/s, full duplex, flowd full 1000
The link up is from:
http://lxr.free-electrons.com/source/drivers/net/ethernet/marvell/mv643xx_et...
There is no sign of a call_netdevice_notifiers() here, but i think a netlink message will be sent to userspace because of the netif_carrier_on() call.
I tried to follow netif_carrier_on() but I couldn't find any particular function firing any event.
Maybe I should simply make it simple and read the Ethernet card properties inside get_throughput() upon ELP sending (like I do for the wifi throughput)?
I did put it in iface_activate() because I expected this values to be rather static, but now you convinced me that this is not the case :-)
Cheers,