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

Hao Chen chenhaoa at uniontech.com
Mon Jul 19 12:58:19 UTC 2021


在 2021/7/19 下午5:52, Joakim Zhang 写道:
>> -----Original Message-----
>> From: Hao Chen <chenhaoa at uniontech.com>
>> Sent: 2021年7月19日 17:32
>> To: peppe.cavallaro at st.com
>> Cc: alexandre.torgue at foss.st.com; joabreu at synopsys.com;
>> davem at davemloft.net; kuba at kernel.org; mcoquelin.stm32 at gmail.com;
>> linux at armlinux.org.uk; netdev at vger.kernel.org;
>> linux-stm32 at st-md-mailman.stormreply.com; linux-kernel at vger.kernel.org;
>> Hao Chen <chenhaoa at 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 at 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
>>
>>
By browse the code and test it,  I find that stmmac not support 
runtime_status,

pm_runtime_get_sync will return -13 errno. So shouldn't modify it in this way.

I think we should just delete the implementation of begin,
it's a pre hook for ethtool.






More information about the Linux-stm32 mailing list