]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
rtw88: refine fw_crash debugfs to show non-zero while triggering
authorZong-Zhe Yang <kevin_yang@realtek.com>
Fri, 1 Oct 2021 08:23:01 +0000 (16:23 +0800)
committerKalle Valo <kvalo@codeaurora.org>
Tue, 5 Oct 2021 05:28:36 +0000 (08:28 +0300)
The usage of fw_crash debugfs is to write 1 to it to trigger fw crash
simulation and to read from it to check the state. When zero is read,
it is supposed to mean fw crash/restart process is done. Then, some
test plans can be designed for crash/restart.
e.g.
step 1. trigger fw crash simulation
step 2. poll the state until zero is read
step 3. check connection by ping test

However, in certain connection cases, triggering fw crash simulation
will take a while. If the state is queried too early before restart
begins processing, it may mistakenly think restart process has been
done. If some tests are started at this time, something unexpected
might happen due to the follow-up restart process.

To avoid that, let fw_crash also show non-zero when a simulation
is still triggering.

Signed-off-by: Zong-Zhe Yang <kevin_yang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/20211001082301.4805-1-pkshih@realtek.com
drivers/net/wireless/realtek/rtw88/debug.c
drivers/net/wireless/realtek/rtw88/main.c
drivers/net/wireless/realtek/rtw88/main.h

index babf7fb238ccdfd764f207c6ff6aa766b7d77d81..682b23502e6ea6bc2bbc034ce9e211c219d955dc 100644 (file)
@@ -886,6 +886,7 @@ static ssize_t rtw_debugfs_set_fw_crash(struct file *filp,
 
        mutex_lock(&rtwdev->mutex);
        rtw_leave_lps_deep(rtwdev);
+       set_bit(RTW_FLAG_RESTART_TRIGGERING, rtwdev->flags);
        rtw_write8(rtwdev, REG_HRCV_MSG, 1);
        mutex_unlock(&rtwdev->mutex);
 
@@ -897,7 +898,9 @@ static int rtw_debugfs_get_fw_crash(struct seq_file *m, void *v)
        struct rtw_debugfs_priv *debugfs_priv = m->private;
        struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
 
-       seq_printf(m, "%d\n", test_bit(RTW_FLAG_RESTARTING, rtwdev->flags));
+       seq_printf(m, "%d\n",
+                  test_bit(RTW_FLAG_RESTART_TRIGGERING, rtwdev->flags) ||
+                  test_bit(RTW_FLAG_RESTARTING, rtwdev->flags));
        return 0;
 }
 
index cee2acabb0423ef69950a492dad08e46c1a039e8..a0d4d6e31fb49ed92f1a6e6356644d8eab0cfdc5 100644 (file)
@@ -564,6 +564,7 @@ static void __fw_recovery_work(struct rtw_dev *rtwdev)
        int ret = 0;
 
        set_bit(RTW_FLAG_RESTARTING, rtwdev->flags);
+       clear_bit(RTW_FLAG_RESTART_TRIGGERING, rtwdev->flags);
 
        ret = rtw_fwcd_prep(rtwdev);
        if (ret)
index 723316347876e6dbbac6d3bebff65b6a3b8658fb..bbdd535b64e77125e4f6c31fb8967db9f2f32c22 100644 (file)
@@ -363,6 +363,7 @@ enum rtw_flags {
        RTW_FLAG_BUSY_TRAFFIC,
        RTW_FLAG_WOWLAN,
        RTW_FLAG_RESTARTING,
+       RTW_FLAG_RESTART_TRIGGERING,
 
        NUM_OF_RTW_FLAGS,
 };