Bluetooth: hci_sync: Fix not using conn_timeout
When using hci_le_create_conn_sync it shall wait for the conn_timeout
since the connection complete may take longer than just 2 seconds.
Also fix the masking of HCI_EV_LE_ENHANCED_CONN_COMPLETE and
HCI_EV_LE_CONN_COMPLETE so they are never both set so we can predict
which one the controller will use in case of HCI_OP_LE_CREATE_CONN.
Fixes: 6cd29ec6ae ("Bluetooth: hci_sync: Wait for proper events when connecting LE")
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:
committed by
Marcel Holtmann
parent
80740ebb7e
commit
a56a1138cb
@@ -3265,10 +3265,10 @@ static int hci_le_set_event_mask_sync(struct hci_dev *hdev)
|
||||
if (hdev->le_features[0] & HCI_LE_DATA_LEN_EXT)
|
||||
events[0] |= 0x40; /* LE Data Length Change */
|
||||
|
||||
/* If the controller supports LL Privacy feature, enable
|
||||
* the corresponding event.
|
||||
/* If the controller supports LL Privacy feature or LE Extended Adv,
|
||||
* enable the corresponding event.
|
||||
*/
|
||||
if (hdev->le_features[0] & HCI_LE_LL_PRIVACY)
|
||||
if (use_enhanced_conn_complete(hdev))
|
||||
events[1] |= 0x02; /* LE Enhanced Connection Complete */
|
||||
|
||||
/* If the controller supports Extended Scanner Filter
|
||||
@@ -5188,7 +5188,7 @@ int hci_le_ext_create_conn_sync(struct hci_dev *hdev, struct hci_conn *conn,
|
||||
return __hci_cmd_sync_status_sk(hdev, HCI_OP_LE_EXT_CREATE_CONN,
|
||||
plen, data,
|
||||
HCI_EV_LE_ENHANCED_CONN_COMPLETE,
|
||||
HCI_CMD_TIMEOUT, NULL);
|
||||
conn->conn_timeout, NULL);
|
||||
}
|
||||
|
||||
int hci_le_create_conn_sync(struct hci_dev *hdev, struct hci_conn *conn)
|
||||
@@ -5273,9 +5273,18 @@ int hci_le_create_conn_sync(struct hci_dev *hdev, struct hci_conn *conn)
|
||||
cp.min_ce_len = cpu_to_le16(0x0000);
|
||||
cp.max_ce_len = cpu_to_le16(0x0000);
|
||||
|
||||
/* BLUETOOTH CORE SPECIFICATION Version 5.3 | Vol 4, Part E page 2261:
|
||||
*
|
||||
* If this event is unmasked and the HCI_LE_Connection_Complete event
|
||||
* is unmasked, only the HCI_LE_Enhanced_Connection_Complete event is
|
||||
* sent when a new connection has been created.
|
||||
*/
|
||||
err = __hci_cmd_sync_status_sk(hdev, HCI_OP_LE_CREATE_CONN,
|
||||
sizeof(cp), &cp, HCI_EV_LE_CONN_COMPLETE,
|
||||
HCI_CMD_TIMEOUT, NULL);
|
||||
sizeof(cp), &cp,
|
||||
use_enhanced_conn_complete(hdev) ?
|
||||
HCI_EV_LE_ENHANCED_CONN_COMPLETE :
|
||||
HCI_EV_LE_CONN_COMPLETE,
|
||||
conn->conn_timeout, NULL);
|
||||
|
||||
done:
|
||||
/* Re-enable advertising after the connection attempt is finished. */
|
||||
|
||||
Reference in New Issue
Block a user