rtnl_unlock();
 }
 
-static void fm10k_reinit(struct fm10k_intfc *interface)
+static void fm10k_prepare_for_reset(struct fm10k_intfc *interface)
 {
        struct net_device *netdev = interface->netdev;
-       struct fm10k_hw *hw = &interface->hw;
-       int err;
 
        WARN_ON(in_interrupt());
 
        /* delay any future reset requests */
        interface->last_reset = jiffies + (10 * HZ);
 
+       rtnl_unlock();
+}
+
+static int fm10k_handle_reset(struct fm10k_intfc *interface)
+{
+       struct net_device *netdev = interface->netdev;
+       struct fm10k_hw *hw = &interface->hw;
+       int err;
+
+       rtnl_lock();
+
        /* reset and initialize the hardware so it is in a known state */
        err = hw->mac.ops.reset_hw(hw);
        if (err) {
                goto reinit_err;
        }
 
-       /* reassociate interrupts */
+       /* re-associate interrupts */
        err = fm10k_mbx_request_irq(interface);
        if (err)
                goto err_mbx_irq;
 
        clear_bit(__FM10K_RESETTING, &interface->state);
 
-       return;
+       return err;
 err_open:
        fm10k_mbx_free_irq(interface);
 err_mbx_irq:
        rtnl_unlock();
 
        clear_bit(__FM10K_RESETTING, &interface->state);
+
+       return err;
+}
+
+static void fm10k_reinit(struct fm10k_intfc *interface)
+{
+       int err;
+
+       fm10k_prepare_for_reset(interface);
+
+       err = fm10k_handle_reset(interface);
+       if (err)
+               dev_err(&interface->pdev->dev,
+                       "fm10k_handle_reset failed: %d\n", err);
 }
 
 static void fm10k_reset_subtask(struct fm10k_intfc *interface)