From: Greg Kroah-Hartman <gregkh@suse.de>
To: linux-kernel@vger.kernel.org
Cc: Alan Cox <alan@linux.intel.com>, Greg Kroah-Hartman <gregkh@suse.de>
Subject: [PATCH 27/36] nozomi: Add tty_port usage
Date: Tue, 2 Mar 2010 15:36:34 -0800 [thread overview]
Message-ID: <1267573003-782-27-git-send-email-gregkh@suse.de> (raw)
In-Reply-To: <20100302230956.GC32287@kroah.com>
From: Alan Cox <alan@linux.intel.com>
The Nozomi tty handling is very broken on the open/close side (See
http://bugzilla.kernel.org/show_bug.cgi?id=13024 for one example). In
particular it marks the tty as closed on the first close() not on the last.
Most of the logic is pretty solid except for the open/close path so switch
to the tty_port helpers and let them do all the heavy lifting. This is also
fixes all the POSIX behaviour violations in the open/close paths.
Begin by adding the tty port usage
Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/char/nozomi.c | 115 +++++++++++++++++++++++++++++--------------------
1 files changed, 68 insertions(+), 47 deletions(-)
diff --git a/drivers/char/nozomi.c b/drivers/char/nozomi.c
index 2ad7d37..cd405bc 100644
--- a/drivers/char/nozomi.c
+++ b/drivers/char/nozomi.c
@@ -371,6 +371,8 @@ struct port {
struct mutex tty_sem;
wait_queue_head_t tty_wait;
struct async_icount tty_icount;
+
+ struct nozomi *dc;
};
/* Private data one for each card in the system */
@@ -414,6 +416,8 @@ MODULE_DEVICE_TABLE(pci, nozomi_pci_tbl);
static struct nozomi *ndevs[NOZOMI_MAX_CARDS];
static struct tty_driver *ntty_driver;
+static const struct tty_port_operations noz_tty_port_ops;
+
/*
* find card by tty_index
*/
@@ -1473,9 +1477,11 @@ static int __devinit nozomi_card_init(struct pci_dev *pdev,
for (i = 0; i < MAX_PORT; i++) {
struct device *tty_dev;
-
- mutex_init(&dc->port[i].tty_sem);
- tty_port_init(&dc->port[i].port);
+ struct port *port = &dc->port[i];
+ port->dc = dc;
+ mutex_init(&port->tty_sem);
+ tty_port_init(&port->port);
+ port->port.ops = &noz_tty_port_ops;
tty_dev = tty_register_device(ntty_driver, dc->index_start + i,
&pdev->dev);
@@ -1600,67 +1606,74 @@ static void set_dtr(const struct tty_struct *tty, int dtr)
* ----------------------------------------------------------------------------
*/
-/* Called when the userspace process opens the tty, /dev/noz*. */
-static int ntty_open(struct tty_struct *tty, struct file *file)
+static int ntty_install(struct tty_driver *driver, struct tty_struct *tty)
{
struct port *port = get_port_by_tty(tty);
struct nozomi *dc = get_dc_by_tty(tty);
- unsigned long flags;
-
+ int ret;
if (!port || !dc || dc->state != NOZOMI_STATE_READY)
return -ENODEV;
-
- if (mutex_lock_interruptible(&port->tty_sem))
- return -ERESTARTSYS;
-
- port->port.count++;
- dc->open_ttys++;
-
- /* Enable interrupt downlink for channel */
- if (port->port.count == 1) {
- tty->driver_data = port;
- tty_port_tty_set(&port->port, tty);
- DBG1("open: %d", port->token_dl);
- spin_lock_irqsave(&dc->spin_mutex, flags);
- dc->last_ier = dc->last_ier | port->token_dl;
- writew(dc->last_ier, dc->reg_ier);
- spin_unlock_irqrestore(&dc->spin_mutex, flags);
+ ret = tty_init_termios(tty);
+ if (ret == 0) {
+ tty_driver_kref_get(driver);
+ driver->ttys[tty->index] = tty;
}
- mutex_unlock(&port->tty_sem);
- return 0;
+ return ret;
}
-/* Called when the userspace process close the tty, /dev/noz*. Also
- called immediately if ntty_open fails in which case tty->driver_data
- will be NULL an we exit by the first return */
+static void ntty_cleanup(struct tty_struct *tty)
+{
+ tty->driver_data = NULL;
+}
-static void ntty_close(struct tty_struct *tty, struct file *file)
+static int ntty_activate(struct tty_port *tport, struct tty_struct *tty)
{
- struct nozomi *dc = get_dc_by_tty(tty);
- struct port *nport = tty->driver_data;
- struct tty_port *port = &nport->port;
+ struct port *port = container_of(tport, struct port, port);
+ struct nozomi *dc = port->dc;
unsigned long flags;
- if (!dc || !nport)
- return;
+ DBG1("open: %d", port->token_dl);
+ spin_lock_irqsave(&dc->spin_mutex, flags);
+ dc->last_ier = dc->last_ier | port->token_dl;
+ writew(dc->last_ier, dc->reg_ier);
+ dc->open_ttys++;
+ spin_unlock_irqrestore(&dc->spin_mutex, flags);
+ printk("noz: activated %d: %p\n", tty->index, tport);
+ return 0;
+}
- /* Users cannot interrupt a close */
- mutex_lock(&nport->tty_sem);
+static int ntty_open(struct tty_struct *tty, struct file *filp)
+{
+ struct port *port = get_port_by_tty(tty);
+ return tty_port_open(&port->port, tty, filp);
+}
- WARN_ON(!port->count);
+static void ntty_shutdown(struct tty_port *tport)
+{
+ struct port *port = container_of(tport, struct port, port);
+ struct nozomi *dc = port->dc;
+ unsigned long flags;
+ DBG1("close: %d", port->token_dl);
+ spin_lock_irqsave(&dc->spin_mutex, flags);
+ dc->last_ier &= ~(port->token_dl);
+ writew(dc->last_ier, dc->reg_ier);
dc->open_ttys--;
- port->count--;
+ spin_unlock_irqrestore(&dc->spin_mutex, flags);
+ printk("noz: shutdown %p\n", tport);
+}
- if (port->count == 0) {
- DBG1("close: %d", nport->token_dl);
- tty_port_tty_set(port, NULL);
- spin_lock_irqsave(&dc->spin_mutex, flags);
- dc->last_ier &= ~(nport->token_dl);
- writew(dc->last_ier, dc->reg_ier);
- spin_unlock_irqrestore(&dc->spin_mutex, flags);
- }
- mutex_unlock(&nport->tty_sem);
+static void ntty_close(struct tty_struct *tty, struct file *filp)
+{
+ struct port *port = tty->driver_data;
+ if (port)
+ tty_port_close(&port->port, tty, filp);
+}
+
+static void ntty_hangup(struct tty_struct *tty)
+{
+ struct port *port = tty->driver_data;
+ tty_port_hangup(&port->port);
}
/*
@@ -1906,10 +1919,16 @@ exit_in_buffer:
return rval;
}
+static const struct tty_port_operations noz_tty_port_ops = {
+ .activate = ntty_activate,
+ .shutdown = ntty_shutdown,
+};
+
static const struct tty_operations tty_ops = {
.ioctl = ntty_ioctl,
.open = ntty_open,
.close = ntty_close,
+ .hangup = ntty_hangup,
.write = ntty_write,
.write_room = ntty_write_room,
.unthrottle = ntty_unthrottle,
@@ -1917,6 +1936,8 @@ static const struct tty_operations tty_ops = {
.chars_in_buffer = ntty_chars_in_buffer,
.tiocmget = ntty_tiocmget,
.tiocmset = ntty_tiocmset,
+ .install = ntty_install,
+ .cleanup = ntty_cleanup,
};
/* Module initialization */
--
1.7.0.1
next prev parent reply other threads:[~2010-03-02 23:47 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-03-02 23:09 [GIT PATCH] TTY patches for 2.6.33-git Greg KH
2010-03-02 23:36 ` [PATCH 01/36] serial: fit blackfin uart over sport driver into common uart infrastructure Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 02/36] serial: copy UART properties of UPF_FIXED_TYPE ports provisioned using early_serial_setup Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 03/36] serial: 68328serial.c: remove BAUD_TABLE_SIZE macro Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 04/36] serial: atmel_serial: add poll_get_char and poll_put_char uart_ops Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 05/36] serial: synclink_gt: dropped transmit data bugfix Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 06/36] serial: 8250_pci: add support for MCS9865 / SYBA 6x Serial Port Card Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 07/36] serial: imx: fix NULL dereference Oops when pdata == NULL Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 08/36] serial: add support for Korenix JetCard Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 09/36] serial: fix test of unsigned Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 10/36] serial: Char: cyclades, fix compiler warning Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 11/36] serial: cyclades: allow overriding ISA defaults also when the driver is built-in Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 12/36] tty: char: mxser, remove unnecessary tty test Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 13/36] serial: isicom.c: use pr_fmt and pr_<level> Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 14/36] hvc_console: fix test on unsigned in hvc_console_print() Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 15/36] tty: moxa: remove #ifdef MODULE completely Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 16/36] ip2: remove #ifdef MODULE from ip2main.c Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 17/36] ip2: Add module parameter Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 18/36] tty: declare MODULE_FIRMWARE in various drivers Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 19/36] Char: synclink, remove unnecessary checks Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 20/36] serial: bfin_5xx: remove useless gpio handling with hard flow control Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 21/36] serial: bfin_5xx: need to disable DMA TX interrupt too Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 22/36] serial: bfin_5xx: kgdboc should accept gdb break only when it is active Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 23/36] serial: bfin_5xx: pull in linux/io.h for ioremap prototypes Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 24/36] serial: bcm63xx_uart: don't use kfree() on non kmalloced area Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 25/36] serial: bcm63xx_uart: allow more than one uart to be registered Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 26/36] sdio_uart: Use kfifo instead of the messy circ stuff Greg Kroah-Hartman
2010-03-02 23:36 ` Greg Kroah-Hartman [this message]
2010-03-02 23:36 ` [PATCH 28/36] nozomi: Fix mutex handling Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 29/36] nozomi: Tidy up the PCI table Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 30/36] serial: timberdale: Remove dependancies Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 31/36] tty: Fix the ldisc hangup race Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 32/36] tty: Fix up char drivers request_room usage Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 33/36] tty: Keep the default buffering to sub-page units Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 34/36] tty: Add a new VT mode which is like VT_PROCESS but doesn't require a VT_RELDISP ioctl call Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 35/36] jsm: removing the uart structure and filename on error Greg Kroah-Hartman
2010-03-02 23:36 ` [PATCH 36/36] jsm: fixing error if the driver fails to load Greg Kroah-Hartman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1267573003-782-27-git-send-email-gregkh@suse.de \
--to=gregkh@suse.de \
--cc=alan@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome