iwlwifi: pcie: wait longer after device reset
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Tue, 27 Jun 2017 09:29:26 +0000 (12:29 +0300)
committerLuca Coelho <luciano.coelho@intel.com>
Thu, 29 Jun 2017 18:02:51 +0000 (21:02 +0300)
The newest devices need a longer time to reset because of
their more complex hardware. Wait 5ms after device reset.
Consolidate all the places that reset the device in the
PCIe transport to avoid future bugs.

While at it, unify the flow to use set_bit instead of full
write as requested by the hardware designers.

Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/utils.c
drivers/net/wireless/intel/iwlwifi/pcie/internal.h
drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c
drivers/net/wireless/intel/iwlwifi/pcie/trans.c

index bd2596fdafda3ebeea558e2e56bf5484cfcd279f..fc5a490880d0c0fca8232ddea6213b9aa7a09a65 100644 (file)
@@ -526,7 +526,7 @@ static void iwl_mvm_dump_lmac_error_log(struct iwl_mvm *mvm, u32 base)
 
                /* reset the device */
                iwl_set_bit(trans, CSR_RESET, CSR_RESET_REG_FLAG_SW_RESET);
-               usleep_range(1000, 2000);
+               usleep_range(5000, 6000);
 
                /* set INIT_DONE flag */
                iwl_set_bit(trans, CSR_GP_CNTRL,
index 7ec2d96cccebaa67e39b2d8db30b5c5a184208d9..fa315d84e98eacdf4f58bf47863f9f0aa3cce712 100644 (file)
@@ -654,6 +654,13 @@ static inline void iwl_enable_fw_load_int(struct iwl_trans *trans)
        }
 }
 
+static inline void iwl_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 inline void *iwl_pcie_get_tfd(struct iwl_trans_pcie *trans_pcie,
                                     struct iwl_txq *txq, int idx)
 {
index e84c5ff389a841ddba7dcb8c3e5ce711ea9a6105..b84b78293e7b19c528725c4276d48a6e1b41934e 100644 (file)
@@ -136,9 +136,7 @@ static void iwl_pcie_gen2_apm_stop(struct iwl_trans *trans, bool op_mode_leave)
        /* Stop device's DMA activity */
        iwl_pcie_apm_stop_master(trans);
 
-       /* Reset the entire device */
-       iwl_set_bit(trans, CSR_RESET, CSR_RESET_REG_FLAG_SW_RESET);
-       usleep_range(1000, 2000);
+       iwl_pcie_sw_reset(trans);
 
        /*
         * Clear "initialization complete" bit to move adapter from
@@ -188,9 +186,7 @@ void _iwl_trans_pcie_gen2_stop_device(struct iwl_trans *trans, bool low_power)
        /* Stop the device, and put it in low power state */
        iwl_pcie_gen2_apm_stop(trans, false);
 
-       /* stop and reset the on-board processor */
-       iwl_write32(trans, CSR_RESET, CSR_RESET_REG_FLAG_SW_RESET);
-       usleep_range(1000, 2000);
+       iwl_pcie_sw_reset(trans);
 
        /*
         * Upon stop, the IVAR table gets erased, so msi-x won't
index cac584cc07b60321464a4a6764f1a29e848ba7a6..92b3a55d0fbc2633bd6e06c5ef2e772fe98b679b 100644 (file)
@@ -358,9 +358,7 @@ static void iwl_pcie_apm_lp_xtal_enable(struct iwl_trans *trans)
        __iwl_trans_pcie_set_bit(trans, CSR_GP_CNTRL,
                                 CSR_GP_CNTRL_REG_FLAG_XTAL_ON);
 
-       /* 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(1000, 2000);
+       iwl_pcie_sw_reset(trans);
 
        /*
         * Set "initialization complete" bit to move adapter from
@@ -401,12 +399,7 @@ static void iwl_pcie_apm_lp_xtal_enable(struct iwl_trans *trans)
                                 apmg_xtal_cfg_reg |
                                 SHR_APMG_XTAL_CFG_XTAL_ON_REQ);
 
-       /*
-        * Reset entire device again - do controller reset (results in
-        * SHRD_HW_RST). Turn MAC off before proceeding.
-        */
-       iwl_set_bit(trans, CSR_RESET, CSR_RESET_REG_FLAG_SW_RESET);
-       usleep_range(1000, 2000);
+       iwl_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);
@@ -499,9 +492,7 @@ static void iwl_pcie_apm_stop(struct iwl_trans *trans, bool op_mode_leave)
                return;
        }
 
-       /* Reset the entire device */
-       iwl_set_bit(trans, CSR_RESET, CSR_RESET_REG_FLAG_SW_RESET);
-       usleep_range(1000, 2000);
+       iwl_pcie_sw_reset(trans);
 
        /*
         * Clear "initialization complete" bit to move adapter from
@@ -1181,9 +1172,7 @@ static void _iwl_trans_pcie_stop_device(struct iwl_trans *trans, bool low_power)
        /* Stop the device, and put it in low power state */
        iwl_pcie_apm_stop(trans, false);
 
-       /* stop and reset the on-board processor */
-       iwl_write32(trans, CSR_RESET, CSR_RESET_REG_FLAG_SW_RESET);
-       usleep_range(1000, 2000);
+       iwl_pcie_sw_reset(trans);
 
        /*
         * Upon stop, the IVAR table gets erased, so msi-x won't
@@ -1657,9 +1646,7 @@ static int _iwl_trans_pcie_start_hw(struct iwl_trans *trans, bool low_power)
                return err;
        }
 
-       /* Reset the entire device */
-       iwl_write32(trans, CSR_RESET, CSR_RESET_REG_FLAG_SW_RESET);
-       usleep_range(1000, 2000);
+       iwl_pcie_sw_reset(trans);
 
        err = iwl_pcie_apm_init(trans);
        if (err)