[U-Boot] DM9161BMSR must be read twice ?
Nícolas Carneiro Lebedenco
nicolas.lebedenco at tasksistemas.com.br
Tue Sep 2 21:37:24 CEST 2008
Hi,
I'm developing a custom board based on the AT91RM9200dk. In u-boot prompt,
every time a enter a network command such as tftp or ping I get a message
like this:
"MAC: error during MII initialization"
Although the command actually seems to work I was a little concerned.
After taking a look at cpu/arm920t/at91rm9200/ether.c and
cpu/arm920t/at91rm9200/dm9161.c I realized the problem was at
the function UCHAR dm9161_GetLinkSpeed (AT91PS_EMAC p_mac) in dm9161.c.
Apparently, the link status bit at BMSR register is indicating link down even
when it's not.
I googled for it and found at http://www.davicom.com.tw/page1.aspx?no=149749 a
FAQ for dm9000A-8 related to a similar register as follows:
"(...)
Q1: There are two methods for checking Link status as below:
1) NSR: 01H bit 6
2) PHY BMSR: 01 bit 2
Could you explain what difference is between 1) and 2)?
A1: 1) NSR: 01H bit: PHY link status now
2) PHY BMSR: 01 bit 2: the register will read two times. You can see
below table for the meaning
Read first times Read second time meaning
0 0 Link fail
0 1 Link fail before and link ok now
1 0 No any meaning
1 1 Link ok
(...)"
So I tried reading the BMSR register twice and it got the job done. Did
anybody notice this issue ?
--- a/cpu/arm920t/at91rm9200/dm9161.c 2008-08-12 11:08:38.000000000 -0300
+++ b/cpu/arm920t/at91rm9200/dm9161.c 2008-09-02 16:26:05.000000000 -0300
@@ -70,13 +70,16 @@
*/
UCHAR dm9161_GetLinkSpeed (AT91PS_EMAC p_mac)
{
- unsigned short stat1, stat2;
-
- if (!at91rm9200_EmacReadPhy (p_mac, DM9161_BMSR, &stat1))
- return FALSE;
+ unsigned short stat1, stat2, i;
+
+ for (i = 2; i; --i)
+ if (!at91rm9200_EmacReadPhy (p_mac, DM9161_BMSR, &stat1))
+ return FALSE;
- if (!(stat1 & DM9161_LINK_STATUS)) /* link status up? */
+ if (!(stat1 & DM9161_LINK_STATUS)) { /* link status up? */
+ printf("Link down\n");
return FALSE;
+ }
if (!at91rm9200_EmacReadPhy (p_mac, DM9161_DSCSR, &stat2))
return FALSE;
--
Regards
Nícolas
More information about the U-Boot
mailing list