aboutsummaryrefslogtreecommitdiffstats
path: root/net/bluetooth/hci_conn.c
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2008-07-14 14:13:51 -0400
committerMarcel Holtmann <marcel@holtmann.org>2008-07-14 14:13:51 -0400
commit7d0db0a373195385a2e0b19d1f5e4b186fdcffac (patch)
tree4e82fafd39eb0a32bfb0a340302dd0baf15410e0 /net/bluetooth/hci_conn.c
parent43cbeee9f9b26300275e4e2d55ed1607f8c5f760 (diff)
[Bluetooth] Use a more unique bus name for connections
When attaching Bluetooth low-level connections to the bus, the bus name is constructed from the remote address since at that time the connection handle is not assigned yet. This has worked so far, but also caused a lot of troubles. It is better to postpone the creation of the sysfs entry to the time when the connection actually has been established and then use its connection handle as unique identifier. This also fixes the case where two different adapters try to connect to the same remote device. Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'net/bluetooth/hci_conn.c')
-rw-r--r--net/bluetooth/hci_conn.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
index 0d4b8aeb8e09..ca8d05245ca0 100644
--- a/net/bluetooth/hci_conn.c
+++ b/net/bluetooth/hci_conn.c
@@ -245,8 +245,6 @@ struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst)
245 if (hdev->notify) 245 if (hdev->notify)
246 hdev->notify(hdev, HCI_NOTIFY_CONN_ADD); 246 hdev->notify(hdev, HCI_NOTIFY_CONN_ADD);
247 247
248 hci_conn_add_sysfs(conn);
249
250 tasklet_enable(&hdev->tx_task); 248 tasklet_enable(&hdev->tx_task);
251 249
252 return conn; 250 return conn;
@@ -278,12 +276,14 @@ int hci_conn_del(struct hci_conn *conn)
278 } 276 }
279 277
280 tasklet_disable(&hdev->tx_task); 278 tasklet_disable(&hdev->tx_task);
279
281 hci_conn_hash_del(hdev, conn); 280 hci_conn_hash_del(hdev, conn);
282 if (hdev->notify) 281 if (hdev->notify)
283 hdev->notify(hdev, HCI_NOTIFY_CONN_DEL); 282 hdev->notify(hdev, HCI_NOTIFY_CONN_DEL);
283
284 tasklet_enable(&hdev->tx_task); 284 tasklet_enable(&hdev->tx_task);
285
285 skb_queue_purge(&conn->data_q); 286 skb_queue_purge(&conn->data_q);
286 hci_conn_del_sysfs(conn);
287 287
288 return 0; 288 return 0;
289} 289}
@@ -532,6 +532,8 @@ void hci_conn_hash_flush(struct hci_dev *hdev)
532 532
533 c->state = BT_CLOSED; 533 c->state = BT_CLOSED;
534 534
535 hci_conn_del_sysfs(c);
536
535 hci_proto_disconn_ind(c, 0x16); 537 hci_proto_disconn_ind(c, 0x16);
536 hci_conn_del(c); 538 hci_conn_del(c);
537 } 539 }