em(4) on FreeBSD is sometimes annoying

Jeremy Chadwick koitsu at FreeBSD.org
Mon Aug 4 09:13:25 UTC 2008

On Mon, Aug 04, 2008 at 10:53:35AM +0200, Martin wrote:
> Am Sat, 2 Aug 2008 16:01:35 -0700
> schrieb "Jack Vogel" <jfvogel at gmail.com>:
> > > After I typed "/etc/rc.d/netif restart", I waited until I get
> > > "giving up" message. Then I plugged the cable in. After about 30
> > > seconds the link LED was on. I noticed that at this point I
> > > couldn't get an address using DHCP.
> > 
> > Well DUH, the agent exited, thats why it said "giving up" :)
> > That ain't complex behavior, its behaving as designed.
> I'm describing the circumstances WHEN everything happens. I was trying
> to show you that even the cable is plugged in you cannot get an IP. The
> NIC is in a kind of "dead" state.
> > Ya, so the update is slow, the fact that the LED is blinking means you
> > have an autoneg failure, so again, its your switch not the NIC.
> I have this problem with every kind of switch.
> The switch at home is a 100Mbit switch made by Digitus (5-port).

Can you try repeating the problem under Linux?  It may be a bit much to
ask, but I believe there's an Ubuntu Live CD you can download + burn +
boot.  You could try repeating the behaviour there.  If it's identical,
or at least "still broken", then it's less likely FreeBSD's fault.

> > Let me guess, you have some 100Mb home router and you are trying
> > to plug a gig nic into it and forcing the speed maybe?
> This is true except for the "forcing the speed" part. It's set to
> "media: Ethernet autoselect".

Which means it's using auto-neg, which Jack says (based on the
information he has) may be failing upon link loss + reconnect.  As
described, auto-negotiation has to be properly implemented on both the
NIC/PHY and on the switch, as well as handled properly in the NIC

I can tell you that in the case of the Intel 82573E and FreeBSD's em(4)
driver (version 6.x.x), auto-neg is performed properly, including when
link is lost/cable pulled.  I've personally tested this on numerous
consumer switches (D-Link, Linksys, and Hawking Technologies), as well
as enterprise switches (specifically ProCurve and Cisco).  I can tell
you that I've seen odd speed negotiation failures with Netgear consumer
switches (100mbit being chosen instead of gigE).

In fact, this weekend in my home, I just migrated from a D-Link switch
to an HP ProCurve switch.  I powered off one switch, installed the new
one, powered it on, and link came up.  Took a couple minutes.  But then
I decided to re-organise some of my cabling, which caused another
disconnect.  Here's evidence:

em0: <Intel(R) PRO/1000 Network Connection 6.9.5> port 0x4000-0x401f mem 0xe8000000-0xe801ffff irq 16 at device 0.0 on pci13
em0: Using MSI interrupt
em0: [FILTER]
em0: Ethernet address: 00:30:48:97:25:40

em0 at pci0:13:0:0:        class=0x020000 card=0x108c15d9 chip=0x108c8086 rev=0x03 hdr=0x00
    vendor     = 'Intel Corporation'
    device     = '82573E Intel Corporation 82573E Gigabit Ethernet Controller (Copper)'
    class      = network
    subclass   = ethernet

icarus# bzgrep "kernel: em0" /var/log/all.log.3.bz2
Jul 31 06:28:23 icarus kernel: em0: link state changed to DOWN
Jul 31 06:30:17 icarus kernel: em0: link state changed to UP
Jul 31 06:32:36 icarus kernel: em0: link state changed to DOWN
Jul 31 06:32:53 icarus kernel: em0: link state changed to UP

And absolutely no problems:

icarus# netstat -in -I em0
Name    Mtu Network       Address              Ipkts Ierrs    Opkts Oerrs  Coll
em0    1500 <Link#1>      00:30:48:97:25:40 32941661     0 34620277     0     0
em0    1500      32915748     - 35942133     -     -

icarus# ifconfig em0
em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        ether 00:30:48:97:25:40
        inet netmask 0xffffff00 broadcast
        media: Ethernet autoselect (1000baseTX <full-duplex>)
        status: active

What I'm saying is "I don't know what to tell you".  I'm not doubting
your claims, but it would be worthwhile to test on Linux to see if it's
a FreeBSD driver issue, something with the NIC/PHY, the way the NIC/PHY
is implemented on the computer, or even the cable (yes really!).  I'd
start with the obvious: try replacing the cable, and go with a CAT5e
cable that's pre-made (rather than self-rolled, if you're using such).

| Jeremy Chadwick                                jdc at parodius.com |
| Parodius Networking                       http://www.parodius.com/ |
| UNIX Systems Administrator                  Mountain View, CA, USA |
| Making life hard for others since 1977.              PGP: 4BD6C0CB |

More information about the freebsd-stable mailing list