Commit f5b0953a authored by Alan Stern's avatar Alan Stern Committed by Live-CD User

usb-serial: put subroutines in logical order

This patch (as1285) rearranges the subroutines in usb-serial.c
concerned with tty lifetimes into a more logical order: install, open,
hangup, close, release.  It also updates the formatting of the
kerneldoc comments.
Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Cc: stable <stable@kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 41bd34dd
...@@ -166,6 +166,41 @@ void usb_serial_put(struct usb_serial *serial) ...@@ -166,6 +166,41 @@ void usb_serial_put(struct usb_serial *serial)
/***************************************************************************** /*****************************************************************************
* Driver tty interface functions * Driver tty interface functions
*****************************************************************************/ *****************************************************************************/
/**
* serial_install - install tty
* @driver: the driver (USB in our case)
* @tty: the tty being created
*
* Create the termios objects for this tty. We use the default
* USB serial settings but permit them to be overridden by
* serial->type->init_termios.
*/
static int serial_install(struct tty_driver *driver, struct tty_struct *tty)
{
int idx = tty->index;
struct usb_serial *serial;
int retval;
/* If the termios setup has yet to be done */
if (tty->driver->termios[idx] == NULL) {
/* perform the standard setup */
retval = tty_init_termios(tty);
if (retval)
return retval;
/* allow the driver to update it */
serial = usb_serial_get_by_index(tty->index);
if (serial->type->init_termios)
serial->type->init_termios(tty);
usb_serial_put(serial);
}
/* Final install (we use the default method) */
tty_driver_kref_get(driver);
tty->count++;
driver->ttys[idx] = tty;
return 0;
}
static int serial_open (struct tty_struct *tty, struct file *filp) static int serial_open (struct tty_struct *tty, struct file *filp)
{ {
struct usb_serial *serial; struct usb_serial *serial;
...@@ -267,10 +302,8 @@ bailout_serial_put: ...@@ -267,10 +302,8 @@ bailout_serial_put:
* serial_do_down - shut down hardware * serial_do_down - shut down hardware
* @port: port to shut down * @port: port to shut down
* *
* Shut down a USB port unless it is the console. We never shut down the * Shut down a USB serial port unless it is the console. We never
* console hardware as it will always be in use. * shut down the console hardware as it will always be in use.
*
* Don't free any resources at this point
*/ */
static void serial_do_down(struct usb_serial_port *port) static void serial_do_down(struct usb_serial_port *port)
{ {
...@@ -278,8 +311,10 @@ static void serial_do_down(struct usb_serial_port *port) ...@@ -278,8 +311,10 @@ static void serial_do_down(struct usb_serial_port *port)
struct usb_serial *serial; struct usb_serial *serial;
struct module *owner; struct module *owner;
/* The console is magical, do not hang up the console hardware /*
or there will be tears */ * The console is magical. Do not hang up the console hardware
* or there will be tears.
*/
if (port->console) if (port->console)
return; return;
...@@ -293,24 +328,50 @@ static void serial_do_down(struct usb_serial_port *port) ...@@ -293,24 +328,50 @@ static void serial_do_down(struct usb_serial_port *port)
mutex_unlock(&port->mutex); mutex_unlock(&port->mutex);
} }
static void serial_hangup(struct tty_struct *tty)
{
struct usb_serial_port *port = tty->driver_data;
serial_do_down(port);
tty_port_hangup(&port->port);
/* We must not free port yet - the USB serial layer depends on it's
continued existence */
}
static void serial_close(struct tty_struct *tty, struct file *filp)
{
struct usb_serial_port *port = tty->driver_data;
if (!port)
return;
dbg("%s - port %d", __func__, port->number);
if (tty_port_close_start(&port->port, tty, filp) == 0)
return;
serial_do_down(port);
tty_port_close_end(&port->port, tty);
tty_port_tty_set(&port->port, NULL);
}
/** /**
* serial_do_free - free resources post close/hangup * serial_do_free - free resources post close/hangup
* @port: port to free up * @port: port to free up
* *
* Do the resource freeing and refcount dropping for the port. We must * Do the resource freeing and refcount dropping for the port.
* be careful about ordering and we must avoid freeing up the console. * Avoid freeing the console.
* *
* Called when the last tty kref is dropped. * Called when the last tty kref is dropped.
*/ */
static void serial_do_free(struct tty_struct *tty) static void serial_do_free(struct tty_struct *tty)
{ {
struct usb_serial_port *port = tty->driver_data; struct usb_serial_port *port = tty->driver_data;
struct usb_serial *serial; struct usb_serial *serial;
struct module *owner; struct module *owner;
/* The console is magical, do not hang up the console hardware /* The console is magical. Do not hang up the console hardware
or there will be tears */ * or there will be tears.
*/
if (port == NULL || port->console) if (port == NULL || port->console)
return; return;
...@@ -326,32 +387,6 @@ static void serial_do_free(struct tty_struct *tty) ...@@ -326,32 +387,6 @@ static void serial_do_free(struct tty_struct *tty)
module_put(owner); module_put(owner);
} }
static void serial_close(struct tty_struct *tty, struct file *filp)
{
struct usb_serial_port *port = tty->driver_data;
if (!port)
return;
dbg("%s - port %d", __func__, port->number);
if (tty_port_close_start(&port->port, tty, filp) == 0)
return;
serial_do_down(port);
tty_port_close_end(&port->port, tty);
tty_port_tty_set(&port->port, NULL);
}
static void serial_hangup(struct tty_struct *tty)
{
struct usb_serial_port *port = tty->driver_data;
serial_do_down(port);
tty_port_hangup(&port->port);
/* We must not free port yet - the USB serial layer depends on it's
continued existence */
}
static int serial_write(struct tty_struct *tty, const unsigned char *buf, static int serial_write(struct tty_struct *tty, const unsigned char *buf,
int count) int count)
{ {
...@@ -699,41 +734,6 @@ static const struct tty_port_operations serial_port_ops = { ...@@ -699,41 +734,6 @@ static const struct tty_port_operations serial_port_ops = {
.dtr_rts = serial_dtr_rts, .dtr_rts = serial_dtr_rts,
}; };
/**
* serial_install - install tty
* @driver: the driver (USB in our case)
* @tty: the tty being created
*
* Create the termios objects for this tty. We use the default USB
* serial ones but permit them to be overriddenby serial->type->termios.
* This lets us remove all the ugly hackery
*/
static int serial_install(struct tty_driver *driver, struct tty_struct *tty)
{
int idx = tty->index;
struct usb_serial *serial;
int retval;
/* If the termios setup has yet to be done */
if (tty->driver->termios[idx] == NULL) {
/* perform the standard setup */
retval = tty_init_termios(tty);
if (retval)
return retval;
/* allow the driver to update it */
serial = usb_serial_get_by_index(tty->index);
if (serial->type->init_termios)
serial->type->init_termios(tty);
usb_serial_put(serial);
}
/* Final install (we use the default method) */
tty_driver_kref_get(driver);
tty->count++;
driver->ttys[idx] = tty;
return 0;
}
int usb_serial_probe(struct usb_interface *interface, int usb_serial_probe(struct usb_interface *interface,
const struct usb_device_id *id) const struct usb_device_id *id)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment