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>
This commit is contained in:
@ -210,21 +210,23 @@ static void do_softint(struct work_struct *private_)
|
||||
printk(KERN_ERR "simserial: do_softint called\n");
|
||||
}
|
||||
|
||||
static void rs_put_char(struct tty_struct *tty, unsigned char ch)
|
||||
static int rs_put_char(struct tty_struct *tty, unsigned char ch)
|
||||
{
|
||||
struct async_struct *info = (struct async_struct *)tty->driver_data;
|
||||
unsigned long flags;
|
||||
|
||||
if (!tty || !info->xmit.buf) return;
|
||||
if (!tty || !info->xmit.buf)
|
||||
return 0;
|
||||
|
||||
local_irq_save(flags);
|
||||
if (CIRC_SPACE(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE) == 0) {
|
||||
local_irq_restore(flags);
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
info->xmit.buf[info->xmit.head] = ch;
|
||||
info->xmit.head = (info->xmit.head + 1) & (SERIAL_XMIT_SIZE-1);
|
||||
local_irq_restore(flags);
|
||||
return 1;
|
||||
}
|
||||
|
||||
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)
|
||||
* the line discipline to only process XON/XOFF characters.
|
||||
*/
|
||||
shutdown(info);
|
||||
if (tty->driver->flush_buffer) tty->driver->flush_buffer(tty);
|
||||
if (tty->ops->flush_buffer)
|
||||
tty->ops->flush_buffer(tty);
|
||||
if (tty->ldisc.flush_buffer) tty->ldisc.flush_buffer(tty);
|
||||
info->event = 0;
|
||||
info->tty = NULL;
|
||||
|
Reference in New Issue
Block a user