Connecting two gigabit-capable devices via 4-wire UTP cable is an abomination, but sometimes we have to live with it (e.g. when a greedy ISP decides to save a few cents and pulls a cheap cable to your apartment).
The fun starts when the devices try to negotiate Ethernet connection speed. Autonegotiation pulses are essentially 10BASE-T and use only 4 wires with no checking of cable category, even CAT3 is enough. So autonegotiation will "succeed" and will settle on 1Gbit since it's supported by both ends, even though there is not enough physical conductors for it. The link will not work.
To negotiate a working connection instead we need to remove 1Gbit from advertised link modes at least on one end. In Linux it should be rather straightforward with ethtool:
$ ethtool -s $IFACE advertise 0x00f
0x00f is a sum of hex values for all 10Mbit and 100Mbit modes
(0x001 + 0x002 + 0x004 + 0x008), explicitly excluding 1Gbit and everything
above that. Tweaking advertised link modes is better than forcing a particular
connection speed (
ethtool -s $IFACE speed 100) because in absence of
autonegotiation advertisement the other side may play it safe and switch
That's the theory. In practise however, hardware is difficult. Drivers for NICs are tricky and sometimes incomplete. On D-Link DIR-825 changes made by ethtool command did not stick: after a short hiccup NIC would immediately return back to default settings, ignoring ethtool input completely.
But all is not lost. Through trial and error I found a sequence that worked. Don't ask me why, I'm not cool enough yet to understand kernel drivers code. Here is what worked for me:
# Excerpt from /etc/rc.local # (order of commands and delays matter!) WAN=eth1 ethtool -s $WAN autoneg off sleep 1 ethtool -s $WAN speed 100 sleep 1 ethtool -s $WAN advertise 0x00f
Which results in a proper NIC configuration:
Supported ports: [ TP MII ] Supported link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Half 1000baseT/Full Supported pause frame use: Symmetric Receive-only Supports auto-negotiation: Yes Supported FEC modes: Not reported Advertised link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full Advertised pause frame use: No Advertised auto-negotiation: Yes Advertised FEC modes: Not reported Link partner advertised link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full Link partner advertised pause frame use: Symmetric Link partner advertised auto-negotiation: Yes Link partner advertised FEC modes: Not reported Speed: 100Mb/s Duplex: Full Port: MII PHYAD: 4 Transceiver: external Auto-negotiation: on Current message level: 0x000000ff (255) drv probe link timer ifdown ifup rx_err tx_err Link detected: yes
Let's hope some variation of this will work for your misbehaving device too! Good luck!