TTY: hvcs, add tty install

This has two outcomes:
* we give the TTY layer a tty_port
* we do not find the info structure every time open is called on that
  tty

>From now on, we only increase the reference count in ->install (and
decrease in ->cleanup).

Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Cc: linuxppc-dev@lists.ozlabs.org
Acked-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Jiri Slaby 2012-08-07 21:48:06 +02:00 committed by Greg Kroah-Hartman
parent 97d1508985
commit 27bf7c43a1

View File

@ -1102,11 +1102,7 @@ static struct hvcs_struct *hvcs_get_by_index(int index)
return NULL; return NULL;
} }
/* static int hvcs_install(struct tty_driver *driver, struct tty_struct *tty)
* This is invoked via the tty_open interface when a user app connects to the
* /dev node.
*/
static int hvcs_open(struct tty_struct *tty, struct file *filp)
{ {
struct hvcs_struct *hvcsd; struct hvcs_struct *hvcsd;
struct vio_dev *vdev; struct vio_dev *vdev;
@ -1114,9 +1110,6 @@ static int hvcs_open(struct tty_struct *tty, struct file *filp)
unsigned int irq; unsigned int irq;
int retval; int retval;
if (tty->driver_data)
goto fast_open;
/* /*
* Is there a vty-server that shares the same index? * Is there a vty-server that shares the same index?
* This function increments the kref index. * This function increments the kref index.
@ -1139,7 +1132,7 @@ static int hvcs_open(struct tty_struct *tty, struct file *filp)
} }
} }
hvcsd->port.count = 1; hvcsd->port.count = 0;
hvcsd->port.tty = tty; hvcsd->port.tty = tty;
tty->driver_data = hvcsd; tty->driver_data = hvcsd;
@ -1166,28 +1159,42 @@ static int hvcs_open(struct tty_struct *tty, struct file *filp)
goto err_put; goto err_put;
} }
goto open_success; retval = tty_port_install(&hvcsd->port, driver, tty);
if (retval)
goto err_irq;
fast_open: return 0;
hvcsd = tty->driver_data; err_irq:
spin_lock_irqsave(&hvcsd->lock, flags);
vio_disable_interrupts(hvcsd->vdev);
spin_unlock_irqrestore(&hvcsd->lock, flags);
free_irq(irq, hvcsd);
err_put:
tty_port_put(&hvcsd->port);
return retval;
}
/*
* This is invoked via the tty_open interface when a user app connects to the
* /dev node.
*/
static int hvcs_open(struct tty_struct *tty, struct file *filp)
{
struct hvcs_struct *hvcsd = tty->driver_data;
unsigned long flags;
spin_lock_irqsave(&hvcsd->lock, flags); spin_lock_irqsave(&hvcsd->lock, flags);
tty_port_get(&hvcsd->port);
hvcsd->port.count++; hvcsd->port.count++;
hvcsd->todo_mask |= HVCS_SCHED_READ; hvcsd->todo_mask |= HVCS_SCHED_READ;
spin_unlock_irqrestore(&hvcsd->lock, flags); spin_unlock_irqrestore(&hvcsd->lock, flags);
open_success:
hvcs_kick(); hvcs_kick();
printk(KERN_INFO "HVCS: vty-server@%X connection opened.\n", printk(KERN_INFO "HVCS: vty-server@%X connection opened.\n",
hvcsd->vdev->unit_address ); hvcsd->vdev->unit_address );
return 0; return 0;
err_put:
tty_port_put(&hvcsd->port);
return retval;
} }
static void hvcs_close(struct tty_struct *tty, struct file *filp) static void hvcs_close(struct tty_struct *tty, struct file *filp)
@ -1238,7 +1245,6 @@ static void hvcs_close(struct tty_struct *tty, struct file *filp)
tty->driver_data = NULL; tty->driver_data = NULL;
free_irq(irq, hvcsd); free_irq(irq, hvcsd);
tty_port_put(&hvcsd->port);
return; return;
} else if (hvcsd->port.count < 0) { } else if (hvcsd->port.count < 0) {
printk(KERN_ERR "HVCS: vty-server@%X open_count: %d" printk(KERN_ERR "HVCS: vty-server@%X open_count: %d"
@ -1247,6 +1253,12 @@ static void hvcs_close(struct tty_struct *tty, struct file *filp)
} }
spin_unlock_irqrestore(&hvcsd->lock, flags); spin_unlock_irqrestore(&hvcsd->lock, flags);
}
static void hvcs_cleanup(struct tty_struct * tty)
{
struct hvcs_struct *hvcsd = tty->driver_data;
tty_port_put(&hvcsd->port); tty_port_put(&hvcsd->port);
} }
@ -1433,8 +1445,10 @@ static int hvcs_chars_in_buffer(struct tty_struct *tty)
} }
static const struct tty_operations hvcs_ops = { static const struct tty_operations hvcs_ops = {
.install = hvcs_install,
.open = hvcs_open, .open = hvcs_open,
.close = hvcs_close, .close = hvcs_close,
.cleanup = hvcs_cleanup,
.hangup = hvcs_hangup, .hangup = hvcs_hangup,
.write = hvcs_write, .write = hvcs_write,
.write_room = hvcs_write_room, .write_room = hvcs_write_room,