rtw89: mac: correct decision on error status by scenario
authorZong-Zhe Yang <kevin_yang@realtek.com>
Mon, 14 Mar 2022 07:12:45 +0000 (15:12 +0800)
committerKalle Valo <kvalo@kernel.org>
Wed, 6 Apr 2022 07:46:01 +0000 (10:46 +0300)
The raw error code might combine error scenario and error status.
But, the error scenario isn't parsed previously. It makes us mishandle
cpu exception and assertion. Now, we correct the error status for them.

Besides, a few uses of error status are refined.

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@kernel.org>
Link: https://lore.kernel.org/r/20220314071250.40292-4-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/mac.c
drivers/net/wireless/realtek/rtw89/mac.h
drivers/net/wireless/realtek/rtw89/ser.c

index 580757bb52cf7f4f4aafe575be998babd106e99e..87adaa08fdb93b8a1b2407f7394cd143e31401b2 100644 (file)
@@ -257,7 +257,9 @@ static void rtw89_mac_dump_err_status(struct rtw89_dev *rtwdev,
        u32 dmac_err, cmac_err;
 
        if (err != MAC_AX_ERR_L1_ERR_DMAC &&
-           err != MAC_AX_ERR_L0_PROMOTE_TO_L1)
+           err != MAC_AX_ERR_L0_PROMOTE_TO_L1 &&
+           err != MAC_AX_ERR_L0_ERR_CMAC0 &&
+           err != MAC_AX_ERR_L0_ERR_CMAC1)
                return;
 
        rtw89_info(rtwdev, "--->\nerr=0x%x\n", err);
@@ -458,7 +460,7 @@ static void rtw89_mac_dump_err_status(struct rtw89_dev *rtwdev,
 
 u32 rtw89_mac_get_err_status(struct rtw89_dev *rtwdev)
 {
-       u32 err;
+       u32 err, err_scnr;
        int ret;
 
        ret = read_poll_timeout(rtw89_read32, err, (err != 0), 1000, 100000,
@@ -471,6 +473,12 @@ u32 rtw89_mac_get_err_status(struct rtw89_dev *rtwdev)
        err = rtw89_read32(rtwdev, R_AX_HALT_C2H);
        rtw89_write32(rtwdev, R_AX_HALT_C2H_CTRL, 0);
 
+       err_scnr = RTW89_ERROR_SCENARIO(err);
+       if (err_scnr == RTW89_WCPU_CPU_EXCEPTION)
+               err = MAC_AX_ERR_CPU_EXCEPTION;
+       else if (err_scnr == RTW89_WCPU_ASSERTION)
+               err = MAC_AX_ERR_ASSERTION;
+
        rtw89_fw_st_dbg_dump(rtwdev);
        rtw89_mac_dump_err_status(rtwdev, err);
 
index fdc5ded23fde3f3a5a9725467583b0b74d3aba7e..a05c504505d82d497dc4bcbf049dd26c0f557f10 100644 (file)
@@ -521,6 +521,13 @@ struct rtw89_mac_dle_dfi_qempty {
        u32 qempty;
 };
 
+enum rtw89_mac_error_scenario {
+       RTW89_WCPU_CPU_EXCEPTION        = 2,
+       RTW89_WCPU_ASSERTION            = 3,
+};
+
+#define RTW89_ERROR_SCENARIO(__err) ((__err) >> 28)
+
 /* Define DBG and recovery enum */
 enum mac_ax_err_info {
        /* Get error info */
@@ -659,6 +666,7 @@ enum mac_ax_err_info {
        MAC_AX_ERR_L2_ERR_APB_BBRF_TO_OTHERS = 0x2370,
        MAC_AX_ERR_L2_RESET_DONE = 0x2400,
        MAC_AX_ERR_CPU_EXCEPTION = 0x3000,
+       MAC_AX_ERR_ASSERTION = 0x4000,
        MAC_AX_GET_ERR_MAX,
        MAC_AX_DUMP_SHAREBUFF_INDICATOR = 0x80000000,
 
index e86f3d89ef1bf7ae5001ade7f5af612363348c2d..5327b97b9c728b24fced92528533cc227b7bacd9 100644 (file)
@@ -477,7 +477,7 @@ int rtw89_ser_notify(struct rtw89_dev *rtwdev, u32 err)
 {
        u8 event = SER_EV_NONE;
 
-       rtw89_info(rtwdev, "ser event = 0x%04x\n", err);
+       rtw89_info(rtwdev, "SER catches error: 0x%x\n", err);
 
        switch (err) {
        case MAC_AX_ERR_L1_ERR_DMAC:
@@ -503,8 +503,10 @@ int rtw89_ser_notify(struct rtw89_dev *rtwdev, u32 err)
                break;
        }
 
-       if (event == SER_EV_NONE)
+       if (event == SER_EV_NONE) {
+               rtw89_warn(rtwdev, "SER cannot recognize error: 0x%x\n", err);
                return -EINVAL;
+       }
 
        ser_send_msg(&rtwdev->ser, event);
        return 0;