diff mbox series

net: stmmac: fix system hang when setting up standalone tag_8021q VLAN for DSA ports

Message ID 20230406100437.5402-1-rocklouts@sina.com (mailing list archive)
State New, archived
Headers show
Series net: stmmac: fix system hang when setting up standalone tag_8021q VLAN for DSA ports | expand

Commit Message

Yan Wang April 6, 2023, 10:04 a.m. UTC
The system hang because of dsa_tag_8021q_port_setup() callbcak
stmmac_vlan_rx_add_vid().I found in stmmac_drv_probe() that
cailing pm_runtime_put() disabled the clock when check the stmmac
dirver.

First, when the kernel is compiled with CONFIG_PM=y,The stmmac's
resume/suspend is active.

Secondly,stmmac as DSA master,the dsa_tag_8021q_port_setup() function
will callback stmmac_vlan_rx_add_vid when DSA dirver starts. However,
The system is hanged for the stmmac_vlan_rx_add_vid()  accesses its
registers after stmmac's clock is closed.

I would suggest adding the pm_runtime_resume_and_get() to the
stmmac_vlan_rx_add_vid().This guarantees that resuming clock output
while in use.

Signed-off-by: louts <rocklouts@sina.com>
---
 drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

Comments

Jakub Kicinski April 8, 2023, 2:57 a.m. UTC | #1
On Thu,  6 Apr 2023 18:04:37 +0800 louts wrote:
> The system hang because of dsa_tag_8021q_port_setup() callbcak
> stmmac_vlan_rx_add_vid().I found in stmmac_drv_probe() that
> cailing pm_runtime_put() disabled the clock when check the stmmac
> dirver.
> 
> First, when the kernel is compiled with CONFIG_PM=y,The stmmac's
> resume/suspend is active.
> 
> Secondly,stmmac as DSA master,the dsa_tag_8021q_port_setup() function
> will callback stmmac_vlan_rx_add_vid when DSA dirver starts. However,
> The system is hanged for the stmmac_vlan_rx_add_vid()  accesses its
> registers after stmmac's clock is closed.
> 
> I would suggest adding the pm_runtime_resume_and_get() to the
> stmmac_vlan_rx_add_vid().This guarantees that resuming clock output
> while in use.
> 
> Signed-off-by: louts <rocklouts@sina.com>

Is that your full name? If your name is not in the Latin alphabet
feel free to put it in brackets after the Latin version, e.g.:

Signed-off-by: John (якесь ім'я) <john@bla.abc>

> @@ -6198,16 +6202,19 @@ static int stmmac_vlan_rx_add_vid(struct net_device *ndev, __be16 proto, u16 vid
>  	ret = stmmac_vlan_update(priv, is_double);
>  	if (ret) {
>  		clear_bit(vid, priv->active_vlans);
> -		return ret;
> +		goto update_vlan_error;
>  	}
>  
>  	if (priv->hw->num_vlan) {
>  		ret = stmmac_add_hw_vlan_rx_fltr(priv, ndev, priv->hw, proto, vid);
>  		if (ret)
> -			return ret;
> +			goto add_vlan_error;
>  	}
> +update_vlan_error:
> +add_vlan_error:

Name the labels after the target please.

err_pm_put:

> +	pm_runtime_put(priv->device);
>  
> -	return 0;
> +	return ret;
Yan Wang April 8, 2023, 6:09 p.m. UTC | #2
Hi,Jakub

So sorry.

My name is Yan Wang, this is my full name.I have sent you the new patch and modified the signature.
Yan Wang April 8, 2023, 6:13 p.m. UTC | #3
Hi,Jakub

So sorry.

My name is Yan Wang, this is my full name.I have sent you the new patch and modified the signature.
Yan Wang April 10, 2023, 7:20 a.m. UTC | #4
On Fri, 7 Apr 2023 19:57:30 -0700 Jakub Kicinski wrote:
>Is that your full name? If your name is not in the Latin alphabet
>feel free to put it in brackets after the Latin version, e.g.:
>
>Signed-off-by: John (якесь ім'я) <john@bla.abc>
Thanks for the pointer.I'm awfully sorry,my full name is Yan Wang,
I have modify Signed-off-by.
>Name the labels after the target please.
>
>err_pm_put:
OK, the label fixed, I resend a new patch on 20230408155823.12834-1-rocklouts@sina.com.

Thanks.
diff mbox series

Patch

diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index d1a7cf4567bc..91d719ebdd97 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -6191,6 +6191,10 @@  static int stmmac_vlan_rx_add_vid(struct net_device *ndev, __be16 proto, u16 vid
 	bool is_double = false;
 	int ret;
 
+	ret = pm_runtime_resume_and_get(priv->device);
+	if (ret < 0)
+		return ret;
+
 	if (be16_to_cpu(proto) == ETH_P_8021AD)
 		is_double = true;
 
@@ -6198,16 +6202,19 @@  static int stmmac_vlan_rx_add_vid(struct net_device *ndev, __be16 proto, u16 vid
 	ret = stmmac_vlan_update(priv, is_double);
 	if (ret) {
 		clear_bit(vid, priv->active_vlans);
-		return ret;
+		goto update_vlan_error;
 	}
 
 	if (priv->hw->num_vlan) {
 		ret = stmmac_add_hw_vlan_rx_fltr(priv, ndev, priv->hw, proto, vid);
 		if (ret)
-			return ret;
+			goto add_vlan_error;
 	}
+update_vlan_error:
+add_vlan_error:
+	pm_runtime_put(priv->device);
 
-	return 0;
+	return ret;
 }
 
 static int stmmac_vlan_rx_kill_vid(struct net_device *ndev, __be16 proto, u16 vid)