Commit 9de6a51f authored by Alan Cox's avatar Alan Cox Committed by Linus Torvalds

moxa: use tty_port

Switch MOXA to use the new tty_port structure
Signed-off-by: default avatarAlan Cox <alan@redhat.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent b02f5ad6
...@@ -130,17 +130,14 @@ struct moxaq_str { ...@@ -130,17 +130,14 @@ struct moxaq_str {
}; };
struct moxa_port { struct moxa_port {
struct tty_port port;
struct moxa_board_conf *board; struct moxa_board_conf *board;
struct tty_struct *tty;
void __iomem *tableAddr; void __iomem *tableAddr;
int type; int type;
int close_delay; int close_delay;
unsigned int count;
int asyncflags;
int cflag; int cflag;
unsigned long statusflags; unsigned long statusflags;
wait_queue_head_t open_wait;
u8 DCDState; u8 DCDState;
u8 lineCtrl; u8 lineCtrl;
...@@ -348,10 +345,10 @@ static int moxa_ioctl(struct tty_struct *tty, struct file *file, ...@@ -348,10 +345,10 @@ static int moxa_ioctl(struct tty_struct *tty, struct file *file,
if (status & 4) if (status & 4)
tmp.dcd = 1; tmp.dcd = 1;
if (!p->tty || !p->tty->termios) if (!p->port.tty || !p->port.tty->termios)
tmp.cflag = p->cflag; tmp.cflag = p->cflag;
else else
tmp.cflag = p->tty->termios->c_cflag; tmp.cflag = p->port.tty->termios->c_cflag;
copy: copy:
if (copy_to_user(argm, &tmp, sizeof(tmp))) { if (copy_to_user(argm, &tmp, sizeof(tmp))) {
mutex_unlock(&moxa_openlock); mutex_unlock(&moxa_openlock);
...@@ -828,7 +825,7 @@ static int moxa_init_board(struct moxa_board_conf *brd, struct device *dev) ...@@ -828,7 +825,7 @@ static int moxa_init_board(struct moxa_board_conf *brd, struct device *dev)
p->type = PORT_16550A; p->type = PORT_16550A;
p->close_delay = 5 * HZ / 10; p->close_delay = 5 * HZ / 10;
p->cflag = B9600 | CS8 | CREAD | CLOCAL | HUPCL; p->cflag = B9600 | CS8 | CREAD | CLOCAL | HUPCL;
init_waitqueue_head(&p->open_wait); tty_port_init(&p->port);
} }
switch (brd->boardType) { switch (brd->boardType) {
...@@ -884,12 +881,12 @@ static void moxa_board_deinit(struct moxa_board_conf *brd) ...@@ -884,12 +881,12 @@ static void moxa_board_deinit(struct moxa_board_conf *brd)
/* pci hot-un-plug support */ /* pci hot-un-plug support */
for (a = 0; a < brd->numPorts; a++) for (a = 0; a < brd->numPorts; a++)
if (brd->ports[a].asyncflags & ASYNC_INITIALIZED) if (brd->ports[a].port.flags & ASYNC_INITIALIZED)
tty_hangup(brd->ports[a].tty); tty_hangup(brd->ports[a].port.tty);
while (1) { while (1) {
opened = 0; opened = 0;
for (a = 0; a < brd->numPorts; a++) for (a = 0; a < brd->numPorts; a++)
if (brd->ports[a].asyncflags & ASYNC_INITIALIZED) if (brd->ports[a].port.flags & ASYNC_INITIALIZED)
opened++; opened++;
mutex_unlock(&moxa_openlock); mutex_unlock(&moxa_openlock);
if (!opened) if (!opened)
...@@ -1104,9 +1101,9 @@ static void moxa_close_port(struct moxa_port *ch) ...@@ -1104,9 +1101,9 @@ static void moxa_close_port(struct moxa_port *ch)
{ {
moxa_shut_down(ch); moxa_shut_down(ch);
MoxaPortFlushData(ch, 2); MoxaPortFlushData(ch, 2);
ch->asyncflags &= ~ASYNC_NORMAL_ACTIVE; ch->port.flags &= ~ASYNC_NORMAL_ACTIVE;
ch->tty->driver_data = NULL; ch->port.tty->driver_data = NULL;
ch->tty = NULL; ch->port.tty = NULL;
} }
static int moxa_block_till_ready(struct tty_struct *tty, struct file *filp, static int moxa_block_till_ready(struct tty_struct *tty, struct file *filp,
...@@ -1117,7 +1114,7 @@ static int moxa_block_till_ready(struct tty_struct *tty, struct file *filp, ...@@ -1117,7 +1114,7 @@ static int moxa_block_till_ready(struct tty_struct *tty, struct file *filp,
u8 dcd; u8 dcd;
while (1) { while (1) {
prepare_to_wait(&ch->open_wait, &wait, TASK_INTERRUPTIBLE); prepare_to_wait(&ch->port.open_wait, &wait, TASK_INTERRUPTIBLE);
if (tty_hung_up_p(filp)) { if (tty_hung_up_p(filp)) {
#ifdef SERIAL_DO_RESTART #ifdef SERIAL_DO_RESTART
retval = -ERESTARTSYS; retval = -ERESTARTSYS;
...@@ -1138,7 +1135,7 @@ static int moxa_block_till_ready(struct tty_struct *tty, struct file *filp, ...@@ -1138,7 +1135,7 @@ static int moxa_block_till_ready(struct tty_struct *tty, struct file *filp,
} }
schedule(); schedule();
} }
finish_wait(&ch->open_wait, &wait); finish_wait(&ch->port.open_wait, &wait);
return retval; return retval;
} }
...@@ -1163,16 +1160,16 @@ static int moxa_open(struct tty_struct *tty, struct file *filp) ...@@ -1163,16 +1160,16 @@ static int moxa_open(struct tty_struct *tty, struct file *filp)
} }
ch = &brd->ports[port % MAX_PORTS_PER_BOARD]; ch = &brd->ports[port % MAX_PORTS_PER_BOARD];
ch->count++; ch->port.count++;
tty->driver_data = ch; tty->driver_data = ch;
ch->tty = tty; ch->port.tty = tty;
if (!(ch->asyncflags & ASYNC_INITIALIZED)) { if (!(ch->port.flags & ASYNC_INITIALIZED)) {
ch->statusflags = 0; ch->statusflags = 0;
moxa_set_tty_param(tty, tty->termios); moxa_set_tty_param(tty, tty->termios);
MoxaPortLineCtrl(ch, 1, 1); MoxaPortLineCtrl(ch, 1, 1);
MoxaPortEnable(ch); MoxaPortEnable(ch);
MoxaSetFifo(ch, ch->type == PORT_16550A); MoxaSetFifo(ch, ch->type == PORT_16550A);
ch->asyncflags |= ASYNC_INITIALIZED; ch->port.flags |= ASYNC_INITIALIZED;
} }
mutex_unlock(&moxa_openlock); mutex_unlock(&moxa_openlock);
...@@ -1181,11 +1178,11 @@ static int moxa_open(struct tty_struct *tty, struct file *filp) ...@@ -1181,11 +1178,11 @@ static int moxa_open(struct tty_struct *tty, struct file *filp)
retval = moxa_block_till_ready(tty, filp, ch); retval = moxa_block_till_ready(tty, filp, ch);
mutex_lock(&moxa_openlock); mutex_lock(&moxa_openlock);
if (retval) { if (retval) {
if (ch->count) /* 0 means already hung up... */ if (ch->port.count) /* 0 means already hung up... */
if (--ch->count == 0) if (--ch->port.count == 0)
moxa_close_port(ch); moxa_close_port(ch);
} else } else
ch->asyncflags |= ASYNC_NORMAL_ACTIVE; ch->port.flags |= ASYNC_NORMAL_ACTIVE;
mutex_unlock(&moxa_openlock); mutex_unlock(&moxa_openlock);
return retval; return retval;
...@@ -1204,21 +1201,21 @@ static void moxa_close(struct tty_struct *tty, struct file *filp) ...@@ -1204,21 +1201,21 @@ static void moxa_close(struct tty_struct *tty, struct file *filp)
ch = tty->driver_data; ch = tty->driver_data;
if (ch == NULL) if (ch == NULL)
goto unlock; goto unlock;
if (tty->count == 1 && ch->count != 1) { if (tty->count == 1 && ch->port.count != 1) {
printk(KERN_WARNING "moxa_close: bad serial port count; " printk(KERN_WARNING "moxa_close: bad serial port count; "
"tty->count is 1, ch->count is %d\n", ch->count); "tty->count is 1, ch->port.count is %d\n", ch->port.count);
ch->count = 1; ch->port.count = 1;
} }
if (--ch->count < 0) { if (--ch->port.count < 0) {
printk(KERN_WARNING "moxa_close: bad serial port count, " printk(KERN_WARNING "moxa_close: bad serial port count, "
"device=%s\n", tty->name); "device=%s\n", tty->name);
ch->count = 0; ch->port.count = 0;
} }
if (ch->count) if (ch->port.count)
goto unlock; goto unlock;
ch->cflag = tty->termios->c_cflag; ch->cflag = tty->termios->c_cflag;
if (ch->asyncflags & ASYNC_INITIALIZED) { if (ch->port.flags & ASYNC_INITIALIZED) {
moxa_setup_empty_event(tty); moxa_setup_empty_event(tty);
tty_wait_until_sent(tty, 30 * HZ); /* 30 seconds timeout */ tty_wait_until_sent(tty, 30 * HZ); /* 30 seconds timeout */
} }
...@@ -1374,7 +1371,7 @@ static void moxa_set_termios(struct tty_struct *tty, ...@@ -1374,7 +1371,7 @@ static void moxa_set_termios(struct tty_struct *tty,
return; return;
moxa_set_tty_param(tty, old_termios); moxa_set_tty_param(tty, old_termios);
if (!(old_termios->c_cflag & CLOCAL) && C_CLOCAL(tty)) if (!(old_termios->c_cflag & CLOCAL) && C_CLOCAL(tty))
wake_up_interruptible(&ch->open_wait); wake_up_interruptible(&ch->port.open_wait);
} }
static void moxa_stop(struct tty_struct *tty) static void moxa_stop(struct tty_struct *tty)
...@@ -1412,20 +1409,20 @@ static void moxa_hangup(struct tty_struct *tty) ...@@ -1412,20 +1409,20 @@ static void moxa_hangup(struct tty_struct *tty)
mutex_unlock(&moxa_openlock); mutex_unlock(&moxa_openlock);
return; return;
} }
ch->count = 0; ch->port.count = 0;
moxa_close_port(ch); moxa_close_port(ch);
mutex_unlock(&moxa_openlock); mutex_unlock(&moxa_openlock);
wake_up_interruptible(&ch->open_wait); wake_up_interruptible(&ch->port.open_wait);
} }
static void moxa_new_dcdstate(struct moxa_port *p, u8 dcd) static void moxa_new_dcdstate(struct moxa_port *p, u8 dcd)
{ {
dcd = !!dcd; dcd = !!dcd;
if (dcd != p->DCDState && p->tty && C_CLOCAL(p->tty)) { if (dcd != p->DCDState && p->port.tty && C_CLOCAL(p->port.tty)) {
if (!dcd) if (!dcd)
tty_hangup(p->tty); tty_hangup(p->port.tty);
} }
p->DCDState = dcd; p->DCDState = dcd;
} }
...@@ -1433,9 +1430,9 @@ static void moxa_new_dcdstate(struct moxa_port *p, u8 dcd) ...@@ -1433,9 +1430,9 @@ static void moxa_new_dcdstate(struct moxa_port *p, u8 dcd)
static int moxa_poll_port(struct moxa_port *p, unsigned int handle, static int moxa_poll_port(struct moxa_port *p, unsigned int handle,
u16 __iomem *ip) u16 __iomem *ip)
{ {
struct tty_struct *tty = p->tty; struct tty_struct *tty = p->port.tty;
void __iomem *ofsAddr; void __iomem *ofsAddr;
unsigned int inited = p->asyncflags & ASYNC_INITIALIZED; unsigned int inited = p->port.flags & ASYNC_INITIALIZED;
u16 intr; u16 intr;
if (tty) { if (tty) {
...@@ -1566,9 +1563,9 @@ static void moxa_setup_empty_event(struct tty_struct *tty) ...@@ -1566,9 +1563,9 @@ static void moxa_setup_empty_event(struct tty_struct *tty)
static void moxa_shut_down(struct moxa_port *ch) static void moxa_shut_down(struct moxa_port *ch)
{ {
struct tty_struct *tp = ch->tty; struct tty_struct *tp = ch->port.tty;
if (!(ch->asyncflags & ASYNC_INITIALIZED)) if (!(ch->port.flags & ASYNC_INITIALIZED))
return; return;
MoxaPortDisable(ch); MoxaPortDisable(ch);
...@@ -1580,7 +1577,7 @@ static void moxa_shut_down(struct moxa_port *ch) ...@@ -1580,7 +1577,7 @@ static void moxa_shut_down(struct moxa_port *ch)
MoxaPortLineCtrl(ch, 0, 0); MoxaPortLineCtrl(ch, 0, 0);
spin_lock_bh(&moxa_lock); spin_lock_bh(&moxa_lock);
ch->asyncflags &= ~ASYNC_INITIALIZED; ch->port.flags &= ~ASYNC_INITIALIZED;
spin_unlock_bh(&moxa_lock); spin_unlock_bh(&moxa_lock);
} }
...@@ -1975,7 +1972,7 @@ static int MoxaPortWriteData(struct moxa_port *port, ...@@ -1975,7 +1972,7 @@ static int MoxaPortWriteData(struct moxa_port *port,
c = (head > tail) ? (head - tail - 1) : (head - tail + tx_mask); c = (head > tail) ? (head - tail - 1) : (head - tail + tx_mask);
if (c > len) if (c > len)
c = len; c = len;
moxaLog.txcnt[port->tty->index] += c; moxaLog.txcnt[port->port.tty->index] += c;
total = c; total = c;
if (spage == epage) { if (spage == epage) {
bufhead = readw(ofsAddr + Ofs_txb); bufhead = readw(ofsAddr + Ofs_txb);
...@@ -2017,7 +2014,7 @@ static int MoxaPortWriteData(struct moxa_port *port, ...@@ -2017,7 +2014,7 @@ static int MoxaPortWriteData(struct moxa_port *port,
static int MoxaPortReadData(struct moxa_port *port) static int MoxaPortReadData(struct moxa_port *port)
{ {
struct tty_struct *tty = port->tty; struct tty_struct *tty = port->port.tty;
unsigned char *dst; unsigned char *dst;
void __iomem *baseAddr, *ofsAddr, *ofs; void __iomem *baseAddr, *ofsAddr, *ofs;
unsigned int count, len, total; unsigned int count, len, total;
...@@ -2124,8 +2121,8 @@ static int moxa_get_serial_info(struct moxa_port *info, ...@@ -2124,8 +2121,8 @@ static int moxa_get_serial_info(struct moxa_port *info,
{ {
struct serial_struct tmp = { struct serial_struct tmp = {
.type = info->type, .type = info->type,
.line = info->tty->index, .line = info->port.tty->index,
.flags = info->asyncflags, .flags = info->port.flags,
.baud_base = 921600, .baud_base = 921600,
.close_delay = info->close_delay .close_delay = info->close_delay
}; };
...@@ -2148,13 +2145,13 @@ static int moxa_set_serial_info(struct moxa_port *info, ...@@ -2148,13 +2145,13 @@ static int moxa_set_serial_info(struct moxa_port *info,
if (!capable(CAP_SYS_ADMIN)) { if (!capable(CAP_SYS_ADMIN)) {
if (((new_serial.flags & ~ASYNC_USR_MASK) != if (((new_serial.flags & ~ASYNC_USR_MASK) !=
(info->asyncflags & ~ASYNC_USR_MASK))) (info->port.flags & ~ASYNC_USR_MASK)))
return -EPERM; return -EPERM;
} else } else
info->close_delay = new_serial.close_delay * HZ / 100; info->close_delay = new_serial.close_delay * HZ / 100;
new_serial.flags = (new_serial.flags & ~ASYNC_FLAGS); new_serial.flags = (new_serial.flags & ~ASYNC_FLAGS);
new_serial.flags |= (info->asyncflags & ASYNC_FLAGS); new_serial.flags |= (info->port.flags & ASYNC_FLAGS);
MoxaSetFifo(info, new_serial.type == PORT_16550A); MoxaSetFifo(info, new_serial.type == PORT_16550A);
......
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