diff options
Diffstat (limited to 'drivers/tty/mxser.c')
-rw-r--r-- | drivers/tty/mxser.c | 63 |
1 files changed, 46 insertions, 17 deletions
diff --git a/drivers/tty/mxser.c b/drivers/tty/mxser.c index 90cc680c4f0e..cfda47dabd28 100644 --- a/drivers/tty/mxser.c +++ b/drivers/tty/mxser.c | |||
@@ -643,7 +643,7 @@ static int mxser_change_speed(struct tty_struct *tty, | |||
643 | int ret = 0; | 643 | int ret = 0; |
644 | unsigned char status; | 644 | unsigned char status; |
645 | 645 | ||
646 | cflag = tty->termios->c_cflag; | 646 | cflag = tty->termios.c_cflag; |
647 | if (!info->ioaddr) | 647 | if (!info->ioaddr) |
648 | return ret; | 648 | return ret; |
649 | 649 | ||
@@ -830,7 +830,7 @@ static void mxser_check_modem_status(struct tty_struct *tty, | |||
830 | wake_up_interruptible(&port->port.open_wait); | 830 | wake_up_interruptible(&port->port.open_wait); |
831 | } | 831 | } |
832 | 832 | ||
833 | if (port->port.flags & ASYNC_CTS_FLOW) { | 833 | if (tty_port_cts_enabled(&port->port)) { |
834 | if (tty->hw_stopped) { | 834 | if (tty->hw_stopped) { |
835 | if (status & UART_MSR_CTS) { | 835 | if (status & UART_MSR_CTS) { |
836 | tty->hw_stopped = 0; | 836 | tty->hw_stopped = 0; |
@@ -1520,10 +1520,10 @@ static int mxser_ioctl_special(unsigned int cmd, void __user *argp) | |||
1520 | 1520 | ||
1521 | tty = tty_port_tty_get(port); | 1521 | tty = tty_port_tty_get(port); |
1522 | 1522 | ||
1523 | if (!tty || !tty->termios) | 1523 | if (!tty) |
1524 | ms.cflag = ip->normal_termios.c_cflag; | 1524 | ms.cflag = ip->normal_termios.c_cflag; |
1525 | else | 1525 | else |
1526 | ms.cflag = tty->termios->c_cflag; | 1526 | ms.cflag = tty->termios.c_cflag; |
1527 | tty_kref_put(tty); | 1527 | tty_kref_put(tty); |
1528 | spin_lock_irq(&ip->slock); | 1528 | spin_lock_irq(&ip->slock); |
1529 | status = inb(ip->ioaddr + UART_MSR); | 1529 | status = inb(ip->ioaddr + UART_MSR); |
@@ -1589,13 +1589,13 @@ static int mxser_ioctl_special(unsigned int cmd, void __user *argp) | |||
1589 | 1589 | ||
1590 | tty = tty_port_tty_get(&ip->port); | 1590 | tty = tty_port_tty_get(&ip->port); |
1591 | 1591 | ||
1592 | if (!tty || !tty->termios) { | 1592 | if (!tty) { |
1593 | cflag = ip->normal_termios.c_cflag; | 1593 | cflag = ip->normal_termios.c_cflag; |
1594 | iflag = ip->normal_termios.c_iflag; | 1594 | iflag = ip->normal_termios.c_iflag; |
1595 | me->baudrate[p] = tty_termios_baud_rate(&ip->normal_termios); | 1595 | me->baudrate[p] = tty_termios_baud_rate(&ip->normal_termios); |
1596 | } else { | 1596 | } else { |
1597 | cflag = tty->termios->c_cflag; | 1597 | cflag = tty->termios.c_cflag; |
1598 | iflag = tty->termios->c_iflag; | 1598 | iflag = tty->termios.c_iflag; |
1599 | me->baudrate[p] = tty_get_baud_rate(tty); | 1599 | me->baudrate[p] = tty_get_baud_rate(tty); |
1600 | } | 1600 | } |
1601 | tty_kref_put(tty); | 1601 | tty_kref_put(tty); |
@@ -1853,7 +1853,7 @@ static void mxser_stoprx(struct tty_struct *tty) | |||
1853 | } | 1853 | } |
1854 | } | 1854 | } |
1855 | 1855 | ||
1856 | if (tty->termios->c_cflag & CRTSCTS) { | 1856 | if (tty->termios.c_cflag & CRTSCTS) { |
1857 | info->MCR &= ~UART_MCR_RTS; | 1857 | info->MCR &= ~UART_MCR_RTS; |
1858 | outb(info->MCR, info->ioaddr + UART_MCR); | 1858 | outb(info->MCR, info->ioaddr + UART_MCR); |
1859 | } | 1859 | } |
@@ -1890,7 +1890,7 @@ static void mxser_unthrottle(struct tty_struct *tty) | |||
1890 | } | 1890 | } |
1891 | } | 1891 | } |
1892 | 1892 | ||
1893 | if (tty->termios->c_cflag & CRTSCTS) { | 1893 | if (tty->termios.c_cflag & CRTSCTS) { |
1894 | info->MCR |= UART_MCR_RTS; | 1894 | info->MCR |= UART_MCR_RTS; |
1895 | outb(info->MCR, info->ioaddr + UART_MCR); | 1895 | outb(info->MCR, info->ioaddr + UART_MCR); |
1896 | } | 1896 | } |
@@ -1939,14 +1939,14 @@ static void mxser_set_termios(struct tty_struct *tty, struct ktermios *old_termi | |||
1939 | spin_unlock_irqrestore(&info->slock, flags); | 1939 | spin_unlock_irqrestore(&info->slock, flags); |
1940 | 1940 | ||
1941 | if ((old_termios->c_cflag & CRTSCTS) && | 1941 | if ((old_termios->c_cflag & CRTSCTS) && |
1942 | !(tty->termios->c_cflag & CRTSCTS)) { | 1942 | !(tty->termios.c_cflag & CRTSCTS)) { |
1943 | tty->hw_stopped = 0; | 1943 | tty->hw_stopped = 0; |
1944 | mxser_start(tty); | 1944 | mxser_start(tty); |
1945 | } | 1945 | } |
1946 | 1946 | ||
1947 | /* Handle sw stopped */ | 1947 | /* Handle sw stopped */ |
1948 | if ((old_termios->c_iflag & IXON) && | 1948 | if ((old_termios->c_iflag & IXON) && |
1949 | !(tty->termios->c_iflag & IXON)) { | 1949 | !(tty->termios.c_iflag & IXON)) { |
1950 | tty->stopped = 0; | 1950 | tty->stopped = 0; |
1951 | 1951 | ||
1952 | if (info->board->chip_flag) { | 1952 | if (info->board->chip_flag) { |
@@ -2337,11 +2337,36 @@ static struct tty_port_operations mxser_port_ops = { | |||
2337 | * The MOXA Smartio/Industio serial driver boot-time initialization code! | 2337 | * The MOXA Smartio/Industio serial driver boot-time initialization code! |
2338 | */ | 2338 | */ |
2339 | 2339 | ||
2340 | static bool allow_overlapping_vector; | ||
2341 | module_param(allow_overlapping_vector, bool, S_IRUGO); | ||
2342 | MODULE_PARM_DESC(allow_overlapping_vector, "whether we allow ISA cards to be configured such that vector overlabs IO ports (default=no)"); | ||
2343 | |||
2344 | static bool mxser_overlapping_vector(struct mxser_board *brd) | ||
2345 | { | ||
2346 | return allow_overlapping_vector && | ||
2347 | brd->vector >= brd->ports[0].ioaddr && | ||
2348 | brd->vector < brd->ports[0].ioaddr + 8 * brd->info->nports; | ||
2349 | } | ||
2350 | |||
2351 | static int mxser_request_vector(struct mxser_board *brd) | ||
2352 | { | ||
2353 | if (mxser_overlapping_vector(brd)) | ||
2354 | return 0; | ||
2355 | return request_region(brd->vector, 1, "mxser(vector)") ? 0 : -EIO; | ||
2356 | } | ||
2357 | |||
2358 | static void mxser_release_vector(struct mxser_board *brd) | ||
2359 | { | ||
2360 | if (mxser_overlapping_vector(brd)) | ||
2361 | return; | ||
2362 | release_region(brd->vector, 1); | ||
2363 | } | ||
2364 | |||
2340 | static void mxser_release_ISA_res(struct mxser_board *brd) | 2365 | static void mxser_release_ISA_res(struct mxser_board *brd) |
2341 | { | 2366 | { |
2342 | free_irq(brd->irq, brd); | 2367 | free_irq(brd->irq, brd); |
2343 | release_region(brd->ports[0].ioaddr, 8 * brd->info->nports); | 2368 | release_region(brd->ports[0].ioaddr, 8 * brd->info->nports); |
2344 | release_region(brd->vector, 1); | 2369 | mxser_release_vector(brd); |
2345 | } | 2370 | } |
2346 | 2371 | ||
2347 | static int __devinit mxser_initbrd(struct mxser_board *brd, | 2372 | static int __devinit mxser_initbrd(struct mxser_board *brd, |
@@ -2396,7 +2421,7 @@ static int __devinit mxser_initbrd(struct mxser_board *brd, | |||
2396 | 2421 | ||
2397 | static int __init mxser_get_ISA_conf(int cap, struct mxser_board *brd) | 2422 | static int __init mxser_get_ISA_conf(int cap, struct mxser_board *brd) |
2398 | { | 2423 | { |
2399 | int id, i, bits; | 2424 | int id, i, bits, ret; |
2400 | unsigned short regs[16], irq; | 2425 | unsigned short regs[16], irq; |
2401 | unsigned char scratch, scratch2; | 2426 | unsigned char scratch, scratch2; |
2402 | 2427 | ||
@@ -2492,13 +2517,15 @@ static int __init mxser_get_ISA_conf(int cap, struct mxser_board *brd) | |||
2492 | 8 * brd->info->nports - 1); | 2517 | 8 * brd->info->nports - 1); |
2493 | return -EIO; | 2518 | return -EIO; |
2494 | } | 2519 | } |
2495 | if (!request_region(brd->vector, 1, "mxser(vector)")) { | 2520 | |
2521 | ret = mxser_request_vector(brd); | ||
2522 | if (ret) { | ||
2496 | release_region(brd->ports[0].ioaddr, 8 * brd->info->nports); | 2523 | release_region(brd->ports[0].ioaddr, 8 * brd->info->nports); |
2497 | printk(KERN_ERR "mxser: can't request interrupt vector region: " | 2524 | printk(KERN_ERR "mxser: can't request interrupt vector region: " |
2498 | "0x%.8lx-0x%.8lx\n", | 2525 | "0x%.8lx-0x%.8lx\n", |
2499 | brd->ports[0].ioaddr, brd->ports[0].ioaddr + | 2526 | brd->ports[0].ioaddr, brd->ports[0].ioaddr + |
2500 | 8 * brd->info->nports - 1); | 2527 | 8 * brd->info->nports - 1); |
2501 | return -EIO; | 2528 | return ret; |
2502 | } | 2529 | } |
2503 | return brd->info->nports; | 2530 | return brd->info->nports; |
2504 | 2531 | ||
@@ -2598,7 +2625,8 @@ static int __devinit mxser_probe(struct pci_dev *pdev, | |||
2598 | goto err_rel3; | 2625 | goto err_rel3; |
2599 | 2626 | ||
2600 | for (i = 0; i < brd->info->nports; i++) | 2627 | for (i = 0; i < brd->info->nports; i++) |
2601 | tty_register_device(mxvar_sdriver, brd->idx + i, &pdev->dev); | 2628 | tty_port_register_device(&brd->ports[i].port, mxvar_sdriver, |
2629 | brd->idx + i, &pdev->dev); | ||
2602 | 2630 | ||
2603 | pci_set_drvdata(pdev, brd); | 2631 | pci_set_drvdata(pdev, brd); |
2604 | 2632 | ||
@@ -2695,7 +2723,8 @@ static int __init mxser_module_init(void) | |||
2695 | 2723 | ||
2696 | brd->idx = m * MXSER_PORTS_PER_BOARD; | 2724 | brd->idx = m * MXSER_PORTS_PER_BOARD; |
2697 | for (i = 0; i < brd->info->nports; i++) | 2725 | for (i = 0; i < brd->info->nports; i++) |
2698 | tty_register_device(mxvar_sdriver, brd->idx + i, NULL); | 2726 | tty_port_register_device(&brd->ports[i].port, |
2727 | mxvar_sdriver, brd->idx + i, NULL); | ||
2699 | 2728 | ||
2700 | m++; | 2729 | m++; |
2701 | } | 2730 | } |