[eepro100] mdio_read() timed out

Donald Becker becker@scyld.com
Wed Dec 4 14:35:06 2002


On Wed, 4 Dec 2002, Kevin Hansard wrote:

> I have a RH7.3 system. I have installed 3 Intel Dual Port Pro/100+
> cards. I am using 5 of the interfaces, though all are lightly
> loaded. When I install the latest driver v1.26 11/17/2002 I start to
> see lots of the following error in /var/log/messages: 
> 
> kernel:  mdio_read() timed out with val = 08210000.

Hmmm, this hasn't been a common problem.

What is the speed of the machine you are using?
What is version number of the chips?  (You can use the version from
'lspci' -- no need to open the case.)

> I still seem to be able to communicate properly over the
> network. However I assume that this error means I do have some kind of
> problem. 

The eepro100 handle duplex setting after autonegotiation internally, so
the major impact is not being able to monitor the link.

> I have also tried the v1.20 1/28/2002 version of the driver and this
> has the same problem. If I roll back to the stock RH driver v1.09j-t
> 9/29/99 everything works ok and no errors are reported. 

My current guess: the old driver is using slow I/O operations, and the
driver is using faster memory-space PCI operations.  That mdio_read()
part of the driver hasn't been re-validated with faster machines.

> Help and advice appreciated. What does this error really mean? Is the
> val = 08210000 meaningful, it is always the same value reported. 

It means that the failed operation was a
0x.8......  read of
0x..2.....  PHY #1
0x...1....  register #1  (basic mode status register)

and since the following is not set
0x1.......  The operation completed

we assume that the transceiver wasn't responding.

If you are willing to track down this problem, please add the following
code to mdio_read():

static int mdio_read(long ioaddr, int phy_id, int location)
{
-	int val, boguscnt = 64*10;		/* <64 usec. to complete, typ 27 ticks */
+	int val, boguscnt = 64*100;		/* Generous number of ticks */
	outl(0x08000000 | (location<<16) | (phy_id<<21), ioaddr + SCBCtrlMDI);
	do {
		val = inl(ioaddr + SCBCtrlMDI);
		if (--boguscnt < 0) {
			printk(KERN_ERR " mdio_read() timed out with val = %8.8x.\n", val);
			break;
		}
	} while (! (val & 0x10000000));
+	printk(KERN_INFO "  mdio_read() took %d ticks.\n", 64*100 - boguscnt);
	return val & 0xffff;
}

-- 
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