aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/ar7/patches-2.6.23/210-phy_fixed.patch
diff options
context:
space:
mode:
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.patch93
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 0000000000..de49ff9d3f
--- /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
+