210-phy_fixed.patch 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. Index: linux-2.6.23.17/drivers/net/phy/fixed.c
  2. ===================================================================
  3. --- linux-2.6.23.17.orig/drivers/net/phy/fixed.c
  4. +++ linux-2.6.23.17/drivers/net/phy/fixed.c
  5. @@ -189,6 +189,19 @@ static struct phy_driver fixed_mdio_driv
  6. .driver = { .owner = THIS_MODULE,},
  7. };
  8. +static void fixed_mdio_release (struct device * dev)
  9. +{
  10. + struct phy_device *phydev = container_of(dev, struct phy_device, dev);
  11. + struct mii_bus *bus = phydev->bus;
  12. + struct fixed_info *fixed = bus->priv;
  13. +
  14. + kfree(phydev);
  15. + kfree(bus->dev);
  16. + kfree(bus);
  17. + kfree(fixed->regs);
  18. + kfree(fixed);
  19. +}
  20. +
  21. /*-----------------------------------------------------------------------------
  22. * This func is used to create all the necessary stuff, bind
  23. * the fixed phy driver and register all it on the mdio_bus_type.
  24. @@ -224,6 +237,12 @@ static int fixed_mdio_register_device(in
  25. }
  26. fixed->regs = kzalloc(MII_REGS_NUM*sizeof(int), GFP_KERNEL);
  27. + if (NULL == fixed->regs) {
  28. + kfree(dev);
  29. + kfree(new_bus);
  30. + kfree(fixed);
  31. + return -ENOMEM;
  32. + }
  33. fixed->regs_num = MII_REGS_NUM;
  34. fixed->phy_status.speed = speed;
  35. fixed->phy_status.duplex = duplex;
  36. @@ -252,8 +271,11 @@ static int fixed_mdio_register_device(in
  37. fixed->phydev = phydev;
  38. if(NULL == phydev) {
  39. - err = -ENOMEM;
  40. - goto device_create_fail;
  41. + kfree(dev);
  42. + kfree(new_bus);
  43. + kfree(fixed->regs);
  44. + kfree(fixed);
  45. + return -ENOMEM;
  46. }
  47. phydev->irq = PHY_IGNORE_INTERRUPT;
  48. @@ -265,8 +287,33 @@ static int fixed_mdio_register_device(in
  49. else
  50. snprintf(phydev->dev.bus_id, BUS_ID_SIZE,
  51. "fixed@%d:%d", speed, duplex);
  52. +
  53. phydev->bus = new_bus;
  54. +#if 1
  55. + phydev->dev.driver = &fixed_mdio_driver.driver;
  56. + phydev->dev.release = fixed_mdio_release;
  57. +
  58. + err = phydev->dev.driver->probe(&phydev->dev);
  59. + if(err < 0) {
  60. + printk(KERN_ERR "Phy %s: problems with fixed driver\n",
  61. + phydev->dev.bus_id);
  62. + kfree(phydev);
  63. + kfree(dev);
  64. + kfree(new_bus);
  65. + kfree(fixed->regs);
  66. + kfree(fixed);
  67. + return err;
  68. + }
  69. +
  70. + err = device_register(&phydev->dev);
  71. + if(err) {
  72. + printk(KERN_ERR "Phy %s failed to register\n",
  73. + phydev->dev.bus_id);
  74. + }
  75. +
  76. + return 0;
  77. +#else
  78. err = device_register(&phydev->dev);
  79. if(err) {
  80. printk(KERN_ERR "Phy %s failed to register\n",
  81. @@ -303,6 +350,7 @@ device_create_fail:
  82. kfree(fixed);
  83. return err;
  84. +#endif
  85. }
  86. #endif