wd1100.c: Can't register sysctl [GURU KERNEL] - Divers - Linux et OS Alternatifs
Marsh Posté le 15-09-2006 à 04:02:18
Code :
|
Marsh Posté le 15-09-2006 à 22:41:16
Je suis sur que quelqu'un dev un peu et pourrait m'expliquer
Marsh Posté le 15-09-2006 à 23:50:17
ctrl+F =
wd_table_header = register_sysctl_table(wd_root_table, 1);
if (wd_table_header == NULL)
printk(KERN_ERR "wd1100.c: Can't register sysctl.\n" );
}
c'est l'err wd_table_header
Ok ok je sort...
Marsh Posté le 16-09-2006 à 00:22:58
Merci j'avais même déduit que soit la fonction n'a pas marché "register_sysctl_table" soit que la structure "wd_root_table" qui a été passée à la fonction n'etait pas valide.
J'ai pa su aller plus loin par contre
Ok ok je sors aussi...
Marsh Posté le 16-09-2006 à 00:54:51
moi j'ai regarder un peu, je mettrais bien un 0 à la place du 1 dans l'appel de register_sysctl_table. Sinon c'est pas facile de trouver de la doc sur sysctl donc ...
je sort
edit: tout bien réfléchis ça devrais pas changer grand chose. Sinon le problème c'est qu'il n'arrive pas à créer les fichiers de controle dans /proc/sys/dev ...
Marsh Posté le 16-09-2006 à 00:58:54
ellimac a écrit : moi j'ai regarder un peu, je mettrais bien un 0 à la place du 1 dans l'appel de register_sysctl_table. Sinon c'est pas facile de trouver de la doc sur sysctl donc ... |
Tu as une raison pour mettre un 0 au lieu de 1 ?
Marsh Posté le 16-09-2006 à 01:30:05
Code :
|
Sinon essaye de remplacer les déclaration de la ligne 110 à 132 par ce code là ( modulo mes éventuels erreur de frappe )
Marsh Posté le 16-09-2006 à 01:37:37
Je teste ca immédiatement
PS : C'est normalisé cette indentation, c'est très étrange ?
Marsh Posté le 16-09-2006 à 01:42:28
j'ai trouvé ça dans d'autres fichiers source du kernel et j'ai adapter à ton cas en croisant les doigts. L'indentation j'ai pas trop fait gaffe mais grosso modo c'étais présenter comme ça, et les .clt_name et autre ça permet de nommer les champs directement pour être sur que tout est au bon endroit.
Marsh Posté le 16-09-2006 à 01:44:52
ni l'un ni l'autre, enfin juste un module qui fait rien pour l'école d'ingé ...
Marsh Posté le 16-09-2006 à 01:45:17
CC [M] drivers/char/watchdog/wd1100.o |
Ca passe pas
Marsh Posté le 16-09-2006 à 01:47:03
date = data , désolé pour la faute de frappe, et il manque quelque virgule, j'ai corrigé
Marsh Posté le 16-09-2006 à 01:49:50
J'ai corrigé aussi, mci
Le module est passé je termine le build du kernel et je le test sur la machine !
Marsh Posté le 16-09-2006 à 02:11:53
Tu as raison il est temps d'aller dormir
Merci pour ton aide en tout cas, si tu as d'autre idées n'hésite pas.
Etant donné que cette watchdog n'est présente que sur les Geode SC1100 d'AMD je ne trouve aucune info part google...
Marsh Posté le 16-09-2006 à 02:13:29
t'as bien CONFIG_SYSCTL=y dans ton .config ? on sait jamais
Marsh Posté le 16-09-2006 à 02:22:13
Oops
/me se frappe la tête contre le clavier
Je rebuild avec le support sysctrl, ca risque de mieux marcher...
Merci beaucoup
Marsh Posté le 16-09-2006 à 02:46:27
Le moduel s'insere maintenant sans message cependant il ne fait rien
J'ai créé /dev/watchdog et j'ai inseré le module de cette facon :
modprobe wd1100 sysctl_wd_graceful=0 sysctl_wd_timeout=30 |
Evidemment au bout de 30sec, aucun reboot matériel (je n'ai pas le demon watchdog installé).
Une idée ?
Marsh Posté le 16-09-2006 à 12:50:38
je pense que tu dois avoir besoin du demon, car d'apres les commentaires dans le code, le reglage du watchdog se fait à l'ouverture du péripherique.
Marsh Posté le 16-09-2006 à 13:16:05
Tu pourrais m'expliquer ou ca se fait dans le code, j'essaye de comprendre si possible
Je ne vois aucun références à /dev/watchdog ??
Marsh Posté le 16-09-2006 à 13:25:58
En fait pour l'écriture d'un module du noyau, il y a 4 méthode obligatoire si mes souvenirs sont bons, register, unregister, open, release. register s'éxécute au chargement du module, unregister au déchargement du module, open quand un processus ouvre le peripherique, release quand il le ferme ( bizarre il me semblais que c'étais close) donc ici on a wd_register, wd_unregister, wd_open, wd_release. dans le code wd_open, on a une indication comme quoi c'est reset_wd qui démarre le watchdog, et il n'y a pas d'appel à reset_wd dans wd_register, j'en déduis donc quand tant que le peripherique n'a pas été ouvert, le watchdog fonctionne pas malgré que le module soit chargé.
Marsh Posté le 16-09-2006 à 16:24:57
Merci beaucoup pour ton aide
Le module est maintenant fonctionnel. Si je fais un echo vers le dev, 30 sec apres ca reboot hard et au rebot le module m'indique que le dernier reboot à été provoqué par la watchdog
Plus qu'a mettre le démon en place heheh !
PS : Tu crois que c'est possible de compiler ce module de facon indépendante ? Pour l'instant il est distribué sous forme de patch sur les sources du kernel.
J'ai essayé d'écrire un Makefile mais c'est pas concluant...
Marsh Posté le 16-09-2006 à 16:27:50
Code :
|
Marsh Posté le 16-09-2006 à 20:33:14
Code :
|
c'est un peu minimal mais c'est ce que j'utilisais, tu peut peut-être t'en inspirer pour corriger le tien.
cela dis il y a peut-être des corrections à faire dans le source, j'ai un unresolve symbol au chargement sur verify_area.
Marsh Posté le 16-09-2006 à 21:55:21
Il y'a sans doute des modifs à faire, tout ce que je peux dire c'est qu'il roule sur le 2.6.15 vanilla.
Merci pour ton aide encore une fois
Marsh Posté le 16-09-2006 à 22:02:09
KVERS = $(shell uname -r) |
Voila un Makefile qui roule
Quand j'essaye de le build contre un 2.6.17 je me prend ces erreurs :
gandalf@hellscream:~/devel/wd1100$ make |
Tu peux me donner une piste ?
Marsh Posté le 17-09-2006 à 00:23:31
il faut remplacer les lignes
Code :
|
par
Code :
|
bon évidemment je ne peut pas tester, j'ai pas le matériel en question, mais bon ça compile sur mon 2.6.17
Marsh Posté le 17-09-2006 à 01:42:00
gandalf@hellscream:~/devel/wd1100$ make |
Pas mieux
Marsh Posté le 17-09-2006 à 11:43:35
euh t'a bien changé toute la ligne, la case compte en C, il suffit pas de rajouter int et uint dans la macro. Sinon c'est que j'ai fait une autre modification pour que ça compile mais là je vois pas.
Marsh Posté le 17-09-2006 à 12:27:19
Oui j'ai bien tout remplacer
Tu peux me filer ton source ?
Si tu sais pas ou le mettre : gandalf_at_le-vert_dot_net
Marsh Posté le 17-09-2006 à 12:34:01
ok, je te l'ai envoyé, tu me dira quand même ce que j'ai changé pasque là je vois pas du tout.
Marsh Posté le 17-09-2006 à 13:31:33
Erreur de typo, s/parm/param/
Sinon il y'a ca comme différence encore
- i = access_ok(VERIFY_WRITE, (void *)arg, sizeof(struct watchdog_info)); |
Tu peux me transmettre ton nom et ton mail pour que je t'ajoute au copyright et au changelog ?
Marsh Posté le 17-09-2006 à 13:38:54
pour cette différence laisse access_ok, j'ai pas du partir du même patch que toi. je t'envoie le reste par mail.
Marsh Posté le 17-09-2006 à 13:39:37
printk(KERN_ERR "wd1100.c: Can't register sysctl.\nwd1100.c: Is this kernel built with CONFIG_SYSCTL=y ?\n" ); |
Elle ne te pose pas de problèmes cette ligne ?
Marsh Posté le 17-09-2006 à 13:54:42
ça ne devrais pas poser de problème, juste s/nwd1100.c/wd1100.c . On pourrais aussi modifier le source pour ne pas être obligé d'utiliser sysctl.
Marsh Posté le 15-09-2006 à 03:53:06
Je m'amuse un peu sur de l'embarqué (WRAP de chez pc-engines) et je bloque sur le dernier truc.
La carte est dotée d'une watchdog wd1100. J'ai trouvé un patch porté sur le 2.6 par voyage-linux. Ca patch et ca build bien.
Cependant une fois que j'insère le module je me mange un "wd1100.c: Can't register sysctl"
Qu'est ce que ca signifie ?
Voici le code qui arrive à cette erreur :
ret = misc_register(&sc1x00wd_miscdev);
if (ret)
printk(KERN_ERR "wd1100.c: Can't register device.\n" );
else
{
wd_table_header = register_sysctl_table(wd_root_table, 1);
if (wd_table_header == NULL)
printk(KERN_ERR "wd1100.c: Can't register sysctl.\n" );
}
Pourriez vous m'expliquer ce qui se passe ?
Merci