summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorhyungseoung.yoo <hyungseoung.yoo@samsung.com>2011-11-18 13:57:01 +0900
committerNitin Garg <nitin.garg@freescale.com>2014-04-21 22:34:43 -0500
commite5618c9ee9963ef875e3bef8299fbaad38250b40 (patch)
tree1b6ae067c66e8bef4bab8d116e013f7cdde21c42 /net
parent87a5fcb37103fca1f4a78dcc11ae74a1ef6e852a (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 db9132107695..49d5c941c9c7 100644..100755
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -1748,6 +1748,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 void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
{
struct hci_ev_conn_request *ev = (void *) skb->data;
@@ -1795,7 +1804,8 @@ static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
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 */