Commit c1a33136 authored by Marcel Holtmann's avatar Marcel Holtmann Committed by David S. Miller

[Bluetooth] Make use of device_move() for RFCOMM TTY devices

In the case of bound RFCOMM TTY devices the parent is not available
before its usage. So when opening a RFCOMM TTY device, move it to
the corresponding ACL device as a child. When closing the device,
move it back to the virtual device tree.
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent f5ffd462
...@@ -74,6 +74,8 @@ struct rfcomm_dev { ...@@ -74,6 +74,8 @@ struct rfcomm_dev {
wait_queue_head_t wait; wait_queue_head_t wait;
struct tasklet_struct wakeup_task; struct tasklet_struct wakeup_task;
struct device *tty_dev;
atomic_t wmem_alloc; atomic_t wmem_alloc;
}; };
...@@ -261,7 +263,7 @@ static int rfcomm_dev_add(struct rfcomm_dev_req *req, struct rfcomm_dlc *dlc) ...@@ -261,7 +263,7 @@ static int rfcomm_dev_add(struct rfcomm_dev_req *req, struct rfcomm_dlc *dlc)
return err; return err;
} }
tty_register_device(rfcomm_tty_driver, dev->id, rfcomm_get_device(dev)); dev->tty_dev = tty_register_device(rfcomm_tty_driver, dev->id, NULL);
return dev->id; return dev->id;
} }
...@@ -630,6 +632,9 @@ static int rfcomm_tty_open(struct tty_struct *tty, struct file *filp) ...@@ -630,6 +632,9 @@ static int rfcomm_tty_open(struct tty_struct *tty, struct file *filp)
set_current_state(TASK_RUNNING); set_current_state(TASK_RUNNING);
remove_wait_queue(&dev->wait, &wait); remove_wait_queue(&dev->wait, &wait);
if (err == 0)
device_move(dev->tty_dev, rfcomm_get_device(dev));
return err; return err;
} }
...@@ -642,6 +647,8 @@ static void rfcomm_tty_close(struct tty_struct *tty, struct file *filp) ...@@ -642,6 +647,8 @@ static void rfcomm_tty_close(struct tty_struct *tty, struct file *filp)
BT_DBG("tty %p dev %p dlc %p opened %d", tty, dev, dev->dlc, dev->opened); BT_DBG("tty %p dev %p dlc %p opened %d", tty, dev, dev->dlc, dev->opened);
if (--dev->opened == 0) { if (--dev->opened == 0) {
device_move(dev->tty_dev, NULL);
/* Close DLC and dettach TTY */ /* Close DLC and dettach TTY */
rfcomm_dlc_close(dev->dlc, 0); rfcomm_dlc_close(dev->dlc, 0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment