[Kos-dev] ATA, probleme

kos-dev@enix.org kos-dev@enix.org
14 Feb 2002 13:38:39 +0100


"Christophe" <hlide@club-internet.fr> writes:

> 1)J'ai not=E9 que tu =E9crivais dans le registre ATA_ERROR or il s'ag=
it d'un
> registre de lecture seulement. A l'=E9criture, il agit comme le regis=
tre
> ATA_FEATURES qui n'a =E9videmment pas du tout la m=EAme fonction. En =
fait rien
> ne te garantit que le contr=F4leur ATA utilise le m=EAme registre pou=
r cette
> adresse en lecture et =E9criture (m=EAme raisonnement que pour ATA_ST=
ATUS et
> ATA_COMMAND ou ATA_ALTERNATE_STATUS et ATA_DEVICE_CONTROL). Cela dit,=
 est-ce
> la raison du disfonctionnement ? c'est un peu pr=E9matur=E9 de le pen=
ser. Je ne
> sais pas o=F9 tu as trouv=E9 ce test mais je n'ai jamais rien trouv=
=E9 de tel dans
> les documents officiels ATA/ATAPI, donc je te d=E9conseille de l'util=
iser.
> V=E9rifie plut=F4t les quatres registres ATA_SC,ATA_SN,ATA_CL et ATA_=
CH en les
> modifiant et les relisant.
>=20
> 2) La valeur de 0xF8 pour tes registres de status dans ta routine 'in=
it_ide'
> m'inqui=E8tent, car c'est bien la premi=E8re fois que je vois =E7a. E=
s-tu s=FBr de
> faire quelque chose de valide =E0 ce niveau l=E0 ? est-ce que tu te c=
onformes
> aux protocoles qui te sont donn=E9s dans les documents officiels
> ATA/ATAPI ?

En ce qui concerne l'ecriture sur le port ATA_ERROR, c'est
effectivement pour ecrire dans ATA_FEATURE. Je sais que c'est crade,
mais le code n'a pas ete proprifie. Le but de cette instruction etait
simplement de voir si c'est ca qui foutait la merde.

Enfin en ce qui concerne l'initialisation, je me suis largement
inspire de FreeBSD.

> 3) J'ai lu ta routine 'add_ide_op_polled_mode' et je ne vois rien qui=
 puisse
> emp=EAcher le LBA de fonctionner. Cependant assures-toi que le flag
> HARDDISK_LBA_CAPABLE soit bien actif, d=E9j=E0 (chose que tu ne me co=
nfirmes pas
> dans ton e-mail). D'autres part, il se peut que certains disques durs=
 se
> disent LBA (les sources de Linux v=E9rifie ce cas) et ne le sont pas =
en
> r=E9alit=E9, mais je doute que ce soit le cas ici.

Je verifie ce cas aussi !

> J'ai peut-=EAtre une id=E9e ! et si tu re=E9crivais :
>   outb(ATA_D_IBM
>        | (harddisk->device =3D=3D MASTER) ? ATA_MASTER : ATA_SLAVE
>        | head,
>        ctrl->ioaddr + ATA_DRIVE);
> comme ceci :
>   outb(ATA_D_IBM
>        | ((harddisk->device =3D=3D MASTER) ? ATA_MASTER : ATA_SLAVE)
>        | head,
>        ctrl->ioaddr + ATA_DRIVE);
> car il se peut que ": ATA_SLAVE | head" soit lu comme ": (ATA_SLAVE|h=
ead)",
> ce qui n'est pas tout ce que tu recherches !

Effectivement c'etait ca l'erreur, je l'ai trouve tout seul hier soir
! (cf mes mails sur la mailing list).

ceci dit, je vais tenir compte de tes remarques concernant la phase
d'initialisation, et relire ce que dit la norme ATA.

Merci bcp

Thomas
--=20
PETAZZONI Thomas - thomas.petazzoni@enix.org - UIN : 34937744
(Perso)      http://www.enix.org/~thomas/
(KOS)        http://kos.enix.org/=20
(Club LinUT) http://club-linut.enix.org