diff options
Diffstat (limited to 'net/bluetooth/hci_sysfs.c')
| -rw-r--r-- | net/bluetooth/hci_sysfs.c | 131 | 
1 files changed, 55 insertions, 76 deletions
diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c index 661b461cf0b..52109561423 100644 --- a/net/bluetooth/hci_sysfs.c +++ b/net/bluetooth/hci_sysfs.c @@ -89,11 +89,35 @@ static struct device_type bt_link = {  	.release = bt_link_release,  }; -static void add_conn(struct work_struct *work) +/* + * The rfcomm tty device will possibly retain even when conn + * is down, and sysfs doesn't support move zombie device, + * so we should move the device before conn device is destroyed. + */ +static int __match_tty(struct device *dev, void *data) +{ +	return !strncmp(dev_name(dev), "rfcomm", 6); +} + +void hci_conn_init_sysfs(struct hci_conn *conn) +{ +	struct hci_dev *hdev = conn->hdev; + +	BT_DBG("conn %p", conn); + +	conn->dev.type = &bt_link; +	conn->dev.class = bt_class; +	conn->dev.parent = &hdev->dev; + +	device_initialize(&conn->dev); +} + +void hci_conn_add_sysfs(struct hci_conn *conn)  { -	struct hci_conn *conn = container_of(work, struct hci_conn, work_add);  	struct hci_dev *hdev = conn->hdev; +	BT_DBG("conn %p", conn); +  	dev_set_name(&conn->dev, "%s:%d", hdev->name, conn->handle);  	dev_set_drvdata(&conn->dev, conn); @@ -106,19 +130,8 @@ static void add_conn(struct work_struct *work)  	hci_dev_hold(hdev);  } -/* - * The rfcomm tty device will possibly retain even when conn - * is down, and sysfs doesn't support move zombie device, - * so we should move the device before conn device is destroyed. - */ -static int __match_tty(struct device *dev, void *data) -{ -	return !strncmp(dev_name(dev), "rfcomm", 6); -} - -static void del_conn(struct work_struct *work) +void hci_conn_del_sysfs(struct hci_conn *conn)  { -	struct hci_conn *conn = container_of(work, struct hci_conn, work_del);  	struct hci_dev *hdev = conn->hdev;  	if (!device_is_registered(&conn->dev)) @@ -140,36 +153,6 @@ static void del_conn(struct work_struct *work)  	hci_dev_put(hdev);  } -void hci_conn_init_sysfs(struct hci_conn *conn) -{ -	struct hci_dev *hdev = conn->hdev; - -	BT_DBG("conn %p", conn); - -	conn->dev.type = &bt_link; -	conn->dev.class = bt_class; -	conn->dev.parent = &hdev->dev; - -	device_initialize(&conn->dev); - -	INIT_WORK(&conn->work_add, add_conn); -	INIT_WORK(&conn->work_del, del_conn); -} - -void hci_conn_add_sysfs(struct hci_conn *conn) -{ -	BT_DBG("conn %p", conn); - -	queue_work(conn->hdev->workqueue, &conn->work_add); -} - -void hci_conn_del_sysfs(struct hci_conn *conn) -{ -	BT_DBG("conn %p", conn); - -	queue_work(conn->hdev->workqueue, &conn->work_del); -} -  static inline char *host_bustostr(int bus)  {  	switch (bus) { @@ -403,7 +386,7 @@ static int inquiry_cache_show(struct seq_file *f, void *p)  	struct inquiry_cache *cache = &hdev->inq_cache;  	struct inquiry_entry *e; -	hci_dev_lock_bh(hdev); +	hci_dev_lock(hdev);  	for (e = cache->list; e; e = e->next) {  		struct inquiry_data *data = &e->data; @@ -416,7 +399,7 @@ static int inquiry_cache_show(struct seq_file *f, void *p)  			   data->rssi, data->ssp_mode, e->timestamp);  	} -	hci_dev_unlock_bh(hdev); +	hci_dev_unlock(hdev);  	return 0;  } @@ -436,19 +419,14 @@ static const struct file_operations inquiry_cache_fops = {  static int blacklist_show(struct seq_file *f, void *p)  {  	struct hci_dev *hdev = f->private; -	struct list_head *l; +	struct bdaddr_list *b; -	hci_dev_lock_bh(hdev); - -	list_for_each(l, &hdev->blacklist) { -		struct bdaddr_list *b; - -		b = list_entry(l, struct bdaddr_list, list); +	hci_dev_lock(hdev); +	list_for_each_entry(b, &hdev->blacklist, list)  		seq_printf(f, "%s\n", batostr(&b->bdaddr)); -	} -	hci_dev_unlock_bh(hdev); +	hci_dev_unlock(hdev);  	return 0;  } @@ -485,19 +463,14 @@ static void print_bt_uuid(struct seq_file *f, u8 *uuid)  static int uuids_show(struct seq_file *f, void *p)  {  	struct hci_dev *hdev = f->private; -	struct list_head *l; - -	hci_dev_lock_bh(hdev); - -	list_for_each(l, &hdev->uuids) { -		struct bt_uuid *uuid; +	struct bt_uuid *uuid; -		uuid = list_entry(l, struct bt_uuid, list); +	hci_dev_lock(hdev); +	list_for_each_entry(uuid, &hdev->uuids, list)  		print_bt_uuid(f, uuid->uuid); -	} -	hci_dev_unlock_bh(hdev); +	hci_dev_unlock(hdev);  	return 0;  } @@ -518,11 +491,11 @@ static int auto_accept_delay_set(void *data, u64 val)  {  	struct hci_dev *hdev = data; -	hci_dev_lock_bh(hdev); +	hci_dev_lock(hdev);  	hdev->auto_accept_delay = val; -	hci_dev_unlock_bh(hdev); +	hci_dev_unlock(hdev);  	return 0;  } @@ -531,11 +504,11 @@ static int auto_accept_delay_get(void *data, u64 *val)  {  	struct hci_dev *hdev = data; -	hci_dev_lock_bh(hdev); +	hci_dev_lock(hdev);  	*val = hdev->auto_accept_delay; -	hci_dev_unlock_bh(hdev); +	hci_dev_unlock(hdev);  	return 0;  } @@ -543,22 +516,28 @@ static int auto_accept_delay_get(void *data, u64 *val)  DEFINE_SIMPLE_ATTRIBUTE(auto_accept_delay_fops, auto_accept_delay_get,  					auto_accept_delay_set, "%llu\n"); -int hci_register_sysfs(struct hci_dev *hdev) +void hci_init_sysfs(struct hci_dev *hdev) +{ +	struct device *dev = &hdev->dev; + +	dev->type = &bt_host; +	dev->class = bt_class; + +	dev_set_drvdata(dev, hdev); +	device_initialize(dev); +} + +int hci_add_sysfs(struct hci_dev *hdev)  {  	struct device *dev = &hdev->dev;  	int err;  	BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus); -	dev->type = &bt_host; -	dev->class = bt_class;  	dev->parent = hdev->parent; -  	dev_set_name(dev, "%s", hdev->name); -	dev_set_drvdata(dev, hdev); - -	err = device_register(dev); +	err = device_add(dev);  	if (err < 0)  		return err; @@ -582,7 +561,7 @@ int hci_register_sysfs(struct hci_dev *hdev)  	return 0;  } -void hci_unregister_sysfs(struct hci_dev *hdev) +void hci_del_sysfs(struct hci_dev *hdev)  {  	BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus);  |