summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorChris Lu <chris.lu@mediatek.com>2024-09-23 16:47:04 +0800
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2024-11-14 15:25:35 -0500
commit489304e67087abddc2666c5af0159cb95afdcf59 (patch)
tree68e36ffb379fff8cc52159a10073a64552850bcb /drivers
parentcea1805f165cdd783dd21f26df957118cb8641b4 (diff)
downloadlwn-489304e67087abddc2666c5af0159cb95afdcf59.tar.gz
lwn-489304e67087abddc2666c5af0159cb95afdcf59.zip
Bluetooth: btusb: mediatek: add intf release flow when usb disconnect
MediaTek claim an special usb intr interface for ISO data transmission. The interface need to be released before unregistering hci device when usb disconnect. Removing BT usb dongle without properly releasing the interface may cause Kernel panic while unregister hci device. Signed-off-by: Chris Lu <chris.lu@mediatek.com> Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/bluetooth/btusb.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index f528d28615fc..79c178cd5db7 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -2619,9 +2619,9 @@ static void btusb_mtk_claim_iso_intf(struct btusb_data *data)
set_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags);
}
-static void btusb_mtk_release_iso_intf(struct btusb_data *data)
+static void btusb_mtk_release_iso_intf(struct hci_dev *hdev)
{
- struct btmtk_data *btmtk_data = hci_get_priv(data->hdev);
+ struct btmtk_data *btmtk_data = hci_get_priv(hdev);
if (btmtk_data->isopkt_intf) {
usb_kill_anchored_urbs(&btmtk_data->isopkt_anchor);
@@ -2637,6 +2637,16 @@ static void btusb_mtk_release_iso_intf(struct btusb_data *data)
clear_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags);
}
+static int btusb_mtk_disconnect(struct hci_dev *hdev)
+{
+ /* This function describes the specific additional steps taken by MediaTek
+ * when Bluetooth usb driver's resume function is called.
+ */
+ btusb_mtk_release_iso_intf(hdev);
+
+ return 0;
+}
+
static int btusb_mtk_reset(struct hci_dev *hdev, void *rst_data)
{
struct btusb_data *data = hci_get_drvdata(hdev);
@@ -2654,7 +2664,7 @@ static int btusb_mtk_reset(struct hci_dev *hdev, void *rst_data)
return err;
if (test_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags))
- btusb_mtk_release_iso_intf(data);
+ btusb_mtk_release_iso_intf(hdev);
btusb_stop_traffic(data);
usb_kill_anchored_urbs(&data->tx_anchor);
@@ -2708,14 +2718,13 @@ static int btusb_mtk_setup(struct hci_dev *hdev)
static int btusb_mtk_shutdown(struct hci_dev *hdev)
{
- struct btusb_data *data = hci_get_drvdata(hdev);
struct btmtk_data *btmtk_data = hci_get_priv(hdev);
int ret;
ret = btmtk_usb_shutdown(hdev);
if (test_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags))
- btusb_mtk_release_iso_intf(data);
+ btusb_mtk_release_iso_intf(hdev);
return ret;
}
@@ -3829,6 +3838,7 @@ static int btusb_probe(struct usb_interface *intf,
data->recv_acl = btmtk_usb_recv_acl;
data->suspend = btmtk_usb_suspend;
data->resume = btmtk_usb_resume;
+ data->disconnect = btusb_mtk_disconnect;
}
if (id->driver_info & BTUSB_SWAVE) {