Bluetooth: Add device shutdown routine for Intel Bluetooth device
PATCH v2 2/2 Bluetooth: Add device shutdown routine for Intel Bluetooth device
From: Tedd Ho-Jeong An <[email protected]>
This patch adds the device shutdown routine for Intel Bluetooth device.
Some platforms have BT LED issue with Intel Bluetooth device that BT LED goes off 5 seconds after BT is turned off
For Intel Bluetooth device, the BT LED is turned off when:
- there is no active connection or radio activity
- USB is suspend
So, when the BT is turned off, it takes 5 seconds because USB suspend timeone is 5 seconds by default. And if the USB suspend is not enabled, BT LED won't be turned off.
To fix this issue, recently Intel Bluetooth firmware patch had been submitted to turn off the BT LED immediately by the vendor specific command(0xFC3F). And this patch sends this command to the device before closing the device.
For backward compatibility of this command with old firmware, this command was supported before, but it behaves same as HCI_RESET internally. So, it won't be the problem even if the system doesn't have the latest firmware patch.
--- drivers/bluetooth/btusb.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)
drivers/bluetooth/btusb.c +22 -0
@@ -2331,6 +2331,27 @@ static int btusb_set_bdaddr_intel(struct hci_dev *hdev, const bdaddr_t *bdaddr)return 0 ; } +static int btusb_shutdown_intel (struct hci_dev *hdev) +{ +struct sk_buff *skb; +long ret; + +/* Some platforms have an issue with BT LED when hci 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. +*/ + skb =__hci_cmd_sync (hdev,0xfc3f ,0 ,NULL ,HCI_INIT_TIMEOUT ); +if (IS_ERR (skb)) { + ret =PTR_ERR (skb); +BT_ERR ("%s: turning off Intel device LED failed (%ld)" , + hdev->name, ret); +return ret; + } +kfree_skb (skb); + +return 0 ; +} +static int btusb_set_bdaddr_marvell (struct hci_dev *hdev,const bdaddr_t *bdaddr) {
@@ -2708,6 +2729,7 @@ static int btusb_probe(struct usb_interface *intf,if (id->driver_info &BTUSB_INTEL ) { hdev->setup = btusb_setup_intel; + hdev->shutdown = btusb_shutdown_intel; hdev->set_bdaddr = btusb_set_bdaddr_intel;set_bit (HCI_QUIRK_STRICT_DUPLICATE_FILTER , &hdev->quirks); }
Signature · 1 line
1.9.1
Marcel Holtmann
maintainerHi Tedd,
Quoted 33 lines
This patch adds the device shutdown routine for Intel Bluetooth device.
Some platforms have BT LED issue with Intel Bluetooth device that BT LED goes off 5 seconds after BT is turned off
For Intel Bluetooth device, the BT LED is turned off when:
- there is no active connection or radio activity
- USB is suspendSo, when the BT is turned off, it takes 5 seconds because USB suspend timeone is 5 seconds by default. And if the USB suspend is not enabled, BT LED won't be turned off.
To fix this issue, recently Intel Bluetooth firmware patch had been submitted to turn off the BT LED immediately by the vendor specific command(0xFC3F). And this patch sends this command to the device before closing the device.
For backward compatibility of this command with old firmware, this command was supported before, but it behaves same as
HCI_RESETinternally. So, it won't be the problem even if the system doesn't have the latest firmware patch.Signed-off-by Tedd Ho-Jeong An <[email protected]>---
drivers/bluetooth/btusb.c| 22 ++++++++++++++++++++++1 file changed, 22 insertions(+)drivers/bluetooth/btusb.c +0
-0@@ -2331,6 +2331,27 @@ static int btusb_set_bdaddr_intel(struct hci_dev *hdev, const bdaddr_t *bdaddr)return 0 ; }
drivers/bluetooth/btusb.c static int btusb_set_bdaddr_intel(struct hci_dev *hdev, const bdaddr_t *bdaddr) · line 2342
Quoted 10 lines
drivers/bluetooth/btusb.c +9
-0+static int btusb_shutdown_intel (struct hci_dev *hdev) +{ +struct sk_buff *skb; +long ret; + +/* Some platforms have an issue with BT LED when hci 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. +*/
you need to make sure that you are not exceeding the 78 chars limit with your comment. I fixed that up before applying the patch.
drivers/bluetooth/btusb.c static int btusb_set_bdaddr_intel(struct hci_dev *hdev, const bdaddr_t *bdaddr) · line 2354
Quoted 12 lines
drivers/bluetooth/btusb.c +12
-0+ skb =__hci_cmd_sync (hdev,0xfc3f ,0 ,NULL ,HCI_INIT_TIMEOUT ); +if (IS_ERR (skb)) { + ret =PTR_ERR (skb); +BT_ERR ("%s: turning off Intel device LED failed (%ld)" , + hdev->name, ret); +return ret; + } +kfree_skb (skb); + +return 0 ; +} +
Patch has been applied to bluetooth-next tree.
Regards
Marcel