Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    2)    RFCOMM implementation for Linux Bluetooth stack (BlueZ).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    3)    Copyright (C) 2002 Maxim Krasnyansky <maxk@qualcomm.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    4)    Copyright (C) 2002 Marcel Holtmann <marcel@holtmann.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    5) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    6)    This program is free software; you can redistribute it and/or modify
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    7)    it under the terms of the GNU General Public License version 2 as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    8)    published by the Free Software Foundation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    9) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   10)    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   11)    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   12)    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   13)    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   14)    CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   15)    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   16)    ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   17)    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   18) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   19)    ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   20)    COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   21)    SOFTWARE IS DISCLAIMED.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   22) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   23) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   24) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   25)  * RFCOMM TTY.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   26)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   27) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   28) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   29) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   30) #include <linux/tty.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   31) #include <linux/tty_driver.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   32) #include <linux/tty_flip.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   33) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   34) #include <net/bluetooth/bluetooth.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   35) #include <net/bluetooth/hci_core.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   36) #include <net/bluetooth/rfcomm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   37) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   38) #define RFCOMM_TTY_MAGIC 0x6d02		/* magic number for rfcomm struct */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   39) #define RFCOMM_TTY_PORTS RFCOMM_MAX_DEV	/* whole lotta rfcomm devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   40) #define RFCOMM_TTY_MAJOR 216		/* device node major id of the usb/bluetooth.c driver */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   41) #define RFCOMM_TTY_MINOR 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   42) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   43) static DEFINE_MUTEX(rfcomm_ioctl_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   44) static struct tty_driver *rfcomm_tty_driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   45) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   46) struct rfcomm_dev {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   47) 	struct tty_port		port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   48) 	struct list_head	list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   49) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   50) 	char			name[12];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   51) 	int			id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   52) 	unsigned long		flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   53) 	int			err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   54) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   55) 	unsigned long		status;		/* don't export to userspace */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   56) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   57) 	bdaddr_t		src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   58) 	bdaddr_t		dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   59) 	u8			channel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   60) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   61) 	uint			modem_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   62) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   63) 	struct rfcomm_dlc	*dlc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   64) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   65) 	struct device		*tty_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   66) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   67) 	atomic_t		wmem_alloc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   68) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   69) 	struct sk_buff_head	pending;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   70) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   71) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   72) static LIST_HEAD(rfcomm_dev_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   73) static DEFINE_MUTEX(rfcomm_dev_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   74) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   75) static void rfcomm_dev_data_ready(struct rfcomm_dlc *dlc, struct sk_buff *skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   76) static void rfcomm_dev_state_change(struct rfcomm_dlc *dlc, int err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   77) static void rfcomm_dev_modem_status(struct rfcomm_dlc *dlc, u8 v24_sig);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   78) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   79) /* ---- Device functions ---- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   80) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   81) static void rfcomm_dev_destruct(struct tty_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   82) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   83) 	struct rfcomm_dev *dev = container_of(port, struct rfcomm_dev, port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   84) 	struct rfcomm_dlc *dlc = dev->dlc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   85) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   86) 	BT_DBG("dev %p dlc %p", dev, dlc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   87) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   88) 	rfcomm_dlc_lock(dlc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   89) 	/* Detach DLC if it's owned by this dev */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   90) 	if (dlc->owner == dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   91) 		dlc->owner = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   92) 	rfcomm_dlc_unlock(dlc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   93) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   94) 	rfcomm_dlc_put(dlc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   95) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   96) 	if (dev->tty_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   97) 		tty_unregister_device(rfcomm_tty_driver, dev->id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   98) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   99) 	mutex_lock(&rfcomm_dev_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  100) 	list_del(&dev->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  101) 	mutex_unlock(&rfcomm_dev_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  102) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  103) 	kfree(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  104) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  105) 	/* It's safe to call module_put() here because socket still
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  106) 	   holds reference to this module. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  107) 	module_put(THIS_MODULE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  108) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  109) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  110) /* device-specific initialization: open the dlc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  111) static int rfcomm_dev_activate(struct tty_port *port, struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  112) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  113) 	struct rfcomm_dev *dev = container_of(port, struct rfcomm_dev, port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  114) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  115) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  116) 	err = rfcomm_dlc_open(dev->dlc, &dev->src, &dev->dst, dev->channel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  117) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  118) 		set_bit(TTY_IO_ERROR, &tty->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  119) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  120) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  121) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  122) /* we block the open until the dlc->state becomes BT_CONNECTED */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  123) static int rfcomm_dev_carrier_raised(struct tty_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  124) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  125) 	struct rfcomm_dev *dev = container_of(port, struct rfcomm_dev, port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  126) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  127) 	return (dev->dlc->state == BT_CONNECTED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  128) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  129) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  130) /* device-specific cleanup: close the dlc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  131) static void rfcomm_dev_shutdown(struct tty_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  132) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  133) 	struct rfcomm_dev *dev = container_of(port, struct rfcomm_dev, port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  134) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  135) 	if (dev->tty_dev->parent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  136) 		device_move(dev->tty_dev, NULL, DPM_ORDER_DEV_LAST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  137) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  138) 	/* close the dlc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  139) 	rfcomm_dlc_close(dev->dlc, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  140) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  141) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  142) static const struct tty_port_operations rfcomm_port_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  143) 	.destruct = rfcomm_dev_destruct,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  144) 	.activate = rfcomm_dev_activate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  145) 	.shutdown = rfcomm_dev_shutdown,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  146) 	.carrier_raised = rfcomm_dev_carrier_raised,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  147) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  148) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  149) static struct rfcomm_dev *__rfcomm_dev_lookup(int id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  150) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  151) 	struct rfcomm_dev *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  152) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  153) 	list_for_each_entry(dev, &rfcomm_dev_list, list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  154) 		if (dev->id == id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  155) 			return dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  156) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  157) 	return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  158) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  159) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  160) static struct rfcomm_dev *rfcomm_dev_get(int id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  161) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  162) 	struct rfcomm_dev *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  163) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  164) 	mutex_lock(&rfcomm_dev_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  165) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  166) 	dev = __rfcomm_dev_lookup(id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  167) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  168) 	if (dev && !tty_port_get(&dev->port))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  169) 		dev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  170) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  171) 	mutex_unlock(&rfcomm_dev_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  172) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  173) 	return dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  174) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  175) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  176) static void rfcomm_reparent_device(struct rfcomm_dev *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  177) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  178) 	struct hci_dev *hdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  179) 	struct hci_conn *conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  180) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  181) 	hdev = hci_get_route(&dev->dst, &dev->src, BDADDR_BREDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  182) 	if (!hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  183) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  184) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  185) 	/* The lookup results are unsafe to access without the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  186) 	 * hci device lock (FIXME: why is this not documented?)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  187) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  188) 	hci_dev_lock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  189) 	conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &dev->dst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  190) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  191) 	/* Just because the acl link is in the hash table is no
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  192) 	 * guarantee the sysfs device has been added ...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  193) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  194) 	if (conn && device_is_registered(&conn->dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  195) 		device_move(dev->tty_dev, &conn->dev, DPM_ORDER_DEV_AFTER_PARENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  196) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  197) 	hci_dev_unlock(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  198) 	hci_dev_put(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  199) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  200) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  201) static ssize_t show_address(struct device *tty_dev, struct device_attribute *attr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  202) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  203) 	struct rfcomm_dev *dev = dev_get_drvdata(tty_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  204) 	return sprintf(buf, "%pMR\n", &dev->dst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  205) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  206) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  207) static ssize_t show_channel(struct device *tty_dev, struct device_attribute *attr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  208) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  209) 	struct rfcomm_dev *dev = dev_get_drvdata(tty_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  210) 	return sprintf(buf, "%d\n", dev->channel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  211) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  212) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  213) static DEVICE_ATTR(address, 0444, show_address, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  214) static DEVICE_ATTR(channel, 0444, show_channel, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  215) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  216) static struct rfcomm_dev *__rfcomm_dev_add(struct rfcomm_dev_req *req,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  217) 					   struct rfcomm_dlc *dlc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  218) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  219) 	struct rfcomm_dev *dev, *entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  220) 	struct list_head *head = &rfcomm_dev_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  221) 	int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  222) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  223) 	dev = kzalloc(sizeof(struct rfcomm_dev), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  224) 	if (!dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  225) 		return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  226) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  227) 	mutex_lock(&rfcomm_dev_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  228) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  229) 	if (req->dev_id < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  230) 		dev->id = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  231) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  232) 		list_for_each_entry(entry, &rfcomm_dev_list, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  233) 			if (entry->id != dev->id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  234) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  235) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  236) 			dev->id++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  237) 			head = &entry->list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  238) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  239) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  240) 		dev->id = req->dev_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  241) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  242) 		list_for_each_entry(entry, &rfcomm_dev_list, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  243) 			if (entry->id == dev->id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  244) 				err = -EADDRINUSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  245) 				goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  246) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  247) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  248) 			if (entry->id > dev->id - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  249) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  250) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  251) 			head = &entry->list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  252) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  253) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  254) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  255) 	if ((dev->id < 0) || (dev->id > RFCOMM_MAX_DEV - 1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  256) 		err = -ENFILE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  257) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  258) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  259) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  260) 	sprintf(dev->name, "rfcomm%d", dev->id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  261) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  262) 	list_add(&dev->list, head);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  263) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  264) 	bacpy(&dev->src, &req->src);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  265) 	bacpy(&dev->dst, &req->dst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  266) 	dev->channel = req->channel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  267) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  268) 	dev->flags = req->flags &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  269) 		((1 << RFCOMM_RELEASE_ONHUP) | (1 << RFCOMM_REUSE_DLC));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  270) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  271) 	tty_port_init(&dev->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  272) 	dev->port.ops = &rfcomm_port_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  273) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  274) 	skb_queue_head_init(&dev->pending);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  275) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  276) 	rfcomm_dlc_lock(dlc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  277) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  278) 	if (req->flags & (1 << RFCOMM_REUSE_DLC)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  279) 		struct sock *sk = dlc->owner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  280) 		struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  281) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  282) 		BUG_ON(!sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  283) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  284) 		rfcomm_dlc_throttle(dlc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  285) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  286) 		while ((skb = skb_dequeue(&sk->sk_receive_queue))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  287) 			skb_orphan(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  288) 			skb_queue_tail(&dev->pending, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  289) 			atomic_sub(skb->len, &sk->sk_rmem_alloc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  290) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  291) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  292) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  293) 	dlc->data_ready   = rfcomm_dev_data_ready;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  294) 	dlc->state_change = rfcomm_dev_state_change;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  295) 	dlc->modem_status = rfcomm_dev_modem_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  296) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  297) 	dlc->owner = dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  298) 	dev->dlc   = dlc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  299) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  300) 	rfcomm_dev_modem_status(dlc, dlc->remote_v24_sig);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  301) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  302) 	rfcomm_dlc_unlock(dlc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  303) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  304) 	/* It's safe to call __module_get() here because socket already
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  305) 	   holds reference to this module. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  306) 	__module_get(THIS_MODULE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  307) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  308) 	mutex_unlock(&rfcomm_dev_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  309) 	return dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  310) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  311) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  312) 	mutex_unlock(&rfcomm_dev_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  313) 	kfree(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  314) 	return ERR_PTR(err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  315) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  316) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  317) static int rfcomm_dev_add(struct rfcomm_dev_req *req, struct rfcomm_dlc *dlc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  318) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  319) 	struct rfcomm_dev *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  320) 	struct device *tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  321) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  322) 	BT_DBG("id %d channel %d", req->dev_id, req->channel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  323) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  324) 	dev = __rfcomm_dev_add(req, dlc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  325) 	if (IS_ERR(dev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  326) 		rfcomm_dlc_put(dlc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  327) 		return PTR_ERR(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  328) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  329) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  330) 	tty = tty_port_register_device(&dev->port, rfcomm_tty_driver,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  331) 			dev->id, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  332) 	if (IS_ERR(tty)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  333) 		tty_port_put(&dev->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  334) 		return PTR_ERR(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  335) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  336) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  337) 	dev->tty_dev = tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  338) 	rfcomm_reparent_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  339) 	dev_set_drvdata(dev->tty_dev, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  340) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  341) 	if (device_create_file(dev->tty_dev, &dev_attr_address) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  342) 		BT_ERR("Failed to create address attribute");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  343) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  344) 	if (device_create_file(dev->tty_dev, &dev_attr_channel) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  345) 		BT_ERR("Failed to create channel attribute");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  346) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  347) 	return dev->id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  348) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  349) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  350) /* ---- Send buffer ---- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  351) static inline unsigned int rfcomm_room(struct rfcomm_dev *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  352) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  353) 	struct rfcomm_dlc *dlc = dev->dlc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  354) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  355) 	/* Limit the outstanding number of packets not yet sent to 40 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  356) 	int pending = 40 - atomic_read(&dev->wmem_alloc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  357) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  358) 	return max(0, pending) * dlc->mtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  359) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  360) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  361) static void rfcomm_wfree(struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  362) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  363) 	struct rfcomm_dev *dev = (void *) skb->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  364) 	atomic_dec(&dev->wmem_alloc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  365) 	if (test_bit(RFCOMM_TTY_ATTACHED, &dev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  366) 		tty_port_tty_wakeup(&dev->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  367) 	tty_port_put(&dev->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  368) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  369) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  370) static void rfcomm_set_owner_w(struct sk_buff *skb, struct rfcomm_dev *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  371) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  372) 	tty_port_get(&dev->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  373) 	atomic_inc(&dev->wmem_alloc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  374) 	skb->sk = (void *) dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  375) 	skb->destructor = rfcomm_wfree;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  376) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  377) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  378) static struct sk_buff *rfcomm_wmalloc(struct rfcomm_dev *dev, unsigned long size, gfp_t priority)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  379) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  380) 	struct sk_buff *skb = alloc_skb(size, priority);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  381) 	if (skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  382) 		rfcomm_set_owner_w(skb, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  383) 	return skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  384) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  385) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  386) /* ---- Device IOCTLs ---- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  387) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  388) #define NOCAP_FLAGS ((1 << RFCOMM_REUSE_DLC) | (1 << RFCOMM_RELEASE_ONHUP))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  389) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  390) static int __rfcomm_create_dev(struct sock *sk, void __user *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  391) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  392) 	struct rfcomm_dev_req req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  393) 	struct rfcomm_dlc *dlc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  394) 	int id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  395) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  396) 	if (copy_from_user(&req, arg, sizeof(req)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  397) 		return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  398) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  399) 	BT_DBG("sk %p dev_id %d flags 0x%x", sk, req.dev_id, req.flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  400) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  401) 	if (req.flags != NOCAP_FLAGS && !capable(CAP_NET_ADMIN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  402) 		return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  403) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  404) 	if (req.flags & (1 << RFCOMM_REUSE_DLC)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  405) 		/* Socket must be connected */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  406) 		if (sk->sk_state != BT_CONNECTED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  407) 			return -EBADFD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  408) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  409) 		dlc = rfcomm_pi(sk)->dlc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  410) 		rfcomm_dlc_hold(dlc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  411) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  412) 		/* Validate the channel is unused */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  413) 		dlc = rfcomm_dlc_exists(&req.src, &req.dst, req.channel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  414) 		if (IS_ERR(dlc))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  415) 			return PTR_ERR(dlc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  416) 		if (dlc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  417) 			return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  418) 		dlc = rfcomm_dlc_alloc(GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  419) 		if (!dlc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  420) 			return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  421) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  422) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  423) 	id = rfcomm_dev_add(&req, dlc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  424) 	if (id < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  425) 		return id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  426) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  427) 	if (req.flags & (1 << RFCOMM_REUSE_DLC)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  428) 		/* DLC is now used by device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  429) 		 * Socket must be disconnected */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  430) 		sk->sk_state = BT_CLOSED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  431) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  432) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  433) 	return id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  434) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  435) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  436) static int __rfcomm_release_dev(void __user *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  437) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  438) 	struct rfcomm_dev_req req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  439) 	struct rfcomm_dev *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  440) 	struct tty_struct *tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  441) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  442) 	if (copy_from_user(&req, arg, sizeof(req)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  443) 		return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  444) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  445) 	BT_DBG("dev_id %d flags 0x%x", req.dev_id, req.flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  446) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  447) 	dev = rfcomm_dev_get(req.dev_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  448) 	if (!dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  449) 		return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  450) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  451) 	if (dev->flags != NOCAP_FLAGS && !capable(CAP_NET_ADMIN)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  452) 		tty_port_put(&dev->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  453) 		return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  454) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  455) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  456) 	/* only release once */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  457) 	if (test_and_set_bit(RFCOMM_DEV_RELEASED, &dev->status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  458) 		tty_port_put(&dev->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  459) 		return -EALREADY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  460) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  461) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  462) 	if (req.flags & (1 << RFCOMM_HANGUP_NOW))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  463) 		rfcomm_dlc_close(dev->dlc, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  464) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  465) 	/* Shut down TTY synchronously before freeing rfcomm_dev */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  466) 	tty = tty_port_tty_get(&dev->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  467) 	if (tty) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  468) 		tty_vhangup(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  469) 		tty_kref_put(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  470) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  471) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  472) 	if (!test_bit(RFCOMM_TTY_OWNED, &dev->status))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  473) 		tty_port_put(&dev->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  474) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  475) 	tty_port_put(&dev->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  476) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  477) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  478) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  479) static int rfcomm_create_dev(struct sock *sk, void __user *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  480) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  481) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  482) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  483) 	mutex_lock(&rfcomm_ioctl_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  484) 	ret = __rfcomm_create_dev(sk, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  485) 	mutex_unlock(&rfcomm_ioctl_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  486) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  487) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  488) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  489) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  490) static int rfcomm_release_dev(void __user *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  491) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  492) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  493) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  494) 	mutex_lock(&rfcomm_ioctl_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  495) 	ret = __rfcomm_release_dev(arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  496) 	mutex_unlock(&rfcomm_ioctl_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  497) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  498) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  499) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  500) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  501) static int rfcomm_get_dev_list(void __user *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  502) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  503) 	struct rfcomm_dev *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  504) 	struct rfcomm_dev_list_req *dl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  505) 	struct rfcomm_dev_info *di;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  506) 	int n = 0, size, err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  507) 	u16 dev_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  508) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  509) 	BT_DBG("");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  510) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  511) 	if (get_user(dev_num, (u16 __user *) arg))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  512) 		return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  513) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  514) 	if (!dev_num || dev_num > (PAGE_SIZE * 4) / sizeof(*di))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  515) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  516) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  517) 	size = sizeof(*dl) + dev_num * sizeof(*di);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  518) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  519) 	dl = kzalloc(size, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  520) 	if (!dl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  521) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  522) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  523) 	di = dl->dev_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  524) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  525) 	mutex_lock(&rfcomm_dev_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  526) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  527) 	list_for_each_entry(dev, &rfcomm_dev_list, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  528) 		if (!tty_port_get(&dev->port))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  529) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  530) 		(di + n)->id      = dev->id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  531) 		(di + n)->flags   = dev->flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  532) 		(di + n)->state   = dev->dlc->state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  533) 		(di + n)->channel = dev->channel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  534) 		bacpy(&(di + n)->src, &dev->src);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  535) 		bacpy(&(di + n)->dst, &dev->dst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  536) 		tty_port_put(&dev->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  537) 		if (++n >= dev_num)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  538) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  539) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  540) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  541) 	mutex_unlock(&rfcomm_dev_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  542) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  543) 	dl->dev_num = n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  544) 	size = sizeof(*dl) + n * sizeof(*di);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  545) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  546) 	err = copy_to_user(arg, dl, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  547) 	kfree(dl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  548) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  549) 	return err ? -EFAULT : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  550) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  551) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  552) static int rfcomm_get_dev_info(void __user *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  553) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  554) 	struct rfcomm_dev *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  555) 	struct rfcomm_dev_info di;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  556) 	int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  557) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  558) 	BT_DBG("");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  559) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  560) 	if (copy_from_user(&di, arg, sizeof(di)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  561) 		return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  562) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  563) 	dev = rfcomm_dev_get(di.id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  564) 	if (!dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  565) 		return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  566) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  567) 	di.flags   = dev->flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  568) 	di.channel = dev->channel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  569) 	di.state   = dev->dlc->state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  570) 	bacpy(&di.src, &dev->src);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  571) 	bacpy(&di.dst, &dev->dst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  572) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  573) 	if (copy_to_user(arg, &di, sizeof(di)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  574) 		err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  575) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  576) 	tty_port_put(&dev->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  577) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  578) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  579) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  580) int rfcomm_dev_ioctl(struct sock *sk, unsigned int cmd, void __user *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  581) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  582) 	BT_DBG("cmd %d arg %p", cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  583) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  584) 	switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  585) 	case RFCOMMCREATEDEV:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  586) 		return rfcomm_create_dev(sk, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  587) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  588) 	case RFCOMMRELEASEDEV:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  589) 		return rfcomm_release_dev(arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  590) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  591) 	case RFCOMMGETDEVLIST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  592) 		return rfcomm_get_dev_list(arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  593) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  594) 	case RFCOMMGETDEVINFO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  595) 		return rfcomm_get_dev_info(arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  596) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  597) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  598) 	return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  599) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  600) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  601) /* ---- DLC callbacks ---- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  602) static void rfcomm_dev_data_ready(struct rfcomm_dlc *dlc, struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  603) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  604) 	struct rfcomm_dev *dev = dlc->owner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  605) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  606) 	if (!dev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  607) 		kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  608) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  609) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  610) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  611) 	if (!skb_queue_empty(&dev->pending)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  612) 		skb_queue_tail(&dev->pending, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  613) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  614) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  615) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  616) 	BT_DBG("dlc %p len %d", dlc, skb->len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  617) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  618) 	tty_insert_flip_string(&dev->port, skb->data, skb->len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  619) 	tty_flip_buffer_push(&dev->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  620) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  621) 	kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  622) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  623) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  624) static void rfcomm_dev_state_change(struct rfcomm_dlc *dlc, int err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  625) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  626) 	struct rfcomm_dev *dev = dlc->owner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  627) 	if (!dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  628) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  629) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  630) 	BT_DBG("dlc %p dev %p err %d", dlc, dev, err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  631) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  632) 	dev->err = err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  633) 	if (dlc->state == BT_CONNECTED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  634) 		rfcomm_reparent_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  635) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  636) 		wake_up_interruptible(&dev->port.open_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  637) 	} else if (dlc->state == BT_CLOSED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  638) 		tty_port_tty_hangup(&dev->port, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  639) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  640) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  641) static void rfcomm_dev_modem_status(struct rfcomm_dlc *dlc, u8 v24_sig)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  642) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  643) 	struct rfcomm_dev *dev = dlc->owner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  644) 	if (!dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  645) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  646) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  647) 	BT_DBG("dlc %p dev %p v24_sig 0x%02x", dlc, dev, v24_sig);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  648) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  649) 	if ((dev->modem_status & TIOCM_CD) && !(v24_sig & RFCOMM_V24_DV))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  650) 		tty_port_tty_hangup(&dev->port, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  651) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  652) 	dev->modem_status =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  653) 		((v24_sig & RFCOMM_V24_RTC) ? (TIOCM_DSR | TIOCM_DTR) : 0) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  654) 		((v24_sig & RFCOMM_V24_RTR) ? (TIOCM_RTS | TIOCM_CTS) : 0) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  655) 		((v24_sig & RFCOMM_V24_IC)  ? TIOCM_RI : 0) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  656) 		((v24_sig & RFCOMM_V24_DV)  ? TIOCM_CD : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  657) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  658) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  659) /* ---- TTY functions ---- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  660) static void rfcomm_tty_copy_pending(struct rfcomm_dev *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  661) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  662) 	struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  663) 	int inserted = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  664) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  665) 	BT_DBG("dev %p", dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  666) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  667) 	rfcomm_dlc_lock(dev->dlc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  668) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  669) 	while ((skb = skb_dequeue(&dev->pending))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  670) 		inserted += tty_insert_flip_string(&dev->port, skb->data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  671) 				skb->len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  672) 		kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  673) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  674) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  675) 	rfcomm_dlc_unlock(dev->dlc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  676) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  677) 	if (inserted > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  678) 		tty_flip_buffer_push(&dev->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  679) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  680) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  681) /* do the reverse of install, clearing the tty fields and releasing the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  682)  * reference to tty_port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  683)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  684) static void rfcomm_tty_cleanup(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  685) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  686) 	struct rfcomm_dev *dev = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  687) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  688) 	clear_bit(RFCOMM_TTY_ATTACHED, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  689) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  690) 	rfcomm_dlc_lock(dev->dlc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  691) 	tty->driver_data = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  692) 	rfcomm_dlc_unlock(dev->dlc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  693) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  694) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  695) 	 * purge the dlc->tx_queue to avoid circular dependencies
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  696) 	 * between dev and dlc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  697) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  698) 	skb_queue_purge(&dev->dlc->tx_queue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  699) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  700) 	tty_port_put(&dev->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  701) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  702) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  703) /* we acquire the tty_port reference since it's here the tty is first used
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  704)  * by setting the termios. We also populate the driver_data field and install
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  705)  * the tty port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  706)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  707) static int rfcomm_tty_install(struct tty_driver *driver, struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  708) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  709) 	struct rfcomm_dev *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  710) 	struct rfcomm_dlc *dlc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  711) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  712) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  713) 	dev = rfcomm_dev_get(tty->index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  714) 	if (!dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  715) 		return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  716) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  717) 	dlc = dev->dlc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  718) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  719) 	/* Attach TTY and open DLC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  720) 	rfcomm_dlc_lock(dlc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  721) 	tty->driver_data = dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  722) 	rfcomm_dlc_unlock(dlc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  723) 	set_bit(RFCOMM_TTY_ATTACHED, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  724) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  725) 	/* install the tty_port */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  726) 	err = tty_port_install(&dev->port, driver, tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  727) 	if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  728) 		rfcomm_tty_cleanup(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  729) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  730) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  731) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  732) 	/* take over the tty_port reference if the port was created with the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  733) 	 * flag RFCOMM_RELEASE_ONHUP. This will force the release of the port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  734) 	 * when the last process closes the tty. The behaviour is expected by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  735) 	 * userspace.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  736) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  737) 	if (test_bit(RFCOMM_RELEASE_ONHUP, &dev->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  738) 		set_bit(RFCOMM_TTY_OWNED, &dev->status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  739) 		tty_port_put(&dev->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  740) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  741) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  742) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  743) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  744) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  745) static int rfcomm_tty_open(struct tty_struct *tty, struct file *filp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  746) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  747) 	struct rfcomm_dev *dev = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  748) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  749) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  750) 	BT_DBG("tty %p id %d", tty, tty->index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  751) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  752) 	BT_DBG("dev %p dst %pMR channel %d opened %d", dev, &dev->dst,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  753) 	       dev->channel, dev->port.count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  754) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  755) 	err = tty_port_open(&dev->port, tty, filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  756) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  757) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  758) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  759) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  760) 	 * FIXME: rfcomm should use proper flow control for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  761) 	 * received data. This hack will be unnecessary and can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  762) 	 * be removed when that's implemented
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  763) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  764) 	rfcomm_tty_copy_pending(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  765) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  766) 	rfcomm_dlc_unthrottle(dev->dlc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  767) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  768) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  769) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  770) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  771) static void rfcomm_tty_close(struct tty_struct *tty, struct file *filp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  772) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  773) 	struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  774) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  775) 	BT_DBG("tty %p dev %p dlc %p opened %d", tty, dev, dev->dlc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  776) 						dev->port.count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  777) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  778) 	tty_port_close(&dev->port, tty, filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  779) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  780) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  781) static int rfcomm_tty_write(struct tty_struct *tty, const unsigned char *buf, int count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  782) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  783) 	struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  784) 	struct rfcomm_dlc *dlc = dev->dlc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  785) 	struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  786) 	int sent = 0, size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  787) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  788) 	BT_DBG("tty %p count %d", tty, count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  789) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  790) 	while (count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  791) 		size = min_t(uint, count, dlc->mtu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  792) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  793) 		skb = rfcomm_wmalloc(dev, size + RFCOMM_SKB_RESERVE, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  794) 		if (!skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  795) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  796) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  797) 		skb_reserve(skb, RFCOMM_SKB_HEAD_RESERVE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  798) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  799) 		skb_put_data(skb, buf + sent, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  800) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  801) 		rfcomm_dlc_send_noerror(dlc, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  802) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  803) 		sent  += size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  804) 		count -= size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  805) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  806) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  807) 	return sent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  808) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  809) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  810) static int rfcomm_tty_write_room(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  811) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  812) 	struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  813) 	int room = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  814) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  815) 	if (dev && dev->dlc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  816) 		room = rfcomm_room(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  817) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  818) 	BT_DBG("tty %p room %d", tty, room);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  819) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  820) 	return room;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  821) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  822) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  823) static int rfcomm_tty_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  824) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  825) 	BT_DBG("tty %p cmd 0x%02x", tty, cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  826) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  827) 	switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  828) 	case TCGETS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  829) 		BT_DBG("TCGETS is not supported");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  830) 		return -ENOIOCTLCMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  831) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  832) 	case TCSETS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  833) 		BT_DBG("TCSETS is not supported");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  834) 		return -ENOIOCTLCMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  835) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  836) 	case TIOCMIWAIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  837) 		BT_DBG("TIOCMIWAIT");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  838) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  839) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  840) 	case TIOCSERGETLSR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  841) 		BT_ERR("TIOCSERGETLSR is not supported");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  842) 		return -ENOIOCTLCMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  843) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  844) 	case TIOCSERCONFIG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  845) 		BT_ERR("TIOCSERCONFIG is not supported");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  846) 		return -ENOIOCTLCMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  847) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  848) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  849) 		return -ENOIOCTLCMD;	/* ioctls which we must ignore */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  850) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  851) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  852) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  853) 	return -ENOIOCTLCMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  854) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  855) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  856) static void rfcomm_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  857) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  858) 	struct ktermios *new = &tty->termios;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  859) 	int old_baud_rate = tty_termios_baud_rate(old);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  860) 	int new_baud_rate = tty_termios_baud_rate(new);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  861) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  862) 	u8 baud, data_bits, stop_bits, parity, x_on, x_off;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  863) 	u16 changes = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  864) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  865) 	struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  866) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  867) 	BT_DBG("tty %p termios %p", tty, old);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  868) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  869) 	if (!dev || !dev->dlc || !dev->dlc->session)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  870) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  871) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  872) 	/* Handle turning off CRTSCTS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  873) 	if ((old->c_cflag & CRTSCTS) && !(new->c_cflag & CRTSCTS))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  874) 		BT_DBG("Turning off CRTSCTS unsupported");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  875) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  876) 	/* Parity on/off and when on, odd/even */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  877) 	if (((old->c_cflag & PARENB) != (new->c_cflag & PARENB)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  878) 			((old->c_cflag & PARODD) != (new->c_cflag & PARODD))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  879) 		changes |= RFCOMM_RPN_PM_PARITY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  880) 		BT_DBG("Parity change detected.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  881) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  882) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  883) 	/* Mark and space parity are not supported! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  884) 	if (new->c_cflag & PARENB) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  885) 		if (new->c_cflag & PARODD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  886) 			BT_DBG("Parity is ODD");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  887) 			parity = RFCOMM_RPN_PARITY_ODD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  888) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  889) 			BT_DBG("Parity is EVEN");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  890) 			parity = RFCOMM_RPN_PARITY_EVEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  891) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  892) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  893) 		BT_DBG("Parity is OFF");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  894) 		parity = RFCOMM_RPN_PARITY_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  895) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  896) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  897) 	/* Setting the x_on / x_off characters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  898) 	if (old->c_cc[VSTOP] != new->c_cc[VSTOP]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  899) 		BT_DBG("XOFF custom");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  900) 		x_on = new->c_cc[VSTOP];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  901) 		changes |= RFCOMM_RPN_PM_XON;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  902) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  903) 		BT_DBG("XOFF default");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  904) 		x_on = RFCOMM_RPN_XON_CHAR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  905) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  906) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  907) 	if (old->c_cc[VSTART] != new->c_cc[VSTART]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  908) 		BT_DBG("XON custom");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  909) 		x_off = new->c_cc[VSTART];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  910) 		changes |= RFCOMM_RPN_PM_XOFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  911) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  912) 		BT_DBG("XON default");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  913) 		x_off = RFCOMM_RPN_XOFF_CHAR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  914) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  915) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  916) 	/* Handle setting of stop bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  917) 	if ((old->c_cflag & CSTOPB) != (new->c_cflag & CSTOPB))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  918) 		changes |= RFCOMM_RPN_PM_STOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  919) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  920) 	/* POSIX does not support 1.5 stop bits and RFCOMM does not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  921) 	 * support 2 stop bits. So a request for 2 stop bits gets
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  922) 	 * translated to 1.5 stop bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  923) 	if (new->c_cflag & CSTOPB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  924) 		stop_bits = RFCOMM_RPN_STOP_15;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  925) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  926) 		stop_bits = RFCOMM_RPN_STOP_1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  927) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  928) 	/* Handle number of data bits [5-8] */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  929) 	if ((old->c_cflag & CSIZE) != (new->c_cflag & CSIZE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  930) 		changes |= RFCOMM_RPN_PM_DATA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  931) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  932) 	switch (new->c_cflag & CSIZE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  933) 	case CS5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  934) 		data_bits = RFCOMM_RPN_DATA_5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  935) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  936) 	case CS6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  937) 		data_bits = RFCOMM_RPN_DATA_6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  938) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  939) 	case CS7:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  940) 		data_bits = RFCOMM_RPN_DATA_7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  941) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  942) 	case CS8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  943) 		data_bits = RFCOMM_RPN_DATA_8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  944) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  945) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  946) 		data_bits = RFCOMM_RPN_DATA_8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  947) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  948) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  949) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  950) 	/* Handle baudrate settings */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  951) 	if (old_baud_rate != new_baud_rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  952) 		changes |= RFCOMM_RPN_PM_BITRATE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  953) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  954) 	switch (new_baud_rate) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  955) 	case 2400:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  956) 		baud = RFCOMM_RPN_BR_2400;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  957) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  958) 	case 4800:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  959) 		baud = RFCOMM_RPN_BR_4800;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  960) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  961) 	case 7200:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  962) 		baud = RFCOMM_RPN_BR_7200;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  963) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  964) 	case 9600:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  965) 		baud = RFCOMM_RPN_BR_9600;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  966) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  967) 	case 19200:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  968) 		baud = RFCOMM_RPN_BR_19200;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  969) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  970) 	case 38400:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  971) 		baud = RFCOMM_RPN_BR_38400;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  972) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  973) 	case 57600:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  974) 		baud = RFCOMM_RPN_BR_57600;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  975) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  976) 	case 115200:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  977) 		baud = RFCOMM_RPN_BR_115200;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  978) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  979) 	case 230400:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  980) 		baud = RFCOMM_RPN_BR_230400;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  981) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  982) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  983) 		/* 9600 is standard accordinag to the RFCOMM specification */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  984) 		baud = RFCOMM_RPN_BR_9600;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  985) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  986) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  987) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  988) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  989) 	if (changes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  990) 		rfcomm_send_rpn(dev->dlc->session, 1, dev->dlc->dlci, baud,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  991) 				data_bits, stop_bits, parity,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  992) 				RFCOMM_RPN_FLOW_NONE, x_on, x_off, changes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  993) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  994) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  995) static void rfcomm_tty_throttle(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  996) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  997) 	struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  998) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  999) 	BT_DBG("tty %p dev %p", tty, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) 	rfcomm_dlc_throttle(dev->dlc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) static void rfcomm_tty_unthrottle(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) 	struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) 	BT_DBG("tty %p dev %p", tty, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) 	rfcomm_dlc_unthrottle(dev->dlc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) static int rfcomm_tty_chars_in_buffer(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) 	struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) 	BT_DBG("tty %p dev %p", tty, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) 	if (!dev || !dev->dlc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) 	if (!skb_queue_empty(&dev->dlc->tx_queue))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) 		return dev->dlc->mtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) static void rfcomm_tty_flush_buffer(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) 	struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) 	BT_DBG("tty %p dev %p", tty, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) 	if (!dev || !dev->dlc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) 	skb_queue_purge(&dev->dlc->tx_queue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) 	tty_wakeup(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) static void rfcomm_tty_send_xchar(struct tty_struct *tty, char ch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) 	BT_DBG("tty %p ch %c", tty, ch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) static void rfcomm_tty_wait_until_sent(struct tty_struct *tty, int timeout)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) 	BT_DBG("tty %p timeout %d", tty, timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) static void rfcomm_tty_hangup(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) 	struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) 	BT_DBG("tty %p dev %p", tty, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) 	tty_port_hangup(&dev->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) static int rfcomm_tty_tiocmget(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) 	struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) 	BT_DBG("tty %p dev %p", tty, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) 	return dev->modem_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) static int rfcomm_tty_tiocmset(struct tty_struct *tty, unsigned int set, unsigned int clear)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) 	struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) 	struct rfcomm_dlc *dlc = dev->dlc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) 	u8 v24_sig;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) 	BT_DBG("tty %p dev %p set 0x%02x clear 0x%02x", tty, dev, set, clear);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) 	rfcomm_dlc_get_modem_status(dlc, &v24_sig);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) 	if (set & TIOCM_DSR || set & TIOCM_DTR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) 		v24_sig |= RFCOMM_V24_RTC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) 	if (set & TIOCM_RTS || set & TIOCM_CTS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) 		v24_sig |= RFCOMM_V24_RTR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) 	if (set & TIOCM_RI)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) 		v24_sig |= RFCOMM_V24_IC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) 	if (set & TIOCM_CD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) 		v24_sig |= RFCOMM_V24_DV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) 	if (clear & TIOCM_DSR || clear & TIOCM_DTR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) 		v24_sig &= ~RFCOMM_V24_RTC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) 	if (clear & TIOCM_RTS || clear & TIOCM_CTS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) 		v24_sig &= ~RFCOMM_V24_RTR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) 	if (clear & TIOCM_RI)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) 		v24_sig &= ~RFCOMM_V24_IC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) 	if (clear & TIOCM_CD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) 		v24_sig &= ~RFCOMM_V24_DV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) 	rfcomm_dlc_set_modem_status(dlc, v24_sig);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) /* ---- TTY structure ---- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) static const struct tty_operations rfcomm_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) 	.open			= rfcomm_tty_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) 	.close			= rfcomm_tty_close,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) 	.write			= rfcomm_tty_write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) 	.write_room		= rfcomm_tty_write_room,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) 	.chars_in_buffer	= rfcomm_tty_chars_in_buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) 	.flush_buffer		= rfcomm_tty_flush_buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) 	.ioctl			= rfcomm_tty_ioctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) 	.throttle		= rfcomm_tty_throttle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) 	.unthrottle		= rfcomm_tty_unthrottle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) 	.set_termios		= rfcomm_tty_set_termios,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) 	.send_xchar		= rfcomm_tty_send_xchar,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) 	.hangup			= rfcomm_tty_hangup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) 	.wait_until_sent	= rfcomm_tty_wait_until_sent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) 	.tiocmget		= rfcomm_tty_tiocmget,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) 	.tiocmset		= rfcomm_tty_tiocmset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) 	.install                = rfcomm_tty_install,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) 	.cleanup                = rfcomm_tty_cleanup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) int __init rfcomm_init_ttys(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) 	int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) 	rfcomm_tty_driver = alloc_tty_driver(RFCOMM_TTY_PORTS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) 	if (!rfcomm_tty_driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) 	rfcomm_tty_driver->driver_name	= "rfcomm";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) 	rfcomm_tty_driver->name		= "rfcomm";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) 	rfcomm_tty_driver->major	= RFCOMM_TTY_MAJOR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) 	rfcomm_tty_driver->minor_start	= RFCOMM_TTY_MINOR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) 	rfcomm_tty_driver->type		= TTY_DRIVER_TYPE_SERIAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) 	rfcomm_tty_driver->subtype	= SERIAL_TYPE_NORMAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) 	rfcomm_tty_driver->flags	= TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) 	rfcomm_tty_driver->init_termios	= tty_std_termios;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) 	rfcomm_tty_driver->init_termios.c_cflag	= B9600 | CS8 | CREAD | HUPCL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) 	rfcomm_tty_driver->init_termios.c_lflag &= ~ICANON;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) 	tty_set_operations(rfcomm_tty_driver, &rfcomm_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) 	error = tty_register_driver(rfcomm_tty_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) 	if (error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) 		BT_ERR("Can't register RFCOMM TTY driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) 		put_tty_driver(rfcomm_tty_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) 		return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) 	BT_INFO("RFCOMM TTY layer initialized");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) void rfcomm_cleanup_ttys(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) 	tty_unregister_driver(rfcomm_tty_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) 	put_tty_driver(rfcomm_tty_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) }