|
|
@@ -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
|
|
|
+ }
|
|
|
+
|
|
|
+
|