* [PATCH v2 2/4] Bluetooth: add quirk for broken address properties
[not found] <20240318110855.31954-1-johan+linaro@kernel.org>
@ 2024-03-18 11:08 ` Johan Hovold
2024-03-18 11:08 ` [PATCH v2 3/4] Bluetooth: qca: fix device-address endianness Johan Hovold
2024-03-18 11:08 ` [PATCH v2 4/4] Bluetooth: qca: fix wcn3991 'local-bd-address' endianness Johan Hovold
2 siblings, 0 replies; 3+ messages in thread
From: Johan Hovold @ 2024-03-18 11:08 UTC (permalink / raw)
To: Marcel Holtmann, Luiz Augusto von Dentz
Cc: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Johan Hedberg,
Matthias Kaehlcke, Doug Anderson, Bjorn Andersson, Konrad Dybcio,
linux-bluetooth, linux-arm-msm, netdev, devicetree, linux-kernel,
Johan Hovold, stable
Some Bluetooth controllers lack persistent storage for the device
address and instead one can be provided by the boot firmware using the
'local-bd-address' devicetree property.
The Bluetooth devicetree bindings clearly states that the address should
be specified in little-endian order, but due to a long-standing bug in
the Qualcomm driver which reversed the address some bootloaders have
been providing the address in big-endian order instead.
Add a new quirk that can be used to mark deprecated compatible strings
that expect such broken devicetree properties and use it to reverse the
address when parsing the property so that the underlying driver bug can
be fixed.
Fixes: 5c0a1001c8be ("Bluetooth: hci_qca: Add helper to set device address")
Cc: stable@vger.kernel.org # 5.1
Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
---
include/net/bluetooth/hci.h | 10 ++++++++++
net/bluetooth/hci_sync.c | 5 ++++-
2 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h
index bdee5d649cc6..556cffed5698 100644
--- a/include/net/bluetooth/hci.h
+++ b/include/net/bluetooth/hci.h
@@ -176,6 +176,16 @@ enum {
*/
HCI_QUIRK_USE_BDADDR_PROPERTY,
+ /* When this quirk is set, the Bluetooth Device Address provided by
+ * the 'local-bd-address' fwnode property is incorrectly specified in
+ * big-endian order.
+ *
+ * This quirk can be set before hci_register_dev is called or
+ * during the hdev->setup vendor callback and must only be used for
+ * deprecated compatible strings.
+ */
+ HCI_QUIRK_BDADDR_PROPERTY_BROKEN,
+
/* When this quirk is set, the duplicate filtering during
* scanning is based on Bluetooth devices addresses. To allow
* RSSI based updates, restart scanning if needed.
diff --git a/net/bluetooth/hci_sync.c b/net/bluetooth/hci_sync.c
index 5716345a26df..283ae8edc1e5 100644
--- a/net/bluetooth/hci_sync.c
+++ b/net/bluetooth/hci_sync.c
@@ -3215,7 +3215,10 @@ static void hci_dev_get_bd_addr_from_property(struct hci_dev *hdev)
if (ret < 0 || !bacmp(&ba, BDADDR_ANY))
return;
- bacpy(&hdev->public_addr, &ba);
+ if (test_bit(HCI_QUIRK_BDADDR_PROPERTY_BROKEN, &hdev->quirks))
+ baswap(&hdev->public_addr, &ba);
+ else
+ bacpy(&hdev->public_addr, &ba);
}
struct hci_init_stage {
--
2.43.2
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH v2 3/4] Bluetooth: qca: fix device-address endianness
[not found] <20240318110855.31954-1-johan+linaro@kernel.org>
2024-03-18 11:08 ` [PATCH v2 2/4] Bluetooth: add quirk for broken address properties Johan Hovold
@ 2024-03-18 11:08 ` Johan Hovold
2024-03-18 11:08 ` [PATCH v2 4/4] Bluetooth: qca: fix wcn3991 'local-bd-address' endianness Johan Hovold
2 siblings, 0 replies; 3+ messages in thread
From: Johan Hovold @ 2024-03-18 11:08 UTC (permalink / raw)
To: Marcel Holtmann, Luiz Augusto von Dentz
Cc: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Johan Hedberg,
Matthias Kaehlcke, Doug Anderson, Bjorn Andersson, Konrad Dybcio,
linux-bluetooth, linux-arm-msm, netdev, devicetree, linux-kernel,
Johan Hovold, stable, Balakrishna Godavarthi, Nikita Travkin
The WCN6855 firmware on the Lenovo ThinkPad X13s expects the Bluetooth
device address in big-endian order when setting it using the
EDL_WRITE_BD_ADDR_OPCODE command.
Presumably, this is the case for all non-ROME devices which all use the
EDL_WRITE_BD_ADDR_OPCODE command for this (unlike the ROME devices which
use a different command and expect the address in little-endian order).
Reverse the little-endian address before setting it to make sure that
the address can be configured using tools like btmgmt or using the
'local-bd-address' devicetree property.
Note that this can potentially break systems with boot firmware which
has started relying on the broken behaviour and is incorrectly passing
the address via devicetree in big-endian order.
Fixes: 5c0a1001c8be ("Bluetooth: hci_qca: Add helper to set device address")
Cc: stable@vger.kernel.org # 5.1
Cc: Balakrishna Godavarthi <quic_bgodavar@quicinc.com>
Cc: Matthias Kaehlcke <mka@chromium.org>
Tested-by: Nikita Travkin <nikita@trvn.ru> # sc7180
Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
---
drivers/bluetooth/btqca.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c
index b40b32fa7f1c..19cfc342fc7b 100644
--- a/drivers/bluetooth/btqca.c
+++ b/drivers/bluetooth/btqca.c
@@ -826,11 +826,15 @@ EXPORT_SYMBOL_GPL(qca_uart_setup);
int qca_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr)
{
+ bdaddr_t bdaddr_swapped;
struct sk_buff *skb;
int err;
- skb = __hci_cmd_sync_ev(hdev, EDL_WRITE_BD_ADDR_OPCODE, 6, bdaddr,
- HCI_EV_VENDOR, HCI_INIT_TIMEOUT);
+ baswap(&bdaddr_swapped, bdaddr);
+
+ skb = __hci_cmd_sync_ev(hdev, EDL_WRITE_BD_ADDR_OPCODE, 6,
+ &bdaddr_swapped, HCI_EV_VENDOR,
+ HCI_INIT_TIMEOUT);
if (IS_ERR(skb)) {
err = PTR_ERR(skb);
bt_dev_err(hdev, "QCA Change address cmd failed (%d)", err);
--
2.43.2
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH v2 4/4] Bluetooth: qca: fix wcn3991 'local-bd-address' endianness
[not found] <20240318110855.31954-1-johan+linaro@kernel.org>
2024-03-18 11:08 ` [PATCH v2 2/4] Bluetooth: add quirk for broken address properties Johan Hovold
2024-03-18 11:08 ` [PATCH v2 3/4] Bluetooth: qca: fix device-address endianness Johan Hovold
@ 2024-03-18 11:08 ` Johan Hovold
2 siblings, 0 replies; 3+ messages in thread
From: Johan Hovold @ 2024-03-18 11:08 UTC (permalink / raw)
To: Marcel Holtmann, Luiz Augusto von Dentz
Cc: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Johan Hedberg,
Matthias Kaehlcke, Doug Anderson, Bjorn Andersson, Konrad Dybcio,
linux-bluetooth, linux-arm-msm, netdev, devicetree, linux-kernel,
Johan Hovold, stable, Balakrishna Godavarthi
Due to a long-standing bug in the Qualcomm Bluetooth driver, the device
address has so far been reversed when configuring the controller.
This has led to one vendor reversing the address provided by the
boot firmware using the 'local-bd-address' devicetree property.
The only device affected by this should be the WCN3991 used in some
Chromebooks. The corresponding compatible string has now been deprecated
so that the underlying driver bug can be fixed without breaking
backwards compatibility.
Set the HCI_QUIRK_BDADDR_PROPERTY_BROKEN quirk for the deprecated
compatible string and add the new 'qcom,wcn3991-bt-bdaddr-le' string to
the match table for boot firmware that conforms with the binding.
Fixes: 7d250a062f75 ("Bluetooth: hci_qca: Add support for Qualcomm Bluetooth SoC WCN3991")
Cc: stable@vger.kernel.org # 5.10
Cc: Balakrishna Godavarthi <quic_bgodavar@quicinc.com>
Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
---
drivers/bluetooth/hci_qca.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c
index f989c05f8177..346274fe66d8 100644
--- a/drivers/bluetooth/hci_qca.c
+++ b/drivers/bluetooth/hci_qca.c
@@ -1904,6 +1904,16 @@ static int qca_setup(struct hci_uart *hu)
case QCA_WCN6855:
case QCA_WCN7850:
set_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks);
+
+ if (soc_type == QCA_WCN3991) {
+ struct device *dev = GET_HCIDEV_DEV(hdev);
+
+ if (device_is_compatible(dev, "qcom,wcn3991-bt")) {
+ set_bit(HCI_QUIRK_BDADDR_PROPERTY_BROKEN,
+ &hdev->quirks);
+ }
+ }
+
hci_set_aosp_capable(hdev);
ret = qca_read_soc_version(hdev, &ver, soc_type);
@@ -2597,6 +2607,7 @@ static const struct of_device_id qca_bluetooth_of_match[] = {
{ .compatible = "qcom,wcn3988-bt", .data = &qca_soc_data_wcn3988},
{ .compatible = "qcom,wcn3990-bt", .data = &qca_soc_data_wcn3990},
{ .compatible = "qcom,wcn3991-bt", .data = &qca_soc_data_wcn3991},
+ { .compatible = "qcom,wcn3991-bt-bdaddr-le", .data = &qca_soc_data_wcn3991},
{ .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},
--
2.43.2
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2024-03-18 11:08 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20240318110855.31954-1-johan+linaro@kernel.org>
2024-03-18 11:08 ` [PATCH v2 2/4] Bluetooth: add quirk for broken address properties Johan Hovold
2024-03-18 11:08 ` [PATCH v2 3/4] Bluetooth: qca: fix device-address endianness Johan Hovold
2024-03-18 11:08 ` [PATCH v2 4/4] Bluetooth: qca: fix wcn3991 'local-bd-address' endianness Johan Hovold
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).