All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v4 0/4] Add WCN6855 Bluetooth support
@ 2023-02-07  5:28 Steev Klimaszewski
  2023-02-07  5:28 ` [PATCH v4 1/4] dt-bindings: net: Add WCN6855 Bluetooth Steev Klimaszewski
                   ` (3 more replies)
  0 siblings, 4 replies; 13+ messages in thread
From: Steev Klimaszewski @ 2023-02-07  5:28 UTC (permalink / raw)
  To: Steev Klimaszewski
  Cc: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	Rob Herring, Krzysztof Kozlowski, Andy Gross, Bjorn Andersson,
	Konrad Dybcio, Marcel Holtmann, Johan Hedberg,
	Luiz Augusto von Dentz, Sven Peter, netdev, devicetree,
	linux-kernel, linux-arm-msm, linux-bluetooth, Mark Pearson

This is the 4th version of the patchset, which started out as a bit of an
RFC/RFT but has actually worked so, I think this 4th revision is in a pretty
decent spot, at least in terms of the code itself... that said...

First things first, I do not have access to the specs nor the schematics, so a
lot of this was done via guess work, looking at the acpi tables, and looking at
how a similar device (wcn6750) was added.

This 4th revision does have the regulators added, which were pulled from the
bsrc_bt.bin file from the Windows partition.

The end result is that we do have a working device, but not entirely reliable.

Hopefully by getting this out there, people who do have access to the specs or
schematics can see where the improvements or fixes need to come.

There are a few things that I am not sure why they happen, and don't have the
knowledge level to figure out why they happen or debugging it.

Bluetooth: hci0: setting up wcn6855
Bluetooth: hci0: Frame reassembly failed (-84)
Bluetooth: hci0: QCA Product ID   :0x00000013
Bluetooth: hci0: QCA SOC Version  :0x400c0210
Bluetooth: hci0: QCA ROM Version  :0x00000201
Bluetooth: hci0: QCA Patch Version:0x000038e6
Bluetooth: hci0: QCA controller version 0x02100201
Bluetooth: hci0: unexpected event for opcode 0xfc48
Bluetooth: hci0: Sending QCA Patch config failed (-110)
Bluetooth: hci0: QCA Downloading qca/hpbtfw21.tlv
Bluetooth: hci0: QCA Downloading qca/hpnv21g.bin
Bluetooth: hci0: QCA setup on UART is completed

I do not know why the Frame assembly failed, nor the unexpected event.

Likewise, I'm not entirely sure why it says the patch config send times out, and
*then* seems to send it?

The BD Address also seems to be incorrect, and I'm not sure what is going on
there either.

Testing was done by connecting a Razer Orochi bluetooth mouse, and using it, as
well as connecting to and using an H2GO bluetooth speaker and playing audio out
via canberra-gtk-play as well as a couple of YouTube videos in a browser.

The mouse only seems to work when < 2 ft. from the laptop, and for the speaker, only
"A2DP Sink, codec SBC" would provide audio output, and while I could see that
data was being sent to the speaker, it wasn't always outputting, and going >
4ft. away, would often disconnect.

steev@wintermute:~$ hciconfig -a
hci0:   Type: Primary  Bus: UART
        BD Address: 00:00:00:00:5A:AD  ACL MTU: 1024:8  SCO MTU: 240:4
        UP RUNNING PSCAN
        RX bytes:1492 acl:0 sco:0 events:126 errors:0
        TX bytes:128743 acl:0 sco:0 commands:597 errors:0
        Features: 0xff 0xfe 0x8f 0xfe 0xd8 0x3f 0x5b 0x87
        Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
        Link policy: RSWITCH HOLD SNIFF
        Link mode: PERIPHERAL ACCEPT
        Name: 'wintermute'
        Class: 0x0c010c
        Service Classes: Rendering, Capturing
        Device Class: Computer, Laptop
        HCI Version:  (0xc)  Revision: 0x0
        LMP Version:  (0xc)  Subversion: 0x46f7
        Manufacturer: Qualcomm (29)

steev@wintermute:~$ dmesg | grep Razer
[ 3089.235440] input: Razer Orochi as /devices/virtual/misc/uhid/0005:1532:0056.0003/input/input11
[ 3089.238580] hid-generic 0005:1532:0056.0003: input,hidraw2: BLUETOOTH HID v0.01 Mouse [Razer Orochi] on 00:00:00:00:5a:ad
steev@wintermute:~$ dmesg | grep H2GO
[ 3140.959947] input: H2GO Speaker (AVRCP) as /devices/virtual/input/input12

Bjorn Andersson (1):
  arm64: dts: qcom: sc8280xp: Define uart2

Steev Klimaszewski (3):
  dt-bindings: net: Add WCN6855 Bluetooth
  Bluetooth: hci_qca: Add support for QTI Bluetooth chip wcn6855
  arm64: dts: qcom: thinkpad-x13s: Add bluetooth

 .../net/bluetooth/qualcomm-bluetooth.yaml     | 17 +++++
 .../qcom/sc8280xp-lenovo-thinkpad-x13s.dts    | 76 +++++++++++++++++++
 arch/arm64/boot/dts/qcom/sc8280xp.dtsi        | 14 ++++
 drivers/bluetooth/btqca.c                     | 24 +++++-
 drivers/bluetooth/btqca.h                     | 10 +++
 drivers/bluetooth/hci_qca.c                   | 56 ++++++++++----
 6 files changed, 182 insertions(+), 15 deletions(-)


base-commit: 4fafd96910add124586b549ad005dcd179de8a18
-- 
2.39.0


^ permalink raw reply	[flat|nested] 13+ messages in thread
* Re: [PATCH v1] Bluetooth: hci_qca: Add support for Qualcomm Bluetooth SoC QCA2066
@ 2023-02-08 19:02 Luiz Augusto von Dentz
  2023-02-09  0:59 ` [PATCH v4 2/4] Bluetooth: hci_qca: Add support for QTI Bluetooth chip wcn6855 Steev Klimaszewski
  0 siblings, 1 reply; 13+ messages in thread
From: Luiz Augusto von Dentz @ 2023-02-08 19:02 UTC (permalink / raw)
  To: Tim Jiang
  Cc: marcel, johan.hedberg, linux-kernel, linux-bluetooth,
	linux-arm-msm, quic_bgodavar, quic_hbandi, quic_hemantg, mka

Hi Tim,

On Wed, Feb 8, 2023 at 1:44 AM Tim Jiang <quic_tjiang@quicinc.com> wrote:
>
> This patch adds support for QCA2066, including the devicetree
> and patch/nvm downloading.
>
> Signed-off-by: Tim Jiang <quic_tjiang@quicinc.com>
> ---
>  drivers/bluetooth/btqca.c   | 85 +++++++++++++++++++++++++++++++++++++
>  drivers/bluetooth/btqca.h   |  2 +
>  drivers/bluetooth/hci_qca.c |  6 +++
>  3 files changed, 93 insertions(+)
>
> diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c
> index c9064d34d830..7d00df3a1d61 100644
> --- a/drivers/bluetooth/btqca.c
> +++ b/drivers/bluetooth/btqca.c
> @@ -205,6 +205,55 @@ static int qca_send_reset(struct hci_dev *hdev)
>         return 0;
>  }
>
> +static int qca_read_fw_board_id(struct hci_dev *hdev, u8 *bid)
> +{
> +       u8 cmd;
> +       struct sk_buff *skb;
> +       struct edl_event_hdr *edl;
> +       int err;
> +       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 = (struct edl_event_hdr *)(skb->data);

Please use skb_pull_data that checks if the skb has enough data.

> +       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 received %d %d", edl->cresp,
> +                          edl->rtype);
> +               err = -EIO;
> +               goto out;
> +       }
> +
> +       bid_len = edl->data[0];
> +       bid[0] = edl->data[1];
> +       bid[1] = edl->data[2];
> +       bt_dev_info(hdev, "QCA board ID len %d,id = %x %x", bid_len, bid[0], bid[1]);
> +
> +
> +       err = 0;
> +
> +out:
> +       kfree_skb(skb);
> +       return err;
> +}
> +
> +
>  int qca_send_pre_shutdown_cmd(struct hci_dev *hdev)
>  {
>         struct sk_buff *skb;
> @@ -574,6 +623,32 @@ 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, u8 *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);
> +       bt_dev_info(hdev, "bid == 0x%02x 0x%02x", bid[0], bid[1]);
> +
> +       if ((ver.soc_id & 0x0000ff00) == 0x1200) /*hsp gf chip*/
> +               variant = "g";
> +       else
> +               variant = "";
> +
> +       if (bid[0] == 0 && bid[1] == 0) {
> +               snprintf(fwname, max_size, "qca/hpnv%02x%s.bin", rom_ver, variant);
> +       } else {
> +               snprintf(fwname, max_size, "qca/hpnv%02x%s.%x%02x",
> +                       rom_ver, variant, bid[0], bid[1]);
> +       }
> +       bt_dev_info(hdev, "%s:  %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 +657,7 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
>         int err;
>         u8 rom_ver = 0;
>         u32 soc_ver;
> +       u8 bid[2] = {0};
>
>         bt_dev_dbg(hdev, "QCA setup on UART");
>
> @@ -607,6 +683,9 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
>         } else if (soc_type == QCA_QCA6390) {
>                 snprintf(config.fwname, sizeof(config.fwname),
>                          "qca/htbtfw%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_WCN6750) {
>                 /* Choose mbn file by default.If mbn file is not found
>                  * then choose tlv file
> @@ -628,6 +707,10 @@ 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, bid);
> +
> +
>         /* Download NVM configuration */
>         config.type = TLV_TYPE_NVM;
>         if (firmware_name)
> @@ -645,6 +728,8 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
>         else if (soc_type == QCA_QCA6390)
>                 snprintf(config.fwname, sizeof(config.fwname),
>                          "qca/htnv%02x.bin", rom_ver);
> +       else if (soc_type == QCA_QCA2066)
> +               qca_generate_nvm_name(hdev, config.fwname, sizeof(config.fwname), ver, bid);
>         else if (soc_type == QCA_WCN6750)
>                 snprintf(config.fwname, sizeof(config.fwname),
>                          "qca/msnv%02x.bin", rom_ver);
> diff --git a/drivers/bluetooth/btqca.h b/drivers/bluetooth/btqca.h
> index 61e9a50e66ae..e762c403284a 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)
> @@ -147,6 +148,7 @@ enum qca_btsoc_type {
>         QCA_WCN3991,
>         QCA_QCA6390,
>         QCA_WCN6750,
> +       QCA_QCA2066,
>  };
>
>  #if IS_ENABLED(CONFIG_BT_QCA)
> diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c
> index 3df9e692756a..596f730ff375 100644
> --- a/drivers/bluetooth/hci_qca.c
> +++ b/drivers/bluetooth/hci_qca.c
> @@ -1859,6 +1859,11 @@ static const struct qca_device_data qca_soc_data_qca6390 = {
>         .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 = {
>         .soc_type = QCA_WCN6750,
>         .vregs = (struct qca_vreg []) {
> @@ -2316,6 +2321,7 @@ static SIMPLE_DEV_PM_OPS(qca_pm_ops, qca_suspend, qca_resume);
>  static const struct of_device_id qca_bluetooth_of_match[] = {
>         { .compatible = "qcom,qca6174-bt" },
>         { .compatible = "qcom,qca6390-bt", .data = &qca_soc_data_qca6390},
> +       { .compatible = "qcom,qca2066-bt", .data = &qca_soc_data_qca2066},

Ive been reviewing this changes and I must say I don't like this
pattern of setting a data specific for each soc and then still having
to check what type it is everywhere, it is probably a lot cleaner to
have fields that are soc specific added to qca_device_data directly so
when adding new soc type one just have to update this table.

>         { .compatible = "qcom,qca9377-bt" },
>         { .compatible = "qcom,wcn3990-bt", .data = &qca_soc_data_wcn3990},
>         { .compatible = "qcom,wcn3991-bt", .data = &qca_soc_data_wcn3991},
> --
> The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
>


-- 
Luiz Augusto von Dentz

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2023-02-13  8:28 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-07  5:28 [PATCH v4 0/4] Add WCN6855 Bluetooth support Steev Klimaszewski
2023-02-07  5:28 ` [PATCH v4 1/4] dt-bindings: net: Add WCN6855 Bluetooth Steev Klimaszewski
2023-02-07  5:38   ` Add WCN6855 Bluetooth support bluez.test.bot
2023-02-07  8:05   ` [PATCH v4 1/4] dt-bindings: net: Add WCN6855 Bluetooth Krzysztof Kozlowski
2023-02-07  5:28 ` [PATCH v4 2/4] Bluetooth: hci_qca: Add support for QTI Bluetooth chip wcn6855 Steev Klimaszewski
2023-02-07  5:52   ` Luiz Augusto von Dentz
2023-02-07  5:28 ` [PATCH v4 3/4] arm64: dts: qcom: sc8280xp: Define uart2 Steev Klimaszewski
2023-02-08  8:21   ` Konrad Dybcio
2023-02-07  5:28 ` [PATCH v4 4/4] arm64: dts: qcom: thinkpad-x13s: Add bluetooth Steev Klimaszewski
2023-02-08  8:25   ` Konrad Dybcio
2023-02-08 19:02 [PATCH v1] Bluetooth: hci_qca: Add support for Qualcomm Bluetooth SoC QCA2066 Luiz Augusto von Dentz
2023-02-09  0:59 ` [PATCH v4 2/4] Bluetooth: hci_qca: Add support for QTI Bluetooth chip wcn6855 Steev Klimaszewski
2023-02-09  1:57   ` Luiz Augusto von Dentz
     [not found]   ` <d9a93aae154243baac83b15c8f7ef0ee@quicinc.com>
     [not found]     ` <CABBYNZLi7U21s0ZY8jPvpXs8wbnjrVHtJpdKv6fykoGRD0fjOA@mail.gmail.com>
2023-02-13  8:27       ` Tim Jiang (QUIC)

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.