lkml.org 
[lkml]   [2019]   [Aug]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 086/223] iwlwifi: pcie: dont service an interrupt that was masked
    Date
    From: Emmanuel Grumbach <emmanuel.grumbach@intel.com>

    commit 3b57a10ca14c619707398dc58fe5ece18c95b20b upstream.

    Sometimes the register status can include interrupts that
    were masked. We can, for example, get the RF-Kill bit set
    in the interrupt status register although this interrupt
    was masked. Then if we get the ALIVE interrupt (for example)
    that was not masked, we need to *not* service the RF-Kill
    interrupt.
    Fix this in the MSI-X interrupt handler.

    Cc: stable@vger.kernel.org
    Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
    Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/net/wireless/intel/iwlwifi/pcie/rx.c | 27 +++++++++++++++++++++------
    1 file changed, 21 insertions(+), 6 deletions(-)

    --- a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c
    +++ b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c
    @@ -1901,10 +1901,18 @@ irqreturn_t iwl_pcie_irq_msix_handler(in
    return IRQ_NONE;
    }

    - if (iwl_have_debug_level(IWL_DL_ISR))
    - IWL_DEBUG_ISR(trans, "ISR inta_fh 0x%08x, enabled 0x%08x\n",
    - inta_fh,
    + if (iwl_have_debug_level(IWL_DL_ISR)) {
    + IWL_DEBUG_ISR(trans,
    + "ISR inta_fh 0x%08x, enabled (sw) 0x%08x (hw) 0x%08x\n",
    + inta_fh, trans_pcie->fh_mask,
    iwl_read32(trans, CSR_MSIX_FH_INT_MASK_AD));
    + if (inta_fh & ~trans_pcie->fh_mask)
    + IWL_DEBUG_ISR(trans,
    + "We got a masked interrupt (0x%08x)\n",
    + inta_fh & ~trans_pcie->fh_mask);
    + }
    +
    + inta_fh &= trans_pcie->fh_mask;

    if ((trans_pcie->shared_vec_mask & IWL_SHARED_IRQ_NON_RX) &&
    inta_fh & MSIX_FH_INT_CAUSES_Q0) {
    @@ -1943,11 +1951,18 @@ irqreturn_t iwl_pcie_irq_msix_handler(in
    }

    /* After checking FH register check HW register */
    - if (iwl_have_debug_level(IWL_DL_ISR))
    + if (iwl_have_debug_level(IWL_DL_ISR)) {
    IWL_DEBUG_ISR(trans,
    - "ISR inta_hw 0x%08x, enabled 0x%08x\n",
    - inta_hw,
    + "ISR inta_hw 0x%08x, enabled (sw) 0x%08x (hw) 0x%08x\n",
    + inta_hw, trans_pcie->hw_mask,
    iwl_read32(trans, CSR_MSIX_HW_INT_MASK_AD));
    + if (inta_hw & ~trans_pcie->hw_mask)
    + IWL_DEBUG_ISR(trans,
    + "We got a masked interrupt 0x%08x\n",
    + inta_hw & ~trans_pcie->hw_mask);
    + }
    +
    + inta_hw &= trans_pcie->hw_mask;

    /* Alive notification via Rx interrupt will do the real work */
    if (inta_hw & MSIX_HW_INT_CAUSES_REG_ALIVE) {

    \
     
     \ /
      Last update: 2019-08-02 12:09    [W:4.031 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site