Search Linux Wireless

Re: ath9k: irq storm after suspend/resume

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Aug 29, 2011 at 1:25 PM, Mohammed Shafi
<shafi.wireless@xxxxxxxxx> wrote:
> On Sat, Aug 27, 2011 at 5:02 PM, Clemens Buchacher <drizzd@xxxxxx> wrote:
>> Hi,
>>
> Hi Clemens,
>
>> I am trying to debug this issue:
>> https://bugzilla.kernel.org/show_bug.cgi?id=39112
>>
>> An IRQ storm triggers during resume after suspend to RAM. The IRQ
>> storm also triggers during insmod after suspend/resume, even if
>> ath9k is not loaded during suspend.
>
> a recent commit, not sure this will help suspend/resume
>
> commit 0682c9b52bf51fbc67c4e79fcbdadcf70bd600f8
> Author: Rajkumar Manoharan <rmanohar@xxxxxxxxxxxxxxxx>
> Date:   Sat Aug 13 10:28:09 2011 +0530
>
>    ath9k: Fix rx overrun interrupt storm
>
>    Whenever RXEOL is received, both RXORN and RXEOL got cleared
>    to avoid rx overrun interrupt storm. This was handled only for
>    edma chips. The same scenario was also observered with AR9280,
>    doing frequent channel type switch b/w HT20/40 with bidi traffic
>    that is causing failure to stop rx dma. This patch clears
>    the RXEOL & RXORN interrupts for all chips.
>
>
>>
>> In the former case, the IRQ storm happens right after the PCI
>> subsystem restores the config space for ath9k.
>>
>> In the latter case, the IRQ storm happens immediately after
>> request_irq in ath_pci_probe. So I have moved ath9k_init_device
>> ahead of request_irq, in order to call ath9k_hw_set_interrupts(ah,
>> 0) before enabling the interrupt.
>>
>> But still, the interrupts come. Note that according to
>> /proc/interrupts, the IRQ line is not shared with any other device.
>> I did not manage to determine which interrupt it is exactly,
>> because the device is not in a ready state (SC_OP_INVALID is set)
>> when they happen (in either scenario that triggers the IRQ storm).
>> And SC_OP_INVALID is cleared only much later in ath9k_start.
>>
>> So, I am at a loss. Any ideas?
>
> please provide the lspci -vvvxx.
> also looking at
> /sys/kernel/debug/ieee80211/phy0/ath9k$ sudo cat interrupt.

hi, i think this will help, please get the message sudo modprobe ath9k
debug=0xffffffff.
few fatal PCI interrupt messages are based on ATH_DEBUG_ANY.
thanks.

>
> also this additional information might help:
> in case have you seen this is happening in 32 bit also ?
> is this happening in wireless-testing  Linux 3.1-rc3 ? or the latest
> compat wireless?
> i did some preliminary testing, not able to recreate it. will try
> further.thanks!
>
>>
>> Below is the output I get during insmod'ing right after resume
>> (complete logs can be found in the bug report). Below that are the
>> changes I made to produce the output.
>>
>> Clemens
>> ---
>>
>> [   53.387989] ath9k 0000:02:00.0: PCI INT A -> GSI 17 (level, low) -> IRQ 17
>> [   53.389306] ath9k 0000:02:00.0: setting latency timer to 64
>> [   53.389371] ath: reset power on
>> [   53.392725] ath: UNDEFINED -> AWAKE
>> [   53.392783] ath: serialize_regmode is 0
>> [   53.438096] ath: Eeprom VER: 14, REV: 13
>> [   53.438098] ath: Initialize ANI
>> [   53.438112] ath: Enable MIB counters
>> [   53.438143] ath: Setup TX queue: 9
>> [   53.438144] ath: Set queue properties for: 9
>> [   53.438146] ath: Setup TX queue: 8
>> [   53.438147] ath: Set queue properties for: 8
>> [   53.438149] ath: Set queue properties for: 8
>> [   53.438151] ath: Reset TX queue: 8
>> [   53.438176] ath: tx ok 0x0 err 0x0 desc 0x100 eol 0x100 urn 0x0
>> [   53.438178] ath: Setup TX queue: 0
>> [   53.438179] ath: Set queue properties for: 0
>> [   53.438181] ath: Setup TX queue: 1
>> [   53.438182] ath: Set queue properties for: 1
>> [   53.438184] ath: Setup TX queue: 2
>> [   53.438185] ath: Set queue properties for: 2
>> [   53.438186] ath: Setup TX queue: 3
>> [   53.438187] ath: Set queue properties for: 3
>> [   53.439692] ath: TX streams 1, RX streams: 1
>> [   53.439694] ath: EEPROM regdomain: 0x60
>> [   53.439695] ath: EEPROM indicates we should expect a direct regpair map
>> [   53.439698] ath: Country alpha2 being used: 00
>> [   53.439699] ath: Regpair used: 0x60
>> [   53.439702] cfg80211: Updating information on frequency 2412 MHz for a 20 MHz width channel with regulatory rule:
>> [   53.439704] cfg80211: 2402000 KHz - 2472000 KHz @  KHz), (N/A mBi, 2000 mBm)
>> [   53.439706] cfg80211: Updating information on frequency 2417 MHz for a 20 MHz width channel with regulatory rule:
>> [   53.439709] cfg80211: 2402000 KHz - 2472000 KHz @  KHz), (N/A mBi, 2000 mBm)
>> [   53.439710] cfg80211: Updating information on frequency 2422 MHz for a 20 MHz width channel with regulatory rule:
>> [   53.439713] cfg80211: 2402000 KHz - 2472000 KHz @  KHz), (N/A mBi, 2000 mBm)
>> [   53.439714] cfg80211: Updating information on frequency 2427 MHz for a 20 MHz width channel with regulatory rule:
>> [   53.439717] cfg80211: 2402000 KHz - 2472000 KHz @  KHz), (N/A mBi, 2000 mBm)
>> [   53.439719] cfg80211: Updating information on frequency 2432 MHz for a 20 MHz width channel with regulatory rule:
>> [   53.439721] cfg80211: 2402000 KHz - 2472000 KHz @  KHz), (N/A mBi, 2000 mBm)
>> [   53.439723] cfg80211: Updating information on frequency 2437 MHz for a 20 MHz width channel with regulatory rule:
>> [   53.439725] cfg80211: 2402000 KHz - 2472000 KHz @  KHz), (N/A mBi, 2000 mBm)
>> [   53.439727] cfg80211: Updating information on frequency 2442 MHz for a 20 MHz width channel with regulatory rule:
>> [   53.439729] cfg80211: 2402000 KHz - 2472000 KHz @  KHz), (N/A mBi, 2000 mBm)
>> [   53.439731] cfg80211: Updating information on frequency 2447 MHz for a 20 MHz width channel with regulatory rule:
>> [   53.439733] cfg80211: 2402000 KHz - 2472000 KHz @  KHz), (N/A mBi, 2000 mBm)
>> [   53.439735] cfg80211: Updating information on frequency 2452 MHz for a 20 MHz width channel with regulatory rule:
>> [   53.439737] cfg80211: 2402000 KHz - 2472000 KHz @  KHz), (N/A mBi, 2000 mBm)
>> [   53.439739] cfg80211: Updating information on frequency 2457 MHz for a 20 MHz width channel with regulatory rule:
>> [   53.439741] cfg80211: 2402000 KHz - 2472000 KHz @  KHz), (N/A mBi, 2000 mBm)
>> [   53.439743] cfg80211: Updating information on frequency 2462 MHz for a 20 MHz width channel with regulatory rule:
>> [   53.439746] cfg80211: 2402000 KHz - 2472000 KHz @  KHz), (N/A mBi, 2000 mBm)
>> [   53.439747] cfg80211: Updating information on frequency 2467 MHz for a 20 MHz width channel with regulatory rule:
>> [   53.439750] cfg80211: 2457000 KHz - 2482000 KHz @  KHz), (N/A mBi, 2000 mBm)
>> [   53.439751] cfg80211: Updating information on frequency 2472 MHz for a 20 MHz width channel with regulatory rule:
>> [   53.439754] cfg80211: 2457000 KHz - 2482000 KHz @  KHz), (N/A mBi, 2000 mBm)
>> [   53.439756] cfg80211: Updating information on frequency 2484 MHz for a 20 MHz width channel with regulatory rule:
>> [   53.439758] cfg80211: 2474000 KHz - 2494000 KHz @  KHz), (N/A mBi, 2000 mBm)
>> [   53.439761] ath: tx DMA: 512 buffers 1 desc/buf
>> [   53.439772] ath: tx DMA map: ffff880071f90000 (54600) -> 71f90000 (54600)
>> [   53.439792] ath: beacon DMA: 4 buffers 1 desc/buf
>> [   53.439795] ath: beacon DMA map: ffff880071ecc000 (416) -> 71ecc000 (416)
>> [   53.439797] ath: cachelsz 64 rxbufsize 1926
>> [   53.439799] ath: rx DMA: 512 buffers 1 desc/buf
>> [   53.439811] ath: rx DMA map: ffff880071fb0000 (54600) -> 71fb0000 (54600)
>> [   53.441193] cfg80211: Ignoring regulatory request Set by core since the driver uses its own custom regulatory domain
>> [   53.441269] ieee80211 phy1: Selected rate control algorithm 'ath9k_rate_control'
>> [   53.441628] Registered led device: ath9k-phy1
>> [   53.441641] ath9k: disabling interrupts
>> [   53.442979] ath: disable IER
>> [   53.442990] ath: 0x0 => 0x0
>> [   53.442992] ath: new IMR 0x0
>> [   53.443013] ath9k: requesting irq
>> [   53.444293] ath9k: interrupt with invalid flag set (1 times)
>> [   53.444296] wait 500 ms
>> [   53.446255] ath9k: interrupt with invalid flag set (2 times)
>> [   53.446288] ath9k: interrupt with invalid flag set (4 times)
>> [   53.446330] ath9k: interrupt with invalid flag set (8 times)
>> [   53.446374] ath9k: interrupt with invalid flag set (16 times)
>> [   53.446453] ath9k: interrupt with invalid flag set (32 times)
>> [   53.446572] ath9k: interrupt with invalid flag set (64 times)
>> [   53.446821] ath9k: interrupt with invalid flag set (128 times)
>> [   53.447319] ath9k: interrupt with invalid flag set (256 times)
>> [   53.448526] ath9k: interrupt with invalid flag set (512 times)
>> [   53.450942] ath9k: interrupt with invalid flag set (1024 times)
>> [   53.454793] ath9k: interrupt with invalid flag set (2048 times)
>> [   53.462493] ath9k: interrupt with invalid flag set (4096 times)
>> [   53.477738] ath9k: interrupt with invalid flag set (8192 times)
>> [   53.508164] ath9k: interrupt with invalid flag set (16384 times)
>> [   53.571798] ath9k: interrupt with invalid flag set (32768 times)
>> [   53.697472] ath9k: interrupt with invalid flag set (65536 times)
>> [   53.832522] irq 17: nobody cared (try booting with the "irqpoll" option)
>> [   53.834253] Pid: 0, comm: kworker/0:0 Tainted: G         C  3.1.0-rc2-ath9k-debug #16
>> [   53.835991] Call Trace:
>> [   53.837727]  <IRQ>  [<ffffffff810c64fd>] __report_bad_irq+0x3d/0xe0
>> [   53.839487]  [<ffffffff810c693d>] note_interrupt+0x14d/0x210
>> [   53.841220]  [<ffffffff810c49d9>] handle_irq_event_percpu+0xc9/0x2a0
>> [   53.842952]  [<ffffffff810c4bf8>] handle_irq_event+0x48/0x70
>> [   53.844659]  [<ffffffff810c727a>] handle_fasteoi_irq+0x5a/0xe0
>> [   53.846379]  [<ffffffff81016982>] handle_irq+0x22/0x40
>> [   53.848073]  [<ffffffff813eb45a>] do_IRQ+0x5a/0xe0
>> [   53.849751]  [<ffffffff813e80ae>] common_interrupt+0x6e/0x6e
>> [   53.851438]  <EOI>  [<ffffffff813e4a96>] ? schedule+0x316/0x9b0
>> [   53.853151]  [<ffffffff812732bb>] ? intel_idle+0xcb/0x120
>> [   53.854822]  [<ffffffff8127329d>] ? intel_idle+0xad/0x120
>> [   53.856502]  [<ffffffff81311e66>] cpuidle_idle_call+0xc6/0x350
>> [   53.858166]  [<ffffffff81013229>] cpu_idle+0xc9/0x120
>> [   53.859806]  [<ffffffff813d6f71>] start_secondary+0x202/0x209
>> [   53.861438] handlers:
>> [   53.863009] [<ffffffffa0557600>] ath_isr
>> [   53.864524] Disabling IRQ #17
>> [   53.943777] done waiting
>> [   53.944849] ieee80211 phy1: Atheros AR9285 Rev:2 mem=0xffffc90010ea0000, irq=17
>>
>> diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
>> index 8dcefe7..fe7780c 100644
>> --- a/drivers/net/wireless/ath/ath9k/hw.c
>> +++ b/drivers/net/wireless/ath/ath9k/hw.c
>> @@ -16,6 +16,7 @@
>>
>>  #include <linux/io.h>
>>  #include <linux/slab.h>
>> +#include <linux/delay.h>
>>  #include <asm/unaligned.h>
>>
>>  #include "hw.h"
>> @@ -532,6 +533,7 @@ static int __ath9k_hw_init(struct ath_hw *ah)
>>        ah->WARegVal |= (AR_WA_D3_L1_DISABLE |
>>                         AR_WA_ASPM_TIMER_BASED_DISABLE);
>>
>> +       ath_dbg(common, ATH_DBG_RESET, "reset power on\n");
>>        if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_POWER_ON)) {
>>                ath_err(common, "Couldn't reset chip\n");
>>                return -EIO;
>> diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
>> index 9098aaa..fdd5dd1 100644
>> --- a/drivers/net/wireless/ath/ath9k/main.c
>> +++ b/drivers/net/wireless/ath/ath9k/main.c
>> @@ -16,6 +16,7 @@
>>
>>  #include <linux/nl80211.h>
>>  #include <linux/delay.h>
>> +#include <linux/log2.h>
>>  #include "ath9k.h"
>>  #include "btcoex.h"
>>
>> @@ -770,14 +771,28 @@ irqreturn_t ath_isr(int irq, void *dev)
>>         * touch anything. Note this can happen early
>>         * on if the IRQ is shared.
>>         */
>> -       if (sc->sc_flags & SC_OP_INVALID)
>> +       if (sc->sc_flags & SC_OP_INVALID) {
>> +               static int count = 0;
>> +               if (count < INT_MAX) {
>> +                       count++;
>> +                       if (is_power_of_2(count))
>> +                               printk(KERN_DEBUG "ath9k: interrupt with invalid flag set (%d times)\n", count);
>> +               }
>>                return IRQ_NONE;
>> +       }
>>
>>
>>        /* shared irq, not for us */
>>
>> -       if (!ath9k_hw_intrpend(ah))
>> +       if (!ath9k_hw_intrpend(ah)) {
>> +               static int count = 0;
>> +               if (count < INT_MAX) {
>> +                       count++;
>> +                       if (is_power_of_2(count))
>> +                               printk(KERN_DEBUG "ath9k: shared irq, not for us (%d times)\n", count);
>> +               }
>>                return IRQ_NONE;
>> +       }
>>
>>        /*
>>         * Figure out the reason(s) for the interrupt.  Note
>> @@ -792,8 +807,15 @@ irqreturn_t ath_isr(int irq, void *dev)
>>         * If there are no status bits set, then this interrupt was not
>>         * for me (should have been caught above).
>>         */
>> -       if (!status)
>> +       if (!status) {
>> +               static int count = 0;
>> +               if (count < INT_MAX) {
>> +                       count++;
>> +                       if (is_power_of_2(count))
>> +                               printk(KERN_DEBUG "ath9k: interrupt, but no status bit set (%d times)\n", count);
>> +               }
>>                return IRQ_NONE;
>> +       }
>>
>>        /* Cache the status */
>>        sc->intrstatus = status;
>> diff --git a/drivers/net/wireless/ath/ath9k/pci.c b/drivers/net/wireless/ath/ath9k/pci.c
>> index be4ea13..6fdabd8 100644
>> --- a/drivers/net/wireless/ath/ath9k/pci.c
>> +++ b/drivers/net/wireless/ath/ath9k/pci.c
>> @@ -242,21 +242,35 @@ static int ath_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
>>        /* Will be cleared in ath9k_start() */
>>        sc->sc_flags |= SC_OP_INVALID;
>>
>> +       pci_read_config_word(pdev, PCI_SUBSYSTEM_ID, &subsysid);
>> +       ret = ath9k_init_device(id->device, sc, subsysid, &ath_pci_bus_ops);
>> +       if (ret) {
>> +               dev_err(&pdev->dev, "Failed to initialize device\n");
>> +               goto err_init;
>> +       }
>> +
>> +       {
>> +               struct ath_hw *ah = sc->sc_ah;
>> +               printk(KERN_INFO "ath9k: disabling interrupts\n");
>> +               ath9k_ps_wakeup(sc);
>> +               mutex_lock(&sc->mutex);
>> +               ath9k_hw_set_interrupts(ah, 0);
>> +               mutex_unlock(&sc->mutex);
>> +               ath9k_ps_restore(sc);
>> +       }
>> +
>> +       printk(KERN_INFO "ath9k: requesting irq\n");
>>        ret = request_irq(pdev->irq, ath_isr, IRQF_SHARED, "ath9k", sc);
>>        if (ret) {
>>                dev_err(&pdev->dev, "request_irq failed\n");
>>                goto err_irq;
>>        }
>> +       printk(KERN_INFO "wait 500 ms\n");
>> +       msleep(500);
>> +       printk(KERN_INFO "done waiting\n");
>>
>>        sc->irq = pdev->irq;
>>
>> -       pci_read_config_word(pdev, PCI_SUBSYSTEM_ID, &subsysid);
>> -       ret = ath9k_init_device(id->device, sc, subsysid, &ath_pci_bus_ops);
>> -       if (ret) {
>> -               dev_err(&pdev->dev, "Failed to initialize device\n");
>> -               goto err_init;
>> -       }
>> -
>>        ath9k_hw_name(sc->sc_ah, hw_name, sizeof(hw_name));
>>        wiphy_info(hw->wiphy, "%s mem=0x%lx, irq=%d\n",
>>                   hw_name, (unsigned long)mem, pdev->irq);
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
>> the body of a message to majordomo@xxxxxxxxxxxxxxx
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>>
>
>
>
> --
> shafi
>



-- 
shafi
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux