• Golan Ben Ami's avatar
    iwlwifi: pcie: set STATUS_RFKILL immediately after interrupt · 2b18824a
    Golan Ben Ami authored
    Currently, when getting a RFKILL interrupt, the transport enters a flow
    in which it stops the device, disables other interrupts, etc. After
    stopping the device, the transport resets the hw, and sleeps. During
    the sleep, a context switch occurs and host commands are sent by upper
    layers (e.g. mvm) to the fw. This is possible since the op_mode layer
    and the transport layer hold different mutexes.
    
    Since the STATUS_RFKILL bit isn't set, the transport layer doesn't
    recognize that RFKILL was toggled on, and no commands can actually be
    sent, so it enqueues the command to the tx queue and sets a timer on
    the queue.
    
    After switching context back to stopping the device, STATUS_RFKILL is
    set, and then the transport can't send the command to the fw.
    This eventually results in a queue hang.
    
    Fix this by setting STATUS_RFKILL immediately when
    the interrupt is fired.
    Signed-off-by: default avatarGolan Ben-Ami <golan.ben.ami@intel.com>
    Signed-off-by: default avatarLuca Coelho <luciano.coelho@intel.com>
    2b18824a
rx.c 58.7 KB