diff options
| -rw-r--r-- | drivers/net/ethernet/hisilicon/hibmcge/hbg_err.c | 14 | 
1 files changed, 5 insertions, 9 deletions
| diff --git a/drivers/net/ethernet/hisilicon/hibmcge/hbg_err.c b/drivers/net/ethernet/hisilicon/hibmcge/hbg_err.c index 503cfbfb4a8a..83cf75bf7a17 100644 --- a/drivers/net/ethernet/hisilicon/hibmcge/hbg_err.c +++ b/drivers/net/ethernet/hisilicon/hibmcge/hbg_err.c @@ -53,9 +53,11 @@ static int hbg_reset_prepare(struct hbg_priv *priv, enum hbg_reset_type type)  {  	int ret; -	ASSERT_RTNL(); +	if (test_and_set_bit(HBG_NIC_STATE_RESETTING, &priv->state)) +		return -EBUSY;  	if (netif_running(priv->netdev)) { +		clear_bit(HBG_NIC_STATE_RESETTING, &priv->state);  		dev_warn(&priv->pdev->dev,  			 "failed to reset because port is up\n");  		return -EBUSY; @@ -64,7 +66,6 @@ static int hbg_reset_prepare(struct hbg_priv *priv, enum hbg_reset_type type)  	netif_device_detach(priv->netdev);  	priv->reset_type = type; -	set_bit(HBG_NIC_STATE_RESETTING, &priv->state);  	clear_bit(HBG_NIC_STATE_RESET_FAIL, &priv->state);  	ret = hbg_hw_event_notify(priv, HBG_HW_EVENT_RESET);  	if (ret) { @@ -84,29 +85,26 @@ static int hbg_reset_done(struct hbg_priv *priv, enum hbg_reset_type type)  	    type != priv->reset_type)  		return 0; -	ASSERT_RTNL(); - -	clear_bit(HBG_NIC_STATE_RESETTING, &priv->state);  	ret = hbg_rebuild(priv);  	if (ret) {  		priv->stats.reset_fail_cnt++;  		set_bit(HBG_NIC_STATE_RESET_FAIL, &priv->state); +		clear_bit(HBG_NIC_STATE_RESETTING, &priv->state);  		dev_err(&priv->pdev->dev, "failed to rebuild after reset\n");  		return ret;  	}  	netif_device_attach(priv->netdev); +	clear_bit(HBG_NIC_STATE_RESETTING, &priv->state);  	dev_info(&priv->pdev->dev, "reset done\n");  	return ret;  } -/* must be protected by rtnl lock */  int hbg_reset(struct hbg_priv *priv)  {  	int ret; -	ASSERT_RTNL();  	ret = hbg_reset_prepare(priv, HBG_RESET_TYPE_FUNCTION);  	if (ret)  		return ret; @@ -171,7 +169,6 @@ static void hbg_pci_err_reset_prepare(struct pci_dev *pdev)  	struct net_device *netdev = pci_get_drvdata(pdev);  	struct hbg_priv *priv = netdev_priv(netdev); -	rtnl_lock();  	hbg_reset_prepare(priv, HBG_RESET_TYPE_FLR);  } @@ -181,7 +178,6 @@ static void hbg_pci_err_reset_done(struct pci_dev *pdev)  	struct hbg_priv *priv = netdev_priv(netdev);  	hbg_reset_done(priv, HBG_RESET_TYPE_FLR); -	rtnl_unlock();  }  static const struct pci_error_handlers hbg_pci_err_handler = { | 
