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: Takashi Iwai <tiwai@suse.de> Signed-off-by: Baochen Qiang <quic_bqiang@quicinc.com> Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com> Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com> Link: https://msgid.link/20240305021320.3367-4-quic_bqiang@quicinc.com
29 lines
923 B
C
29 lines
923 B
C
/* SPDX-License-Identifier: BSD-3-Clause-Clear */
|
|
/*
|
|
* Copyright (c) 2020 The Linux Foundation. All rights reserved.
|
|
* Copyright (c) 2022, 2024 Qualcomm Innovation Center, Inc. All rights reserved.
|
|
*/
|
|
#ifndef _ATH11K_MHI_H
|
|
#define _ATH11K_MHI_H
|
|
|
|
#include "pci.h"
|
|
|
|
#define PCIE_TXVECDB 0x360
|
|
#define PCIE_TXVECSTATUS 0x368
|
|
#define PCIE_RXVECDB 0x394
|
|
#define PCIE_RXVECSTATUS 0x39C
|
|
|
|
#define MHISTATUS 0x48
|
|
#define MHICTRL 0x38
|
|
#define MHICTRL_RESET_MASK 0x2
|
|
|
|
int ath11k_mhi_start(struct ath11k_pci *ar_pci);
|
|
void ath11k_mhi_stop(struct ath11k_pci *ar_pci, bool is_suspend);
|
|
int ath11k_mhi_register(struct ath11k_pci *ar_pci);
|
|
void ath11k_mhi_unregister(struct ath11k_pci *ar_pci);
|
|
void ath11k_mhi_set_mhictrl_reset(struct ath11k_base *ab);
|
|
void ath11k_mhi_clear_vector(struct ath11k_base *ab);
|
|
|
|
int ath11k_mhi_suspend(struct ath11k_pci *ar_pci);
|
|
int ath11k_mhi_resume(struct ath11k_pci *ar_pci);
|
|
#endif
|