Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 6 Oct 1996 00:17:10 -0300 (EST)
From:      dcs@gns.com.br
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   i386/1730: ATAPI driver does not work with HITACHI CDR-7730
Message-ID:  <199610060317.AAA00626@daniel.sobral>
Resent-Message-ID: <199610060320.UAA03424@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         1730
>Category:       i386
>Synopsis:       SFF8020 violation and silly bug in atapi.c hinder it's working with HITACHI CDR-7730
>Confidential:   no
>Severity:       serious
>Priority:       high
>Responsible:    freebsd-bugs
>State:          open
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sat Oct  5 20:20:02 PDT 1996
>Last-Modified:
>Originator:     Daniel C. Sobral
>Organization:
>Release:        FreeBSD 2.2-961004-SNAP i386
>Environment:

	
960801-SNAPSHOT with current (961004) kernel and HITACHI CDR-7730
CD-ROM drive (slave in secondary IDE).

>Description:

	
The drive gets recognized but wcd_describe is rarely called, and
even when that happens you can't mount the drive.

This happens because a DELAY is missing in one loop, and ARS_BSY
flag is being ignored in another (atapi_request_immediate and
atapi_wait_cmd functions).

>How-To-Repeat:

	
Install an HITACHI CDR-7730 CD-ROM drive as slave in the secondary IDE
(well, I haven't tried other setups... :), configure ATAPI options in the
kernel, reboot.

dmesg | grep wcd0			#Shows nothing most of the time
mount -t cd9660 -r /dev/wcd0c /mnt	#Won't work

>Fix:
	
	
Apply this patch (unified diff):


--- atapi.c	1996/10/05 21:06:44	1.1
+++ atapi.c	1996/10/06 02:25:16	1.1.1.2
@@ -585,7 +585,7 @@
 		ireason = inb (ata->port + AR_IREASON);
 		ac->result.status = inb (ata->port + AR_STATUS);
 		phase = (ireason & (ARI_CMD | ARI_IN)) |
-			(ac->result.status & ARS_DRQ);
+			(ac->result.status & (ARS_DRQ|ARS_BSY));
 		if (phase == PHASE_CMDOUT)
 			break;
 		DELAY (10);
@@ -898,8 +898,11 @@
 		while (atapi_io (ata, ac))
 			/* Wait for DRQ deassert. */
 			for (cnt=2000; cnt>0; --cnt)
+				{
 				if (! (inb (ata->port + AR_STATUS) & ARS_DRQ))
 					break;
+				DELAY(10);
+				}
 	}
 	return (ac->result);
 }
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199610060317.AAA00626>