diff options
Diffstat (limited to 'drivers/char/amiserial.c')
-rw-r--r-- | drivers/char/amiserial.c | 56 |
1 files changed, 31 insertions, 25 deletions
diff --git a/drivers/char/amiserial.c b/drivers/char/amiserial.c index a11c8c9ca3d4..b0a70461a12c 100644 --- a/drivers/char/amiserial.c +++ b/drivers/char/amiserial.c | |||
@@ -1263,6 +1263,36 @@ static int rs_break(struct tty_struct *tty, int break_state) | |||
1263 | return 0; | 1263 | return 0; |
1264 | } | 1264 | } |
1265 | 1265 | ||
1266 | /* | ||
1267 | * Get counter of input serial line interrupts (DCD,RI,DSR,CTS) | ||
1268 | * Return: write counters to the user passed counter struct | ||
1269 | * NB: both 1->0 and 0->1 transitions are counted except for | ||
1270 | * RI where only 0->1 is counted. | ||
1271 | */ | ||
1272 | static int rs_get_icount(struct tty_struct *tty, | ||
1273 | struct serial_icounter_struct *icount) | ||
1274 | { | ||
1275 | struct async_struct *info = tty->driver_data; | ||
1276 | struct async_icount cnow; | ||
1277 | unsigned long flags; | ||
1278 | |||
1279 | local_irq_save(flags); | ||
1280 | cnow = info->state->icount; | ||
1281 | local_irq_restore(flags); | ||
1282 | icount->cts = cnow.cts; | ||
1283 | icount->dsr = cnow.dsr; | ||
1284 | icount->rng = cnow.rng; | ||
1285 | icount->dcd = cnow.dcd; | ||
1286 | icount->rx = cnow.rx; | ||
1287 | icount->tx = cnow.tx; | ||
1288 | icount->frame = cnow.frame; | ||
1289 | icount->overrun = cnow.overrun; | ||
1290 | icount->parity = cnow.parity; | ||
1291 | icount->brk = cnow.brk; | ||
1292 | icount->buf_overrun = cnow.buf_overrun; | ||
1293 | |||
1294 | return 0; | ||
1295 | } | ||
1266 | 1296 | ||
1267 | static int rs_ioctl(struct tty_struct *tty, struct file * file, | 1297 | static int rs_ioctl(struct tty_struct *tty, struct file * file, |
1268 | unsigned int cmd, unsigned long arg) | 1298 | unsigned int cmd, unsigned long arg) |
@@ -1332,31 +1362,6 @@ static int rs_ioctl(struct tty_struct *tty, struct file * file, | |||
1332 | } | 1362 | } |
1333 | /* NOTREACHED */ | 1363 | /* NOTREACHED */ |
1334 | 1364 | ||
1335 | /* | ||
1336 | * Get counter of input serial line interrupts (DCD,RI,DSR,CTS) | ||
1337 | * Return: write counters to the user passed counter struct | ||
1338 | * NB: both 1->0 and 0->1 transitions are counted except for | ||
1339 | * RI where only 0->1 is counted. | ||
1340 | */ | ||
1341 | case TIOCGICOUNT: | ||
1342 | local_irq_save(flags); | ||
1343 | cnow = info->state->icount; | ||
1344 | local_irq_restore(flags); | ||
1345 | icount.cts = cnow.cts; | ||
1346 | icount.dsr = cnow.dsr; | ||
1347 | icount.rng = cnow.rng; | ||
1348 | icount.dcd = cnow.dcd; | ||
1349 | icount.rx = cnow.rx; | ||
1350 | icount.tx = cnow.tx; | ||
1351 | icount.frame = cnow.frame; | ||
1352 | icount.overrun = cnow.overrun; | ||
1353 | icount.parity = cnow.parity; | ||
1354 | icount.brk = cnow.brk; | ||
1355 | icount.buf_overrun = cnow.buf_overrun; | ||
1356 | |||
1357 | if (copy_to_user(argp, &icount, sizeof(icount))) | ||
1358 | return -EFAULT; | ||
1359 | return 0; | ||
1360 | case TIOCSERGWILD: | 1365 | case TIOCSERGWILD: |
1361 | case TIOCSERSWILD: | 1366 | case TIOCSERSWILD: |
1362 | /* "setserial -W" is called in Debian boot */ | 1367 | /* "setserial -W" is called in Debian boot */ |
@@ -1958,6 +1963,7 @@ static const struct tty_operations serial_ops = { | |||
1958 | .wait_until_sent = rs_wait_until_sent, | 1963 | .wait_until_sent = rs_wait_until_sent, |
1959 | .tiocmget = rs_tiocmget, | 1964 | .tiocmget = rs_tiocmget, |
1960 | .tiocmset = rs_tiocmset, | 1965 | .tiocmset = rs_tiocmset, |
1966 | .get_icount = rs_get_icount, | ||
1961 | .proc_fops = &rs_proc_fops, | 1967 | .proc_fops = &rs_proc_fops, |
1962 | }; | 1968 | }; |
1963 | 1969 | ||