diff options
author | Alan Cox <alan@lxorguk.ukuu.org.uk> | 2008-04-30 03:54:13 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-30 11:29:47 -0400 |
commit | f34d7a5b7010b82fe97da95496b9971435530062 (patch) | |
tree | 87e2abec1e33ed4fe5e63ee2fd000bc2ad745e57 /drivers/char/n_r3964.c | |
parent | 251b8dd7eee30fda089a1dc088abf4fc9a0dee9c (diff) |
tty: The big operations rework
- Operations are now a shared const function block as with most other Linux
objects
- Introduce wrappers for some optional functions to get consistent behaviour
- Wrap put_char which used to be patched by the tty layer
- Document which functions are needed/optional
- Make put_char report success/fail
- Cache the driver->ops pointer in the tty as tty->ops
- Remove various surplus lock calls we no longer need
- Remove proc_write method as noted by Alexey Dobriyan
- Introduce some missing sanity checks where certain driver/ldisc
combinations would oops as they didn't check needed methods were present
[akpm@linux-foundation.org: fix fs/compat_ioctl.c build]
[akpm@linux-foundation.org: fix isicom]
[akpm@linux-foundation.org: fix arch/ia64/hp/sim/simserial.c build]
[akpm@linux-foundation.org: fix kgdb]
Signed-off-by: Alan Cox <alan@redhat.com>
Acked-by: Greg Kroah-Hartman <gregkh@suse.de>
Cc: Jason Wessel <jason.wessel@windriver.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/char/n_r3964.c')
-rw-r--r-- | drivers/char/n_r3964.c | 17 |
1 files changed, 7 insertions, 10 deletions
diff --git a/drivers/char/n_r3964.c b/drivers/char/n_r3964.c index 3f6486e9f1ec..902169062332 100644 --- a/drivers/char/n_r3964.c +++ b/drivers/char/n_r3964.c | |||
@@ -376,8 +376,9 @@ static void put_char(struct r3964_info *pInfo, unsigned char ch) | |||
376 | if (tty == NULL) | 376 | if (tty == NULL) |
377 | return; | 377 | return; |
378 | 378 | ||
379 | if (tty->driver->put_char) { | 379 | /* FIXME: put_char should not be called from an IRQ */ |
380 | tty->driver->put_char(tty, ch); | 380 | if (tty->ops->put_char) { |
381 | tty->ops->put_char(tty, ch); | ||
381 | } | 382 | } |
382 | pInfo->bcc ^= ch; | 383 | pInfo->bcc ^= ch; |
383 | } | 384 | } |
@@ -386,12 +387,9 @@ static void flush(struct r3964_info *pInfo) | |||
386 | { | 387 | { |
387 | struct tty_struct *tty = pInfo->tty; | 388 | struct tty_struct *tty = pInfo->tty; |
388 | 389 | ||
389 | if (tty == NULL) | 390 | if (tty == NULL || tty->ops->flush_chars == NULL) |
390 | return; | 391 | return; |
391 | 392 | tty->ops->flush_chars(tty); | |
392 | if (tty->driver->flush_chars) { | ||
393 | tty->driver->flush_chars(tty); | ||
394 | } | ||
395 | } | 393 | } |
396 | 394 | ||
397 | static void trigger_transmit(struct r3964_info *pInfo) | 395 | static void trigger_transmit(struct r3964_info *pInfo) |
@@ -449,12 +447,11 @@ static void transmit_block(struct r3964_info *pInfo) | |||
449 | struct r3964_block_header *pBlock = pInfo->tx_first; | 447 | struct r3964_block_header *pBlock = pInfo->tx_first; |
450 | int room = 0; | 448 | int room = 0; |
451 | 449 | ||
452 | if ((tty == NULL) || (pBlock == NULL)) { | 450 | if (tty == NULL || pBlock == NULL) { |
453 | return; | 451 | return; |
454 | } | 452 | } |
455 | 453 | ||
456 | if (tty->driver->write_room) | 454 | room = tty_write_room(tty); |
457 | room = tty->driver->write_room(tty); | ||
458 | 455 | ||
459 | TRACE_PS("transmit_block %p, room %d, length %d", | 456 | TRACE_PS("transmit_block %p, room %d, length %d", |
460 | pBlock, room, pBlock->length); | 457 | pBlock, room, pBlock->length); |