Commit 19ef1b71 authored by Jiri Slaby's avatar Jiri Slaby Committed by Greg Kroah-Hartman

TTY: ipwireless, use tty from tty_port

It does not make the driver less racy though. Close and hangup should
be rewritten and tty refcounting used properly.
Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
Cc: Jiri Kosina <jkosina@suse.cz>
Acked-by: default avatarDavid Sterba <dsterba@suse.cz>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 7393af80
...@@ -51,7 +51,6 @@ struct ipw_tty { ...@@ -51,7 +51,6 @@ struct ipw_tty {
unsigned int secondary_channel_idx; unsigned int secondary_channel_idx;
int tty_type; int tty_type;
struct ipw_network *network; struct ipw_network *network;
struct tty_struct *linux_tty;
unsigned int control_lines; unsigned int control_lines;
struct mutex ipw_tty_mutex; struct mutex ipw_tty_mutex;
int tx_bytes_queued; int tx_bytes_queued;
...@@ -105,7 +104,7 @@ static int ipw_open(struct tty_struct *linux_tty, struct file *filp) ...@@ -105,7 +104,7 @@ static int ipw_open(struct tty_struct *linux_tty, struct file *filp)
tty->port.count++; tty->port.count++;
tty->linux_tty = linux_tty; tty->port.tty = linux_tty;
linux_tty->driver_data = tty; linux_tty->driver_data = tty;
linux_tty->low_latency = 1; linux_tty->low_latency = 1;
...@@ -122,10 +121,10 @@ static void do_ipw_close(struct ipw_tty *tty) ...@@ -122,10 +121,10 @@ static void do_ipw_close(struct ipw_tty *tty)
tty->port.count--; tty->port.count--;
if (tty->port.count == 0) { 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) { if (linux_tty != NULL) {
tty->linux_tty = NULL; tty->port.tty = NULL;
linux_tty->driver_data = NULL; linux_tty->driver_data = NULL;
if (tty->tty_type == TTYTYPE_MODEM) if (tty->tty_type == TTYTYPE_MODEM)
...@@ -165,7 +164,7 @@ void ipwireless_tty_received(struct ipw_tty *tty, unsigned char *data, ...@@ -165,7 +164,7 @@ void ipwireless_tty_received(struct ipw_tty *tty, unsigned char *data,
int work = 0; int work = 0;
mutex_lock(&tty->ipw_tty_mutex); mutex_lock(&tty->ipw_tty_mutex);
linux_tty = tty->linux_tty; linux_tty = tty->port.tty;
if (linux_tty == NULL) { if (linux_tty == NULL) {
mutex_unlock(&tty->ipw_tty_mutex); mutex_unlock(&tty->ipw_tty_mutex);
return; return;
...@@ -553,9 +552,9 @@ void ipwireless_tty_free(struct ipw_tty *tty) ...@@ -553,9 +552,9 @@ void ipwireless_tty_free(struct ipw_tty *tty)
": deregistering %s device ttyIPWp%d\n", ": deregistering %s device ttyIPWp%d\n",
tty_type_name(ttyj->tty_type), j); tty_type_name(ttyj->tty_type), j);
ttyj->closing = 1; ttyj->closing = 1;
if (ttyj->linux_tty != NULL) { if (ttyj->port.tty != NULL) {
mutex_unlock(&ttyj->ipw_tty_mutex); 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 /* FIXME: Exactly how is the tty object locked here
against a parallel ioctl etc */ against a parallel ioctl etc */
/* FIXME2: hangup does not mean all processes /* FIXME2: hangup does not mean all processes
...@@ -651,8 +650,8 @@ ipwireless_tty_notify_control_line_change(struct ipw_tty *tty, ...@@ -651,8 +650,8 @@ ipwireless_tty_notify_control_line_change(struct ipw_tty *tty,
*/ */
if ((old_control_lines & IPW_CONTROL_LINE_DCD) if ((old_control_lines & IPW_CONTROL_LINE_DCD)
&& !(tty->control_lines & IPW_CONTROL_LINE_DCD) && !(tty->control_lines & IPW_CONTROL_LINE_DCD)
&& tty->linux_tty) { && tty->port.tty) {
tty_hangup(tty->linux_tty); tty_hangup(tty->port.tty);
} }
} }
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