Improve reliability on my Q700, at least. Was getting the occasional
glitch--an extra byte on occasion.
This commit is contained in:
parent
42b8d1922d
commit
7685e9d70b
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: esp.c,v 1.2 1996/10/30 05:39:21 briggs Exp $ */
|
||||
/* $NetBSD: esp.c,v 1.3 1996/11/02 06:52:25 briggs Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1996 Charles M. Hannum. All rights reserved.
|
||||
|
@ -104,6 +104,7 @@
|
|||
struct dma_softc {
|
||||
struct esp_softc *sc_esp;
|
||||
int sc_active;
|
||||
int sc_tc;
|
||||
int sc_datain;
|
||||
size_t sc_dmasize;
|
||||
size_t sc_dmatrans;
|
||||
|
@ -124,49 +125,49 @@ static __inline__ void
|
|||
dma_intr(sc)
|
||||
struct dma_softc *sc;
|
||||
{
|
||||
u_char *p;
|
||||
register u_char *p;
|
||||
register int cnt;
|
||||
|
||||
if (sc->sc_active == 0) {
|
||||
printf("dma_intr--inactive\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if ((sc->sc_esp->sc_espintr & ESPINTR_BS) == 0) {
|
||||
sc->sc_active = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
p = *sc->sc_dmaaddr;
|
||||
cnt = *sc->sc_pdmalen;
|
||||
if (sc->sc_datain) {
|
||||
if (ESP_READ_REG(sc->sc_esp, ESP_FFLAG) & ESPFIFO_FF) {
|
||||
if (cnt) {
|
||||
*p++ = ESP_READ_REG(sc->sc_esp, ESP_FIFO);
|
||||
(*sc->sc_pdmalen)--;
|
||||
*sc->sc_dmaaddr = p;
|
||||
--(*sc->sc_pdmalen);
|
||||
} else {
|
||||
printf("DMA, Data in, no data, pdmalen is %d\n",
|
||||
*sc->sc_pdmalen);
|
||||
}
|
||||
*sc->sc_dmaaddr = p;
|
||||
if (sc->sc_esp->sc_phase != DATA_IN_PHASE) {
|
||||
if (*sc->sc_pdmalen == 0) {
|
||||
/*
|
||||
* Fake terminal count since this isn't
|
||||
* a real DMA transaction and the chip
|
||||
* will therefore not trip TC itself.
|
||||
*/
|
||||
sc->sc_esp->sc_espstat |= ESPSTAT_TC;
|
||||
}
|
||||
sc->sc_active = 0;
|
||||
return;
|
||||
printf("data in, but no count!\n");
|
||||
}
|
||||
}
|
||||
if (sc->sc_esp->sc_phase == DATA_IN_PHASE) {
|
||||
ESPCMD(sc->sc_esp, ESPCMD_TRANS);
|
||||
} else if (sc->sc_esp->sc_phase == DATA_OUT_PHASE) {
|
||||
p++;
|
||||
ESP_WRITE_REG(sc->sc_esp, ESP_FIFO, *p);
|
||||
*sc->sc_dmaaddr = p;
|
||||
(*sc->sc_pdmalen)--;
|
||||
} else if ( (sc->sc_esp->sc_phase == DATA_OUT_PHASE)
|
||||
|| (sc->sc_esp->sc_phase == MESSAGE_OUT_PHASE)) {
|
||||
if (cnt) {
|
||||
ESP_WRITE_REG(sc->sc_esp, ESP_FIFO, *p++);
|
||||
*sc->sc_dmaaddr = p;
|
||||
--(*sc->sc_pdmalen);
|
||||
} else {
|
||||
printf("data out, but no count!\n");
|
||||
}
|
||||
ESPCMD(sc->sc_esp, ESPCMD_TRANS);
|
||||
} else {
|
||||
if ( (sc->sc_esp->sc_prevphase == DATA_OUT_PHASE)
|
||||
&& (*sc->sc_pdmalen == 0)) {
|
||||
sc->sc_esp->sc_espstat |= ESPSTAT_TC;
|
||||
}
|
||||
sc->sc_active = 0;
|
||||
}
|
||||
if (*sc->sc_pdmalen == 0) {
|
||||
sc->sc_tc = ESPSTAT_TC;
|
||||
}
|
||||
sc->sc_esp->sc_espstat |= sc->sc_tc;
|
||||
}
|
||||
#else
|
||||
#include <dev/tc/tcvar.h>
|
||||
|
@ -323,7 +324,7 @@ espattach(parent, self, aux)
|
|||
} else {
|
||||
sc->sc_reg = (volatile u_char *) SCSIBase + 0x400;
|
||||
mac68k_register_scsi_b_irq((void (*)(void *)) espintr, sc);
|
||||
sc->irq_mask = V2IF_SCSIDRQ; /* V2IF_T1? If so, fix ^^, too */
|
||||
sc->irq_mask = V2IF_T1;
|
||||
sc->sc_freq = 25000000;
|
||||
}
|
||||
sc->sc_dma = &sc->_sc_dma;
|
||||
|
@ -437,7 +438,7 @@ espattach(parent, self, aux)
|
|||
#else
|
||||
#ifdef MAC68K_DRIVER
|
||||
sc->sc_cfg2 = ESPCFG2_SCSI2;
|
||||
sc->sc_cfg3 = 0x4;
|
||||
sc->sc_cfg3 = 0;
|
||||
printf(": NCR53C96");
|
||||
sc->sc_rev = NCR53C96;
|
||||
#else
|
||||
|
@ -1106,7 +1107,7 @@ esp_done(sc, ecb)
|
|||
|
||||
xs->flags |= ITSDONE;
|
||||
|
||||
#ifdef ESP_DEBUG
|
||||
#if ESP_DEBUG > 0
|
||||
if (esp_debug & ESP_SHOWMISC) {
|
||||
if (xs->resid != 0)
|
||||
printf("resid=%d ", xs->resid);
|
||||
|
@ -1583,6 +1584,7 @@ esp_msgout(sc)
|
|||
/* (re)send the message */
|
||||
size = min(sc->sc_omlen, sc->sc_maxxfer);
|
||||
DMA_SETUP(sc->sc_dma, &sc->sc_omp, &sc->sc_omlen, 0, &size);
|
||||
#ifndef MAC68K_DRIVER
|
||||
/* Program the SCSI counter */
|
||||
ESP_WRITE_REG(sc, ESP_TCL, size);
|
||||
ESP_WRITE_REG(sc, ESP_TCM, size >> 8);
|
||||
|
@ -1591,6 +1593,7 @@ esp_msgout(sc)
|
|||
}
|
||||
/* load the count in */
|
||||
ESPCMD(sc, ESPCMD_NOP|ESPCMD_DMA);
|
||||
#endif
|
||||
ESPCMD(sc, ESPCMD_TRANS|ESPCMD_DMA);
|
||||
DMA_GO(sc->sc_dma);
|
||||
#else
|
||||
|
@ -2142,6 +2145,9 @@ if (sc->sc_flags & ESP_ICCS) printf("[[esp: BUMMER]]");
|
|||
1, &size);
|
||||
sc->sc_prevphase = DATA_IN_PHASE;
|
||||
setup_xfer:
|
||||
#ifdef MAC68K_DRIVER
|
||||
if (!size) {
|
||||
#endif
|
||||
/* Program the SCSI counter */
|
||||
ESP_WRITE_REG(sc, ESP_TCL, size);
|
||||
ESP_WRITE_REG(sc, ESP_TCM, size >> 8);
|
||||
|
@ -2150,6 +2156,9 @@ if (sc->sc_flags & ESP_ICCS) printf("[[esp: BUMMER]]");
|
|||
}
|
||||
/* load the count in */
|
||||
ESPCMD(sc, ESPCMD_NOP|ESPCMD_DMA);
|
||||
#ifdef MAC68K_DRIVER
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Note that if `size' is 0, we've already transceived
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: espvar.h,v 1.1 1996/10/29 06:09:00 briggs Exp $ */
|
||||
/* $NetBSD: espvar.h,v 1.2 1996/11/02 06:52:24 briggs Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1994 Peter Galbavy. All rights reserved.
|
||||
|
@ -354,7 +354,8 @@ ESP_READ_REG(sc, reg)
|
|||
|
||||
/* DMA macros for ESP */
|
||||
#define DMA_ISINTR(sc) (ESP_READ_REG((sc)->sc_esp, ESP_STAT) & 0x80)
|
||||
#define DMA_RESET(sc) do { (sc)->sc_active = 0; } while(0)
|
||||
#define DMA_RESET(sc) do { (sc)->sc_active = 0; \
|
||||
(sc)->sc_tc = 0;} while(0)
|
||||
#define DMA_INTR(sc) dma_intr(sc)
|
||||
#define DMA_SETUP(sc, paddr, plen, datain, pdmasize) \
|
||||
do { \
|
||||
|
@ -362,6 +363,7 @@ ESP_READ_REG(sc, reg)
|
|||
(sc)->sc_pdmalen = plen; \
|
||||
(sc)->sc_datain = datain; \
|
||||
(sc)->sc_dmasize = *pdmasize; \
|
||||
(sc)->sc_tc = 0; \
|
||||
} while (0)
|
||||
|
||||
#define DMA_GO(sc) \
|
||||
|
@ -370,6 +372,7 @@ ESP_READ_REG(sc, reg)
|
|||
ESP_WRITE_REG((sc)->sc_esp, \
|
||||
ESP_FIFO, **(sc)->sc_dmaaddr); \
|
||||
(*(sc)->sc_pdmalen)--; \
|
||||
(*(sc)->sc_dmaaddr)++; \
|
||||
} \
|
||||
(sc)->sc_active = 1; \
|
||||
} while (0)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: esp.c,v 1.2 1996/10/30 05:39:21 briggs Exp $ */
|
||||
/* $NetBSD: esp.c,v 1.3 1996/11/02 06:52:25 briggs Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1996 Charles M. Hannum. All rights reserved.
|
||||
|
@ -104,6 +104,7 @@
|
|||
struct dma_softc {
|
||||
struct esp_softc *sc_esp;
|
||||
int sc_active;
|
||||
int sc_tc;
|
||||
int sc_datain;
|
||||
size_t sc_dmasize;
|
||||
size_t sc_dmatrans;
|
||||
|
@ -124,49 +125,49 @@ static __inline__ void
|
|||
dma_intr(sc)
|
||||
struct dma_softc *sc;
|
||||
{
|
||||
u_char *p;
|
||||
register u_char *p;
|
||||
register int cnt;
|
||||
|
||||
if (sc->sc_active == 0) {
|
||||
printf("dma_intr--inactive\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if ((sc->sc_esp->sc_espintr & ESPINTR_BS) == 0) {
|
||||
sc->sc_active = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
p = *sc->sc_dmaaddr;
|
||||
cnt = *sc->sc_pdmalen;
|
||||
if (sc->sc_datain) {
|
||||
if (ESP_READ_REG(sc->sc_esp, ESP_FFLAG) & ESPFIFO_FF) {
|
||||
if (cnt) {
|
||||
*p++ = ESP_READ_REG(sc->sc_esp, ESP_FIFO);
|
||||
(*sc->sc_pdmalen)--;
|
||||
*sc->sc_dmaaddr = p;
|
||||
--(*sc->sc_pdmalen);
|
||||
} else {
|
||||
printf("DMA, Data in, no data, pdmalen is %d\n",
|
||||
*sc->sc_pdmalen);
|
||||
}
|
||||
*sc->sc_dmaaddr = p;
|
||||
if (sc->sc_esp->sc_phase != DATA_IN_PHASE) {
|
||||
if (*sc->sc_pdmalen == 0) {
|
||||
/*
|
||||
* Fake terminal count since this isn't
|
||||
* a real DMA transaction and the chip
|
||||
* will therefore not trip TC itself.
|
||||
*/
|
||||
sc->sc_esp->sc_espstat |= ESPSTAT_TC;
|
||||
}
|
||||
sc->sc_active = 0;
|
||||
return;
|
||||
printf("data in, but no count!\n");
|
||||
}
|
||||
}
|
||||
if (sc->sc_esp->sc_phase == DATA_IN_PHASE) {
|
||||
ESPCMD(sc->sc_esp, ESPCMD_TRANS);
|
||||
} else if (sc->sc_esp->sc_phase == DATA_OUT_PHASE) {
|
||||
p++;
|
||||
ESP_WRITE_REG(sc->sc_esp, ESP_FIFO, *p);
|
||||
*sc->sc_dmaaddr = p;
|
||||
(*sc->sc_pdmalen)--;
|
||||
} else if ( (sc->sc_esp->sc_phase == DATA_OUT_PHASE)
|
||||
|| (sc->sc_esp->sc_phase == MESSAGE_OUT_PHASE)) {
|
||||
if (cnt) {
|
||||
ESP_WRITE_REG(sc->sc_esp, ESP_FIFO, *p++);
|
||||
*sc->sc_dmaaddr = p;
|
||||
--(*sc->sc_pdmalen);
|
||||
} else {
|
||||
printf("data out, but no count!\n");
|
||||
}
|
||||
ESPCMD(sc->sc_esp, ESPCMD_TRANS);
|
||||
} else {
|
||||
if ( (sc->sc_esp->sc_prevphase == DATA_OUT_PHASE)
|
||||
&& (*sc->sc_pdmalen == 0)) {
|
||||
sc->sc_esp->sc_espstat |= ESPSTAT_TC;
|
||||
}
|
||||
sc->sc_active = 0;
|
||||
}
|
||||
if (*sc->sc_pdmalen == 0) {
|
||||
sc->sc_tc = ESPSTAT_TC;
|
||||
}
|
||||
sc->sc_esp->sc_espstat |= sc->sc_tc;
|
||||
}
|
||||
#else
|
||||
#include <dev/tc/tcvar.h>
|
||||
|
@ -323,7 +324,7 @@ espattach(parent, self, aux)
|
|||
} else {
|
||||
sc->sc_reg = (volatile u_char *) SCSIBase + 0x400;
|
||||
mac68k_register_scsi_b_irq((void (*)(void *)) espintr, sc);
|
||||
sc->irq_mask = V2IF_SCSIDRQ; /* V2IF_T1? If so, fix ^^, too */
|
||||
sc->irq_mask = V2IF_T1;
|
||||
sc->sc_freq = 25000000;
|
||||
}
|
||||
sc->sc_dma = &sc->_sc_dma;
|
||||
|
@ -437,7 +438,7 @@ espattach(parent, self, aux)
|
|||
#else
|
||||
#ifdef MAC68K_DRIVER
|
||||
sc->sc_cfg2 = ESPCFG2_SCSI2;
|
||||
sc->sc_cfg3 = 0x4;
|
||||
sc->sc_cfg3 = 0;
|
||||
printf(": NCR53C96");
|
||||
sc->sc_rev = NCR53C96;
|
||||
#else
|
||||
|
@ -1106,7 +1107,7 @@ esp_done(sc, ecb)
|
|||
|
||||
xs->flags |= ITSDONE;
|
||||
|
||||
#ifdef ESP_DEBUG
|
||||
#if ESP_DEBUG > 0
|
||||
if (esp_debug & ESP_SHOWMISC) {
|
||||
if (xs->resid != 0)
|
||||
printf("resid=%d ", xs->resid);
|
||||
|
@ -1583,6 +1584,7 @@ esp_msgout(sc)
|
|||
/* (re)send the message */
|
||||
size = min(sc->sc_omlen, sc->sc_maxxfer);
|
||||
DMA_SETUP(sc->sc_dma, &sc->sc_omp, &sc->sc_omlen, 0, &size);
|
||||
#ifndef MAC68K_DRIVER
|
||||
/* Program the SCSI counter */
|
||||
ESP_WRITE_REG(sc, ESP_TCL, size);
|
||||
ESP_WRITE_REG(sc, ESP_TCM, size >> 8);
|
||||
|
@ -1591,6 +1593,7 @@ esp_msgout(sc)
|
|||
}
|
||||
/* load the count in */
|
||||
ESPCMD(sc, ESPCMD_NOP|ESPCMD_DMA);
|
||||
#endif
|
||||
ESPCMD(sc, ESPCMD_TRANS|ESPCMD_DMA);
|
||||
DMA_GO(sc->sc_dma);
|
||||
#else
|
||||
|
@ -2142,6 +2145,9 @@ if (sc->sc_flags & ESP_ICCS) printf("[[esp: BUMMER]]");
|
|||
1, &size);
|
||||
sc->sc_prevphase = DATA_IN_PHASE;
|
||||
setup_xfer:
|
||||
#ifdef MAC68K_DRIVER
|
||||
if (!size) {
|
||||
#endif
|
||||
/* Program the SCSI counter */
|
||||
ESP_WRITE_REG(sc, ESP_TCL, size);
|
||||
ESP_WRITE_REG(sc, ESP_TCM, size >> 8);
|
||||
|
@ -2150,6 +2156,9 @@ if (sc->sc_flags & ESP_ICCS) printf("[[esp: BUMMER]]");
|
|||
}
|
||||
/* load the count in */
|
||||
ESPCMD(sc, ESPCMD_NOP|ESPCMD_DMA);
|
||||
#ifdef MAC68K_DRIVER
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Note that if `size' is 0, we've already transceived
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: espvar.h,v 1.1 1996/10/29 06:09:00 briggs Exp $ */
|
||||
/* $NetBSD: espvar.h,v 1.2 1996/11/02 06:52:24 briggs Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1994 Peter Galbavy. All rights reserved.
|
||||
|
@ -354,7 +354,8 @@ ESP_READ_REG(sc, reg)
|
|||
|
||||
/* DMA macros for ESP */
|
||||
#define DMA_ISINTR(sc) (ESP_READ_REG((sc)->sc_esp, ESP_STAT) & 0x80)
|
||||
#define DMA_RESET(sc) do { (sc)->sc_active = 0; } while(0)
|
||||
#define DMA_RESET(sc) do { (sc)->sc_active = 0; \
|
||||
(sc)->sc_tc = 0;} while(0)
|
||||
#define DMA_INTR(sc) dma_intr(sc)
|
||||
#define DMA_SETUP(sc, paddr, plen, datain, pdmasize) \
|
||||
do { \
|
||||
|
@ -362,6 +363,7 @@ ESP_READ_REG(sc, reg)
|
|||
(sc)->sc_pdmalen = plen; \
|
||||
(sc)->sc_datain = datain; \
|
||||
(sc)->sc_dmasize = *pdmasize; \
|
||||
(sc)->sc_tc = 0; \
|
||||
} while (0)
|
||||
|
||||
#define DMA_GO(sc) \
|
||||
|
@ -370,6 +372,7 @@ ESP_READ_REG(sc, reg)
|
|||
ESP_WRITE_REG((sc)->sc_esp, \
|
||||
ESP_FIFO, **(sc)->sc_dmaaddr); \
|
||||
(*(sc)->sc_pdmalen)--; \
|
||||
(*(sc)->sc_dmaaddr)++; \
|
||||
} \
|
||||
(sc)->sc_active = 1; \
|
||||
} while (0)
|
||||
|
|
Loading…
Reference in New Issue