aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>2013-12-11 02:00:03 -0500
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>2013-12-17 16:21:25 -0500
commita0f337cc3592b8206d371e549a495b4d7f9cc392 (patch)
treee539688ffa336af207f4360b7a9ae96544b5ac55
parentfc84472b8df4aeb04c21a68f1a77c5c2f99cb283 (diff)
iwlwifi: pcie: read the interrupt cause from the handler
We now disable the interrupts in the hardware from the upper half and all the rest (including reading the interrupt cause) is done in the handler. Reviewed-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
-rw-r--r--drivers/net/wireless/iwlwifi/pcie/rx.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/drivers/net/wireless/iwlwifi/pcie/rx.c b/drivers/net/wireless/iwlwifi/pcie/rx.c
index 7085cda95287..5044fbd82e83 100644
--- a/drivers/net/wireless/iwlwifi/pcie/rx.c
+++ b/drivers/net/wireless/iwlwifi/pcie/rx.c
@@ -879,20 +879,16 @@ static irqreturn_t iwl_pcie_isr_non_ict(struct iwl_trans *trans)
879static irqreturn_t iwl_pcie_isr_ict(struct iwl_trans *trans) 879static irqreturn_t iwl_pcie_isr_ict(struct iwl_trans *trans)
880{ 880{
881 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 881 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
882 unsigned long flags;
883 irqreturn_t ret; 882 irqreturn_t ret;
884 u32 inta; 883 u32 inta;
885 u32 val = 0; 884 u32 val = 0;
886 u32 read; 885 u32 read;
887 886
888 spin_lock_irqsave(&trans_pcie->irq_lock, flags);
889
890 /* dram interrupt table not set yet, 887 /* dram interrupt table not set yet,
891 * use legacy interrupt. 888 * use legacy interrupt.
892 */ 889 */
893 if (unlikely(!trans_pcie->use_ict)) { 890 if (unlikely(!trans_pcie->use_ict)) {
894 ret = iwl_pcie_isr_non_ict(trans); 891 ret = iwl_pcie_isr_non_ict(trans);
895 spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
896 return ret; 892 return ret;
897 } 893 }
898 894
@@ -950,10 +946,8 @@ static irqreturn_t iwl_pcie_isr_ict(struct iwl_trans *trans)
950 trans_pcie->inta |= inta; 946 trans_pcie->inta |= inta;
951 947
952 /* iwl_pcie_tasklet() will service interrupts and re-enable them */ 948 /* iwl_pcie_tasklet() will service interrupts and re-enable them */
953 if (likely(inta)) { 949 if (likely(inta))
954 spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
955 return IRQ_WAKE_THREAD; 950 return IRQ_WAKE_THREAD;
956 }
957 951
958 ret = IRQ_HANDLED; 952 ret = IRQ_HANDLED;
959 953
@@ -965,7 +959,6 @@ static irqreturn_t iwl_pcie_isr_ict(struct iwl_trans *trans)
965 !trans_pcie->inta) 959 !trans_pcie->inta)
966 iwl_enable_interrupts(trans); 960 iwl_enable_interrupts(trans);
967 961
968 spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
969 return ret; 962 return ret;
970} 963}
971 964
@@ -977,12 +970,19 @@ irqreturn_t iwl_pcie_irq_handler(int irq, void *dev_id)
977 u32 inta = 0; 970 u32 inta = 0;
978 u32 handled = 0; 971 u32 handled = 0;
979 unsigned long flags; 972 unsigned long flags;
973 irqreturn_t ret;
980 u32 i; 974 u32 i;
981 975
982 lock_map_acquire(&trans->sync_cmd_lockdep_map); 976 lock_map_acquire(&trans->sync_cmd_lockdep_map);
983 977
984 spin_lock_irqsave(&trans_pcie->irq_lock, flags); 978 spin_lock_irqsave(&trans_pcie->irq_lock, flags);
985 979
980 ret = iwl_pcie_isr_ict(trans);
981 if (ret != IRQ_WAKE_THREAD) {
982 spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
983 return ret;
984 }
985
986 /* Ack/clear/reset pending uCode interrupts. 986 /* Ack/clear/reset pending uCode interrupts.
987 * Note: Some bits in CSR_INT are "OR" of bits in CSR_FH_INT_STATUS, 987 * Note: Some bits in CSR_INT are "OR" of bits in CSR_FH_INT_STATUS,
988 */ 988 */
@@ -1281,5 +1281,5 @@ irqreturn_t iwl_pcie_isr(int irq, void *data)
1281 */ 1281 */
1282 iwl_write32(trans, CSR_INT_MASK, 0x00000000); 1282 iwl_write32(trans, CSR_INT_MASK, 0x00000000);
1283 1283
1284 return iwl_pcie_isr_ict(trans); 1284 return IRQ_WAKE_THREAD;
1285} 1285}