[U-Boot] [PATCH 1/2] net: fix some bugs in LL TEMAC driver

Michal Simek monstr at monstr.eu
Sat Nov 20 10:27:45 CET 2010


2010/11/19 Stephan Linz <linz at li-pro.net>

>  * avoid using link variable uninitialized
>  * avoid using phy_addr variable with invalid value
>  * reorganize phy control: first looking for phy than link
>  * return with error (result value -1) if no phy/link was found
>  * fix boolean mistake in wait for link: wait as long as we got
>    phy register 1 has no link indication (BMSR != 0x24)
>  * expand the 'first run' flag handling in ll_temac_init() in
>    respect to possible error detection in xps_ll_temac_phy_ctrl()
>


I will test your changes on real hw.

Some comments below.

Thanks,
Michal



>
> Signed-off-by: Stephan Linz <linz at li-pro.net>
> ---
>  drivers/net/xilinx_ll_temac.c |   44
> ++++++++++++++++++++++++++++++----------
>  1 files changed, 33 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/net/xilinx_ll_temac.c b/drivers/net/xilinx_ll_temac.c
> index 72a1632..a72e072 100644
> --- a/drivers/net/xilinx_ll_temac.c
> +++ b/drivers/net/xilinx_ll_temac.c
> @@ -225,24 +225,21 @@ static void read_phy_reg (struct eth_device *dev, int
> phy_addr)
>  #endif
>
>  static int phy_addr = -1;
> -static int link;
> +static int link = 0;
>
>  /* setting ll_temac and phy to proper setting */
>  static int xps_ll_temac_phy_ctrl(struct eth_device *dev)
>  {
> -       int i;
> +       int i, retries;
>        unsigned int result;
> -       unsigned retries = 10;
>
> +        /* link is setup */
>        if (link == 1)
> -               return 1; /* link is setup */
> -
> -       /* wait for link up */
> -       while (retries-- &&
> -               ((xps_ll_temac_hostif_get(dev, 0, phy_addr, 1) & 0x24) ==
> 0x24))
> -               ;
> +               return 1;
>
> +       /* try out if have ever found the right phy? */
>        if (phy_addr == -1) {
> +               printf("Looking for phy ... ");
>

use puts instead.



>                for (i = 31; i >= 0; i--) {
>                        result = xps_ll_temac_hostif_get(dev, 0, i, 1);
>                        if ((result & 0x0ffff) != 0x0ffff) {
> @@ -251,7 +248,27 @@ static int xps_ll_temac_phy_ctrl(struct eth_device
> *dev)
>                                break;
>                        }
>                }
> +
> +               /* no success? -- wery bad */
> +               if (phy_addr == -1) {
> +                       printf("ERROR\n");
>

same here


> +                       return -1;
> +               }
> +               printf("OK\n");
> +       }
> +
> +       /* wait for link up */
> +       printf("Waiting for link ... ");
>

and here.


> +       retries = 10;
> +       while (retries-- &&
> +               ((xps_ll_temac_hostif_get(dev, 0, phy_addr, 1) & 0x24) !=
> 0x24))
> +               ;
> +
> +       if (retries < 0) {
> +               printf("ERROR\n");
>

and here


> +               return 0;
>        }
> +       printf("OK\n");
>

and here.


>
>        /* get PHY id */
>        i = (xps_ll_temac_hostif_get(dev, 0, phy_addr, 2) << 16) | \
> @@ -491,7 +508,6 @@ static int ll_temac_init(struct eth_device *dev, bd_t
> *bis)
>  #endif
>        if (!first)
>                return 0;
> -       first = 0;
>
>        xps_ll_temac_init(dev, bis);
>
> @@ -502,7 +518,13 @@ static int ll_temac_init(struct eth_device *dev, bd_t
> *bis)
>        for (i = 0; i < 32; i++)
>                read_phy_reg(dev, i);
>  #endif
> -       xps_ll_temac_phy_ctrl(dev);
> +
> +       if (xps_ll_temac_phy_ctrl(dev) == 0) {
> +               xps_ll_temac_halt(dev);
> +               return -1;
> +       }
> +
> +       first = 0;
>        return 1;
>  }
>
> --
> 1.6.0.4
>
>


More information about the U-Boot mailing list