diff options
Diffstat (limited to 'target/linux/generic-2.6')
| -rw-r--r-- | target/linux/generic-2.6/files/drivers/net/phy/ar8216.c | 24 | 
1 files changed, 22 insertions, 2 deletions
| diff --git a/target/linux/generic-2.6/files/drivers/net/phy/ar8216.c b/target/linux/generic-2.6/files/drivers/net/phy/ar8216.c index 394e50d47..a473e3b18 100644 --- a/target/linux/generic-2.6/files/drivers/net/phy/ar8216.c +++ b/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;  } | 
