Index: sys/arch/sparc/dev/audioamd.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/sparc/dev/audioamd.c,v
retrieving revision 1.13
diff -u -r1.13 audioamd.c
--- sys/arch/sparc/dev/audioamd.c	2002/10/15 13:49:52	1.13
+++ sys/arch/sparc/dev/audioamd.c	2002/12/05 19:29:05
@@ -64,20 +64,11 @@
 /* interrupt interfaces */
 #ifdef AUDIO_C_HANDLER
 int	am7930hwintr __P((void *));
-#if defined(SUN4M)
-#define AUDIO_SET_SWINTR do {		\
-	if (CPU_ISSUN4M)		\
-		raise(0, 4);		\
-	else				\
-		ienab_bis(IE_L4);	\
-} while(0);
+#define AUDIO_SET_SWINTR softintr_schedule(sc->sc_sicookie)
 #else
-#define AUDIO_SET_SWINTR ienab_bis(IE_L4)
-#endif /* defined(SUN4M) */
-#else
 struct auio *auiop;
 #endif /* AUDIO_C_HANDLER */
-int	am7930swintr __P((void *));
+void	am7930swintr __P((void *));
 
 /*
  * interrupt-handler status 
@@ -102,6 +93,8 @@
 	/* sc_au is special in that the hardware interrupt handler uses it */
 	struct  auio sc_au;		/* recv and xmit buffers, etc */
 #define sc_intrcnt	sc_au.au_intrcnt	/* statistics */
+
+	void	*sc_sicookie;		/* softintr(9) cookie */
 };
 
 void	audioamd_mainbus_attach __P((struct device *,
@@ -306,8 +299,15 @@
 	int pri;
 {
 
-	printf(" softpri %d\n", PIL_AUSOFT);
+	sc->sc_sicookie = softintr_establish(IPL_SOFTAUDIO, am7930swintr, sc);
+	if (sc->sc_sicookie == NULL) {
+		printf("\n%s: cannot establish software interrupt\n",
+			sc->sc_am7930.sc_dev.dv_xname);
+		return;
+	}
 
+	printf(" softpri %d\n", softintr_priority(sc->sc_sicookie));
+
 	/*
 	 * Set up glue for MI code early; we use some of it here.
 	 */
@@ -324,9 +324,6 @@
 	(void)bus_intr_establish(sc->sc_bt, pri, IPL_AUDIO, 0,
 				 am7930hwintr, sc);
 #endif
-	(void)bus_intr_establish(sc->sc_bt, PIL_AUSOFT, IPL_AUDIO,
-				 BUS_INTR_ESTABLISH_SOFTINTR,
-				 am7930swintr, sc);
 
 	evcnt_attach_dynamic(&sc->sc_intrcnt, EVCNT_TYPE_INTR, NULL,
 	    sc->sc_am7930.sc_dev.dv_xname, "intr");
@@ -466,13 +463,13 @@
 }
 #endif /* AUDIO_C_HANDLER */
 
-int
+void
 am7930swintr(sc0)
 	void *sc0;
 {
 	struct audioamd_softc *sc = sc0;
 	struct auio *au;
-	int s, ret = 0;
+	int s;
 
 	DPRINTFN(1, ("audiointr: sc=%p\n", sc););
 
@@ -480,17 +477,14 @@
 	s = splaudio();
 	if (au->au_rdata > au->au_rend && sc->sc_rintr != NULL) {
 		splx(s);
-		ret = 1;
 		(*sc->sc_rintr)(sc->sc_rarg);
 		s = splaudio();
 	}
 	if (au->au_pdata > au->au_pend && sc->sc_pintr != NULL) {
 		splx(s);
-		ret = 1;
 		(*sc->sc_pintr)(sc->sc_parg);
 	} else
 		splx(s);
-	return (ret);
 }
 
 
Index: sys/arch/sparc/dev/fd.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/sparc/dev/fd.c,v
retrieving revision 1.96
diff -u -r1.96 fd.c
--- sys/arch/sparc/dev/fd.c	2002/11/01 11:31:53	1.96
+++ sys/arch/sparc/dev/fd.c	2002/12/05 19:29:06
@@ -174,6 +174,8 @@
 #define sc_nstat	sc_io.fdcio_nstat
 #define sc_status	sc_io.fdcio_status
 #define sc_intrcnt	sc_io.fdcio_intrcnt
+
+	void		*sc_sicookie;	/* softintr(9) cookie */
 };
 
 extern	struct fdcio	*fdciop;	/* I/O descriptor used in fdintr.s */
@@ -302,7 +304,7 @@
 void	fdcpseudointr __P((void *arg));
 int	fdc_c_hwintr __P((void *));
 void	fdchwintr __P((void));
-int	fdcswintr __P((void *));
+void	fdcswintr __P((void *));
 int	fdcstate __P((struct fdc_softc *));
 void	fdcretry __P((struct fdc_softc *fdc));
 void	fdfinish __P((struct fd_softc *fd, struct buf *bp));
@@ -317,23 +319,8 @@
 		bus_size_t,
 		bus_space_handle_t));
 
-
-#if PIL_FDSOFT == 4
-#define IE_FDSOFT	IE_L4
-#else
-#error 4
-#endif
 
-#if defined(SUN4M)
-#define FD_SET_SWINTR do {		\
-	if (CPU_ISSUN4M)		\
-		raise(0, PIL_FDSOFT);	\
-	else				\
-		ienab_bis(IE_L4);	\
-} while(0)
-#else
-#define FD_SET_SWINTR ienab_bis(IE_FDSOFT)
-#endif /* defined(SUN4M) */
+#define FD_SET_SWINTR softintr_schedule(fdc->sc_sicookie)
 
 #define OBP_FDNAME	(CPU_ISSUN4M ? "SUNW,fdtwo" : "fd")
 
@@ -624,7 +611,16 @@
 		code = '2';
 	}
 
-	printf(" softpri %d: chip 8207%c\n", PIL_FDSOFT, code);
+	fdc->sc_sicookie = softintr_establish(IPL_SOFTFLOPPY, 
+					      fdcswintr, fdc);
+	if (fdc->sc_sicookie == NULL) {
+		printf("\n%s: cannot register soft interrupt handler\n",
+			fdc->sc_dev.dv_xname);
+		return (-1);
+	}
+
+	printf(" softpri %d: chip 8207%c\n",
+		softintr_priority(fdc->sc_sicookie), code);
 
 	/*
 	 * Configure controller; enable FIFO, Implied seek, no POLL mode?.
@@ -633,6 +629,7 @@
 	fdc->sc_cfg = CFG_EIS|/*CFG_EFIFO|*/CFG_POLL|(8 & CFG_THRHLD_MASK);
 	if (fdconf(fdc) != 0) {
 		printf("%s: no drives attached\n", fdc->sc_dev.dv_xname);
+		softintr_disestablish(fdc->sc_sicookie);
 		return (-1);
 	}
 
@@ -647,18 +644,11 @@
 				 fdc_c_hwintr, fdc) == NULL) {
 			printf("%s: cannot register interrupt handler\n",
 				fdc->sc_dev.dv_xname);
+			softintr_disestablish(fdc->sc_sicookie);
 			return (-1);
 		}
 	}
 
-	if (bus_intr_establish(fdc->sc_bustag, PIL_FDSOFT, IPL_BIO,
-			 BUS_INTR_ESTABLISH_SOFTINTR,
-			 fdcswintr, fdc) == NULL) {
-		printf("%s: cannot register interrupt handler\n",
-			fdc->sc_dev.dv_xname);
-		return (-1);
-	}
-
 	evcnt_attach_dynamic(&fdc->sc_intrcnt, EVCNT_TYPE_INTR, NULL,
 	    fdc->sc_dev.dv_xname, "intr");
 
@@ -1375,7 +1365,7 @@
 	return (1);
 }
 
-int
+void
 fdcswintr(arg)
 	void *arg;
 {
@@ -1384,7 +1374,7 @@
 
 	if (fdc->sc_istatus == FDC_ISTATUS_NONE)
 		/* This (software) interrupt is not for us */
-		return (0);
+		return;
 
 	switch (fdc->sc_istatus) {
 	case FDC_ISTATUS_ERROR:
@@ -1398,7 +1388,7 @@
 	s = splbio();
 	fdcstate(fdc);
 	splx(s);
-	return (1);
+	return;
 }
 
 int
Index: sys/arch/sparc/dev/sbus.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/sparc/dev/sbus.c,v
retrieving revision 1.52
diff -u -r1.52 sbus.c
--- sys/arch/sparc/dev/sbus.c	2002/10/02 16:02:16	1.52
+++ sys/arch/sparc/dev/sbus.c	2002/12/05 19:29:06
@@ -682,9 +682,7 @@
 	/*
 	 * Translate Sbus interrupt priority to CPU interrupt level
 	 */
-	if ((flags & BUS_INTR_ESTABLISH_SOFTINTR) != 0)
-		pil = pri;
-	else if ((pri & SBUS_INTR_COMPAT) != 0)
+	if ((pri & SBUS_INTR_COMPAT) != 0)
 		pil = pri & ~SBUS_INTR_COMPAT;
 	else
 		pil = sc->sc_intr2ipl[pri];
Index: sys/arch/sparc/dev/zs.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/sparc/dev/zs.c,v
retrieving revision 1.92
diff -u -r1.92 zs.c
--- sys/arch/sparc/dev/zs.c	2002/10/09 08:56:25	1.92
+++ sys/arch/sparc/dev/zs.c	2002/12/05 19:29:06
@@ -96,19 +96,6 @@
  */
 #define PCLK	(9600 * 512)	/* PCLK pin input clock rate */
 
-/*
- * Select software interrupt bit based on TTY ipl.
- */
-#if PIL_TTY == 1
-# define IE_ZSSOFT IE_L1
-#elif PIL_TTY == 4
-# define IE_ZSSOFT IE_L4
-#elif PIL_TTY == 6
-# define IE_ZSSOFT IE_L6
-#else
-# error "no suitable software interrupt bit"
-#endif
-
 #define	ZS_DELAY()		(CPU_ISSUN4C ? (0) : delay(2))
 
 /* The layout of this is hardware-dependent (padding, order). */
@@ -192,9 +179,12 @@
 
 extern struct cfdriver zs_cd;
 
+/* softintr(9) cookie, shared by all instances of this driver */
+static void *zs_sicookie;
+
 /* Interrupt handlers. */
 static int zshard __P((void *));
-static int zssoft __P((void *));
+static void zssoft __P((void *));
 
 static int zs_get_speed __P((struct zs_chanstate *));
 
@@ -434,8 +424,17 @@
 		printf("configuration incomplete\n");
 		return;
 	}
+
+	if (!didintr) {
+		zs_sicookie = softintr_establish(IPL_SOFTSERIAL, zssoft, NULL);
+		if (zs_sicookie == NULL) {
+			printf("\n%s: cannot establish soft int handler\n",
+				zsc->zsc_dev.dv_xname);
+			return;
+		}
+	}
 
-	printf(" softpri %d\n", PIL_TTY);
+	printf(" softpri %d\n", softintr_priority(zs_sicookie));
 
 	/*
 	 * Initialize software state for each channel.
@@ -520,10 +519,6 @@
 		prevpri = pri;
 		bus_intr_establish(zsc->zsc_bustag, pri, IPL_SERIAL, 0,
 				   zshard, NULL);
-		bus_intr_establish(zsc->zsc_bustag, PIL_TTY,
-				   IPL_SOFTSERIAL,
-				   BUS_INTR_ESTABLISH_SOFTINTR,
-				   zssoft, NULL);
 	} else if (pri != prevpri)
 		panic("broken zs interrupt scheme");
 
@@ -606,13 +601,8 @@
 
 	/* We are at splzs here, so no need to lock. */
 	if (softreq && (zssoftpending == 0)) {
-		zssoftpending = IE_ZSSOFT;
-#if defined(SUN4M)
-		if (CPU_ISSUN4M)
-			raise(0, PIL_TTY);
-		else
-#endif
-			ienab_bis(IE_ZSSOFT);
+		zssoftpending = 1;
+		softintr_schedule(zs_sicookie);
 	}
 	return (rval);
 }
@@ -620,7 +610,7 @@
 /*
  * Similar scheme as for zshard (look at all of them)
  */
-static int
+static void
 zssoft(arg)
 	void *arg;
 {
@@ -629,7 +619,7 @@
 
 	/* This is not the only ISR on this IPL. */
 	if (zssoftpending == 0)
-		return (0);
+		return;
 
 	/*
 	 * The soft intr. bit will be set by zshard only if
@@ -649,7 +639,6 @@
 		(void)zsc_intr_soft(zsc);
 	}
 	splx(s);
-	return (1);
 }
 
 
Index: sys/arch/sparc/include/bus.h
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/sparc/include/bus.h,v
retrieving revision 1.33
diff -u -r1.33 bus.h
--- sys/arch/sparc/include/bus.h	2002/08/25 17:55:00	1.33
+++ sys/arch/sparc/include/bus.h	2002/12/05 19:29:07
@@ -320,7 +320,6 @@
 
 /* flags for intr_establish() */
 #define BUS_INTR_ESTABLISH_FASTTRAP	1
-#define BUS_INTR_ESTABLISH_SOFTINTR	2
 
 /* flags for bus_space_barrier() */
 #define	BUS_SPACE_BARRIER_READ	0x01		/* force read barrier */
Index: sys/arch/sparc/include/cpu.h
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/sparc/include/cpu.h,v
retrieving revision 1.51
diff -u -r1.51 cpu.h
--- sys/arch/sparc/include/cpu.h	2002/11/28 15:29:53	1.51
+++ sys/arch/sparc/include/cpu.h	2002/12/05 19:29:07
@@ -125,17 +125,6 @@
 #define	CLKF_INTR(framep)	((framep)->fp < (u_int)eintstack)
 #endif
 
-#if defined(SUN4M)
-extern void	raise __P((int, int));
-#if !(defined(SUN4) || defined(SUN4C))
-#define setsoftint()	raise(0,1)
-#else /* both defined */
-#define setsoftint()	(cputyp == CPU_SUN4M ? raise(0,1) : ienab_bis(IE_L1))
-#endif /* !4,!4c */
-#else	/* 4m not defined */
-#define setsoftint()	ienab_bis(IE_L1)
-#endif /* SUN4M */
-
 void	softintr_init __P((void));
 void	*softnet_cookie;
 
Index: sys/arch/sparc/include/intr.h
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/sparc/include/intr.h,v
retrieving revision 1.3
diff -u -r1.3 intr.h
--- sys/arch/sparc/include/intr.h	2001/09/27 02:05:42	1.3
+++ sys/arch/sparc/include/intr.h	2002/12/05 19:29:07
@@ -42,7 +42,9 @@
 #define IPL_SOFTNET	1	/* protocol stack */
 #define IPL_BIO		2	/* block I/O */
 #define IPL_NET		3	/* network */
-#define IPL_SOFTSERIAL	4	/* serial */
+#define IPL_SOFTAUDIO	4	/* soft audio */
+#define IPL_SOFTFLOPPY	4	/* soft floppy */
+#define IPL_SOFTSERIAL	5	/* serial */
 #define IPL_TTY		5	/* terminal */
 #define IPL_IMP		6	/* memory allocation */
 #define IPL_AUDIO	7	/* audio */
@@ -50,10 +52,37 @@
 #define IPL_SERIAL	9	/* serial */
 #define IPL_HIGH	10	/* everything */
 
+#ifdef _KERNEL
+
+#if !defined(_LKM) && defined(_KERNEL_OPT)
+#include "opt_sparc_arch.h"
+#endif
+
 void *
 softintr_establish __P((int level, void (*fun)(void *), void *arg));
 
 void
 softintr_disestablish __P((void *cookie));
+
+int
+softintr_priority __P((void *cookie));
+
+/*
+ * NB that softintr_schedule() casts the cookie to an int *.
+ * This is to get the sic_pilreq member of the softintr_cookie
+ * structure, which is otherwise internal to intr.c.
+ */
+#if defined(SUN4M)
+extern void	raise __P((int, int));
+#if !(defined(SUN4) || defined(SUN4C))
+#define softintr_schedule(cookie)	raise(0, *((int *) (cookie)))
+#else /* both defined */
+#define softintr_schedule(cookie)	(cputyp == CPU_SUN4M ? \
+					 raise(0, *((int *) (cookie))) : \
+					 ienab_bis(*((int *) (cookie))))
+#endif /* !4,!4c */
+#else	/* 4m not defined */
+#define softintr_schedule(cookie)	ienab_bis(*((int *) (cookie)))
+#endif /* SUN4M */
 
-#define softintr_schedule(cookie)	setsoftint()
+#endif /* _KERNEL */
Index: sys/arch/sparc/sparc/intr.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/sparc/sparc/intr.c,v
retrieving revision 1.60
diff -u -r1.60 intr.c
--- sys/arch/sparc/sparc/intr.c	2002/09/27 15:36:47	1.60
+++ sys/arch/sparc/sparc/intr.c	2002/12/05 19:29:07
@@ -74,6 +74,20 @@
 
 void *softnet_cookie;
 
+/*
+ * This is a softintr cookie.  NB that sic_pilreq MUST be the
+ * first element in the struct, because the softintr_schedule()
+ * macro in intr.h casts cookies to int * to get it.  On a
+ * sun4m, sic_pilreq is an actual processor interrupt level that 
+ * is passed to raise(), and on a sun4 or sun4c sic_pilreq is a 
+ * bit to set in the interrupt enable register with ienab_bis().
+ */
+struct softintr_cookie {
+	int sic_pilreq;		/* MUST be first! */
+	int sic_pil;
+	struct intrhand sic_hand;
+};
+
 void	strayintr __P((struct clockframe *));
 #ifdef DIAGNOSTIC
 void	bogusintr __P((struct clockframe *));
@@ -551,15 +565,80 @@
 	void (*fun) __P((void *));
 	void *arg;
 {
+	struct softintr_cookie *sic;
 	struct intrhand *ih;
+	int pil;
+	int pilreq;
+
+	/*
+	 * Turn the IPL_ identifier into a processor
+	 * interrupt level.
+	 */
+	if (level == IPL_SOFTCLOCK)
+		pil = 1;	/* XXX needs a PIL_ macro */
+	else if (level == IPL_SOFTNET)
+		pil = 1;	/* XXX needs a PIL_ macro */
+	else if (level == IPL_SOFTAUDIO)
+		pil = PIL_AUSOFT;
+	else if (level == IPL_SOFTFLOPPY)
+		pil = PIL_FDSOFT;
+	else if (level == IPL_SOFTSERIAL)
+		pil = PIL_TTY;
+	else {
+#ifdef DIAGNOSTIC
+		printf("softintr_establish: bad soft ipl %d\n", level);
+#endif
+		return (NULL);
+	}
 
-	ih = malloc(sizeof(*ih), M_DEVBUF, 0);
-	bzero(ih, sizeof(*ih));
+	/* 
+	 * On a sun4m the processor interrupt level is stored
+	 * in the softintr cookie to be passed to raise().
+	 * On a sun4 or sun4c the appropriate bit to set
+	 * in the interrupt enable register is stored in
+	 * the softintr cookie to be passed to ienab_bis().
+	 */
+	if (CPU_ISSUN4M)
+		pilreq = pil;
+	else if (CPU_ISSUN4 || CPU_ISSUN4C) {
+		switch (pil) {
+		case 1:	pilreq = IE_L1; break;
+		case 4: pilreq = IE_L4; break;
+		case 6:	pilreq = IE_L6; break;
+		default:
+#ifdef DIAGNOSTIC
+			printf("softintr_establish: bad soft pil %d\n", pil);
+#endif
+			return (NULL);
+		}
+	}
+	else
+		panic("softintr_establish");
+		
+	sic = malloc(sizeof(*sic), M_DEVBUF, 0);
+	bzero(sic, sizeof(*sic));
+	sic->sic_pil = pil;
+	sic->sic_pilreq = pilreq;
+	ih = &sic->sic_hand;
 	ih->ih_fun = (int (*) __P((void *)))fun;
 	ih->ih_arg = arg;
 	ih->ih_next = 0;
-	intr_establish(1, ih);
-	return (void *)ih;
+	intr_establish(pil, ih);
+	return (void *)sic;
+}
+
+/*
+ * softintr_priority(): MI interface.  returns the CPU priority level
+ * of the specified software interrupt.  shouldn't be treated as a
+ * real CPU priority level in any way except for use in printf()s in
+ * device attach routines.
+ */
+int
+softintr_priority(cookie)
+	void *cookie;
+{
+	struct softintr_cookie *sic = cookie;
+	return (sic->sic_pil);
 }
 
 /*
@@ -570,8 +649,9 @@
 softintr_disestablish(cookie)
 	void *cookie;
 {
+	struct softintr_cookie *sic = cookie;
 
-	intr_disestablish(1, cookie);
+	intr_disestablish(sic->sic_pil, cookie);
 	free(cookie, M_DEVBUF);
 }
 
Index: sys/arch/sparc64/dev/psycho.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/sparc64/dev/psycho.c,v
retrieving revision 1.55
diff -u -r1.55 psycho.c
--- sys/arch/sparc64/dev/psycho.c	2002/10/02 16:02:19	1.55
+++ sys/arch/sparc64/dev/psycho.c	2002/12/05 19:29:08
@@ -1042,48 +1042,45 @@
 		level = 2;
 	}
 
-	if ((flags & BUS_INTR_ESTABLISH_SOFTINTR) == 0) {
+	DPRINTF(PDB_INTR, ("\npsycho: intr %lx: %p\nHunting for IRQ...\n",
+	    (long)ino, intrlev[ino]));
 
-		DPRINTF(PDB_INTR, ("\npsycho: intr %lx: %p\nHunting for IRQ...\n",
-		    (long)ino, intrlev[ino]));
-
-		/* Hunt thru obio first */
-		for (intrmapptr = &sc->sc_regs->scsi_int_map,
-			     intrclrptr = &sc->sc_regs->scsi_clr_int;
-		     intrmapptr < &sc->sc_regs->ffb0_int_map;
-		     intrmapptr++, intrclrptr++) {
-			if (INTINO(*intrmapptr) == ino)
-				goto found;
-		}
+	/* Hunt thru obio first */
+	for (intrmapptr = &sc->sc_regs->scsi_int_map,
+		     intrclrptr = &sc->sc_regs->scsi_clr_int;
+	     intrmapptr < &sc->sc_regs->ffb0_int_map;
+	     intrmapptr++, intrclrptr++) {
+		if (INTINO(*intrmapptr) == ino)
+			goto found;
+	}
 
-		/* Now do PCI interrupts */
-		for (intrmapptr = &sc->sc_regs->pcia_slot0_int,
-			     intrclrptr = &sc->sc_regs->pcia0_clr_int[0];
-		     intrmapptr <= &sc->sc_regs->pcib_slot3_int;
-		     intrmapptr++, intrclrptr += 4) {
-			if (((*intrmapptr ^ vec) & 0x3c) == 0) {
-				intrclrptr += vec & 0x3;
-				goto found;
-			}
+	/* Now do PCI interrupts */
+	for (intrmapptr = &sc->sc_regs->pcia_slot0_int,
+		     intrclrptr = &sc->sc_regs->pcia0_clr_int[0];
+	     intrmapptr <= &sc->sc_regs->pcib_slot3_int;
+	     intrmapptr++, intrclrptr += 4) {
+		if (((*intrmapptr ^ vec) & 0x3c) == 0) {
+			intrclrptr += vec & 0x3;
+			goto found;
 		}
+	}
 
-		/* Finally check the two FFB slots */
-		intrclrptr = NULL; /* XXX? */
-		for (intrmapptr = &sc->sc_regs->ffb0_int_map;
-		     intrmapptr <= &sc->sc_regs->ffb1_int_map;
-		     intrmapptr++) {
-			if (INTVEC(*intrmapptr) == ino)
-				goto found;
-		}
+	/* Finally check the two FFB slots */
+	intrclrptr = NULL; /* XXX? */
+	for (intrmapptr = &sc->sc_regs->ffb0_int_map;
+	     intrmapptr <= &sc->sc_regs->ffb1_int_map;
+	     intrmapptr++) {
+		if (INTVEC(*intrmapptr) == ino)
+			goto found;
+	}
 
-		printf("Cannot find interrupt vector %lx\n", vec);
-		return (NULL);
+	printf("Cannot find interrupt vector %lx\n", vec);
+	return (NULL);
 
-	found:
-		/* Register the map and clear intr registers */
-		ih->ih_map = intrmapptr;
-		ih->ih_clr = intrclrptr;
-	}
+found:
+	/* Register the map and clear intr registers */
+	ih->ih_map = intrmapptr;
+	ih->ih_clr = intrclrptr;
 #ifdef NOT_DEBUG
 	if (psycho_debug & PDB_INTR) {
 		long i;
Index: sys/arch/sparc64/dev/sbus.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/sparc64/dev/sbus.c,v
retrieving revision 1.55
diff -u -r1.55 sbus.c
--- sys/arch/sparc64/dev/sbus.c	2002/10/02 16:02:19	1.55
+++ sys/arch/sparc64/dev/sbus.c	2002/12/05 19:29:08
@@ -621,9 +621,7 @@
 	if (ih == NULL)
 		return (NULL);
 
-	if ((flags & BUS_INTR_ESTABLISH_SOFTINTR) != 0)
-		ipl = vec;
-	else if ((vec & SBUS_INTR_COMPAT) != 0)
+	if ((vec & SBUS_INTR_COMPAT) != 0)
 		ipl = vec & ~SBUS_INTR_COMPAT;
 	else {
 		/* Decode and remove IPL */
Index: sys/arch/sparc64/include/bus.h
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/sparc64/include/bus.h,v
retrieving revision 1.39
diff -u -r1.39 bus.h
--- sys/arch/sparc64/include/bus.h	2002/03/21 00:43:42	1.39
+++ sys/arch/sparc64/include/bus.h	2002/12/05 19:29:09
@@ -339,7 +339,6 @@
 
 /* flags for intr_establish() */
 #define BUS_INTR_ESTABLISH_FASTTRAP	1
-#define BUS_INTR_ESTABLISH_SOFTINTR	2
 
 /* flags for bus_space_barrier() */
 #define	BUS_SPACE_BARRIER_READ	0x01		/* force read barrier */
Index: sys/arch/sparc64/include/intr.h
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/sparc64/include/intr.h,v
retrieving revision 1.8
diff -u -r1.8 intr.h
--- sys/arch/sparc64/include/intr.h	2001/01/14 23:50:30	1.8
+++ sys/arch/sparc64/include/intr.h	2002/12/05 19:29:09
@@ -36,7 +36,11 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
-/* XXX - arbitrary numbers; no interpretation is defined yet */
+/*
+ * XXX - at least the softintr(9) implementation assumes that
+ * the IPL_SOFT* identifiers correspond to real processor interrupt
+ * levels, other things may assume this too?
+ */
 #define	IPL_NONE	0		/* nothing */
 #define	IPL_SOFTINT	1		/* softint */
 #define	IPL_SOFTCLOCK	1		/* timeouts */
@@ -55,6 +59,9 @@
 
 void *
 softintr_establish __P((int level, void (*fun)(void *), void *arg));
+
+int
+softintr_priority __P((void *cookie));
 
 void
 softintr_disestablish __P((void *cookie));
Index: sys/arch/sparc64/sparc64/intr.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/sparc64/sparc64/intr.c,v
retrieving revision 1.43
diff -u -r1.43 intr.c
--- sys/arch/sparc64/sparc64/intr.c	2002/06/07 19:31:04	1.43
+++ sys/arch/sparc64/sparc64/intr.c	2002/12/05 19:29:09
@@ -325,6 +325,14 @@
 	return (void *)ih;
 }
 
+int
+softintr_priority(cookie)
+	void *cookie;
+{
+	struct intrhand *ih = (struct intrhand *)cookie;
+	return ih->ih_pil;
+}
+
 void
 softintr_disestablish(cookie)
 	void *cookie;
Index: sys/dev/sbus/magma.c
===================================================================
RCS file: /cvsroot/syssrc/sys/dev/sbus/magma.c,v
retrieving revision 1.21
diff -u -r1.21 magma.c
--- sys/dev/sbus/magma.c	2002/10/23 09:13:42	1.21
+++ sys/dev/sbus/magma.c	2002/12/05 19:29:10
@@ -73,19 +73,6 @@
 #include <dev/sbus/mbppio.h>
 #include <dev/sbus/magmareg.h>
 
-/*
- * Select tty soft interrupt bit based on TTY ipl. (stole from zs.c)
- */
-#if PIL_TTY == 1
-# define IE_MSOFT IE_L1
-#elif PIL_TTY == 4
-# define IE_MSOFT IE_L4
-#elif PIL_TTY == 6
-# define IE_MSOFT IE_L6
-#else
-# error "no suitable software interrupt bit"
-#endif
-
 /* supported cards
  *
  *  The table below lists the cards that this driver is likely to
@@ -402,7 +389,15 @@
 	}
 
 	dprintf((" addr %p", sc));
-	printf(" softpri %d: %s\n", PIL_TTY, card->mb_realname);
+
+	sc->ms_sicookie = softintr_establish(IPL_SOFTSERIAL, magma_soft, sc);
+	if (sc->ms_sicookie == NULL) {
+		printf("\n%s: cannot establish soft interrupt handler\n",
+			self->dv_xname);
+		return;
+	}
+	printf(" softpri %d: %s\n",
+		softintr_priority(sc->ms_sicookie), card->mb_realname);
 
 	sc->ms_board = card;
 	sc->ms_ncd1400 = card->mb_ncd1400;
@@ -497,14 +492,13 @@
 	/*
 	 * Establish the interrupt handlers.
 	 */
-	if (sa->sa_nintr == 0)
+	if (sa->sa_nintr == 0) {
+		softintr_disestablish(sc->ms_sicookie);
 		return;		/* No interrupts to service!? */
+	}
 
 	(void)bus_intr_establish(sa->sa_bustag, sa->sa_pri, IPL_TTY,
 				 0, magma_hard, sc);
-	(void)bus_intr_establish(sa->sa_bustag, PIL_TTY, IPL_SOFTSERIAL,
-				 BUS_INTR_ESTABLISH_SOFTINTR,
-				 magma_soft, sc);
 	evcnt_attach_dynamic(&sc->ms_intrcnt, EVCNT_TYPE_INTR, NULL,
 	    sc->ms_dev.dv_xname, "intr");
 }
@@ -726,12 +720,7 @@
 	*/
 
 	if( needsoftint ) {	/* trigger the soft interrupt */
-#if defined(SUN4M)
-		if( CPU_ISSUN4M )
-			raise(0, PIL_TTY);
-		else
-#endif
-			ienab_bis(IE_MSOFT);
+		softintr_schedule(sc->ms_sicookie);
 	}
 
 	return(serviced);
@@ -744,7 +733,7 @@
  *
  *  runs at spltty()
  */
-int
+void
 magma_soft(arg)
 	void *arg;
 {
@@ -825,7 +814,7 @@
 	 * Check the bpp ports (if any) to see what needs doing
 	 */
 	if (mbpp == NULL)
-		return (serviced);
+		return;
 
 	for( port = 0 ; port < mbpp->ms_nports ; port++ ) {
 		struct mbpp_port *mp = &mbpp->ms_port[port];
@@ -845,7 +834,7 @@
 
 	} /* for(each mbpp...) */
 
-	return(serviced);
+	return;
 }
 
 /************************************************************************
Index: sys/dev/sbus/magmareg.h
===================================================================
RCS file: /cvsroot/syssrc/sys/dev/sbus/magmareg.h,v
retrieving revision 1.5
diff -u -r1.5 magmareg.h
--- sys/dev/sbus/magmareg.h	2002/09/06 13:23:27	1.5
+++ sys/dev/sbus/magmareg.h	2002/12/05 19:29:10
@@ -123,6 +123,7 @@
 	struct mtty_softc *ms_mtty;
 	struct mbpp_softc *ms_mbpp;
 
+	void *ms_sicookie;		/* softintr(9) cookie */
 };
 
 #define MTTY_RBUF_SIZE		(2 * 512)
@@ -210,7 +211,7 @@
 int magma_match __P((struct device *, struct cfdata *, void *));
 void magma_attach __P((struct device *, struct device *, void *));
 int magma_hard __P((void *));
-int magma_soft __P((void *));
+void magma_soft __P((void *));
 
 int mtty_match __P((struct device *, struct cfdata *, void *));
 void mtty_attach __P((struct device *, struct device *, void *));
