Module Name: src Committed By: tsutsui Date: Sat May 9 02:18:48 UTC 2009
Modified Files: src/sys/arch/ews4800mips/sbd: if_iee_sbdio.c Log Message: - use BUS_DMA_COHERENT rather than using MIPS_KSEG1_START - use bus_dmamap_sync(9) rather than mips_dcache_wbinv_range() - call bus_dmamap_sync(9) properly on DMA polling XXX: untested due to lack of hardware To generate a diff of this commit: cvs rdiff -u -r1.6 -r1.7 src/sys/arch/ews4800mips/sbd/if_iee_sbdio.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/ews4800mips/sbd/if_iee_sbdio.c diff -u src/sys/arch/ews4800mips/sbd/if_iee_sbdio.c:1.6 src/sys/arch/ews4800mips/sbd/if_iee_sbdio.c:1.7 --- src/sys/arch/ews4800mips/sbd/if_iee_sbdio.c:1.6 Tue May 5 16:38:41 2009 +++ src/sys/arch/ews4800mips/sbd/if_iee_sbdio.c Sat May 9 02:18:48 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: if_iee_sbdio.c,v 1.6 2009/05/05 16:38:41 tsutsui Exp $ */ +/* $NetBSD: if_iee_sbdio.c,v 1.7 2009/05/09 02:18:48 tsutsui Exp $ */ /* * Copyright (c) 2003 Jochen Kunz. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_iee_sbdio.c,v 1.6 2009/05/05 16:38:41 tsutsui Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_iee_sbdio.c,v 1.7 2009/05/09 02:18:48 tsutsui Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -106,7 +106,8 @@ } if (bus_dmamem_map(sc->sc_dmat, &sc->sc_dma_segs, rsegs, IEE_SHMEM_MAX, - (void **)sc->sc_shmem_addr, BUS_DMA_NOWAIT) != 0) { + (void **)sc->sc_shmem_addr, + BUS_DMA_NOWAIT | BUS_DMA_COHERENT) != 0) { aprint_error(": can't map DMA memory\n"); bus_dmamem_free(sc->sc_dmat, &sc->sc_dma_segs, rsegs); return; @@ -130,9 +131,8 @@ } memset(sc->sc_shmem_addr, 0, IEE_SHMEM_MAX); - mips_dcache_wbinv_range((vaddr_t)sc->sc_shmem_addr, IEE_SHMEM_MAX); - sc->sc_shmem_addr = (void *)((vaddr_t)sc->sc_shmem_addr | - MIPS_KSEG1_START); + bus_dmamap_sync(sc->sc_dmat, sc->sc_shmem_map, 0, IEE_SHMEM_MAX, + BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); /* Setup SYSBUS byte. TR2 specific? -uch */ SC_SCP->scp_sysbus = IEE_SYSBUS_BE | IEE_SYSBUS_INT | @@ -156,24 +156,25 @@ { int retry = 8; int n; + uint32_t ack; SC_SCB->scb_cmd = cmd; bus_dmamap_sync(sc->sc_dmat, sc->sc_shmem_map, IEE_SCB_OFF, IEE_SCB_SZ, - BUS_DMASYNC_PREWRITE); + BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); iee_sbdio_channel_attention(sc); /* Wait for the cmd to finish */ for (n = 0 ; n < retry; n++) { bus_dmamap_sync(sc->sc_dmat, sc->sc_shmem_map, IEE_SCB_OFF, + IEE_SCB_SZ, BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); + ack = SC_SCB->scb_cmd; + bus_dmamap_sync(sc->sc_dmat, sc->sc_shmem_map, IEE_SCB_OFF, IEE_SCB_SZ, BUS_DMASYNC_PREREAD); - - if (SC_SCB->scb_cmd == 0) + if (ack == 0) break; delay(1); } - bus_dmamap_sync(sc->sc_dmat, sc->sc_shmem_map, IEE_SCB_OFF, IEE_SCB_SZ, - BUS_DMASYNC_PREREAD); if (n < retry) return 0; @@ -188,12 +189,13 @@ { #define IEE_ISCP_BUSSY 0x1 int n, retry = 8; - uint32_t cmd; + uint32_t cmd, ack; /* Make sure the busy byte is set and the cache is flushed. */ SC_ISCP->iscp_bussy = IEE_ISCP_BUSSY; - bus_dmamap_sync(sc->sc_dmat, sc->sc_shmem_map, IEE_SCP_OFF, IEE_SCP_SZ - + IEE_ISCP_SZ + IEE_SCB_SZ, BUS_DMASYNC_PREWRITE); + bus_dmamap_sync(sc->sc_dmat, sc->sc_shmem_map, + IEE_SCP_OFF, IEE_SCP_SZ + IEE_ISCP_SZ + IEE_SCB_SZ, + BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); /* Setup the PORT Command with pointer to SCP. */ cmd = IEE_PORT_SCP | IEE_PHYS_SHMEM(IEE_SCP_OFF); @@ -208,14 +210,15 @@ /* Wait for the chip to initialize and read SCP and ISCP. */ for (n = 0 ; n < retry; n++) { bus_dmamap_sync(sc->sc_dmat, sc->sc_shmem_map, IEE_ISCP_OFF, + IEE_ISCP_SZ, BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); + ack = SC_ISCP->iscp_bussy; + bus_dmamap_sync(sc->sc_dmat, sc->sc_shmem_map, IEE_ISCP_OFF, IEE_ISCP_SZ, BUS_DMASYNC_PREREAD); - if (SC_ISCP->iscp_bussy != IEE_ISCP_BUSSY) { + if (ack != IEE_ISCP_BUSSY) { break; } delay(100); } - bus_dmamap_sync(sc->sc_dmat, sc->sc_shmem_map, IEE_SCB_OFF, IEE_SCB_SZ, - BUS_DMASYNC_PREREAD); if (n < retry) { /* ACK interrupts we may have caused */