[PATCH v4] net: stmmac: fix 'ethtool -P' return -EBUSY

Subsystems: networking drivers, stmmac ethernet driver, the rest

STALE1870d

3 messages, 3 authors, 2021-07-19 · open the first message on its own page

[PATCH v4] net: stmmac: fix 'ethtool -P' return -EBUSY

From: Hao Chen <hidden>
Date: 2021-07-19 09:32:58

The permanent mac address should be available for query when the device
is not up.
NetworkManager, the system network daemon, uses 'ethtool -P' to obtain
the permanent address after the kernel start. When the network device
is not up, it will return the device busy error with 'ethtool -P'. At
that time, it is unable to access the Internet through the permanent
address by NetworkManager.
I think that the '.begin' is not used to check if the device is up.

Signed-off-by: Hao Chen <redacted>
---
 .../ethernet/stmicro/stmmac/stmmac_ethtool.c  | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
index d0ce608b81c3..25c44c1ecbd6 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
@@ -15,6 +15,7 @@
 #include <linux/phylink.h>
 #include <linux/net_tstamp.h>
 #include <asm/io.h>
+#include <linux/pm_runtime.h>
 
 #include "stmmac.h"
 #include "dwmac_dma.h"
@@ -410,13 +411,22 @@ static void stmmac_ethtool_setmsglevel(struct net_device *dev, u32 level)
 
 }
 
-static int stmmac_check_if_running(struct net_device *dev)
+static int stmmac_ethtool_begin(struct net_device *dev)
 {
-	if (!netif_running(dev))
-		return -EBUSY;
+	struct stmmac_priv *priv = netdev_priv(dev);
+
+	pm_runtime_get_sync(priv->device);
+
 	return 0;
 }
 
+static void stmmac_ethtool_complete(struct net_device *dev)
+{
+	struct stmmac_priv *priv = netdev_priv(dev);
+
+	pm_runtime_put(priv->device);
+}
+
 static int stmmac_ethtool_get_regs_len(struct net_device *dev)
 {
 	struct stmmac_priv *priv = netdev_priv(dev);
@@ -1073,7 +1083,8 @@ static int stmmac_set_tunable(struct net_device *dev,
 static const struct ethtool_ops stmmac_ethtool_ops = {
 	.supported_coalesce_params = ETHTOOL_COALESCE_USECS |
 				     ETHTOOL_COALESCE_MAX_FRAMES,
-	.begin = stmmac_check_if_running,
+	.begin = stmmac_ethtool_begin,
+	.complete = stmmac_ethtool_complete,
 	.get_drvinfo = stmmac_ethtool_getdrvinfo,
 	.get_msglevel = stmmac_ethtool_getmsglevel,
 	.set_msglevel = stmmac_ethtool_setmsglevel,
-- 
2.20.1


RE: [PATCH v4] net: stmmac: fix 'ethtool -P' return -EBUSY

From: Joakim Zhang <hidden>
Date: 2021-07-19 09:52:25

quoted hunk
-----Original Message-----
From: Hao Chen <redacted>
Sent: 2021年7月19日 17:32
To: peppe.cavallaro@st.com
Cc: alexandre.torgue@foss.st.com; joabreu@synopsys.com;
davem@davemloft.net; kuba@kernel.org; mcoquelin.stm32@gmail.com;
linux@armlinux.org.uk; netdev@vger.kernel.org;
linux-stm32@st-md-mailman.stormreply.com; linux-kernel@vger.kernel.org;
Hao Chen [off-list ref]
Subject: [PATCH v4] net: stmmac: fix 'ethtool -P' return -EBUSY

The permanent mac address should be available for query when the device is
not up.
NetworkManager, the system network daemon, uses 'ethtool -P' to obtain the
permanent address after the kernel start. When the network device is not up,
it will return the device busy error with 'ethtool -P'. At that time, it is unable to
access the Internet through the permanent address by NetworkManager.
I think that the '.begin' is not used to check if the device is up.

Signed-off-by: Hao Chen <redacted>
---
 .../ethernet/stmicro/stmmac/stmmac_ethtool.c  | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
index d0ce608b81c3..25c44c1ecbd6 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
@@ -15,6 +15,7 @@
 #include <linux/phylink.h>
 #include <linux/net_tstamp.h>
 #include <asm/io.h>
+#include <linux/pm_runtime.h>
Please in alphabetical order.

quoted hunk
 #include "stmmac.h"
 #include "dwmac_dma.h"
@@ -410,13 +411,22 @@ static void stmmac_ethtool_setmsglevel(struct
net_device *dev, u32 level)

 }

-static int stmmac_check_if_running(struct net_device *dev)
+static int stmmac_ethtool_begin(struct net_device *dev)
 {
-	if (!netif_running(dev))
-		return -EBUSY;
+	struct stmmac_priv *priv = netdev_priv(dev);
+
+	pm_runtime_get_sync(priv->device);
+
 	return 0;
 }
Add error check, like:
ret = pm_runtime_get_sync(priv->device);
if (ret < 0) {
	pm_runtime_put_noidle(priv->device);
	return ret;
}

Best Regards,
Joakim Zhang
+static void stmmac_ethtool_complete(struct net_device *dev) {
+	struct stmmac_priv *priv = netdev_priv(dev);
+
+	pm_runtime_put(priv->device);
+}
+
 static int stmmac_ethtool_get_regs_len(struct net_device *dev)  {
 	struct stmmac_priv *priv = netdev_priv(dev); @@ -1073,7 +1083,8 @@
static int stmmac_set_tunable(struct net_device *dev,  static const struct
ethtool_ops stmmac_ethtool_ops = {
 	.supported_coalesce_params = ETHTOOL_COALESCE_USECS |
 				     ETHTOOL_COALESCE_MAX_FRAMES,
-	.begin = stmmac_check_if_running,
+	.begin = stmmac_ethtool_begin,
+	.complete = stmmac_ethtool_complete,
 	.get_drvinfo = stmmac_ethtool_getdrvinfo,
 	.get_msglevel = stmmac_ethtool_getmsglevel,
 	.set_msglevel = stmmac_ethtool_setmsglevel,
--
2.20.1

Re: [PATCH v4] net: stmmac: fix 'ethtool -P' return -EBUSY

From: Andrew Lunn <andrew@lunn.ch>
Date: 2021-07-19 20:18:46

On Mon, Jul 19, 2021 at 05:32:07PM +0800, Hao Chen wrote:
The permanent mac address should be available for query when the device
is not up.
NetworkManager, the system network daemon, uses 'ethtool -P' to obtain
the permanent address after the kernel start. When the network device
is not up, it will return the device busy error with 'ethtool -P'. At
that time, it is unable to access the Internet through the permanent
address by NetworkManager.
I think that the '.begin' is not used to check if the device is up.
You forgot to update the commit message.

    Andrew
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help