diff --git a/sys/arch/next68k/dev/esp.c b/sys/arch/next68k/dev/esp.c index ffc9e3b5bca6..420f713ce37b 100644 --- a/sys/arch/next68k/dev/esp.c +++ b/sys/arch/next68k/dev/esp.c @@ -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;idm_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;idm_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;idm_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; diff --git a/sys/arch/next68k/dev/nextdma.c b/sys/arch/next68k/dev/nextdma.c index 54bb9654b86f..70e93cf55983 100644 --- a/sys/arch/next68k/dev/nextdma.c +++ b/sys/arch/next68k/dev/nextdma.c @@ -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 {