Instrukcja obsługi patcha włączającego funkcjonalność Wake-On-Lan dla kart sieciowych zintegrowanych z płytami nVidia nForce. Dotyczy urządzeń: * nForce Ethernet Controller * nForce2 Ethernet Controller * nForce3 Ethernet Controller * CK804 Ethernet Controller * MCP04 Ethernet Controller * MCP51 Ethernet Controller * MCP55 Ethernet Controller Poprawka wymaga modyfikacji w dwóch miejscach: * w module do jądra o nazwie rofcedeth * w skryptach zatrzymujących system Poprawka wymaga posiadania następujących narzędzi: * wget * patch * diff * make * gcc Jeśli używasz PLD-Linux to sprawdź, czy nie masz tego już w systemie używając poleceń: grep -qi forcedeth_workaround /etc/rc.d/rc.shutdown && echo mam wsparcie w skryptach! /sbin/modinfo -F description forcedeth | grep -qi "timerirq disabled" && echo mam wsparcie w module! Ok, jeśli gdzieś masz wsparcie i już trochę się orientujesz to będziesz wiedział, które punkty pominąć. Jedziemy: 1.) Zainstaluj narzędzie ethtool - jeśli nie masz w swojej distro weź z http://sourceforge.net/projects/gkernel/ 2.) Upewnij się, że polecenie ethtool jest w /sbin lub w /usr/sbin 3.) Postaraj się o źródła jądra którego używasz (mają być w /usr/src/linux) 4.) Wykonaj z roota: cd /tmp && mkdir cosik && cd cosik wget ftp://ftp.pld-linux.org/people/siefca/\ patches/nvidia/pci-config.c wget ftp://ftp.pld-linux.org/people/siefca/\ patches/nvidia/forcedeth_sleep.sh kver=`uname -r | awk -F'[ .]' '{print $1"."$2"."$3}'` export kver wget -O linux-forcedeth-WON.patch \ ftp://ftp.pld-linux.org/people/siefca/\ patches/nvidia/linux-${kver}-forcedeth-WON.patch gcc -O2 ./pci-config.c -o ./pci-config strip ./pci-config mv ./pci-config /sbin [ -d /etc/rc.d ] || mkdir /etc/rc.d mv forcedeth_sleep.sh /etc/rc.d chmod a+rx /etc/rc.d/forcedeth_sleep.sh /sbin/pci-config 5.) Spójrz czy w bieżacym katalogu powstał plik o nazwie: linux-forcedeth-WON.patch Jeśli POWSTAŁ przejdź do 5.2. Jeśli NIE MA GO to przejdź do 5.1 (następny krok). 5.1) Musisz samodzielnie przygotować poprawki do modułu jądra. To jest łatwe i polega na wyszukaniu kilku rzeczy i zastąpieniu ich. Przejdź do katalogu: /usr/src/linux/drivers/net Wykonaj: cp forcedeth.c forcedeth.c.orig Otwórz edytorem plik: forcedeth.c [1] zmień linijkę: #define DEV_NEED_TIMERIRQ 0x0001 /* set the timer irq flag in the irq mask */ na takie dwie: #define DEV_NEED_TIMERIRQ 0x0000 /* work-around for Wake-On-Lan */ #define DEV_NEED_TIMERIRQ_ORIG 0x0001 /* set the timer irq flag in the irq mask */ [2] zmień linijkę: if (id->driver_data & DEV_NEED_TIMERIRQ) na taką: if (id->driver_data & DEV_NEED_TIMERIRQ_ORIG) [3] zmień linijkę: MODULE_DESCRIPTION("Reverse Engineered nForce ethernet driver"); na taką: MODULE_DESCRIPTION("Reverse Engineered nForce ethernet driver (TIMERIRQ DISABLED)"); Ok. Już prawie. :) Wykonaj: diff -Nu forcedeth.c.orig forcedeth.c >./linux-${kver}-forcedeth-WON.patch Wyślij mi e-mailem (na dole strony) plik który powstał. Pomożesz w ten sposób innym. Jeśli nie znasz nazwy wykonaj: ls linux-*forcedeth* Przejdź do punktu 5.3 5.2) Patchowanie modułu. # tu czesc zwiazana z module do kernela mv linux-forcedeth-WON.patch /usr/src/linux cd /usr/src/linux && patch -p1 <./linux-forcedeth-WON.patch 5.3) Kompilacja i instalacja modułu. # kompilujemy modul do kernela cd /usr/src/linux make menuconfig # wykonaj jeśli nie kompilowałeś wcześniej tego kernela, a dopiero co ściągnąłeś # wyjdź z menu jak tylko się pojawi odpowiadając twierdząco na pytanie o to czy # zapisać zmiany w konfiguracji make make modules # instalujemy modul do kernela cd /usr/src/linux make modules install depmod -a 6.) Zrestartuj system, aby wstał z nowym modułem: ifdown twój_kłopotliwy_interface rmmod forcedeth reboot 7.) Teraz ważna rzecz - trzeba włączyć funkcjonalność w pliku odpowiedzialnym za wyłączanie systemu. znajdź taki plik u siebie (u mnie to jest /etc/rc.d/rc.shutdown) i dodaj w nim, w odpowiednim miejscu wywołanie /etc/rc.d/forcedeth_sleep.sh Po prostu poszukaj wewnątrz /etc/rc.d, który plik zawiera komunikat w stylu "Turning off swap" i ponad tym poleceniem (odmontowywania swap w tym przypadku) dopisz linijkę: /etc/rc.d/forcedeth_sleep.sh. Na przykład u mnie wyglądało to tak: | /etc/rc.d/forcedeth_sleep.sh | | # Turn off swap, then unmount file systems. | run_cmd "Turning off swap" swapoff -a | | [ -x /etc/rc.d/rc.acct ] && /etc/rc.d/rc.acct stop 8.) Jeśli nie wiesz jak zrobić powyższe to zapytaj kogoś kto się zna. Spytaj w którym momencie i w jakim pliku rc są odmontowywane systemy plików przy zatrzymywaniu pracy systemu. Musisz wstawić wywołanie skryptu tuż przed tym. 9.) Na koniec nie zapomnij powiedzieć swojej karcie, że ma czuwać, kiedy komputer jest wyłączony wydając polecenie: ethtool -s nazwa_interfejsu wol g 10.) Sprawdź czy działa. -- Paweł Wilk < pw at gnu dot org >