Catch bus error in sbc_pdma_out() and panic with a reasonable

error message.
This commit is contained in:
scottr 1997-09-06 07:53:14 +00:00
parent 18883bf3fc
commit da80f6c913
1 changed files with 26 additions and 5 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: sbc.c,v 1.30 1997/08/27 11:23:53 bouyer Exp $ */
/* $NetBSD: sbc.c,v 1.31 1997/09/06 07:53:14 scottr Exp $ */
/*
* Copyright (C) 1996 Scott Reynolds. All rights reserved.
@ -98,6 +98,9 @@ struct cfdriver sbc_cd = {
NULL, "sbc", DV_DULL
};
extern label_t *nofault;
extern caddr_t m68k_fault_addr;
static int sbc_wait_busy __P((struct ncr5380_softc *));
static int sbc_ready __P((struct ncr5380_softc *));
static int sbc_wait_dreq __P((struct ncr5380_softc *));
@ -312,9 +315,15 @@ sbc_pdma_out(ncr_sc, phase, datalen, data)
struct sbc_softc *sc = (struct sbc_softc *)ncr_sc;
volatile u_int32_t *long_data = (u_int32_t *)sc->sc_drq_addr;
volatile u_int8_t *byte_data = (u_int8_t *)sc->sc_nodrq_addr;
label_t faultbuf;
int resid, s;
u_int8_t icmd;
#if 1
/* Work around lame gcc initialization bug */
(void)&data;
#endif
if (datalen < ncr_sc->sc_min_dma_len ||
(sc->sc_options & SBC_PDMA) == 0)
return ncr5380_pio_out(ncr_sc, phase, datalen, data);
@ -330,6 +339,19 @@ sbc_pdma_out(ncr_sc, phase, datalen, data)
*ncr_sc->sci_mode |= SCI_MODE_DMA;
*ncr_sc->sci_dma_send = 0;
/*
* Setup for a possible bus error caused by SCSI controller
* switching out of DATA OUT before we're done with the
* current transfer. (See comment before sbc_drq_intr().)
*/
nofault = &faultbuf;
if (setjmp(nofault)) {
printf("buf = 0x%lx, fault = 0x%lx\n",
(u_long)sc->sc_drq_addr, (u_long)m68k_fault_addr);
panic("Unexpected bus error in sbc_pdma_out()");
}
#define W1 *byte_data = *((u_int8_t *)data)++
#define W4 *long_data = *((u_int32_t *)data)++
for (resid = datalen; resid >= 64; resid -= 64) {
@ -405,7 +427,6 @@ void
sbc_drq_intr(p)
void *p;
{
extern int *nofault, m68k_fault_addr;
struct sbc_softc *sc = (struct sbc_softc *)p;
struct ncr5380_softc *ncr_sc = (struct ncr5380_softc *)p;
struct sci_req *sr = ncr_sc->sc_current;
@ -438,10 +459,10 @@ sbc_drq_intr(p)
* switching out of DATA-IN/OUT before we're done with the
* current transfer.
*/
nofault = (int *)&faultbuf;
nofault = &faultbuf;
if (setjmp((label_t *)nofault)) {
nofault = (int *)0;
nofault = (label_t *)0;
if ((dh->dh_flags & SBC_DH_DONE) == 0) {
count = (( (u_long)m68k_fault_addr
- (u_long)sc->sc_drq_addr));
@ -582,7 +603,7 @@ sbc_drq_intr(p)
* OK. No bus error occurred above. Clear the nofault flag
* so we no longer short-circuit bus errors.
*/
nofault = (int *)0;
nofault = (label_t *)0;
#ifdef SBC_DEBUG
if (sbc_debug & (SBC_DB_REG | SBC_DB_INTR))