A Much Simpler Fix for the r8169 “Link-Down” Problem

There is a widespread problem with the Linux driver for the Realtek 8168/8169 cards where the modules load properly and the card is visible but no link is detected. E.g.:

Jun 21 18:28:41 localhost kernel: r8169: eth0: link down
Jun 21 18:28:41 localhost kernel: ADDRCONF(NETDEV_UP): eth0: link is not ready

There are lots of details and suggested solutions from the Ubuntu people. None of the suggestions worked for me, however. Several of them suggest configuring the card under Windows, but the box containing this device is a single-boot linux fileserver. The “wake-on-LAN” functionality seems to be implicated, but not in a way I can see how to fix.

After much head-banging (in the bad sense), I found a simple solution:

(1) Install ethtool
(2) Modify /etc/network/interfaces as follows (substitute your r8169 interface for ‘eth1′ and other settings accordingly):

iface eth1 inet static
pre-up /usr/sbin/ethtool -s eth1 autoneg off
address 192.168.98.1
netmask 255.255.255.0

This did the trick for me where no other solution would work. Of course, link autodetection no longer occurs, but that’s a small price to pay for connectivity.

This is a Debian etch installation using a slightly more recent kernel (2.6.25-2-686).

As an interesting side note, on this new box, the interface appears as eth0 in the kernel logs, but is actually mapped as eth1. Similarly, a second Ethernet interface appears in the log as a different device number than that by which it is referenced. Any ideas why?

Update 6/22/08: Still not getting 1000BaseT (Gigabit), however. If I force 1000BaseT with ethtool -s eth1 speed 1000, the link goes down again (even with autoneg off). The same card in another box, however, detects the link and goes to 1000BaseT automatically. So I’m stuck at 100BaseT.

Update 6/24/08: Linux 2.6.26-rc5 fixes the problem 100% for me.

Technorati Tags: , , , ,

12 comments

  1. Matthew W. S. Bell Jun 21

    2008 and people still implement link auto-negotiation badly?!

  2. Vincent Bernat Jun 22

    Look at /etc/udev/rules.d/persistent-net.rules

  3. Luca Toscano Jun 22

    Hi,

    I’ve tried to apply your guide to my laptop (dell vostro 1310) and now my r8169 card work perfectly!

    Thanks a lot!

    Luca

  4. Markus Hochholdinger Jun 22

    For me pre-up /usr/sbin/ethtool -s eth0 duplex full speed 1000 is working very well. This is my notebook and I noticed when I’m connected to 100MBit/s and switch later to 1GBit/s I mostly ended up with 10 MBit/s or no connection.

  5. Rafael Vuijk Jun 22

    I have the same problem. I could get 1000mbit at some point, but not anymore. 100mbit works fine but not what I want. I’ll try to use the driver from Realtek.

  6. adam Jun 22

    I couldn’t get the driver from Realtek to compile. I get a series of errors starting with:

    /tmp/r8169-6.006.00/src/r8169n.c: In function 'rtl8169initone':
    /tmp/r8169-6.006.00/src/r8169n.c:2432: error: implicit declaration of function 'SETMODULEOWNER'
    /tmp/r8169-6.006.00/src/r8169n.c:2595: error: 'struct netdevice' has no member named 'poll'
    /tmp/r8169-6.006.00/src/r8169n.c:2596: error: 'struct netdevice' has no member named 'weight'
    

  7. Rafael Vuijk Jun 24

    Seems like the netdevice struct misses the member named ‘owner’. Add #define SETMODULE_OWNER(dev) and it will compile.

  8. adam Jun 24

    It turns out it was fixed in 2.6.26-rc5, so I’m all set.

  9. Rafael Vuijk Jun 24

    Hard to believe though. It’s been so long :) At least the source from realtek gave me back 1000mbit for now. I hope not something else is still broken.

  10. Jorj Jul 4

    rl8169 not work (((

  11. JWS Aug 10

    Thanks for this, it worked for me with the following steps:

    • Boot with cable in eth1 (and assign the ip to eth1 also in the interfaces-file)
    • When booted plug it into eth0 (change the interfaces-file, and restart network. link becomes ready)
    • Bring down eth1 (ifconfig eth1 down)
    • Link works again

    (where eth0 and eth1 will be the first/second interface)

    This is on a Gigabyte mobo with 2 Gigabit NICs, running Debian 2.6.18 kernel

    Best way to solve this is just upgrading the kernel :)

  1. Back on Ubuntu on a Dell Vostro 1510 | VT's Tech Blog

Leave a Reply

(Markdown Syntax Permitted)