• Baochen Qiang's avatar
    wifi: ath11k: fix race due to setting ATH11K_FLAG_EXT_IRQ_ENABLED too early · 5082b3e3
    Baochen Qiang authored
    We are seeing below error randomly in the case where only
    one MSI vector is configured:
    
    kernel: ath11k_pci 0000:03:00.0: wmi command 16387 timeout
    
    The reason is, currently, in ath11k_pcic_ext_irq_enable(),
    ATH11K_FLAG_EXT_IRQ_ENABLED is set before NAPI is enabled.
    This results in a race condition: after
    ATH11K_FLAG_EXT_IRQ_ENABLED is set but before NAPI enabled,
    CE interrupt breaks in. Since IRQ is shared by CE and data
    path, ath11k_pcic_ext_interrupt_handler() is also called
    where we call disable_irq_nosync() to disable IRQ. Then
    napi_schedule() is called but it does nothing because NAPI
    is not enabled at that time, meaning
    ath11k_pcic_ext_grp_napi_poll() will never run, so we have
    no chance to call enable_irq() to enable IRQ back. Finally
    we get above error.
    
    Fix it by setting ATH11K_FLAG_EXT_IRQ_ENABLED after all
    NAPI and IRQ work are done. With the fix, we are sure that
    by the time ATH11K_FLAG_EXT_IRQ_ENABLED is set, NAPI is
    enabled.
    
    Note that the fix above also introduce some side effects:
    if ath11k_pcic_ext_interrupt_handler() breaks in after NAPI
    enabled but before ATH11K_FLAG_EXT_IRQ_ENABLED set, nothing
    will be done by the handler this time, the work will be
    postponed till the next time the IRQ fires.
    
    Tested-on: WCN6855 hw2.1 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.23
    Signed-off-by: default avatarBaochen Qiang <quic_bqiang@quicinc.com>
    Acked-by: default avatarJeff Johnson <quic_jjohnson@quicinc.com>
    Signed-off-by: default avatarKalle Valo <quic_kvalo@quicinc.com>
    Link: https://lore.kernel.org/r/20231117003919.26218-1-quic_bqiang@quicinc.com
    5082b3e3
pcic.c 20.3 KB