]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
Bluetooth: btusb: mediatek: refactor the function btusb_mtk_reset
authorHao Qin <hao.qin@mediatek.com>
Wed, 15 May 2024 23:15:19 +0000 (16:15 -0700)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Mon, 15 Jul 2024 01:33:27 +0000 (21:33 -0400)
Extract the function btusb_mtk_subsys_reset from the btusb_mtk_reset
for the future handling of resetting bluetooth controller without
the USB reset.

Co-developed-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Hao Qin <hao.qin@mediatek.com>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
drivers/bluetooth/btusb.c

index 611135d1ce01a073e521e3ebfc065f90e7d50a7e..602456e94fdb669c9657f6d56e4f429b3974b639 100644 (file)
@@ -3033,28 +3033,13 @@ static u32 btusb_mtk_reset_done(struct hci_dev *hdev)
        return val & MTK_BT_RST_DONE;
 }
 
-static int btusb_mtk_reset(struct hci_dev *hdev, void *rst_data)
+static int btusb_mtk_subsys_reset(struct hci_dev *hdev, u32 dev_id)
 {
        struct btusb_data *data = hci_get_drvdata(hdev);
-       struct btmediatek_data *mediatek;
        u32 val;
        int err;
 
-       /* It's MediaTek specific bluetooth reset mechanism via USB */
-       if (test_and_set_bit(BTUSB_HW_RESET_ACTIVE, &data->flags)) {
-               bt_dev_err(hdev, "last reset failed? Not resetting again");
-               return -EBUSY;
-       }
-
-       err = usb_autopm_get_interface(data->intf);
-       if (err < 0)
-               return err;
-
-       btusb_stop_traffic(data);
-       usb_kill_anchored_urbs(&data->tx_anchor);
-       mediatek = hci_get_priv(hdev);
-
-       if (mediatek->dev_id == 0x7925) {
+       if (dev_id == 0x7925) {
                btusb_mtk_uhw_reg_read(data, MTK_BT_RESET_REG_CONNV3, &val);
                val |= (1 << 5);
                btusb_mtk_uhw_reg_write(data, MTK_BT_RESET_REG_CONNV3, val);
@@ -3098,8 +3083,32 @@ static int btusb_mtk_reset(struct hci_dev *hdev, void *rst_data)
        if (!val)
                bt_dev_err(hdev, "Can't get device id, subsys reset fail.");
 
-       usb_queue_reset_device(data->intf);
+       return err;
+}
 
+static int btusb_mtk_reset(struct hci_dev *hdev, void *rst_data)
+{
+       struct btusb_data *data = hci_get_drvdata(hdev);
+       struct btmediatek_data *mtk_data;
+       int err;
+
+       /* It's MediaTek specific bluetooth reset mechanism via USB */
+       if (test_and_set_bit(BTUSB_HW_RESET_ACTIVE, &data->flags)) {
+               bt_dev_err(hdev, "last reset failed? Not resetting again");
+               return -EBUSY;
+       }
+
+       err = usb_autopm_get_interface(data->intf);
+       if (err < 0)
+               return err;
+
+       btusb_stop_traffic(data);
+       usb_kill_anchored_urbs(&data->tx_anchor);
+       mtk_data = hci_get_priv(hdev);
+
+       err = btusb_mtk_subsys_reset(hdev, mtk_data->dev_id);
+
+       usb_queue_reset_device(data->intf);
        clear_bit(BTUSB_HW_RESET_ACTIVE, &data->flags);
 
        return err;