summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorhyungseoung.yoo <hyungseoung.yoo@samsung.com>2011-11-18 13:57:01 +0900
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:39:19 -0800
commit14588213f58bfc7719ff98b38623d3c838b45891 (patch)
tree6dd608f61ac542ef4ffd93152fea58062f90d293 /net
parent185720bcf7295deaa65d29926da435d389dfe9a2 (diff)
Bluetooth: Keep master role when SCO or eSCO is active
This improves compatbility with a lot of headset / chipset combinations. Ideally this should not be needed. Change-Id: I8b676701e12e416aa7d60801b9d353b15d102709 Signed-off-by: hyungseoung.yoo <hyungseoung.yoo@samsung.com> Signed-off-by: Jaikumar Ganesh <jaikumarg@android.com>
Diffstat (limited to 'net')
-rwxr-xr-x[-rw-r--r--]net/bluetooth/hci_event.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
index a32571a22bb4..5a7074a7b5b8 100644..100755
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -1462,6 +1462,15 @@ unlock:
hci_conn_check_pending(hdev);
}
+static inline bool is_sco_active(struct hci_dev *hdev)
+{
+ if (hci_conn_hash_lookup_state(hdev, SCO_LINK, BT_CONNECTED) ||
+ (hci_conn_hash_lookup_state(hdev, ESCO_LINK,
+ BT_CONNECTED)))
+ return true;
+ return false;
+}
+
static inline void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
{
struct hci_ev_conn_request *ev = (void *) skb->data;
@@ -1505,7 +1514,8 @@ static inline void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *sk
bacpy(&cp.bdaddr, &ev->bdaddr);
- if (lmp_rswitch_capable(hdev) && (mask & HCI_LM_MASTER))
+ if (lmp_rswitch_capable(hdev) && ((mask & HCI_LM_MASTER)
+ || is_sco_active(hdev)))
cp.role = 0x00; /* Become master */
else
cp.role = 0x01; /* Remain slave */