1
0
mirror of git://projects.qi-hardware.com/openwrt-xburst.git synced 2024-08-21 07:38:59 +03:00
openwrt-xburst/target/linux/ar7/patches-2.6.23/210-phy_fixed.patch
ejka c9dad6250d add ar7 2.6.23 patches and config
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@9115 3c298f89-4303-0410-b956-a3cf2f4a3e73
2007-10-04 02:27:37 +00:00

94 lines
2.2 KiB
Diff

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