summaryrefslogtreecommitdiff
path: root/2003/i/buzz/src/kernel/pbus.c
diff options
context:
space:
mode:
Diffstat (limited to '2003/i/buzz/src/kernel/pbus.c')
-rw-r--r--2003/i/buzz/src/kernel/pbus.c44
1 files changed, 28 insertions, 16 deletions
diff --git a/2003/i/buzz/src/kernel/pbus.c b/2003/i/buzz/src/kernel/pbus.c
index 7d28fff..6f65538 100644
--- a/2003/i/buzz/src/kernel/pbus.c
+++ b/2003/i/buzz/src/kernel/pbus.c
@@ -219,8 +219,16 @@ pbusread(dev, uio, flags)
remain-=resid;
if (!remain)
{
+ int s=splhigh();
sc->buf_consumed=0;
sc->buf_ok=0;
+ if (!sc->in_dma)
+ {
+ BUFSYNC_PRE;
+ PBUS_WRITE_4(0x4,sc->sc_bonitodma);
+ sc->in_dma=1;
+ }
+ splx(s);
}
return 0;
}
@@ -241,25 +249,18 @@ int pbus_intr(void *p)
if (status&0x20000000)
{
/* Désactive les interuptions. */
- PBUS_WRITE_4(8,PBUS_READ_4(8)&0x3FFF);
+ PBUS_WRITE_4(8,PBUS_READ_4(8)&0x3FFF);
sc->pbusinten=0;
/* Envoie le signal à l'application. */
if (sc->cproc!=NULL) psignal(sc->cproc,sc->csignal);
}
- else
+ if (status&0x40000000)
{
- if (status&0x40000000)
- {
- /* Frame Ok */
- BUFSYNC_POST;
- sc->buf_ok=1;
- sc->in_dma=0;
- }
- else
- {
- /* Pointer slot avail */
- }
- }
+ /* Frame Ok */
+ BUFSYNC_POST;
+ sc->buf_ok=1;
+ sc->in_dma=0;
+ }
return 0;
}
@@ -301,24 +302,35 @@ pbusioctl(dev, cmd, addr, flag, proc)
case PBUS_INTDISABLE:
sc->pbusinten=0;
PBUS_WRITE_4(8,0|PBUS_RnW|sc->pbusinten);
- break;
+ break;
case PBUS_INTENABLE:
sc->pbusinten=PBUS_INTEN;
PBUS_WRITE_4(8,0|PBUS_RnW|sc->pbusinten);
break;
case PBUS_INTREAD:
parm->ints=(PBUS_READ_4(8)>>16)&0x1F;
- break;
+ break;
}
}
if (minor(dev)==0) /* CAM */
{
+ int s;
switch (cmd)
{
case CAM_SETFRAMESIZE:
+ s=splhigh();
PBUS_WRITE_4(0x0,1);
sc->framesize=*fsize;
+ sc->buf_consumed=0;
+ sc->buf_ok=0;
+ if (!sc->in_dma)
+ {
+ BUFSYNC_PRE;
+ PBUS_WRITE_4(0x4,sc->sc_bonitodma);
+ sc->in_dma=1;
+ }
+ splx(s);
break;
}
}