diff options
| author | Alan Cox <alan@linux.intel.com> | 2010-09-16 13:21:52 -0400 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-10-22 13:20:05 -0400 |
| commit | 0587102cf9f427c185bfdeb2cef41e13ee0264b1 (patch) | |
| tree | 94c6dcc7ac230dee166d2f6aa1f9a54bffe5764b /drivers/char/ip2 | |
| parent | 0bca1b913affbd7e2fdaffee62a499659a466eb5 (diff) | |
tty: icount changeover for other main devices
Again basically cut and paste
Convert the main driver set to use the hooks for GICOUNT
Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/char/ip2')
| -rw-r--r-- | drivers/char/ip2/ip2main.c | 72 |
1 files changed, 43 insertions, 29 deletions
diff --git a/drivers/char/ip2/ip2main.c b/drivers/char/ip2/ip2main.c index d4b71e8d0d2..438272ca9e0 100644 --- a/drivers/char/ip2/ip2main.c +++ b/drivers/char/ip2/ip2main.c | |||
| @@ -183,6 +183,8 @@ static void ip2_hangup(PTTY); | |||
| 183 | static int ip2_tiocmget(struct tty_struct *tty, struct file *file); | 183 | static int ip2_tiocmget(struct tty_struct *tty, struct file *file); |
| 184 | static int ip2_tiocmset(struct tty_struct *tty, struct file *file, | 184 | static int ip2_tiocmset(struct tty_struct *tty, struct file *file, |
| 185 | unsigned int set, unsigned int clear); | 185 | unsigned int set, unsigned int clear); |
| 186 | static int ip2_get_icount(struct tty_struct *tty, | ||
| 187 | struct serial_icounter_struct *icount); | ||
| 186 | 188 | ||
| 187 | static void set_irq(int, int); | 189 | static void set_irq(int, int); |
| 188 | static void ip2_interrupt_bh(struct work_struct *work); | 190 | static void ip2_interrupt_bh(struct work_struct *work); |
| @@ -454,6 +456,7 @@ static const struct tty_operations ip2_ops = { | |||
| 454 | .hangup = ip2_hangup, | 456 | .hangup = ip2_hangup, |
| 455 | .tiocmget = ip2_tiocmget, | 457 | .tiocmget = ip2_tiocmget, |
| 456 | .tiocmset = ip2_tiocmset, | 458 | .tiocmset = ip2_tiocmset, |
| 459 | .get_icount = ip2_get_icount, | ||
| 457 | .proc_fops = &ip2_proc_fops, | 460 | .proc_fops = &ip2_proc_fops, |
| 458 | }; | 461 | }; |
| 459 | 462 | ||
| @@ -2128,7 +2131,6 @@ ip2_ioctl ( PTTY tty, struct file *pFile, UINT cmd, ULONG arg ) | |||
| 2128 | i2ChanStrPtr pCh = DevTable[tty->index]; | 2131 | i2ChanStrPtr pCh = DevTable[tty->index]; |
| 2129 | i2eBordStrPtr pB; | 2132 | i2eBordStrPtr pB; |
| 2130 | struct async_icount cprev, cnow; /* kernel counter temps */ | 2133 | struct async_icount cprev, cnow; /* kernel counter temps */ |
| 2131 | struct serial_icounter_struct __user *p_cuser; | ||
| 2132 | int rc = 0; | 2134 | int rc = 0; |
| 2133 | unsigned long flags; | 2135 | unsigned long flags; |
| 2134 | void __user *argp = (void __user *)arg; | 2136 | void __user *argp = (void __user *)arg; |
| @@ -2297,34 +2299,6 @@ ip2_ioctl ( PTTY tty, struct file *pFile, UINT cmd, ULONG arg ) | |||
| 2297 | break; | 2299 | break; |
| 2298 | 2300 | ||
| 2299 | /* | 2301 | /* |
| 2300 | * Get counter of input serial line interrupts (DCD,RI,DSR,CTS) | ||
| 2301 | * Return: write counters to the user passed counter struct | ||
| 2302 | * NB: both 1->0 and 0->1 transitions are counted except for RI where | ||
| 2303 | * only 0->1 is counted. The controller is quite capable of counting | ||
| 2304 | * both, but this done to preserve compatibility with the standard | ||
| 2305 | * serial driver. | ||
| 2306 | */ | ||
| 2307 | case TIOCGICOUNT: | ||
| 2308 | ip2trace (CHANN, ITRC_IOCTL, 11, 1, rc ); | ||
| 2309 | |||
| 2310 | write_lock_irqsave(&pB->read_fifo_spinlock, flags); | ||
| 2311 | cnow = pCh->icount; | ||
| 2312 | write_unlock_irqrestore(&pB->read_fifo_spinlock, flags); | ||
| 2313 | p_cuser = argp; | ||
| 2314 | rc = put_user(cnow.cts, &p_cuser->cts); | ||
| 2315 | rc = put_user(cnow.dsr, &p_cuser->dsr); | ||
| 2316 | rc = put_user(cnow.rng, &p_cuser->rng); | ||
| 2317 | rc = put_user(cnow.dcd, &p_cuser->dcd); | ||
| 2318 | rc = put_user(cnow.rx, &p_cuser->rx); | ||
| 2319 | rc = put_user(cnow.tx, &p_cuser->tx); | ||
| 2320 | rc = put_user(cnow.frame, &p_cuser->frame); | ||
| 2321 | rc = put_user(cnow.overrun, &p_cuser->overrun); | ||
| 2322 | rc = put_user(cnow.parity, &p_cuser->parity); | ||
| 2323 | rc = put_user(cnow.brk, &p_cuser->brk); | ||
| 2324 | rc = put_user(cnow.buf_overrun, &p_cuser->buf_overrun); | ||
| 2325 | break; | ||
| 2326 | |||
| 2327 | /* | ||
| 2328 | * The rest are not supported by this driver. By returning -ENOIOCTLCMD they | 2302 | * The rest are not supported by this driver. By returning -ENOIOCTLCMD they |
| 2329 | * will be passed to the line discipline for it to handle. | 2303 | * will be passed to the line discipline for it to handle. |
| 2330 | */ | 2304 | */ |
| @@ -2348,6 +2322,46 @@ ip2_ioctl ( PTTY tty, struct file *pFile, UINT cmd, ULONG arg ) | |||
| 2348 | return rc; | 2322 | return rc; |
| 2349 | } | 2323 | } |
| 2350 | 2324 | ||
| 2325 | static int ip2_get_icount(struct tty_struct *tty, | ||
| 2326 | struct serial_icounter_struct *icount) | ||
| 2327 | { | ||
| 2328 | i2ChanStrPtr pCh = DevTable[tty->index]; | ||
| 2329 | i2eBordStrPtr pB; | ||
| 2330 | struct async_icount cnow; /* kernel counter temp */ | ||
| 2331 | unsigned long flags; | ||
| 2332 | |||
| 2333 | if ( pCh == NULL ) | ||
| 2334 | return -ENODEV; | ||
| 2335 | |||
| 2336 | pB = pCh->pMyBord; | ||
| 2337 | |||
| 2338 | /* | ||
| 2339 | * Get counter of input serial line interrupts (DCD,RI,DSR,CTS) | ||
| 2340 | * Return: write counters to the user passed counter struct | ||
| 2341 | * NB: both 1->0 and 0->1 transitions are counted except for RI where | ||
| 2342 | * only 0->1 is counted. The controller is quite capable of counting | ||
| 2343 | * both, but this done to preserve compatibility with the standard | ||
| 2344 | * serial driver. | ||
| 2345 | */ | ||
| 2346 | |||
| 2347 | write_lock_irqsave(&pB->read_fifo_spinlock, flags); | ||
| 2348 | cnow = pCh->icount; | ||
| 2349 | write_unlock_irqrestore(&pB->read_fifo_spinlock, flags); | ||
| 2350 | |||
| 2351 | icount->cts = cnow.cts; | ||
| 2352 | icount->dsr = cnow.dsr; | ||
| 2353 | icount->rng = cnow.rng; | ||
| 2354 | icount->dcd = cnow.dcd; | ||
| 2355 | icount->rx = cnow.rx; | ||
| 2356 | icount->tx = cnow.tx; | ||
| 2357 | icount->frame = cnow.frame; | ||
| 2358 | icount->overrun = cnow.overrun; | ||
| 2359 | icount->parity = cnow.parity; | ||
| 2360 | icount->brk = cnow.brk; | ||
| 2361 | icount->buf_overrun = cnow.buf_overrun; | ||
| 2362 | return 0; | ||
| 2363 | } | ||
| 2364 | |||
| 2351 | /******************************************************************************/ | 2365 | /******************************************************************************/ |
| 2352 | /* Function: GetSerialInfo() */ | 2366 | /* Function: GetSerialInfo() */ |
| 2353 | /* Parameters: Pointer to channel structure */ | 2367 | /* Parameters: Pointer to channel structure */ |
