Commit f330734a authored by Hsin-chen Chuang's avatar Hsin-chen Chuang Committed by Luiz Augusto von Dentz
Browse files

Revert "Bluetooth: btusb: Configure altsetting for HCI_USER_CHANNEL"



This reverts commit 75ddcd5a.

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: default avatarHsin-chen Chuang <chharry@chromium.org>
Signed-off-by: default avatarLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
parent 7d70989f
Loading
Loading
Loading
Loading
+0 −12
Original line number Diff line number Diff line
@@ -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
+0 −41
Original line number Diff line number Diff line
@@ -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);
}