// SPDX-License-Identifier: BSD-3-Clause-Clear /* * Copyright (c) 2020 The Linux Foundation. All rights reserved. * Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights reserved.
*/
/* After SOC_GLOBAL_RESET, MHISTATUS may still have SYSERR bit set * and thus need to set MHICTRL_RESET to clear SYSERR.
*/
ath11k_pcic_write32(ab, MHICTRL, MHICTRL_RESET_MASK);
staticchar *ath11k_mhi_op_callback_to_str(enum mhi_callback reason)
{ switch (reason) { case MHI_CB_IDLE: return"MHI_CB_IDLE"; case MHI_CB_PENDING_DATA: return"MHI_CB_PENDING_DATA"; case MHI_CB_LPM_ENTER: return"MHI_CB_LPM_ENTER"; case MHI_CB_LPM_EXIT: return"MHI_CB_LPM_EXIT"; case MHI_CB_EE_RDDM: return"MHI_CB_EE_RDDM"; case MHI_CB_EE_MISSION_MODE: return"MHI_CB_EE_MISSION_MODE"; case MHI_CB_SYS_ERROR: return"MHI_CB_SYS_ERROR"; case MHI_CB_FATAL_ERROR: return"MHI_CB_FATAL_ERROR"; case MHI_CB_BW_REQ: return"MHI_CB_BW_REQ"; default: return"UNKNOWN";
}
};
switch (ab->hw_rev) { case ATH11K_HW_QCN9074_HW10:
ath11k_mhi_config = &ath11k_mhi_config_qcn9074; break; case ATH11K_HW_QCA6390_HW20: case ATH11K_HW_WCN6855_HW20: case ATH11K_HW_WCN6855_HW21: case ATH11K_HW_QCA2066_HW21: case ATH11K_HW_QCA6698AQ_HW21:
ath11k_mhi_config = &ath11k_mhi_config_qca6390; break; default:
ath11k_err(ab, "failed assign mhi_config for unknown hw rev %d\n",
ab->hw_rev);
ret = -EINVAL; goto free_controller;
}
ab_pci->mhi_pre_cb = MHI_CB_INVALID;
ret = mhi_register_controller(mhi_ctrl, ath11k_mhi_config); if (ret) {
ath11k_err(ab, "failed to register to mhi bus, err = %d\n", ret); goto free_controller;
}
ret = mhi_prepare_for_power_up(ab_pci->mhi_ctrl); if (ret) {
ath11k_warn(ab, "failed to prepare mhi: %d", ret); return ret;
}
ret = mhi_sync_power_up(ab_pci->mhi_ctrl); if (ret) {
ath11k_warn(ab, "failed to power up mhi: %d", ret); return ret;
}
return 0;
}
void ath11k_mhi_stop(struct ath11k_pci *ab_pci, bool is_suspend)
{ /* During suspend we need to use mhi_power_down_keep_dev() * workaround, otherwise ath11k_core_resume() will timeout * during resume.
*/ if (is_suspend)
mhi_power_down_keep_dev(ab_pci->mhi_ctrl, true); else
mhi_power_down(ab_pci->mhi_ctrl, true);
int ath11k_mhi_suspend(struct ath11k_pci *ab_pci)
{ struct ath11k_base *ab = ab_pci->ab; int ret;
ret = mhi_pm_suspend(ab_pci->mhi_ctrl); if (ret) {
ath11k_warn(ab, "failed to suspend mhi: %d", ret); return ret;
}
return 0;
}
int ath11k_mhi_resume(struct ath11k_pci *ab_pci)
{ struct ath11k_base *ab = ab_pci->ab; int ret;
/* Do force MHI resume as some devices like QCA6390, WCN6855 * are not in M3 state but they are functional. So just ignore * the MHI state while resuming.
*/
ret = mhi_pm_resume_force(ab_pci->mhi_ctrl); if (ret) {
ath11k_warn(ab, "failed to resume mhi: %d", ret); return ret;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.