<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">? 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 &gt; 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-&gt;c_lastaddr = nextaddr + togo;
-		harmony_try_more(sc);
+		harmony_try_more(sc, &amp;sc-&gt;sc_playback,
+		    HARMONY_PCURADD, PCURADD_BUFMASK);
 	}
 
-	if (dstatus &amp; DSTATUS_RN) {
-		c = &amp;sc-&gt;sc_capture;
+	if (sc-&gt;sc_capturing &amp;&amp; (dstatus &amp; DSTATUS_RN)) {
+		struct harmony_dma *d;
+		bus_addr_t nextaddr;
+		bus_size_t togo;
+
 		r = 1;
-		harmony_start_cp(sc);
-		if (sc-&gt;sc_capturing &amp;&amp; c-&gt;c_intr != NULL)
-			(*c-&gt;c_intr)(c-&gt;c_intrarg);
+		c = &amp;sc-&gt;sc_capture;
+		d = c-&gt;c_current;
+		togo = c-&gt;c_segsz - c-&gt;c_cnt;
+		if (togo == 0) {
+			nextaddr = d-&gt;d_map-&gt;dm_segs[0].ds_addr;
+			c-&gt;c_cnt = togo = c-&gt;c_blksz;
+		} else {
+			nextaddr = c-&gt;c_lastaddr;
+			if (togo &gt; c-&gt;c_blksz)
+				togo = c-&gt;c_blksz;
+			c-&gt;c_cnt += togo;
+		}
+
+		bus_dmamap_sync(sc-&gt;sc_dmat, d-&gt;d_map,
+		    nextaddr - d-&gt;d_map-&gt;dm_segs[0].ds_addr,
+		    c-&gt;c_blksz, BUS_DMASYNC_PREWRITE);
+
+		WRITE_REG(sc, HARMONY_RNXTADD, nextaddr);
+		SYNC_REG(sc, HARMONY_RNXTADD, BUS_SPACE_BARRIER_WRITE);
+		c-&gt;c_lastaddr = nextaddr + togo;
+		harmony_try_more(sc, &amp;sc-&gt;sc_capture,
+		    HARMONY_RCURADD, RCURADD_BUFMASK);
 	}
 
 	if (READ_REG(sc, HARMONY_OV) &amp; 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 = &amp;sc-&gt;sc_playback;
 	d = c-&gt;c_current;
-	cur = bus_space_read_4(sc-&gt;sc_bt, sc-&gt;sc_bh, HARMONY_PCURADD);
-	cur &amp;= PCURADD_BUFMASK;
+	cur = bus_space_read_4(sc-&gt;sc_bt, sc-&gt;sc_bh, current_addr);
+	cur &amp;= 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 */
</pre></body></html>