• Mordechay Goodstein's avatar
    iwlwifi: pcie: clear only FH bits handle in the interrupt · d4626f91
    Mordechay Goodstein authored
    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: default avatarMordechay Goodstein <mordechay.goodstein@intel.com>
    Signed-off-by: default avatarLuca Coelho <luciano.coelho@intel.com>
    Link: https://lore.kernel.org/r/iwlwifi.20210330162204.a1cdda2fa270.I02a82312679f4541f30bb8db8747a797dbb70ee7@changeidSigned-off-by: default avatarLuca Coelho <luciano.coelho@intel.com>
    d4626f91
iwl-csr.h 24.7 KB