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 /arch | |
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 'arch')
-rw-r--r-- | arch/ia64/hp/sim/simserial.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/arch/ia64/hp/sim/simserial.c b/arch/ia64/hp/sim/simserial.c index eb0c32a85fd7..23cafc80d2a4 100644 --- a/arch/ia64/hp/sim/simserial.c +++ b/arch/ia64/hp/sim/simserial.c | |||
@@ -210,21 +210,23 @@ static void do_softint(struct work_struct *private_) | |||
210 | printk(KERN_ERR "simserial: do_softint called\n"); | 210 | printk(KERN_ERR "simserial: do_softint called\n"); |
211 | } | 211 | } |
212 | 212 | ||
213 | static void rs_put_char(struct tty_struct *tty, unsigned char ch) | 213 | static int rs_put_char(struct tty_struct *tty, unsigned char ch) |
214 | { | 214 | { |
215 | struct async_struct *info = (struct async_struct *)tty->driver_data; | 215 | struct async_struct *info = (struct async_struct *)tty->driver_data; |
216 | unsigned long flags; | 216 | unsigned long flags; |
217 | 217 | ||
218 | if (!tty || !info->xmit.buf) return; | 218 | if (!tty || !info->xmit.buf) |
219 | return 0; | ||
219 | 220 | ||
220 | local_irq_save(flags); | 221 | local_irq_save(flags); |
221 | if (CIRC_SPACE(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE) == 0) { | 222 | if (CIRC_SPACE(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE) == 0) { |
222 | local_irq_restore(flags); | 223 | local_irq_restore(flags); |
223 | return; | 224 | return 0; |
224 | } | 225 | } |
225 | info->xmit.buf[info->xmit.head] = ch; | 226 | info->xmit.buf[info->xmit.head] = ch; |
226 | info->xmit.head = (info->xmit.head + 1) & (SERIAL_XMIT_SIZE-1); | 227 | info->xmit.head = (info->xmit.head + 1) & (SERIAL_XMIT_SIZE-1); |
227 | local_irq_restore(flags); | 228 | local_irq_restore(flags); |
229 | return 1; | ||
228 | } | 230 | } |
229 | 231 | ||
230 | static void transmit_chars(struct async_struct *info, int *intr_done) | 232 | static void transmit_chars(struct async_struct *info, int *intr_done) |
@@ -621,7 +623,8 @@ static void rs_close(struct tty_struct *tty, struct file * filp) | |||
621 | * the line discipline to only process XON/XOFF characters. | 623 | * the line discipline to only process XON/XOFF characters. |
622 | */ | 624 | */ |
623 | shutdown(info); | 625 | shutdown(info); |
624 | if (tty->driver->flush_buffer) tty->driver->flush_buffer(tty); | 626 | if (tty->ops->flush_buffer) |
627 | tty->ops->flush_buffer(tty); | ||
625 | if (tty->ldisc.flush_buffer) tty->ldisc.flush_buffer(tty); | 628 | if (tty->ldisc.flush_buffer) tty->ldisc.flush_buffer(tty); |
626 | info->event = 0; | 629 | info->event = 0; |
627 | info->tty = NULL; | 630 | info->tty = NULL; |