diff mbox series

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

Message ID 20210719093207.17343-1-chenhaoa@uniontech.com
State New
Headers show
Series [v4] net: stmmac: fix 'ethtool -P' return -EBUSY | expand

Commit Message

Hao Chen July 19, 2021, 9:32 a.m. UTC
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 <chenhaoa@uniontech.com>
---
 .../ethernet/stmicro/stmmac/stmmac_ethtool.c  | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

Comments

Joakim Zhang July 19, 2021, 9:52 a.m. UTC | #1
> -----Original Message-----

> From: Hao Chen <chenhaoa@uniontech.com>

> 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 <chenhaoa@uniontech.com>

> 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 <chenhaoa@uniontech.com>

> ---

>  .../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.


>  #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

> 

>
diff mbox series

Patch

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,