mirror of
https://github.com/torvalds/linux
synced 2024-09-06 18:01:05 +00:00
Bluetooth: HCI: Add HCI_QUIRK_BROKEN_ENHANCED_SETUP_SYNC_CONN quirk
This adds HCI_QUIRK_BROKEN_ENHANCED_SETUP_SYNC_CONN quirk which can be used to mark HCI_Enhanced_Setup_Synchronous_Connection as broken even if its support command bit are set since some controller report it as supported but the command don't work properly with some configurations (e.g. BT_VOICE_TRANSPARENT/mSBC). Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
This commit is contained in:
parent
72ef98445a
commit
05abad8572
|
@ -265,6 +265,15 @@ enum {
|
|||
* runtime suspend, because event filtering takes place there.
|
||||
*/
|
||||
HCI_QUIRK_BROKEN_FILTER_CLEAR_ALL,
|
||||
|
||||
/*
|
||||
* When this quirk is set, disables the use of
|
||||
* HCI_OP_ENHANCED_SETUP_SYNC_CONN command to setup SCO connections.
|
||||
*
|
||||
* This quirk can be set before hci_register_dev is called or
|
||||
* during the hdev->setup vendor callback.
|
||||
*/
|
||||
HCI_QUIRK_BROKEN_ENHANCED_SETUP_SYNC_CONN,
|
||||
};
|
||||
|
||||
/* HCI device flags */
|
||||
|
|
|
@ -1495,8 +1495,12 @@ void hci_conn_del_sysfs(struct hci_conn *conn);
|
|||
#define privacy_mode_capable(dev) (use_ll_privacy(dev) && \
|
||||
(hdev->commands[39] & 0x04))
|
||||
|
||||
/* Use enhanced synchronous connection if command is supported */
|
||||
#define enhanced_sco_capable(dev) ((dev)->commands[29] & 0x08)
|
||||
/* Use enhanced synchronous connection if command is supported and its quirk
|
||||
* has not been set.
|
||||
*/
|
||||
#define enhanced_sync_conn_capable(dev) \
|
||||
(((dev)->commands[29] & 0x08) && \
|
||||
!test_bit(HCI_QUIRK_BROKEN_ENHANCED_SETUP_SYNC_CONN, &(dev)->quirks))
|
||||
|
||||
/* Use ext scanning if set ext scan param and ext scan enable is supported */
|
||||
#define use_ext_scan(dev) (((dev)->commands[37] & 0x20) && \
|
||||
|
|
|
@ -481,7 +481,7 @@ static bool hci_setup_sync_conn(struct hci_conn *conn, __u16 handle)
|
|||
|
||||
bool hci_setup_sync(struct hci_conn *conn, __u16 handle)
|
||||
{
|
||||
if (enhanced_sco_capable(conn->hdev))
|
||||
if (enhanced_sync_conn_capable(conn->hdev))
|
||||
return hci_enhanced_setup_sync_conn(conn, handle);
|
||||
|
||||
return hci_setup_sync_conn(conn, handle);
|
||||
|
|
|
@ -890,7 +890,7 @@ static int sco_sock_setsockopt(struct socket *sock, int level, int optname,
|
|||
err = -EBADFD;
|
||||
break;
|
||||
}
|
||||
if (enhanced_sco_capable(hdev) &&
|
||||
if (enhanced_sync_conn_capable(hdev) &&
|
||||
voice.setting == BT_VOICE_TRANSPARENT)
|
||||
sco_pi(sk)->codec.id = BT_CODEC_TRANSPARENT;
|
||||
hci_dev_put(hdev);
|
||||
|
|
Loading…
Reference in a new issue