Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 28 Aug 2003 23:25:10 +0200 (CEST)
From:      Mikulas Patocka <mikulas@artax.karlin.mff.cuni.cz>
To:        Dan Lukes <dan@obluda.cz>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: Bug FreeBSD 4.8 ATA driver
Message-ID:  <Pine.LNX.4.44.0308271545120.22196-100000@artax.karlin.mff.cuni.cz>
In-Reply-To: <3F4B5374.1080306@obluda.cz>

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


On Tue, 26 Aug 2003, Dan Lukes wrote:

> Mikulas Patocka napsal/wrote, On 08/20/03 01:39:
> > I am reading FreeBSD ATA drivers because I want to use them as base for my
> > ATA driver and I found a total nonsence: in ata-dma.c in FreeBSD 4.8,
> > there is line
> >
> > if (!((pci_read_config(parent,0x40,4)>>(ch->unit<<8))&0x4000)) {
> >
> > if ch->unit is 1, config word is shifted by 256 bytes, which gives
> > undefined result in C. How was this meant? What should it do?
>
> 	Hm, it should be (IMHO)
> if (!((pci_read_config(parent,0x40,4)>>(ch->unit<<5))&0x4000))

That is incorrect too --- if ch->unit is 1, ch->unit<<5 is 32 and you
can't shift 32-bit integer by 32 bits.

> 	but I can't verify it as have no access to documentation for PIIX3 nor
> acces to the PIIX3 hardware now.
>
> 	Note the position of '8' just above the '5' key on numeric keypad also ...
>
> 	FYI, the gcc compile the code as equivalent of
> if (!((pci_read_config(parent,0x40,4)>>(0))&0x4000))
> 	effectively ignoring the ch->unit number.
>
>
> 	If you want wrote your own ATA driver, it may be better to look into
> current FreeBSD 5 ATA code - it's substantially rewrited.

I noticed it too late --- when I copid all code from FreeBSD 4 :-/

> 	A smel bych, uz asi mimo konferenci, vedet, proc si pises vlastni ATA
> ovladac ?

No, zatim to neni moc verejny projekt.

Mikulas




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.LNX.4.44.0308271545120.22196-100000>