iwlwifi: pcie: clear only FH bits handle in the interrupt
authorMordechay Goodstein <mordechay.goodstein@intel.com>
Tue, 30 Mar 2021 13:24:57 +0000 (16:24 +0300)
committerLuca Coelho <luciano.coelho@intel.com>
Wed, 14 Apr 2021 09:07:16 +0000 (12:07 +0300)
commitd4626f91739b76633dbb3013e843e178c4a26618
tree4fc0446960ee104acf10cc9d4cfe21da41afa7f2
parenta7ff1899a7bb97f2e396100c1be373d17a0ae836
iwlwifi: pcie: clear only FH bits handle in the interrupt

For simplicity we assume that msix has 2 IRQ lines one used for rx data
called msix_non_share, and another used for one bit flags messages
(alive, hw error, sw error, rx data flag) called msix_share.

Every time the FW has data to send it puts it on the RX queue and HW
turns on the flags in msix_share (inta_fw) indicating about rx data,
and HW sends an interrupt a bit later to the msix_non_share _unless_
the msix_shared RX data bit was cleared.

Currently in the code every time we get an msix_shared we clear all bits
including rx data queue bits.

So we can have a race

----------------------------------------------------
DRIVER        |   HW                |   FW
----------------------------------------------------
- send host cmd to FW  |      |
       |      | - handle message
       |      |   and put a response
       |      |   on the RX queue
       | - RX flag on        |
       |            | - send alive msix
       | - alive flag on     |
       | - interrupt         |
       |   msix_share driver |
- handle msix_shared   |      |
  and clear all flags  |      |
  bits        |      |
       | - don't send an     |
       |   interrupt on      |
       |   msix_non_shared   |
       |   (driver cleared)  |
- driver timeout on    |      |
  waiting for host cmd |      |
  respond        |      |
       |      |
----------------------------------------------------

The change is to clear only the msi_shared flags that are handled in
the msix_shared flow, which will cause the hardware to send an interrupt
on the msix_non_share line as well, when it has data.

Signed-off-by: Mordechay Goodstein <mordechay.goodstein@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20210330162204.a1cdda2fa270.I02a82312679f4541f30bb8db8747a797dbb70ee7@changeid
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/iwl-csr.h
drivers/net/wireless/intel/iwlwifi/pcie/rx.c