Re: [PATCH v5 06/11] Bluetooth: btintel: Fix the LED is not turning off immediately
From: Marcel Holtmann <marcel@holtmann.org>
Date: 2021-07-29 19:37:08
Hi Tedd,
quoted hunk ↗ jump to hunk
Some platforms have an issue with BT LED when the interface is down or BT radio is turned off, which takes 5 seconds to BT LED goes off. This command turns off the BT LED immediately. This patch sends the Intel vendor command to turn off the LED. Signed-off-by: Tedd Ho-Jeong An <redacted> --- drivers/bluetooth/btintel.c | 17 +++++++++++++++++ drivers/bluetooth/btintel.h | 1 + drivers/bluetooth/btusb.c | 11 +++++++++-- 3 files changed, 27 insertions(+), 2 deletions(-)diff --git a/drivers/bluetooth/btintel.c b/drivers/bluetooth/btintel.c index 65ecf2ae9a10..4e72d806387c 100644 --- a/drivers/bluetooth/btintel.c +++ b/drivers/bluetooth/btintel.c@@ -1757,7 +1757,9 @@ EXPORT_SYMBOL_GPL(btintel_setup_combined);int btintel_shutdown_combined(struct hci_dev *hdev) { + struct btintel_data *intel = hci_get_priv(hdev); struct sk_buff *skb; + int ret; /* Send HCI Reset to the controller to stop any BT activity which * were triggered. This will help to save power and maintain the@@ -1770,6 +1772,21 @@ int btintel_shutdown_combined(struct hci_dev *hdev)} kfree_skb(skb); + + /* Some platforms have an issue with BT LED when the interface is + * down or BT radio is turned off, which takes 5 seconds to BT LED + * goes off. This command turns off the BT LED immediately. + */ + if (test_bit(INTEL_BROKEN_LED, &intel->flags)) { + skb = __hci_cmd_sync(hdev, 0xfc3f, 0, NULL, HCI_INIT_TIMEOUT); + if (IS_ERR(skb)) { + ret = PTR_ERR(skb); + bt_dev_err(hdev, "turning off Intel device LED failed"); + return ret; + } + kfree_skb(skb); + } + return 0; } EXPORT_SYMBOL_GPL(btintel_shutdown_combined);diff --git a/drivers/bluetooth/btintel.h b/drivers/bluetooth/btintel.h index 29b678364a79..4a35762c3220 100644 --- a/drivers/bluetooth/btintel.h +++ b/drivers/bluetooth/btintel.h@@ -144,6 +144,7 @@ struct intel_debug_features {#define INTEL_FIRMWARE_FAILED 3 #define INTEL_BOOTING 4 #define INTEL_BROKEN_READ_VERSION 5 +#define INTEL_BROKEN_LED 6 struct btintel_data { unsigned long flags;diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index a64473c525eb..8f87c600d026 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c@@ -63,6 +63,7 @@ static struct usb_driver btusb_driver;#define BTUSB_INTEL_NEWGEN 0x2000000 #define BTUSB_INTEL_COMBINED 0x4000000 #define BTUSB_INTEL_BROKEN_READ_VERSION 0x8000000 +#define BTUSB_INTEL_BROKEN_LED 0x10000000 static const struct usb_device_id btusb_table[] = { /* Generic Bluetooth USB device */@@ -378,13 +379,16 @@ static const struct usb_device_id blacklist_table[] = {BTUSB_VALID_LE_STATES }, { USB_DEVICE(0x8087, 0x07da), .driver_info = BTUSB_CSR }, { USB_DEVICE(0x8087, 0x07dc), .driver_info = BTUSB_INTEL_COMBINED | - BTUSB_INTEL_BROKEN_READ_VERSION }, + BTUSB_INTEL_BROKEN_READ_VERSION | + BTUSB_INTEL_BROKEN_LED }, { USB_DEVICE(0x8087, 0x0a2a), .driver_info = BTUSB_INTEL_COMBINED | - BTUSB_INTEL_BROKEN_READ_VERSION }, + BTUSB_INTEL_BROKEN_READ_VERSION | + BTUSB_INTEL_BROKEN_LED }, { USB_DEVICE(0x8087, 0x0a2b), .driver_info = BTUSB_INTEL_NEW | BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x8087, 0x0aa7), .driver_info = BTUSB_INTEL_COMBINED | BTUSB_INTEL_BROKEN_READ_VERSION | + BTUSB_INTEL_BROKEN_LED | BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x8087, 0x0aaa), .driver_info = BTUSB_INTEL_NEW | BTUSB_WIDEBAND_SPEECH |
this is something you need to learn from the HCI_Intel_Read_Version information. This should not bleed into the USB driver. Regards Marcel