diff mbox

[U-Boot,v3] arm, davinci_emac: fix driver bug if more then 3 PHYs are detected

Message ID 1320857454-15207-1-git-send-email-hs@denx.de
State Superseded
Headers show

Commit Message

Heiko Schocher Nov. 9, 2011, 4:50 p.m. UTC
since commits:
davinci: emac: add support for more than 1 PHYs
062fe7d332c28ede25626f448681e43d76bb312e

davinci: remove obsolete macro CONFIG_EMAC_MDIO_PHY_NUM
fb1d6332b5430b90a8fa8ebab709f33a60e9f816

I get following warning on the enbw_cmc board:

Err:   serial
Net:    5 ETH PHY detected
miiphy_register: non unique device name 'KSZ8873 @ 0x01'
DaVinci-EMAC
Hit any key to stop autoboot:  0

Also I see some debug printfs:

=> run load
+ emac_close
+ emac_ch_teardown
- emac_ch_teardown
+ emac_ch_teardown
- emac_ch_teardown
- emac_close
+ emac_open
- emac_open
Using DaVinci-EMAC device

reason is 062fe7d332c28ede25626f448681e43d76bb312e new define MAX_PHY.
This is set to 3! I get on this board 5 active phys, so
this leads in wrong memory writes ...

so I changed:

- MAX_PHY from 3 to 7
- print an error message if more then MAX_PHYs are
  detected.
- fill the active_phy_addr array in a for loop with
  0xff
- changed printf() in debug_emac()

Signed-off-by: Heiko Schocher <hs@denx.de>
Cc: Sandeep Paulraj <s-paulraj@ti.com>
Cc: Albert ARIBAUD <albert.u.boot@aribaud.net>
Cc: Wolfgang Denk <wd@denx.de>
Cc: Manjunath Hadli <manjunath.hadli@ti.com>
Cc: Prabhakar Lad <prabhakar.csengg@gmail.com>
Cc: Mike Frysinger <vapier@gentoo.org>

---
- changes for v2:
  - add comments from Wolfgang Denk
    - Codingstyle cleanup
      if the "else" branch uses braces, the "if" branch shall
      use braces, too.
    - s/too much/too many/  in the added printf()
  - add comment from Prabhakar Lad:
    - add count = 0 in error case, so that no phys are
      initialized later.
- changes for v3:
  - add comment from Mike Frysinger
    change subject line to a hopefully more descriptive summary

 drivers/net/davinci_emac.c |   18 ++++++++++++------
 1 files changed, 12 insertions(+), 6 deletions(-)

Comments

Tom Rini Nov. 9, 2011, 5:05 p.m. UTC | #1
On Wed, Nov 9, 2011 at 9:50 AM, Heiko Schocher <hs@denx.de> wrote:
> since commits:
> davinci: emac: add support for more than 1 PHYs
> 062fe7d332c28ede25626f448681e43d76bb312e
>
> davinci: remove obsolete macro CONFIG_EMAC_MDIO_PHY_NUM
> fb1d6332b5430b90a8fa8ebab709f33a60e9f816
[snip]
> - MAX_PHY from 3 to 7

Why don't we add a CONFIG here and default to 3, ie
#ifndef CONFIG_SYS_something
#define CONFIG_SYS_something 3
#endif

Thanks!
Heiko Schocher Nov. 10, 2011, 4:43 a.m. UTC | #2
Hello Tom,

Tom Rini wrote:
> On Wed, Nov 9, 2011 at 9:50 AM, Heiko Schocher <hs@denx.de> wrote:
>> since commits:
>> davinci: emac: add support for more than 1 PHYs
>> 062fe7d332c28ede25626f448681e43d76bb312e
>>
>> davinci: remove obsolete macro CONFIG_EMAC_MDIO_PHY_NUM
>> fb1d6332b5430b90a8fa8ebab709f33a60e9f816
> [snip]
>> - MAX_PHY from 3 to 7
> 
> Why don't we add a CONFIG here and default to 3, ie
> #ifndef CONFIG_SYS_something
> #define CONFIG_SYS_something 3
> #endif

Do we really need a config option for this? Why 3 or 7 as I did?
Shouldn't we set this define to 32, as this is the max possible
PHYs? Ok, we loose some RAM with this option ...

Would CONFIG_SYS_DAVINCI_EMAC_PHY_COUNT a good name?

bye,
Heiko
Tom Rini Nov. 10, 2011, 5:04 a.m. UTC | #3
On Wed, Nov 9, 2011 at 9:43 PM, Heiko Schocher <hs@denx.de> wrote:
> Hello Tom,
>
> Tom Rini wrote:
>> On Wed, Nov 9, 2011 at 9:50 AM, Heiko Schocher <hs@denx.de> wrote:
>>> since commits:
>>> davinci: emac: add support for more than 1 PHYs
>>> 062fe7d332c28ede25626f448681e43d76bb312e
>>>
>>> davinci: remove obsolete macro CONFIG_EMAC_MDIO_PHY_NUM
>>> fb1d6332b5430b90a8fa8ebab709f33a60e9f816
>> [snip]
>>> - MAX_PHY from 3 to 7
>>
>> Why don't we add a CONFIG here and default to 3, ie
>> #ifndef CONFIG_SYS_something
>> #define CONFIG_SYS_something 3
>> #endif
>
> Do we really need a config option for this? Why 3 or 7 as I did?
> Shouldn't we set this define to 32, as this is the max possible
> PHYs? Ok, we loose some RAM with this option ...
>
> Would CONFIG_SYS_DAVINCI_EMAC_PHY_COUNT a good name?

Yes, sounds like a good name to me, thanks.
diff mbox

Patch

diff --git a/drivers/net/davinci_emac.c b/drivers/net/davinci_emac.c
index fa31159..1648e24 100644
--- a/drivers/net/davinci_emac.c
+++ b/drivers/net/davinci_emac.c
@@ -85,7 +85,7 @@  static int			emac_rx_queue_active = 0;
 /* Receive packet buffers */
 static unsigned char		emac_rx_buffers[EMAC_MAX_RX_BUFFERS * (EMAC_MAX_ETHERNET_PKT_SIZE + EMAC_PKT_ALIGN)];
 
-#define MAX_PHY		3
+#define MAX_PHY		7
 
 /* PHY address for a discovered PHY (0xff - not found) */
 static u_int8_t	active_phy_addr[MAX_PHY] = { 0xff, 0xff, 0xff };
@@ -160,9 +160,8 @@  static int davinci_eth_phy_detect(void)
 	int		j;
 	unsigned int	count = 0;
 
-	active_phy_addr[0] = 0xff;
-	active_phy_addr[1] = 0xff;
-	active_phy_addr[2] = 0xff;
+	for (i = 0; i < MAX_PHY; i++)
+		active_phy_addr[i] = 0xff;
 
 	udelay(1000);
 	phy_act_state = readl(&adap_mdio->ALIVE);
@@ -175,7 +174,14 @@  static int davinci_eth_phy_detect(void)
 	for (i = 0, j = 0; i < 32; i++)
 		if (phy_act_state & (1 << i)) {
 			count++;
-			active_phy_addr[j++] = i;
+			if (count < MAX_PHY) {
+				active_phy_addr[j++] = i;
+			} else {
+				printf("%s: to many PHYs detected.\n",
+					__func__);
+				count = 0;
+				break;
+			}
 		}
 
 	num_phy = count;
@@ -752,7 +758,7 @@  int davinci_emac_initialize(void)
 	if (!ret)
 		return(0);
 	else
-		printf(" %d ETH PHY detected\n", ret);
+		debug_emac(" %d ETH PHY detected\n", ret);
 
 	/* Get PHY ID and initialize phy_ops for a detected PHY */
 	for (i = 0; i < num_phy; i++) {