net: Delay etherbind until the link is up
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 14 Nov 2017 19:26:20 +0000 (14:26 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 16 Nov 2017 15:46:57 +0000 (10:46 -0500)
commit8990ae1ba8a102cf0ab0b049263b1d4b9d603e89
tree7a322e308498038db5436c5119fef7ce22aaffd7
parentc985f1a4260cb22f932c67e25f74e9cdbf677087
net: Delay etherbind until the link is up

On some drivers, at least r8169, the link auto-negotiation takes a few
seconds.  It starts during attach(), but we can't wait there.  Lots of NICs
get attached, including ones that will never have a link.  Note that
attach() happens when you try to cat \#ether.0/ether0/addr.

We can't wait at attach.  If we try to error out during transmit, that
actually breaks (error at ipifc.c L444).  The IP stack will try to send
packets.

So we have two choices: on every transmit, do a netif_wait_for_carrier(),
or catch it after attach, but before Ipifc initialization.  It turns out
that during etherbind() we can wait.  This is when we try to prepare the
NIC to use IPv4, v6, and ARP.

Note this means all 9ns drivers need to tell the rest of the stack that
their links are up.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/drivers/dev/ether.c
kern/drivers/net/ether8139.c
kern/drivers/net/ether8169.c
kern/drivers/net/ether82563.c
kern/drivers/net/etherigbe.c
kern/include/linux/compat_todo.h
kern/include/linux_compat.h
kern/include/net/ip.h
kern/include/rendez.h
kern/src/net/netif.c