[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <8480c38d6f3bc5c4f6c332a788bc82999266aab7.1551437561.git.joabreu@synopsys.com>
Date: Fri, 1 Mar 2019 11:54:24 +0100
From: Jose Abreu <jose.abreu@...opsys.com>
To: netdev@...r.kernel.org, linux-kernel@...r.kernel.org
Cc: Jose Abreu <jose.abreu@...opsys.com>, Andrew Lunn <andrew@...n.ch>,
Florian Fainelli <f.fainelli@...il.com>,
"David S. Miller" <davem@...emloft.net>,
Joao Pinto <joao.pinto@...opsys.com>
Subject: [PATCH net 2/2] net: phy: Use C45 Helpers in PHY_FORCING state
When using a C45 PHY that is in PHY_FORCING state we are currently not
taking into account that this kind of PHY has different update_link
functions.
Use the C45 Helpers instead or the driver built-in read_status() helper,
if possible.
Signed-off-by: Jose Abreu <joabreu@...opsys.com>
Cc: Andrew Lunn <andrew@...n.ch>
Cc: Florian Fainelli <f.fainelli@...il.com>
Cc: "David S. Miller" <davem@...emloft.net>
Cc: Joao Pinto <joao.pinto@...opsys.com>
---
drivers/net/phy/phy.c | 2 +-
include/linux/phy.h | 13 +++++++++++++
2 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
index c5675df5fc6f..1ef5dbc384d0 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
@@ -940,7 +940,7 @@ void phy_state_machine(struct work_struct *work)
err = phy_check_link_status(phydev);
break;
case PHY_FORCING:
- err = genphy_update_link(phydev);
+ err = phy_update_link(phydev);
if (err)
break;
diff --git a/include/linux/phy.h b/include/linux/phy.h
index 872899136fdc..67caa7eb93b1 100644
--- a/include/linux/phy.h
+++ b/include/linux/phy.h
@@ -1036,6 +1036,19 @@ static inline int phy_read_status(struct phy_device *phydev)
return genphy_read_status(phydev);
}
+static inline int phy_update_link(struct phy_device *phydev)
+{
+ if (!phydev->drv)
+ return -EIO;
+
+ if (phydev->drv->read_status)
+ return phydev->drv->read_status(phydev);
+ else if (phydev->is_c45)
+ return gen10g_read_status(phydev);
+ else
+ return genphy_update_link(phydev);
+}
+
void phy_driver_unregister(struct phy_driver *drv);
void phy_drivers_unregister(struct phy_driver *drv, int n);
int phy_driver_register(struct phy_driver *new_driver, struct module *owner);
--
2.7.4
Powered by blists - more mailing lists