wifi: rtw89: Correct immediate cfg_len calculation for scan_offload_be
authorLiang Jie <liangjie@lixiang.com>
Sun, 12 Jan 2025 10:51:44 +0000 (18:51 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Mon, 20 Jan 2025 01:27:25 +0000 (09:27 +0800)
Ensures the correct calculation of `cfg_len` prior to the allocation of
the skb in the `rtw89_fw_h2c_scan_offload_be` function, particularly when
the `SCAN_OFFLOAD_BE_V0` firmware feature is enabled. It addresses an
issue where an incorrect skb size might be allocated due to a delayed
setting of `cfg_len`, potentially leading to memory inefficiencies.

By moving the conditional check and assignment of `cfg_len` before skb
allocation, the patch guarantees that `len`, which depends on `cfg_len`,
is accurately computed, ensuring proper skb size and preventing any
unnecessary memory reservation for firmware operations not supporting
beyond the `w8` member of the command data structure.

This correction helps to optimize memory usage and maintain consistent
behavior across different firmware versions.

Fixes: 6ca6b918f280 ("wifi: rtw89: 8922a: Add new fields for scan offload H2C command")
Signed-off-by: Liang Jie <liangjie@lixiang.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20250112105144.615474-1-buaajxlj@163.com
drivers/net/wireless/realtek/rtw89/fw.c

index 5d4ad23cc3bd4dd2809d95432bb48a53fc83c027..5cc9ab78c09f79b11a6b44cefaa424e9ec2af5c1 100644 (file)
@@ -5311,6 +5311,7 @@ int rtw89_fw_h2c_scan_offload_be(struct rtw89_dev *rtwdev,
        u8 macc_role_size = sizeof(*macc_role) * option->num_macc_role;
        u8 opch_size = sizeof(*opch) * option->num_opch;
        u8 probe_id[NUM_NL80211_BANDS];
+       u8 scan_offload_ver = U8_MAX;
        u8 cfg_len = sizeof(*h2c);
        unsigned int cond;
        u8 ver = U8_MAX;
@@ -5321,6 +5322,11 @@ int rtw89_fw_h2c_scan_offload_be(struct rtw89_dev *rtwdev,
 
        rtw89_scan_get_6g_disabled_chan(rtwdev, option);
 
+       if (RTW89_CHK_FW_FEATURE(SCAN_OFFLOAD_BE_V0, &rtwdev->fw)) {
+               cfg_len = offsetofend(typeof(*h2c), w8);
+               scan_offload_ver = 0;
+       }
+
        len = cfg_len + macc_role_size + opch_size;
        skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
        if (!skb) {
@@ -5392,10 +5398,8 @@ int rtw89_fw_h2c_scan_offload_be(struct rtw89_dev *rtwdev,
                                           RTW89_H2C_SCANOFLD_BE_W8_PROBE_RATE_6GHZ);
        }
 
-       if (RTW89_CHK_FW_FEATURE(SCAN_OFFLOAD_BE_V0, &rtwdev->fw)) {
-               cfg_len = offsetofend(typeof(*h2c), w8);
+       if (scan_offload_ver == 0)
                goto flex_member;
-       }
 
        h2c->w9 = le32_encode_bits(sizeof(*h2c) / sizeof(h2c->w0),
                                   RTW89_H2C_SCANOFLD_BE_W9_SIZE_CFG) |