Subject: Re: Help! -current pas probe (?) dies with "double fault trap"
To: Robert Kennedy <robert@cs.stanford.edu>
From: John F. Woods <jfw@jfwhome.funhouse.com>
List: port-i386
Date: 08/23/1996 20:09:34
> > >Using -current sources from two nights ago, I built a kernel and tried
> > >to boot it. It gets to the point where my 1.1 kernel probes and
> > >recognizes my ProAudio Spectrum sound card, and dies with a message
> > >something like
> > >kernel: double fault trap
> > How do you know that the kernel has recognized your PAS?

He knows that the kernel has recognized the PAS by the double fault trap,
of course.  There is an outstanding PR with this problem AND a fix (though
now a stale fix).

Apply the following patch (which is fresh):

*** pas.c.orig	Mon May 13 07:36:23 1996
--- pas.c	Mon May 27 11:54:08 1996
***************
*** 86,103 ****
   * most basic communications with the sb card.
   */
  struct pas_softc {
! 	struct	device sc_dev;		/* base device */
! 	struct	isadev sc_id;		/* ISA device */
! 	void	*sc_ih;			/* interrupt vectoring */
! 
! 	int	sc_iobase;		/* PAS iobase */
! 	int	sc_irq;			/* PAS irq */
! 	int	sc_drq;			/* PAS drq */
! 
! 	int model;
  	int rev;
  
- 	struct sbdsp_softc sc_sbdsp;
  };
  
  int	pasopen __P((dev_t, int));
--- 86,97 ----
   * most basic communications with the sb card.
   */
  struct pas_softc {
! 	struct sbdsp_softc sc_sbdsp;	/* use sc_dev, sc_id, sc_ih,
! 					 *     sc_iobase, sc_irq, sc_drq
! 					 * from here */
! 	int model;	/* unique to PAS */
  	int rev;
  
  };
  
  int	pasopen __P((dev_t, int));
***************
*** 350,356 ****
          }
  
  	/* Now a SoundBlaster */
! 	sc->sc_iobase = ia->ia_iobase;
  	/* and set the SB iobase into the DSP as well ... */
  	sc->sc_sbdsp.sc_iobase = ia->ia_iobase;
  	if (sbdsp_reset(&sc->sc_sbdsp) < 0) {
--- 344,350 ----
          }
  
  	/* Now a SoundBlaster */
! /*	sc->sc_iobase = ia->ia_iobase;
  	/* and set the SB iobase into the DSP as well ... */
  	sc->sc_sbdsp.sc_iobase = ia->ia_iobase;
  	if (sbdsp_reset(&sc->sc_sbdsp) < 0) {
***************
*** 437,444 ****
  	register int iobase = ia->ia_iobase;
  	int err;
  	
! 	sc->sc_iobase = iobase;
! 	sc->sc_ih = isa_intr_establish(ia->ia_ic, ia->ia_irq, IST_EDGE,
  	    IPL_AUDIO, sbdsp_intr, &sc->sc_sbdsp);
  
  	printf(" ProAudio Spectrum %s [rev %d] ", pasnames[sc->model], sc->rev);
--- 431,438 ----
  	register int iobase = ia->ia_iobase;
  	int err;
  	
! 	sc->sc_sbdsp.sc_iobase = iobase;
! 	sc->sc_sbdsp.sc_ih = isa_intr_establish(ia->ia_ic, ia->ia_irq, IST_EDGE,
  	    IPL_AUDIO, sbdsp_intr, &sc->sc_sbdsp);
  
  	printf(" ProAudio Spectrum %s [rev %d] ", pasnames[sc->model], sc->rev);