]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: rtw88: Handle C2H_ADAPTIVITY in rtw_fw_c2h_cmd_handle()
authorBitterblue Smith <rtl8821cerfe2@gmail.com>
Wed, 18 Dec 2024 22:34:42 +0000 (00:34 +0200)
committerPing-Ke Shih <pkshih@realtek.com>
Mon, 23 Dec 2024 08:05:49 +0000 (16:05 +0800)
The firmware message C2H_ADAPTIVITY is currently handled in
rtw_fw_c2h_cmd_rx_irqsafe(), which runs in the RX workqueue, but it's
not "irqsafe" with USB because it sleeps (reads hardware registers).
This becomes a problem after the next patch, which will create the RX
workqueue with the flag WQ_BH.

To avoid sleeping when it's not allowed, handle C2H_ADAPTIVITY in
rtw_fw_c2h_cmd_handle(), which runs in the c2h workqueue.

Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/96e52b03-be8d-4050-ae71-bfdb478ff42f@gmail.com
drivers/net/wireless/realtek/rtw88/fw.c

index e6e9946fbf44e44a2f6f7283addee75831dbddc6..02389b7c687682eec9dbef8bc72dafe38407c197 100644 (file)
@@ -332,6 +332,9 @@ void rtw_fw_c2h_cmd_handle(struct rtw_dev *rtwdev, struct sk_buff *skb)
        case C2H_RA_RPT:
                rtw_fw_ra_report_handle(rtwdev, c2h->payload, len);
                break;
+       case C2H_ADAPTIVITY:
+               rtw_fw_adaptivity_result(rtwdev, c2h->payload, len);
+               break;
        default:
                rtw_dbg(rtwdev, RTW_DBG_FW, "C2H 0x%x isn't handled\n", c2h->id);
                break;
@@ -367,10 +370,6 @@ void rtw_fw_c2h_cmd_rx_irqsafe(struct rtw_dev *rtwdev, u32 pkt_offset,
                rtw_fw_scan_result(rtwdev, c2h->payload, len);
                dev_kfree_skb_any(skb);
                break;
-       case C2H_ADAPTIVITY:
-               rtw_fw_adaptivity_result(rtwdev, c2h->payload, len);
-               dev_kfree_skb_any(skb);
-               break;
        default:
                /* pass offset for further operation */
                *((u32 *)skb->cb) = pkt_offset;