int fm10k_setup_tc(struct net_device *dev, u8 tc)
 {
        struct fm10k_intfc *interface = netdev_priv(dev);
+       int err;
 
        /* Currently only the PF supports priority classes */
        if (tc && (interface->hw.mac.type != fm10k_mac_pf))
        netdev_reset_tc(dev);
        netdev_set_num_tc(dev, tc);
 
-       fm10k_init_queueing_scheme(interface);
+       err = fm10k_init_queueing_scheme(interface);
+       if (err)
+               goto err_queueing_scheme;
 
-       fm10k_mbx_request_irq(interface);
+       err = fm10k_mbx_request_irq(interface);
+       if (err)
+               goto err_mbx_irq;
 
-       if (netif_running(dev))
-               fm10k_open(dev);
+       err = netif_running(dev) ? fm10k_open(dev) : 0;
+       if (err)
+               goto err_open;
 
        /* flag to indicate SWPRI has yet to be updated */
        interface->flags |= FM10K_FLAG_SWPRI_CONFIG;
 
        return 0;
+err_open:
+       fm10k_mbx_free_irq(interface);
+err_mbx_irq:
+       fm10k_clear_queueing_scheme(interface);
+err_queueing_scheme:
+       netif_device_detach(dev);
+
+       return err;
 }
 
 static int fm10k_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
 
        }
 
        /* reassociate interrupts */
-       fm10k_mbx_request_irq(interface);
+       err = fm10k_mbx_request_irq(interface);
+       if (err)
+               goto err_mbx_irq;
+
+       err = fm10k_hw_ready(interface);
+       if (err)
+               goto err_open;
 
        /* update hardware address for VFs if perm_addr has changed */
        if (hw->mac.type == fm10k_mac_vf) {
        /* reset clock */
        fm10k_ts_reset(interface);
 
-       if (netif_running(netdev))
-               fm10k_open(netdev);
+       err = netif_running(netdev) ? fm10k_open(netdev) : 0;
+       if (err)
+               goto err_open;
 
        fm10k_iov_resume(interface->pdev);
 
+       rtnl_unlock();
+
+       clear_bit(__FM10K_RESETTING, &interface->state);
+
+       return;
+err_open:
+       fm10k_mbx_free_irq(interface);
+err_mbx_irq:
+       fm10k_clear_queueing_scheme(interface);
 reinit_err:
-       if (err)
-               netif_device_detach(netdev);
+       netif_device_detach(netdev);
 
        rtnl_unlock();
 
        rtnl_lock();
 
        err = fm10k_init_queueing_scheme(interface);
-       if (!err) {
-               fm10k_mbx_request_irq(interface);
-               if (netif_running(netdev))
-                       err = fm10k_open(netdev);
-       }
+       if (err)
+               goto err_queueing_scheme;
 
-       rtnl_unlock();
+       err = fm10k_mbx_request_irq(interface);
+       if (err)
+               goto err_mbx_irq;
 
+       err = fm10k_hw_ready(interface);
        if (err)
-               return err;
+               goto err_open;
+
+       err = netif_running(netdev) ? fm10k_open(netdev) : 0;
+       if (err)
+               goto err_open;
+
+       rtnl_unlock();
 
        /* assume host is not ready, to prevent race with watchdog in case we
         * actually don't have connection to the switch
        netif_device_attach(netdev);
 
        return 0;
+err_open:
+       fm10k_mbx_free_irq(interface);
+err_mbx_irq:
+       fm10k_clear_queueing_scheme(interface);
+err_queueing_scheme:
+       rtnl_unlock();
+
+       return err;
 }
 
 /**