On Wednesday 21 June 2006 18:09, Vitaly Bordug wrote:

> +static int fixed_mdio_update_regs(struct fixed_info *fixed)
> +{
> +     u16 *regs = fixed->regs;
> +     u16 bmsr = 0;
> +     u16 bmcr = 0;
> +
> +     if(!regs) {
> +             printk(KERN_ERR "%s: regs not set up", __FUNCTION__);
> +             return -1;

-EINVAL perhaps?

> +static int fixed_mdio_register_device(int number, int speed, int duplex)
> +{
> +     struct mii_bus *new_bus;
> +     struct fixed_info *fixed;
> +     struct phy_device *phydev;
> +     int err = 0;
> +
> +     struct device* dev = kzalloc(sizeof(struct device), GFP_KERNEL);
> +
> +     if (NULL == dev)
> +             return -EINVAL;

-ENOMEM here.

> +     new_bus = kzalloc(sizeof(struct mii_bus), GFP_KERNEL);
> +
> +     if (NULL == new_bus) {
> +             kfree(dev);
> +             return -ENOMEM;
> +     }
> +     fixed = fixed_ptr = kzalloc(sizeof(struct fixed_info), GFP_KERNEL);
> +
> +     if (NULL == fixed) {
> +             kfree(dev);
> +             kfree(new_bus);
> +             return -ENOMEM;
> +     }
> +
> +     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;
> +     fixed->phy_status.link = 1;
> +
> +     new_bus->name = "Fixed MII Bus",
> +     new_bus->read = &fixed_mii_read,
> +     new_bus->write = &fixed_mii_write,
> +     new_bus->reset = &fixed_mii_reset,
> +
> +     /*set up workspace*/
> +     fixed_mdio_update_regs(fixed);
> +     new_bus->priv = fixed;
> +
> +     new_bus->dev = dev;
> +     dev_set_drvdata(dev, new_bus);
> +
> +     /* create phy_device and register it on the mdio bus */
> +     phydev = phy_device_create(new_bus, 0, 0);
> +
> +     /*
> +      Put the phydev pointer into the fixed pack so that bus read/write code 
> could be able
> +      to access for instance attached netdev. Well it doesn't have  to do 
> so, only in case
> +      of utilizing user-specified link-update...
> +      */
> +     fixed->phydev = phydev;
> +
> +     if (IS_ERR(phydev)) {
> +             err = PTR_ERR(-ENOMEM);
> +             goto bus_register_fail;
> +     }
> +
> +     phydev->irq = -1;
> +     phydev->dev.bus = &mdio_bus_type;
> +
> +     if(number)
> +             snprintf(phydev->dev.bus_id, BUS_ID_SIZE,
> +                             "[EMAIL PROTECTED]:%d", number, speed, duplex);
> +     else
> +             snprintf(phydev->dev.bus_id, BUS_ID_SIZE,
> +                             "[EMAIL PROTECTED]:%d", speed, duplex);
> +     phydev->bus = new_bus;
> +
> +     err = device_register(&phydev->dev);
> +     if(err) {
> +             printk(KERN_ERR "Phy %s failed to register\n",
> +                             phydev->dev.bus_id);
> +             goto bus_register_fail;
> +     }
> +
> +     /*
> +        the mdio bus has phy_id match... In order not to do it
> +        artificially, we are binding the driver here by hand;
> +        it will be the same
> +        for all the fixed phys anyway.
> +      */
> +     down_write(&phydev->dev.bus->subsys.rwsem);
> +
> +     phydev->dev.driver = &fixed_mdio_driver.driver;
> +
> +     err = phydev->dev.driver->probe(&phydev->dev);
> +     if(err < 0) {
> +             printk(KERN_ERR "Phy %s: problems with fixed driver\n",
> +                             phydev->dev.bus_id);
> +             up_write(&phydev->dev.bus->subsys.rwsem);
> +             goto bus_register_fail;

Probably need some additional error unwinding code.
Of doesn't device_register() have to be reverted?
What about phy_device_create()?

> +     }
> +
> +     device_bind_driver(&phydev->dev);
> +     up_write(&phydev->dev.bus->subsys.rwsem);
> +
> +     return 0;
> +
> +bus_register_fail:
> +     kfree(dev);
> +     kfree (fixed);
> +     kfree(new_bus);
> +
> +     return err;
> +}

-- 
Greetings Michael.
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to