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: 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>
This commit is contained in:
parent
7393af808f
commit
19ef1b7151
|
@ -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)
|
||||||
|
|
||||||
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)
|
||||||
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,
|
||||||
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)
|
||||||
": 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,
|
||||||
*/
|
*/
|
||||||
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue