Dear John,

in message <4b73d43f0906061527p7ca1b301ybcfc576870a16...@mail.gmail.com> you 
wrote:
>
> I noticed the latest BSP from Freescale has this patch:
> 
> From: Chen Hongjun <hong-jun.c...@freecale.com>
> Date: Thu, 16 Apr 2009 20:22:52 +0800
> Subject: [PATCH] Fixed FEC bug for bluestone board.
> 
> Signed-off-by: Chen Hongjun <hong-jun.c...@freecale.com>
> ---
>  drivers/net/fs_enet/mii-fec.c |    2 +-
>  1 files changed, 1 insertions(+), 1 deletions(-)
> 
> diff --git a/drivers/net/fs_enet/mii-fec.c b/drivers/net/fs_enet/mii-fec.c
> index 13a7d66..53d01a8 100644
> --- a/drivers/net/fs_enet/mii-fec.c
> +++ b/drivers/net/fs_enet/mii-fec.c
> @@ -208,7 +208,7 @@ static int __devinit fs_enet_mdio_probe(struct of_device
> *ofdev,
>         if (!fec->fecp)
>                 goto out_fec;
> 
> -       fec->mii_speed = ((ppc_proc_freq + 4999999) / 5000000) << 1;
> +       fec->mii_speed = ((((ppc_proc_freq + 4999999) / 2500000) / 2) & 0x3F) 
> << 1;

Heh. So we now have 3 versions:

mainline:

        fec->mii_speed = ((ppc_proc_freq + 4999999) / 5000000) << 1;

Freescale:

        fec->mii_speed = ((((ppc_proc_freq + 4999999) / 2500000) / 2) & 0x3F) 
<< 1;

we:
        fec->mii_speed = (((ppc_proc_freq / 1000000) / 30) + 1) << 1;


So what does this give:

ppc_proc_freq                   mii_speed
            mainline            freescale           we
--------------------------------------------------
 50 MHz     0x14 -> 2.5 MHz     0x14 -> 2.5 MHz     0x04 -> 12.50 MHz
100 MHz     0x28 -> 2.5 MHz     0x28 -> 2.5 MHz     0x08 -> 12.50 MHz
150 MHz     0x3C -> 2.5 MHz     0x3C -> 2.5 MHz     0x0C -> 12.50 MHz
200 MHz     0x50 -> 2.5 MHz     0x50 -> 2.5 MHz     0x0E -> 14.29 MHz
250 MHz     0x64 -> 2.5 MHz     0x64 -> 2.5 MHz     0x12 -> 13.89 MHz
300 MHz     0x78 -> 2.5 MHz     0x78 -> 2.5 MHz     0x16 -> 13.36 MHz
316.8 MHz   0x80 -> 2.475 MHz   0x00 -> MDC off     0x16 -> 14.40 MHz
350 MHz     0x8C -> 2.5 MHz     0x0C -> 29.17 MHz   0x18 -> 14.58 MHz
400 MHz     0xA0 -> 2.5 MHz     0x20 -> 12.50 MHz   0x1C -> 14.29 MHz
450 MHz     0xB3 -> 2.5 MHz     0x34 -> 8.654 MHz   0x20 -> 14.06 MHz
500 MHz     0xC8 -> 2.5 MHz     0x48 -> 6.944 MHz   0x22 -> 14.71 MHz

So - the mainline version and what we have don't take into account
that MII_SPEED uses only bit 25...30, i.e. it must fit into the range
from (1 << 1) ... (3F << 1).

The Freescale code tries to address this, but just clipping the data
is incorrect as we can see above.

The funny thing is that the RefMan says:

        "...MDC frequency of 1/(mii_speed*2) of the system clock
        frequency"

        "To be compliant with the IEEE MII specification, the MII_SPEED
        field must be programmed with a value that provides an MDC
        frequency of less than or equal to 2.5 MHz."

The big question seems to be what the RefMan means when talking about
the "system clock frequency". Obiously it is NOT  the  CPU  clock  as
code variants above assume. The examples in "Table 17-24. Programming
Examples  for  MII_SPEED Register" list "system clock frequencies" of
25, 33, 40 and 50  MHz  -  which  also  indiocates  that  some  other
frequency might be referenced here.

But which one is it?

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: w...@denx.de
"Today's robots are very primitive, capable of understanding  only  a
few  simple  instructions  such  as 'go left', 'go right', and 'build
car'."                                                  - John Sladek
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to