• Baochen Qiang's avatar
    wifi: ath11k: support hibernation · 166a490f
    Baochen Qiang authored
    Now that all infrastructure is in place and ath11k is fixed to handle all the
    corner cases, power down the ath11k firmware during suspend and power it back
    up during resume. This fixes the problem when using hibernation with ath11k PCI
    devices.
    
    For suspend, two conditions needs to be satisfied:
            1. since MHI channel unprepare would be done in late suspend stage,
               ath11k needs to get all QMI-dependent things done before that stage.
            2. and because unprepare MHI channels requires a working MHI stack,
               ath11k is not allowed to call mhi_power_down() until that finishes.
    So the original suspend callback is separated into two parts: the first part
    handles all QMI-dependent things in suspend callback; while the second part
    powers down MHI in suspend_late callback. This is valid because kernel calls
    ath11k's suspend callback before all suspend_late callbacks, making the first
    condition happy. And because MHI devices are children of ath11k device
    (ab->dev), kernel guarantees that ath11k's suspend_late callback is called
    after QRTR's suspend_late callback, this satisfies the second condition.
    
    Above analysis also applies to resume process. so the original resume
    callback is separated into two parts: the first part powers up MHI stack
    in resume_early callback, this guarantees MHI stack is working when
    QRTR tries to prepare MHI channels (kernel calls QRTR's resume_early callback
    after ath11k's resume_early callback, due to the child-father relationship);
    the second part waits for the completion of restart, which won't fail now
    since MHI channels are ready for use by QMI.
    
    Another notable change is in power down path, we tell mhi_power_down() to not
    to destroy MHI devices, making it possible for QRTR to help unprepare/prepare
    MHI channels, and finally get us rid of the probe-defer issue when resume.
    
    Also change related code due to interface changes.
    
    Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.30
    Tested-by: default avatarTakashi Iwai <tiwai@suse.de>
    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://msgid.link/20240305021320.3367-4-quic_bqiang@quicinc.com
    166a490f
qmi.c 84.1 KB