add ar7 2.6.23 patches and config
[openwrt.git] / target / linux / ar7 / patches-2.6.23 / 210-phy_fixed.patch
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 (file)
index 0000000..de49ff9
--- /dev/null
@@ -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
This page took 0.020075 seconds and 4 git commands to generate.