{
        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;
        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) {
            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;
        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);
 }
 
        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 = {