diff options
Diffstat (limited to 'net/bluetooth/hci_sysfs.c')
-rw-r--r-- | net/bluetooth/hci_sysfs.c | 14 |
1 files changed, 5 insertions, 9 deletions
diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c index 582d8877078c..95f7a7a544b4 100644 --- a/net/bluetooth/hci_sysfs.c +++ b/net/bluetooth/hci_sysfs.c | |||
@@ -88,14 +88,16 @@ static struct device_type bt_link = { | |||
88 | static void add_conn(struct work_struct *work) | 88 | static void add_conn(struct work_struct *work) |
89 | { | 89 | { |
90 | struct hci_conn *conn = container_of(work, struct hci_conn, work_add); | 90 | struct hci_conn *conn = container_of(work, struct hci_conn, work_add); |
91 | struct hci_dev *hdev = conn->hdev; | ||
91 | 92 | ||
92 | /* ensure previous del is complete */ | 93 | dev_set_name(&conn->dev, "%s:%d", hdev->name, conn->handle); |
93 | flush_work(&conn->work_del); | ||
94 | 94 | ||
95 | if (device_add(&conn->dev) < 0) { | 95 | if (device_add(&conn->dev) < 0) { |
96 | BT_ERR("Failed to register connection device"); | 96 | BT_ERR("Failed to register connection device"); |
97 | return; | 97 | return; |
98 | } | 98 | } |
99 | |||
100 | hci_dev_hold(hdev); | ||
99 | } | 101 | } |
100 | 102 | ||
101 | /* | 103 | /* |
@@ -113,9 +115,6 @@ static void del_conn(struct work_struct *work) | |||
113 | struct hci_conn *conn = container_of(work, struct hci_conn, work_del); | 115 | struct hci_conn *conn = container_of(work, struct hci_conn, work_del); |
114 | struct hci_dev *hdev = conn->hdev; | 116 | struct hci_dev *hdev = conn->hdev; |
115 | 117 | ||
116 | /* ensure previous add is complete */ | ||
117 | flush_work(&conn->work_add); | ||
118 | |||
119 | if (!device_is_registered(&conn->dev)) | 118 | if (!device_is_registered(&conn->dev)) |
120 | return; | 119 | return; |
121 | 120 | ||
@@ -131,6 +130,7 @@ static void del_conn(struct work_struct *work) | |||
131 | 130 | ||
132 | device_del(&conn->dev); | 131 | device_del(&conn->dev); |
133 | put_device(&conn->dev); | 132 | put_device(&conn->dev); |
133 | |||
134 | hci_dev_put(hdev); | 134 | hci_dev_put(hdev); |
135 | } | 135 | } |
136 | 136 | ||
@@ -154,12 +154,8 @@ void hci_conn_init_sysfs(struct hci_conn *conn) | |||
154 | 154 | ||
155 | void hci_conn_add_sysfs(struct hci_conn *conn) | 155 | void hci_conn_add_sysfs(struct hci_conn *conn) |
156 | { | 156 | { |
157 | struct hci_dev *hdev = conn->hdev; | ||
158 | |||
159 | BT_DBG("conn %p", conn); | 157 | BT_DBG("conn %p", conn); |
160 | 158 | ||
161 | dev_set_name(&conn->dev, "%s:%d", hdev->name, conn->handle); | ||
162 | |||
163 | queue_work(bt_workq, &conn->work_add); | 159 | queue_work(bt_workq, &conn->work_add); |
164 | } | 160 | } |
165 | 161 | ||