Patch "net: stmmac:fix system hang when setting up tag_8021q VLAN for DSA ports" has been added to the 6.3-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

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

to the 6.3-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     net-stmmac-fix-system-hang-when-setting-up-tag_8021q.patch
and it can be found in the queue-6.3 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit b213920a9907639583527838c479c567688883a3
Author: Yan Wang <rk.code@xxxxxxxxxxx>
Date:   Wed Apr 19 22:13:46 2023 +0800

    net: stmmac:fix system hang when setting up tag_8021q VLAN for DSA ports
    
    [ Upstream commit 35226750f7ab9d49140d95bc7d38a2a9b0f4fdfc ]
    
    The system hang because of dsa_tag_8021q_port_setup()->
                                    stmmac_vlan_rx_add_vid().
    
    I found in stmmac_drv_probe() that cailing pm_runtime_put()
    disabled the clock.
    
    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.
    
    Fixes: b3dcb3127786 ("net: stmmac: correct clocks enabled in stmmac_vlan_rx_kill_vid()")
    Reviewed-by: Jacob Keller <jacob.e.keller@xxxxxxxxx>
    Signed-off-by: Yan Wang <rk.code@xxxxxxxxxxx>
    Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index d7fcab0570322..f9cd063f1fe30 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -6350,6 +6350,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;
 
@@ -6357,16 +6361,18 @@ 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 err_pm_put;
 	}
 
 	if (priv->hw->num_vlan) {
 		ret = stmmac_add_hw_vlan_rx_fltr(priv, ndev, priv->hw, proto, vid);
 		if (ret)
-			return ret;
+			goto err_pm_put;
 	}
+err_pm_put:
+	pm_runtime_put(priv->device);
 
-	return 0;
+	return ret;
 }
 
 static int stmmac_vlan_rx_kill_vid(struct net_device *ndev, __be16 proto, u16 vid)



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux