struct ice_vsi *vsi = ice_get_main_vsi(pf);
        int err;
 
+       err = ice_init_hw(&pf->hw);
+       if (err) {
+               dev_err(ice_pf_to_dev(pf), "ice_init_hw failed: %d\n", err);
+               return err;
+       }
+
        err = ice_init_dev(pf);
        if (err)
-               return err;
+               goto unroll_hw_init;
 
        vsi->flags = ICE_VSI_FLAG_INIT;
 
        rtnl_unlock();
 err_vsi_cfg:
        ice_deinit_dev(pf);
+unroll_hw_init:
+       ice_deinit_hw(&pf->hw);
        return err;
 }
 
 
        struct ice_hw *hw = &pf->hw;
        int err;
 
-       err = ice_init_hw(hw);
-       if (err) {
-               dev_err(dev, "ice_init_hw failed: %d\n", err);
-               return err;
-       }
-
        ice_init_feature_support(pf);
 
        err = ice_init_ddp_config(hw, pf);
        err = ice_init_pf(pf);
        if (err) {
                dev_err(dev, "ice_init_pf failed: %d\n", err);
-               goto err_init_pf;
+               return err;
        }
 
        pf->hw.udp_tunnel_nic.set_port = ice_udp_tunnel_set_port;
        ice_clear_interrupt_scheme(pf);
 err_init_interrupt_scheme:
        ice_deinit_pf(pf);
-err_init_pf:
-       ice_deinit_hw(hw);
        return err;
 }
 
                hw->debug_mask = debug;
 #endif
 
+       err = ice_init_hw(hw);
+       if (err) {
+               dev_err(dev, "ice_init_hw failed: %d\n", err);
+               goto unroll_adapter;
+       }
+
        err = ice_init(pf);
        if (err)
-               goto err_init;
+               goto unroll_hw_init;
 
        devl_lock(priv_to_devlink(pf));
        err = ice_load(pf);
 err_load:
        devl_unlock(priv_to_devlink(pf));
        ice_deinit(pf);
-err_init:
+unroll_hw_init:
+       ice_deinit_hw(hw);
+unroll_adapter:
        ice_adapter_put(pdev);
        return err;
 }