void (*configure)(struct iwl_trans *trans,
                          const struct iwl_trans_config *trans_cfg);
        void (*set_pmi)(struct iwl_trans *trans, bool state);
+       void (*sw_reset)(struct iwl_trans *trans);
        bool (*grab_nic_access)(struct iwl_trans *trans, unsigned long *flags);
        void (*release_nic_access)(struct iwl_trans *trans,
                                   unsigned long *flags);
                trans->ops->set_pmi(trans, state);
 }
 
+static inline void iwl_trans_sw_reset(struct iwl_trans *trans)
+{
+       if (trans->ops->sw_reset)
+               trans->ops->sw_reset(trans);
+}
+
 static inline void
 iwl_trans_set_bits_mask(struct iwl_trans *trans, u32 reg, u32 mask, u32 value)
 {
 
        /* Stop device's DMA activity */
        iwl_pcie_apm_stop_master(trans);
 
-       iwl_pcie_sw_reset(trans);
+       iwl_trans_sw_reset(trans);
 
        /*
         * Clear "initialization complete" bit to move adapter from
        /* Stop the device, and put it in low power state */
        iwl_pcie_gen2_apm_stop(trans, false);
 
-       iwl_pcie_sw_reset(trans);
+       iwl_trans_sw_reset(trans);
 
        /*
         * Upon stop, the IVAR table gets erased, so msi-x won't
 
        kfree(buf);
 }
 
+static void iwl_trans_pcie_sw_reset(struct iwl_trans *trans)
+{
+       /* Reset entire device - do controller reset (results in SHRD_HW_RST) */
+       iwl_set_bit(trans, CSR_RESET, CSR_RESET_REG_FLAG_SW_RESET);
+       usleep_range(5000, 6000);
+}
+
 static void iwl_pcie_free_fw_monitor(struct iwl_trans *trans)
 {
        struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
        __iwl_trans_pcie_set_bit(trans, CSR_GP_CNTRL,
                                 CSR_GP_CNTRL_REG_FLAG_XTAL_ON);
 
-       iwl_pcie_sw_reset(trans);
+       iwl_trans_pcie_sw_reset(trans);
 
        /*
         * Set "initialization complete" bit to move adapter from
                                 apmg_xtal_cfg_reg |
                                 SHR_APMG_XTAL_CFG_XTAL_ON_REQ);
 
-       iwl_pcie_sw_reset(trans);
+       iwl_trans_pcie_sw_reset(trans);
 
        /* Enable LP XTAL by indirect access through CSR */
        apmg_gp1_reg = iwl_trans_pcie_read_shr(trans, SHR_APMG_GP1_REG);
                return;
        }
 
-       iwl_pcie_sw_reset(trans);
+       iwl_trans_pcie_sw_reset(trans);
 
        /*
         * Clear "initialization complete" bit to move adapter from
        /* Stop the device, and put it in low power state */
        iwl_pcie_apm_stop(trans, false);
 
-       iwl_pcie_sw_reset(trans);
+       iwl_trans_pcie_sw_reset(trans);
 
        /*
         * Upon stop, the IVAR table gets erased, so msi-x won't
                return err;
        }
 
-       iwl_pcie_sw_reset(trans);
+       iwl_trans_pcie_sw_reset(trans);
 
        err = iwl_pcie_apm_init(trans);
        if (err)
        .write_mem = iwl_trans_pcie_write_mem,                          \
        .configure = iwl_trans_pcie_configure,                          \
        .set_pmi = iwl_trans_pcie_set_pmi,                              \
+       .sw_reset = iwl_trans_pcie_sw_reset,                            \
        .grab_nic_access = iwl_trans_pcie_grab_nic_access,              \
        .release_nic_access = iwl_trans_pcie_release_nic_access,        \
        .set_bits_mask = iwl_trans_pcie_set_bits_mask,                  \