[eepro100-bug] 82559ER and DHCP

Donald Becker becker@scyld.com
Mon Oct 21 23:31:00 2002


On Mon, 21 Oct 2002, David Mattes wrote:

> I've been pulling my hair out for the last couple days with a JumpTec 
> PC104 Board (266MHz Pentium w/ MMX) and onboard 82559ER.  I have 
> installed several Redhat versions (7.2, 7.3, 8.0) only to get the same 
> results.  I have compiled and used the eepro100 driver distributed with 
> Redhat and the new drivers from Donald Becker's website (1.25 27Aug2002).
> 
> I can configure the NIC to use a static IP address just fine.  Large 
> files transfer, the interface works as it should.
> 
> When I try to use DHCP, the interface never comes up with an IP address. 
>  I'm quite familiar with setting up DHCP and am fairly certain that I 
> don't have any other broken links in the chain.  I've tried to get an 
> address with pump, dhcpcd, and dhclient (ISC's DHCP client).

The server should log if the client has been granted an address.

> Has anyone else seen this problem, or have a fix for it, or have 
> suggestions of things to try.

A problem with other adapter types has been "bouncing" the link --
shutting down the link and immediately starting it again.  Many DHCP clients
repeatedly shut down and bring up the network interface rather than
reconfigure it in place. 
If the driver shuts off the transceiver when the interface is shut down
or resets the transceiver when it is brought up, the broken link can
trigger bad behavior in switches.  Packet may be discarded for the first
few seconds.

You can see this happening by watching the LEDs or running
  mii-diag eth0 --watch

The reset is documented in the driver.  Here is the comment and code
around line 908:
________________
	/* With some transceivers we must retrigger negotiation to reset
	   power-up errors. */
	if ((sp->drv_flags & ResetMII) &&
________________

And guess which chip has the 'ResetMII' flags set... 
	{"Intel EtherExpress Pro/100+ i82559ER", { 0x12098086, 0xffffffff,},

A few lines later the code reads

#ifdef honor_default_port
		mdio_write(ioaddr, phy_addr, 0, mii_ctrl[dev->default_port & 7]);
#else
		mdio_write(ioaddr, phy_addr, 0, 0x3300);
#endif

Try commenting out these lines.
	
-- 
Donald Becker				becker@scyld.com
Scyld Computing Corporation		http://www.scyld.com
410 Severn Ave. Suite 210		Scyld Beowulf cluster system
Annapolis MD 21403			410-990-9993