Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+8 −1
Original line number Original line Diff line number Diff line
@@ -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)
		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)
	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)
	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);