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>
This commit is contained in:
hyungseoung.yoo
2011-11-18 13:57:01 +09:00
committed by Stephen Boyd
parent f8b7075b04
commit fa388f3bbd

12
net/bluetooth/hci_event.c Normal file → Executable file
View File

@@ -1674,6 +1674,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;
@@ -1719,7 +1728,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 */