Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 15 Jul 2002 10:43:12 +0930
From:      Benjamin Close <cisbjc@cs.unisa.edu.au>
To:        Kirill Bezzubets <kirill@solaris.ru>
Cc:        freebsd-mobile@FreeBSD.ORG, sos@FreeBSD.ORG, "Greg 'groggy' Lehey" <grog@FreeBSD.ORG>
Subject:   Re: 4.6 CDROM cannot mount /dist on Dell Inspiron 8000
Message-ID:  <3D3221A8.4010403@cs.unisa.edu.au>
References:  <20020714142633.A4349@gilberto.physik.rwth-aachen.de> <20020714190148.A92810@solaris.ru> <20020714190851.A5235@gilberto.physik.rwth-aachen.de> <20020714.122819.29173777.imp@bsdimp.com> <20020714231512.A92930@solaris.ru>

next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------010603060100090607020708
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit

Kirill Bezzubets wrote:

>On Sun, Jul 14, 2002 at 12:28:19PM -0600, M. Warner Losh wrote:
>
>  
>
>>In message: <20020714190851.A5235@gilberto.physik.rwth-aachen.de>
>>            Christoph Kukulies <kuku@accms33.physik.rwth-aachen.de> writes:
>>: > > Error mounting /dev/acd0c on /dist: No such file or directory(2) (100%)
>>...
>>: > Are you sure there's "/dist" exist in your filesystem?
>>: > It is neccessary mount point to perform install/upgrade.
>>: 
>>: Yes, it exists, that's for sure. And it's directory.
>>
>>Hey Kuku!  What does dmesg say?  Is there a acd0 listed?  Do you have
>>a /dev/acd0c in your /dev tree?
>>
>>    
>>
>
>Once again, what dmesg says (preferable booting kernel -v),
>and what does "mount_cd9660 -v /dev/acd0c /cdrom" do? I mean manual mount.
>If it works, is mounting manually at "/dist" fails or not?
>
>  
>
I have a very similar problem where acd0 is not detected without a 
kernel patch either on 4.6 or -current on an early Dell i8000.
I tracked the problem down to reading the status registers on the drive. 
If they are read out of order, after issuing a status command the drive 
will return corrupt data from the later registers. The ata spec does not 
define what order the registers should be read in hence either way 
*should* work. So it appears to be a firmware bug in the drive. However, 
I think reading the registers in order makes a lot of sense. The patch 
(against -current), submitted to sos a number of times, but seemingly 
ignored is attached. Without it I have no cdrom drive with it I get:

Jul  8 16:15:34 draco kernel: acd0: DVD-ROM <TOSHIBA DVD-ROM SD-C2402> 
at ata0-slave UDMA33

It truely would be nice if this was integrated into the kernel as I hate 
having to patch it every time.

Cheers,
    Benjamin

-- 
3D Research Associate                            +61 8 8302 3669
School of Computer and Information Science       Room D1-07, Levels Campus
University of South Australia                    Mawson Lakes Blvd.
Benjamin.Close@cs.unisa.edu.au                   South Australia, 5095
F00D C83D 5F7E 5561 DF91  B74D E602 CAA3 4842 B5B4



--------------010603060100090607020708
Content-Type: text/plain;
 name="cdromPatch.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="cdromPatch.diff"

--- ata-all.c	Sun Jun  9 07:03:42 2002
+++ ata-all.c.new	Fri May 31 09:17:55 2002
@@ -755,11 +755,13 @@
 	if (stat0 & ATA_S_BUSY) {
 	    ATA_OUTB(ch->r_io, ATA_DRIVE, ATA_D_IBM | ATA_MASTER);
 	    DELAY(10);
+	    /* Check the registers in the order defined in the standard
+	       some drives corrupt earlier registers if they are not read
+               before later registers */
+	    lsb = ATA_INB(ch->r_io, ATA_CYL_LSB);
+	    msb = ATA_INB(ch->r_io, ATA_CYL_MSB);
 	    stat0 = ATA_INB(ch->r_io, ATA_STATUS);
 	    if (!(stat0 & ATA_S_BUSY)) {
-		/* check for ATAPI signature while its still there */
-		lsb = ATA_INB(ch->r_io, ATA_CYL_LSB);
-		msb = ATA_INB(ch->r_io, ATA_CYL_MSB);
 		if (bootverbose)
 		    ata_printf(ch, ATA_MASTER, "ATAPI %02x %02x\n", lsb, msb);
 		if (lsb == ATAPI_MAGIC_LSB && msb == ATAPI_MAGIC_MSB)
@@ -769,11 +771,13 @@
 	if (stat1 & ATA_S_BUSY) {
 	    ATA_OUTB(ch->r_io, ATA_DRIVE, ATA_D_IBM | ATA_SLAVE);
 	    DELAY(10);
+	    /* Check the registers in the order defined in the standard
+	       some drives corrupt earlier registers if they are not read
+               before later registers */
+	    lsb = ATA_INB(ch->r_io, ATA_CYL_LSB);
+	    msb = ATA_INB(ch->r_io, ATA_CYL_MSB);
 	    stat1 = ATA_INB(ch->r_io, ATA_STATUS);
 	    if (!(stat1 & ATA_S_BUSY)) {
-		/* check for ATAPI signature while its still there */
-		lsb = ATA_INB(ch->r_io, ATA_CYL_LSB);
-		msb = ATA_INB(ch->r_io, ATA_CYL_MSB);
 		if (bootverbose)
 		    ata_printf(ch, ATA_SLAVE, "ATAPI %02x %02x\n", lsb, msb);
 		if (lsb == ATAPI_MAGIC_LSB && msb == ATAPI_MAGIC_MSB)

--------------010603060100090607020708--


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-mobile" in the body of the message




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