Subject: Re: TC bba audio problem on DEC3000/300
To: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp>
From: Gregory McGarry <g.mcgarry@ieee.org>
List: port-alpha
Date: 07/18/2000 07:42:35
Izumi Tsutsui wrote:
> Unfortunately, the new kernel does not work properly.
> It still only plays short sound and hangs.
> I tried both 1.5B and 1.5_ALPHA with some modifications,
> but got the same result.
>
> It seems that DMA transfer set up in bba_trigger_output()
> is working fine but there are something wrong in bba_intr().
> I put some printf() to bba_intr(), then bba_intr() is being
> called eternally after the short sound.
The correct fix goes something like the patch below (untested).
This is consistent with other ioasic handlers
(cf sys/arch/pmax/pmax/dec_maxine.c). Particularly important
is the handling of DMA overruns.
Index: ioasic.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/alpha/tc/ioasic.c,v
retrieving revision 1.32
diff -c -r1.32 ioasic.c
*** ioasic.c 2000/06/05 21:47:30 1.32
--- ioasic.c 2000/07/17 21:34:36
***************
*** 307,312 ****
--- 307,313 ----
register int ifound;
int gifound;
u_int32_t sir;
+ u_int32_t xxintr;
gifound = 0;
do {
***************
*** 329,334 ****
--- 330,345 ----
CHECKINTR(IOASIC_DEV_SCC1, IOASIC_INTR_SCC_1);
CHECKINTR(IOASIC_DEV_LANCE, IOASIC_INTR_LANCE);
CHECKINTR(IOASIC_DEV_ISDN, IOASIC_INTR_ISDN_TXLOAD | IOASIC_INTR_ISDN_RXLOAD);
+
+ #define PTRLOAD (IOASIC_INTR_ISDN_TXLOAD | IOASIC_INTR_ISDN_RXLOAD)
+ #define ERRORS (IOASIC_INTR_ISDN_OVRUN)
+
+ xxxintr = sir & (ERRORS | PTRLOAD);
+ if (xxxintr) {
+ ifound = 1;
+ *(u_int32_t *)(ioasic_base + IOASIC_INTR)
+ = sir &~ xxxintr;
+ }
gifound |= ifound;
} while (ifound);
-- Gregory McGarry <g.mcgarry@ieee.org>