^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * USB Serial Converter driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2009 - 2013 Johan Hovold (jhovold@gmail.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (C) 1999 - 2012 Greg Kroah-Hartman (greg@kroah.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Copyright (C) 2000 Peter Berger (pberger@brimson.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Copyright (C) 2000 Al Borchers (borchers@steinerpoint.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * This driver was originally based on the ACM driver by Armin Fuerst (which was
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * based on a driver by Brad Keryan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * See Documentation/usb/usb-serial.rst for more information on using this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <linux/tty.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <linux/tty_driver.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <linux/tty_flip.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <linux/moduleparam.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include <linux/seq_file.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include <linux/spinlock.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include <linux/mutex.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #include <linux/list.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #include <linux/uaccess.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #include <linux/serial.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include <linux/usb.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #include <linux/usb/serial.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #include <linux/kfifo.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #include <linux/idr.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define DRIVER_AUTHOR "Greg Kroah-Hartman <gregkh@linuxfoundation.org>"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define DRIVER_DESC "USB Serial Driver core"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define USB_SERIAL_TTY_MAJOR 188
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define USB_SERIAL_TTY_MINORS 512 /* should be enough for a while */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) /* There is no MODULE_DEVICE_TABLE for usbserial.c. Instead
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) the MODULE_DEVICE_TABLE declarations in each serial driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) cause the "hotplug" program to pull in whatever module is necessary
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) via modprobe, and modprobe will load usbserial because the serial
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) drivers depend on it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) static DEFINE_IDR(serial_minors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) static DEFINE_MUTEX(table_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) static LIST_HEAD(usb_serial_driver_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) * Look up the serial port structure. If it is found and it hasn't been
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) * disconnected, return with the parent usb_serial structure's disc_mutex held
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) * and its refcount incremented. Otherwise return NULL.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) struct usb_serial_port *usb_serial_port_get_by_minor(unsigned minor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) struct usb_serial *serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) struct usb_serial_port *port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) mutex_lock(&table_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) port = idr_find(&serial_minors, minor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) if (!port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) serial = port->serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) mutex_lock(&serial->disc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) if (serial->disconnected) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) mutex_unlock(&serial->disc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) port = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) kref_get(&serial->kref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) mutex_unlock(&table_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) return port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) static int allocate_minors(struct usb_serial *serial, int num_ports)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) struct usb_serial_port *port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) unsigned int i, j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) int minor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) dev_dbg(&serial->interface->dev, "%s %d\n", __func__, num_ports);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) mutex_lock(&table_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) for (i = 0; i < num_ports; ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) port = serial->port[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) minor = idr_alloc(&serial_minors, port, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) USB_SERIAL_TTY_MINORS, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) if (minor < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) port->minor = minor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) port->port_number = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) serial->minors_reserved = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) mutex_unlock(&table_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) /* unwind the already allocated minors */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) for (j = 0; j < i; ++j)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) idr_remove(&serial_minors, serial->port[j]->minor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) mutex_unlock(&table_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) return minor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) static void release_minors(struct usb_serial *serial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) mutex_lock(&table_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) for (i = 0; i < serial->num_ports; ++i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) idr_remove(&serial_minors, serial->port[i]->minor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) mutex_unlock(&table_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) serial->minors_reserved = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) static void destroy_serial(struct kref *kref)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) struct usb_serial *serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) struct usb_serial_port *port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) serial = to_usb_serial(kref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) /* return the minor range that this device had */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) if (serial->minors_reserved)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) release_minors(serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) if (serial->attached && serial->type->release)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) serial->type->release(serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) /* Now that nothing is using the ports, they can be freed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) for (i = 0; i < serial->num_port_pointers; ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) port = serial->port[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) if (port) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) port->serial = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) put_device(&port->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) usb_put_intf(serial->interface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) usb_put_dev(serial->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) kfree(serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) void usb_serial_put(struct usb_serial *serial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) kref_put(&serial->kref, destroy_serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) /*****************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) * Driver tty interface functions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) *****************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) * serial_install - install tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) * @driver: the driver (USB in our case)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) * @tty: the tty being created
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) * Initialise the termios structure for this tty. We use the default
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) * USB serial settings but permit them to be overridden by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) * serial->type->init_termios on first open.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) * This is the first place a new tty gets used. Hence this is where we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) * acquire references to the usb_serial structure and the driver module,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) * where we store a pointer to the port, and where we do an autoresume.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) * All these actions are reversed in serial_cleanup().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) static int serial_install(struct tty_driver *driver, struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) int idx = tty->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) struct usb_serial *serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) struct usb_serial_port *port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) bool init_termios;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) int retval = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) port = usb_serial_port_get_by_minor(idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) if (!port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) serial = port->serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) if (!try_module_get(serial->type->driver.owner))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) goto error_module_get;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) retval = usb_autopm_get_interface(serial->interface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) goto error_get_interface;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) init_termios = (driver->termios[idx] == NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) retval = tty_standard_install(driver, tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) goto error_init_termios;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) mutex_unlock(&serial->disc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) /* allow the driver to update the initial settings */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) if (init_termios && serial->type->init_termios)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) serial->type->init_termios(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) tty->driver_data = port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) error_init_termios:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) usb_autopm_put_interface(serial->interface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) error_get_interface:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) module_put(serial->type->driver.owner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) error_module_get:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) usb_serial_put(serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) mutex_unlock(&serial->disc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) static int serial_port_activate(struct tty_port *tport, struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) struct usb_serial_port *port =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) container_of(tport, struct usb_serial_port, port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) struct usb_serial *serial = port->serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) int retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) mutex_lock(&serial->disc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) if (serial->disconnected)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) retval = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) retval = port->serial->type->open(tty, port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) mutex_unlock(&serial->disc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) if (retval < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) retval = usb_translate_errors(retval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) static int serial_open(struct tty_struct *tty, struct file *filp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) dev_dbg(tty->dev, "%s\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) return tty_port_open(&port->port, tty, filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) * serial_port_shutdown - shut down hardware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) * @tport: tty port to shut down
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) * Shut down a USB serial port. Serialized against activate by the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) * tport mutex and kept to matching open/close pairs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) * of calls by the initialized flag.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) * Not called if tty is console.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) static void serial_port_shutdown(struct tty_port *tport)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) struct usb_serial_port *port =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) container_of(tport, struct usb_serial_port, port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) struct usb_serial_driver *drv = port->serial->type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) if (drv->close)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) drv->close(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) static void serial_hangup(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) dev_dbg(tty->dev, "%s\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) tty_port_hangup(&port->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) static void serial_close(struct tty_struct *tty, struct file *filp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) dev_dbg(tty->dev, "%s\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) tty_port_close(&port->port, tty, filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) * serial_cleanup - free resources post close/hangup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) * @tty: tty to clean up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) * Do the resource freeing and refcount dropping for the port.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) * Avoid freeing the console.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) * Called asynchronously after the last tty kref is dropped.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) static void serial_cleanup(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) struct usb_serial *serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) struct module *owner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) dev_dbg(tty->dev, "%s\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) /* The console is magical. Do not hang up the console hardware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) * or there will be tears.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) if (port->port.console)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) tty->driver_data = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) serial = port->serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) owner = serial->type->driver.owner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) usb_autopm_put_interface(serial->interface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) usb_serial_put(serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) module_put(owner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) static int serial_write(struct tty_struct *tty, const unsigned char *buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) int count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) int retval = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) if (port->serial->dev->state == USB_STATE_NOTATTACHED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) dev_dbg(tty->dev, "%s - %d byte(s)\n", __func__, count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) retval = port->serial->type->write(tty, port, buf, count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) if (retval < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) retval = usb_translate_errors(retval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) static int serial_write_room(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) dev_dbg(tty->dev, "%s\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) return port->serial->type->write_room(tty);
^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) static int serial_chars_in_buffer(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) struct usb_serial *serial = port->serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) dev_dbg(tty->dev, "%s\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) if (serial->disconnected)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) return serial->type->chars_in_buffer(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) static void serial_wait_until_sent(struct tty_struct *tty, int timeout)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) struct usb_serial *serial = port->serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) dev_dbg(tty->dev, "%s\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) if (!port->serial->type->wait_until_sent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) mutex_lock(&serial->disc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) if (!serial->disconnected)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) port->serial->type->wait_until_sent(tty, timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) mutex_unlock(&serial->disc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) static void serial_throttle(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) dev_dbg(tty->dev, "%s\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) if (port->serial->type->throttle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) port->serial->type->throttle(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) static void serial_unthrottle(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) dev_dbg(tty->dev, "%s\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) if (port->serial->type->unthrottle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) port->serial->type->unthrottle(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) static int serial_get_serial(struct tty_struct *tty, struct serial_struct *ss)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) if (port->serial->type->get_serial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) return port->serial->type->get_serial(tty, ss);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) return -ENOTTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) static int serial_set_serial(struct tty_struct *tty, struct serial_struct *ss)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) if (port->serial->type->set_serial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) return port->serial->type->set_serial(tty, ss);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) return -ENOTTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) static int serial_ioctl(struct tty_struct *tty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) unsigned int cmd, unsigned long arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) int retval = -ENOIOCTLCMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) dev_dbg(tty->dev, "%s - cmd 0x%04x\n", __func__, cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) case TIOCMIWAIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) if (port->serial->type->tiocmiwait)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) retval = port->serial->type->tiocmiwait(tty, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) if (port->serial->type->ioctl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) retval = port->serial->type->ioctl(tty, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) static void serial_set_termios(struct tty_struct *tty, struct ktermios *old)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) dev_dbg(tty->dev, "%s\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) if (port->serial->type->set_termios)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) port->serial->type->set_termios(tty, port, old);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) tty_termios_copy_hw(&tty->termios, old);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) static int serial_break(struct tty_struct *tty, int break_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) dev_dbg(tty->dev, "%s\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) if (port->serial->type->break_ctl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) port->serial->type->break_ctl(tty, break_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) return 0;
^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) static int serial_proc_show(struct seq_file *m, void *v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) struct usb_serial *serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) struct usb_serial_port *port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) char tmp[40];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) seq_puts(m, "usbserinfo:1.0 driver:2.0\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) for (i = 0; i < USB_SERIAL_TTY_MINORS; ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) port = usb_serial_port_get_by_minor(i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) if (port == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) serial = port->serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) seq_printf(m, "%d:", i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) if (serial->type->driver.owner)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) seq_printf(m, " module:%s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) module_name(serial->type->driver.owner));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) seq_printf(m, " name:\"%s\"",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) serial->type->description);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) seq_printf(m, " vendor:%04x product:%04x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) le16_to_cpu(serial->dev->descriptor.idVendor),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) le16_to_cpu(serial->dev->descriptor.idProduct));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) seq_printf(m, " num_ports:%d", serial->num_ports);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) seq_printf(m, " port:%d", port->port_number);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) usb_make_path(serial->dev, tmp, sizeof(tmp));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) seq_printf(m, " path:%s", tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) seq_putc(m, '\n');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) usb_serial_put(serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) mutex_unlock(&serial->disc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) static int serial_tiocmget(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) dev_dbg(tty->dev, "%s\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) if (port->serial->type->tiocmget)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) return port->serial->type->tiocmget(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) static int serial_tiocmset(struct tty_struct *tty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) unsigned int set, unsigned int clear)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) dev_dbg(tty->dev, "%s\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) if (port->serial->type->tiocmset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) return port->serial->type->tiocmset(tty, set, clear);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) static int serial_get_icount(struct tty_struct *tty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) struct serial_icounter_struct *icount)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) dev_dbg(tty->dev, "%s\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) if (port->serial->type->get_icount)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) return port->serial->type->get_icount(tty, icount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) * We would be calling tty_wakeup here, but unfortunately some line
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) * disciplines have an annoying habit of calling tty->write from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) * the write wakeup callback (e.g. n_hdlc.c).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) void usb_serial_port_softint(struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) schedule_work(&port->work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) EXPORT_SYMBOL_GPL(usb_serial_port_softint);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) static void usb_serial_port_work(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) struct usb_serial_port *port =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) container_of(work, struct usb_serial_port, work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) tty_port_tty_wakeup(&port->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) static void usb_serial_port_poison_urbs(struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) for (i = 0; i < ARRAY_SIZE(port->read_urbs); ++i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) usb_poison_urb(port->read_urbs[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) for (i = 0; i < ARRAY_SIZE(port->write_urbs); ++i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) usb_poison_urb(port->write_urbs[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) usb_poison_urb(port->interrupt_in_urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) usb_poison_urb(port->interrupt_out_urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) static void usb_serial_port_unpoison_urbs(struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) for (i = 0; i < ARRAY_SIZE(port->read_urbs); ++i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) usb_unpoison_urb(port->read_urbs[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) for (i = 0; i < ARRAY_SIZE(port->write_urbs); ++i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) usb_unpoison_urb(port->write_urbs[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) usb_unpoison_urb(port->interrupt_in_urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) usb_unpoison_urb(port->interrupt_out_urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) static void usb_serial_port_release(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) struct usb_serial_port *port = to_usb_serial_port(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) dev_dbg(dev, "%s\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) usb_free_urb(port->interrupt_in_urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) usb_free_urb(port->interrupt_out_urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) for (i = 0; i < ARRAY_SIZE(port->read_urbs); ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) usb_free_urb(port->read_urbs[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) kfree(port->bulk_in_buffers[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) for (i = 0; i < ARRAY_SIZE(port->write_urbs); ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) usb_free_urb(port->write_urbs[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) kfree(port->bulk_out_buffers[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) kfifo_free(&port->write_fifo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) kfree(port->interrupt_in_buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) kfree(port->interrupt_out_buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) tty_port_destroy(&port->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) kfree(port);
^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) static struct usb_serial *create_serial(struct usb_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) struct usb_interface *interface,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) struct usb_serial_driver *driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) struct usb_serial *serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) serial = kzalloc(sizeof(*serial), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) if (!serial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) serial->dev = usb_get_dev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) serial->type = driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) serial->interface = usb_get_intf(interface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) kref_init(&serial->kref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) mutex_init(&serial->disc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) serial->minors_reserved = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) return serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) static const struct usb_device_id *match_dynamic_id(struct usb_interface *intf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) struct usb_serial_driver *drv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) struct usb_dynid *dynid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) spin_lock(&drv->dynids.lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) list_for_each_entry(dynid, &drv->dynids.list, node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) if (usb_match_one_id(intf, &dynid->id)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) spin_unlock(&drv->dynids.lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) return &dynid->id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) spin_unlock(&drv->dynids.lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) static const struct usb_device_id *get_iface_id(struct usb_serial_driver *drv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) struct usb_interface *intf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) const struct usb_device_id *id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) id = usb_match_id(intf, drv->id_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) if (id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) dev_dbg(&intf->dev, "static descriptor matches\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) id = match_dynamic_id(intf, drv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) if (id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) dev_dbg(&intf->dev, "dynamic descriptor matches\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) return id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) /* Caller must hold table_lock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) static struct usb_serial_driver *search_serial_device(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) struct usb_interface *iface)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) const struct usb_device_id *id = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) struct usb_serial_driver *drv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) struct usb_driver *driver = to_usb_driver(iface->dev.driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) /* Check if the usb id matches a known device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) list_for_each_entry(drv, &usb_serial_driver_list, driver_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) if (drv->usb_driver == driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) id = get_iface_id(drv, iface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) if (id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) return drv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) static int serial_port_carrier_raised(struct tty_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) struct usb_serial_port *p = container_of(port, struct usb_serial_port, port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) struct usb_serial_driver *drv = p->serial->type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) if (drv->carrier_raised)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) return drv->carrier_raised(p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) /* No carrier control - don't block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) static void serial_port_dtr_rts(struct tty_port *port, int on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) struct usb_serial_port *p = container_of(port, struct usb_serial_port, port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) struct usb_serial_driver *drv = p->serial->type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) if (drv->dtr_rts)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) drv->dtr_rts(p, on);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) static ssize_t port_number_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) struct device_attribute *attr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) struct usb_serial_port *port = to_usb_serial_port(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) return sprintf(buf, "%u\n", port->port_number);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) static DEVICE_ATTR_RO(port_number);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) static struct attribute *usb_serial_port_attrs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) &dev_attr_port_number.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) ATTRIBUTE_GROUPS(usb_serial_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) static const struct tty_port_operations serial_port_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) .carrier_raised = serial_port_carrier_raised,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) .dtr_rts = serial_port_dtr_rts,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) .activate = serial_port_activate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) .shutdown = serial_port_shutdown,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) static void find_endpoints(struct usb_serial *serial,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) struct usb_serial_endpoints *epds)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) struct device *dev = &serial->interface->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) struct usb_host_interface *iface_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) struct usb_endpoint_descriptor *epd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) BUILD_BUG_ON(ARRAY_SIZE(epds->bulk_in) < USB_MAXENDPOINTS / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) BUILD_BUG_ON(ARRAY_SIZE(epds->bulk_out) < USB_MAXENDPOINTS / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) BUILD_BUG_ON(ARRAY_SIZE(epds->interrupt_in) < USB_MAXENDPOINTS / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) BUILD_BUG_ON(ARRAY_SIZE(epds->interrupt_out) < USB_MAXENDPOINTS / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) iface_desc = serial->interface->cur_altsetting;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) epd = &iface_desc->endpoint[i].desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) if (usb_endpoint_is_bulk_in(epd)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) dev_dbg(dev, "found bulk in on endpoint %u\n", i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) epds->bulk_in[epds->num_bulk_in++] = epd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) } else if (usb_endpoint_is_bulk_out(epd)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) dev_dbg(dev, "found bulk out on endpoint %u\n", i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) epds->bulk_out[epds->num_bulk_out++] = epd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) } else if (usb_endpoint_is_int_in(epd)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) dev_dbg(dev, "found interrupt in on endpoint %u\n", i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) epds->interrupt_in[epds->num_interrupt_in++] = epd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) } else if (usb_endpoint_is_int_out(epd)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) dev_dbg(dev, "found interrupt out on endpoint %u\n", i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) epds->interrupt_out[epds->num_interrupt_out++] = epd;
^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) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) static int setup_port_bulk_in(struct usb_serial_port *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) struct usb_endpoint_descriptor *epd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) struct usb_serial_driver *type = port->serial->type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) struct usb_device *udev = port->serial->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) int buffer_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) buffer_size = max_t(int, type->bulk_in_size, usb_endpoint_maxp(epd));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) port->bulk_in_size = buffer_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) port->bulk_in_endpointAddress = epd->bEndpointAddress;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) for (i = 0; i < ARRAY_SIZE(port->read_urbs); ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) set_bit(i, &port->read_urbs_free);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) port->read_urbs[i] = usb_alloc_urb(0, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) if (!port->read_urbs[i])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) port->bulk_in_buffers[i] = kmalloc(buffer_size, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) if (!port->bulk_in_buffers[i])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) usb_fill_bulk_urb(port->read_urbs[i], udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) usb_rcvbulkpipe(udev, epd->bEndpointAddress),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) port->bulk_in_buffers[i], buffer_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) type->read_bulk_callback, port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) port->read_urb = port->read_urbs[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) port->bulk_in_buffer = port->bulk_in_buffers[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) static int setup_port_bulk_out(struct usb_serial_port *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) struct usb_endpoint_descriptor *epd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) struct usb_serial_driver *type = port->serial->type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) struct usb_device *udev = port->serial->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) int buffer_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) if (kfifo_alloc(&port->write_fifo, PAGE_SIZE, GFP_KERNEL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) if (type->bulk_out_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) buffer_size = type->bulk_out_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) buffer_size = usb_endpoint_maxp(epd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) port->bulk_out_size = buffer_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) port->bulk_out_endpointAddress = epd->bEndpointAddress;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) for (i = 0; i < ARRAY_SIZE(port->write_urbs); ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) set_bit(i, &port->write_urbs_free);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) port->write_urbs[i] = usb_alloc_urb(0, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) if (!port->write_urbs[i])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) port->bulk_out_buffers[i] = kmalloc(buffer_size, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) if (!port->bulk_out_buffers[i])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) usb_fill_bulk_urb(port->write_urbs[i], udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) usb_sndbulkpipe(udev, epd->bEndpointAddress),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) port->bulk_out_buffers[i], buffer_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) type->write_bulk_callback, port);
^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) port->write_urb = port->write_urbs[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) port->bulk_out_buffer = port->bulk_out_buffers[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) static int setup_port_interrupt_in(struct usb_serial_port *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) struct usb_endpoint_descriptor *epd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) struct usb_serial_driver *type = port->serial->type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) struct usb_device *udev = port->serial->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) int buffer_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) port->interrupt_in_urb = usb_alloc_urb(0, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) if (!port->interrupt_in_urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) buffer_size = usb_endpoint_maxp(epd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) port->interrupt_in_endpointAddress = epd->bEndpointAddress;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) port->interrupt_in_buffer = kmalloc(buffer_size, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) if (!port->interrupt_in_buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) usb_fill_int_urb(port->interrupt_in_urb, udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) usb_rcvintpipe(udev, epd->bEndpointAddress),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) port->interrupt_in_buffer, buffer_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) type->read_int_callback, port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) epd->bInterval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) static int setup_port_interrupt_out(struct usb_serial_port *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) struct usb_endpoint_descriptor *epd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) struct usb_serial_driver *type = port->serial->type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) struct usb_device *udev = port->serial->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) int buffer_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) port->interrupt_out_urb = usb_alloc_urb(0, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) if (!port->interrupt_out_urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) buffer_size = usb_endpoint_maxp(epd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) port->interrupt_out_size = buffer_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) port->interrupt_out_endpointAddress = epd->bEndpointAddress;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) port->interrupt_out_buffer = kmalloc(buffer_size, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) if (!port->interrupt_out_buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) usb_fill_int_urb(port->interrupt_out_urb, udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) usb_sndintpipe(udev, epd->bEndpointAddress),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) port->interrupt_out_buffer, buffer_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) type->write_int_callback, port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) epd->bInterval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) static int usb_serial_probe(struct usb_interface *interface,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) const struct usb_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) struct device *ddev = &interface->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) struct usb_device *dev = interface_to_usbdev(interface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) struct usb_serial *serial = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) struct usb_serial_port *port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) struct usb_serial_endpoints *epds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) struct usb_serial_driver *type = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) int retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) int num_ports = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) unsigned char max_endpoints;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) mutex_lock(&table_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) type = search_serial_device(interface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) if (!type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) mutex_unlock(&table_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) dev_dbg(ddev, "none matched\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) if (!try_module_get(type->driver.owner)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) mutex_unlock(&table_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) dev_err(ddev, "module get failed, exiting\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) mutex_unlock(&table_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) serial = create_serial(dev, interface, type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) if (!serial) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) retval = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) goto err_put_module;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) /* if this device type has a probe function, call it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) if (type->probe) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) const struct usb_device_id *id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) id = get_iface_id(type, interface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) retval = type->probe(serial, id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) if (retval) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) dev_dbg(ddev, "sub driver rejected device\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) goto err_put_serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) /* descriptor matches, let's find the endpoints needed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) epds = kzalloc(sizeof(*epds), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) if (!epds) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) retval = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) goto err_put_serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) find_endpoints(serial, epds);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) if (epds->num_bulk_in < type->num_bulk_in ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) epds->num_bulk_out < type->num_bulk_out ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) epds->num_interrupt_in < type->num_interrupt_in ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) epds->num_interrupt_out < type->num_interrupt_out) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) dev_err(ddev, "required endpoints missing\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) retval = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) goto err_free_epds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) if (type->calc_num_ports) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) retval = type->calc_num_ports(serial, epds);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) if (retval < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) goto err_free_epds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) num_ports = retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) if (!num_ports)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) num_ports = type->num_ports;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) if (num_ports > MAX_NUM_PORTS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) dev_warn(ddev, "too many ports requested: %d\n", num_ports);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) num_ports = MAX_NUM_PORTS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) serial->num_ports = (unsigned char)num_ports;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) serial->num_bulk_in = epds->num_bulk_in;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) serial->num_bulk_out = epds->num_bulk_out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) serial->num_interrupt_in = epds->num_interrupt_in;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) serial->num_interrupt_out = epds->num_interrupt_out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) /* found all that we need */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) dev_info(ddev, "%s converter detected\n", type->description);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) /* create our ports, we need as many as the max endpoints */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) /* we don't use num_ports here because some devices have more
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) endpoint pairs than ports */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) max_endpoints = max(epds->num_bulk_in, epds->num_bulk_out);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) max_endpoints = max(max_endpoints, epds->num_interrupt_in);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) max_endpoints = max(max_endpoints, epds->num_interrupt_out);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) max_endpoints = max(max_endpoints, serial->num_ports);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) serial->num_port_pointers = max_endpoints;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) dev_dbg(ddev, "setting up %d port structure(s)\n", max_endpoints);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) for (i = 0; i < max_endpoints; ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) port = kzalloc(sizeof(struct usb_serial_port), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) if (!port) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) retval = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) goto err_free_epds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) tty_port_init(&port->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) port->port.ops = &serial_port_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) port->serial = serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) spin_lock_init(&port->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) /* Keep this for private driver use for the moment but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) should probably go away */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) INIT_WORK(&port->work, usb_serial_port_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) serial->port[i] = port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) port->dev.parent = &interface->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) port->dev.driver = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) port->dev.bus = &usb_serial_bus_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) port->dev.release = &usb_serial_port_release;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) port->dev.groups = usb_serial_port_groups;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) device_initialize(&port->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) /* set up the endpoint information */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) for (i = 0; i < epds->num_bulk_in; ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) retval = setup_port_bulk_in(serial->port[i], epds->bulk_in[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) goto err_free_epds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) for (i = 0; i < epds->num_bulk_out; ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) retval = setup_port_bulk_out(serial->port[i],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) epds->bulk_out[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) goto err_free_epds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) if (serial->type->read_int_callback) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) for (i = 0; i < epds->num_interrupt_in; ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) retval = setup_port_interrupt_in(serial->port[i],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) epds->interrupt_in[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) goto err_free_epds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) } else if (epds->num_interrupt_in) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) dev_dbg(ddev, "The device claims to support interrupt in transfers, but read_int_callback is not defined\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) if (serial->type->write_int_callback) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) for (i = 0; i < epds->num_interrupt_out; ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) retval = setup_port_interrupt_out(serial->port[i],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) epds->interrupt_out[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) goto err_free_epds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) } else if (epds->num_interrupt_out) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) dev_dbg(ddev, "The device claims to support interrupt out transfers, but write_int_callback is not defined\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) usb_set_intfdata(interface, serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) /* if this device type has an attach function, call it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) if (type->attach) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) retval = type->attach(serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) if (retval < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) goto err_free_epds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) serial->attached = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) if (retval > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) /* quietly accept this device, but don't bind to a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) serial port as it's about to disappear */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) serial->num_ports = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) serial->attached = 1;
^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) retval = allocate_minors(serial, num_ports);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) if (retval) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) dev_err(ddev, "No more free serial minor numbers\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) goto err_free_epds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) /* register all of the individual ports with the driver core */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) for (i = 0; i < num_ports; ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) port = serial->port[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) dev_set_name(&port->dev, "ttyUSB%d", port->minor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) dev_dbg(ddev, "registering %s\n", dev_name(&port->dev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) device_enable_async_suspend(&port->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) retval = device_add(&port->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) dev_err(ddev, "Error registering port device, continuing\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) if (num_ports > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) usb_serial_console_init(serial->port[0]->minor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) kfree(epds);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) module_put(type->driver.owner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) err_free_epds:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) kfree(epds);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) err_put_serial:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) usb_serial_put(serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) err_put_module:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) module_put(type->driver.owner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) static void usb_serial_disconnect(struct usb_interface *interface)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) struct usb_serial *serial = usb_get_intfdata(interface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) struct device *dev = &interface->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) struct usb_serial_port *port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) struct tty_struct *tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) usb_serial_console_disconnect(serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) mutex_lock(&serial->disc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) /* must set a flag, to signal subdrivers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) serial->disconnected = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) mutex_unlock(&serial->disc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) for (i = 0; i < serial->num_ports; ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) port = serial->port[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) tty = tty_port_tty_get(&port->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) if (tty) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) tty_vhangup(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) tty_kref_put(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) usb_serial_port_poison_urbs(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) wake_up_interruptible(&port->port.delta_msr_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) cancel_work_sync(&port->work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) if (device_is_registered(&port->dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) device_del(&port->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) if (serial->type->disconnect)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) serial->type->disconnect(serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) /* let the last holder of this object cause it to be cleaned up */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) usb_serial_put(serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) dev_info(dev, "device disconnected\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) int usb_serial_suspend(struct usb_interface *intf, pm_message_t message)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) struct usb_serial *serial = usb_get_intfdata(intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) int i, r = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) serial->suspending = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) * serial->type->suspend() MUST return 0 in system sleep context,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) * otherwise, the resume callback has to recover device from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) * previous suspend failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) if (serial->type->suspend) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) r = serial->type->suspend(serial, message);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) if (r < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) serial->suspending = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) goto err_out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) for (i = 0; i < serial->num_ports; ++i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) usb_serial_port_poison_urbs(serial->port[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) err_out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) EXPORT_SYMBOL(usb_serial_suspend);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) static void usb_serial_unpoison_port_urbs(struct usb_serial *serial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) for (i = 0; i < serial->num_ports; ++i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) usb_serial_port_unpoison_urbs(serial->port[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) int usb_serial_resume(struct usb_interface *intf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) struct usb_serial *serial = usb_get_intfdata(intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) int rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) usb_serial_unpoison_port_urbs(serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) serial->suspending = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) if (serial->type->resume)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) rv = serial->type->resume(serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) rv = usb_serial_generic_resume(serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) return rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) EXPORT_SYMBOL(usb_serial_resume);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) static int usb_serial_reset_resume(struct usb_interface *intf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) struct usb_serial *serial = usb_get_intfdata(intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) int rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) usb_serial_unpoison_port_urbs(serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) serial->suspending = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) if (serial->type->reset_resume) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) rv = serial->type->reset_resume(serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) rv = -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) intf->needs_binding = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) return rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) static const struct tty_operations serial_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) .open = serial_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) .close = serial_close,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) .write = serial_write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) .hangup = serial_hangup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) .write_room = serial_write_room,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) .ioctl = serial_ioctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) .set_termios = serial_set_termios,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) .throttle = serial_throttle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) .unthrottle = serial_unthrottle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) .break_ctl = serial_break,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) .chars_in_buffer = serial_chars_in_buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) .wait_until_sent = serial_wait_until_sent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) .tiocmget = serial_tiocmget,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) .tiocmset = serial_tiocmset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) .get_icount = serial_get_icount,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) .set_serial = serial_set_serial,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) .get_serial = serial_get_serial,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) .cleanup = serial_cleanup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) .install = serial_install,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) .proc_show = serial_proc_show,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) struct tty_driver *usb_serial_tty_driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) static int __init usb_serial_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) int result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) usb_serial_tty_driver = alloc_tty_driver(USB_SERIAL_TTY_MINORS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) if (!usb_serial_tty_driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) /* Initialize our global data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) result = bus_register(&usb_serial_bus_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) if (result) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) pr_err("%s - registering bus driver failed\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) goto exit_bus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) usb_serial_tty_driver->driver_name = "usbserial";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) usb_serial_tty_driver->name = "ttyUSB";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) usb_serial_tty_driver->major = USB_SERIAL_TTY_MAJOR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) usb_serial_tty_driver->minor_start = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) usb_serial_tty_driver->type = TTY_DRIVER_TYPE_SERIAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) usb_serial_tty_driver->subtype = SERIAL_TYPE_NORMAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) usb_serial_tty_driver->flags = TTY_DRIVER_REAL_RAW |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) TTY_DRIVER_DYNAMIC_DEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) usb_serial_tty_driver->init_termios = tty_std_termios;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) usb_serial_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) | HUPCL | CLOCAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) usb_serial_tty_driver->init_termios.c_ispeed = 9600;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) usb_serial_tty_driver->init_termios.c_ospeed = 9600;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) tty_set_operations(usb_serial_tty_driver, &serial_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) result = tty_register_driver(usb_serial_tty_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) if (result) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) pr_err("%s - tty_register_driver failed\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) goto exit_reg_driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) /* register the generic driver, if we should */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) result = usb_serial_generic_register();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) if (result < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) pr_err("%s - registering generic driver failed\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) goto exit_generic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) exit_generic:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) tty_unregister_driver(usb_serial_tty_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) exit_reg_driver:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) bus_unregister(&usb_serial_bus_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) exit_bus:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) pr_err("%s - returning with error %d\n", __func__, result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) put_tty_driver(usb_serial_tty_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) static void __exit usb_serial_exit(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) usb_serial_console_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) usb_serial_generic_deregister();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) tty_unregister_driver(usb_serial_tty_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) put_tty_driver(usb_serial_tty_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) bus_unregister(&usb_serial_bus_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) idr_destroy(&serial_minors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) module_init(usb_serial_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) module_exit(usb_serial_exit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) #define set_to_generic_if_null(type, function) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) if (!type->function) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) type->function = usb_serial_generic_##function; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) pr_debug("%s: using generic " #function "\n", \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) type->driver.name); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) static void usb_serial_operations_init(struct usb_serial_driver *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) set_to_generic_if_null(device, open);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) set_to_generic_if_null(device, write);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) set_to_generic_if_null(device, close);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) set_to_generic_if_null(device, write_room);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) set_to_generic_if_null(device, chars_in_buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) if (device->tx_empty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) set_to_generic_if_null(device, wait_until_sent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) set_to_generic_if_null(device, read_bulk_callback);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) set_to_generic_if_null(device, write_bulk_callback);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) set_to_generic_if_null(device, process_read_urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) set_to_generic_if_null(device, prepare_write_buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) static int usb_serial_register(struct usb_serial_driver *driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) int retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) if (usb_disabled())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) if (!driver->description)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) driver->description = driver->driver.name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) if (!driver->usb_driver) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) WARN(1, "Serial driver %s has no usb_driver\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) driver->description);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) /* Prevent individual ports from being unbound. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) driver->driver.suppress_bind_attrs = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) usb_serial_operations_init(driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) /* Add this device to our list of devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) mutex_lock(&table_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) list_add(&driver->driver_list, &usb_serial_driver_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) retval = usb_serial_bus_register(driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) if (retval) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) pr_err("problem %d when registering driver %s\n", retval, driver->description);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) list_del(&driver->driver_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) pr_info("USB Serial support registered for %s\n", driver->description);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) mutex_unlock(&table_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) static void usb_serial_deregister(struct usb_serial_driver *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) pr_info("USB Serial deregistering driver %s\n", device->description);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) mutex_lock(&table_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) list_del(&device->driver_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) mutex_unlock(&table_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) usb_serial_bus_deregister(device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) * usb_serial_register_drivers - register drivers for a usb-serial module
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) * @serial_drivers: NULL-terminated array of pointers to drivers to be registered
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) * @name: name of the usb_driver for this set of @serial_drivers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) * @id_table: list of all devices this @serial_drivers set binds to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) * Registers all the drivers in the @serial_drivers array, and dynamically
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) * creates a struct usb_driver with the name @name and id_table of @id_table.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) int usb_serial_register_drivers(struct usb_serial_driver *const serial_drivers[],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) const struct usb_device_id *id_table)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) struct usb_driver *udriver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) struct usb_serial_driver * const *sd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) * udriver must be registered before any of the serial drivers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) * because the store_new_id() routine for the serial drivers (in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) * bus.c) probes udriver.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) * Performance hack: We don't want udriver to be probed until
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) * the serial drivers are registered, because the probe would
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) * simply fail for lack of a matching serial driver.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) * So we leave udriver's id_table set to NULL until we are all set.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) * Suspend/resume support is implemented in the usb-serial core,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) * so fill in the PM-related fields in udriver.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) udriver = kzalloc(sizeof(*udriver), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) if (!udriver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) udriver->name = name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) udriver->no_dynamic_id = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) udriver->supports_autosuspend = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) udriver->suspend = usb_serial_suspend;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) udriver->resume = usb_serial_resume;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) udriver->probe = usb_serial_probe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) udriver->disconnect = usb_serial_disconnect;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) /* we only set the reset_resume field if the serial_driver has one */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) for (sd = serial_drivers; *sd; ++sd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) if ((*sd)->reset_resume) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) udriver->reset_resume = usb_serial_reset_resume;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) rc = usb_register(udriver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) goto failed_usb_register;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) for (sd = serial_drivers; *sd; ++sd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) (*sd)->usb_driver = udriver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) rc = usb_serial_register(*sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) goto failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) /* Now set udriver's id_table and look for matches */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) udriver->id_table = id_table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) rc = driver_attach(&udriver->drvwrap.driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) failed:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) while (sd-- > serial_drivers)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) usb_serial_deregister(*sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) usb_deregister(udriver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) failed_usb_register:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) kfree(udriver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) EXPORT_SYMBOL_GPL(usb_serial_register_drivers);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) * usb_serial_deregister_drivers - deregister drivers for a usb-serial module
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) * @serial_drivers: NULL-terminated array of pointers to drivers to be deregistered
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) * Deregisters all the drivers in the @serial_drivers array and deregisters and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) * frees the struct usb_driver that was created by the call to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) * usb_serial_register_drivers().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) void usb_serial_deregister_drivers(struct usb_serial_driver *const serial_drivers[])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) struct usb_driver *udriver = (*serial_drivers)->usb_driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) for (; *serial_drivers; ++serial_drivers)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) usb_serial_deregister(*serial_drivers);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) usb_deregister(udriver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) kfree(udriver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) EXPORT_SYMBOL_GPL(usb_serial_deregister_drivers);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) MODULE_AUTHOR(DRIVER_AUTHOR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) MODULE_DESCRIPTION(DRIVER_DESC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) MODULE_LICENSE("GPL v2");