linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 2.6] Fix stallion for UP
@ 2004-08-24 15:02 Ingo Korb
  0 siblings, 0 replies; only message in thread
From: Ingo Korb @ 2004-08-24 15:02 UTC (permalink / raw)
  To: linux-kernel

Hi!

When switching from 2.4 to 2.6 I noticed that the stallion driver didn't
load at all when compiled into the kernel and left a complaint about
sleeping in an invalid context in the log when loaded as a module.

The patch below attempts to fix this, but it will still be broken for
SMP as the code is sprinkled with cli() and I don't fully understand
what should be going on there yet.

As this is my first attempt at kernel stuff I'd appreciate any comments.

The driver originally used cli() in the module initialisation because it
routed all interrupts through a single ISR that accessed global
structures which may not have been fully initialized at that point. I
removed that procedure, taking advantage of the (originally NULL) dev_id
pointer and moved the request_irq to a later point where I think it
won't cause a race anymore.

Status of the patched driver: "Works for me" with a single PCI-board on
UP compiled as a module, I don't have more hardware to
test. Compile-tested, but not booted as a compiled-in driver.

Signed-off-by: Ingo Korb <ingo@akana.de>

diff -uprN -X dontdiff linux-2.6.8.1-orig/drivers/char/stallion.c linux-2.6.8.1/drivers/char/stallion.c
--- linux-2.6.8.1-orig/drivers/char/stallion.c	2004-08-24 16:03:55.000000000 +0200
+++ linux-2.6.8.1/drivers/char/stallion.c	2004-08-24 16:42:56.000000000 +0200
@@ -173,14 +173,6 @@ static stlport_t	stl_dummyport;
  */
 static char		stl_unwanted[SC26198_RXFIFOSIZE];
 
-/*
- *	Keep track of what interrupts we have requested for us.
- *	We don't need to request an interrupt twice if it is being
- *	shared with another Stallion board.
- */
-static int	stl_gotintrs[STL_MAXBRDS];
-static int	stl_numintrs;
-
 /*****************************************************************************/
 
 static stlbrd_t		*stl_brds[STL_MAXBRDS];
@@ -239,7 +231,6 @@ static char	*stl_brdnames[] = {
 
 /*****************************************************************************/
 
-#ifdef MODULE
 /*
  *	Define some string labels for arguments passed from the module
  *	load line. These allow for easy board definitions, and easy
@@ -315,8 +306,6 @@ MODULE_PARM_DESC(board2, "Board 2 config
 MODULE_PARM(board3, "1-4s");
 MODULE_PARM_DESC(board3, "Board 3 config -> name[,ioaddr[,ioaddr2][,irq]]");
 
-#endif
-
 /*****************************************************************************/
 
 /*
@@ -471,12 +460,10 @@ static unsigned int	stl_baudrates[] = {
  *	Declare all those functions in this driver!
  */
 
-#ifdef MODULE
 static void	stl_argbrds(void);
 static int	stl_parsebrd(stlconf_t *confp, char **argp);
 
 static unsigned long stl_atol(char *str);
-#endif
 
 int		stl_init(void);
 static int	stl_open(struct tty_struct *tty, struct file *filp);
@@ -503,7 +490,6 @@ static int	stl_readproc(char *page, char
 
 static int	stl_brdinit(stlbrd_t *brdp);
 static int	stl_initports(stlbrd_t *brdp, stlpanel_t *panelp);
-static int	stl_mapirq(int irq, char *name);
 static int	stl_getserial(stlport_t *portp, struct serial_struct __user *sp);
 static int	stl_setserial(stlport_t *portp, struct serial_struct __user *sp);
 static int	stl_getbrdstats(combrd_t __user *bp);
@@ -513,11 +499,11 @@ static int	stl_getportstruct(stlport_t _
 static int	stl_getbrdstruct(stlbrd_t __user *arg);
 static int	stl_waitcarrier(stlport_t *portp, struct file *filp);
 static void	stl_delay(int len);
-static void	stl_eiointr(stlbrd_t *brdp);
-static void	stl_echatintr(stlbrd_t *brdp);
-static void	stl_echmcaintr(stlbrd_t *brdp);
-static void	stl_echpciintr(stlbrd_t *brdp);
-static void	stl_echpci64intr(stlbrd_t *brdp);
+static irqreturn_t stl_eiointr(int irq, void *dev_id, struct pt_regs *regs);
+static irqreturn_t stl_echatintr(int irq, void *dev_id, struct pt_regs *regs);
+static irqreturn_t stl_echmcaintr(int irq, void *dev_id, struct pt_regs *regs);
+static irqreturn_t stl_echpciintr(int irq, void *dev_id, struct pt_regs *regs);
+static irqreturn_t stl_echpci64intr(int irq, void *dev_id, struct pt_regs *regs);
 static void	stl_offintr(void *private);
 static void	*stl_memalloc(int len);
 static stlbrd_t *stl_allocbrd(void);
@@ -553,8 +539,8 @@ static void	stl_cd1400flowctrl(stlport_t
 static void	stl_cd1400sendflow(stlport_t *portp, int state);
 static void	stl_cd1400flush(stlport_t *portp);
 static int	stl_cd1400datastate(stlport_t *portp);
-static void	stl_cd1400eiointr(stlpanel_t *panelp, unsigned int iobase);
-static void	stl_cd1400echintr(stlpanel_t *panelp, unsigned int iobase);
+static irqreturn_t stl_cd1400eiointr(stlpanel_t *panelp, unsigned int iobase);
+static irqreturn_t stl_cd1400echintr(stlpanel_t *panelp, unsigned int iobase);
 static void	stl_cd1400txisr(stlpanel_t *panelp, int ioaddr);
 static void	stl_cd1400rxisr(stlpanel_t *panelp, int ioaddr);
 static void	stl_cd1400mdmisr(stlpanel_t *panelp, int ioaddr);
@@ -583,7 +569,7 @@ static void	stl_sc26198flush(stlport_t *
 static int	stl_sc26198datastate(stlport_t *portp);
 static void	stl_sc26198wait(stlport_t *portp);
 static void	stl_sc26198txunflow(stlport_t *portp, struct tty_struct *tty);
-static void	stl_sc26198intr(stlpanel_t *panelp, unsigned int iobase);
+static irqreturn_t stl_sc26198intr(stlpanel_t *panelp, unsigned int iobase);
 static void	stl_sc26198txisr(stlport_t *port);
 static void	stl_sc26198rxisr(stlport_t *port, unsigned int iack);
 static void	stl_sc26198rxbadch(stlport_t *portp, unsigned char status, char ch);
@@ -609,7 +595,7 @@ typedef struct uart {
 	void	(*sendflow)(stlport_t *portp, int state);
 	void	(*flush)(stlport_t *portp);
 	int	(*datastate)(stlport_t *portp);
-	void	(*intr)(stlpanel_t *panelp, unsigned int iobase);
+	irqreturn_t (*intr)(stlpanel_t *panelp, unsigned int iobase);
 } uart_t;
 
 /*
@@ -735,24 +721,17 @@ static struct file_operations	stl_fsiome
 
 static struct class_simple *stallion_class;
 
-#ifdef MODULE
-
 /*
  *	Loadable module initialization stuff.
  */
 
 static int __init stallion_module_init(void)
 {
-	unsigned long	flags;
-
 #ifdef DEBUG
 	printk("init_module()\n");
 #endif
 
-	save_flags(flags);
-	cli();
 	stl_init();
-	restore_flags(flags);
 
 	return(0);
 }
@@ -828,13 +807,12 @@ static void __exit stallion_module_exit(
 		if (brdp->iosize2 > 0)
 			release_region(brdp->ioaddr2, brdp->iosize2);
 
+		free_irq(brdp->irq,brdp);
+
 		kfree(brdp);
 		stl_brds[i] = (stlbrd_t *) NULL;
 	}
 
-	for (i = 0; (i < stl_numintrs); i++)
-		free_irq(stl_gotintrs[i], NULL);
-
 	restore_flags(flags);
 }
 
@@ -959,8 +937,6 @@ static int stl_parsebrd(stlconf_t *confp
 	return(1);
 }
 
-#endif
-
 /*****************************************************************************/
 
 /*
@@ -2024,46 +2000,22 @@ stl_readdone:
 /*****************************************************************************/
 
 /*
- *	All board interrupts are vectored through here first. This code then
- *	calls off to the approrpriate board interrupt handlers.
- */
-
-static irqreturn_t stl_intr(int irq, void *dev_id, struct pt_regs *regs)
-{
-	stlbrd_t	*brdp;
-	int		i;
-	int handled = 0;
-
-#ifdef DEBUG
-	printk("stl_intr(irq=%d,regs=%x)\n", irq, (int) regs);
-#endif
-
-	for (i = 0; (i < stl_nrbrds); i++) {
-		if ((brdp = stl_brds[i]) == (stlbrd_t *) NULL)
-			continue;
-		if (brdp->state == 0)
-			continue;
-		handled = 1;
-		(* brdp->isr)(brdp);
-	}
-	return IRQ_RETVAL(handled);
-}
-
-/*****************************************************************************/
-
-/*
  *	Interrupt service routine for EasyIO board types.
  */
 
-static void stl_eiointr(stlbrd_t *brdp)
+static irqreturn_t stl_eiointr(int irq, void *dev_id, struct pt_regs *regs)
 {
 	stlpanel_t	*panelp;
 	unsigned int	iobase;
+	stlbrd_t        *brdp = (stlbrd_t *)dev_id;
+	irqreturn_t     rc = IRQ_NONE;
 
 	panelp = brdp->panels[0];
 	iobase = panelp->iobase;
 	while (inb(brdp->iostatus) & EIO_INTRPEND)
-		(* panelp->isr)(panelp, iobase);
+		if ((* panelp->isr)(panelp, iobase) != IRQ_NONE)
+			rc = IRQ_HANDLED;
+	return rc;
 }
 
 /*****************************************************************************/
@@ -2072,11 +2024,13 @@ static void stl_eiointr(stlbrd_t *brdp)
  *	Interrupt service routine for ECH-AT board types.
  */
 
-static void stl_echatintr(stlbrd_t *brdp)
+static irqreturn_t stl_echatintr(int irq, void *dev_id, struct pt_regs *regs)
 {
 	stlpanel_t	*panelp;
 	unsigned int	ioaddr;
 	int		bnknr;
+	stlbrd_t        *brdp = (stlbrd_t *)dev_id;
+	irqreturn_t     rc = IRQ_NONE;
 
 	outb((brdp->ioctrlval | ECH_BRDENABLE), brdp->ioctrl);
 
@@ -2085,12 +2039,15 @@ static void stl_echatintr(stlbrd_t *brdp
 			ioaddr = brdp->bnkstataddr[bnknr];
 			if (inb(ioaddr) & ECH_PNLINTRPEND) {
 				panelp = brdp->bnk2panel[bnknr];
-				(* panelp->isr)(panelp, (ioaddr & 0xfffc));
+				if ((* panelp->isr)(panelp, (ioaddr & 0xfffc))
+				    != IRQ_NONE)
+					rc = IRQ_HANDLED;
 			}
 		}
 	}
 
 	outb((brdp->ioctrlval | ECH_BRDDISABLE), brdp->ioctrl);
+	return rc;
 }
 
 /*****************************************************************************/
@@ -2099,21 +2056,26 @@ static void stl_echatintr(stlbrd_t *brdp
  *	Interrupt service routine for ECH-MCA board types.
  */
 
-static void stl_echmcaintr(stlbrd_t *brdp)
+static irqreturn_t stl_echmcaintr(int irq, void *dev_id, struct pt_regs *regs)
 {
 	stlpanel_t	*panelp;
 	unsigned int	ioaddr;
 	int		bnknr;
+	stlbrd_t        *brdp = (stlbrd_t *)dev_id;
+	irqreturn_t     rc = IRQ_NONE;
 
 	while (inb(brdp->iostatus) & ECH_INTRPEND) {
 		for (bnknr = 0; (bnknr < brdp->nrbnks); bnknr++) {
 			ioaddr = brdp->bnkstataddr[bnknr];
 			if (inb(ioaddr) & ECH_PNLINTRPEND) {
 				panelp = brdp->bnk2panel[bnknr];
-				(* panelp->isr)(panelp, (ioaddr & 0xfffc));
+				if ((* panelp->isr)(panelp, (ioaddr & 0xfffc))
+				    != IRQ_NONE)
+					rc = IRQ_HANDLED;
 			}
 		}
 	}
+	return rc;
 }
 
 /*****************************************************************************/
@@ -2122,11 +2084,13 @@ static void stl_echmcaintr(stlbrd_t *brd
  *	Interrupt service routine for ECH-PCI board types.
  */
 
-static void stl_echpciintr(stlbrd_t *brdp)
+static irqreturn_t stl_echpciintr(int irq, void *dev_id, struct pt_regs *regs)
 {
 	stlpanel_t	*panelp;
 	unsigned int	ioaddr;
 	int		bnknr, recheck;
+	stlbrd_t        *brdp = (stlbrd_t *)dev_id;
+	irqreturn_t     rc = IRQ_NONE;
 
 	while (1) {
 		recheck = 0;
@@ -2135,13 +2099,16 @@ static void stl_echpciintr(stlbrd_t *brd
 			ioaddr = brdp->bnkstataddr[bnknr];
 			if (inb(ioaddr) & ECH_PNLINTRPEND) {
 				panelp = brdp->bnk2panel[bnknr];
-				(* panelp->isr)(panelp, (ioaddr & 0xfffc));
+				if ((* panelp->isr)(panelp, (ioaddr & 0xfffc))
+				    != IRQ_NONE)
+					rc = IRQ_HANDLED;
 				recheck++;
 			}
 		}
 		if (! recheck)
 			break;
 	}
+	return rc;
 }
 
 /*****************************************************************************/
@@ -2150,21 +2117,26 @@ static void stl_echpciintr(stlbrd_t *brd
  *	Interrupt service routine for ECH-8/64-PCI board types.
  */
 
-static void stl_echpci64intr(stlbrd_t *brdp)
+static irqreturn_t stl_echpci64intr(int irq, void *dev_id, struct pt_regs *regs)
 {
 	stlpanel_t	*panelp;
 	unsigned int	ioaddr;
 	int		bnknr;
+	stlbrd_t        *brdp = (stlbrd_t *)dev_id;
+	irqreturn_t     rc = IRQ_NONE;
 
 	while (inb(brdp->ioctrl) & 0x1) {
 		for (bnknr = 0; (bnknr < brdp->nrbnks); bnknr++) {
 			ioaddr = brdp->bnkstataddr[bnknr];
 			if (inb(ioaddr) & ECH_PNLINTRPEND) {
 				panelp = brdp->bnk2panel[bnknr];
-				(* panelp->isr)(panelp, (ioaddr & 0xfffc));
+				if ((* panelp->isr)(panelp, (ioaddr & 0xfffc))
+				    != IRQ_NONE)
+					rc = IRQ_HANDLED;
 			}
 		}
 	}
+	return rc;
 }
 
 /*****************************************************************************/
@@ -2215,39 +2187,6 @@ static void stl_offintr(void *private)
 /*****************************************************************************/
 
 /*
- *	Map in interrupt vector to this driver. Check that we don't
- *	already have this vector mapped, we might be sharing this
- *	interrupt across multiple boards.
- */
-
-static int __init stl_mapirq(int irq, char *name)
-{
-	int	rc, i;
-
-#ifdef DEBUG
-	printk("stl_mapirq(irq=%d,name=%s)\n", irq, name);
-#endif
-
-	rc = 0;
-	for (i = 0; (i < stl_numintrs); i++) {
-		if (stl_gotintrs[i] == irq)
-			break;
-	}
-	if (i >= stl_numintrs) {
-		if (request_irq(irq, stl_intr, SA_SHIRQ, name, NULL) != 0) {
-			printk("STALLION: failed to register interrupt "
-				"routine for %s irq=%d\n", name, irq);
-			rc = -ENODEV;
-		} else {
-			stl_gotintrs[stl_numintrs++] = irq;
-		}
-	}
-	return(rc);
-}
-
-/*****************************************************************************/
-
-/*
  *	Initialize all the ports on a panel.
  */
 
@@ -2307,8 +2246,6 @@ static inline int stl_initeio(stlbrd_t *
 {
 	stlpanel_t	*panelp;
 	unsigned int	status;
-	char		*name;
-	int		rc;
 
 #ifdef DEBUG
 	printk("stl_initeio(brdp=%x)\n", (int) brdp);
@@ -2328,11 +2265,9 @@ static inline int stl_initeio(stlbrd_t *
 	if (brdp->brdtype == BRD_EASYIOPCI) {
 		brdp->iosize1 = 0x80;
 		brdp->iosize2 = 0x80;
-		name = "serial(EIO-PCI)";
 		outb(0x41, (brdp->ioaddr2 + 0x4c));
 	} else {
 		brdp->iosize1 = 8;
-		name = "serial(EIO)";
 		if ((brdp->irq < 0) || (brdp->irq > 15) ||
 		    (stl_vecmap[brdp->irq] == (unsigned char) 0xff)) {
 			printk("STALLION: invalid irq=%d for brd=%d\n",
@@ -2344,7 +2279,7 @@ static inline int stl_initeio(stlbrd_t *
 			brdp->ioctrl);
 	}
 
-	if (!request_region(brdp->ioaddr1, brdp->iosize1, name)) {
+	if (!request_region(brdp->ioaddr1, brdp->iosize1, stl_brdnames[brdp->brdtype])) {
 		printk(KERN_WARNING "STALLION: Warning, board %d I/O address "
 			"%x conflicts with another device\n", brdp->brdnr, 
 			brdp->ioaddr1);
@@ -2352,7 +2287,7 @@ static inline int stl_initeio(stlbrd_t *
 	}
 	
 	if (brdp->iosize2 > 0)
-		if (!request_region(brdp->ioaddr2, brdp->iosize2, name)) {
+		if (!request_region(brdp->ioaddr2, brdp->iosize2, stl_brdnames[brdp->brdtype])) {
 			printk(KERN_WARNING "STALLION: Warning, board %d I/O "
 				"address %x conflicts with another device\n",
 				brdp->brdnr, brdp->ioaddr2);
@@ -2430,8 +2365,7 @@ static inline int stl_initeio(stlbrd_t *
 	brdp->nrpanels = 1;
 	brdp->state |= BRD_FOUND;
 	brdp->hwid = status;
-	rc = stl_mapirq(brdp->irq, name);
-	return(rc);
+	return 0;
 }
 
 /*****************************************************************************/
@@ -2446,7 +2380,6 @@ static inline int stl_initech(stlbrd_t *
 	stlpanel_t	*panelp;
 	unsigned int	status, nxtid, ioaddr, conflict;
 	int		panelnr, banknr, i;
-	char		*name;
 
 #ifdef DEBUG
 	printk("stl_initech(brdp=%x)\n", (int) brdp);
@@ -2484,7 +2417,6 @@ static inline int stl_initech(stlbrd_t *
 			outb((brdp->ioctrlval | ECH_BRDENABLE), brdp->ioctrl);
 		brdp->iosize1 = 2;
 		brdp->iosize2 = 32;
-		name = "serial(EC8/32)";
 		outb(status, brdp->ioaddr1);
 		break;
 
@@ -2504,7 +2436,6 @@ static inline int stl_initech(stlbrd_t *
 		outb(ECHMC_BRDRESET, brdp->ioctrl);
 		outb(ECHMC_INTENABLE, brdp->ioctrl);
 		brdp->iosize1 = 64;
-		name = "serial(EC8/32-MC)";
 		break;
 
 	case BRD_ECHPCI:
@@ -2512,7 +2443,6 @@ static inline int stl_initech(stlbrd_t *
 		brdp->ioctrl = brdp->ioaddr1 + 2;
 		brdp->iosize1 = 4;
 		brdp->iosize2 = 8;
-		name = "serial(EC8/32-PCI)";
 		break;
 
 	case BRD_ECH64PCI:
@@ -2521,7 +2451,6 @@ static inline int stl_initech(stlbrd_t *
 		outb(0x43, (brdp->ioaddr1 + 0x4c));
 		brdp->iosize1 = 0x80;
 		brdp->iosize2 = 0x80;
-		name = "serial(EC8/64-PCI)";
 		break;
 
 	default:
@@ -2534,7 +2463,7 @@ static inline int stl_initech(stlbrd_t *
  *	Check boards for possible IO address conflicts and return fail status 
  * 	if an IO conflict found.
  */
-	if (!request_region(brdp->ioaddr1, brdp->iosize1, name)) {
+	if (!request_region(brdp->ioaddr1, brdp->iosize1, stl_brdnames[brdp->brdtype])) {
 		printk(KERN_WARNING "STALLION: Warning, board %d I/O address "
 			"%x conflicts with another device\n", brdp->brdnr, 
 			brdp->ioaddr1);
@@ -2542,7 +2471,7 @@ static inline int stl_initech(stlbrd_t *
 	}
 	
 	if (brdp->iosize2 > 0)
-		if (!request_region(brdp->ioaddr2, brdp->iosize2, name)) {
+		if (!request_region(brdp->ioaddr2, brdp->iosize2, stl_brdnames[brdp->brdtype])) {
 			printk(KERN_WARNING "STALLION: Warning, board %d I/O "
 				"address %x conflicts with another device\n",
 				brdp->brdnr, brdp->ioaddr2);
@@ -2635,8 +2564,7 @@ static inline int stl_initech(stlbrd_t *
 		outb((brdp->ioctrlval | ECH_BRDDISABLE), brdp->ioctrl);
 
 	brdp->state |= BRD_FOUND;
-	i = stl_mapirq(brdp->irq, name);
-	return(i);
+	return 0;
 }
 
 /*****************************************************************************/
@@ -2685,6 +2613,16 @@ static int __init stl_brdinit(stlbrd_t *
 		if (brdp->panels[i] != (stlpanel_t *) NULL)
 			stl_initports(brdp, brdp->panels[i]);
 
+	if (request_irq(brdp->irq, brdp->isr, SA_SHIRQ, stl_brdnames[brdp->brdtype], brdp) != 0) {
+		printk("STALLION: failed to register interrupt "
+		       "routine for %s irq=%d\n", stl_brdnames[brdp->brdtype], brdp->irq);
+		if (brdp->iosize1 > 0)
+			release_region(brdp->ioaddr1, brdp->iosize1);
+		if (brdp->iosize2 > 0)
+			release_region(brdp->ioaddr2, brdp->iosize2);
+		return(EBUSY);
+	}
+
 	printk("STALLION: %s found, board=%d io=%x irq=%d "
 		"nrpanels=%d nrports=%d\n", stl_brdnames[brdp->brdtype],
 		brdp->brdnr, brdp->ioaddr1, brdp->irq, brdp->nrpanels,
@@ -2848,9 +2786,7 @@ static inline int stl_initbrds(void)
  */
 	for (i = 0; (i < stl_nrbrds); i++) {
 		confp = &stl_brdconf[i];
-#ifdef MODULE
 		stl_parsebrd(confp, stl_brdsp[i]);
-#endif
 		if ((brdp = stl_allocbrd()) == (stlbrd_t *) NULL)
 			return(-ENOMEM);
 		brdp->brdnr = i;
@@ -2866,9 +2802,7 @@ static inline int stl_initbrds(void)
  *	Find any dynamically supported boards. That is via module load
  *	line options or auto-detected on the PCI bus.
  */
-#ifdef MODULE
 	stl_argbrds();
-#endif
 #ifdef CONFIG_PCI
 	stl_findpcibrds();
 #endif
@@ -3917,7 +3851,7 @@ static int stl_cd1400datastate(stlport_t
  *	Interrupt service routine for cd1400 EasyIO boards.
  */
 
-static void stl_cd1400eiointr(stlpanel_t *panelp, unsigned int iobase)
+static irqreturn_t stl_cd1400eiointr(stlpanel_t *panelp, unsigned int iobase)
 {
 	unsigned char	svrtype;
 
@@ -3939,6 +3873,9 @@ static void stl_cd1400eiointr(stlpanel_t
 		stl_cd1400txisr(panelp, iobase);
 	else if (svrtype & SVRR_MDM)
 		stl_cd1400mdmisr(panelp, iobase);
+	else
+		return IRQ_NONE;
+	return IRQ_HANDLED;
 }
 
 /*****************************************************************************/
@@ -3947,7 +3884,7 @@ static void stl_cd1400eiointr(stlpanel_t
  *	Interrupt service routine for cd1400 panels.
  */
 
-static void stl_cd1400echintr(stlpanel_t *panelp, unsigned int iobase)
+static irqreturn_t stl_cd1400echintr(stlpanel_t *panelp, unsigned int iobase)
 {
 	unsigned char	svrtype;
 
@@ -3966,6 +3903,9 @@ static void stl_cd1400echintr(stlpanel_t
 		stl_cd1400txisr(panelp, iobase);
 	else if (svrtype & SVRR_MDM)
 		stl_cd1400mdmisr(panelp, iobase);
+	else
+		return IRQ_NONE;
+	return IRQ_HANDLED;
 }
 
 
@@ -4977,7 +4917,7 @@ static inline void stl_sc26198txunflow(s
  *	Interrupt service routine for sc26198 panels.
  */
 
-static void stl_sc26198intr(stlpanel_t *panelp, unsigned int iobase)
+static irqreturn_t stl_sc26198intr(stlpanel_t *panelp, unsigned int iobase)
 {
 	stlport_t	*portp;
 	unsigned int	iack;
@@ -4997,6 +4937,7 @@ static void stl_sc26198intr(stlpanel_t *
 		stl_sc26198txisr(portp);
 	else
 		stl_sc26198otherisr(portp, iack);
+	return IRQ_HANDLED;
 }
 
 /*****************************************************************************/
diff -uprN -X dontdiff linux-2.6.8.1-orig/include/linux/stallion.h linux-2.6.8.1/include/linux/stallion.h
--- linux-2.6.8.1-orig/include/linux/stallion.h	2004-08-24 16:04:43.000000000 +0200
+++ linux-2.6.8.1/include/linux/stallion.h	2004-08-24 16:11:04.000000000 +0200
@@ -110,7 +110,7 @@ typedef struct stlpanel {
 	int		nrports;
 	int		iobase;
 	void		*uartp;
-	void		(*isr)(struct stlpanel *panelp, unsigned int iobase);
+	irqreturn_t	(*isr)(struct stlpanel *panelp, unsigned int iobase);
 	unsigned int	hwid;
 	unsigned int	ackmask;
 	stlport_t	*ports[STL_PORTSPERPANEL];
@@ -126,7 +126,7 @@ typedef struct stlbrd {
 	int		nrbnks;
 	int		irq;
 	int		irqtype;
-	void		(*isr)(struct stlbrd *brdp);
+	irqreturn_t	(*isr)(int irq, void *dev_id, struct pt_regs *regs);
 	unsigned int	ioaddr1;
 	unsigned int	ioaddr2;
 	unsigned int	iosize1;


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2004-08-24 15:39 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-08-24 15:02 [PATCH 2.6] Fix stallion for UP Ingo Korb

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).