strip the kernel version suffix from target directories, except for brcm-2.4 (the...
[openwrt.git] / target / linux / ar7 / patches-2.6.22 / 210-phy_fixed.patch
1 Index: linux-2.6.21.4/drivers/net/phy/fixed.c
2 ===================================================================
3 --- linux-2.6.21.4.orig/drivers/net/phy/fixed.c 2007-06-11 16:30:06.418483448 +0200
4 +++ linux-2.6.21.4/drivers/net/phy/fixed.c      2007-06-11 16:30:11.156763120 +0200
5 @@ -187,6 +187,19 @@
6         .driver         = { .owner = THIS_MODULE,},
7  };
8  
9 +static void fixed_mdio_release (struct device * dev)
10 +{
11 +       struct phy_device *phydev = container_of(dev, struct phy_device, dev);
12 +       struct mii_bus *bus = phydev->bus;
13 +       struct fixed_info *fixed = bus->priv;
14 +
15 +       kfree(phydev);
16 +       kfree(bus->dev);
17 +       kfree(bus);
18 +       kfree(fixed->regs);
19 +       kfree(fixed);
20 +}
21 +
22  /*-----------------------------------------------------------------------------
23   *  This func is used to create all the necessary stuff, bind
24   * the fixed phy driver and register all it on the mdio_bus_type.
25 @@ -221,6 +234,12 @@
26         }
27  
28         fixed->regs = kzalloc(MII_REGS_NUM*sizeof(int), GFP_KERNEL);
29 +       if (NULL == fixed->regs) {
30 +               kfree(dev);
31 +               kfree(new_bus);
32 +               kfree(fixed);
33 +               return -ENOMEM;
34 +       }
35         fixed->regs_num = MII_REGS_NUM;
36         fixed->phy_status.speed = speed;
37         fixed->phy_status.duplex = duplex;
38 @@ -249,8 +268,11 @@
39         fixed->phydev = phydev;
40  
41         if(NULL == phydev) {
42 -               err = -ENOMEM;
43 -               goto device_create_fail;
44 +               kfree(dev);
45 +               kfree(new_bus);
46 +               kfree(fixed->regs);
47 +               kfree(fixed);
48 +               return -ENOMEM;
49         }
50  
51         phydev->irq = PHY_IGNORE_INTERRUPT;
52 @@ -262,8 +283,33 @@
53         else
54                 snprintf(phydev->dev.bus_id, BUS_ID_SIZE,
55                                 "fixed@%d:%d", speed, duplex);
56 +
57         phydev->bus = new_bus;
58  
59 +#if 1
60 +       phydev->dev.driver = &fixed_mdio_driver.driver;
61 +       phydev->dev.release = fixed_mdio_release;
62 +
63 +       err = phydev->dev.driver->probe(&phydev->dev);
64 +       if(err < 0) {
65 +               printk(KERN_ERR "Phy %s: problems with fixed driver\n",
66 +                       phydev->dev.bus_id);
67 +               kfree(phydev);
68 +               kfree(dev);
69 +               kfree(new_bus);
70 +               kfree(fixed->regs);
71 +               kfree(fixed);
72 +               return err;
73 +       }
74 +
75 +       err = device_register(&phydev->dev);
76 +       if(err) {
77 +               printk(KERN_ERR "Phy %s failed to register\n",
78 +                               phydev->dev.bus_id);
79 +       }
80 +
81 +       return 0;
82 +#else
83         err = device_register(&phydev->dev);
84         if(err) {
85                 printk(KERN_ERR "Phy %s failed to register\n",
86 @@ -306,6 +354,7 @@
87         kfree(fixed);
88  
89         return err;
90 +#endif
91  }
92  
93