| From cd8f438405032ac8ff88bd8f2eca5e0c0063b14b Mon Sep 17 00:00:00 2001 |
| From: Emmanuel Grumbach <emmanuel.grumbach@intel.com> |
| Date: Thu, 29 Jan 2015 21:34:00 +0200 |
| Subject: iwlwifi: pcie: disable the SCD_BASE_ADDR when we resume from WoWLAN |
| |
| From: Emmanuel Grumbach <emmanuel.grumbach@intel.com> |
| |
| commit cd8f438405032ac8ff88bd8f2eca5e0c0063b14b upstream. |
| |
| The base address of the scheduler in the device's memory |
| (SRAM) comes from two different sources. The periphery |
| register and the alive notification from the firmware. |
| We have a check in iwl_pcie_tx_start that ensures that |
| they are the same. |
| When we resume from WoWLAN, the firmware may have crashed |
| for whatever reason. In that case, the whole device may be |
| reset which means that the periphery register will hold a |
| meaningless value. When we come to compare |
| trans_pcie->scd_base_addr (which really holds the value we |
| had when we loaded the WoWLAN firmware upon suspend) and |
| the current value of the register, we don't see a match |
| unsurprisingly. |
| Trick the check to avoid a loud yet harmless WARN. |
| Note that when the WoWLAN has crashed, we will see that |
| in iwl_trans_pcie_d3_resume which will let the op_mode |
| know. Once the op_mode is informed that the WowLAN firmware |
| has crashed, it can't do much besides resetting the whole |
| device. |
| |
| Reviewed-by: Johannes Berg <johannes.berg@intel.com> |
| Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/net/wireless/iwlwifi/pcie/tx.c | 7 ++++++- |
| 1 file changed, 6 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/net/wireless/iwlwifi/pcie/tx.c |
| +++ b/drivers/net/wireless/iwlwifi/pcie/tx.c |
| @@ -722,7 +722,12 @@ void iwl_trans_pcie_tx_reset(struct iwl_ |
| iwl_write_direct32(trans, FH_KW_MEM_ADDR_REG, |
| trans_pcie->kw.dma >> 4); |
| |
| - iwl_pcie_tx_start(trans, trans_pcie->scd_base_addr); |
| + /* |
| + * Send 0 as the scd_base_addr since the device may have be reset |
| + * while we were in WoWLAN in which case SCD_SRAM_BASE_ADDR will |
| + * contain garbage. |
| + */ |
| + iwl_pcie_tx_start(trans, 0); |
| } |
| |
| /* |