Index: linux-2.6.23.17/drivers/net/arm/ixp4xx_eth.c =================================================================== --- linux-2.6.23.17.orig/drivers/net/arm/ixp4xx_eth.c +++ linux-2.6.23.17/drivers/net/arm/ixp4xx_eth.c @@ -297,6 +297,27 @@ static int mdio_read(struct net_device * 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 @@ static void mdio_write(struct net_device { 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);