diff -Nur linux-2.6.23.16/drivers/net/arm/ixp4xx_eth.c linux-2.6.23.16-owrt/drivers/net/arm/ixp4xx_eth.c --- linux-2.6.23.16/drivers/net/arm/ixp4xx_eth.c 2008-02-15 18:18:02.000000000 +0100 +++ linux-2.6.23.16-owrt/drivers/net/arm/ixp4xx_eth.c 2008-02-18 12:14:42.000000000 +0100 @@ -297,6 +297,27 @@ unsigned long flags; u16 val; + /* For boards that use a switch chip (eg. Marvell 88E6060) */ + if ( phy_id < 0 || phy_id > 31 ) { + switch (location) { + case MII_BMCR: + val = 0x3100; + break; + case MII_BMSR: + val = 0x406d; + break; + case MII_ADVERTISE: + val = 0x0101; + break; + case MII_LPA: + val = 0x4101; + break; + default: + val = 0; + break; + } + return val; + } spin_lock_irqsave(&mdio_lock, flags); val = mdio_cmd(dev, phy_id, location, 0, 0); spin_unlock_irqrestore(&mdio_lock, flags); @@ -308,6 +329,9 @@ { unsigned long flags; + if ( phy_id < 0 || phy_id > 31 ) { + return; + } spin_lock_irqsave(&mdio_lock, flags); mdio_cmd(dev, phy_id, location, 1, val); spin_unlock_irqrestore(&mdio_lock, flags);