Changeset 18162


Ignore:
Timestamp:
01/12/12 16:57:15 (16 months ago)
Author:
BrainSlayer
Message:

fix phy detection for some devices

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/linux/pb42/linux-3.2/drivers/net/phy/ar8216.c

    r18148 r18162  
    3434/* size of the vlan table */ 
    3535#define AR8X16_MAX_VLANS        128 
    36 #define AR8X16_PROBE_RETRIES    10 
     36#define AR8X16_PROBE_RETRIES    20 
    3737 
    3838struct ar8216_priv { 
     
    120120} 
    121121 
    122 static inline int 
    123 ar8216_id_chip(struct ar8216_priv *priv) 
    124 { 
    125         u32 val; 
    126         u16 id; 
    127         int i; 
    128  
    129         val = ar8216_mii_read(priv, AR8216_REG_CTRL); 
    130         if (val == ~0) 
    131                 return UNKNOWN; 
    132  
    133         id = val & (AR8216_CTRL_REVISION | AR8216_CTRL_VERSION); 
    134         for (i = 0; i < AR8X16_PROBE_RETRIES; i++) { 
    135                 u16 t; 
    136  
    137                 val = ar8216_mii_read(priv, AR8216_REG_CTRL); 
    138                 if (val == ~0) 
    139                         return UNKNOWN; 
    140  
    141                 t = val & (AR8216_CTRL_REVISION | AR8216_CTRL_VERSION); 
    142                 if (t != id) 
    143                         return UNKNOWN; 
    144         } 
    145  
     122static inline int id_to_type(int id) 
     123{ 
    146124        switch (id) { 
    147125        case 0x0101: 
     
    153131                return AR8316; 
    154132        default: 
     133                return UNKNOWN; 
     134        } 
     135 
     136} 
     137 
     138static inline int 
     139ar8216_id_chip(struct ar8216_priv *priv) 
     140{ 
     141        u32 val; 
     142        u16 id; 
     143        int i,type; 
     144 
     145        val = ar8216_mii_read(priv, AR8216_REG_CTRL); 
     146        id = val & (AR8216_CTRL_REVISION | AR8216_CTRL_VERSION); 
     147        type = id_to_type(id); 
     148 
     149        if (type==UNKNOWN) { 
     150                for (i = 0; i < AR8X16_PROBE_RETRIES; i++) { 
     151                        u16 t; 
     152                        val = ar8216_mii_read(priv, AR8216_REG_CTRL); 
     153                        if (val == ~0) 
     154                                continue; 
     155 
     156                        t = val & (AR8216_CTRL_REVISION | AR8216_CTRL_VERSION); 
     157 
     158                        if (id_to_type(t)!=UNKNOWN) { 
     159                                id = t; 
     160                                type = id_to_type(id); 
     161                                break; 
     162                        } 
     163                } 
     164        } 
     165 
     166        if (type==UNKNOWN) 
    155167                printk(KERN_DEBUG 
    156168                        "ar8216: Unknown Atheros device [ver=%d, rev=%d, phy_id=%04x%04x]\n", 
     
    159171                        mdiobus_read(priv->phy->bus, priv->phy->addr, 2), 
    160172                        mdiobus_read(priv->phy->bus, priv->phy->addr, 3)); 
    161  
    162                 return UNKNOWN; 
    163         } 
     173        else 
     174                printk(KERN_DEBUG 
     175                        "ar8216: Atheros device found [ver=%d, rev=%d, phy_id=%04x%04x]\n", 
     176                        (int)(id >> AR8216_CTRL_VERSION_S), 
     177                        (int)(id & AR8216_CTRL_REVISION), 
     178                        mdiobus_read(priv->phy->bus, priv->phy->addr, 2), 
     179                        mdiobus_read(priv->phy->bus, priv->phy->addr, 3)); 
     180         
     181         
     182        return type; 
     183 
    164184} 
    165185 
     
    967987        struct ar8216_priv priv; 
    968988        u16 chip; 
    969  
    970989        priv.phy = pdev; 
     990 
    971991        chip = ar8216_id_chip(&priv); 
    972992        if (chip == UNKNOWN) 
Note: See TracChangeset for help on using the changeset viewer.