
From: Oleg Drokin <green@namesys.com>

Here is UML's part.



 arch/um/drivers/line.c          |   17 ++++++++++-------
 arch/um/drivers/mconsole_kern.c |    3 ++-
 arch/um/drivers/net_kern.c      |    5 +++--
 arch/um/drivers/port_kern.c     |    9 ++++++---
 arch/um/drivers/ubd_kern.c      |    4 +++-
 arch/um/drivers/xterm_kern.c    |    7 ++++---
 arch/um/include/line.h          |    5 +++--
 arch/um/kernel/irq.c            |    4 ++--
 arch/um/kernel/sigio_kern.c     |    6 ++++--
 arch/um/kernel/time_kern.c      |    3 ++-
 include/asm-um/irq.h            |    4 +++-
 11 files changed, 42 insertions(+), 25 deletions(-)

diff -puN arch/um/drivers/line.c~irqreturn-uml arch/um/drivers/line.c
--- 25/arch/um/drivers/line.c~irqreturn-uml	2003-04-24 05:17:10.000000000 -0700
+++ 25-akpm/arch/um/drivers/line.c	2003-04-24 05:17:10.000000000 -0700
@@ -6,8 +6,8 @@
 #include "linux/sched.h"
 #include "linux/slab.h"
 #include "linux/list.h"
+#include "linux/interrupt.h"
 #include "linux/devfs_fs_kernel.h"
-#include "asm/irq.h"
 #include "asm/uaccess.h"
 #include "chan_kern.h"
 #include "irq_user.h"
@@ -19,13 +19,14 @@
 
 #define LINE_BUFSIZE 4096
 
-void line_interrupt(int irq, void *data, struct pt_regs *unused)
+irqreturn_t line_interrupt(int irq, void *data, struct pt_regs *unused)
 {
 	struct line *dev = data;
 
 	if(dev->count > 0) 
 		chan_interrupt(&dev->chan_list, &dev->task, dev->tty, irq, 
 			       dev);
+	return IRQ_HANDLED;
 }
 
 void line_timer_cb(void *arg)
@@ -136,20 +137,20 @@ int line_write(struct line *lines, struc
 	return(len);
 }
 
-void line_write_interrupt(int irq, void *data, struct pt_regs *unused)
+irqreturn_t line_write_interrupt(int irq, void *data, struct pt_regs *unused)
 {
 	struct line *dev = data;
 	struct tty_struct *tty = dev->tty;
 	int err;
 
 	err = flush_buffer(dev);
-	if(err == 0) return;
+	if(err == 0) return IRQ_NONE;
 	else if(err < 0){
 		dev->head = dev->buffer;
 		dev->tail = dev->buffer;
 	}
 
-	if(tty == NULL) return;
+	if(tty == NULL) return IRQ_NONE;
 
 	if(test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags) &&
 	   (tty->ldisc.write_wakeup != NULL))
@@ -164,6 +165,7 @@ void line_write_interrupt(int irq, void 
 	if (waitqueue_active(&tty->write_wait))
 		wake_up_interruptible(&tty->write_wait);
 
+	return IRQ_HANDLED;
 }
 
 int line_write_room(struct tty_struct *tty)
@@ -476,7 +478,7 @@ struct winch {
 	struct line *line;
 };
 
-void winch_interrupt(int irq, void *data, struct pt_regs *unused)
+irqreturn_t winch_interrupt(int irq, void *data, struct pt_regs *unused)
 {
 	struct winch *winch = data;
 	struct tty_struct *tty;
@@ -491,7 +493,7 @@ void winch_interrupt(int irq, void *data
 			printk("fd %d is losing SIGWINCH support\n", 
 			       winch->tty_fd);
 			free_irq(irq, data);
-			return;
+			return IRQ_HANDLED;
 		}
 		goto out;
 	}
@@ -504,6 +506,7 @@ void winch_interrupt(int irq, void *data
 	}
  out:
 	reactivate_fd(winch->fd, WINCH_IRQ);
+	return IRQ_HANDLED;
 }
 
 DECLARE_MUTEX(winch_handler_sem);
diff -puN arch/um/drivers/mconsole_kern.c~irqreturn-uml arch/um/drivers/mconsole_kern.c
--- 25/arch/um/drivers/mconsole_kern.c~irqreturn-uml	2003-04-24 05:17:10.000000000 -0700
+++ 25-akpm/arch/um/drivers/mconsole_kern.c	2003-04-24 05:17:10.000000000 -0700
@@ -67,7 +67,7 @@ void mc_work_proc(void *unused)
 
 DECLARE_WORK(mconsole_work, mc_work_proc, NULL);
 
-void mconsole_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+irqreturn_t mconsole_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 {
 	int fd;
 	struct mconsole_entry *new;
@@ -88,6 +88,7 @@ void mconsole_interrupt(int irq, void *d
 	}
 	if(!list_empty(&mc_requests)) schedule_work(&mconsole_work);
 	reactivate_fd(fd, MCONSOLE_IRQ);
+	return IRQ_HANDLED;
 }
 
 void mconsole_version(struct mc_request *req)
diff -puN arch/um/drivers/net_kern.c~irqreturn-uml arch/um/drivers/net_kern.c
--- 25/arch/um/drivers/net_kern.c~irqreturn-uml	2003-04-24 05:17:10.000000000 -0700
+++ 25-akpm/arch/um/drivers/net_kern.c	2003-04-24 05:17:10.000000000 -0700
@@ -61,14 +61,14 @@ static int uml_net_rx(struct net_device 
 	return pkt_len;
 }
 
-void uml_net_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+irqreturn_t uml_net_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 {
 	struct net_device *dev = dev_id;
 	struct uml_net_private *lp = dev->priv;
 	int err;
 
 	if(!netif_running(dev))
-		return;
+		return IRQ_NONE;
 
 	spin_lock(&lp->lock);
 	while((err = uml_net_rx(dev)) > 0) ;
@@ -83,6 +83,7 @@ void uml_net_interrupt(int irq, void *de
 
  out:
 	spin_unlock(&lp->lock);
+	return IRQ_HANDLED;
 }
 
 static int uml_net_open(struct net_device *dev)
diff -puN arch/um/drivers/port_kern.c~irqreturn-uml arch/um/drivers/port_kern.c
--- 25/arch/um/drivers/port_kern.c~irqreturn-uml	2003-04-24 05:17:10.000000000 -0700
+++ 25-akpm/arch/um/drivers/port_kern.c	2003-04-24 05:17:10.000000000 -0700
@@ -6,6 +6,7 @@
 #include "linux/list.h"
 #include "linux/sched.h"
 #include "linux/slab.h"
+#include "linux/interrupt.h"
 #include "linux/irq.h"
 #include "linux/spinlock.h"
 #include "linux/errno.h"
@@ -44,7 +45,7 @@ struct connection {
 	struct port_list *port;
 };
 
-static void pipe_interrupt(int irq, void *data, struct pt_regs *regs)
+static irqreturn_t pipe_interrupt(int irq, void *data, struct pt_regs *regs)
 {
 	struct connection *conn = data;
 	int fd;
@@ -52,7 +53,7 @@ static void pipe_interrupt(int irq, void
  	fd = os_rcv_fd(conn->socket[0], &conn->helper_pid);
 	if(fd < 0){
 		if(fd == -EAGAIN)
-			return;
+			return IRQ_NONE;
 
 		printk(KERN_ERR "pipe_interrupt : os_rcv_fd returned %d\n", 
 		       -fd);
@@ -65,6 +66,7 @@ static void pipe_interrupt(int irq, void
 	list_add(&conn->list, &conn->port->connections);
 
 	up(&conn->port->sem);
+	return IRQ_HANDLED;
 }
 
 static int port_accept(struct port_list *port)
@@ -138,12 +140,13 @@ void port_work_proc(void *unused)
 
 DECLARE_WORK(port_work, port_work_proc, NULL);
 
-static void port_interrupt(int irq, void *data, struct pt_regs *regs)
+static irqreturn_t port_interrupt(int irq, void *data, struct pt_regs *regs)
 {
 	struct port_list *port = data;
 
 	port->has_connection = 1;
 	schedule_work(&port_work);
+	return IRQ_HANDLED;
 } 
 
 void *port_data(int port_num)
diff -puN arch/um/drivers/ubd_kern.c~irqreturn-uml arch/um/drivers/ubd_kern.c
--- 25/arch/um/drivers/ubd_kern.c~irqreturn-uml	2003-04-24 05:17:10.000000000 -0700
+++ 25-akpm/arch/um/drivers/ubd_kern.c	2003-04-24 05:17:10.000000000 -0700
@@ -18,6 +18,7 @@
 #include "linux/blk.h"
 #include "linux/blkdev.h"
 #include "linux/hdreg.h"
+#include "linux/interrupt.h"
 #include "linux/init.h"
 #include "linux/devfs_fs_kernel.h"
 #include "linux/cdrom.h"
@@ -395,9 +396,10 @@ static void ubd_handler(void)
 	do_ubd_request(&ubd_queue);
 }
 
-static void ubd_intr(int irq, void *dev, struct pt_regs *unused)
+static irqreturn_t ubd_intr(int irq, void *dev, struct pt_regs *unused)
 {
 	ubd_handler();
+	return IRQ_HANDLED;
 }
 
 /* Only changed by ubd_init, which is an initcall. */
diff -puN arch/um/drivers/xterm_kern.c~irqreturn-uml arch/um/drivers/xterm_kern.c
--- 25/arch/um/drivers/xterm_kern.c~irqreturn-uml	2003-04-24 05:17:10.000000000 -0700
+++ 25-akpm/arch/um/drivers/xterm_kern.c	2003-04-24 05:17:10.000000000 -0700
@@ -6,7 +6,7 @@
 #include "linux/errno.h"
 #include "linux/slab.h"
 #include "asm/semaphore.h"
-#include "asm/irq.h"
+#include "linux/interrupt.h"
 #include "irq_user.h"
 #include "kern_util.h"
 #include "os.h"
@@ -19,17 +19,18 @@ struct xterm_wait {
 	int new_fd;
 };
 
-static void xterm_interrupt(int irq, void *data, struct pt_regs *regs)
+static irqreturn_t xterm_interrupt(int irq, void *data, struct pt_regs *regs)
 {
 	struct xterm_wait *xterm = data;
 	int fd;
 
 	fd = os_rcv_fd(xterm->fd, &xterm->pid);
 	if(fd == -EAGAIN)
-		return;
+		return IRQ_NONE;
 
 	xterm->new_fd = fd;
 	up(&xterm->sem);
+	return IRQ_HANDLED;
 }
 
 int xterm_fd(int socket, int *pid_out)
diff -puN arch/um/include/line.h~irqreturn-uml arch/um/include/line.h
--- 25/arch/um/include/line.h~irqreturn-uml	2003-04-24 05:17:10.000000000 -0700
+++ 25-akpm/arch/um/include/line.h	2003-04-24 05:17:10.000000000 -0700
@@ -9,6 +9,7 @@
 #include "linux/list.h"
 #include "linux/workqueue.h"
 #include "linux/tty.h"
+#include "linux/interrupt.h"
 #include "asm/semaphore.h"
 #include "chan_user.h"
 #include "mconsole_kern.h"
@@ -67,8 +68,8 @@ struct lines {
 
 #define LINES_INIT(n) {  num :		n }
 
-extern void line_interrupt(int irq, void *data, struct pt_regs *unused);
-extern void line_write_interrupt(int irq, void *data, struct pt_regs *unused);
+extern irqreturn_t line_interrupt(int irq, void *data, struct pt_regs *unused);
+extern irqreturn_t line_write_interrupt(int irq, void *data, struct pt_regs *unused);
 extern void line_close(struct line *lines, struct tty_struct *tty);
 extern int line_open(struct line *lines, struct tty_struct *tty, 
 		     struct chan_opts *opts);
diff -puN arch/um/kernel/irq.c~irqreturn-uml arch/um/kernel/irq.c
--- 25/arch/um/kernel/irq.c~irqreturn-uml	2003-04-24 05:17:10.000000000 -0700
+++ 25-akpm/arch/um/kernel/irq.c	2003-04-24 05:17:10.000000000 -0700
@@ -380,7 +380,7 @@ out:
  */
  
 int request_irq(unsigned int irq,
-		void (*handler)(int, void *, struct pt_regs *),
+		irqreturn_t (*handler)(int, void *, struct pt_regs *),
 		unsigned long irqflags, 
 		const char * devname,
 		void *dev_id)
@@ -426,7 +426,7 @@ int request_irq(unsigned int irq,
 }
 
 int um_request_irq(unsigned int irq, int fd, int type,
-		   void (*handler)(int, void *, struct pt_regs *),
+		   irqreturn_t (*handler)(int, void *, struct pt_regs *),
 		   unsigned long irqflags, const char * devname,
 		   void *dev_id)
 {
diff -puN arch/um/kernel/sigio_kern.c~irqreturn-uml arch/um/kernel/sigio_kern.c
--- 25/arch/um/kernel/sigio_kern.c~irqreturn-uml	2003-04-24 05:17:10.000000000 -0700
+++ 25-akpm/arch/um/kernel/sigio_kern.c	2003-04-24 05:17:10.000000000 -0700
@@ -6,7 +6,8 @@
 #include "linux/kernel.h"
 #include "linux/list.h"
 #include "linux/slab.h"
-#include "asm/irq.h"
+#include "linux/signal.h"
+#include "linux/interrupt.h"
 #include "init.h"
 #include "sigio.h"
 #include "irq_user.h"
@@ -14,10 +15,11 @@
 /* Protected by sigio_lock() called from write_sigio_workaround */
 static int sigio_irq_fd = -1;
 
-void sigio_interrupt(int irq, void *data, struct pt_regs *unused)
+irqreturn_t sigio_interrupt(int irq, void *data, struct pt_regs *unused)
 {
 	read_sigio_fd(sigio_irq_fd);
 	reactivate_fd(sigio_irq_fd, SIGIO_WRITE_IRQ);
+	return IRQ_HANDLED;
 }
 
 int write_sigio_irq(int fd)
diff -puN arch/um/kernel/time_kern.c~irqreturn-uml arch/um/kernel/time_kern.c
--- 25/arch/um/kernel/time_kern.c~irqreturn-uml	2003-04-24 05:17:10.000000000 -0700
+++ 25-akpm/arch/um/kernel/time_kern.c	2003-04-24 05:17:10.000000000 -0700
@@ -55,12 +55,13 @@ void boot_timer_handler(int sig)
 	do_timer(&regs);
 }
 
-void um_timer(int irq, void *dev, struct pt_regs *regs)
+irqreturn_t um_timer(int irq, void *dev, struct pt_regs *regs)
 {
 	do_timer(regs);
 	write_seqlock(&xtime_lock);
 	timer();
 	write_sequnlock(&xtime_lock);
+	return IRQ_HANDLED;
 }
 
 long um_time(int * tloc)
diff -puN include/asm-um/irq.h~irqreturn-uml include/asm-um/irq.h
--- 25/include/asm-um/irq.h~irqreturn-uml	2003-04-24 05:17:10.000000000 -0700
+++ 25-akpm/include/asm-um/irq.h	2003-04-24 05:17:10.000000000 -0700
@@ -6,6 +6,8 @@
  */
 struct task_struct;
 
+struct irqreturn;
+
 #include "asm/ptrace.h"
 
 #undef NR_IRQS
@@ -29,7 +31,7 @@ struct task_struct;
 #define NR_IRQS (LAST_IRQ + 1)
 
 extern int um_request_irq(unsigned int irq, int fd, int type,
-			  void (*handler)(int, void *, struct pt_regs *),
+			  struct irqreturn (*handler)(int, void *, struct pt_regs *),
 			  unsigned long irqflags,  const char * devname,
 			  void *dev_id);
 #endif

_
