2005-04-16 18:20:36 -04:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2000, 2001 Jeff Dike (jdike@karaya.com)
|
|
|
|
* Licensed under the GPL
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __CHAN_KERN_H__
|
|
|
|
#define __CHAN_KERN_H__
|
|
|
|
|
|
|
|
#include "linux/tty.h"
|
|
|
|
#include "linux/list.h"
|
|
|
|
#include "linux/console.h"
|
|
|
|
#include "chan_user.h"
|
|
|
|
#include "line.h"
|
|
|
|
|
|
|
|
struct chan {
|
|
|
|
struct list_head list;
|
[PATCH] uml: Simplify console opening/closing and irq registration
This patch simplifies the opening and closing of host console devices and the
registration and deregistration of IRQs. The intent is to make it obvious
that an IRQ can't exist without an open file descriptor.
chan_enable will now open the channel, and when both opening and IRQ
registration are desired, this should be used. Opening only is done for the
initial console, so that interface still needs to exist.
The free_irqs_later interface is now gone. It was intended to avoid freeing
an IRQ while it was being processed. It did this, but it didn't eliminate the
possiblity of free_irq being called from an interrupt, which is bad. In its
place is a list of irqs to be freed, which is processed by the signal handler
just before exiting. close_one_chan now disables irqs.
When a host device disappears, it is just closed, and that disables IRQs.
The device id registered with the IRQ is now the chan structure, not the tty.
This is because the interrupt arrives on a descriptor associated with the
channel. This caused equivalent changes in the arguments to line_timer_cb.
line_disable is gone since it is not used any more.
The count field in the line structure is gone. tty->count is used instead.
The complicated logic in sigio_handler with freeing IRQs when necessary and
making sure its idea of the next irq is correct is now much simpler. The irq
list can't be rearranged underneath it, so it is now a simple list walk.
Signed-off-by: Jeff Dike <jdike@addtoit.com>
Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-01-06 03:18:57 -05:00
|
|
|
struct list_head free_list;
|
|
|
|
struct line *line;
|
2005-04-16 18:20:36 -04:00
|
|
|
char *dev;
|
|
|
|
unsigned int primary:1;
|
|
|
|
unsigned int input:1;
|
|
|
|
unsigned int output:1;
|
|
|
|
unsigned int opened:1;
|
[PATCH] uml: Simplify console opening/closing and irq registration
This patch simplifies the opening and closing of host console devices and the
registration and deregistration of IRQs. The intent is to make it obvious
that an IRQ can't exist without an open file descriptor.
chan_enable will now open the channel, and when both opening and IRQ
registration are desired, this should be used. Opening only is done for the
initial console, so that interface still needs to exist.
The free_irqs_later interface is now gone. It was intended to avoid freeing
an IRQ while it was being processed. It did this, but it didn't eliminate the
possiblity of free_irq being called from an interrupt, which is bad. In its
place is a list of irqs to be freed, which is processed by the signal handler
just before exiting. close_one_chan now disables irqs.
When a host device disappears, it is just closed, and that disables IRQs.
The device id registered with the IRQ is now the chan structure, not the tty.
This is because the interrupt arrives on a descriptor associated with the
channel. This caused equivalent changes in the arguments to line_timer_cb.
line_disable is gone since it is not used any more.
The count field in the line structure is gone. tty->count is used instead.
The complicated logic in sigio_handler with freeing IRQs when necessary and
making sure its idea of the next irq is correct is now much simpler. The irq
list can't be rearranged underneath it, so it is now a simple list walk.
Signed-off-by: Jeff Dike <jdike@addtoit.com>
Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-01-06 03:18:57 -05:00
|
|
|
unsigned int enabled:1;
|
2005-04-16 18:20:36 -04:00
|
|
|
int fd;
|
2006-09-27 04:50:33 -04:00
|
|
|
const struct chan_ops *ops;
|
2005-04-16 18:20:36 -04:00
|
|
|
void *data;
|
|
|
|
};
|
|
|
|
|
|
|
|
extern void chan_interrupt(struct list_head *chans, struct work_struct *task,
|
|
|
|
struct tty_struct *tty, int irq);
|
[PATCH] uml: Simplify console opening/closing and irq registration
This patch simplifies the opening and closing of host console devices and the
registration and deregistration of IRQs. The intent is to make it obvious
that an IRQ can't exist without an open file descriptor.
chan_enable will now open the channel, and when both opening and IRQ
registration are desired, this should be used. Opening only is done for the
initial console, so that interface still needs to exist.
The free_irqs_later interface is now gone. It was intended to avoid freeing
an IRQ while it was being processed. It did this, but it didn't eliminate the
possiblity of free_irq being called from an interrupt, which is bad. In its
place is a list of irqs to be freed, which is processed by the signal handler
just before exiting. close_one_chan now disables irqs.
When a host device disappears, it is just closed, and that disables IRQs.
The device id registered with the IRQ is now the chan structure, not the tty.
This is because the interrupt arrives on a descriptor associated with the
channel. This caused equivalent changes in the arguments to line_timer_cb.
line_disable is gone since it is not used any more.
The count field in the line structure is gone. tty->count is used instead.
The complicated logic in sigio_handler with freeing IRQs when necessary and
making sure its idea of the next irq is correct is now much simpler. The irq
list can't be rearranged underneath it, so it is now a simple list walk.
Signed-off-by: Jeff Dike <jdike@addtoit.com>
Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-01-06 03:18:57 -05:00
|
|
|
extern int parse_chan_pair(char *str, struct line *line, int device,
|
2006-09-27 04:50:33 -04:00
|
|
|
const struct chan_opts *opts);
|
2005-04-16 18:20:36 -04:00
|
|
|
extern int open_chan(struct list_head *chans);
|
|
|
|
extern int write_chan(struct list_head *chans, const char *buf, int len,
|
|
|
|
int write_irq);
|
|
|
|
extern int console_write_chan(struct list_head *chans, const char *buf,
|
|
|
|
int len);
|
|
|
|
extern int console_open_chan(struct line *line, struct console *co,
|
2006-09-27 04:50:33 -04:00
|
|
|
const struct chan_opts *opts);
|
2006-01-06 03:18:58 -05:00
|
|
|
extern void deactivate_chan(struct list_head *chans, int irq);
|
|
|
|
extern void reactivate_chan(struct list_head *chans, int irq);
|
2005-04-16 18:20:36 -04:00
|
|
|
extern void chan_enable_winch(struct list_head *chans, struct tty_struct *tty);
|
[PATCH] uml: Simplify console opening/closing and irq registration
This patch simplifies the opening and closing of host console devices and the
registration and deregistration of IRQs. The intent is to make it obvious
that an IRQ can't exist without an open file descriptor.
chan_enable will now open the channel, and when both opening and IRQ
registration are desired, this should be used. Opening only is done for the
initial console, so that interface still needs to exist.
The free_irqs_later interface is now gone. It was intended to avoid freeing
an IRQ while it was being processed. It did this, but it didn't eliminate the
possiblity of free_irq being called from an interrupt, which is bad. In its
place is a list of irqs to be freed, which is processed by the signal handler
just before exiting. close_one_chan now disables irqs.
When a host device disappears, it is just closed, and that disables IRQs.
The device id registered with the IRQ is now the chan structure, not the tty.
This is because the interrupt arrives on a descriptor associated with the
channel. This caused equivalent changes in the arguments to line_timer_cb.
line_disable is gone since it is not used any more.
The count field in the line structure is gone. tty->count is used instead.
The complicated logic in sigio_handler with freeing IRQs when necessary and
making sure its idea of the next irq is correct is now much simpler. The irq
list can't be rearranged underneath it, so it is now a simple list walk.
Signed-off-by: Jeff Dike <jdike@addtoit.com>
Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-01-06 03:18:57 -05:00
|
|
|
extern void enable_chan(struct line *line);
|
|
|
|
extern void close_chan(struct list_head *chans, int delay_free_irq);
|
2005-04-16 18:20:36 -04:00
|
|
|
extern int chan_window_size(struct list_head *chans,
|
|
|
|
unsigned short *rows_out,
|
|
|
|
unsigned short *cols_out);
|
|
|
|
extern int chan_out_fd(struct list_head *chans);
|
|
|
|
extern int chan_config_string(struct list_head *chans, char *str, int size,
|
|
|
|
char **error_out);
|
|
|
|
|
|
|
|
#endif
|