[Kos-dev] encore une IRQ (2) !

Christophe kos-dev@enix.org
Mon, 4 Feb 2002 18:25:46 +0100


[You]
Voila le bout de code. De toute facon il ne rentre jamais dans les
boucles while d'attente d'effacement du bit BSY. Il est tout de suite
a 0 le bit BSY !

[I]
Il y a quand même un delay de 400 ns à respecter sinon tu lis la valeur du
registre Status d'avant la prise en compte de l'ordre. Mais bon, le problème
est peut-être ailleurs.

[You]
Concernant le delay d'attente de 1 micro seconde, c'est parce que j'ai
rien d'autre que usleep pour le moment. usleep marque le thread
comment etant endormi, et le reactive n microsecondes plus tard.

[I]
C'est bien ce que je pensais :)

[You]
Pour coder un truc plus precis (400ns), l'attente active ne
serait-elle pas plus appropriee ? (au lieu de marquer le thread comme
endormi, d'en choisir un autre, etc...). je ne me rends pas bien
compte que represente 400ns en nombre d'instructions.

[I]
Avec le SH1 du jukebox à 12 MHz, un cycle d'instruction fait environ 83 ns,
donc j'avais plus intérêt à faire de l'attente active. Et encore, je pouvais
enchaîner le transfert d'octet sur les registres sans mettre une pause !
dans ton cas, vu les fréquences qu'ont nos Intel ou AMD, il est fort
probable qu'un petite attente active soit nécessaire, mais ça reste à
vérifier.

[You]
  /* Attendre que le controleur soit pret */
  while(inb(ioaddr + ATA_STATUS) & ATA_S_BSY)
    {
      printk("Status is 0x%x\n", inb(ioaddr + ATA_ALTPORT));
      usleep(1);
    }
...

[I]
Je ne comprends pas comment la ligne INTRQ peut être activée !!! pourtant on
masque l'IRQ, on écrit le registre Device Control et on lit le registre
Statut - ce qui devrait remettre à zéro la ligne INTRQ bien avant de
démasquer l'IRQ. Il n'y a pas d'IRQ partagé entre plusieurs périphériques
??? il serait bon que tu donnes les détails sur ton contrôleur primaire
ainsi que les périphériques connectés.

Il faudrait que tu puisses scanner avant et après si l'IRQ est dans le
masque des IRQ en attente (durant la période de l'IRQ masqué), histoire de
comprendre vraiment à quel moment la ligne INTRQ est activée.