summaryrefslogtreecommitdiffstats
path: root/drivers/bluetooth/btintel.c
diff options
context:
space:
mode:
authorTedd Ho-Jeong An <tedd.an@intel.com>2021-08-05 02:32:13 +0200
committerMarcel Holtmann <marcel@holtmann.org>2021-08-05 16:03:29 +0200
commitffcba827c0a1d81933d4fdc35b925d150cee7dec (patch)
tree964dec54d4b420218a2e6df78d968998cffad2df /drivers/bluetooth/btintel.c
parentBluetooth: btintel: Fix the first HCI command not work with ROM device (diff)
downloadlinux-ffcba827c0a1d81933d4fdc35b925d150cee7dec.tar.xz
linux-ffcba827c0a1d81933d4fdc35b925d150cee7dec.zip
Bluetooth: btintel: Fix the LED is not turning off immediately
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 <tedd.an@intel.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'drivers/bluetooth/btintel.c')
-rw-r--r--drivers/bluetooth/btintel.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/drivers/bluetooth/btintel.c b/drivers/bluetooth/btintel.c
index 8e6b497a2164..fd947a8798a9 100644
--- a/drivers/bluetooth/btintel.c
+++ b/drivers/bluetooth/btintel.c
@@ -1737,6 +1737,13 @@ static int btintel_setup_combined(struct hci_dev *hdev)
case 0x07: /* WP */
case 0x08: /* StP */
/* Legacy ROM product */
+
+ /* These devices have an issue with LED which doesn't
+ * go off immediately during shutdown. Set the flag
+ * here to send the LED OFF command during shutdown.
+ */
+ btintel_set_flag(hdev, INTEL_BROKEN_LED);
+
err = btintel_legacy_rom_setup(hdev, &ver);
break;
case 0x0b: /* SfP */
@@ -1785,6 +1792,7 @@ exit_error:
static int btintel_shutdown_combined(struct hci_dev *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
@@ -1797,6 +1805,21 @@ static 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 (btintel_test_flag(hdev, INTEL_BROKEN_LED)) {
+ 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;
}