Browse Source

generic: make chip detection more reliable in the AR8216 driver

Fixes broken ethernet on the Planex MZK-W04NU/W300NH boards.

Cc: [email protected]

SVN-Revision: 20753
Gabor Juhos 15 years ago
parent
commit
72d4353728
1 changed files with 22 additions and 2 deletions
  1. 22 2
      target/linux/generic-2.6/files/drivers/net/phy/ar8216.c

+ 22 - 2
target/linux/generic-2.6/files/drivers/net/phy/ar8216.c

@@ -33,6 +33,7 @@
 
 /* size of the vlan table */
 #define AR8X16_MAX_VLANS	128
+#define AR8X16_PROBE_RETRIES	10
 
 struct ar8216_priv {
 	struct switch_dev dev;
@@ -119,8 +120,25 @@ ar8216_id_chip(struct ar8216_priv *priv)
 {
 	u32 val;
 	u16 id;
+	int i;
+
 	val = ar8216_mii_read(priv, AR8216_REG_CTRL);
+	if (val == ~0)
+		return UNKNOWN;
+
 	id = val & (AR8216_CTRL_REVISION | AR8216_CTRL_VERSION);
+	for (i = 0; i < AR8X16_PROBE_RETRIES; i++) {
+		u16 t;
+
+		val = ar8216_mii_read(priv, AR8216_REG_CTRL);
+		if (val == ~0)
+			return UNKNOWN;
+
+		t = val & (AR8216_CTRL_REVISION | AR8216_CTRL_VERSION);
+		if (t != id)
+			return UNKNOWN;
+	}
+
 	switch (id) {
 	case 0x0101:
 		return AR8216;
@@ -736,11 +754,13 @@ static int
 ar8216_probe(struct phy_device *pdev)
 {
 	struct ar8216_priv priv;
+	u16 chip;
 
 	priv.phy = pdev;
-	if (ar8216_id_chip(&priv) == UNKNOWN) {
+	chip = ar8216_id_chip(&priv);
+	if (chip == UNKNOWN)
 		return -ENODEV;
-	}
+
 	return 0;
 }