Revert "Bluetooth: btusb: Configure altsetting for HCI_USER_CHANNEL"
authorHsin-chen Chuang <chharry@chromium.org>
Wed, 16 Apr 2025 09:53:37 +0000 (09:53 +0000)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Wed, 21 May 2025 14:28:08 +0000 (10:28 -0400)
This reverts commit 75ddcd5ad40ecd9fbc9f5a7a2ed0e1e74921db3c.

This patch doesn't work quite well - It's observed that with this patch
HFP is flaky on most of the existing USB Bluetooth controllers: Intel
chips sometimes send out no packet for Transparent codec; MTK chips may
generate SCO data with a wrong handle for CVSD codec; RTK could split
the data with a wrong packet size for Transparent codec; ... etc.

Cc: chromeos-bluetooth-upstreaming@chromium.org
Signed-off-by: Hsin-chen Chuang <chharry@chromium.org>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
drivers/bluetooth/Kconfig
drivers/bluetooth/btusb.c

index 7771edf54fb3f1a7b9ddb5a2eae467e463f102ba..4ab32abf0f48644715d4c27ec0d2fdaccef62b76 100644 (file)
@@ -56,18 +56,6 @@ config BT_HCIBTUSB_POLL_SYNC
          Say Y here to enable USB poll_sync for Bluetooth USB devices by
          default.
 
-config BT_HCIBTUSB_AUTO_ISOC_ALT
-       bool "Automatically adjust alternate setting for Isoc endpoints"
-       depends on BT_HCIBTUSB
-       default y if CHROME_PLATFORMS
-       help
-         Say Y here to automatically adjusting the alternate setting for
-         HCI_USER_CHANNEL whenever a SCO link is established.
-
-         When enabled, btusb intercepts the HCI_EV_SYNC_CONN_COMPLETE packets
-         and configures isoc endpoint alternate setting automatically when
-         HCI_USER_CHANNEL is in use.
-
 config BT_HCIBTUSB_BCM
        bool "Broadcom protocol support"
        depends on BT_HCIBTUSB
index 80670c8459783622f43d6bbbc55e1cbe48fadca4..c5a2007cfeedfbd284fb72e4a501600b36f071ea 100644 (file)
@@ -35,7 +35,6 @@ static bool force_scofix;
 static bool enable_autosuspend = IS_ENABLED(CONFIG_BT_HCIBTUSB_AUTOSUSPEND);
 static bool enable_poll_sync = IS_ENABLED(CONFIG_BT_HCIBTUSB_POLL_SYNC);
 static bool reset = true;
-static bool auto_isoc_alt = IS_ENABLED(CONFIG_BT_HCIBTUSB_AUTO_ISOC_ALT);
 
 static struct usb_driver btusb_driver;
 
@@ -1122,42 +1121,6 @@ static inline void btusb_free_frags(struct btusb_data *data)
        spin_unlock_irqrestore(&data->rxlock, flags);
 }
 
-static void btusb_sco_connected(struct btusb_data *data, struct sk_buff *skb)
-{
-       struct hci_event_hdr *hdr = (void *) skb->data;
-       struct hci_ev_sync_conn_complete *ev =
-               (void *) skb->data + sizeof(*hdr);
-       struct hci_dev *hdev = data->hdev;
-       unsigned int notify_air_mode;
-
-       if (hci_skb_pkt_type(skb) != HCI_EVENT_PKT)
-               return;
-
-       if (skb->len < sizeof(*hdr) || hdr->evt != HCI_EV_SYNC_CONN_COMPLETE)
-               return;
-
-       if (skb->len != sizeof(*hdr) + sizeof(*ev) || ev->status)
-               return;
-
-       switch (ev->air_mode) {
-       case BT_CODEC_CVSD:
-               notify_air_mode = HCI_NOTIFY_ENABLE_SCO_CVSD;
-               break;
-
-       case BT_CODEC_TRANSPARENT:
-               notify_air_mode = HCI_NOTIFY_ENABLE_SCO_TRANSP;
-               break;
-
-       default:
-               return;
-       }
-
-       bt_dev_info(hdev, "enabling SCO with air mode %u", ev->air_mode);
-       data->sco_num = 1;
-       data->air_mode = notify_air_mode;
-       schedule_work(&data->work);
-}
-
 static int btusb_recv_event(struct btusb_data *data, struct sk_buff *skb)
 {
        if (data->intr_interval) {
@@ -1165,10 +1128,6 @@ static int btusb_recv_event(struct btusb_data *data, struct sk_buff *skb)
                schedule_delayed_work(&data->rx_work, 0);
        }
 
-       /* Configure altsetting for HCI_USER_CHANNEL on SCO connected */
-       if (auto_isoc_alt && hci_dev_test_flag(data->hdev, HCI_USER_CHANNEL))
-               btusb_sco_connected(data, skb);
-
        return data->recv_event(data->hdev, skb);
 }