diff options
author | Joonwoo Park <joonwpark81@gmail.com> | 2008-01-23 13:15:20 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-01-31 22:26:43 -0500 |
commit | 25c03d8e8c13c5468155c58013b03841161b4559 (patch) | |
tree | 34899a9c5ef6bed3cb4d0afbe4649269ca58509c /drivers/net | |
parent | 74a3a2509dccba5b4e5eb5808cc59edf2c21560b (diff) |
iwlwifi: do not schedule tasklet when rcv unused irq
The nic controller's scheduler interrupt (CSR_INT_BIT_SCD) indicates
to the driver that scheduler finished to transmit the frame/frames.
This bit is not used and the tasklet should thus not be scheduled upon
its receipt.
Signed-off-by: Joonwoo Park <joonwpark81@gmail.com>
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-3945-hw.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-4965-hw.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl3945-base.c | 12 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl4965-base.c | 12 |
4 files changed, 18 insertions, 10 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945-hw.h b/drivers/net/wireless/iwlwifi/iwl-3945-hw.h index 6e0187393af4..571815d7e8bf 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945-hw.h +++ b/drivers/net/wireless/iwlwifi/iwl-3945-hw.h | |||
@@ -373,7 +373,7 @@ struct iwl3945_eeprom { | |||
373 | #define CSR_INT_BIT_HW_ERR (1 << 29) /* DMA hardware error FH_INT[31] */ | 373 | #define CSR_INT_BIT_HW_ERR (1 << 29) /* DMA hardware error FH_INT[31] */ |
374 | #define CSR_INT_BIT_DNLD (1 << 28) /* uCode Download */ | 374 | #define CSR_INT_BIT_DNLD (1 << 28) /* uCode Download */ |
375 | #define CSR_INT_BIT_FH_TX (1 << 27) /* Tx DMA FH_INT[1:0] */ | 375 | #define CSR_INT_BIT_FH_TX (1 << 27) /* Tx DMA FH_INT[1:0] */ |
376 | #define CSR_INT_BIT_MAC_CLK_ACTV (1 << 26) /* NIC controller's clock toggled on/off */ | 376 | #define CSR_INT_BIT_SCD (1 << 26) /* TXQ pointer advanced */ |
377 | #define CSR_INT_BIT_SW_ERR (1 << 25) /* uCode error */ | 377 | #define CSR_INT_BIT_SW_ERR (1 << 25) /* uCode error */ |
378 | #define CSR_INT_BIT_RF_KILL (1 << 7) /* HW RFKILL switch GP_CNTRL[27] toggled */ | 378 | #define CSR_INT_BIT_RF_KILL (1 << 7) /* HW RFKILL switch GP_CNTRL[27] toggled */ |
379 | #define CSR_INT_BIT_CT_KILL (1 << 6) /* Critical temp (chip too hot) rfkill */ | 379 | #define CSR_INT_BIT_CT_KILL (1 << 6) /* Critical temp (chip too hot) rfkill */ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965-hw.h b/drivers/net/wireless/iwlwifi/iwl-4965-hw.h index ff71c09ab1a7..ffe1e9dfdec7 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965-hw.h +++ b/drivers/net/wireless/iwlwifi/iwl-4965-hw.h | |||
@@ -465,7 +465,7 @@ struct iwl4965_eeprom { | |||
465 | #define CSR_INT_BIT_HW_ERR (1 << 29) /* DMA hardware error FH_INT[31] */ | 465 | #define CSR_INT_BIT_HW_ERR (1 << 29) /* DMA hardware error FH_INT[31] */ |
466 | #define CSR_INT_BIT_DNLD (1 << 28) /* uCode Download */ | 466 | #define CSR_INT_BIT_DNLD (1 << 28) /* uCode Download */ |
467 | #define CSR_INT_BIT_FH_TX (1 << 27) /* Tx DMA FH_INT[1:0] */ | 467 | #define CSR_INT_BIT_FH_TX (1 << 27) /* Tx DMA FH_INT[1:0] */ |
468 | #define CSR_INT_BIT_MAC_CLK_ACTV (1 << 26) /* NIC controller's clock toggled on/off */ | 468 | #define CSR_INT_BIT_SCD (1 << 26) /* TXQ pointer advanced */ |
469 | #define CSR_INT_BIT_SW_ERR (1 << 25) /* uCode error */ | 469 | #define CSR_INT_BIT_SW_ERR (1 << 25) /* uCode error */ |
470 | #define CSR_INT_BIT_RF_KILL (1 << 7) /* HW RFKILL switch GP_CNTRL[27] toggled */ | 470 | #define CSR_INT_BIT_RF_KILL (1 << 7) /* HW RFKILL switch GP_CNTRL[27] toggled */ |
471 | #define CSR_INT_BIT_CT_KILL (1 << 6) /* Critical temp (chip too hot) rfkill */ | 471 | #define CSR_INT_BIT_CT_KILL (1 << 6) /* Critical temp (chip too hot) rfkill */ |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 8cef48c9d748..f644c6bba85f 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
@@ -4759,8 +4759,9 @@ static void iwl3945_irq_tasklet(struct iwl3945_priv *priv) | |||
4759 | #ifdef CONFIG_IWL3945_DEBUG | 4759 | #ifdef CONFIG_IWL3945_DEBUG |
4760 | if (iwl3945_debug_level & (IWL_DL_ISR)) { | 4760 | if (iwl3945_debug_level & (IWL_DL_ISR)) { |
4761 | /* NIC fires this, but we don't use it, redundant with WAKEUP */ | 4761 | /* NIC fires this, but we don't use it, redundant with WAKEUP */ |
4762 | if (inta & CSR_INT_BIT_MAC_CLK_ACTV) | 4762 | if (inta & CSR_INT_BIT_SCD) |
4763 | IWL_DEBUG_ISR("Microcode started or stopped.\n"); | 4763 | IWL_DEBUG_ISR("Scheduler finished to transmit " |
4764 | "the frame/frames.\n"); | ||
4764 | 4765 | ||
4765 | /* Alive notification via Rx interrupt will do the real work */ | 4766 | /* Alive notification via Rx interrupt will do the real work */ |
4766 | if (inta & CSR_INT_BIT_ALIVE) | 4767 | if (inta & CSR_INT_BIT_ALIVE) |
@@ -4768,7 +4769,7 @@ static void iwl3945_irq_tasklet(struct iwl3945_priv *priv) | |||
4768 | } | 4769 | } |
4769 | #endif | 4770 | #endif |
4770 | /* Safely ignore these bits for debug checks below */ | 4771 | /* Safely ignore these bits for debug checks below */ |
4771 | inta &= ~(CSR_INT_BIT_MAC_CLK_ACTV | CSR_INT_BIT_ALIVE); | 4772 | inta &= ~(CSR_INT_BIT_SCD | CSR_INT_BIT_ALIVE); |
4772 | 4773 | ||
4773 | /* HW RF KILL switch toggled (4965 only) */ | 4774 | /* HW RF KILL switch toggled (4965 only) */ |
4774 | if (inta & CSR_INT_BIT_RF_KILL) { | 4775 | if (inta & CSR_INT_BIT_RF_KILL) { |
@@ -4904,8 +4905,11 @@ static irqreturn_t iwl3945_isr(int irq, void *data) | |||
4904 | IWL_DEBUG_ISR("ISR inta 0x%08x, enabled 0x%08x, fh 0x%08x\n", | 4905 | IWL_DEBUG_ISR("ISR inta 0x%08x, enabled 0x%08x, fh 0x%08x\n", |
4905 | inta, inta_mask, inta_fh); | 4906 | inta, inta_mask, inta_fh); |
4906 | 4907 | ||
4908 | inta &= ~CSR_INT_BIT_SCD; | ||
4909 | |||
4907 | /* iwl3945_irq_tasklet() will service interrupts and re-enable them */ | 4910 | /* iwl3945_irq_tasklet() will service interrupts and re-enable them */ |
4908 | tasklet_schedule(&priv->irq_tasklet); | 4911 | if (likely(inta || inta_fh)) |
4912 | tasklet_schedule(&priv->irq_tasklet); | ||
4909 | unplugged: | 4913 | unplugged: |
4910 | spin_unlock(&priv->lock); | 4914 | spin_unlock(&priv->lock); |
4911 | 4915 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl4965-base.c b/drivers/net/wireless/iwlwifi/iwl4965-base.c index c856835b1f20..131cf5adbd79 100644 --- a/drivers/net/wireless/iwlwifi/iwl4965-base.c +++ b/drivers/net/wireless/iwlwifi/iwl4965-base.c | |||
@@ -5137,8 +5137,9 @@ static void iwl4965_irq_tasklet(struct iwl4965_priv *priv) | |||
5137 | #ifdef CONFIG_IWL4965_DEBUG | 5137 | #ifdef CONFIG_IWL4965_DEBUG |
5138 | if (iwl4965_debug_level & (IWL_DL_ISR)) { | 5138 | if (iwl4965_debug_level & (IWL_DL_ISR)) { |
5139 | /* NIC fires this, but we don't use it, redundant with WAKEUP */ | 5139 | /* NIC fires this, but we don't use it, redundant with WAKEUP */ |
5140 | if (inta & CSR_INT_BIT_MAC_CLK_ACTV) | 5140 | if (inta & CSR_INT_BIT_SCD) |
5141 | IWL_DEBUG_ISR("Microcode started or stopped.\n"); | 5141 | IWL_DEBUG_ISR("Scheduler finished to transmit " |
5142 | "the frame/frames.\n"); | ||
5142 | 5143 | ||
5143 | /* Alive notification via Rx interrupt will do the real work */ | 5144 | /* Alive notification via Rx interrupt will do the real work */ |
5144 | if (inta & CSR_INT_BIT_ALIVE) | 5145 | if (inta & CSR_INT_BIT_ALIVE) |
@@ -5146,7 +5147,7 @@ static void iwl4965_irq_tasklet(struct iwl4965_priv *priv) | |||
5146 | } | 5147 | } |
5147 | #endif | 5148 | #endif |
5148 | /* Safely ignore these bits for debug checks below */ | 5149 | /* Safely ignore these bits for debug checks below */ |
5149 | inta &= ~(CSR_INT_BIT_MAC_CLK_ACTV | CSR_INT_BIT_ALIVE); | 5150 | inta &= ~(CSR_INT_BIT_SCD | CSR_INT_BIT_ALIVE); |
5150 | 5151 | ||
5151 | /* HW RF KILL switch toggled */ | 5152 | /* HW RF KILL switch toggled */ |
5152 | if (inta & CSR_INT_BIT_RF_KILL) { | 5153 | if (inta & CSR_INT_BIT_RF_KILL) { |
@@ -5275,8 +5276,11 @@ static irqreturn_t iwl4965_isr(int irq, void *data) | |||
5275 | IWL_DEBUG_ISR("ISR inta 0x%08x, enabled 0x%08x, fh 0x%08x\n", | 5276 | IWL_DEBUG_ISR("ISR inta 0x%08x, enabled 0x%08x, fh 0x%08x\n", |
5276 | inta, inta_mask, inta_fh); | 5277 | inta, inta_mask, inta_fh); |
5277 | 5278 | ||
5279 | inta &= ~CSR_INT_BIT_SCD; | ||
5280 | |||
5278 | /* iwl4965_irq_tasklet() will service interrupts and re-enable them */ | 5281 | /* iwl4965_irq_tasklet() will service interrupts and re-enable them */ |
5279 | tasklet_schedule(&priv->irq_tasklet); | 5282 | if (likely(inta || inta_fh)) |
5283 | tasklet_schedule(&priv->irq_tasklet); | ||
5280 | 5284 | ||
5281 | unplugged: | 5285 | unplugged: |
5282 | spin_unlock(&priv->lock); | 5286 | spin_unlock(&priv->lock); |