diff options
author | neil.shi <neil.shi@quectel.com> | 2023-06-01 11:47:41 +0800 |
---|---|---|
committer | Pierre-Loup A. Griffais <pgriffais@valvesoftware.com> | 2023-11-02 16:05:18 -0700 |
commit | bda903057e406b36b1986b3c242118a85d07f864 (patch) | |
tree | d2bd75bebcc1385b5a07dadc33b2a28d02c0b491 /drivers/net | |
parent | 435e469e00ec51fe2b0d463df49d1eda61a7719d (diff) | |
download | linux-bda903057e406b36b1986b3c242118a85d07f864.tar.gz |
Subject: [PATCH 19/42] wifi: ath11k: support to force rddm mode
With this change, user can "echo mhi-rdd" to /sys/kernel/debug/ath11k/QCA6390/hw2.0/simualte_fw_crash to trigger rddm. Signed-off-by: neil.shi <neil.shi@quectel.com>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/wireless/ath/ath11k/debugfs.c | 4 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath11k/hif.h | 8 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath11k/mhi.c | 15 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath11k/mhi.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath11k/pci.c | 9 |
5 files changed, 37 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath/ath11k/debugfs.c b/drivers/net/wireless/ath/ath11k/debugfs.c index da30cdd10c34..7fad6e447229 100644 --- a/drivers/net/wireless/ath/ath11k/debugfs.c +++ b/drivers/net/wireless/ath/ath11k/debugfs.c @@ -604,6 +604,10 @@ static ssize_t ath11k_write_simulate_fw_crash(struct file *file, ath11k_info(ab, "user requested hw restart\n"); queue_work(ab->workqueue_aux, &ab->reset_work); ret = 0; + } else if (!strcmp(buf, "mhi-rddm")) { + ath11k_info(ab, "force target rddm\n"); + ath11k_hif_force_rddm(ab); + ret = 0; } else { ret = -EINVAL; goto exit; diff --git a/drivers/net/wireless/ath/ath11k/hif.h b/drivers/net/wireless/ath/ath11k/hif.h index 659b80d2abd4..7eca43a91a42 100644 --- a/drivers/net/wireless/ath/ath11k/hif.h +++ b/drivers/net/wireless/ath/ath11k/hif.h @@ -30,6 +30,7 @@ struct ath11k_hif_ops { void (*ce_irq_enable)(struct ath11k_base *ab); void (*ce_irq_disable)(struct ath11k_base *ab); void (*get_ce_msi_idx)(struct ath11k_base *ab, u32 ce_id, u32 *msi_idx); + int (*target_crash)(struct ath11k_base *ab); }; static inline void ath11k_hif_ce_irq_enable(struct ath11k_base *ab) @@ -90,6 +91,13 @@ static inline int ath11k_hif_resume(struct ath11k_base *ab) return 0; } +static inline int ath11k_hif_force_rddm(struct ath11k_base *ab) +{ + if (ab->hif.ops->target_crash) + return ab->hif.ops->target_crash(ab); + return 0; +} + static inline u32 ath11k_hif_read32(struct ath11k_base *sc, u32 address) { return sc->hif.ops->read32(sc, address); diff --git a/drivers/net/wireless/ath/ath11k/mhi.c b/drivers/net/wireless/ath/ath11k/mhi.c index 6247b48db627..e3ade8e5ce43 100644 --- a/drivers/net/wireless/ath/ath11k/mhi.c +++ b/drivers/net/wireless/ath/ath11k/mhi.c @@ -527,3 +527,18 @@ int ath11k_mhi_resume(struct ath11k_pci *ab_pci) return 0; } + + +int ath11k_mhi_force_rddm(struct ath11k_pci *ab_pci) +{ + struct ath11k_base *ab = ab_pci->ab; + int ret; + + ret = mhi_force_rddm_mode(ab_pci->mhi_ctrl); + if (ret) { + ath11k_warn(ab, "failed to resume mhi: %d", ret); + return ret; + } + + return 0; +} diff --git a/drivers/net/wireless/ath/ath11k/mhi.h b/drivers/net/wireless/ath/ath11k/mhi.h index 8d9f852da695..215428b87fc4 100644 --- a/drivers/net/wireless/ath/ath11k/mhi.h +++ b/drivers/net/wireless/ath/ath11k/mhi.h @@ -25,5 +25,6 @@ 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); +int ath11k_mhi_force_rddm(struct ath11k_pci *ab_pci); #endif diff --git a/drivers/net/wireless/ath/ath11k/pci.c b/drivers/net/wireless/ath/ath11k/pci.c index fcb8457a87f4..c8cf05250fd8 100644 --- a/drivers/net/wireless/ath/ath11k/pci.c +++ b/drivers/net/wireless/ath/ath11k/pci.c @@ -800,6 +800,14 @@ static int ath11k_pci_start(struct ath11k_base *ab) return 0; } +static int ath11k_pci_force_rddm(struct ath11k_base *ab) +{ + struct ath11k_pci *ar_pci; + + ar_pci = ath11k_pci_priv(ab); + return ath11k_mhi_force_rddm(ar_pci); +} + static const struct ath11k_hif_ops ath11k_pci_hif_ops = { .start = ath11k_pci_start, .stop = ath11k_pcic_stop, @@ -818,6 +826,7 @@ static const struct ath11k_hif_ops ath11k_pci_hif_ops = { .ce_irq_enable = ath11k_pci_hif_ce_irq_enable, .ce_irq_disable = ath11k_pci_hif_ce_irq_disable, .get_ce_msi_idx = ath11k_pcic_get_ce_msi_idx, + .target_crash = ath11k_pci_force_rddm, }; static void ath11k_pci_read_hw_version(struct ath11k_base *ab, u32 *major, u32 *minor) |