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