[PATCH] net: phy: Remove inline definitions from convinience functions

Ramon Fried rfried.dev at gmail.com
Mon Jun 6 10:46:02 CEST 2022


On Sun, Jun 5, 2022 at 9:59 AM Michael Nazzareno Trimarchi
<michael at amarulasolutions.com> wrote:
>
> Hi Ramon
>
> Il dom 5 giu 2022, 02:44 Ramon Fried <rfried.dev at gmail.com> ha scritto:
>>
>> The convinience functions are not that small and they caused
>> bloated text segments because of their usage.
>> There was no need to inline them in the first place, as
>> they're not part of a fastpath.
>
>
>
> Please give numbers here in commit message ;)
You can see some numbers in the patch phy: dp83867: add
dp83867_{read,write}_mmd helpers"
Thanks,
Ramon
>
> Otherwise
>
> Reviewed-by: Michael Trimarchi <michael at amarulasolutions.com>
>
> Michael
>>
>>
>> Signed-off-by: Ramon Fried <rfried.dev at gmail.com>
>> ---
>>  drivers/net/phy/phy.c | 174 ++++++++++++++++++++++++++++++++++++++
>>  include/phy.h         | 189 ++----------------------------------------
>>  2 files changed, 183 insertions(+), 180 deletions(-)
>>
>> diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
>> index 1121b99abf..e6e1755518 100644
>> --- a/drivers/net/phy/phy.c
>> +++ b/drivers/net/phy/phy.c
>> @@ -1101,3 +1101,177 @@ int phy_modify(struct phy_device *phydev, int devad, int regnum, u16 mask,
>>
>>         return phy_write(phydev, devad, regnum, (ret & ~mask) | set);
>>  }
>> +
>> +/**
>> + * phy_read - Convenience function for reading a given PHY register
>> + * @phydev: the phy_device struct
>> + * @devad: The MMD to read from
>> + * @regnum: register number to read
>> + * @return: value for success or negative errno for failure
>> + */
>> +int phy_read(struct phy_device *phydev, int devad, int regnum)
>> +{
>> +       struct mii_dev *bus = phydev->bus;
>> +
>> +       if (!bus || !bus->read) {
>> +               debug("%s: No bus configured\n", __func__);
>> +               return -1;
>> +       }
>> +
>> +       return bus->read(bus, phydev->addr, devad, regnum);
>> +}
>> +
>> +/**
>> + * phy_write - Convenience function for writing a given PHY register
>> + * @phydev: the phy_device struct
>> + * @devad: The MMD to read from
>> + * @regnum: register number to write
>> + * @val: value to write to @regnum
>> + * @return: 0 for success or negative errno for failure
>> + */
>> +int phy_write(struct phy_device *phydev, int devad, int regnum, u16 val)
>> +{
>> +       struct mii_dev *bus = phydev->bus;
>> +
>> +       if (!bus || !bus->write) {
>> +               debug("%s: No bus configured\n", __func__);
>> +               return -1;
>> +       }
>> +
>> +       return bus->write(bus, phydev->addr, devad, regnum, val);
>> +}
>> +
>> +/**
>> + * phy_mmd_start_indirect - Convenience function for writing MMD registers
>> + * @phydev: the phy_device struct
>> + * @devad: The MMD to read from
>> + * @regnum: register number to write
>> + * @return: None
>> + */
>> +void phy_mmd_start_indirect(struct phy_device *phydev, int devad, int regnum)
>> +{
>> +       /* Write the desired MMD Devad */
>> +       phy_write(phydev, MDIO_DEVAD_NONE, MII_MMD_CTRL, devad);
>> +
>> +       /* Write the desired MMD register address */
>> +       phy_write(phydev, MDIO_DEVAD_NONE, MII_MMD_DATA, regnum);
>> +
>> +       /* Select the Function : DATA with no post increment */
>> +       phy_write(phydev, MDIO_DEVAD_NONE, MII_MMD_CTRL,
>> +                 (devad | MII_MMD_CTRL_NOINCR));
>> +}
>> +
>> +/**
>> + * phy_read_mmd - Convenience function for reading a register
>> + * from an MMD on a given PHY.
>> + * @phydev: The phy_device struct
>> + * @devad: The MMD to read from
>> + * @regnum: The register on the MMD to read
>> + * @return: Value for success or negative errno for failure
>> + */
>> +int phy_read_mmd(struct phy_device *phydev, int devad, int regnum)
>> +{
>> +       struct phy_driver *drv = phydev->drv;
>> +
>> +       if (regnum > (u16)~0 || devad > 32)
>> +               return -EINVAL;
>> +
>> +       /* driver-specific access */
>> +       if (drv->read_mmd)
>> +               return drv->read_mmd(phydev, devad, regnum);
>> +
>> +       /* direct C45 / C22 access */
>> +       if ((drv->features & PHY_10G_FEATURES) == PHY_10G_FEATURES ||
>> +           devad == MDIO_DEVAD_NONE || !devad)
>> +               return phy_read(phydev, devad, regnum);
>> +
>> +       /* indirect C22 access */
>> +       phy_mmd_start_indirect(phydev, devad, regnum);
>> +
>> +       /* Read the content of the MMD's selected register */
>> +       return phy_read(phydev, MDIO_DEVAD_NONE, MII_MMD_DATA);
>> +}
>> +
>> +/**
>> + * phy_write_mmd - Convenience function for writing a register
>> + * on an MMD on a given PHY.
>> + * @phydev: The phy_device struct
>> + * @devad: The MMD to read from
>> + * @regnum: The register on the MMD to read
>> + * @val: value to write to @regnum
>> + * @return: 0 for success or negative errno for failure
>> + */
>> +int phy_write_mmd(struct phy_device *phydev, int devad, int regnum, u16 val)
>> +{
>> +       struct phy_driver *drv = phydev->drv;
>> +
>> +       if (regnum > (u16)~0 || devad > 32)
>> +               return -EINVAL;
>> +
>> +       /* driver-specific access */
>> +       if (drv->write_mmd)
>> +               return drv->write_mmd(phydev, devad, regnum, val);
>> +
>> +       /* direct C45 / C22 access */
>> +       if ((drv->features & PHY_10G_FEATURES) == PHY_10G_FEATURES ||
>> +           devad == MDIO_DEVAD_NONE || !devad)
>> +               return phy_write(phydev, devad, regnum, val);
>> +
>> +       /* indirect C22 access */
>> +       phy_mmd_start_indirect(phydev, devad, regnum);
>> +
>> +       /* Write the data into MMD's selected register */
>> +       return phy_write(phydev, MDIO_DEVAD_NONE, MII_MMD_DATA, val);
>> +}
>> +
>> +/**
>> + * phy_set_bits_mmd - Convenience function for setting bits in a register
>> + * on MMD
>> + * @phydev: the phy_device struct
>> + * @devad: the MMD containing register to modify
>> + * @regnum: register number to modify
>> + * @val: bits to set
>> + * @return: 0 for success or negative errno for failure
>> + */
>> +int phy_set_bits_mmd(struct phy_device *phydev, int devad, u32 regnum, u16 val)
>> +{
>> +       int value, ret;
>> +
>> +       value = phy_read_mmd(phydev, devad, regnum);
>> +       if (value < 0)
>> +               return value;
>> +
>> +       value |= val;
>> +
>> +       ret = phy_write_mmd(phydev, devad, regnum, value);
>> +       if (ret < 0)
>> +               return ret;
>> +
>> +       return 0;
>> +}
>> +
>> +/**
>> + * phy_clear_bits_mmd - Convenience function for clearing bits in a register
>> + * on MMD
>> + * @phydev: the phy_device struct
>> + * @devad: the MMD containing register to modify
>> + * @regnum: register number to modify
>> + * @val: bits to clear
>> + * @return: 0 for success or negative errno for failure
>> + */
>> +int phy_clear_bits_mmd(struct phy_device *phydev, int devad, u32 regnum, u16 val)
>> +{
>> +       int value, ret;
>> +
>> +       value = phy_read_mmd(phydev, devad, regnum);
>> +       if (value < 0)
>> +               return value;
>> +
>> +       value &= ~val;
>> +
>> +       ret = phy_write_mmd(phydev, devad, regnum, value);
>> +       if (ret < 0)
>> +               return ret;
>> +
>> +       return 0;
>> +}
>> diff --git a/include/phy.h b/include/phy.h
>> index b329595710..ad2096ca84 100644
>> --- a/include/phy.h
>> +++ b/include/phy.h
>> @@ -177,186 +177,6 @@ struct fixed_link {
>>         int asym_pause;
>>  };
>>
>> -/**
>> - * phy_read - Convenience function for reading a given PHY register
>> - * @phydev: the phy_device struct
>> - * @devad: The MMD to read from
>> - * @regnum: register number to read
>> - * @return: value for success or negative errno for failure
>> - */
>> -static inline int phy_read(struct phy_device *phydev, int devad, int regnum)
>> -{
>> -       struct mii_dev *bus = phydev->bus;
>> -
>> -       if (!bus || !bus->read) {
>> -               debug("%s: No bus configured\n", __func__);
>> -               return -1;
>> -       }
>> -
>> -       return bus->read(bus, phydev->addr, devad, regnum);
>> -}
>> -
>> -/**
>> - * phy_write - Convenience function for writing a given PHY register
>> - * @phydev: the phy_device struct
>> - * @devad: The MMD to read from
>> - * @regnum: register number to write
>> - * @val: value to write to @regnum
>> - * @return: 0 for success or negative errno for failure
>> - */
>> -static inline int phy_write(struct phy_device *phydev, int devad, int regnum,
>> -                       u16 val)
>> -{
>> -       struct mii_dev *bus = phydev->bus;
>> -
>> -       if (!bus || !bus->write) {
>> -               debug("%s: No bus configured\n", __func__);
>> -               return -1;
>> -       }
>> -
>> -       return bus->write(bus, phydev->addr, devad, regnum, val);
>> -}
>> -
>> -/**
>> - * phy_mmd_start_indirect - Convenience function for writing MMD registers
>> - * @phydev: the phy_device struct
>> - * @devad: The MMD to read from
>> - * @regnum: register number to write
>> - * @return: None
>> - */
>> -static inline void phy_mmd_start_indirect(struct phy_device *phydev, int devad,
>> -                                         int regnum)
>> -{
>> -       /* Write the desired MMD Devad */
>> -       phy_write(phydev, MDIO_DEVAD_NONE, MII_MMD_CTRL, devad);
>> -
>> -       /* Write the desired MMD register address */
>> -       phy_write(phydev, MDIO_DEVAD_NONE, MII_MMD_DATA, regnum);
>> -
>> -       /* Select the Function : DATA with no post increment */
>> -       phy_write(phydev, MDIO_DEVAD_NONE, MII_MMD_CTRL,
>> -                 (devad | MII_MMD_CTRL_NOINCR));
>> -}
>> -
>> -/**
>> - * phy_read_mmd - Convenience function for reading a register
>> - * from an MMD on a given PHY.
>> - * @phydev: The phy_device struct
>> - * @devad: The MMD to read from
>> - * @regnum: The register on the MMD to read
>> - * @return: Value for success or negative errno for failure
>> - */
>> -static inline int phy_read_mmd(struct phy_device *phydev, int devad,
>> -                              int regnum)
>> -{
>> -       struct phy_driver *drv = phydev->drv;
>> -
>> -       if (regnum > (u16)~0 || devad > 32)
>> -               return -EINVAL;
>> -
>> -       /* driver-specific access */
>> -       if (drv->read_mmd)
>> -               return drv->read_mmd(phydev, devad, regnum);
>> -
>> -       /* direct C45 / C22 access */
>> -       if ((drv->features & PHY_10G_FEATURES) == PHY_10G_FEATURES ||
>> -           devad == MDIO_DEVAD_NONE || !devad)
>> -               return phy_read(phydev, devad, regnum);
>> -
>> -       /* indirect C22 access */
>> -       phy_mmd_start_indirect(phydev, devad, regnum);
>> -
>> -       /* Read the content of the MMD's selected register */
>> -       return phy_read(phydev, MDIO_DEVAD_NONE, MII_MMD_DATA);
>> -}
>> -
>> -/**
>> - * phy_write_mmd - Convenience function for writing a register
>> - * on an MMD on a given PHY.
>> - * @phydev: The phy_device struct
>> - * @devad: The MMD to read from
>> - * @regnum: The register on the MMD to read
>> - * @val: value to write to @regnum
>> - * @return: 0 for success or negative errno for failure
>> - */
>> -static inline int phy_write_mmd(struct phy_device *phydev, int devad,
>> -                               int regnum, u16 val)
>> -{
>> -       struct phy_driver *drv = phydev->drv;
>> -
>> -       if (regnum > (u16)~0 || devad > 32)
>> -               return -EINVAL;
>> -
>> -       /* driver-specific access */
>> -       if (drv->write_mmd)
>> -               return drv->write_mmd(phydev, devad, regnum, val);
>> -
>> -       /* direct C45 / C22 access */
>> -       if ((drv->features & PHY_10G_FEATURES) == PHY_10G_FEATURES ||
>> -           devad == MDIO_DEVAD_NONE || !devad)
>> -               return phy_write(phydev, devad, regnum, val);
>> -
>> -       /* indirect C22 access */
>> -       phy_mmd_start_indirect(phydev, devad, regnum);
>> -
>> -       /* Write the data into MMD's selected register */
>> -       return phy_write(phydev, MDIO_DEVAD_NONE, MII_MMD_DATA, val);
>> -}
>> -
>> -/**
>> - * phy_set_bits_mmd - Convenience function for setting bits in a register
>> - * on MMD
>> - * @phydev: the phy_device struct
>> - * @devad: the MMD containing register to modify
>> - * @regnum: register number to modify
>> - * @val: bits to set
>> - * @return: 0 for success or negative errno for failure
>> - */
>> -static inline int phy_set_bits_mmd(struct phy_device *phydev, int devad,
>> -                                  u32 regnum, u16 val)
>> -{
>> -       int value, ret;
>> -
>> -       value = phy_read_mmd(phydev, devad, regnum);
>> -       if (value < 0)
>> -               return value;
>> -
>> -       value |= val;
>> -
>> -       ret = phy_write_mmd(phydev, devad, regnum, value);
>> -       if (ret < 0)
>> -               return ret;
>> -
>> -       return 0;
>> -}
>> -
>> -/**
>> - * phy_clear_bits_mmd - Convenience function for clearing bits in a register
>> - * on MMD
>> - * @phydev: the phy_device struct
>> - * @devad: the MMD containing register to modify
>> - * @regnum: register number to modify
>> - * @val: bits to clear
>> - * @return: 0 for success or negative errno for failure
>> - */
>> -static inline int phy_clear_bits_mmd(struct phy_device *phydev, int devad,
>> -                                    u32 regnum, u16 val)
>> -{
>> -       int value, ret;
>> -
>> -       value = phy_read_mmd(phydev, devad, regnum);
>> -       if (value < 0)
>> -               return value;
>> -
>> -       value &= ~val;
>> -
>> -       ret = phy_write_mmd(phydev, devad, regnum, value);
>> -       if (ret < 0)
>> -               return ret;
>> -
>> -       return 0;
>> -}
>> -
>>  #ifdef CONFIG_PHYLIB_10G
>>  extern struct phy_driver gen10g_driver;
>>  #endif
>> @@ -508,6 +328,15 @@ static inline ofnode phy_get_ofnode(struct phy_device *phydev)
>>         return ofnode_null();
>>  }
>>  #endif
>> +
>> +int phy_read(struct phy_device *phydev, int devad, int regnum);
>> +int phy_write(struct phy_device *phydev, int devad, int regnum, u16 val);
>> +void phy_mmd_start_indirect(struct phy_device *phydev, int devad, int regnum);
>> +int phy_read_mmd(struct phy_device *phydev, int devad, int regnum);
>> +int phy_write_mmd(struct phy_device *phydev, int devad, int regnum, u16 val);
>> +int phy_set_bits_mmd(struct phy_device *phydev, int devad, u32 regnum, u16 val);
>> +int phy_clear_bits_mmd(struct phy_device *phydev, int devad, u32 regnum, u16 val);
>> +
>>  int phy_startup(struct phy_device *phydev);
>>  int phy_config(struct phy_device *phydev);
>>  int phy_shutdown(struct phy_device *phydev);
>> --
>> 2.30.2
>>


More information about the U-Boot mailing list