• Wen Gong's avatar
    ath11k: add support for device recovery for QCA6390/WCN6855 · 13da397f
    Wen Gong authored
    Currently ath11k has device recovery logic, it is introduced by this
    patch "ath11k: Add support for subsystem recovery" which is upstream
    by https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git/commit/?h=ath11k-bringup&id=3a7b4838b6f6f234239f263ef3dc02e612a083ad.
    
    The patch is for AHB devices such as IPQ8074, it has remote proc module
    which is used to download the firmware and boots the processor which
    firmware is running on. If firmware crashed, remote proc module will
    detect it and download and boot firmware again. Below command will
    trigger a firmware crash, and then user can test feature of device
    recovery.
    
    Test command:
    echo assert > /sys/kernel/debug/ath11k/qca6390\ hw2.0/simulate_fw_crash
    echo assert > /sys/kernel/debug/ath11k/wcn6855\ hw2.0/simulate_fw_crash
    
    Unfortunately, QCA6390 is PCIe bus, it does not have the remote proc
    module, it use mhi module to communicate between firmware and ath11k.
    So ath11k does not support device recovery for QCA6390 currently.
    
    This patch is to add the extra logic which is different for QCA6390.
    When firmware crashed, MHI_CB_EE_RDDM event will be indicate by
    firmware and then ath11k_mhi_op_status_cb which is the callback of
    mhi_controller will receive the MHI_CB_EE_RDDM event, then ath11k
    will start to do recovery process, ath11k_core_reset() calls
    ath11k_hif_power_down()/ath11k_hif_power_up(), then the mhi/ath11k
    will start to download and boot firmware. There are some logic to
    avoid deadloop recovery and two simultaneous recovery operations.
    And because it has muti-radios for the soc, so it add some logic
    in ath11k_mac_op_reconfig_complete() to make sure all radios has
    reconfig complete and then complete the device recovery.
    
    Also it add workqueue_aux, because ab->workqueue is used when receive
    ATH11K_QMI_EVENT_FW_READY in recovery process(queue_work(ab->workqueue,
    &ab->restart_work)), and ath11k_core_reset will wait for max
    ATH11K_RESET_TIMEOUT_HZ for the previous restart_work finished, if
    ath11k_core_reset also queued in ab->workqueue, then it will delay
    restart_work of previous recovery and lead previous recovery fail.
    
    ath11k recovery success for QCA6390/WCN6855 after apply this patch.
    
    Tested-on: QCA6390 hw2.0 PCI WLAN.HST.1.0.1-01740-QCAHSTSWPLZ_V2_TO_X86-1
    Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03003-QCAHSPSWPL_V1_V2_SILICONZ_LITE-2
    Signed-off-by: default avatarWen Gong <quic_wgong@quicinc.com>
    Signed-off-by: default avatarKalle Valo <quic_kvalo@quicinc.com>
    Link: https://lore.kernel.org/r/20220228064606.8981-2-quic_wgong@quicinc.com
    13da397f
core.c 37.3 KB