patch
@@ -7,7 +7,7 @@ static int qca_download_firmware(struct hci_dev *hdev,
 	u8 *data;
 	const u8 *segment;
 	int ret, size, remain, i = 0;
-
+	bool data_allocated = false;
 	bt_dev_info(hdev, "QCA Downloading %s", config->fwname);
 
 	ret = request_firmware(&fw, config->fwname, &hdev->dev);
@@ -42,14 +42,20 @@ static int qca_download_firmware(struct hci_dev *hdev,
 			   config->fwname);
 		release_firmware(fw);
 		return -ENOMEM;
+	} else {
+		data_allocated = true;
 	}
 
 	memcpy(data, fw->data, size);
 	release_firmware(fw);
 
 	ret = qca_tlv_check_data(hdev, config, data, size, soc_type);
-	if (ret)
+	if (ret) {
+		if (data_allocated)
+			vfree(data);
 		return ret;
+	}
+
 	segment = data;
 	remain = size;
