Skip to content

Commit cc569d7

Browse files
ChrisCH-Lugregkh
authored andcommitted
Bluetooth: btusb: mediatek: add intf release flow when usb disconnect
commit 489304e upstream. 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> Cc: Fedor Pchelkin <boddah8794@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 9da1cfc commit cc569d7

File tree

1 file changed

+15
-5
lines changed

1 file changed

+15
-5
lines changed

drivers/bluetooth/btusb.c

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2644,9 +2644,9 @@ static void btusb_mtk_claim_iso_intf(struct btusb_data *data)
26442644
init_usb_anchor(&btmtk_data->isopkt_anchor);
26452645
}
26462646

2647-
static void btusb_mtk_release_iso_intf(struct btusb_data *data)
2647+
static void btusb_mtk_release_iso_intf(struct hci_dev *hdev)
26482648
{
2649-
struct btmtk_data *btmtk_data = hci_get_priv(data->hdev);
2649+
struct btmtk_data *btmtk_data = hci_get_priv(hdev);
26502650

26512651
if (btmtk_data->isopkt_intf) {
26522652
usb_kill_anchored_urbs(&btmtk_data->isopkt_anchor);
@@ -2662,6 +2662,16 @@ static void btusb_mtk_release_iso_intf(struct btusb_data *data)
26622662
clear_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags);
26632663
}
26642664

2665+
static int btusb_mtk_disconnect(struct hci_dev *hdev)
2666+
{
2667+
/* This function describes the specific additional steps taken by MediaTek
2668+
* when Bluetooth usb driver's resume function is called.
2669+
*/
2670+
btusb_mtk_release_iso_intf(hdev);
2671+
2672+
return 0;
2673+
}
2674+
26652675
static int btusb_mtk_reset(struct hci_dev *hdev, void *rst_data)
26662676
{
26672677
struct btusb_data *data = hci_get_drvdata(hdev);
@@ -2679,7 +2689,7 @@ static int btusb_mtk_reset(struct hci_dev *hdev, void *rst_data)
26792689
return err;
26802690

26812691
if (test_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags))
2682-
btusb_mtk_release_iso_intf(data);
2692+
btusb_mtk_release_iso_intf(hdev);
26832693

26842694
btusb_stop_traffic(data);
26852695
usb_kill_anchored_urbs(&data->tx_anchor);
@@ -2733,14 +2743,13 @@ static int btusb_mtk_setup(struct hci_dev *hdev)
27332743

27342744
static int btusb_mtk_shutdown(struct hci_dev *hdev)
27352745
{
2736-
struct btusb_data *data = hci_get_drvdata(hdev);
27372746
struct btmtk_data *btmtk_data = hci_get_priv(hdev);
27382747
int ret;
27392748

27402749
ret = btmtk_usb_shutdown(hdev);
27412750

27422751
if (test_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags))
2743-
btusb_mtk_release_iso_intf(data);
2752+
btusb_mtk_release_iso_intf(hdev);
27442753

27452754
return ret;
27462755
}
@@ -3854,6 +3863,7 @@ static int btusb_probe(struct usb_interface *intf,
38543863
data->recv_acl = btmtk_usb_recv_acl;
38553864
data->suspend = btmtk_usb_suspend;
38563865
data->resume = btmtk_usb_resume;
3866+
data->disconnect = btusb_mtk_disconnect;
38573867
}
38583868

38593869
if (id->driver_info & BTUSB_SWAVE) {

0 commit comments

Comments
 (0)