patch
+static u8 *alloc_firmware_data(size_t size)
+{
+	u8 *data = vmalloc(size);
+	if (!data) {
+		pr_err("Failed to allocate memory for firmware data");
+		return NULL;
+	}
+	return data;
+}
+
+static void free_firmware_data(u8 *data)
+{
+	if (data)
+		vfree(data);
+}
+
 static int qca_download_firmware(struct hci_dev *hdev,
 				 struct qca_fw_config *config,
 				 enum qca_btsoc_type soc_type,
@@ -36,13 +41,13 @@ static int qca_download_firmware(struct hci_dev *hdev,
 	}
 
 	size = fw->size;
-	data = vmalloc(fw->size);
+	data = alloc_firmware_data(fw->size);
 	if (!data) {
 		bt_dev_err(hdev, "QCA Failed to allocate memory for file: %s",
 			   config->fwname);
 		release_firmware(fw);
 		return -ENOMEM;
-	}
+	}
 
 	memcpy(data, fw->data, size);
 	release_firmware(fw);
@@ -50,6 +55,7 @@ static int qca_download_firmware(struct hci_dev *hdev,
 	ret = qca_tlv_check_data(hdev, config, data, size, soc_type);
 	if (ret) {
+		free_firmware_data(data);
 		return ret;
 	}
