From owner-FreeBSD-users-jp@jp.freebsd.org  Sun Jan 16 05:24:33 2000
Received: (from daemon@localhost)
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) id FAA21152;
	Sun, 16 Jan 2000 05:24:33 +0900 (JST)
	(envelope-from owner-FreeBSD-users-jp@jp.FreeBSD.org)
Received: from cocoa.ocn.ne.jp (cocoa.ocn.ne.jp [210.145.254.73])
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) with ESMTP id FAA21147
	for <freebsd-users-jp@jp.freebsd.org>; Sun, 16 Jan 2000 05:24:32 +0900 (JST)
	(envelope-from yuki@fsinet.or.jp)
Received: from localhost (gw.ambrella.co.jp [210.160.69.179])
	by cocoa.ocn.ne.jp (8.9.1a/OCN) with ESMTP id FAA01527
	for <freebsd-users-jp@jp.freebsd.org>; Sun, 16 Jan 2000 05:24:32 +0900 (JST)
Message-Id: <200001152024.FAA01527@cocoa.ocn.ne.jp>
Date: Sun, 16 Jan 2000 05:24:01 +0900 (JST)
From: yuki@fsinet.or.jp (ITO Takayuki)
To: freebsd-users-jp@jp.freebsd.org
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-2022-JP
Reply-To: FreeBSD-users-jp@jp.freebsd.org
Precedence: list
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+990727
X-Sequence: FreeBSD-users-jp 48977
Subject: [FreeBSD-users-jp 48977] patch for NEC ATAPI CD changer
Errors-To: owner-FreeBSD-users-jp@jp.freebsd.org
Sender: owner-FreeBSD-users-jp@jp.freebsd.org
X-Originator: yuki@fsinet.or.jp

NEC$B$N(BATAPI 4$BG\B.(B4$BO"Au(BCD-ROM$B%I%i%$%V$rF0$+$9$3$H$,$G$-$^$7$?$N$GJs9p$7(B
$B$^$9!#(B

$B$b$N$O(BNEC PC-CD400D/4$B$H$$$&%9%m%C%H%$%s%?%$%W$N9u$$O"Au%I%i%$%V$G!"(B

wdc0: unit 1 (atapi): <NEC                 CD-ROM DRIVE:251/4.0E>, removable, iordy

$B$HI=<($5$l$k$b$N$G$9!#(B

3.3-RELEASE$B$GF0$+$7$F$_$^$7$?$,!"5/F0;~$K0J2<$N$h$&$J%(%i!<$,=P$F!"O"(B
$BAu%I%i%$%V$G$"$k$3$H$,G'<1$5$l$:!"(B1$BKgL\$7$+;H$($^$;$s!#(B

wdc0: unit 1 (atapi): <NEC                 CD-ROM DRIVE:251/4.0E>, removable, iordy
atapi0.1: unknown phase
atapi0.1: invalid command phase, ireason=0xd8, status=d8<busy,ready,opdone,drq>, error=d8<mchg>
atapi0.1: controller not ready for cmd
atapi0.1: controller not ready for cmd
atapi0.1: controller not ready for cmd

$BD4$Y$F$_$?$H$3$m!"(B/sys/i386/isa/atapi.c$B$N(Batapi_request_immediate()$B$G!"(B
ATAPI$B%3%^%s%I%Q%1%C%H$rAw$C$F$+$i%G!<%?E>Aw%U%'!<%:$K0\$k$H$3$m$G!"@)(B
$B8f?.9f$r8+$F%U%'!<%:$NA+0\$r8!=P$7$F$$$^$9$,!"$3$N$H$-(BBUSY$B?.9f$,9_$j$k(B
$B$N$r8+FO$1$F$$$J$$$?$a$K@hAv$C$F%3%1$F$7$^$&$h$&$G$9!#(B

$B$H$$$&$o$1$G!"0J2<$N$h$&$KD>$7$F$_$^$7$?!#(B

--- /sys/i386/isa/atapi.c.orig	Tue Aug 31 03:37:43 1999
+++ /sys/i386/isa/atapi.c	Sat Jan 15 23:42:19 2000
@@ -940,7 +940,7 @@
 	char *addr, int count)
 {
 	struct atapicmd cmdbuf, *ac = &cmdbuf;
-	int cnt;
+	int cnt, phase;
 
 	ac->cmd[0] = cmd;       ac->cmd[1] = a1;
 	ac->cmd[2] = a2;        ac->cmd[3] = a3;
@@ -969,12 +969,27 @@
 	if (atapi_start_cmd (ata, ac) >= 0 && atapi_wait_cmd (ata, ac) >= 0) {
 		/* Send packet command. */
 		atapi_send_cmd (ata, ac);
+		if (ata->debug) {
+			phase = ((inb (ata->port + AR_IREASON) & (ARI_CMD | ARI_IN)) |
+		   	 (inb (ata->port + AR_STATUS) & (ARS_DRQ | ARS_BSY)));
+			printf ("atapi%d.%d: phase %d\n", 
+				ata->ctrlr, ac->unit, phase);
+		}
 
 		/* Wait for data i/o phase. */
 		for (cnt=20000; cnt>0; --cnt)
-			if (((inb (ata->port + AR_IREASON) & (ARI_CMD | ARI_IN)) |
-			    (inb (ata->port + AR_STATUS) & ARS_DRQ)) != PHASE_CMDOUT)
+		{
+			/* BUSY check added for slow CD-ROM drives */
+			/* by ITO Takayuki <yuki@fsinet.or.jp> */
+			phase = ((inb (ata->port + AR_IREASON) & (ARI_CMD | ARI_IN)) |
+			    (inb (ata->port + AR_STATUS) & (ARS_DRQ | ARS_BSY)));
+			if (phase == PHASE_DATAIN || phase == PHASE_DATAOUT ||
+			    phase == PHASE_COMPLETED || phase == PHASE_ABORTED)
 				break;
+		}
+		if (ata->debug)
+			printf ("atapi%d.%d: phase %d\n", 
+				ata->ctrlr, ac->unit, phase);
 
 		/* Do all needed i/o. */
 		while (atapi_io (ata, ac))

$B$3$l$G!"0J2<$N$h$&$K$-$l$$$KG'<1$5$l!"(B4$BKg$H$bF0:n$9$k$h$&$K$J$j$^$7$?!#(B

wdc0: unit 1 (atapi): <NEC                 CD-ROM DRIVE:251/4.0E>, removable, iordy
acd0: drive speed 689KB/sec, 128KB cache
acd0: supported read types: CD-DA
acd0: Audio: play, 255 volume levels
acd0: Mechanism: ejectable changer, unlocked
acd0: changer slot 0 no disk
acd1: changer slot 1 disk present
acd2: changer slot 2 disk present
acd3: changer slot 3 disk present

# $B$H$O$$$(!"(B1$BKg$G$b%^%&%s%H$7$F$"$k$HB>$N%9%m%C%H$b8r496X;_$K$J$k$h$&$G!"(B
# $B0U30$HIT<+M3$G$9!#(B

$B$A$J$_$K!":#$^$GLdBj$J$/F0$$$F$$$?B>$N%^%7%s$N%I%i%$%V(B(TEAC 40x $BHsO"Au(B)
$B$K$bE,MQ$7$F$_$^$7$?$,!"$A$g$C$H;n$7$?$H$3$m$G$O0-1F6A$O$J$$$h$&$G$9!#(B

--
$B0KF#N49,(B ITO, Takayuki
mailto:yuki@fsinet.or.jp, yuki@dayo.ne.jp
http://hp.vector.co.jp/authors/VA001240/
