version 1.11, 1994/06/13 08:13:06 |
version 1.12, 1994/06/14 00:59:10 |
Line 538 siop_delay(delay) |
|
Line 538 siop_delay(delay) |
|
} |
} |
|
|
void |
void |
|
siopinitialize(dev) |
|
struct siop_softc *dev; |
|
{ |
|
/* |
|
* check that scripts is on a long word boundary |
|
* and that DS is on a long word boundary |
|
*/ |
|
dev->sc_scriptspa = kvtop(scripts); |
|
dev->sc_dspa = kvtop(&dev->sc_ds); |
|
dev->sc_lunpa = kvtop(&dev->sc_lun); |
|
dev->sc_statuspa = kvtop(&dev->sc_stat[0]); |
|
dev->sc_msgpa = kvtop(&dev->sc_msg[0]); |
|
siopreset (dev); |
|
} |
|
|
|
void |
siopreset(dev) |
siopreset(dev) |
struct siop_softc *dev; |
struct siop_softc *dev; |
{ |
{ |
Line 619 siop_setup (dev, target, cbuf, clen, buf |
|
Line 635 siop_setup (dev, target, cbuf, clen, buf |
|
dev->sc_msg[0] = -1; |
dev->sc_msg[0] = -1; |
dev->sc_ds.scsi_addr = (0x10000 << target) | (dev->sc_sync[target].period << 8); |
dev->sc_ds.scsi_addr = (0x10000 << target) | (dev->sc_sync[target].period << 8); |
dev->sc_ds.idlen = 1; |
dev->sc_ds.idlen = 1; |
dev->sc_ds.idbuf = (char *) kvtop(&dev->sc_lun); |
dev->sc_ds.idbuf = (char *) dev->sc_lunpa; |
dev->sc_ds.cmdlen = clen; |
dev->sc_ds.cmdlen = clen; |
dev->sc_ds.cmdbuf = (char *) kvtop(cbuf); |
dev->sc_ds.cmdbuf = (char *) kvtop(cbuf); |
dev->sc_ds.stslen = 1; |
dev->sc_ds.stslen = 1; |
dev->sc_ds.stsbuf = (char *) kvtop(&dev->sc_stat[0]); |
dev->sc_ds.stsbuf = (char *) dev->sc_statuspa; |
dev->sc_ds.msglen = 1; |
dev->sc_ds.msglen = 1; |
dev->sc_ds.msgbuf = (char *) kvtop(&dev->sc_msg[0]); |
dev->sc_ds.msgbuf = (char *) dev->sc_msgpa; |
dev->sc_ds.sdtrolen = 0; |
dev->sc_ds.sdtrolen = 0; |
dev->sc_ds.sdtrilen = 0; |
dev->sc_ds.sdtrilen = 0; |
dev->sc_ds.chain[0].datalen = len; |
dev->sc_ds.chain[0].datalen = len; |
Line 706 siop_setup (dev, target, cbuf, clen, buf |
|
Line 722 siop_setup (dev, target, cbuf, clen, buf |
|
regs->siop_scratch = regs->siop_scratch | 0x100; |
regs->siop_scratch = regs->siop_scratch | 0x100; |
else |
else |
regs->siop_scratch = regs->siop_scratch & ~0xff00; |
regs->siop_scratch = regs->siop_scratch & ~0xff00; |
regs->siop_dsa = (long) kvtop(&dev->sc_ds); |
regs->siop_dsa = dev->sc_dspa; |
#if 1 |
#if 0 |
DCIS(); /* push data cache */ |
DCIS(); /* push data cache */ |
|
#else |
|
dma_cachectl (dev, sizeof (struct siop_softc)); |
|
dma_cachectl (cbuf, clen); |
|
if (buf != NULL && len != 0) |
|
dma_cachectl (buf, len); |
#endif |
#endif |
regs->siop_dsp = (long) kvtop(scripts); |
regs->siop_dsp = dev->sc_scriptspa; |
} |
} |
|
|
/* |
/* |
Line 734 siop_checkintr(dev, istat, dstat, sstat0 |
|
Line 755 siop_checkintr(dev, istat, dstat, sstat0 |
|
regs->siop_ctest8 &= ~0x04; |
regs->siop_ctest8 &= ~0x04; |
#ifdef DEBUG |
#ifdef DEBUG |
if (siop_debug & 1) { |
if (siop_debug & 1) { |
DCIAS(kvtop(&dev->sc_stat)); /* XXX */ |
DCIAS(dev->sc_statuspa); /* XXX */ |
printf ("siopchkintr: istat %x dstat %x sstat0 %x dsps %x sbcl %x sts %x msg %x\n", |
printf ("siopchkintr: istat %x dstat %x sstat0 %x dsps %x sbcl %x sts %x msg %x\n", |
istat, dstat, sstat0, regs->siop_dsps, regs->siop_sbcl, dev->sc_stat[0], dev->sc_msg[0]); |
istat, dstat, sstat0, regs->siop_dsps, regs->siop_sbcl, dev->sc_stat[0], dev->sc_msg[0]); |
} |
} |
Line 742 siop_checkintr(dev, istat, dstat, sstat0 |
|
Line 763 siop_checkintr(dev, istat, dstat, sstat0 |
|
if (dstat & SIOP_DSTAT_SIR && (regs->siop_dsps == 0xff00 || |
if (dstat & SIOP_DSTAT_SIR && (regs->siop_dsps == 0xff00 || |
regs->siop_dsps == 0xfffc)) { |
regs->siop_dsps == 0xfffc)) { |
/* Normal completion status, or check condition */ |
/* Normal completion status, or check condition */ |
if (regs->siop_dsa != (long) kvtop(&dev->sc_ds)) { |
if (regs->siop_dsa != dev->sc_dspa) { |
printf ("siop: invalid dsa: %x %x\n", regs->siop_dsa, |
printf ("siop: invalid dsa: %x %x\n", regs->siop_dsa, |
kvtop(&dev->sc_ds)); |
dev->sc_dspa); |
panic("*** siop DSA invalid ***"); |
panic("*** siop DSA invalid ***"); |
} |
} |
target = dev->sc_slave; |
target = dev->sc_slave; |
Line 788 siop_checkintr(dev, istat, dstat, sstat0 |
|
Line 809 siop_checkintr(dev, istat, dstat, sstat0 |
|
scsi_period_to_siop (dev, target); |
scsi_period_to_siop (dev, target); |
} |
} |
} |
} |
#if 1 |
#if 0 |
DCIAS(kvtop(&dev->sc_stat)); /* XXX */ |
DCIAS(kvtop(&dev->sc_stat)); /* XXX */ |
|
#else |
|
dma_cachectl(&dev->sc_stat[0], 1); /* XXXX correct ?*/ |
#endif |
#endif |
*status = dev->sc_stat[0]; |
*status = dev->sc_stat[0]; |
return 1; |
return 1; |
Line 798 siop_checkintr(dev, istat, dstat, sstat0 |
|
Line 821 siop_checkintr(dev, istat, dstat, sstat0 |
|
#ifdef DEBUG |
#ifdef DEBUG |
if (siop_debug & 9) |
if (siop_debug & 9) |
printf ("Phase mismatch: %x dsp +%x\n", regs->siop_sbcl, |
printf ("Phase mismatch: %x dsp +%x\n", regs->siop_sbcl, |
regs->siop_dsp - kvtop(scripts)); |
regs->siop_dsp - dev->sc_scriptspa); |
if (siop_debug & 0x10) |
if (siop_debug & 0x10) |
panic ("53c710 phase mismatch"); |
panic ("53c710 phase mismatch"); |
#endif |
#endif |
Line 814 siop_checkintr(dev, istat, dstat, sstat0 |
|
Line 837 siop_checkintr(dev, istat, dstat, sstat0 |
|
* for message in, check for possible reject for sync request |
* for message in, check for possible reject for sync request |
*/ |
*/ |
case 0: |
case 0: |
regs->siop_dsp = kvtop(scripts) + Ent_dataout; |
regs->siop_dsp = dev->sc_scriptspa + Ent_dataout; |
break; |
break; |
case 1: |
case 1: |
regs->siop_dsp = kvtop(scripts) + Ent_datain; |
regs->siop_dsp = dev->sc_scriptspa + Ent_datain; |
break; |
break; |
case 2: |
case 2: |
regs->siop_dsp = kvtop(scripts) + Ent_cmd; |
regs->siop_dsp = dev->sc_scriptspa + Ent_cmd; |
break; |
break; |
case 3: |
case 3: |
regs->siop_dsp = kvtop(scripts) + Ent_status; |
regs->siop_dsp = dev->sc_scriptspa + Ent_status; |
break; |
break; |
case 6: |
case 6: |
regs->siop_dsp = kvtop(scripts) + Ent_msgout; |
regs->siop_dsp = dev->sc_scriptspa + Ent_msgout; |
break; |
break; |
case 7: |
case 7: |
regs->siop_dsp = kvtop(scripts) + Ent_msgin; |
regs->siop_dsp = dev->sc_scriptspa + Ent_msgin; |
break; |
break; |
default: |
default: |
goto bad_phase; |
goto bad_phase; |
Line 853 siop_checkintr(dev, istat, dstat, sstat0 |
|
Line 876 siop_checkintr(dev, istat, dstat, sstat0 |
|
printf ("DMA chaining completed: dsa %x dnad %x addr %x\n", |
printf ("DMA chaining completed: dsa %x dnad %x addr %x\n", |
regs->siop_dsa, regs->siop_dnad, regs->siop_addr); |
regs->siop_dsa, regs->siop_dnad, regs->siop_addr); |
#endif |
#endif |
regs->siop_dsa = kvtop (&dev->sc_ds); |
regs->siop_dsa = dev->sc_dspa; |
regs->siop_dsp = kvtop (scripts) + Ent_status; |
regs->siop_dsp = dev->sc_scriptspa + Ent_status; |
return 0; |
return 0; |
} |
} |
target = dev->sc_slave; |
target = dev->sc_slave; |
Line 871 siop_checkintr(dev, istat, dstat, sstat0 |
|
Line 894 siop_checkintr(dev, istat, dstat, sstat0 |
|
#endif |
#endif |
siop_inhibit_sync[target] = -1; |
siop_inhibit_sync[target] = -1; |
if ((regs->siop_sbcl & 7) == 6) { |
if ((regs->siop_sbcl & 7) == 6) { |
regs->siop_dsp = kvtop(scripts) + Ent_msgout; |
regs->siop_dsp = dev->sc_scriptspa + Ent_msgout; |
return (0); |
return (0); |
} |
} |
} |
} |
Line 898 siop_checkintr(dev, istat, dstat, sstat0 |
|
Line 921 siop_checkintr(dev, istat, dstat, sstat0 |
|
return 1; |
return 1; |
} |
} |
if (sstat0 == 0 && dstat & SIOP_DSTAT_SIR) { |
if (sstat0 == 0 && dstat & SIOP_DSTAT_SIR) { |
DCIAS(kvtop(&dev->sc_stat)); |
#if 0 |
|
DCIAS(dev->sc_statuspa); |
|
#else |
|
dma_cachectl (&dev->sc_stat[0], 1); |
|
#endif |
printf ("SIOP interrupt: %x sts %x msg %x sbcl %x\n", |
printf ("SIOP interrupt: %x sts %x msg %x sbcl %x\n", |
regs->siop_dsps, dev->sc_stat[0], dev->sc_msg[0], |
regs->siop_dsps, dev->sc_stat[0], dev->sc_msg[0], |
regs->siop_sbcl); |
regs->siop_sbcl); |
|
|
* then panics |
* then panics |
*/ |
*/ |
printf ("siopchkintr: target %x ds %x\n", target, &dev->sc_ds); |
printf ("siopchkintr: target %x ds %x\n", target, &dev->sc_ds); |
printf ("scripts %x ds %x regs %x dsp %x dcmd %x\n", kvtop(scripts), |
printf ("scripts %x ds %x regs %x dsp %x dcmd %x\n", dev->sc_scriptspa, |
kvtop(&dev->sc_ds), kvtop(regs), regs->siop_dsp, *((long *)®s->siop_dcmd)); |
dev->sc_dspa, kvtop(regs), regs->siop_dsp, *((long *)®s->siop_dcmd)); |
printf ("siopchkintr: istat %x dstat %x sstat0 %x dsps %x dsa %x sbcl %x sts %x msg %x\n", |
printf ("siopchkintr: istat %x dstat %x sstat0 %x dsps %x dsa %x sbcl %x sts %x msg %x\n", |
istat, dstat, sstat0, regs->siop_dsps, regs->siop_dsa, regs->siop_sbcl, |
istat, dstat, sstat0, regs->siop_dsps, regs->siop_dsa, regs->siop_sbcl, |
dev->sc_stat[0], dev->sc_msg[0]); |
dev->sc_stat[0], dev->sc_msg[0]); |
Line 975 siopicmd(dev, target, cbuf, clen, buf, l |
|
Line 1002 siopicmd(dev, target, cbuf, clen, buf, l |
|
if (--i <= 0) { |
if (--i <= 0) { |
printf ("waiting: tgt %d cmd %02x sbcl %02x dsp %x (+%x) dcmd %x ds %x\n", |
printf ("waiting: tgt %d cmd %02x sbcl %02x dsp %x (+%x) dcmd %x ds %x\n", |
target, *((char *)cbuf), |
target, *((char *)cbuf), |
|
regs->siop_dsp - dev->sc_scriptspa, |
regs->siop_sbcl, regs->siop_dsp, |
regs->siop_sbcl, regs->siop_dsp, |
regs->siop_dsp - kvtop(scripts), |
regs->siop_dsp - kvtop(scripts), |
*((long *)®s->siop_dcmd), &dev->sc_ds); |
*((long *)®s->siop_dcmd), &dev->sc_ds); |
Line 987 siopicmd(dev, target, cbuf, clen, buf, l |
|
Line 1015 siopicmd(dev, target, cbuf, clen, buf, l |
|
sstat0 = regs->siop_sstat0; |
sstat0 = regs->siop_sstat0; |
#ifdef DEBUG |
#ifdef DEBUG |
if (siop_debug & 1) { |
if (siop_debug & 1) { |
DCIAS(kvtop(&dev->sc_stat)); /* XXX should just invalidate dev->sc_stat */ |
DCIAS(dev->sc_statuspa); /* XXX should just invalidate dev->sc_stat */ |
printf ("siopicmd: istat %x dstat %x sstat0 %x dsps %x sbcl %x sts %x msg %x\n", |
printf ("siopicmd: istat %x dstat %x sstat0 %x dsps %x sbcl %x sts %x msg %x\n", |
istat, dstat, sstat0, regs->siop_dsps, regs->siop_sbcl, |
istat, dstat, sstat0, regs->siop_dsps, regs->siop_sbcl, |
dev->sc_stat[0], dev->sc_msg[0]); |
dev->sc_stat[0], dev->sc_msg[0]); |
|
|
|
|
#ifdef DEBUG |
#ifdef DEBUG |
if (siop_debug & 5) { |
if (siop_debug & 5) { |
DCIAS(kvtop(&dev->sc_stat)); |
DCIAS(dev->sc_statuspa); |
printf ("siopintr%d: istat %x dstat %x sstat0 %x dsps %x sbcl %x sts %x msg %x\n", |
printf ("siopintr%d: istat %x dstat %x sstat0 %x dsps %x sbcl %x sts %x msg %x\n", |
unit, istat, dstat, sstat0, regs->siop_dsps, |
unit, istat, dstat, sstat0, regs->siop_dsps, |
regs->siop_sbcl, dev->sc_stat[0], dev->sc_msg[0]); |
regs->siop_sbcl, dev->sc_stat[0], dev->sc_msg[0]); |