diff options
Diffstat (limited to 'target/linux')
| -rw-r--r-- | target/linux/ar7-2.6/patches/210-phy_fixed.patch | 94 | 
1 files changed, 94 insertions, 0 deletions
| diff --git a/target/linux/ar7-2.6/patches/210-phy_fixed.patch b/target/linux/ar7-2.6/patches/210-phy_fixed.patch new file mode 100644 index 000000000..0ae2282c7 --- /dev/null +++ b/target/linux/ar7-2.6/patches/210-phy_fixed.patch @@ -0,0 +1,94 @@ +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 + } +  +  | 
