Index: linux-2.6.21.4/drivers/net/phy/fixed.c =================================================================== --- linux-2.6.21.4.orig/drivers/net/phy/fixed.c 2007-06-11 16:30:06.418483448 +0200 +++ linux-2.6.21.4/drivers/net/phy/fixed.c 2007-06-11 16:30:11.156763120 +0200 @@ -187,6 +187,19 @@ .driver = { .owner = THIS_MODULE,}, }; +static void fixed_mdio_release (struct device * dev) +{ + struct phy_device *phydev = container_of(dev, struct phy_device, dev); + struct mii_bus *bus = phydev->bus; + struct fixed_info *fixed = bus->priv; + + kfree(phydev); + kfree(bus->dev); + kfree(bus); + kfree(fixed->regs); + kfree(fixed); +} + /*----------------------------------------------------------------------------- * This func is used to create all the necessary stuff, bind * the fixed phy driver and register all it on the mdio_bus_type. @@ -221,6 +234,12 @@ } fixed->regs = kzalloc(MII_REGS_NUM*sizeof(int), GFP_KERNEL); + if (NULL == fixed->regs) { + kfree(dev); + kfree(new_bus); + kfree(fixed); + return -ENOMEM; + } fixed->regs_num = MII_REGS_NUM; fixed->phy_status.speed = speed; fixed->phy_status.duplex = duplex; @@ -249,8 +268,11 @@ fixed->phydev = phydev; if(NULL == phydev) { - err = -ENOMEM; - goto device_create_fail; + kfree(dev); + kfree(new_bus); + kfree(fixed->regs); + kfree(fixed); + return -ENOMEM; } phydev->irq = PHY_IGNORE_INTERRUPT; @@ -262,8 +284,34 @@ else snprintf(phydev->dev.bus_id, BUS_ID_SIZE, "fixed@%d:%d", speed, duplex); + phydev->bus = new_bus; +#if 1 + phydev->dev.driver = &fixed_mdio_driver.driver; + phydev->dev.release = fixed_mdio_release; + + err = phydev->dev.driver->probe(&phydev->dev); + if(err < 0) { + printk(KERN_ERR "Phy %s: problems with fixed driver\n", + phydev->dev.bus_id); + kfree(phydev); + kfree(dev); + kfree(new_bus); + kfree(fixed->regs); + kfree(fixed); + return err; + } + + down_write(&phydev->dev.bus->subsys.rwsem); + err = device_register(&phydev->dev); + if(err) { + printk(KERN_ERR "Phy %s failed to register\n", + phydev->dev.bus_id); + } + + return 0; +#else err = device_register(&phydev->dev); if(err) { printk(KERN_ERR "Phy %s failed to register\n", @@ -306,6 +354,7 @@ kfree(fixed); return err; +#endif }