• Douglas Anderson's avatar
    ath10k: Wait until copy complete is actually done before completing · 8f9ed93d
    Douglas Anderson authored
    On wcn3990 we have "per_ce_irq = true".  That makes the
    ath10k_ce_interrupt_summary() function always return 0xfff. The
    ath10k_ce_per_engine_service_any() function will see this and think
    that _all_ copy engines have an interrupt.  Without checking, the
    ath10k_ce_per_engine_service() assumes that if it's called that the
    "copy complete" (cc) interrupt fired.  This combination seems bad.
    
    Let's add a check to make sure that the "copy complete" interrupt
    actually fired in ath10k_ce_per_engine_service().
    
    This might fix a hard-to-reproduce failure where it appears that the
    copy complete handlers run before the copy is really complete.
    Specifically a symptom was that we were seeing this on a Qualcomm
    sc7180 board:
      arm-smmu 15000000.iommu: Unhandled context fault:
      fsr=0x402, iova=0x7fdd45780, fsynr=0x30003, cbfrsynra=0xc1, cb=10
    
    Even on platforms that don't have wcn3990 this still seems like it
    would be a sane thing to do.  Specifically the current IRQ handler
    comments indicate that there might be other misc interrupt sources
    firing that need to be cleared.  If one of those sources was the one
    that caused the IRQ handler to be called it would also be important to
    double-check that the interrupt we cared about actually fired.
    
    Tested-on: WCN3990 SNOC WLAN.HL.3.2.2-00490-QCAHLSWMTPL-1
    Signed-off-by: default avatarDouglas Anderson <dianders@chromium.org>
    Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20200609082015.1.Ife398994e5a0a6830e4d4a16306ef36e0144e7ba@changeid
    8f9ed93d
ce.c 55.9 KB