808249ceba
Change locking in the new tty buffering facility from using tty->read_lock, which is currently ignored by drivers and thus ineffective. New locking uses a new tty buffering specific lock enforced centrally in the tty buffering code. Two drivers (esp and cyclades) are updated to use the tty buffering functions instead of accessing tty buffering internals directly. This is required for the new locking to work. Minor checks for NULL buffers added to tty_prepare_flip_string/tty_prepare_flip_string_flags Signed-off-by: Paul Fulghum <paulkf@microgate.com> Cc: Alan Cox <alan@lxorguk.ukuu.org.uk> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
49 lines
1.3 KiB
C
49 lines
1.3 KiB
C
#ifndef _LINUX_TTY_FLIP_H
|
|
#define _LINUX_TTY_FLIP_H
|
|
|
|
extern int tty_buffer_request_room(struct tty_struct *tty, size_t size);
|
|
extern int tty_insert_flip_string(struct tty_struct *tty, unsigned char *chars, size_t size);
|
|
extern int tty_insert_flip_string_flags(struct tty_struct *tty, unsigned char *chars, char *flags, size_t size);
|
|
extern int tty_prepare_flip_string(struct tty_struct *tty, unsigned char **chars, size_t size);
|
|
extern int tty_prepare_flip_string_flags(struct tty_struct *tty, unsigned char **chars, char **flags, size_t size);
|
|
|
|
#ifdef INCLUDE_INLINE_FUNCS
|
|
#define _INLINE_ extern
|
|
#else
|
|
#define _INLINE_ static __inline__
|
|
#endif
|
|
|
|
_INLINE_ int tty_insert_flip_char(struct tty_struct *tty,
|
|
unsigned char ch, char flag)
|
|
{
|
|
struct tty_buffer *tb = tty->buf.tail;
|
|
if (tb && tb->active && tb->used < tb->size) {
|
|
tb->flag_buf_ptr[tb->used] = flag;
|
|
tb->char_buf_ptr[tb->used++] = ch;
|
|
return 1;
|
|
}
|
|
return tty_insert_flip_string_flags(tty, &ch, &flag, 1);
|
|
}
|
|
|
|
_INLINE_ void tty_schedule_flip(struct tty_struct *tty)
|
|
{
|
|
unsigned long flags;
|
|
spin_lock_irqsave(&tty->buf.lock, flags);
|
|
if (tty->buf.tail != NULL)
|
|
tty->buf.tail->active = 0;
|
|
spin_unlock_irqrestore(&tty->buf.lock, flags);
|
|
schedule_delayed_work(&tty->buf.work, 1);
|
|
}
|
|
|
|
#undef _INLINE_
|
|
|
|
|
|
#endif /* _LINUX_TTY_FLIP_H */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|