summaryrefslogtreecommitdiff
path: root/drivers/net
diff options
context:
space:
mode:
authorPriyanka Jain <priyanka.jain@nxp.com>2018-01-30 11:38:38 +0530
committerJoe Hershberger <joe.hershberger@ni.com>2018-03-22 15:05:31 -0500
commitaf5484acb0e8e4b6d0d977f84d8dde7b537c441d (patch)
tree7eb98f5528f6d8fdab26db011cb78461456ec90a /drivers/net
parenta802d1e2684a30d01bde657ebf55c2b5eca1d712 (diff)
net/phy/cortina.c: Update get_phy_id implementation
Update get_phy_id() implementation in cortina.c to check for Cortina_phy by comparing device phy_id with cortina phy_id instead of relying on presence of CORTINA macros. This will allow get_phy_id to work with non-cortina phy devices which might have same phy address as Cortina device but on different bus. Signed-off-by: Priyanka Jain <priyanka.jain@nxp.com> Acked-by: Joe Hershberger <joe.hershberger@ni.com>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/phy/cortina.c46
1 files changed, 17 insertions, 29 deletions
diff --git a/drivers/net/phy/cortina.c b/drivers/net/phy/cortina.c
index 637d89a1e1b..3ac833d71a9 100644
--- a/drivers/net/phy/cortina.c
+++ b/drivers/net/phy/cortina.c
@@ -295,45 +295,33 @@ int phy_cortina_init(void)
int get_phy_id(struct mii_dev *bus, int addr, int devad, u32 *phy_id)
{
int phy_reg;
- bool is_cortina_phy = false;
-
- switch (addr) {
-#ifdef CORTINA_PHY_ADDR1
- case CORTINA_PHY_ADDR1:
-#endif
-#ifdef CORTINA_PHY_ADDR2
- case CORTINA_PHY_ADDR2:
-#endif
-#ifdef CORTINA_PHY_ADDR3
- case CORTINA_PHY_ADDR3:
-#endif
-#ifdef CORTINA_PHY_ADDR4
- case CORTINA_PHY_ADDR4:
-#endif
- is_cortina_phy = true;
- break;
- default:
- break;
- }
/* Cortina PHY has non-standard offset of PHY ID registers */
- if (is_cortina_phy)
- phy_reg = bus->read(bus, addr, 0, VILLA_GLOBAL_CHIP_ID_LSB);
- else
- phy_reg = bus->read(bus, addr, devad, MII_PHYSID1);
+ phy_reg = bus->read(bus, addr, 0, VILLA_GLOBAL_CHIP_ID_LSB);
+ if (phy_reg < 0)
+ return -EIO;
+ *phy_id = (phy_reg & 0xffff) << 16;
+ phy_reg = bus->read(bus, addr, 0, VILLA_GLOBAL_CHIP_ID_MSB);
if (phy_reg < 0)
return -EIO;
+ *phy_id |= (phy_reg & 0xffff);
- *phy_id = (phy_reg & 0xffff) << 16;
- if (is_cortina_phy)
- phy_reg = bus->read(bus, addr, 0, VILLA_GLOBAL_CHIP_ID_MSB);
- else
- phy_reg = bus->read(bus, addr, devad, MII_PHYSID2);
+ if (*phy_id == PHY_UID_CS4340)
+ return 0;
+ /*
+ * If Cortina PHY not detected,
+ * try generic way to find PHY ID registers
+ */
+ phy_reg = bus->read(bus, addr, devad, MII_PHYSID1);
if (phy_reg < 0)
return -EIO;
+ *phy_id = (phy_reg & 0xffff) << 16;
+ phy_reg = bus->read(bus, addr, devad, MII_PHYSID2);
+ if (phy_reg < 0)
+ return -EIO;
*phy_id |= (phy_reg & 0xffff);
return 0;