diff options
Diffstat (limited to 'net/bluetooth/hci_event.c')
| -rw-r--r-- | net/bluetooth/hci_event.c | 28 | 
1 files changed, 22 insertions, 6 deletions
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 32e21ad36a6..4fd2cf3bcd0 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c @@ -1365,6 +1365,9 @@ static bool hci_resolve_next_name(struct hci_dev *hdev)  		return false;  	e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED); +	if (!e) +		return false; +  	if (hci_resolve_name(hdev, e) == 0) {  		e->name_state = NAME_PENDING;  		return true; @@ -1393,12 +1396,20 @@ static void hci_check_pending_name(struct hci_dev *hdev, struct hci_conn *conn,  		return;  	e = hci_inquiry_cache_lookup_resolve(hdev, bdaddr, NAME_PENDING); -	if (e) { +	/* If the device was not found in a list of found devices names of which +	 * are pending. there is no need to continue resolving a next name as it +	 * will be done upon receiving another Remote Name Request Complete +	 * Event */ +	if (!e) +		return; + +	list_del(&e->list); +	if (name) {  		e->name_state = NAME_KNOWN; -		list_del(&e->list); -		if (name) -			mgmt_remote_name(hdev, bdaddr, ACL_LINK, 0x00, -					 e->data.rssi, name, name_len); +		mgmt_remote_name(hdev, bdaddr, ACL_LINK, 0x00, +				 e->data.rssi, name, name_len); +	} else { +		e->name_state = NAME_NOT_KNOWN;  	}  	if (hci_resolve_next_name(hdev)) @@ -1749,7 +1760,12 @@ static void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)  		if (conn->type == ACL_LINK) {  			conn->state = BT_CONFIG;  			hci_conn_hold(conn); -			conn->disc_timeout = HCI_DISCONN_TIMEOUT; + +			if (!conn->out && !hci_conn_ssp_enabled(conn) && +			    !hci_find_link_key(hdev, &ev->bdaddr)) +				conn->disc_timeout = HCI_PAIRING_TIMEOUT; +			else +				conn->disc_timeout = HCI_DISCONN_TIMEOUT;  		} else  			conn->state = BT_CONNECTED;  |