diff options
Diffstat (limited to 'target/linux/ar7/patches-2.6.23/210-phy_fixed.patch')
-rw-r--r-- | target/linux/ar7/patches-2.6.23/210-phy_fixed.patch | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/target/linux/ar7/patches-2.6.23/210-phy_fixed.patch b/target/linux/ar7/patches-2.6.23/210-phy_fixed.patch new file mode 100644 index 0000000..de49ff9 --- /dev/null +++ b/target/linux/ar7/patches-2.6.23/210-phy_fixed.patch @@ -0,0 +1,93 @@ +Index: linux-2.6.23-rc6/drivers/net/phy/fixed.c +=================================================================== +--- linux-2.6.23-rc6.orig/drivers/net/phy/fixed.c 2007-09-21 16:23:51.000000000 +0800 ++++ linux-2.6.23-rc6/drivers/net/phy/fixed.c 2007-09-21 16:24:13.000000000 +0800 +@@ -189,6 +189,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. +@@ -224,6 +237,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; +@@ -252,8 +271,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; +@@ -265,8 +287,33 @@ + 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; ++ } ++ ++ 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", +@@ -303,6 +350,7 @@ + kfree(fixed); + + return err; ++#endif + } + #endif + |