? sys/arch/hp700/hardcopy.0
Index: sys/arch/hp700/gsc/harmony.c
===================================================================
RCS file: /cvsroot/src/sys/arch/hp700/gsc/harmony.c,v
retrieving revision 1.12
diff -u -u -r1.12 harmony.c
--- sys/arch/hp700/gsc/harmony.c 4 Jul 2008 11:18:02 -0000 1.12
+++ sys/arch/hp700/gsc/harmony.c 20 Sep 2008 09:17:10 -0000
@@ -130,7 +130,8 @@
void harmony_start_cp(struct harmony_softc *);
void harmony_tick_pb(void *);
void harmony_tick_cp(void *);
-void harmony_try_more(struct harmony_softc *);
+void harmony_try_more(struct harmony_softc *, struct harmony_channel *,
+ int, int);
#if NRND > 0
void harmony_acc_tmo(void *);
@@ -367,15 +368,38 @@
WRITE_REG(sc, HARMONY_PNXTADD, nextaddr);
SYNC_REG(sc, HARMONY_PNXTADD, BUS_SPACE_BARRIER_WRITE);
c->c_lastaddr = nextaddr + togo;
- harmony_try_more(sc);
+ harmony_try_more(sc, &sc->sc_playback,
+ HARMONY_PCURADD, PCURADD_BUFMASK);
}
- if (dstatus & DSTATUS_RN) {
- c = &sc->sc_capture;
+ if (sc->sc_capturing && (dstatus & DSTATUS_RN)) {
+ struct harmony_dma *d;
+ bus_addr_t nextaddr;
+ bus_size_t togo;
+
r = 1;
- harmony_start_cp(sc);
- if (sc->sc_capturing && c->c_intr != NULL)
- (*c->c_intr)(c->c_intrarg);
+ c = &sc->sc_capture;
+ d = c->c_current;
+ togo = c->c_segsz - c->c_cnt;
+ if (togo == 0) {
+ nextaddr = d->d_map->dm_segs[0].ds_addr;
+ c->c_cnt = togo = c->c_blksz;
+ } else {
+ nextaddr = c->c_lastaddr;
+ if (togo > c->c_blksz)
+ togo = c->c_blksz;
+ c->c_cnt += togo;
+ }
+
+ bus_dmamap_sync(sc->sc_dmat, d->d_map,
+ nextaddr - d->d_map->dm_segs[0].ds_addr,
+ c->c_blksz, BUS_DMASYNC_PREWRITE);
+
+ WRITE_REG(sc, HARMONY_RNXTADD, nextaddr);
+ SYNC_REG(sc, HARMONY_RNXTADD, BUS_SPACE_BARRIER_WRITE);
+ c->c_lastaddr = nextaddr + togo;
+ harmony_try_more(sc, &sc->sc_capture,
+ HARMONY_RCURADD, RCURADD_BUFMASK);
}
if (READ_REG(sc, HARMONY_OV) & OV_OV) {
@@ -1315,17 +1339,16 @@
}
void
-harmony_try_more(struct harmony_softc *sc)
+harmony_try_more(struct harmony_softc *sc, struct harmony_channel *c,
+ int current_addr, int bufmask)
{
- struct harmony_channel *c;
struct harmony_dma *d;
uint32_t cur;
int i, nsegs;
- c = &sc->sc_playback;
d = c->c_current;
- cur = bus_space_read_4(sc->sc_bt, sc->sc_bh, HARMONY_PCURADD);
- cur &= PCURADD_BUFMASK;
+ cur = bus_space_read_4(sc->sc_bt, sc->sc_bh, current_addr);
+ cur &= bufmask;
nsegs = 0;
#ifdef DIAGNOSTIC
Index: sys/arch/hp700/gsc/harmonyreg.h
===================================================================
RCS file: /cvsroot/src/sys/arch/hp700/gsc/harmonyreg.h,v
retrieving revision 1.2
diff -u -u -r1.2 harmonyreg.h
--- sys/arch/hp700/gsc/harmonyreg.h 11 Dec 2005 12:17:24 -0000 1.2
+++ sys/arch/hp700/gsc/harmonyreg.h 20 Sep 2008 09:17:10 -0000
@@ -128,7 +128,7 @@
#define PCURADD_BUFMASK (~(HARMONY_BUFSIZE - 1))
/* HARMONY_RCURADD */
-#define PCURADD_BUFMASK (~(HARMONY_BUFSIZE - 1))
+#define RCURADD_BUFMASK (~(HARMONY_BUFSIZE - 1))
/* HARMONY_DSTATUS */
#define DSTATUS_IE 0x80000000 /* interrupt enable */