3c905C ethernet card driverének pár sora

 ( Fifi | 2009. január 9., péntek - 22:43 )

Sziasztok!

Nem vagyok a naponta kernelt forgató típus, de gondoltam, hogy az amúgy jól működő 2.6.22.2-es kernelem frissítem. Mivel jó mga driver csak a 2.6.27-es kernelsorozathoz van és a 2.6.28-as még túl ropogós, ezért az új kernelem a vanilla 2.6.27.10 lesz.

Nem volt semmi gondom, amíg nem szerettem volna egyik nap a gépet wake on lan ébreszteni. Nem ébredt, holott a 2.6.22.2-tal még szépen működött :(
Itt jegyezném meg, hogy a kernelen kívül semmi más nem változott a rendszerben.

A két kernel bootolása között az alábbi dmesg külömbség fogadott:
régi kernelem:

Linux blackdragon 2.6.22.2 #1 SMP Sat Aug 11 21:17:50 CEST 2007 i686 GNU/Linux

ACPI: PCI Interrupt 0000:02:06.0[A] -> GSI 22 (level, low) -> IRQ 22
3c59x: Donald Becker and others.
0000:02:06.0: 3Com PCI 3c905C Tornado at f8810000.

új kernelem:

Linux blackdragon 2.6.27.10 #1 SMP Fri Jan 2 23:25:49 CET 2009 i686 GNU/Linux

3c59x 0000:02:06.0: PCI INT A -> GSI 22 (level, low) -> IRQ 22
3c59x: Donald Becker and others.
0000:02:06.0: 3Com PCI 3c905C Tornado at f8878000.
0000:02:06.0: WOL not supported.

Mivel a régi kernelben működött, gondoltam átveszem azt a kódrészletet a régi driverből, ami a wol-t érintheti.

Ezt tettem és a wol most szépen működik:

--- /usr/local/src/kernel-2.6.27.10-orig/linux-2.6.27.10/drivers/net/3c59x.c
+++ /usr/local/src/kernel-2.6.27.10/linux-2.6.27.10/drivers/net/3c59x.c
@@ -3120,13 +3120,7 @@
iowrite16(SetRxFilter|RxStation|RxMulticast|RxBroadcast, ioaddr + EL3_CMD);
iowrite16(RxEnable, ioaddr + EL3_CMD);

- if (pci_enable_wake(VORTEX_PCI(vp), PCI_D3hot, 1)) {
- printk(KERN_INFO "%s: WOL not supported.\n",
- pci_name(VORTEX_PCI(vp)));
-
- vp->enable_wol = 0;
- return;
- }
+ pci_enable_wake(VORTEX_PCI(vp), 0, 1);

/* Change the power state to D3; RxEnable doesn't take effect. */
pci_set_power_state(VORTEX_PCI(vp), PCI_D3hot);

Mivel programozói tudásom konvergál a nullához a C tudásom meg még annál is kevesebb, elmesélné nekem valaki, hogy milyen feltételvizsgálatot irtottam ki és ennek lehet-e káros hatása a hálókártyám működésére?

Előre is köszönöm a segítséget!

Bye, Fifi

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Gyakorlatilag csak az uzenetet tiltottad le, ettol meg nem fog mukodni a WOL. Elso ranezesre nem tunik karosnak, inkabb csak ertelmetlennek.

Az üzenet után van egy ilyen is:
vp->enable_wol = 0;

Gondolom ez lenne a tiltás, de vajon miért tiltják le a wol-t? És a fenti 6 sor kivétele és az egyetlen sor visszaírása után működik a wol.

Elvileg a pci_enable_wake engedelyezi (doksi alapjan) azt, es ha nem sikerul akkor hibakoddal ter vissza. Habar nem neztem rendesen at a driver kodjat, de arra tippelnek, hogy az nem szamit ha a dolog power management szinten nem sikerult.

Pedig értelmesnek tűnik, ugyanis a dmesgből látszik, hogy a feltétel igaz, és így ez a sor is végrehajtódott:

vp->enable_wol = 0;

amit kivett, és így működik. Szerintem semmi probléma nem lehet belőle.

Akkor ez most egy bug, mely egy wol képes kártyát megvon ezen tulajdonságától?

Első pillantásra lényegi eltérés csak a pci_enable_wake() függvény második paraméterében van: elég lett volna a 'PCI_D3hot' paramétert lecserélned '0'-ra (vagy elegánsabb ha rákeresel a PCI_D3hot-ra a '.h' file-okban a kernel forrásában és ott a 0 értékhez tartozó "elnevezést" használod).

Ha a régi kernel forrásban a pci_set_power_state() második paramétere is '0' volt, akkor érdemes inkább beszúrni néhány sort:


if (pci_enable_wake(VORTEX_PCI(vp), PCI_D3hot, 1)) {
+ if (!pci_enable_wake(VORTEX_PCI(vp), 0, 1)) {
+ pci_set_power_state(VORTEX_PCI(vp), 0);
+ return;
+ }
printk(KERN_INFO "%s: WOL not supported.\n",
pci_name(VORTEX_PCI(vp)));

vp->enable_wol = 0;
return;
}

/* Change the power state to D3; RxEnable doesn't take effect. */
pci_set_power_state(VORTEX_PCI(vp), PCI_D3hot);

Mivel nem értek programozáshoz header file-okban azért már nem turkálok. :)

Tehát az én esetemben a PCI_D3hot változó valamiért nem 0 értéket kap és ezért letiltja a wol-t. Szóval azt kellene kiderítenem, hogy hol kap értéket és mit, továbbá az miért nem 0?

Na ehhez én már nagyon kevés lennék ... :(

Szerk: közben megnéztem és ez a kódrészlet a 2.6.28-as kernelnél sem változott a 2.6.27.10-hez képest, tehát ott sem működne nálam a wol.

Nem egészen. A PCI_D3hot SZVSZ nem változó.

Nekem úgy tűnik a pci_enable_wake() régebben "favágobb" módon próbálta beállítani a WOL-t (gondolom D0). Az újabb kernel-el viszont nálad a D3hot módban nem működik a WOL bekapcsolása.

Az előbb leírt bővítés először megpróbálja bekapcsolni a WOL-t D3hot módban, ha ez nem sikerül akkor a régebbi (D0?) módban*.

* Ha nem volt a régebbi kernelben pci_set_power_state(), akkor ezt a sor el is lehet hagyni.

Mondtam, hogy nem vagyok programozó és a C-hez sem értek, ezért csak találgatok :(

A régi kernelben is volt pci_set_power_state().

Az új driver annyiban külömbözik ezen a részen a régitől, hogy a témaindító hozzászólásban a
"-" jellel kezdődő sorok csak az új kerneldriverben vannak
"+" jellel kezdődő sor meg csak a régi driverben van
a jel nélkül kezdődő sorok azonosak mindkét driverben.

Számomra az lenne a lényeg, mivel nem vagyok programozó és angolul sem tudok, hogy ezt valaki közölné a kernel fejlesztőkkel, hogy egy
02:06.0 Ethernet controller: 3Com Corporation 3c905C-TX/TX-M [Tornado] (rev 78)
kártyával rendelkező user elvesztette az új feltétel miatt a wol képességét és kéri ennek javítását.

Felvállalja valaki? :)

Persze, írd meg a részletes bugreportot magyarul, meg hogy kinek kell küldeni.

Köszönöm felajánlásod! Életemben nem írtam bugreportot, gondolom ha azt itt leírtaknak eleget teszek, az elegendő.

Kernelfejlesztőknek még én se, de hajrá. :)

> meg hogy kinek kell küldeni.

Ahogy nézem van erre külön lista:

http://dir.gmane.org/gmane.linux.drivers.vortex.user
http://www.scyld.com/mailman/listinfo/vortex-bug

Szerk: vagy csak volt rá lista, 2002-2007 után mintha nem lennének levelek

Magában a driverben az alábbi mondat szerepel:
"Problem reports and questions should be directed to vortex_kukac_scyld_pont_com"* és az archívuma alapján egy picit élénkebb, mint a dev lista.

*: Természetesen a címet én "magyarosítottam"

Még egy kérdés:
A 3c59x.c file-ban van egy ilyen megjegyzés:
"NOTE: If you make 'vortex_debug' a constant (#define vortex_debug 0) the driver shrinks by 2k
* due to dead code elimination. There will be some performance benefits from this due to
* elimination of all the tests and reduced cache footprint."

Egy bugreporthoz, akkor ez is kell?

Később ebben a file-ban van egy ilyen:
"/* Put out somewhat more debugging messages. (0: no msg, 1 minimal .. 6). */
#define vortex_debug debug"

A fenti sort akkor erre kell átírnom és így újrafordítani?
#define vortex_debug 6

Esetleg elég lehet egy kisebb debug szint?

Az PCI_D3hot nem változó, hanem #define, a pci.h-ban van benne.

Lehet, hogy nézted, de a Documentation/networking/vortex.txt fájl ír WOLról meg hozzá kapcsolódó modul paraméterekről.

enable_wol=1 opció?

Software is like sex, it's better with a penguin. :D (r)(tm)(c) آكوش

A fenti idezett kodban en nem latok konfigellenorzest, a kikapcsolas feltetlel nelkuli. szvsz hiaba enable-zik, az ezt a kodot ugyan meg nem fogja hatni. Hacsak nincs vhol kesobb egy force enable.
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Igen, szerintem sincs konfig ellenőrzés.

fifi@blackdragon:~$ modinfo 3c59x | grep wol
parm: enable_wol:3c59x: Turn on Wake-on-LAN for adapter(s) (0-1) (array of int)
parm: global_enable_wol:3c59x: same as enable_wol, but applies to all NICs if enable_wol is unset (int)

ezért, szerepelt már a régi kernelnél is ez, mellyel jól működött:

fifi@blackdragon:~$ cat /etc/modprobe.d/wake_up_eth
alias eth0 3c59x
options 3c59x global_enable_wol=1
, de az új kernel ezzel nem foglalkozik, hanem feltétel nélkül kikapcsolja mert a pci_enable_wake második paramétere nem 0.

Azert legyunk pontosak: azert kapcsolja ki, mert az uj modszerrel nem mukodik egyutt a kartyad, viszont a regi modszerrel meg sem probalkozik valamilyen okbol kifolyolag. Persze bele lehetne menni a pci_enable_wake forrasaba es meg lehetne nezni, hogy mi a rakfene van, de ez mar nem a te feladatod.
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.