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 >