TTY: ipwireless, use tty from tty_port
authorJiri Slaby <jslaby@suse.cz>
Mon, 2 Apr 2012 11:54:34 +0000 (13:54 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 9 Apr 2012 18:30:39 +0000 (11:30 -0700)
It does not make the driver less racy though. Close and hangup should
be rewritten and tty refcounting used properly.

Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Cc: Jiri Kosina <jkosina@suse.cz>
Acked-by: David Sterba <dsterba@suse.cz>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/ipwireless/tty.c

index 0b4964d..f8b5fa0 100644 (file)
@@ -51,7 +51,6 @@ struct ipw_tty {
        unsigned int secondary_channel_idx;
        int tty_type;
        struct ipw_network *network;
-       struct tty_struct *linux_tty;
        unsigned int control_lines;
        struct mutex ipw_tty_mutex;
        int tx_bytes_queued;
@@ -105,7 +104,7 @@ static int ipw_open(struct tty_struct *linux_tty, struct file *filp)
 
        tty->port.count++;
 
-       tty->linux_tty = linux_tty;
+       tty->port.tty = linux_tty;
        linux_tty->driver_data = tty;
        linux_tty->low_latency = 1;
 
@@ -122,10 +121,10 @@ static void do_ipw_close(struct ipw_tty *tty)
        tty->port.count--;
 
        if (tty->port.count == 0) {
-               struct tty_struct *linux_tty = tty->linux_tty;
+               struct tty_struct *linux_tty = tty->port.tty;
 
                if (linux_tty != NULL) {
-                       tty->linux_tty = NULL;
+                       tty->port.tty = NULL;
                        linux_tty->driver_data = NULL;
 
                        if (tty->tty_type == TTYTYPE_MODEM)
@@ -165,7 +164,7 @@ void ipwireless_tty_received(struct ipw_tty *tty, unsigned char *data,
        int work = 0;
 
        mutex_lock(&tty->ipw_tty_mutex);
-       linux_tty = tty->linux_tty;
+       linux_tty = tty->port.tty;
        if (linux_tty == NULL) {
                mutex_unlock(&tty->ipw_tty_mutex);
                return;
@@ -553,9 +552,9 @@ void ipwireless_tty_free(struct ipw_tty *tty)
                                       ": deregistering %s device ttyIPWp%d\n",
                                       tty_type_name(ttyj->tty_type), j);
                        ttyj->closing = 1;
-                       if (ttyj->linux_tty != NULL) {
+                       if (ttyj->port.tty != NULL) {
                                mutex_unlock(&ttyj->ipw_tty_mutex);
-                               tty_vhangup(ttyj->linux_tty);
+                               tty_vhangup(ttyj->port.tty);
                                /* FIXME: Exactly how is the tty object locked here
                                   against a parallel ioctl etc */
                                /* FIXME2: hangup does not mean all processes
@@ -651,8 +650,8 @@ ipwireless_tty_notify_control_line_change(struct ipw_tty *tty,
         */
        if ((old_control_lines & IPW_CONTROL_LINE_DCD)
                        && !(tty->control_lines & IPW_CONTROL_LINE_DCD)
-                       && tty->linux_tty) {
-               tty_hangup(tty->linux_tty);
+                       && tty->port.tty) {
+               tty_hangup(tty->port.tty);
        }
 }