[Kos-dev] ATA, probleme

Christophe kos-dev@enix.org
Thu, 14 Feb 2002 12:57:19 +0100


1)J'ai noté que tu écrivais dans le registre ATA_ERROR or il s'agit d'un
registre de lecture seulement. A l'écriture, il agit comme le registre
ATA_FEATURES qui n'a évidemment pas du tout la même fonction. En fait rien
ne te garantit que le contrôleur ATA utilise le même registre pour cette
adresse en lecture et écriture (même raisonnement que pour ATA_STATUS et
ATA_COMMAND ou ATA_ALTERNATE_STATUS et ATA_DEVICE_CONTROL). Cela dit, est-ce
la raison du disfonctionnement ? c'est un peu prématuré de le penser. Je ne
sais pas où tu as trouvé ce test mais je n'ai jamais rien trouvé de tel dans
les documents officiels ATA/ATAPI, donc je te déconseille de l'utiliser.
Vérifie plutôt les quatres registres ATA_SC,ATA_SN,ATA_CL et ATA_CH en les
modifiant et les relisant.

2) La valeur de 0xF8 pour tes registres de status dans ta routine 'init_ide'
m'inquiètent, car c'est bien la première fois que je vois ça. Es-tu sûr de
faire quelque chose de valide à ce niveau là ? est-ce que tu te conformes
aux protocoles qui te sont donnés dans les documents officiels ATA/ATAPI ?

3) J'ai lu ta routine 'add_ide_op_polled_mode' et je ne vois rien qui puisse
empêcher le LBA de fonctionner. Cependant assures-toi que le flag
HARDDISK_LBA_CAPABLE soit bien actif, déjà (chose que tu ne me confirmes pas
dans ton e-mail). D'autres part, il se peut que certains disques durs se
disent LBA (les sources de Linux vérifie ce cas) et ne le sont pas en
réalité, mais je doute que ce soit le cas ici.

4) Apparemment, quand tu lis le secteur 64 (c'est à dire un secteur qui ne
se trouve pas dans le même cyclindre ou même tête - je ne sais plus
trop...), tu obtiens une erreur. Or c'est précisément l'erreur que tu
obtiendrais en CHS (ça m'est déjà arrivé !). En effet, il trouvera une
valeur invalide pour ATA_SECTOR_NUMBER.

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

/hlide

----- Original Message -----
From: <thomas.petazzoni@enix.org>
To: <kos-dev@enix.org>
Sent: Monday, February 11, 2002 6:23 PM
Subject: [Kos-dev] ATA, probleme


> salut a tous,
>
> j'ai une question, plutot pour Hlide, mais si d'autres savent, c'est
> tout aussi bien.
>
> lorsque j'utilise le mode d'adressage des secteurs CHS
> (cylinder/head/sector) ca marche nickel, je peux lire n'importe quel
> secteur du disque, decoder la table des partitions, et les tables des
> partitions etendues.
>
> par contre, quand j'utilise le mode d'adressage LBA, quelque soit le
> secteur que je veux lire, ca me renvoie toujours le contenu du secteur
> 0. Ca me permet de lire la table des partitions, mais pas de lire
> d'autres secteurs. Ce qui est un peu ennuyeux. Je suis sur que
> l'ordinateur sur lequel je teste supporte le LBA car Linux utilise le
> LBA (j'ai modifie le noyau pour qu'il me dise si oui ou non il utilise
> le LBA).
>
> Je joins le code, la partie interessante pour cette question etant
> dans add_ide_op_polled_mode.
>
> Merci bcp
>
> Thomas


----------------------------------------------------------------------------
----


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