J'ai enfin réussi à faire marcher le wol avec ma carte réseau (rhine III, VT6105). Je ne pense pas que ça intéresse beaucoup de monde mais si j'ai une chance d'éviter les galères que j'ai eu, ne serait-ce qu'à une personne, ce sera déjà bien.
L'idée de départ est toute simple (merci à celui qui me l'a donnée), il faut changer de pilote.
J'ai donc cherché sur le net puis j'ai fini par trouver ça :
http://www.opendrivers.com/downloadopendrivers.php?href=37531
Il y a un sous-répertoire linux et dedans l'archive rhinefet.tar que l'on extrait pour avoir un répertoire intitulé "4.39". La chose s'annonce bien car on voit des fichiers tels que rhine_wol.c.
On trouve un fichier linux.txt dans lequel il est écrit :
This driver supports linux kernel version 2.2.x, 2.4.x and 2.6.x now.
En fait, je ne suis pas sûr qu'ils aient fait des tests avec un noyau 2.6 car dès lors qu'on essaie de compiler on fait face à trois problèmes :
- Première erreur : /4.39/rhine_main.c:2751: erreur: ?struct pci_dev? has no member named ?slot_name?
Référence :
http://cvs.sourceforge.net/viewcvs.py/gatos/km/km.c?rev=1.107&view=log
Il faut utiliser la macro pci_name() à la place. Ligne 2751 remplacer
strcpy(info.bus_info,pInfo->pcid->slot_name); par
strcpy(info.bus_info,pci_name(pInfo->pcid));
- Deuxième erreur : /4.39/rhine_main.c:2924: erreur: too many arguments to function ?pci_save_state?
Référence :
http://mail.nl.linux.org/kernelnewbies/2005-01/msg00175.html
Il suffit d'enlever le deuxième argument lors de l'appel de cette fonction.
Ligne 2924 remplacer
pci_save_state(pcid, pInfo->pci_state); par
pci_save_state(pcid);
- Troisième erreur (pratiquement la même que la deuxième) : /4.39/rhine_main.c:2958: erreur: too many arguments to function ?pci_restore_state?
Idem, on enlève le deuxième argument de la fonction.
Ligne 2958 remplacer
pci_restore_state(pcid, pInfo->pci_state); par
pci_restore_state(pcid);
Après on peut faire
make et ça marche (fichier rhinefet.ko). A ce stade, je n'ai pas eu envie de faire
make install. J'avais d'abord envie de le tester sans toucher aucun fichier de configuration. Et cela n'a pas été facile car dès que l'on retire le pilote d'origine (via-rhine), il est replacé une seconde plus tard en mémoire (udev je suppose).
J'ai fini par arriver à substituer le module à chaud de cette façon :
En root, taper sur une seule ligne
kill -9 $(ps -ax | grep udevd | head -c 5); /sbin/rmmod via-rhine; /sbin/insmod /4.39/rhinefet.ko. Mettre le chemin entier pour arriver à rhinefet.ko et pas simplement /4.39/rhinefet.ko.
Normalement rhinefet a pris la place de via-rhine et est utilisé comme eth0. L'idée de base est de tuer le démon udevd et puis interchanger les modules le plus rapidement possible. J'ignore tous les tenants et les aboutissants de cette manip mais ça marche. Donc, si le réseau ne fonctionne plus du tout ou si le PC plante, c'est que le module n'est pas bon, tout sera rétabli au reboot. Après il est facile de le tester dans tous les sens en stressant un peu la carte réseau.
Pas de problème pour moi, le pilote marche bien ou du moins pas plus mal que le précèdent. Malgrè tout, je n'ai pu me résoudre à une installation automatisé du module. Donc voilà ce que j'ai fait :
- Déplacer le fichier rhinefet.ko dans /lib/modules/2.6.11-1.1369_FC4/kernel/drivers/net/ (le chemin réel dépend de la version du noyau, remplacer 2.6.11-1.1369_FC4 par la sortie de la commande
uname -r) et ajuster ses permissions en 744 si elles ne sont pas déjà comme ça.
- Ce n'est pas obligatoire mais plus sûr : En root se placer dans /lib/modules/2.6.11-1.1369_FC4/kernel/drivers/net/ et changer le propriétaire,
chown root:root rhinefet.ko
- Dans le fichier /lib/modules/2.6.11-1.1369_FC4/modules.dep, enlever la ligne avec via-rhine, càd celle-ci :
/lib/modules/2.6.11-1.1369_FC4/kernel/drivers/net/via-rhine.ko: /lib/modules/2.6.11-1.1369_FC4/kernel/drivers/net/mii.ko
Ajouter cette ligne :
/lib/modules/2.6.11-1.1369_FC4/kernel/drivers/net/rhinefet.ko:
Ceci permet à modprobe de savoir où se trouve le module et ses éventuelles dépendances. Ici, je n'en ai pas mis vu que d'après ce que j'ai cru comprendre mii ne sert pas à grand chose et est plutôt obsolète. Mais il doit être possible de l'ajouter au besoin.
- Dans le fichier /etc/modprobe.conf, changer la ligne
alias eth0 via-rhine par
alias eth0 rhinefet.
Concernant le réglage wol, il suffit juste de mettre l'option g (réveil par paquet magique). Si on rajoute d'autres événements de réveil via le réseau (requête arp ou autre), j'ai peur que le PC ne s'allume pour un oui ou pour un non.
Pour que le démarrage par paquet magique soit activé à chaque redémarrage, dans le fichier /etc/sysconfig/network-scripts/ifcfg-eth0, ajouter la ligne
ETHTOOL_OPTS="wol g".
Et voilà... Ouf !