int qlcnic_83xx_init(struct qlcnic_adapter *adapter, int pci_using_dac)
  {
        struct qlcnic_hardware_context *ahw = adapter->ahw;
 +      int err = 0;
  
 -      if (qlcnic_sriov_vf_check(adapter))
 -              return qlcnic_sriov_vf_init(adapter, pci_using_dac);
 +      ahw->msix_supported = !!qlcnic_use_msi_x;
 +      err = qlcnic_83xx_init_mailbox_work(adapter);
 +      if (err)
 +              goto exit;
  
 -      if (qlcnic_83xx_check_hw_status(adapter))
 -              return -EIO;
 +      if (qlcnic_sriov_vf_check(adapter)) {
 +              err = qlcnic_sriov_vf_init(adapter, pci_using_dac);
 +              if (err)
 +                      goto detach_mbx;
 +              else
 +                      return err;
 +      }
  
 -      /* Initilaize 83xx mailbox spinlock */
 -      spin_lock_init(&ahw->mbx_lock);
 +      err = qlcnic_83xx_check_hw_status(adapter);
 +      if (err)
 +              goto detach_mbx;
 +
 +      err = qlcnic_setup_intr(adapter, 0);
 +      if (err) {
 +              dev_err(&adapter->pdev->dev, "Failed to setup interrupt\n");
 +              goto disable_intr;
 +      }
 +
 +      err = qlcnic_83xx_setup_mbx_intr(adapter);
 +      if (err)
 +              goto disable_mbx_intr;
  
 -      set_bit(QLC_83XX_MBX_READY, &adapter->ahw->idc.status);
        qlcnic_83xx_clear_function_resources(adapter);
  
+       INIT_DELAYED_WORK(&adapter->idc_aen_work, qlcnic_83xx_idc_aen_work);
+ 
        /* register for NIC IDC AEN Events */
        qlcnic_83xx_register_nic_idc_func(adapter, 1);
  
        if (!qlcnic_83xx_read_flash_descriptor_table(adapter))
                qlcnic_83xx_read_flash_mfg_id(adapter);
  
 -      if (qlcnic_83xx_idc_init(adapter))
 -              return -EIO;
 +      err = qlcnic_83xx_idc_init(adapter);
 +      if (err)
 +              goto disable_mbx_intr;
  
        /* Configure default, SR-IOV or Virtual NIC mode of operation */
 -      if (qlcnic_83xx_configure_opmode(adapter))
 -              return -EIO;
 +      err = qlcnic_83xx_configure_opmode(adapter);
 +      if (err)
 +              goto disable_mbx_intr;
  
        /* Perform operating mode specific initialization */
 -      if (adapter->nic_ops->init_driver(adapter))
 -              return -EIO;
 +      err = adapter->nic_ops->init_driver(adapter);
 +      if (err)
 +              goto disable_mbx_intr;
  
-       INIT_DELAYED_WORK(&adapter->idc_aen_work, qlcnic_83xx_idc_aen_work);
- 
        /* Periodically monitor device status */
        qlcnic_83xx_idc_poll_dev_state(&adapter->fw_work.work);
 +      return 0;
  
 -      return adapter->ahw->idc.err_code;
 +disable_mbx_intr:
 +      qlcnic_83xx_free_mbx_intr(adapter);
 +
 +disable_intr:
 +      qlcnic_teardown_intr(adapter);
 +
 +detach_mbx:
 +      qlcnic_83xx_detach_mailbox_work(adapter);
 +      qlcnic_83xx_free_mailbox(ahw->mailbox);
 +exit:
 +      return err;
  }
 
        if (qlcnic_83xx_check(adapter) && !qlcnic_use_msi_x &&
            !!qlcnic_use_msi)
                dev_warn(&pdev->dev,
-                        "83xx adapter do not support MSI interrupts\n");
+                        "Device does not support MSI interrupts\n");
  
 -      err = qlcnic_setup_intr(adapter, 0);
 -      if (err) {
 -              dev_err(&pdev->dev, "Failed to setup interrupt\n");
 -              goto err_out_disable_msi;
 -      }
 -
 -      if (qlcnic_83xx_check(adapter)) {
 -              err = qlcnic_83xx_setup_mbx_intr(adapter);
 -              if (err)
 +      if (qlcnic_82xx_check(adapter)) {
 +              err = qlcnic_setup_intr(adapter, 0);
 +              if (err) {
 +                      dev_err(&pdev->dev, "Failed to setup interrupt\n");
                        goto err_out_disable_msi;
 +              }
        }
  
        err = qlcnic_get_act_pci_func(adapter);