
Hallo, ich habe ein Fehlverhalten in der SuSE 9.3 Personal Edition festgestellt und bräuchte nun einen Ansprechpartner mit Know-How. Es handelt sich dabei um die Problematik, daß Wake-On-LAN (WOL) nach einem Suspend-to-Disk nicht funktioniert. Ich vermute einen Fehler in den Skripten, die bei einem Suspend/Resume abgearbeitet werden. Im Detail: Ich betreibe eine 3COM 3C905-TXM an einem Gigabyte BX2000. Sowohl die Karte als auch das Mainboard (nicht PCI 2.2) verfügen über einen WOL-Stecker, die ich miteinander verbunden habe. Das Treibermodul (3c59x) lade ich mit dem Parameter "enable_wol=1", um Wake-On-Lan einzuschalten. Danach schicke ich den Rechner mittels "echo disk > /sys/power/state" schlafen. Die Karte wird weiter mit Strom versorgt, die Link-LED leuchtet. Soweit so gut. Das Problem: Der Rechner wacht nach Empfang eines Magic Packets (generiert mittels dem Tool WOL) nicht auf. Die LED am NIC blinkt nur kurz und nichts passiert. Was ich soweit herausgefunden habe: Kurz bevor sich der Rechner schlafen legt, wechselt der Bildschirm auf eine andere virtuelle Konsole (ich weiß leider nicht, welche und wie ich ohne Suspend dorthin gelange). Auf dieser sind Ausgaben wie "Stopping Tasks" oder "PM: attempting to suspend to disk" zu sehen. Man sieht in diesem Screen nun, daß beim Suspend zunächst vortex_down() aufgerufen wird (ich habe im Kernelmodul 3c59x mehrere Debug-Ausgaben eingebaut). In dieser Funktion wird das WOL eingeschaltet (Funktion acpi_set_WOL() ). Gut. Aber nur kurze Zeit später, kurz bevor der Rechner dann endgültig ausgeht, wird erneut vortex_up() ausgeführt, was dazu führt, daß das entsprechende Register in der Karte wieder gelöscht wird und anschließend WOL nicht funktioniert. Ich habe daraufhin im Modul 3c59x einen Workaround eingehackt. Ich setze in der Funktion vortex_down() eine globale Variable 'shutdown_in_progress' auf 1. In vortex_up() wird nun als erstes überprüft, ob diese Variable 1 ist. Falls ja, wird die Variable zurückgesetzt und die Funktion sofort verlassen. Falls nein, wird die Funktion ganz normal ausgeführt. Und siehe da: Mit diesem Workaround funktioniert es! Die Karte erkennt das Magic Packet korrekt und der Rechner wacht auf. Sowohl die Hardware als auch die Software sind also soweit in Ordnung. Das Problem ist, daß kurz vor dem eigentlichen Suspend nochmals vortex_up() aufgerufen wird und damit die WOL-Settings der Karte verloren gehen. vortex_up() wird bei einem device_open() aufgerufen. Irgendjemand öffnet also nochmals die Netzwerkkarte. Ich weiß nur nicht, wer. Ich frage mich nun, welche Skripte werden denn vor einem Suspend ausgeführt? Wo finde ich bei einer SuSE 9.3 die entsprechenden Dateien? Der eingebaute Workaround funktioniert zwar beim Suspend, beim Resume jedoch wird aus irgendeinem Grund vortex_up() nicht ausgeführt, da meine globale Variable immer noch auf 1 steht, obwohl ich sie vor dem Suspend auf 0 gesetzt habe. Das führt dazu, daß die Netzwerkkarte nach dem Aufwachen erstmal nicht läuft. Nach Entfernen und neu Laden des Moduls funktioniert es wieder. Das ist jedoch keine Dauerlösung. Gruß, Eckehardt Luhm --- Eckehardt Luhm, eMail: bselu@web.de