[U-Boot] [PATCH] net: mvgbe: extract common code for SMI wait

Joe Hershberger joe.hershberger at ni.com
Fri Jun 8 21:06:40 UTC 2018


On Wed, May 30, 2018 at 5:49 AM, Chris Packham <judge.packham at gmail.com> wrote:
> Combine repeated code from smi_reg_read/smi_reg_write into a common
> function smi_wait_ready.
>
> Signed-off-by: Chris Packham <judge.packham at gmail.com>
> ---
>
>  drivers/net/mvgbe.c | 48 ++++++++++++++++++++++-----------------------
>  1 file changed, 24 insertions(+), 24 deletions(-)
>
> diff --git a/drivers/net/mvgbe.c b/drivers/net/mvgbe.c
> index 4e1aff6e3a86..ca91897fdd14 100644
> --- a/drivers/net/mvgbe.c
> +++ b/drivers/net/mvgbe.c
> @@ -40,10 +40,26 @@ DECLARE_GLOBAL_DATA_PTR;
>  #define MVGBE_SMI_REG (((struct mvgbe_registers *)MVGBE0_BASE)->smi)
>
>  #if defined(CONFIG_PHYLIB) || defined(CONFIG_MII) || defined(CONFIG_CMD_MII)
> +static int smi_wait_ready(struct mvgbe_device *dmvgbe)
> +{
> +       u32 timeout = MVGBE_PHY_SMI_TIMEOUT;
> +       u32 smi_reg;
> +
> +       do {
> +               smi_reg = MVGBE_REG_RD(MVGBE_SMI_REG);
> +               if (timeout-- == 0) {
> +                       printf("Error: SMI busy timeout\n");
> +                       return -EFAULT;
> +               }
> +       } while (smi_reg & MVGBE_PHY_SMI_BUSY_MASK);

Please use wait_for_bit_le32(MVGBE_SMI_REG, MVGBE_PHY_SMI_BUSY_MASK,
true, MVGBE_PHY_SMI_TIMEOUT_MS, false);

Convert the timeout to ms.

It's in include/wait_bit.h

> +
> +       return 0;
> +}
> +
>  /*
>   * smi_reg_read - miiphy_read callback function.
>   *
> - * Returns 16bit phy register value, or 0xffff on error
> + * Returns 16bit phy register value, or -EFAULT on error
>   */
>  static int smi_reg_read(struct mii_dev *bus, int phy_adr, int devad,
>                         int reg_ofs)
> @@ -74,16 +90,9 @@ static int smi_reg_read(struct mii_dev *bus, int phy_adr, int devad,
>                 return -EFAULT;
>         }
>
> -       timeout = MVGBE_PHY_SMI_TIMEOUT;
>         /* wait till the SMI is not busy */
> -       do {
> -               /* read smi register */
> -               smi_reg = MVGBE_REG_RD(MVGBE_SMI_REG);
> -               if (timeout-- == 0) {
> -                       printf("Err..(%s) SMI busy timeout\n", __func__);
> -                       return -EFAULT;
> -               }
> -       } while (smi_reg & MVGBE_PHY_SMI_BUSY_MASK);
> +       if (smi_wait_ready(dmvgbe) < 0)
> +               return -EFAULT;
>
>         /* fill the phy address and regiser offset and read opcode */
>         smi_reg = (phy_adr << MVGBE_PHY_SMI_DEV_ADDR_OFFS)
> @@ -119,10 +128,9 @@ static int smi_reg_read(struct mii_dev *bus, int phy_adr, int devad,
>  }
>
>  /*
> - * smi_reg_write - imiiphy_write callback function.
> + * smi_reg_write - miiphy_write callback function.
>   *
> - * Returns 0 if write succeed, -EINVAL on bad parameters
> - * -ETIME on timeout
> + * Returns 0 if write succeed, -EFAULT on error
>   */
>  static int smi_reg_write(struct mii_dev *bus, int phy_adr, int devad,
>                          int reg_ofs, u16 data)
> @@ -131,7 +139,6 @@ static int smi_reg_write(struct mii_dev *bus, int phy_adr, int devad,
>         struct mvgbe_device *dmvgbe = to_mvgbe(dev);
>         struct mvgbe_registers *regs = dmvgbe->regs;
>         u32 smi_reg;
> -       u32 timeout;
>
>         /* Phyadr write request*/
>         if (phy_adr == MV_PHY_ADR_REQUEST &&
> @@ -147,19 +154,12 @@ static int smi_reg_write(struct mii_dev *bus, int phy_adr, int devad,
>         }
>         if (reg_ofs > PHYREG_MASK) {
>                 printf("Err..(%s) Invalid register offset\n", __func__);
> -               return -EINVAL;
> +               return -EFAULT;
>         }
>
>         /* wait till the SMI is not busy */
> -       timeout = MVGBE_PHY_SMI_TIMEOUT;
> -       do {
> -               /* read smi register */
> -               smi_reg = MVGBE_REG_RD(MVGBE_SMI_REG);
> -               if (timeout-- == 0) {
> -                       printf("Err..(%s) SMI busy timeout\n", __func__);
> -                       return -ETIME;
> -               }
> -       } while (smi_reg & MVGBE_PHY_SMI_BUSY_MASK);
> +       if (smi_wait_ready(dmvgbe) < 0)
> +               return -EFAULT;
>
>         /* fill the phy addr and reg offset and write opcode and data */
>         smi_reg = (data << MVGBE_PHY_SMI_DATA_OFFS);
> --
> 2.17.0
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> https://lists.denx.de/listinfo/u-boot


More information about the U-Boot mailing list