|
@@ -9,8 +9,7 @@
|
|
|
struct class *bt_class = NULL;
|
|
|
EXPORT_SYMBOL_GPL(bt_class);
|
|
|
|
|
|
-static struct workqueue_struct *btaddconn;
|
|
|
-static struct workqueue_struct *btdelconn;
|
|
|
+static struct workqueue_struct *bluetooth;
|
|
|
|
|
|
static inline char *link_typetostr(int type)
|
|
|
{
|
|
@@ -88,9 +87,10 @@ static struct device_type bt_link = {
|
|
|
|
|
|
static void add_conn(struct work_struct *work)
|
|
|
{
|
|
|
- struct hci_conn *conn = container_of(work, struct hci_conn, work);
|
|
|
+ struct hci_conn *conn = container_of(work, struct hci_conn, work_add);
|
|
|
|
|
|
- flush_workqueue(btdelconn);
|
|
|
+ /* ensure previous add/del is complete */
|
|
|
+ flush_workqueue(bluetooth);
|
|
|
|
|
|
if (device_add(&conn->dev) < 0) {
|
|
|
BT_ERR("Failed to register connection device");
|
|
@@ -114,9 +114,9 @@ void hci_conn_add_sysfs(struct hci_conn *conn)
|
|
|
|
|
|
device_initialize(&conn->dev);
|
|
|
|
|
|
- INIT_WORK(&conn->work, add_conn);
|
|
|
+ INIT_WORK(&conn->work_add, add_conn);
|
|
|
|
|
|
- queue_work(btaddconn, &conn->work);
|
|
|
+ queue_work(bluetooth, &conn->work_add);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -131,9 +131,12 @@ static int __match_tty(struct device *dev, void *data)
|
|
|
|
|
|
static void del_conn(struct work_struct *work)
|
|
|
{
|
|
|
- struct hci_conn *conn = container_of(work, struct hci_conn, work);
|
|
|
+ struct hci_conn *conn = container_of(work, struct hci_conn, work_del);
|
|
|
struct hci_dev *hdev = conn->hdev;
|
|
|
|
|
|
+ /* ensure previous add/del is complete */
|
|
|
+ flush_workqueue(bluetooth);
|
|
|
+
|
|
|
while (1) {
|
|
|
struct device *dev;
|
|
|
|
|
@@ -156,9 +159,9 @@ void hci_conn_del_sysfs(struct hci_conn *conn)
|
|
|
if (!device_is_registered(&conn->dev))
|
|
|
return;
|
|
|
|
|
|
- INIT_WORK(&conn->work, del_conn);
|
|
|
+ INIT_WORK(&conn->work_del, del_conn);
|
|
|
|
|
|
- queue_work(btdelconn, &conn->work);
|
|
|
+ queue_work(bluetooth, &conn->work_del);
|
|
|
}
|
|
|
|
|
|
static inline char *host_typetostr(int type)
|
|
@@ -435,20 +438,13 @@ void hci_unregister_sysfs(struct hci_dev *hdev)
|
|
|
|
|
|
int __init bt_sysfs_init(void)
|
|
|
{
|
|
|
- btaddconn = create_singlethread_workqueue("btaddconn");
|
|
|
- if (!btaddconn)
|
|
|
- return -ENOMEM;
|
|
|
-
|
|
|
- btdelconn = create_singlethread_workqueue("btdelconn");
|
|
|
- if (!btdelconn) {
|
|
|
- destroy_workqueue(btaddconn);
|
|
|
+ bluetooth = create_singlethread_workqueue("bluetooth");
|
|
|
+ if (!bluetooth)
|
|
|
return -ENOMEM;
|
|
|
- }
|
|
|
|
|
|
bt_class = class_create(THIS_MODULE, "bluetooth");
|
|
|
if (IS_ERR(bt_class)) {
|
|
|
- destroy_workqueue(btdelconn);
|
|
|
- destroy_workqueue(btaddconn);
|
|
|
+ destroy_workqueue(bluetooth);
|
|
|
return PTR_ERR(bt_class);
|
|
|
}
|
|
|
|
|
@@ -457,8 +453,7 @@ int __init bt_sysfs_init(void)
|
|
|
|
|
|
void bt_sysfs_cleanup(void)
|
|
|
{
|
|
|
- destroy_workqueue(btaddconn);
|
|
|
- destroy_workqueue(btdelconn);
|
|
|
+ destroy_workqueue(bluetooth);
|
|
|
|
|
|
class_destroy(bt_class);
|
|
|
}
|