increase maxsegs of esp main dma map by one to avoid error
tweak esp glue to read xfer_len from dma map add some debugging checks for dma driver invariants read DD_LIMIT instead of DD_SAVED_LIMIT on scsi dma shutdowns
This commit is contained in:
parent
7ee956fdcc
commit
6456e9d8a9
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: esp.c,v 1.33 2001/04/16 14:12:12 dbj Exp $ */
|
||||
/* $NetBSD: esp.c,v 1.34 2001/04/17 03:42:24 dbj Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
|
||||
@ -363,7 +363,7 @@ espattach_intio(parent, self, aux)
|
||||
{
|
||||
int error;
|
||||
if ((error = bus_dmamap_create(esc->sc_scsi_dma.nd_dmat,
|
||||
sc->sc_maxxfer, sc->sc_maxxfer/NBPG, sc->sc_maxxfer,
|
||||
sc->sc_maxxfer, sc->sc_maxxfer/NBPG+1, sc->sc_maxxfer,
|
||||
0, BUS_DMA_ALLOCNOW, &esc->sc_main_dmamap)) != 0) {
|
||||
panic("%s: can't create main i/o DMA map, error = %d",
|
||||
sc->sc_dev.dv_xname,error);
|
||||
@ -768,6 +768,17 @@ esp_dma_setup(sc, addr, len, datain, dmasize)
|
||||
esc->sc_main, esc->sc_main_size,
|
||||
NULL, BUS_DMA_NOWAIT);
|
||||
if (error) {
|
||||
#ifdef ESP_DEBUG
|
||||
printf("%s: esc->sc_main_dmamap->_dm_size = %d\n",
|
||||
sc->sc_dev.dv_xname,esc->sc_main_dmamap->_dm_size);
|
||||
printf("%s: esc->sc_main_dmamap->_dm_segcnt = %d\n",
|
||||
sc->sc_dev.dv_xname,esc->sc_main_dmamap->_dm_segcnt);
|
||||
printf("%s: esc->sc_main_dmamap->_dm_maxsegsz = %d\n",
|
||||
sc->sc_dev.dv_xname,esc->sc_main_dmamap->_dm_maxsegsz);
|
||||
printf("%s: esc->sc_main_dmamap->_dm_boundary = %d\n",
|
||||
sc->sc_dev.dv_xname,esc->sc_main_dmamap->_dm_boundary);
|
||||
esp_dma_print(sc);
|
||||
#endif
|
||||
panic("%s: can't load main dma map. error = %d, addr=0x%08x, size=0x%08x",
|
||||
sc->sc_dev.dv_xname, error,esc->sc_main,esc->sc_main_size);
|
||||
}
|
||||
@ -775,6 +786,7 @@ esp_dma_setup(sc, addr, len, datain, dmasize)
|
||||
bus_dmamap_sync(esc->sc_scsi_dma.nd_dmat, esc->sc_main_dmamap,
|
||||
0, esc->sc_main_dmamap->dm_mapsize,
|
||||
(esc->sc_datain ? BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE));
|
||||
esc->sc_main_dmamap->dm_xfer_len = 0;
|
||||
#endif
|
||||
} else {
|
||||
esc->sc_main = 0;
|
||||
@ -810,6 +822,7 @@ esp_dma_setup(sc, addr, len, datain, dmasize)
|
||||
bus_dmamap_sync(esc->sc_scsi_dma.nd_dmat, esc->sc_tail_dmamap,
|
||||
0, esc->sc_tail_dmamap->dm_mapsize,
|
||||
(esc->sc_datain ? BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE));
|
||||
esc->sc_tail_dmamap->dm_xfer_len = 0;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@ -852,7 +865,7 @@ esp_dma_store(sc)
|
||||
p += sprintf(p,"%s: sc_main_dmamap. mapsize = 0x%08x, nsegs = %d\n",
|
||||
sc->sc_dev.dv_xname, map->dm_mapsize, map->dm_nsegs);
|
||||
for(i=0;i<map->dm_nsegs;i++) {
|
||||
p += sprintf(p,"%s: map->dm_segs[%d]->ds_addr = 0x%08x, len = 0x%08x\n",
|
||||
p += sprintf(p,"%s: map->dm_segs[%d].ds_addr = 0x%08x, len = 0x%08x\n",
|
||||
sc->sc_dev.dv_xname, i, map->dm_segs[i].ds_addr, map->dm_segs[i].ds_len);
|
||||
}
|
||||
}
|
||||
@ -864,7 +877,7 @@ esp_dma_store(sc)
|
||||
p += sprintf(p,"%s: sc_tail_dmamap. mapsize = 0x%08x, nsegs = %d\n",
|
||||
sc->sc_dev.dv_xname, map->dm_mapsize, map->dm_nsegs);
|
||||
for(i=0;i<map->dm_nsegs;i++) {
|
||||
p += sprintf(p,"%s: map->dm_segs[%d]->ds_addr = 0x%08x, len = 0x%08x\n",
|
||||
p += sprintf(p,"%s: map->dm_segs[%d].ds_addr = 0x%08x, len = 0x%08x\n",
|
||||
sc->sc_dev.dv_xname, i, map->dm_segs[i].ds_addr, map->dm_segs[i].ds_len);
|
||||
}
|
||||
}
|
||||
@ -948,12 +961,14 @@ esp_dma_go(sc)
|
||||
bus_dmamap_sync(esc->sc_scsi_dma.nd_dmat, esc->sc_main_dmamap,
|
||||
0, esc->sc_main_dmamap->dm_mapsize,
|
||||
(esc->sc_datain ? BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE));
|
||||
esc->sc_main_dmamap->dm_xfer_len = 0;
|
||||
}
|
||||
|
||||
if (esc->sc_tail_dmamap->dm_mapsize) {
|
||||
bus_dmamap_sync(esc->sc_scsi_dma.nd_dmat, esc->sc_tail_dmamap,
|
||||
0, esc->sc_tail_dmamap->dm_mapsize,
|
||||
(esc->sc_datain ? BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE));
|
||||
esc->sc_tail_dmamap->dm_xfer_len = 0;
|
||||
}
|
||||
|
||||
nextdma_start(&esc->sc_scsi_dma,
|
||||
@ -973,7 +988,10 @@ void
|
||||
esp_dma_stop(sc)
|
||||
struct ncr53c9x_softc *sc;
|
||||
{
|
||||
panic("Not yet implemented");
|
||||
struct esp_softc *esc = (struct esp_softc *)sc;
|
||||
next_dma_print(&esc->sc_scsi_dma);
|
||||
esp_dma_print(sc);
|
||||
panic("%s: stop not yet implemented\n",sc->sc_dev.dv_xname);
|
||||
}
|
||||
|
||||
int
|
||||
@ -1012,6 +1030,7 @@ esp_dmacb_continue(arg)
|
||||
bus_dmamap_sync(esc->sc_scsi_dma.nd_dmat, esc->sc_main_dmamap,
|
||||
0, esc->sc_main_dmamap->dm_mapsize,
|
||||
(esc->sc_datain ? BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE));
|
||||
esc->sc_main_dmamap->dm_xfer_len = 0;
|
||||
#endif
|
||||
esc->sc_loaded |= ESP_LOADED_MAIN;
|
||||
return(esc->sc_main_dmamap);
|
||||
@ -1024,6 +1043,7 @@ esp_dmacb_continue(arg)
|
||||
bus_dmamap_sync(esc->sc_scsi_dma.nd_dmat, esc->sc_tail_dmamap,
|
||||
0, esc->sc_tail_dmamap->dm_mapsize,
|
||||
(esc->sc_datain ? BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE));
|
||||
esc->sc_tail_dmamap->dm_xfer_len = 0;
|
||||
#endif
|
||||
esc->sc_loaded |= ESP_LOADED_TAIL;
|
||||
return(esc->sc_tail_dmamap);
|
||||
@ -1051,7 +1071,7 @@ esp_dmacb_completed(map, arg)
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(DIAGNOSTIC)
|
||||
#if defined(DIAGNOSTIC) && 0
|
||||
{
|
||||
int i;
|
||||
for(i=0;i<map->dm_nsegs;i++) {
|
||||
@ -1137,6 +1157,7 @@ esp_dmacb_shutdown(arg)
|
||||
{
|
||||
struct ncr53c9x_softc *sc = (struct ncr53c9x_softc *)arg;
|
||||
struct esp_softc *esc = (struct esp_softc *)sc;
|
||||
bus_size_t xfer_len = 0;
|
||||
|
||||
DPRINTF(("%s: dma shutdown\n",sc->sc_dev.dv_xname));
|
||||
|
||||
@ -1169,7 +1190,10 @@ esp_dmacb_shutdown(arg)
|
||||
}
|
||||
#endif
|
||||
|
||||
xfer_len += esc->sc_begin_size;
|
||||
|
||||
if (esc->sc_main_dmamap->dm_mapsize) {
|
||||
xfer_len += esc->sc_main_dmamap->dm_xfer_len;
|
||||
bus_dmamap_sync(esc->sc_scsi_dma.nd_dmat, esc->sc_main_dmamap,
|
||||
0, esc->sc_main_dmamap->dm_mapsize,
|
||||
(esc->sc_datain ? BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE));
|
||||
@ -1177,12 +1201,18 @@ esp_dmacb_shutdown(arg)
|
||||
}
|
||||
|
||||
if (esc->sc_tail_dmamap->dm_mapsize) {
|
||||
xfer_len += esc->sc_tail_dmamap->dm_xfer_len;
|
||||
bus_dmamap_sync(esc->sc_scsi_dma.nd_dmat, esc->sc_tail_dmamap,
|
||||
0, esc->sc_tail_dmamap->dm_mapsize,
|
||||
(esc->sc_datain ? BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE));
|
||||
bus_dmamap_unload(esc->sc_scsi_dma.nd_dmat, esc->sc_tail_dmamap);
|
||||
}
|
||||
|
||||
/* truncate in case tail overran */
|
||||
if (xfer_len > esc->sc_dmasize) {
|
||||
xfer_len = esc->sc_dmasize;
|
||||
}
|
||||
|
||||
/* copy the tail dma buffer data for read transfers */
|
||||
if (esc->sc_datain == 1) {
|
||||
memcpy((*esc->sc_dmaaddr+esc->sc_begin_size+esc->sc_main_size),
|
||||
@ -1205,8 +1235,12 @@ esp_dmacb_shutdown(arg)
|
||||
}
|
||||
#endif
|
||||
|
||||
*(esc->sc_dmaaddr) += esc->sc_dmasize;
|
||||
*(esc->sc_dmalen) -= esc->sc_dmasize;
|
||||
#if 0
|
||||
KASSERT(xfer_len == esc->sc_dmasize);
|
||||
#endif
|
||||
|
||||
*(esc->sc_dmaaddr) += xfer_len;
|
||||
*(esc->sc_dmalen) -= xfer_len;
|
||||
|
||||
esc->sc_main = 0;
|
||||
esc->sc_main_size = 0;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: nextdma.c,v 1.26 2001/04/16 14:12:12 dbj Exp $ */
|
||||
/* $NetBSD: nextdma.c,v 1.27 2001/04/17 03:42:25 dbj Exp $ */
|
||||
/*
|
||||
* Copyright (c) 1998 Darrin B. Jewell
|
||||
* All rights reserved.
|
||||
@ -584,6 +584,7 @@ nextdma_intr(arg)
|
||||
result |= 0x02;
|
||||
}
|
||||
if (nd->_nd_map_cont == NULL) {
|
||||
KASSERT(nd->_nd_idx+1 == nd->_nd_map->dm_nsegs);
|
||||
/* Expecting a shutdown, didn't SETSUPDATE last turn */
|
||||
result |= 0x04;
|
||||
}
|
||||
@ -594,7 +595,11 @@ nextdma_intr(arg)
|
||||
switch (result) {
|
||||
case 0x00: /* !BUSEXC && !expecting && !SUPDATE && !ENABLE */
|
||||
case 0x08: /* BUSEXC && !expecting && !SUPDATE && !ENABLE */
|
||||
slimit = bus_space_read_4(nd->nd_bst, nd->nd_bsh, DD_SAVED_LIMIT);
|
||||
if (nd->nd_intr == NEXT_I_SCSI_DMA) {
|
||||
slimit = bus_space_read_4(nd->nd_bst, nd->nd_bsh, DD_LIMIT);
|
||||
} else {
|
||||
slimit = bus_space_read_4(nd->nd_bst, nd->nd_bsh, DD_SAVED_LIMIT);
|
||||
}
|
||||
break;
|
||||
case 0x01: /* !BUSEXC && !expecting && !SUPDATE && ENABLE */
|
||||
case 0x09: /* BUSEXC && !expecting && !SUPDATE && ENABLE */
|
||||
@ -672,6 +677,9 @@ nextdma_intr(arg)
|
||||
if ((nd->_nd_idx+1) == nd->_nd_map->dm_nsegs) {
|
||||
if (nd->nd_completed_cb)
|
||||
(*nd->nd_completed_cb)(nd->_nd_map, nd->nd_cb_arg);
|
||||
} else {
|
||||
KASSERT(nd->_nd_map == nd->_nd_map_cont);
|
||||
KASSERT(nd->_nd_idx+1 == nd->_nd_idx_cont);
|
||||
}
|
||||
nd->_nd_map = 0;
|
||||
nd->_nd_idx = 0;
|
||||
@ -692,6 +700,7 @@ nextdma_intr(arg)
|
||||
}
|
||||
|
||||
if (nd->_nd_map_cont == NULL) {
|
||||
KASSERT(nd->_nd_idx+1 == nd->_nd_map->dm_nsegs);
|
||||
bus_space_write_4(nd->nd_bst, nd->nd_bsh, DD_CSR,
|
||||
DMACSR_CLRCOMPLETE | dmadir);
|
||||
} else {
|
||||
@ -722,7 +731,7 @@ nextdma_intr(arg)
|
||||
u_long dmadir; /* DMACSR_SETREAD or DMACSR_SETWRITE */
|
||||
|
||||
next_dma_rotate(nd);
|
||||
|
||||
|
||||
if (state & DMACSR_READ) {
|
||||
dmadir = DMACSR_SETREAD;
|
||||
} else {
|
||||
@ -737,6 +746,7 @@ nextdma_intr(arg)
|
||||
next_dma_setup_cont_regs(nd);
|
||||
|
||||
if (nd->_nd_map_cont == NULL) {
|
||||
KASSERT(nd->_nd_idx+1 == nd->_nd_map->dm_nsegs);
|
||||
bus_space_write_4(nd->nd_bst, nd->nd_bsh, DD_CSR,
|
||||
DMACSR_SETENABLE | dmadir);
|
||||
} else {
|
||||
|
Loading…
x
Reference in New Issue
Block a user