diff options
author | Alan Cox <alan@lxorguk.ukuu.org.uk> | 2008-02-07 03:16:41 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-02-07 11:42:34 -0500 |
commit | f29e37c076cd08004e31297d205d54ac38cf7a20 (patch) | |
tree | 896c74c058c443507a1cf99241449eb87099e96f /drivers/char | |
parent | b98e70de7836cf0ea49b6714b2455381865b1260 (diff) |
mxser/mxser_new: first pass over termios reporting for the mxser cards
Signed-off-by: Alan Cox <alan@redhat.com>
Cc: Jiri Slaby <jirislaby@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/mxser.c | 27 | ||||
-rw-r--r-- | drivers/char/mxser_new.c | 16 |
2 files changed, 28 insertions, 15 deletions
diff --git a/drivers/char/mxser.c b/drivers/char/mxser.c index 5d7901096048..35ff7a245540 100644 --- a/drivers/char/mxser.c +++ b/drivers/char/mxser.c | |||
@@ -1391,7 +1391,8 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file, unsigned int c | |||
1391 | long baud; | 1391 | long baud; |
1392 | if (get_user(baud, (long __user *)argp)) | 1392 | if (get_user(baud, (long __user *)argp)) |
1393 | return -EFAULT; | 1393 | return -EFAULT; |
1394 | mxser_set_baud(info, baud); | 1394 | if (mxser_set_baud(info, baud) == -1) |
1395 | return -1; | ||
1395 | return 0; | 1396 | return 0; |
1396 | } | 1397 | } |
1397 | case MOXA_ASPP_GETBAUD: | 1398 | case MOXA_ASPP_GETBAUD: |
@@ -2517,7 +2518,13 @@ static int mxser_change_speed(struct mxser_struct *info, struct ktermios *old_te | |||
2517 | #endif | 2518 | #endif |
2518 | if (mxser_set_baud_method[info->port] == 0) { | 2519 | if (mxser_set_baud_method[info->port] == 0) { |
2519 | baud = tty_get_baud_rate(info->tty); | 2520 | baud = tty_get_baud_rate(info->tty); |
2520 | mxser_set_baud(info, baud); | 2521 | if (mxser_set_baud(info, baud) == -1) { |
2522 | /* Use previous rate on a failure */ | ||
2523 | if (old_termios) { | ||
2524 | baud = tty_termios_baud_rate(old_termios); | ||
2525 | tty_encode_baud_rate(info->tty, baud, baud); | ||
2526 | } | ||
2527 | } | ||
2521 | } | 2528 | } |
2522 | 2529 | ||
2523 | /* byte size and parity */ | 2530 | /* byte size and parity */ |
@@ -2691,27 +2698,31 @@ static int mxser_set_baud(struct mxser_struct *info, long newspd) | |||
2691 | { | 2698 | { |
2692 | int quot = 0; | 2699 | int quot = 0; |
2693 | unsigned char cval; | 2700 | unsigned char cval; |
2694 | int ret = 0; | ||
2695 | unsigned long flags; | 2701 | unsigned long flags; |
2702 | unsigned int baud; | ||
2696 | 2703 | ||
2697 | if (!info->tty || !info->tty->termios) | 2704 | if (!info->tty || !info->tty->termios) |
2698 | return ret; | 2705 | return -1; |
2699 | 2706 | ||
2700 | if (!(info->base)) | 2707 | if (!(info->base)) |
2701 | return ret; | 2708 | return -1; |
2702 | 2709 | ||
2703 | if (newspd > info->MaxCanSetBaudRate) | 2710 | if (newspd > info->MaxCanSetBaudRate) |
2704 | return 0; | 2711 | return -1; |
2705 | 2712 | ||
2706 | info->realbaud = newspd; | 2713 | info->realbaud = newspd; |
2707 | if (newspd == 134) { | 2714 | if (newspd == 134) { |
2708 | quot = (2 * info->baud_base / 269); | 2715 | quot = (2 * info->baud_base / 269); |
2716 | tty_encode_baud_rate(info->tty, 134, 134); | ||
2709 | } else if (newspd) { | 2717 | } else if (newspd) { |
2710 | quot = info->baud_base / newspd; | 2718 | quot = info->baud_base / newspd; |
2711 | if (quot == 0) | 2719 | if (quot == 0) |
2712 | quot = 1; | 2720 | quot = 1; |
2721 | baud = info->baud_base / quot; | ||
2722 | tty_encode_baud_rate(info->tty, baud, baud); | ||
2713 | } else { | 2723 | } else { |
2714 | quot = 0; | 2724 | quot = 0; |
2725 | tty_encode_baud_rate(info->tty, 0, 0); | ||
2715 | } | 2726 | } |
2716 | 2727 | ||
2717 | info->timeout = ((info->xmit_fifo_size * HZ * 10 * quot) / info->baud_base); | 2728 | info->timeout = ((info->xmit_fifo_size * HZ * 10 * quot) / info->baud_base); |
@@ -2727,7 +2738,7 @@ static int mxser_set_baud(struct mxser_struct *info, long newspd) | |||
2727 | info->MCR &= ~UART_MCR_DTR; | 2738 | info->MCR &= ~UART_MCR_DTR; |
2728 | outb(info->MCR, info->base + UART_MCR); | 2739 | outb(info->MCR, info->base + UART_MCR); |
2729 | spin_unlock_irqrestore(&info->slock, flags); | 2740 | spin_unlock_irqrestore(&info->slock, flags); |
2730 | return ret; | 2741 | return 0; |
2731 | } | 2742 | } |
2732 | 2743 | ||
2733 | cval = inb(info->base + UART_LCR); | 2744 | cval = inb(info->base + UART_LCR); |
@@ -2739,7 +2750,7 @@ static int mxser_set_baud(struct mxser_struct *info, long newspd) | |||
2739 | outb(cval, info->base + UART_LCR); /* reset DLAB */ | 2750 | outb(cval, info->base + UART_LCR); /* reset DLAB */ |
2740 | 2751 | ||
2741 | 2752 | ||
2742 | return ret; | 2753 | return 0; |
2743 | } | 2754 | } |
2744 | 2755 | ||
2745 | /* | 2756 | /* |
diff --git a/drivers/char/mxser_new.c b/drivers/char/mxser_new.c index a4358acb1b2b..f74734b3407b 100644 --- a/drivers/char/mxser_new.c +++ b/drivers/char/mxser_new.c | |||
@@ -452,18 +452,17 @@ static int mxser_block_til_ready(struct tty_struct *tty, struct file *filp, | |||
452 | static int mxser_set_baud(struct mxser_port *info, long newspd) | 452 | static int mxser_set_baud(struct mxser_port *info, long newspd) |
453 | { | 453 | { |
454 | unsigned int i; | 454 | unsigned int i; |
455 | int quot = 0; | 455 | int quot = 0, baud; |
456 | unsigned char cval; | 456 | unsigned char cval; |
457 | int ret = 0; | ||
458 | 457 | ||
459 | if (!info->tty || !info->tty->termios) | 458 | if (!info->tty || !info->tty->termios) |
460 | return ret; | 459 | return -1; |
461 | 460 | ||
462 | if (!(info->ioaddr)) | 461 | if (!(info->ioaddr)) |
463 | return ret; | 462 | return -1; |
464 | 463 | ||
465 | if (newspd > info->max_baud) | 464 | if (newspd > info->max_baud) |
466 | return 0; | 465 | return -1; |
467 | 466 | ||
468 | info->realbaud = newspd; | 467 | info->realbaud = newspd; |
469 | for (i = 0; i < BAUD_TABLE_NO; i++) | 468 | for (i = 0; i < BAUD_TABLE_NO; i++) |
@@ -476,10 +475,13 @@ static int mxser_set_baud(struct mxser_port *info, long newspd) | |||
476 | } else { | 475 | } else { |
477 | if (newspd == 134) { | 476 | if (newspd == 134) { |
478 | quot = (2 * info->baud_base / 269); | 477 | quot = (2 * info->baud_base / 269); |
478 | tty_encode_baud_rate(info->tty, 134, 134); | ||
479 | } else if (newspd) { | 479 | } else if (newspd) { |
480 | quot = info->baud_base / newspd; | 480 | quot = info->baud_base / newspd; |
481 | if (quot == 0) | 481 | if (quot == 0) |
482 | quot = 1; | 482 | quot = 1; |
483 | baud = info->baud_base/quot; | ||
484 | tty_encode_baud_rate(info->tty, baud, baud); | ||
483 | } else { | 485 | } else { |
484 | quot = 0; | 486 | quot = 0; |
485 | } | 487 | } |
@@ -494,7 +496,7 @@ static int mxser_set_baud(struct mxser_port *info, long newspd) | |||
494 | } else { | 496 | } else { |
495 | info->MCR &= ~UART_MCR_DTR; | 497 | info->MCR &= ~UART_MCR_DTR; |
496 | outb(info->MCR, info->ioaddr + UART_MCR); | 498 | outb(info->MCR, info->ioaddr + UART_MCR); |
497 | return ret; | 499 | return 0; |
498 | } | 500 | } |
499 | 501 | ||
500 | cval = inb(info->ioaddr + UART_LCR); | 502 | cval = inb(info->ioaddr + UART_LCR); |
@@ -518,7 +520,7 @@ static int mxser_set_baud(struct mxser_port *info, long newspd) | |||
518 | } else | 520 | } else |
519 | SET_MOXA_MUST_ENUM_VALUE(info->ioaddr, 0); | 521 | SET_MOXA_MUST_ENUM_VALUE(info->ioaddr, 0); |
520 | 522 | ||
521 | return ret; | 523 | return 0; |
522 | } | 524 | } |
523 | 525 | ||
524 | /* | 526 | /* |