]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: rtlwifi: rtl8192se: rise completion of firmware loading as last step
authorThadeu Lima de Souza Cascardo <cascardo@igalia.com>
Thu, 7 Nov 2024 13:33:19 +0000 (10:33 -0300)
committerPing-Ke Shih <pkshih@realtek.com>
Mon, 18 Nov 2024 01:50:13 +0000 (09:50 +0800)
Just like in commit 4dfde294b979 ("rtlwifi: rise completion at the last
step of firmware callback"), only signal completion once the function is
finished. Otherwise, the module removal waiting for the completion could
free the memory that the callback will still use before returning.

Fixes: b0302aba812b ("rtlwifi: Convert to asynchronous firmware load")
Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@igalia.com>
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20241107133322.855112-3-cascardo@igalia.com
drivers/net/wireless/realtek/rtlwifi/rtl8192se/sw.c

index bbf8ff63dcedb4909ed1f795b1d14b932380f5d8..e63c67b1861b5fe9fc989126b1a7701576e277f7 100644 (file)
@@ -64,22 +64,23 @@ static void rtl92se_fw_cb(const struct firmware *firmware, void *context)
 
        rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
                "Firmware callback routine entered!\n");
-       complete(&rtlpriv->firmware_loading_complete);
        if (!firmware) {
                pr_err("Firmware %s not available\n", fw_name);
                rtlpriv->max_fw_size = 0;
-               return;
+               goto exit;
        }
        if (firmware->size > rtlpriv->max_fw_size) {
                pr_err("Firmware is too big!\n");
                rtlpriv->max_fw_size = 0;
                release_firmware(firmware);
-               return;
+               goto exit;
        }
        pfirmware = (struct rt_firmware *)rtlpriv->rtlhal.pfirmware;
        memcpy(pfirmware->sz_fw_tmpbuffer, firmware->data, firmware->size);
        pfirmware->sz_fw_tmpbufferlen = firmware->size;
        release_firmware(firmware);
+exit:
+       complete(&rtlpriv->firmware_loading_complete);
 }
 
 static int rtl92s_init_sw_vars(struct ieee80211_hw *hw)