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 |
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;
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.
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.
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 --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)
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(-)