diff options
Diffstat (limited to 'drivers/char/cyclades.c')
-rw-r--r-- | drivers/char/cyclades.c | 49 |
1 files changed, 26 insertions, 23 deletions
diff --git a/drivers/char/cyclades.c b/drivers/char/cyclades.c index 27aad9422332..4f152c28f40e 100644 --- a/drivers/char/cyclades.c +++ b/drivers/char/cyclades.c | |||
@@ -2790,29 +2790,6 @@ cy_ioctl(struct tty_struct *tty, struct file *file, | |||
2790 | * NB: both 1->0 and 0->1 transitions are counted except for | 2790 | * NB: both 1->0 and 0->1 transitions are counted except for |
2791 | * RI where only 0->1 is counted. | 2791 | * RI where only 0->1 is counted. |
2792 | */ | 2792 | */ |
2793 | case TIOCGICOUNT: { | ||
2794 | struct serial_icounter_struct sic = { }; | ||
2795 | |||
2796 | spin_lock_irqsave(&info->card->card_lock, flags); | ||
2797 | cnow = info->icount; | ||
2798 | spin_unlock_irqrestore(&info->card->card_lock, flags); | ||
2799 | |||
2800 | sic.cts = cnow.cts; | ||
2801 | sic.dsr = cnow.dsr; | ||
2802 | sic.rng = cnow.rng; | ||
2803 | sic.dcd = cnow.dcd; | ||
2804 | sic.rx = cnow.rx; | ||
2805 | sic.tx = cnow.tx; | ||
2806 | sic.frame = cnow.frame; | ||
2807 | sic.overrun = cnow.overrun; | ||
2808 | sic.parity = cnow.parity; | ||
2809 | sic.brk = cnow.brk; | ||
2810 | sic.buf_overrun = cnow.buf_overrun; | ||
2811 | |||
2812 | if (copy_to_user(argp, &sic, sizeof(sic))) | ||
2813 | ret_val = -EFAULT; | ||
2814 | break; | ||
2815 | } | ||
2816 | default: | 2793 | default: |
2817 | ret_val = -ENOIOCTLCMD; | 2794 | ret_val = -ENOIOCTLCMD; |
2818 | } | 2795 | } |
@@ -2823,6 +2800,31 @@ cy_ioctl(struct tty_struct *tty, struct file *file, | |||
2823 | return ret_val; | 2800 | return ret_val; |
2824 | } /* cy_ioctl */ | 2801 | } /* cy_ioctl */ |
2825 | 2802 | ||
2803 | static int cy_get_icount(struct tty_struct *tty, | ||
2804 | struct serial_icounter_struct *sic) | ||
2805 | { | ||
2806 | struct cyclades_port *info = tty->driver_data; | ||
2807 | struct cyclades_icount cnow; /* Used to snapshot */ | ||
2808 | unsigned long flags; | ||
2809 | |||
2810 | spin_lock_irqsave(&info->card->card_lock, flags); | ||
2811 | cnow = info->icount; | ||
2812 | spin_unlock_irqrestore(&info->card->card_lock, flags); | ||
2813 | |||
2814 | sic->cts = cnow.cts; | ||
2815 | sic->dsr = cnow.dsr; | ||
2816 | sic->rng = cnow.rng; | ||
2817 | sic->dcd = cnow.dcd; | ||
2818 | sic->rx = cnow.rx; | ||
2819 | sic->tx = cnow.tx; | ||
2820 | sic->frame = cnow.frame; | ||
2821 | sic->overrun = cnow.overrun; | ||
2822 | sic->parity = cnow.parity; | ||
2823 | sic->brk = cnow.brk; | ||
2824 | sic->buf_overrun = cnow.buf_overrun; | ||
2825 | return 0; | ||
2826 | } | ||
2827 | |||
2826 | /* | 2828 | /* |
2827 | * This routine allows the tty driver to be notified when | 2829 | * This routine allows the tty driver to be notified when |
2828 | * device's termios settings have changed. Note that a | 2830 | * device's termios settings have changed. Note that a |
@@ -4084,6 +4086,7 @@ static const struct tty_operations cy_ops = { | |||
4084 | .wait_until_sent = cy_wait_until_sent, | 4086 | .wait_until_sent = cy_wait_until_sent, |
4085 | .tiocmget = cy_tiocmget, | 4087 | .tiocmget = cy_tiocmget, |
4086 | .tiocmset = cy_tiocmset, | 4088 | .tiocmset = cy_tiocmset, |
4089 | .get_icount = cy_get_icount, | ||
4087 | .proc_fops = &cyclades_proc_fops, | 4090 | .proc_fops = &cyclades_proc_fops, |
4088 | }; | 4091 | }; |
4089 | 4092 | ||