^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) }