Module Name: src
Committed By: tsutsui
Date: Sat May 9 02:29:29 UTC 2009
Modified Files:
src/sys/arch/hp700/gsc: if_iee_gsc.c
Log Message:
Call bus_dmamap_sync(9) more properly on DMA polling.
To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/hp700/gsc/if_iee_gsc.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/hp700/gsc/if_iee_gsc.c
diff -u src/sys/arch/hp700/gsc/if_iee_gsc.c:1.10 src/sys/arch/hp700/gsc/if_iee_gsc.c:1.11
--- src/sys/arch/hp700/gsc/if_iee_gsc.c:1.10 Thu May 7 14:22:37 2009
+++ src/sys/arch/hp700/gsc/if_iee_gsc.c Sat May 9 02:29:29 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: if_iee_gsc.c,v 1.10 2009/05/07 14:22:37 tsutsui Exp $ */
+/* $NetBSD: if_iee_gsc.c,v 1.11 2009/05/09 02:29:29 tsutsui Exp $ */
/*
* Copyright (c) 2003 Jochen Kunz.
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_iee_gsc.c,v 1.10 2009/05/07 14:22:37 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_iee_gsc.c,v 1.11 2009/05/09 02:29:29 tsutsui Exp $");
/* autoconfig and device stuff */
#include <sys/param.h>
@@ -113,22 +113,24 @@
{
struct iee_gsc_softc *sc_gsc = (struct iee_gsc_softc *)sc;
int n;
+ uint16_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);
/* Issue a Channel Attention to force the chip to read the cmd. */
bus_space_write_4(sc_gsc->sc_iot, sc_gsc->sc_ioh, IEE_GSC_CHANATT, 0);
/* Wait for the cmd to finish */
for (n = 0 ; n < 100000; n++) {
DELAY(1);
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;
}
- bus_dmamap_sync(sc->sc_dmat, sc->sc_shmem_map, IEE_SCB_OFF, IEE_SCB_SZ,
- BUS_DMASYNC_PREREAD);
if (n < 100000)
return 0;
printf("%s: iee_gsc_cmd: timeout n=%d\n", device_xname(sc->sc_dev), n);
@@ -141,11 +143,13 @@
struct iee_gsc_softc *sc_gsc = (struct iee_gsc_softc *)sc;
int n;
uint32_t cmd;
+ uint16_t ack;
/* Make sure the bussy 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);
+ + 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);
/* Write a word to IEE_GSC_RESET to initiate a Hardware reset. */
@@ -171,13 +175,14 @@
/* Wait for the chip to initialize and read SCP and ISCP. */
for (n = 0 ; n < 1000; 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_ISCP_OFF,
- IEE_ISCP_SZ, BUS_DMASYNC_PREREAD);
if (n < 1000) {
/* ACK interrupts we may have caused */
(sc->sc_iee_cmd)(sc, IEE_SCB_ACK);