2023-05-16 10:53:37

by Tim Jiang

[permalink] [raw]
Subject: [PATCH v3] Bluetooth: hci_qca: Add support for Qualcomm Bluetooth SoC QCA2066

This patch adds support for QCA2066 firmware patch and nvm downloading.

Signed-off-by: Tim Jiang <[email protected]>
---
drivers/bluetooth/btqca.c | 77 ++++++++++++++++++++++++++++++++++++-
drivers/bluetooth/btqca.h | 4 ++
drivers/bluetooth/hci_qca.c | 8 +++-
3 files changed, 87 insertions(+), 2 deletions(-)

diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c
index fd0941fe8608..bd028387cd02 100644
--- a/drivers/bluetooth/btqca.c
+++ b/drivers/bluetooth/btqca.c
@@ -205,6 +205,48 @@ static int qca_send_reset(struct hci_dev *hdev)
return 0;
}

+static int qca_read_fw_board_id(struct hci_dev *hdev, u16 *bid)
+{
+ u8 cmd;
+ struct sk_buff *skb;
+ struct edl_event_hdr *edl;
+ int err = 0;
+ int bid_len;
+
+ bt_dev_dbg(hdev, "QCA read board ID");
+
+ cmd = EDL_GET_BID_REQ_CMD;
+ skb = __hci_cmd_sync_ev(hdev, EDL_PATCH_CMD_OPCODE, EDL_PATCH_CMD_LEN,
+ &cmd, 0, HCI_INIT_TIMEOUT);
+ if (IS_ERR(skb)) {
+ err = PTR_ERR(skb);
+ bt_dev_err(hdev, "Reading QCA board ID failed (%d)", err);
+ return err;
+ }
+
+ edl = skb_pull_data(skb, sizeof(*edl));
+ if (!edl) {
+ bt_dev_err(hdev, "QCA read board ID with no header");
+ err = -EILSEQ;
+ goto out;
+ }
+
+ if (edl->cresp != EDL_CMD_REQ_RES_EVT ||
+ edl->rtype != EDL_GET_BID_REQ_CMD) {
+ bt_dev_err(hdev, "QCA Wrong packet: %d %d", edl->cresp, edl->rtype);
+ err = -EIO;
+ goto out;
+ }
+
+ bid_len = edl->data[0];
+ *bid = (edl->data[1] << 8) + edl->data[2];
+ bt_dev_info(hdev, "%s: bid len = %x, bid = %x", __func__, bid_len, *bid);
+
+out:
+ kfree_skb(skb);
+ return err;
+}
+
int qca_send_pre_shutdown_cmd(struct hci_dev *hdev)
{
struct sk_buff *skb;
@@ -574,6 +616,30 @@ int qca_set_bdaddr_rome(struct hci_dev *hdev, const bdaddr_t *bdaddr)
}
EXPORT_SYMBOL_GPL(qca_set_bdaddr_rome);

+static void qca_generate_nvm_name(struct hci_dev *hdev, char *fwname,
+ size_t max_size, struct qca_btsoc_version ver, u16 bid)
+{
+ u8 rom_ver = 0;
+ u32 soc_ver;
+ const char *variant;
+
+ soc_ver = get_soc_ver(ver.soc_id, ver.rom_ver);
+ rom_ver = ((soc_ver & 0x00000f00) >> 0x04) | (soc_ver & 0x0000000f);
+
+ if ((ver.soc_id & 0x0000ff00) == QCA_HSP_GF_SOC_ID) /* hsp gf chip */
+ variant = "g";
+ else
+ variant = "";
+
+ if (bid == 0x0)
+ snprintf(fwname, max_size, "qca/hpnv%02x%s.bin", rom_ver, variant);
+ else
+ snprintf(fwname, max_size, "qca/hpnv%02x%s.%x",
+ rom_ver, variant, bid);
+
+ bt_dev_info(hdev, "%s: nvm name is %s", __func__, fwname);
+}
+
int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
enum qca_btsoc_type soc_type, struct qca_btsoc_version ver,
const char *firmware_name)
@@ -582,6 +648,7 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
int err;
u8 rom_ver = 0;
u32 soc_ver;
+ u16 boardid = 0;

bt_dev_dbg(hdev, "QCA setup on UART");

@@ -604,6 +671,9 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
if (qca_is_wcn399x(soc_type)) {
snprintf(config.fwname, sizeof(config.fwname),
"qca/crbtfw%02x.tlv", rom_ver);
+ } else if (soc_type == QCA_QCA2066) {
+ snprintf(config.fwname, sizeof(config.fwname),
+ "qca/hpbtfw%02x.tlv", rom_ver);
} else if (soc_type == QCA_QCA6390) {
snprintf(config.fwname, sizeof(config.fwname),
"qca/htbtfw%02x.tlv", rom_ver);
@@ -631,6 +701,9 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
/* Give the controller some time to get ready to receive the NVM */
msleep(10);

+ if (soc_type == QCA_QCA2066)
+ qca_read_fw_board_id(hdev, &boardid);
+
/* Download NVM configuration */
config.type = TLV_TYPE_NVM;
if (firmware_name)
@@ -644,7 +717,9 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
snprintf(config.fwname, sizeof(config.fwname),
"qca/crnv%02x.bin", rom_ver);
}
- }
+ } else if (soc_type == QCA_QCA2066)
+ qca_generate_nvm_name(hdev, config.fwname, sizeof(config.fwname),
+ ver, boardid);
else if (soc_type == QCA_QCA6390)
snprintf(config.fwname, sizeof(config.fwname),
"qca/htnv%02x.bin", rom_ver);
diff --git a/drivers/bluetooth/btqca.h b/drivers/bluetooth/btqca.h
index b884095bcd9d..7c9b3464ae4a 100644
--- a/drivers/bluetooth/btqca.h
+++ b/drivers/bluetooth/btqca.h
@@ -13,6 +13,7 @@
#define EDL_PATCH_TLV_REQ_CMD (0x1E)
#define EDL_GET_BUILD_INFO_CMD (0x20)
#define EDL_NVM_ACCESS_SET_REQ_CMD (0x01)
+#define EDL_GET_BID_REQ_CMD (0x23)
#define EDL_PATCH_CONFIG_CMD (0x28)
#define MAX_SIZE_PER_TLV_SEGMENT (243)
#define QCA_PRE_SHUTDOWN_CMD (0xFC08)
@@ -48,6 +49,8 @@

#define QCA_FW_BUILD_VER_LEN 255

+#define QCA_HSP_GF_SOC_ID 0x1200
+

enum qca_baudrate {
QCA_BAUDRATE_115200 = 0,
@@ -145,6 +148,7 @@ enum qca_btsoc_type {
QCA_WCN3990,
QCA_WCN3998,
QCA_WCN3991,
+ QCA_QCA2066,
QCA_QCA6390,
QCA_WCN6750,
QCA_WCN6855,
diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c
index 1b064504b388..ec24ce451568 100644
--- a/drivers/bluetooth/hci_qca.c
+++ b/drivers/bluetooth/hci_qca.c
@@ -1729,7 +1729,7 @@ static int qca_setup(struct hci_uart *hu)
bt_dev_info(hdev, "setting up %s",
qca_is_wcn399x(soc_type) ? "wcn399x" :
(soc_type == QCA_WCN6750) ? "wcn6750" :
- (soc_type == QCA_WCN6855) ? "wcn6855" : "ROME/QCA6390");
+ (soc_type == QCA_WCN6855) ? "wcn6855" : "ROME/QCA6390/QCA2066");

qca->memdump_state = QCA_MEMDUMP_IDLE;

@@ -1874,6 +1874,11 @@ static const struct qca_device_data qca_soc_data_qca6390 __maybe_unused = {
.num_vregs = 0,
};

+static const struct qca_device_data qca_soc_data_qca2066 = {
+ .soc_type = QCA_QCA2066,
+ .num_vregs = 0,
+};
+
static const struct qca_device_data qca_soc_data_wcn6750 __maybe_unused = {
.soc_type = QCA_WCN6750,
.vregs = (struct qca_vreg []) {
@@ -2364,6 +2369,7 @@ static const struct of_device_id qca_bluetooth_of_match[] = {
{ .compatible = "qcom,wcn3998-bt", .data = &qca_soc_data_wcn3998},
{ .compatible = "qcom,wcn6750-bt", .data = &qca_soc_data_wcn6750},
{ .compatible = "qcom,wcn6855-bt", .data = &qca_soc_data_wcn6855},
+ { .compatible = "qcom,qca2066-bt", .data = &qca_soc_data_qca2066},
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, qca_bluetooth_of_match);
--
2.17.1



2023-05-16 11:02:56

by Paul Menzel

[permalink] [raw]
Subject: Re: [PATCH v3] Bluetooth: hci_qca: Add support for Qualcomm Bluetooth SoC QCA2066

Dear Tim,


Thank you for your patch.

Am 16.05.23 um 12:41 schrieb Tim Jiang:
> This patch adds support for QCA2066 firmware patch and nvm downloading.

Could you please elaborate, what new features are needed for this as you
add common functions?

Please document the datasheet.

> Signed-off-by: Tim Jiang <[email protected]>
> ---
> drivers/bluetooth/btqca.c | 77 ++++++++++++++++++++++++++++++++++++-
> drivers/bluetooth/btqca.h | 4 ++
> drivers/bluetooth/hci_qca.c | 8 +++-
> 3 files changed, 87 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c
> index fd0941fe8608..bd028387cd02 100644
> --- a/drivers/bluetooth/btqca.c
> +++ b/drivers/bluetooth/btqca.c
> @@ -205,6 +205,48 @@ static int qca_send_reset(struct hci_dev *hdev)
> return 0;
> }
>
> +static int qca_read_fw_board_id(struct hci_dev *hdev, u16 *bid)
> +{
> + u8 cmd;
> + struct sk_buff *skb;
> + struct edl_event_hdr *edl;
> + int err = 0;
> + int bid_len;
> +
> + bt_dev_dbg(hdev, "QCA read board ID");
> +
> + cmd = EDL_GET_BID_REQ_CMD;
> + skb = __hci_cmd_sync_ev(hdev, EDL_PATCH_CMD_OPCODE, EDL_PATCH_CMD_LEN,
> + &cmd, 0, HCI_INIT_TIMEOUT);
> + if (IS_ERR(skb)) {
> + err = PTR_ERR(skb);
> + bt_dev_err(hdev, "Reading QCA board ID failed (%d)", err);
> + return err;
> + }
> +
> + edl = skb_pull_data(skb, sizeof(*edl));
> + if (!edl) {
> + bt_dev_err(hdev, "QCA read board ID with no header");
> + err = -EILSEQ;
> + goto out;
> + }
> +
> + if (edl->cresp != EDL_CMD_REQ_RES_EVT ||
> + edl->rtype != EDL_GET_BID_REQ_CMD) {
> + bt_dev_err(hdev, "QCA Wrong packet: %d %d", edl->cresp, edl->rtype);
> + err = -EIO;
> + goto out;
> + }
> +
> + bid_len = edl->data[0];
> + *bid = (edl->data[1] << 8) + edl->data[2];
> + bt_dev_info(hdev, "%s: bid len = %x, bid = %x", __func__, bid_len, *bid);
> +
> +out:
> + kfree_skb(skb);
> + return err;
> +}
> +
> int qca_send_pre_shutdown_cmd(struct hci_dev *hdev)
> {
> struct sk_buff *skb;
> @@ -574,6 +616,30 @@ int qca_set_bdaddr_rome(struct hci_dev *hdev, const bdaddr_t *bdaddr)
> }
> EXPORT_SYMBOL_GPL(qca_set_bdaddr_rome);
>
> +static void qca_generate_nvm_name(struct hci_dev *hdev, char *fwname,
> + size_t max_size, struct qca_btsoc_version ver, u16 bid)
> +{
> + u8 rom_ver = 0;
> + u32 soc_ver;

Any reason to fix the size of the variables?

> + const char *variant;
> +
> + soc_ver = get_soc_ver(ver.soc_id, ver.rom_ver);
> + rom_ver = ((soc_ver & 0x00000f00) >> 0x04) | (soc_ver & 0x0000000f);
> +
> + if ((ver.soc_id & 0x0000ff00) == QCA_HSP_GF_SOC_ID) /* hsp gf chip */
> + variant = "g";
> + else
> + variant = "";
> +
> + if (bid == 0x0)
> + snprintf(fwname, max_size, "qca/hpnv%02x%s.bin", rom_ver, variant);
> + else
> + snprintf(fwname, max_size, "qca/hpnv%02x%s.%x",
> + rom_ver, variant, bid);

Use consistent line wrapping?

> +
> + bt_dev_info(hdev, "%s: nvm name is %s", __func__, fwname);
> +}
> +
> int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
> enum qca_btsoc_type soc_type, struct qca_btsoc_version ver,
> const char *firmware_name)
> @@ -582,6 +648,7 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
> int err;
> u8 rom_ver = 0;
> u32 soc_ver;
> + u16 boardid = 0;
>
> bt_dev_dbg(hdev, "QCA setup on UART");
>
> @@ -604,6 +671,9 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
> if (qca_is_wcn399x(soc_type)) {
> snprintf(config.fwname, sizeof(config.fwname),
> "qca/crbtfw%02x.tlv", rom_ver);
> + } else if (soc_type == QCA_QCA2066) {
> + snprintf(config.fwname, sizeof(config.fwname),
> + "qca/hpbtfw%02x.tlv", rom_ver);
> } else if (soc_type == QCA_QCA6390) {
> snprintf(config.fwname, sizeof(config.fwname),
> "qca/htbtfw%02x.tlv", rom_ver);
> @@ -631,6 +701,9 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
> /* Give the controller some time to get ready to receive the NVM */
> msleep(10);
>
> + if (soc_type == QCA_QCA2066)
> + qca_read_fw_board_id(hdev, &boardid);
> +
> /* Download NVM configuration */
> config.type = TLV_TYPE_NVM;
> if (firmware_name)
> @@ -644,7 +717,9 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
> snprintf(config.fwname, sizeof(config.fwname),
> "qca/crnv%02x.bin", rom_ver);
> }
> - }
> + } else if (soc_type == QCA_QCA2066)
> + qca_generate_nvm_name(hdev, config.fwname, sizeof(config.fwname),
> + ver, boardid);

The coding style requires { } around branches, once it’s used in any branch.

> else if (soc_type == QCA_QCA6390)
> snprintf(config.fwname, sizeof(config.fwname),
> "qca/htnv%02x.bin", rom_ver);
> diff --git a/drivers/bluetooth/btqca.h b/drivers/bluetooth/btqca.h
> index b884095bcd9d..7c9b3464ae4a 100644
> --- a/drivers/bluetooth/btqca.h
> +++ b/drivers/bluetooth/btqca.h
> @@ -13,6 +13,7 @@
> #define EDL_PATCH_TLV_REQ_CMD (0x1E)
> #define EDL_GET_BUILD_INFO_CMD (0x20)
> #define EDL_NVM_ACCESS_SET_REQ_CMD (0x01)
> +#define EDL_GET_BID_REQ_CMD (0x23)
> #define EDL_PATCH_CONFIG_CMD (0x28)
> #define MAX_SIZE_PER_TLV_SEGMENT (243)
> #define QCA_PRE_SHUTDOWN_CMD (0xFC08)
> @@ -48,6 +49,8 @@
>
> #define QCA_FW_BUILD_VER_LEN 255
>
> +#define QCA_HSP_GF_SOC_ID 0x1200
> +
>
> enum qca_baudrate {
> QCA_BAUDRATE_115200 = 0,
> @@ -145,6 +148,7 @@ enum qca_btsoc_type {
> QCA_WCN3990,
> QCA_WCN3998,
> QCA_WCN3991,
> + QCA_QCA2066,
> QCA_QCA6390,
> QCA_WCN6750,
> QCA_WCN6855,
> diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c
> index 1b064504b388..ec24ce451568 100644
> --- a/drivers/bluetooth/hci_qca.c
> +++ b/drivers/bluetooth/hci_qca.c
> @@ -1729,7 +1729,7 @@ static int qca_setup(struct hci_uart *hu)
> bt_dev_info(hdev, "setting up %s",
> qca_is_wcn399x(soc_type) ? "wcn399x" :
> (soc_type == QCA_WCN6750) ? "wcn6750" :
> - (soc_type == QCA_WCN6855) ? "wcn6855" : "ROME/QCA6390");
> + (soc_type == QCA_WCN6855) ? "wcn6855" : "ROME/QCA6390/QCA2066");
>
> qca->memdump_state = QCA_MEMDUMP_IDLE;
>
> @@ -1874,6 +1874,11 @@ static const struct qca_device_data qca_soc_data_qca6390 __maybe_unused = {
> .num_vregs = 0,
> };
>
> +static const struct qca_device_data qca_soc_data_qca2066 = {
> + .soc_type = QCA_QCA2066,
> + .num_vregs = 0,
> +};
> +
> static const struct qca_device_data qca_soc_data_wcn6750 __maybe_unused = {
> .soc_type = QCA_WCN6750,
> .vregs = (struct qca_vreg []) {
> @@ -2364,6 +2369,7 @@ static const struct of_device_id qca_bluetooth_of_match[] = {
> { .compatible = "qcom,wcn3998-bt", .data = &qca_soc_data_wcn3998},
> { .compatible = "qcom,wcn6750-bt", .data = &qca_soc_data_wcn6750},
> { .compatible = "qcom,wcn6855-bt", .data = &qca_soc_data_wcn6855},
> + { .compatible = "qcom,qca2066-bt", .data = &qca_soc_data_qca2066},

Sort it?

> { /* sentinel */ }
> };
> MODULE_DEVICE_TABLE(of, qca_bluetooth_of_match);


Kind regards,

Paul

2023-05-16 11:46:18

by bluez.test.bot

[permalink] [raw]
Subject: RE: [v3] Bluetooth: hci_qca: Add support for Qualcomm Bluetooth SoC QCA2066

This is automated email and please do not reply to this email!

Dear submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=747936

---Test result---

Test Summary:
CheckPatch FAIL 1.54 seconds
GitLint PASS 0.35 seconds
SubjectPrefix PASS 0.13 seconds
BuildKernel PASS 32.68 seconds
CheckAllWarning PASS 36.26 seconds
CheckSparse WARNING 40.98 seconds
CheckSmatch PASS 110.76 seconds
BuildKernel32 PASS 31.97 seconds
TestRunnerSetup PASS 456.37 seconds
TestRunner_l2cap-tester PASS 17.27 seconds
TestRunner_iso-tester PASS 21.45 seconds
TestRunner_bnep-tester PASS 5.68 seconds
TestRunner_mgmt-tester PASS 117.50 seconds
TestRunner_rfcomm-tester PASS 9.33 seconds
TestRunner_sco-tester PASS 8.43 seconds
TestRunner_ioctl-tester PASS 9.87 seconds
TestRunner_mesh-tester PASS 7.24 seconds
TestRunner_smp-tester PASS 8.28 seconds
TestRunner_userchan-tester PASS 6.00 seconds
IncrementalBuild PASS 30.11 seconds

Details
##############################
Test: CheckPatch - FAIL
Desc: Run checkpatch.pl script
Output:
[v3] Bluetooth: hci_qca: Add support for Qualcomm Bluetooth SoC QCA2066
WARNING: DT compatible string "qcom,qca2066-bt" appears un-documented -- check ./Documentation/devicetree/bindings/
#280: FILE: drivers/bluetooth/hci_qca.c:2372:
+ { .compatible = "qcom,qca2066-bt", .data = &qca_soc_data_qca2066},

total: 0 errors, 1 warnings, 161 lines checked

NOTE: For some of the reported defects, checkpatch may be able to
mechanically convert to the typical style using --fix or --fix-inplace.

/github/workspace/src/src/13242913.patch has style problems, please review.

NOTE: Ignored message types: UNKNOWN_COMMIT_ID

NOTE: If any of the errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.


##############################
Test: CheckSparse - WARNING
Desc: Run sparse tool with linux kernel
Output:
drivers/bluetooth/btqca.c:629:17: warning: restricted __le32 degrades to integerdrivers/bluetooth/btqca.c:713:24: warning: restricted __le32 degrades to integer


---
Regards,
Linux Bluetooth

2023-05-16 19:09:32

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH v3] Bluetooth: hci_qca: Add support for Qualcomm Bluetooth SoC QCA2066

Hi Tim,

kernel test robot noticed the following build warnings:

[auto build test WARNING on bluetooth-next/master]
[also build test WARNING on linus/master v6.4-rc2 next-20230516]
[cannot apply to bluetooth/master]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/Tim-Jiang/Bluetooth-hci_qca-Add-support-for-Qualcomm-Bluetooth-SoC-QCA2066/20230516-205113
base: https://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next.git master
patch link: https://lore.kernel.org/r/20230516104102.30775-1-quic_tjiang%40quicinc.com
patch subject: [PATCH v3] Bluetooth: hci_qca: Add support for Qualcomm Bluetooth SoC QCA2066
config: x86_64-randconfig-x084
compiler: clang version 14.0.6 (https://github.com/llvm/llvm-project f28c006a5895fc0e329fe15fead81e37457cb1d1)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/5e4f945fc8ec4dd47f2bcfc12091a919738dd4fe
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Tim-Jiang/Bluetooth-hci_qca-Add-support-for-Qualcomm-Bluetooth-SoC-QCA2066/20230516-205113
git checkout 5e4f945fc8ec4dd47f2bcfc12091a919738dd4fe
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=x86_64 olddefconfig
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash drivers/bluetooth/

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <[email protected]>
| Link: https://lore.kernel.org/oe-kbuild-all/[email protected]/

All warnings (new ones prefixed by >>):

>> drivers/bluetooth/hci_qca.c:1877:37: warning: unused variable 'qca_soc_data_qca2066' [-Wunused-const-variable]
static const struct qca_device_data qca_soc_data_qca2066 = {
^
1 warning generated.


vim +/qca_soc_data_qca2066 +1877 drivers/bluetooth/hci_qca.c

1876
> 1877 static const struct qca_device_data qca_soc_data_qca2066 = {
1878 .soc_type = QCA_QCA2066,
1879 .num_vregs = 0,
1880 };
1881

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests


Attachments:
(No filename) (2.61 kB)
config (127.85 kB)
Download all attachments

2023-05-16 20:42:14

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH v3] Bluetooth: hci_qca: Add support for Qualcomm Bluetooth SoC QCA2066

Hi Tim,

kernel test robot noticed the following build warnings:

[auto build test WARNING on bluetooth-next/master]
[also build test WARNING on linus/master v6.4-rc2 next-20230516]
[cannot apply to bluetooth/master]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/Tim-Jiang/Bluetooth-hci_qca-Add-support-for-Qualcomm-Bluetooth-SoC-QCA2066/20230516-205113
base: https://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next.git master
patch link: https://lore.kernel.org/r/20230516104102.30775-1-quic_tjiang%40quicinc.com
patch subject: [PATCH v3] Bluetooth: hci_qca: Add support for Qualcomm Bluetooth SoC QCA2066
config: x86_64-randconfig-r014-20230515
compiler: gcc-11 (Debian 11.3.0-12) 11.3.0
reproduce (this is a W=1 build):
# https://github.com/intel-lab-lkp/linux/commit/5e4f945fc8ec4dd47f2bcfc12091a919738dd4fe
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Tim-Jiang/Bluetooth-hci_qca-Add-support-for-Qualcomm-Bluetooth-SoC-QCA2066/20230516-205113
git checkout 5e4f945fc8ec4dd47f2bcfc12091a919738dd4fe
# save the config file
mkdir build_dir && cp config build_dir/.config
make W=1 O=build_dir ARCH=x86_64 olddefconfig
make W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash drivers/bluetooth/

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <[email protected]>
| Link: https://lore.kernel.org/oe-kbuild-all/[email protected]/

All warnings (new ones prefixed by >>):

>> drivers/bluetooth/hci_qca.c:1877:37: warning: 'qca_soc_data_qca2066' defined but not used [-Wunused-const-variable=]
1877 | static const struct qca_device_data qca_soc_data_qca2066 = {
| ^~~~~~~~~~~~~~~~~~~~


vim +/qca_soc_data_qca2066 +1877 drivers/bluetooth/hci_qca.c

1876
> 1877 static const struct qca_device_data qca_soc_data_qca2066 = {
1878 .soc_type = QCA_QCA2066,
1879 .num_vregs = 0,
1880 };
1881

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests


Attachments:
(No filename) (2.32 kB)
config (157.76 kB)
Download all attachments

2023-05-17 02:58:18

by Tim Jiang

[permalink] [raw]
Subject: RE: [PATCH v3] Bluetooth: hci_qca: Add support for Qualcomm Bluetooth SoC QCA2066

Paul :
Thanks for comments, please see inline comments.

-----Original Message-----
From: Paul Menzel <[email protected]>
Sent: Tuesday, May 16, 2023 7:00 PM
To: Tim Jiang (QUIC) <[email protected]>
Cc: [email protected]; [email protected]; [email protected]; [email protected]; Balakrishna Godavarthi (QUIC) <[email protected]>; Hemant Gupta (QUIC) <[email protected]>; [email protected]
Subject: Re: [PATCH v3] Bluetooth: hci_qca: Add support for Qualcomm Bluetooth SoC QCA2066

Dear Tim,


Thank you for your patch.

Am 16.05.23 um 12:41 schrieb Tim Jiang:
> This patch adds support for QCA2066 firmware patch and nvm downloading.

Could you please elaborate, what new features are needed for this as you add common functions?

Please document the datasheet.
[Tim] no new feature, only support new chip qca2066 btfw downloading

> Signed-off-by: Tim Jiang <[email protected]>
> ---
> drivers/bluetooth/btqca.c | 77 ++++++++++++++++++++++++++++++++++++-
> drivers/bluetooth/btqca.h | 4 ++
> drivers/bluetooth/hci_qca.c | 8 +++-
> 3 files changed, 87 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c
> index fd0941fe8608..bd028387cd02 100644
> --- a/drivers/bluetooth/btqca.c
> +++ b/drivers/bluetooth/btqca.c
> @@ -205,6 +205,48 @@ static int qca_send_reset(struct hci_dev *hdev)
> return 0;
> }
>
> +static int qca_read_fw_board_id(struct hci_dev *hdev, u16 *bid) {
> + u8 cmd;
> + struct sk_buff *skb;
> + struct edl_event_hdr *edl;
> + int err = 0;
> + int bid_len;
> +
> + bt_dev_dbg(hdev, "QCA read board ID");
> +
> + cmd = EDL_GET_BID_REQ_CMD;
> + skb = __hci_cmd_sync_ev(hdev, EDL_PATCH_CMD_OPCODE, EDL_PATCH_CMD_LEN,
> + &cmd, 0, HCI_INIT_TIMEOUT);
> + if (IS_ERR(skb)) {
> + err = PTR_ERR(skb);
> + bt_dev_err(hdev, "Reading QCA board ID failed (%d)", err);
> + return err;
> + }
> +
> + edl = skb_pull_data(skb, sizeof(*edl));
> + if (!edl) {
> + bt_dev_err(hdev, "QCA read board ID with no header");
> + err = -EILSEQ;
> + goto out;
> + }
> +
> + if (edl->cresp != EDL_CMD_REQ_RES_EVT ||
> + edl->rtype != EDL_GET_BID_REQ_CMD) {
> + bt_dev_err(hdev, "QCA Wrong packet: %d %d", edl->cresp, edl->rtype);
> + err = -EIO;
> + goto out;
> + }
> +
> + bid_len = edl->data[0];
> + *bid = (edl->data[1] << 8) + edl->data[2];
> + bt_dev_info(hdev, "%s: bid len = %x, bid = %x", __func__, bid_len,
> +*bid);
> +
> +out:
> + kfree_skb(skb);
> + return err;
> +}
> +
> int qca_send_pre_shutdown_cmd(struct hci_dev *hdev)
> {
> struct sk_buff *skb;
> @@ -574,6 +616,30 @@ int qca_set_bdaddr_rome(struct hci_dev *hdev, const bdaddr_t *bdaddr)
> }
> EXPORT_SYMBOL_GPL(qca_set_bdaddr_rome);
>
> +static void qca_generate_nvm_name(struct hci_dev *hdev, char *fwname,
> + size_t max_size, struct qca_btsoc_version ver, u16 bid) {
> + u8 rom_ver = 0;
> + u32 soc_ver;

Any reason to fix the size of the variables?
[Tim] sorry , I does not got your point

> + const char *variant;
> +
> + soc_ver = get_soc_ver(ver.soc_id, ver.rom_ver);
> + rom_ver = ((soc_ver & 0x00000f00) >> 0x04) | (soc_ver & 0x0000000f);
> +
> + if ((ver.soc_id & 0x0000ff00) == QCA_HSP_GF_SOC_ID) /* hsp gf chip */
> + variant = "g";
> + else
> + variant = "";
> +
> + if (bid == 0x0)
> + snprintf(fwname, max_size, "qca/hpnv%02x%s.bin", rom_ver, variant);
> + else
> + snprintf(fwname, max_size, "qca/hpnv%02x%s.%x",
> + rom_ver, variant, bid);

Use consistent line wrapping?
[Tim] will resolve in v4 version


> +
> + bt_dev_info(hdev, "%s: nvm name is %s", __func__, fwname); }
> +
> int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
> enum qca_btsoc_type soc_type, struct qca_btsoc_version ver,
> const char *firmware_name)
> @@ -582,6 +648,7 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
> int err;
> u8 rom_ver = 0;
> u32 soc_ver;
> + u16 boardid = 0;
>
> bt_dev_dbg(hdev, "QCA setup on UART");
>
> @@ -604,6 +671,9 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
> if (qca_is_wcn399x(soc_type)) {
> snprintf(config.fwname, sizeof(config.fwname),
> "qca/crbtfw%02x.tlv", rom_ver);
> + } else if (soc_type == QCA_QCA2066) {
> + snprintf(config.fwname, sizeof(config.fwname),
> + "qca/hpbtfw%02x.tlv", rom_ver);
> } else if (soc_type == QCA_QCA6390) {
> snprintf(config.fwname, sizeof(config.fwname),
> "qca/htbtfw%02x.tlv", rom_ver);
> @@ -631,6 +701,9 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
> /* Give the controller some time to get ready to receive the NVM */
> msleep(10);
>
> + if (soc_type == QCA_QCA2066)
> + qca_read_fw_board_id(hdev, &boardid);
> +
> /* Download NVM configuration */
> config.type = TLV_TYPE_NVM;
> if (firmware_name)
> @@ -644,7 +717,9 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
> snprintf(config.fwname, sizeof(config.fwname),
> "qca/crnv%02x.bin", rom_ver);
> }
> - }
> + } else if (soc_type == QCA_QCA2066)
> + qca_generate_nvm_name(hdev, config.fwname, sizeof(config.fwname),
> + ver, boardid);

The coding style requires { } around branches, once it’s used in any branch.
[Tim] will addressed it in v4 version

> else if (soc_type == QCA_QCA6390)
> snprintf(config.fwname, sizeof(config.fwname),
> "qca/htnv%02x.bin", rom_ver);
> diff --git a/drivers/bluetooth/btqca.h b/drivers/bluetooth/btqca.h
> index b884095bcd9d..7c9b3464ae4a 100644
> --- a/drivers/bluetooth/btqca.h
> +++ b/drivers/bluetooth/btqca.h
> @@ -13,6 +13,7 @@
> #define EDL_PATCH_TLV_REQ_CMD (0x1E)
> #define EDL_GET_BUILD_INFO_CMD (0x20)
> #define EDL_NVM_ACCESS_SET_REQ_CMD (0x01)
> +#define EDL_GET_BID_REQ_CMD (0x23)
> #define EDL_PATCH_CONFIG_CMD (0x28)
> #define MAX_SIZE_PER_TLV_SEGMENT (243)
> #define QCA_PRE_SHUTDOWN_CMD (0xFC08)
> @@ -48,6 +49,8 @@
>
> #define QCA_FW_BUILD_VER_LEN 255
>
> +#define QCA_HSP_GF_SOC_ID 0x1200
> +
>
> enum qca_baudrate {
> QCA_BAUDRATE_115200 = 0,
> @@ -145,6 +148,7 @@ enum qca_btsoc_type {
> QCA_WCN3990,
> QCA_WCN3998,
> QCA_WCN3991,
> + QCA_QCA2066,
> QCA_QCA6390,
> QCA_WCN6750,
> QCA_WCN6855,
> diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c
> index 1b064504b388..ec24ce451568 100644
> --- a/drivers/bluetooth/hci_qca.c
> +++ b/drivers/bluetooth/hci_qca.c
> @@ -1729,7 +1729,7 @@ static int qca_setup(struct hci_uart *hu)
> bt_dev_info(hdev, "setting up %s",
> qca_is_wcn399x(soc_type) ? "wcn399x" :
> (soc_type == QCA_WCN6750) ? "wcn6750" :
> - (soc_type == QCA_WCN6855) ? "wcn6855" : "ROME/QCA6390");
> + (soc_type == QCA_WCN6855) ? "wcn6855" : "ROME/QCA6390/QCA2066");
>
> qca->memdump_state = QCA_MEMDUMP_IDLE;
>
> @@ -1874,6 +1874,11 @@ static const struct qca_device_data qca_soc_data_qca6390 __maybe_unused = {
> .num_vregs = 0,
> };
>
> +static const struct qca_device_data qca_soc_data_qca2066 = {
> + .soc_type = QCA_QCA2066,
> + .num_vregs = 0,
> +};
> +
> static const struct qca_device_data qca_soc_data_wcn6750 __maybe_unused = {
> .soc_type = QCA_WCN6750,
> .vregs = (struct qca_vreg []) {
> @@ -2364,6 +2369,7 @@ static const struct of_device_id qca_bluetooth_of_match[] = {
> { .compatible = "qcom,wcn3998-bt", .data = &qca_soc_data_wcn3998},
> { .compatible = "qcom,wcn6750-bt", .data = &qca_soc_data_wcn6750},
> { .compatible = "qcom,wcn6855-bt", .data = &qca_soc_data_wcn6855},
> + { .compatible = "qcom,qca2066-bt", .data = &qca_soc_data_qca2066},

Sort it?
[Tim] it have been sorted or please guide me how to sort it ?

> { /* sentinel */ }
> };
> MODULE_DEVICE_TABLE(of, qca_bluetooth_of_match);


Kind regards,

Paul

2023-05-17 12:43:54

by Paul Menzel

[permalink] [raw]
Subject: Re: [PATCH v3] Bluetooth: hci_qca: Add support for Qualcomm Bluetooth SoC QCA2066

Dear Tim,


Am 17.05.23 um 04:46 schrieb Tim Jiang (QUIC):
> Paul :
> Thanks for comments, please see inline comments.

Thank you for your reply. (It’d be great, if you used an email client,
that can properly quote/cite like Mozilla Thunderbird.)

> -----Original Message-----
> From: Paul Menzel <[email protected]>
> Sent: Tuesday, May 16, 2023 7:00 PM

> Am 16.05.23 um 12:41 schrieb Tim Jiang:
>> This patch adds support for QCA2066 firmware patch and nvm downloading.
>
> Could you please elaborate, what new features are needed for this as you add common functions?
>
> Please document the datasheet.
> [Tim] no new feature, only support new chip qca2066 btfw downloading

As I wrote, you add common functions like `qca_read_fw_board_id()`,
which were not required before. So please elaborate in the commit message.

>> Signed-off-by: Tim Jiang <[email protected]>
>> ---
>> drivers/bluetooth/btqca.c | 77 ++++++++++++++++++++++++++++++++++++-
>> drivers/bluetooth/btqca.h | 4 ++
>> drivers/bluetooth/hci_qca.c | 8 +++-
>> 3 files changed, 87 insertions(+), 2 deletions(-)

[…]

>> @@ -574,6 +616,30 @@ int qca_set_bdaddr_rome(struct hci_dev *hdev, const bdaddr_t *bdaddr)
>> }
>> EXPORT_SYMBOL_GPL(qca_set_bdaddr_rome);
>>
>> +static void qca_generate_nvm_name(struct hci_dev *hdev, char *fwname,
>> + size_t max_size, struct qca_btsoc_version ver, u16 bid) {
>> + u8 rom_ver = 0;
>> + u32 soc_ver;
>
> Any reason to fix the size of the variables?
> [Tim] sorry , I does not got your point

Why can’t you simply use `unsigned int` [1]?

[…]

>> diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c
>> index 1b064504b388..ec24ce451568 100644
>> --- a/drivers/bluetooth/hci_qca.c
>> +++ b/drivers/bluetooth/hci_qca.c
>> @@ -1729,7 +1729,7 @@ static int qca_setup(struct hci_uart *hu)
>> bt_dev_info(hdev, "setting up %s",
>> qca_is_wcn399x(soc_type) ? "wcn399x" :
>> (soc_type == QCA_WCN6750) ? "wcn6750" :
>> - (soc_type == QCA_WCN6855) ? "wcn6855" : "ROME/QCA6390");
>> + (soc_type == QCA_WCN6855) ? "wcn6855" : "ROME/QCA6390/QCA2066");
>>
>> qca->memdump_state = QCA_MEMDUMP_IDLE;
>>
>> @@ -1874,6 +1874,11 @@ static const struct qca_device_data qca_soc_data_qca6390 __maybe_unused = {
>> .num_vregs = 0,
>> };
>>
>> +static const struct qca_device_data qca_soc_data_qca2066 = {
>> + .soc_type = QCA_QCA2066,
>> + .num_vregs = 0,
>> +};
>> +
>> static const struct qca_device_data qca_soc_data_wcn6750 __maybe_unused = {
>> .soc_type = QCA_WCN6750,
>> .vregs = (struct qca_vreg []) {
>> @@ -2364,6 +2369,7 @@ static const struct of_device_id qca_bluetooth_of_match[] = {
>> { .compatible = "qcom,wcn3998-bt", .data = &qca_soc_data_wcn3998},
>> { .compatible = "qcom,wcn6750-bt", .data = &qca_soc_data_wcn6750},
>> { .compatible = "qcom,wcn6855-bt", .data = &qca_soc_data_wcn6855},
>> + { .compatible = "qcom,qca2066-bt", .data = &qca_soc_data_qca2066},
>
> Sort it?
> [Tim] it have been sorted or please guide me how to sort it ?

Sort it lexicographically, that means, q goes before w.

>> { /* sentinel */ }
>> };
>> MODULE_DEVICE_TABLE(of, qca_bluetooth_of_match);


Kind regards,

Paul

2023-05-18 03:31:32

by Tim Jiang

[permalink] [raw]
Subject: RE: [PATCH v3] Bluetooth: hci_qca: Add support for Qualcomm Bluetooth SoC QCA2066

Paul:
Inline comments.
Regards.
Tim


-----Original Message-----
From: Paul Menzel <[email protected]>
Sent: Wednesday, May 17, 2023 8:28 PM
To: Tim Jiang (QUIC) <[email protected]>
Cc: [email protected]; [email protected]; [email protected]; [email protected]; Balakrishna Godavarthi (QUIC) <[email protected]>; Hemant Gupta (QUIC) <[email protected]>; [email protected]
Subject: Re: [PATCH v3] Bluetooth: hci_qca: Add support for Qualcomm Bluetooth SoC QCA2066

Dear Tim,


Am 17.05.23 um 04:46 schrieb Tim Jiang (QUIC):
> Paul :
> Thanks for comments, please see inline comments.

Thank you for your reply. (It’d be great, if you used an email client, that can properly quote/cite like Mozilla Thunderbird.)

> -----Original Message-----
> From: Paul Menzel <[email protected]>
> Sent: Tuesday, May 16, 2023 7:00 PM

> Am 16.05.23 um 12:41 schrieb Tim Jiang:
>> This patch adds support for QCA2066 firmware patch and nvm downloading.
>
> Could you please elaborate, what new features are needed for this as you add common functions?
>
> Please document the datasheet.
> [Tim] no new feature, only support new chip qca2066 btfw downloading

As I wrote, you add common functions like `qca_read_fw_board_id()`, which were not required before. So please elaborate in the commit message.
[Tim] got it , will address it in v5 version

>> Signed-off-by: Tim Jiang <[email protected]>
>> ---
>> drivers/bluetooth/btqca.c | 77 ++++++++++++++++++++++++++++++++++++-
>> drivers/bluetooth/btqca.h | 4 ++
>> drivers/bluetooth/hci_qca.c | 8 +++-
>> 3 files changed, 87 insertions(+), 2 deletions(-)

[…]

>> @@ -574,6 +616,30 @@ int qca_set_bdaddr_rome(struct hci_dev *hdev, const bdaddr_t *bdaddr)
>> }
>> EXPORT_SYMBOL_GPL(qca_set_bdaddr_rome);
>>
>> +static void qca_generate_nvm_name(struct hci_dev *hdev, char *fwname,
>> + size_t max_size, struct qca_btsoc_version ver, u16 bid) {
>> + u8 rom_ver = 0;
>> + u32 soc_ver;
>
> Any reason to fix the size of the variables?
> [Tim] sorry , I does not got your point

Why can’t you simply use `unsigned int` [1]?
[Tim] you can refer to function qca_uart_setup , which also use u32

[…]

>> diff --git a/drivers/bluetooth/hci_qca.c
>> b/drivers/bluetooth/hci_qca.c index 1b064504b388..ec24ce451568 100644
>> --- a/drivers/bluetooth/hci_qca.c
>> +++ b/drivers/bluetooth/hci_qca.c
>> @@ -1729,7 +1729,7 @@ static int qca_setup(struct hci_uart *hu)
>> bt_dev_info(hdev, "setting up %s",
>> qca_is_wcn399x(soc_type) ? "wcn399x" :
>> (soc_type == QCA_WCN6750) ? "wcn6750" :
>> - (soc_type == QCA_WCN6855) ? "wcn6855" : "ROME/QCA6390");
>> + (soc_type == QCA_WCN6855) ? "wcn6855" : "ROME/QCA6390/QCA2066");
>>
>> qca->memdump_state = QCA_MEMDUMP_IDLE;
>>
>> @@ -1874,6 +1874,11 @@ static const struct qca_device_data qca_soc_data_qca6390 __maybe_unused = {
>> .num_vregs = 0,
>> };
>>
>> +static const struct qca_device_data qca_soc_data_qca2066 = {
>> + .soc_type = QCA_QCA2066,
>> + .num_vregs = 0,
>> +};
>> +
>> static const struct qca_device_data qca_soc_data_wcn6750 __maybe_unused = {
>> .soc_type = QCA_WCN6750,
>> .vregs = (struct qca_vreg []) {
>> @@ -2364,6 +2369,7 @@ static const struct of_device_id qca_bluetooth_of_match[] = {
>> { .compatible = "qcom,wcn3998-bt", .data = &qca_soc_data_wcn3998},
>> { .compatible = "qcom,wcn6750-bt", .data = &qca_soc_data_wcn6750},
>> { .compatible = "qcom,wcn6855-bt", .data =
>> &qca_soc_data_wcn6855},
>> + { .compatible = "qcom,qca2066-bt", .data = &qca_soc_data_qca2066},
>
> Sort it?
> [Tim] it have been sorted or please guide me how to sort it ?

Sort it lexicographically, that means, q goes before w.
[Tim] will address in v5 version.


>> { /* sentinel */ }
>> };
>> MODULE_DEVICE_TABLE(of, qca_bluetooth_of_match);


Kind regards,

Paul