Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 31 Aug 1995 11:24:03 -0500
From:      Jon Loeliger <jdl@chrome.onramp.net>
To:        Bruce Evans <bde@zeta.org.au>
Cc:        hackers@freebsd.org
Subject:   Re: More ATAPI -- possible insight into probe problems...? 
Message-ID:  <199508311624.LAA02661@chrome.onramp.net>
In-Reply-To: Your message of "Thu, 31 Aug 1995 05:17:15 %2B1000." <199508301917.FAA18876@godzilla.zeta.org.au> 

next in thread | previous in thread | raw e-mail | index | archive | help
Apparently, Bruce Evans scribbled:
> I asked:
> >So who can tell me any details about that lovely weak check for R/W
> >registers that appears to be failing for me?  Simple things like:
> 
> >    - Is this a valid register for a CDROM drive too? Ie, is this check
> >      tacitly assuming a hard disk beneath it?
> >    - Is it subject to timing problems?
> >    - It *claims* to be "too weak", however it appears to be too strong!
> 
> It's too weak for ST506...EIDE controllers with normal drives attached.
> These all have read/write registers, so the inb() should return what
> was written.  That used to be tested for, but someone weakened the
> test without documenting why.

Why not test agains the value written then instead of a 0xff...?

>  I don't know what happens for CDROM drives.

Er, I wonder too.  In particular, when it is on a bus that also
has a disk on it, it appears to work fine.  When on a bus as the
sole device, it appears to fail (for me).

> The point of the test is to attempt to limit the damage if there is
> a device other than an ST506...EIDE controller behind the port.  It
> is far too weak for that (if 0xff wasn't so magic, then the test
> would have much less than a 1/256 chance of detecting conflicts).  
> Even if it tested for `== 0xa5', then any device with a read/write
> port at the probed address would pass the test.

I looked at the ATAPI spec, and there is supposed to be a R/W address
there.  Even for the CDROM, it appears like 0x170 + 4 was R/W.  I
wonder, however, if it was subject to timing and/or validity checks
that prevent it from being arbitrarily read/written.

Is the ST506 on the motherboard or on a drive?  Do I have one?  I
looked on the motherboard, and I can find a Big Chip (tm) near the
ribbon cables labled FDC37C665GT made by SMC.  Floppy Disc Controller?
Couldn't find anything with ST506 on it.

This is a DELL P90 Dimension XPS. It's got a "PCIset" of chips on it too...
BTW, I see:
  fdc0: NEC 72065B
  chip0 <Intel 82434NX (Neptune) PCI cache memory controller> rev 17 on pci0:0
  chip1 <Intel 82378IB PCI-ISA bridge> rev 67 on pci0:2



> The test is very sloppy.  It should do something like:

Looks like you've been here before! :-)  Should your code be
added to the driver?  Or, perhaps, why *shouldn't* your code
be added?


> Then the test would be stronger and your CDROM would be sure to fail :-).

I laughed out loud at this point!

Removing this test does allow the device to be recognized and probe()-able.
However, it still totally fails to attach().  I noticed this comment in
the TODO section of wd.c:

/* TODO:
 *      o Satisfy ATA timing in all cases.
 *
 *      o Don't use polling except for initialization.  Need to
 *        reorganize the state machine.  Then "extra" interrupts
 *        shouldn't happen (except maybe one for initialization).

It's this last one that worries me, because I think that is the one
that is stopping this code from working for myself and at least one
other person (Steve).

The debug trace shows:

wdc1 at 0x170-0x177 irq 15 on isa
atapi1.0 at 0x170: attach called
wdc1: unit 0 (atapi): <NEC                 CD-ROM DRIVE:260>, removable, cmd16
    [info deleted]
atapi1.0: req im 5a-0-2a-0-0-0-0-0-18-0-0-0-0-0-0-0 len=24
atapi1.0: start
atapi1.0: send cmd 5a-0-2a-0-0-0-0-0-18-0-0-0-0-0-0-0
atapi1.0: intr ireason=0x1, len=24, status=48<ready,drq>, error=0
atapi1.0: phase cmdout
atapi1.0: send cmd 5a-0-2a-0-0-0-0-0-18-0-0-0-0-0-0-0
atapi1.0: intr ireason=0x3, len=24, status=41<ready,check>, error=64<abort>
atapi1.0: phase complete
atapi1.1 at 0x170: attach called
atapi.1 at 0x170: no device

Here, I think the problem is a joint bobbling by atapi_request_immediate(),
atapi_send_cmd() and atapi_io().  If a_r_i() is doing the a_s_c() call,
why does wait_io() think it should too?

        /* Start packet command, wait for DRQ. */
        if (atapi_start_cmd (ata, ac) >= 0 && atapi_wait_cmd (ata, ac) >= 0) {
                /* Send packet command. */
                atapi_send_cmd (ata, ac);

                /* Do all needed i/o. */
                while (atapi_io (ata, ac))
                        /* Wait for DRQ deassert. */
                        for (cnt=2000; cnt>0; --cnt)
                                if (! (inb (ata->port + AR_STATUS) & ARS_DRQ))
                                        break;  
        }


Might there be a needed "wait for clear flags" before the atapi_io()
happens?  Is this atapi_send_cmd() just simply not needed here?

I removed the call to atapi_send_cmd() and got this instead:

atapi1.0: req im 5a-0-2a-0-0-0-0-0-18-0-0-0-0-0-0-0 len=24
atapi1.0: start
atapi1.0: intr ireason=0x1, len=24, status=48<ready,drq>, error=0
atapi1.0: phase cmdout
atapi1.0: send cmd 5a-0-2a-0-0-0-0-0-18-0-0-0-0-0-0-0
atapi1.0: intr ireason=0x3, len=24, status=41<ready,check>, error=64<abort>
atapi1.0: phase complete
atapi1.1 at 0x170: attach called
atapi.1 at 0x170: no device

So, that clearly isn't the straight up answer...  Oh well.

Well then, all this begs the simple questions...

    - Anyone else fixed this one yet?
    - Am I the only one who sees a problem with the IDE CDROM?
    - Will 2.1 contain this driver code -- fixed or broken?

I personally am at a bit of a loss to actually change this code
in any significant way.

jdl



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