Subject: Re: some diffs to 1.0-current / 1.0 (probably as well)
To: None <mw@eunet.ch>
From: Niklas Hallqvist <niklas@appli.se>
List: amiga-dev
Date: 01/03/1995 03:29:46
>>>>> "Markus W" == mw  <mw@eunet.ch> writes:

Markus W> Here's a description of what's in there: - lower generic
Markus W> maximum PSL to spl4(), thus allowing the fast_ser interrupt
Markus W> to get incoming characters without hardly ever being blocked
Markus W> out. I now run a steady 57.6k PPP connection without any
Markus W> errors (no more silo-overflows..).  => this change affects
Markus W> drivers running off spl6, they'll run at spl4 now!  => I've
Markus W> stolen AUD3 interrupts for this purpose, expect troubles if
Markus W> you're using AUD3 interrupts for the intended purpose...  -
Markus W> generalized use of INTF_SOFTINT. Now replaced T_SSIR code.

I liked this a lot so I decided to try it out on my personal system
which by chance contains five INT6 devices (well 2 actually, but one
of them is the GoldenGateII bridge with four COM ports and an ethernet
card connected to it).  Besides these changes I also raised splimp to
spl4 and rebuilt from scratch.  I did this because I have had severe
problems with my ethernet interface running above splimp, and
si_callbacks haven't quite solved my problems.  Anyway, I also have a
Zeus SCSI interface, and this is what breaks.  First I thought some
interrupts got missed so I rewrote _fake_lev6intr to be a loop like
this:

_lev4intr:
_fake_lev6intr:	
	moveml	d0/d2/a0,sp@-		| save scratch regs
	/*
	 * check for fake level 6
	 */
	INTREQRADDR(a0)
	movew	a0@,d0
	btst	#INTB_EXTER,d0
	beq	Lplainintr		| if regular level 4, handle normally

Lcheckintr6:	
#if NZSSC > 0
	jbsr	_siopintr6		| check for siop (53C710) interrupt
	movl	d0,d2
#endif
#if NGGBUS > 0
	jbsr	_ggbusintr6		| check for GoldenGate interrupt
	addl	d0,d2
#endif
#if NCROSS > 0
	jbsr	_crossintr6		| check for CrossLink interrupt
	addl	d0,d2
#endif
	CIABADDR(a0)
	movb	a0@(CIAICR),d0		| read irc register (clears ints!)
	btst	#0,d0			| timerA interrupt?
	jeq     Lskipciab		| no
	lea	sp@(16),a1		| get pointer to PS
	movl	a1,sp@-			| push pointer to PS, PC
	jbsr	_hardclock		| call generic clock int routine
	addql	#4,sp			| pop params
	addql	#1,_intrcnt+28		| add another system clock interrupt
	jra	Lcheckintr6		| check if interrupts still pending
Lskipciab:
	tstl	d2
	jne	Lcheckintr6		| check if interrupts still pending
	INTREQWADDR(a0)
	movew	#INTF_EXTER+INTF_AUD3,a0@ | clear EXTER | AUD3 in intreq
	INTENAWADDR(a0)
	movew	#INTF_SETCLR+INTF_EXTER,a0@ | reenable EXTER interrupts
	moveml	sp@+,d0/d2/a0		| restore scratch regs
	addql	#1,_cnt+V_INTR		| chalk up another interrupt
	jra	rei			| all done

Yeah, I changed Lnotdma to Lplainintr, but that shouldn't matter.  I
also removed the intreq clearing from the devices as I do it in
Lskipciab instead.  I have removed the INTF_AUD? intena resets in
cc.c.  However, this doesn't help.  My zeus refuses to mount the root
with a ENXIO, but all the config stuff went OK, so it has to be the
interrupt system that's messed up.  Michael, have you tried Markus'
changes?  Markus, anyone, ideas? 

BTW, the above code makes statclock (called from hardclock) panic at
times (when siop_debug is enabled), so I must be doing something
wrong.

I'm a bit tired at the moment, so I can't see things as clear as I
want to, maybe tomorrow I'll manage to solve it myself.  But I
thought I'd try to let other people work for me while I'm asleep :-)

Niklas

PS. Michael!  I have a phase mismatch during startup.  Is that
    something you want a report on or should I just not care.  It
    seems to work anyway (unless siop_debug >= 0x10 :-) ).

Niklas Hallqvist	Phone: +46-(0)31-40 75 00
Applitron Datasystem	Fax:   +46-(0)31-83 39 50
Molndalsvagen 95	Email: niklas@appli.se
S-412 63  GOTEBORG	WWW:   Here
Sweden