aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/ar7-2.6/patches-2.6.22/210-phy_fixed.patch
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2007-07-11 10:47:25 +0000
committerFelix Fietkau <nbd@openwrt.org>2007-07-11 10:47:25 +0000
commit5123be41cd61a8485de7010a094575d8b6beba5f (patch)
tree009a0e205c374852fd5d63c0b598a3deaffbb788 /target/linux/ar7-2.6/patches-2.6.22/210-phy_fixed.patch
parenta508408c0b8b671cb4eae6b25774de59f3f883af (diff)
downloadupstream-5123be41cd61a8485de7010a094575d8b6beba5f.tar.gz
upstream-5123be41cd61a8485de7010a094575d8b6beba5f.tar.bz2
upstream-5123be41cd61a8485de7010a094575d8b6beba5f.zip
add ar7 2.6.22 patches by matteo (work in progress, not booting yet)
SVN-Revision: 7914
Diffstat (limited to 'target/linux/ar7-2.6/patches-2.6.22/210-phy_fixed.patch')
-rw-r--r--target/linux/ar7-2.6/patches-2.6.22/210-phy_fixed.patch93
1 files changed, 93 insertions, 0 deletions
diff --git a/target/linux/ar7-2.6/patches-2.6.22/210-phy_fixed.patch b/target/linux/ar7-2.6/patches-2.6.22/210-phy_fixed.patch
new file mode 100644
index 0000000000..c8eceebb50
--- /dev/null
+++ b/target/linux/ar7-2.6/patches-2.6.22/210-phy_fixed.patch
@@ -0,0 +1,93 @@
+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 +283,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",
+@@ -306,6 +354,7 @@
+ kfree(fixed);
+
+ return err;
++#endif
+ }
+
+