165dc59116
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>
25 lines
794 B
C
25 lines
794 B
C
/*
|
|
* Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
|
|
* Licensed under the GPL
|
|
*/
|
|
|
|
#ifndef __IRQ_USER_H__
|
|
#define __IRQ_USER_H__
|
|
|
|
enum { IRQ_READ, IRQ_WRITE };
|
|
|
|
extern void sigio_handler(int sig, union uml_pt_regs *regs);
|
|
extern int activate_fd(int irq, int fd, int type, void *dev_id);
|
|
extern void free_irq_by_irq_and_dev(unsigned int irq, void *dev_id);
|
|
extern void free_irq_by_fd(int fd);
|
|
extern void reactivate_fd(int fd, int irqnum);
|
|
extern void deactivate_fd(int fd, int irqnum);
|
|
extern int deactivate_all_fds(void);
|
|
extern void forward_interrupts(int pid);
|
|
extern void init_irq_signals(int on_sigstack);
|
|
extern void forward_ipi(int fd, int pid);
|
|
extern int activate_ipi(int fd, int pid);
|
|
extern unsigned long irq_lock(void);
|
|
extern void irq_unlock(unsigned long flags);
|
|
|
|
#endif
|