mirror of
https://github.com/coolsnowwolf/lede.git
synced 2025-07-01 16:27:08 +08:00
279 lines
7.7 KiB
Diff
279 lines
7.7 KiB
Diff
From 121210ec935c47b076709974d95360f5e9c9b869 Mon Sep 17 00:00:00 2001
|
|
From: Kalle Valo <quic_kvalo@quicinc.com>
|
|
Date: Fri, 1 Apr 2022 20:30:40 +0300
|
|
Subject: [PATCH] ath11k: mhi: remove state machine
|
|
|
|
State machines are difficult to understand and in this case it's just useless,
|
|
which is shown by the diffstat. So remove it entirely to make the code simpler.
|
|
|
|
No functional changes.
|
|
|
|
Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03003-QCAHSPSWPL_V1_V2_SILICONZ_LITE-2
|
|
|
|
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
|
|
Link: https://lore.kernel.org/r/20220401173042.17467-2-kvalo@kernel.org
|
|
---
|
|
drivers/net/wireless/ath/ath11k/mhi.c | 194 ++------------------------
|
|
drivers/net/wireless/ath/ath11k/mhi.h | 13 --
|
|
drivers/net/wireless/ath/ath11k/pci.h | 2 +-
|
|
3 files changed, 11 insertions(+), 198 deletions(-)
|
|
|
|
--- a/drivers/net/wireless/ath/ath11k/mhi.c
|
|
+++ b/drivers/net/wireless/ath/ath11k/mhi.c
|
|
@@ -465,195 +465,17 @@ void ath11k_mhi_unregister(struct ath11k
|
|
mhi_free_controller(mhi_ctrl);
|
|
}
|
|
|
|
-static char *ath11k_mhi_state_to_str(enum ath11k_mhi_state mhi_state)
|
|
-{
|
|
- switch (mhi_state) {
|
|
- case ATH11K_MHI_INIT:
|
|
- return "INIT";
|
|
- case ATH11K_MHI_DEINIT:
|
|
- return "DEINIT";
|
|
- case ATH11K_MHI_POWER_ON:
|
|
- return "POWER_ON";
|
|
- case ATH11K_MHI_POWER_OFF:
|
|
- return "POWER_OFF";
|
|
- case ATH11K_MHI_FORCE_POWER_OFF:
|
|
- return "FORCE_POWER_OFF";
|
|
- case ATH11K_MHI_SUSPEND:
|
|
- return "SUSPEND";
|
|
- case ATH11K_MHI_RESUME:
|
|
- return "RESUME";
|
|
- case ATH11K_MHI_TRIGGER_RDDM:
|
|
- return "TRIGGER_RDDM";
|
|
- case ATH11K_MHI_RDDM_DONE:
|
|
- return "RDDM_DONE";
|
|
- default:
|
|
- return "UNKNOWN";
|
|
- }
|
|
-};
|
|
-
|
|
-static void ath11k_mhi_set_state_bit(struct ath11k_pci *ab_pci,
|
|
- enum ath11k_mhi_state mhi_state)
|
|
-{
|
|
- struct ath11k_base *ab = ab_pci->ab;
|
|
-
|
|
- switch (mhi_state) {
|
|
- case ATH11K_MHI_INIT:
|
|
- set_bit(ATH11K_MHI_INIT, &ab_pci->mhi_state);
|
|
- break;
|
|
- case ATH11K_MHI_DEINIT:
|
|
- clear_bit(ATH11K_MHI_INIT, &ab_pci->mhi_state);
|
|
- break;
|
|
- case ATH11K_MHI_POWER_ON:
|
|
- set_bit(ATH11K_MHI_POWER_ON, &ab_pci->mhi_state);
|
|
- break;
|
|
- case ATH11K_MHI_POWER_OFF:
|
|
- case ATH11K_MHI_FORCE_POWER_OFF:
|
|
- clear_bit(ATH11K_MHI_POWER_ON, &ab_pci->mhi_state);
|
|
- clear_bit(ATH11K_MHI_TRIGGER_RDDM, &ab_pci->mhi_state);
|
|
- clear_bit(ATH11K_MHI_RDDM_DONE, &ab_pci->mhi_state);
|
|
- break;
|
|
- case ATH11K_MHI_SUSPEND:
|
|
- set_bit(ATH11K_MHI_SUSPEND, &ab_pci->mhi_state);
|
|
- break;
|
|
- case ATH11K_MHI_RESUME:
|
|
- clear_bit(ATH11K_MHI_SUSPEND, &ab_pci->mhi_state);
|
|
- break;
|
|
- case ATH11K_MHI_TRIGGER_RDDM:
|
|
- set_bit(ATH11K_MHI_TRIGGER_RDDM, &ab_pci->mhi_state);
|
|
- break;
|
|
- case ATH11K_MHI_RDDM_DONE:
|
|
- set_bit(ATH11K_MHI_RDDM_DONE, &ab_pci->mhi_state);
|
|
- break;
|
|
- default:
|
|
- ath11k_err(ab, "unhandled mhi state (%d)\n", mhi_state);
|
|
- }
|
|
-}
|
|
-
|
|
-static int ath11k_mhi_check_state_bit(struct ath11k_pci *ab_pci,
|
|
- enum ath11k_mhi_state mhi_state)
|
|
-{
|
|
- struct ath11k_base *ab = ab_pci->ab;
|
|
-
|
|
- switch (mhi_state) {
|
|
- case ATH11K_MHI_INIT:
|
|
- if (!test_bit(ATH11K_MHI_INIT, &ab_pci->mhi_state))
|
|
- return 0;
|
|
- break;
|
|
- case ATH11K_MHI_DEINIT:
|
|
- case ATH11K_MHI_POWER_ON:
|
|
- if (test_bit(ATH11K_MHI_INIT, &ab_pci->mhi_state) &&
|
|
- !test_bit(ATH11K_MHI_POWER_ON, &ab_pci->mhi_state))
|
|
- return 0;
|
|
- break;
|
|
- case ATH11K_MHI_FORCE_POWER_OFF:
|
|
- if (test_bit(ATH11K_MHI_POWER_ON, &ab_pci->mhi_state))
|
|
- return 0;
|
|
- break;
|
|
- case ATH11K_MHI_POWER_OFF:
|
|
- case ATH11K_MHI_SUSPEND:
|
|
- if (test_bit(ATH11K_MHI_POWER_ON, &ab_pci->mhi_state) &&
|
|
- !test_bit(ATH11K_MHI_SUSPEND, &ab_pci->mhi_state))
|
|
- return 0;
|
|
- break;
|
|
- case ATH11K_MHI_RESUME:
|
|
- if (test_bit(ATH11K_MHI_SUSPEND, &ab_pci->mhi_state))
|
|
- return 0;
|
|
- break;
|
|
- case ATH11K_MHI_TRIGGER_RDDM:
|
|
- if (test_bit(ATH11K_MHI_POWER_ON, &ab_pci->mhi_state) &&
|
|
- !test_bit(ATH11K_MHI_TRIGGER_RDDM, &ab_pci->mhi_state))
|
|
- return 0;
|
|
- break;
|
|
- case ATH11K_MHI_RDDM_DONE:
|
|
- return 0;
|
|
- default:
|
|
- ath11k_err(ab, "unhandled mhi state: %s(%d)\n",
|
|
- ath11k_mhi_state_to_str(mhi_state), mhi_state);
|
|
- }
|
|
-
|
|
- ath11k_err(ab, "failed to set mhi state %s(%d) in current mhi state (0x%lx)\n",
|
|
- ath11k_mhi_state_to_str(mhi_state), mhi_state,
|
|
- ab_pci->mhi_state);
|
|
-
|
|
- return -EINVAL;
|
|
-}
|
|
-
|
|
-static int ath11k_mhi_set_state(struct ath11k_pci *ab_pci,
|
|
- enum ath11k_mhi_state mhi_state)
|
|
-{
|
|
- struct ath11k_base *ab = ab_pci->ab;
|
|
- int ret;
|
|
-
|
|
- ret = ath11k_mhi_check_state_bit(ab_pci, mhi_state);
|
|
- if (ret)
|
|
- goto out;
|
|
-
|
|
- ath11k_dbg(ab, ATH11K_DBG_PCI, "setting mhi state: %s(%d)\n",
|
|
- ath11k_mhi_state_to_str(mhi_state), mhi_state);
|
|
-
|
|
- switch (mhi_state) {
|
|
- case ATH11K_MHI_INIT:
|
|
- ret = mhi_prepare_for_power_up(ab_pci->mhi_ctrl);
|
|
- break;
|
|
- case ATH11K_MHI_DEINIT:
|
|
- mhi_unprepare_after_power_down(ab_pci->mhi_ctrl);
|
|
- ret = 0;
|
|
- break;
|
|
- case ATH11K_MHI_POWER_ON:
|
|
- ret = mhi_sync_power_up(ab_pci->mhi_ctrl);
|
|
- break;
|
|
- case ATH11K_MHI_POWER_OFF:
|
|
- mhi_power_down(ab_pci->mhi_ctrl, true);
|
|
- ret = 0;
|
|
- break;
|
|
- case ATH11K_MHI_FORCE_POWER_OFF:
|
|
- mhi_power_down(ab_pci->mhi_ctrl, false);
|
|
- ret = 0;
|
|
- break;
|
|
- case ATH11K_MHI_SUSPEND:
|
|
- ret = mhi_pm_suspend(ab_pci->mhi_ctrl);
|
|
- break;
|
|
- case ATH11K_MHI_RESUME:
|
|
- /* 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);
|
|
- break;
|
|
- case ATH11K_MHI_TRIGGER_RDDM:
|
|
- ret = mhi_force_rddm_mode(ab_pci->mhi_ctrl);
|
|
- break;
|
|
- case ATH11K_MHI_RDDM_DONE:
|
|
- break;
|
|
- default:
|
|
- ath11k_err(ab, "unhandled MHI state (%d)\n", mhi_state);
|
|
- ret = -EINVAL;
|
|
- }
|
|
-
|
|
- if (ret)
|
|
- goto out;
|
|
-
|
|
- ath11k_mhi_set_state_bit(ab_pci, mhi_state);
|
|
-
|
|
- return 0;
|
|
-
|
|
-out:
|
|
- ath11k_err(ab, "failed to set mhi state: %s(%d)\n",
|
|
- ath11k_mhi_state_to_str(mhi_state), mhi_state);
|
|
- return ret;
|
|
-}
|
|
-
|
|
int ath11k_mhi_start(struct ath11k_pci *ab_pci)
|
|
{
|
|
int ret;
|
|
|
|
ab_pci->mhi_ctrl->timeout_ms = MHI_TIMEOUT_DEFAULT_MS;
|
|
|
|
- ret = ath11k_mhi_set_state(ab_pci, ATH11K_MHI_INIT);
|
|
+ ret = mhi_prepare_for_power_up(ab_pci->mhi_ctrl);
|
|
if (ret)
|
|
goto out;
|
|
|
|
- ret = ath11k_mhi_set_state(ab_pci, ATH11K_MHI_POWER_ON);
|
|
+ ret = mhi_sync_power_up(ab_pci->mhi_ctrl);
|
|
if (ret)
|
|
goto out;
|
|
|
|
@@ -665,16 +487,20 @@ out:
|
|
|
|
void ath11k_mhi_stop(struct ath11k_pci *ab_pci)
|
|
{
|
|
- ath11k_mhi_set_state(ab_pci, ATH11K_MHI_POWER_OFF);
|
|
- ath11k_mhi_set_state(ab_pci, ATH11K_MHI_DEINIT);
|
|
+ mhi_power_down(ab_pci->mhi_ctrl, true);
|
|
+ mhi_unprepare_after_power_down(ab_pci->mhi_ctrl);
|
|
}
|
|
|
|
void ath11k_mhi_suspend(struct ath11k_pci *ab_pci)
|
|
{
|
|
- ath11k_mhi_set_state(ab_pci, ATH11K_MHI_SUSPEND);
|
|
+ mhi_pm_suspend(ab_pci->mhi_ctrl);
|
|
}
|
|
|
|
void ath11k_mhi_resume(struct ath11k_pci *ab_pci)
|
|
{
|
|
- ath11k_mhi_set_state(ab_pci, ATH11K_MHI_RESUME);
|
|
+ /* 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.
|
|
+ */
|
|
+ mhi_pm_resume_force(ab_pci->mhi_ctrl);
|
|
}
|
|
--- a/drivers/net/wireless/ath/ath11k/mhi.h
|
|
+++ b/drivers/net/wireless/ath/ath11k/mhi.h
|
|
@@ -16,19 +16,6 @@
|
|
#define MHICTRL 0x38
|
|
#define MHICTRL_RESET_MASK 0x2
|
|
|
|
-enum ath11k_mhi_state {
|
|
- ATH11K_MHI_INIT,
|
|
- ATH11K_MHI_DEINIT,
|
|
- ATH11K_MHI_POWER_ON,
|
|
- ATH11K_MHI_POWER_OFF,
|
|
- ATH11K_MHI_FORCE_POWER_OFF,
|
|
- ATH11K_MHI_SUSPEND,
|
|
- ATH11K_MHI_RESUME,
|
|
- ATH11K_MHI_TRIGGER_RDDM,
|
|
- ATH11K_MHI_RDDM,
|
|
- ATH11K_MHI_RDDM_DONE,
|
|
-};
|
|
-
|
|
int ath11k_mhi_start(struct ath11k_pci *ar_pci);
|
|
void ath11k_mhi_stop(struct ath11k_pci *ar_pci);
|
|
int ath11k_mhi_register(struct ath11k_pci *ar_pci);
|
|
--- a/drivers/net/wireless/ath/ath11k/pci.h
|
|
+++ b/drivers/net/wireless/ath/ath11k/pci.h
|
|
@@ -63,7 +63,7 @@ struct ath11k_pci {
|
|
u16 dev_id;
|
|
char amss_path[100];
|
|
struct mhi_controller *mhi_ctrl;
|
|
- unsigned long mhi_state;
|
|
+ const struct ath11k_msi_config *msi_config;
|
|
u32 register_window;
|
|
|
|
/* protects register_window above */
|