Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 28 Nov 1995 08:56:16 +0000 ()
From:      Michael Smith <msmith@atrad.adelaide.edu.au>
To:        jgreco@brasil.moneng.mei.com (Joe Greco)
Cc:        rich@spirit.com.au, hsu@clinet.fi, msmith@atrad.adelaide.edu.au, freebsd-hackers@freefall.freebsd.org
Subject:   Re: 16 ports Boca - anyone using it?
Message-ID:  <199511280856.IAA07993@genesis.atrad.adelaide.edu.au>
In-Reply-To: <199511270623.AAA10644@brasil.moneng.mei.com> from "Joe Greco" at Nov 27, 95 00:23:17 am

next in thread | previous in thread | raw e-mail | index | archive | help
Joe Greco stands accused of saying:
> 
> Um.  "Fascinating", I say.  I didn't have any diagnostic tools handy so I
> rebooted the box and wrote a little program that would page me if the board
> died again.  The next day I went and hooked up my trusty logic probe, and
> the wait began.  :-)  A week later (last nite, actually!), I got a page,
> and fortunately somebody was at the office to observe the logic probe.  
> The interrupt line is being held ACTIVE....???!!!  (solid red on the probe,
> normally green).

Yecch.

> Do any sio-shared-interrupt-geniuses have any ideas?  I can picture all
> sorts of plausible race conditions and I have no idea what the code is
> doing.

ISA interrupts are edge-triggered, so something happened to lose you one. 
As far as I can tell, siopoll() doesn't check for pending interrupts on
ports as it cycles around (I can imagine a possible race if it did...)

You could possibly add some code to siopoll() to check the interrupt status
of open ports, and spew a console printf if it found a port with pending
interrupt status.  Something like :

                if (incc <= 0 || !(tp->t_state & TS_ISOPEN))
                        continue;

+		disable_intr();
+		iir = inb(com->int_id_port) & 0x07;
+		enable_intr();
+		if (iir)
+			printf("sio%d: interrupt pending (%d) in poll\n",
+				com->unit,iir);

                /*
                 * Avoid the grotesquely inefficient lineswitch routine
                 * (ttyinput) in "raw" mode.  It usually takes about 450


(Bruce is probably laughing himself silly over some obvious mistake I'm
 making here, but that's what I'd start with).

If this "works" (it may fill your log partition pretty quickly 8), then
we could find a way to call siointr to handle the missed interrupt.

> Joe Greco - Systems Administrator			      jgreco@ns.sol.net

-- 
]] Mike Smith, Software Engineer        msmith@atrad.adelaide.edu.au    [[
]] Genesis Software                     genesis@atrad.adelaide.edu.au   [[
]] High-speed data acquisition and      (GSM mobile) 041-122-496        [[
]] realtime instrument control          (ph/fax)  +61-8-267-3039        [[
]] "Who does BSD?" "We do Chucky, we do."                               [[



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199511280856.IAA07993>