From owner-FreeBSD-users-jp@jp.FreeBSD.org Sun Feb 17 23:36:41 2002
Received: (from daemon@localhost)
	by castle.jp.FreeBSD.org (8.11.6+3.4W/8.11.3) id g1HEafW66983;
	Sun, 17 Feb 2002 23:36:41 +0900 (JST)
	(envelope-from owner-FreeBSD-users-jp@jp.FreeBSD.org)
Received: from mail500.nifty.com (mail500.nifty.com [202.248.37.208])
	by castle.jp.FreeBSD.org (8.11.6+3.4W/8.11.3) with ESMTP/inet id g1HEafW66978
	for <FreeBSD-users-jp@jp.FreeBSD.org>; Sun, 17 Feb 2002 23:36:41 +0900 (JST)
	(envelope-from t.ichinoseki@nifty.com)
Received: from localhost
	by mail500.nifty.com (8.11.6+3.4W/3.7W-01/21/02) with ESMTP id g1HEYhQ03170
	for <FreeBSD-users-jp@jp.FreeBSD.org>; Sun, 17 Feb 2002 23:34:43 +0900
Date: Sun, 17 Feb 2002 23:31:23 +0900 (JST)
Message-Id: <20020217.233123.74739022.t.ichinoseki@nifty.com>
To: FreeBSD-users-jp@jp.FreeBSD.org
From: ICHINOSEKI (=?iso-2022-jp?B?GyRCMGw0WBsoQg==?=)
 <t.ichinoseki@nifty.com>
X-Mailer: Mew version 2.1 on Emacs 20.7 / Mule 4.1 (AOI)
Mime-Version: 1.0
Content-Type: Multipart/Mixed;
 boundary="--Next_Part(Sun_Feb_17_23:31:23_2002_586)--"
Content-Transfer-Encoding: 7bit
Reply-To: FreeBSD-users-jp@jp.FreeBSD.org
Precedence: list
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+011218
X-Sequence: FreeBSD-users-jp 66965
Subject: [FreeBSD-users-jp 66965] Neomagic Sound Driver Patch (4.4R
 =?ISO-2022-JP?B?GyRCIUEbKEI=?=)
Errors-To: owner-FreeBSD-users-jp@jp.FreeBSD.org
Sender: owner-FreeBSD-users-jp@jp.FreeBSD.org
X-Originator: t.ichinoseki@nifty.com

----Next_Part(Sun_Feb_17_23:31:23_2002_586)--
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit

$B=i$a$^$7$F!"0l4X$H$$$$$^$9!#(B

Panasonic Let's note CF-M2EV $B$K(B Win-Me/4-stabe/5-current $B$rF~$l$F%^%k(B
$B%A%V!<%H$K$7$F;H$C$F$$$k$s$G$9$,!"%5%&%s%I$,(B Neomagic 256AV $B$G!"(B
http://www.FreeBSD.org/cgi/query-pr.cgi?pr=kern/29465
$B$H$^$C$?$/F1$88=>]$G(B(pr$B$G$O!"(BCF-M2$B$N$h$&$G$9$,(B)$BF0:n$7$J$/$J$C$F$^$7$?!#(B
$B$G!"(BNetBSD $B$N(B neo.c $BEy$r;29M$K$7$D$DG/3+$1$+$i$$$8$C$F$?$s$G$9$,$I$&$K(B
$B$+2;$,$G$kMM$K$J$j$^$7$?$N$G!"%Q%C%A$rN.$7$H$-$^$9!#(B

$B=$@5E@$O!"<B<AE*$K$O!"(B

1. mixer $B$NB8:_3NG'$NA0$K(B nm_init() $B$K$"$k(B device reset $B%3!<%I$rF~$l$k(B
  (CF-M2EV $B$O(B $B$3$l$r$7$J$$$H(B mixer $B$,=P$FMh$^$;$s!#(B)

2. Play/Record $B$N(B BUFFER_WMARK $B$O(B $B%A%c%M%k$N%V%m%C%/%5%$%:$K9g$o$;$?CM(B
   $B$r@_Dj$7!"3d$j9~$_Kh$K99?7$9$k!#(B

$B$N(B2$BE@$G!"(B1. $B$O(B Let's note $BFCM-$NLdBj$N2DG=@-$,Bg$G$9$,!"8e$GF1$8%3!<(B
$B%I$r<B9T$7$F$$$k$N$G$*$=$i$/B>$N$b$N$G$bLdBj$J$$$H;W$$$^$9!#(B
2. $B$O(B 4.3R $B$H(B 4.4R $B$N4V$K(B pcm $B$KF~$C$?=$@5$G!"(Btimeout $B%A%'%C%/$,%A%c%M(B
$B%k$N%V%m%C%/%5%$%:$H:F@8%l!<%H$r85$K$9$k$h$&JQ99$K$J$C$?(B($B$H;W$&(B)$B$N$KBP(B
$B1~$9$k$?$a$N$b$N$G$9(B($B3d$j9~$_4V3V$,C;$/$J$k$N$G%$%^%$%A$J5$$,$7$^$9$,(B)$B!#(B

$BE:IU$N%Q%C%A$O(B current $B$KBP$9$k$b$N$G$9$,!"(B4.4R $B0J9_(B $B$N(B 4-stable $B$K$b$=(B
$B$N$^$^Ev$?$k$O$:$G$9(B(4.5R$B$G$O3NG':Q(B)$B!#(B

Let's note CF-M2EV $B0J30$G$NF0:n3NG'$,D:$1$k$H$"$j$,$?$$$G$9!#Bg>fIW$=(B
$B$&$J$i(B send-pr $B$7$F$_$h$&$H;W$C$F$$$k$N$G!#(B

--
// $B0l4X(B t.ichinoseki@nifty.com

----Next_Part(Sun_Feb_17_23:31:23_2002_586)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="neomagic.c.diff"

Index: neomagic.c
===================================================================
RCS file: /local/cvsroot/src/sys/dev/sound/pci/neomagic.c,v
retrieving revision 1.26
diff -u -r1.26 neomagic.c
--- neomagic.c	23 Aug 2001 11:30:51 -0000	1.26
+++ neomagic.c	16 Feb 2002 07:47:05 -0000
@@ -48,6 +48,7 @@
 /* channel registers */
 struct sc_chinfo {
 	int spd, dir, fmt;
+	u_int32_t blksize, wmark;
 	struct snd_dbuf *buffer;
 	struct pcm_channel *channel;
 	struct sc_info *parent;
@@ -203,14 +204,17 @@
 nm_waitcd(struct sc_info *sc)
 {
 	int cnt = 10;
+	int fail = 1;
 
 	while (cnt-- > 0) {
 		if (nm_rd(sc, sc->ac97_status, 2) & sc->ac97_busy)
 			DELAY(100);
-		else
+		else {
+			fail = 0;
 			break;
+		}
 	}
-	return (nm_rd(sc, sc->ac97_status, 2) & sc->ac97_busy);
+	return (fail);
 }
 
 static u_int32_t
@@ -338,6 +342,8 @@
 
 	chnbuf = (dir == PCMDIR_PLAY)? sc->pbuf : sc->rbuf;
 	ch = (dir == PCMDIR_PLAY)? &sc->pch : &sc->rch;
+	ch->blksize = 0;
+	ch->wmark = 0;
 	ch->buffer = b;
 	sndbuf_setup(ch->buffer, (u_int8_t *)rman_get_virtual(sc->buf) + chnbuf, NM_BUFFSIZE);
 	if (bootverbose)
@@ -376,6 +382,10 @@
 static int
 nmchan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
 {
+	struct sc_chinfo *ch = data;
+
+	ch->blksize = blocksize;
+
 	return blocksize;
 }
 
@@ -395,10 +405,11 @@
 
 	if (ch->dir == PCMDIR_PLAY) {
 		if (go == PCMTRIG_START) {
+			ch->wmark = ch->blksize;
 			nm_wr(sc, NM_PBUFFER_START, sc->pbuf, 4);
 			nm_wr(sc, NM_PBUFFER_END, sc->pbuf + NM_BUFFSIZE - ssz, 4);
 			nm_wr(sc, NM_PBUFFER_CURRP, sc->pbuf, 4);
-			nm_wr(sc, NM_PBUFFER_WMARK, sc->pbuf + NM_BUFFSIZE / 2, 4);
+			nm_wr(sc, NM_PBUFFER_WMARK, sc->pbuf + ch->wmark, 4);
 			nm_wr(sc, NM_PLAYBACK_ENABLE_REG, NM_PLAYBACK_FREERUN |
 				NM_PLAYBACK_ENABLE_FLAG, 1);
 			nm_wr(sc, NM_AUDIO_MUTE_REG, 0, 2);
@@ -408,12 +419,13 @@
 		}
 	} else {
 		if (go == PCMTRIG_START) {
+			ch->wmark = ch->blksize;
 			nm_wr(sc, NM_RECORD_ENABLE_REG, NM_RECORD_FREERUN |
 				NM_RECORD_ENABLE_FLAG, 1);
 			nm_wr(sc, NM_RBUFFER_START, sc->rbuf, 4);
 			nm_wr(sc, NM_RBUFFER_END, sc->rbuf + NM_BUFFSIZE, 4);
 			nm_wr(sc, NM_RBUFFER_CURRP, sc->rbuf, 4);
-			nm_wr(sc, NM_RBUFFER_WMARK, sc->rbuf + NM_BUFFSIZE / 2, 4);
+			nm_wr(sc, NM_RBUFFER_WMARK, sc->rbuf + ch->wmark, 4);
 		} else {
 			nm_wr(sc, NM_RECORD_ENABLE_REG, 0, 1);
 		}
@@ -465,11 +477,19 @@
 
 	if (status & sc->playint) {
 		status &= ~sc->playint;
+		sc->pch.wmark += sc->pch.blksize;
+		sc->pch.wmark %= NM_BUFFSIZE;
+		nm_wr(sc, NM_PBUFFER_WMARK, sc->pbuf + sc->pch.wmark, 4);
+
 		nm_ackint(sc, sc->playint);
 		chn_intr(sc->pch.channel);
 	}
 	if (status & sc->recint) {
 		status &= ~sc->recint;
+		sc->rch.wmark += sc->rch.blksize;
+		sc->rch.wmark %= NM_BUFFSIZE;
+		nm_wr(sc, NM_RBUFFER_WMARK, sc->rbuf + sc->rch.wmark, 4);
+
 		nm_ackint(sc, sc->recint);
 		chn_intr(sc->rch.channel);
 	}
@@ -590,6 +610,12 @@
 				return ENXIO;
 			}
 
+			/*
+			 * My Panasonic CF-M2EV needs resetting device
+			 * before checking mixer is present or not.
+			 * t.ichinoseki@nifty.com.
+			 */
+			nm_wr(sc, 0, 0x11, 1); /* reset device */
 			if ((nm_rd(sc, NM_MIXER_PRESENCE, 2) &
 				NM_PRESENCE_MASK) != NM_PRESENCE_VALUE) {
 				i = 0;	/* non-ac97 card, but not listed */

----Next_Part(Sun_Feb_17_23:31:23_2002_586)----
