I driver Linux Realtek RTL8111(B)/RTL8168(B) e i programmatori dislessici
Se qualcuno avesse in mente di compilare i driver linux-r1000(103).zip per il kernel 2.6.x Linux, abbia la bontà d’animo di sopportare la caritatevole indulgenza di Realtek, che ha deciso di dare pane e lavoro a programmatori dislessici.
Se provate a compilare i sorgenti come modulo, infatti, vi troverete con una bella caterva di errori:
root@moveaway:/usr/src/r1000# make clean modules
make -C src/ clean
make[1]: Entering directory `/usr/src/r1000/src'
rm -f *.o *.ko *~ core* .dep* .*.d .*.cmd *.mod.c *.a *.s .*.flags
make[1]: Leaving directory `/usr/src/r1000/src'
make -C src/ modules
make[1]: Entering directory `/usr/src/r1000/src'
make -C /lib/modules/2.6.16.18/build SUBDIRS=/usr/src/r1000/src modules
make[2]: Entering directory `/usr/src/linux-2.6.16.18'
CC [M] /usr/src/r1000/src/r1000_n.o
/usr/src/r1000/src/r1000_n.c: In function ‘r1000_close’:
/usr/src/r1000/src/r1000_n.c:1450: error: ‘entdev’ undeclared (first use in this function)
/usr/src/r1000/src/r1000_n.c:1450: error: (Each undeclared identifier is reported only once
/usr/src/r1000/src/r1000_n.c:1450: error: for each function it appears in.)
make[3]: *** [/usr/src/r1000/src/r1000_n.o] Error 1
make[2]: *** [_module_/usr/src/r1000/src] Error 2
make[2]: Leaving directory `/usr/src/linux-2.6.16.18'
make[1]: *** [modules] Error 2
make[1]: Leaving directory `/usr/src/r1000/src'
make: *** [modules] Error 2
root@moveaway:/usr/src/r1000#
Ahi, ahi. Che è successo? Osservate la riga evidenziata in grassetto:
/usr/src/r1000/src/r1000_n.c:1450: error: ‘entdev’ undeclared (first use in this function)
Mmmmmmmm…..ma cosa è questa entdev?
All’interno della directory in cui è sono stati decompressi i sorgenti del driver si trova una directory
src
nella quale è presente il file
r1000_n.c
Apriamolo e posizioniamoci alla riga 1450:
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
synchronize_irq ();
#else
synchronize_irq(entdev->irq);
#endif
free_irq (netdev->irq, netdev);
Notato qualcosa? Semplicemente netdev (NETwork DEVice) è magicamente diventato entdev, il tutto per 1 sola volta. Il che porta a una inconsistenza dei sorgenti. Come riparare il tutto? Semplicemente correggendo entdev in netdev:
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
synchronize_irq ();
#else
synchronize_irq(netdev->irq);
#endif
free_irq (netdev->irq, netdev);
Ora non resta che lanciare una nuova compilazione:
root@moveaway:/usr/src/r1000# make clean modules
make -C src/ clean
make[1]: Entering directory `/usr/src/r1000/src'
rm -f *.o *.ko *~ core* .dep* .*.d .*.cmd *.mod.c *.a *.s .*.flags
make[1]: Leaving directory `/usr/src/r1000/src'
make -C src/ modules
make[1]: Entering directory `/usr/src/r1000/src'
make -C /lib/modules/2.6.16.18/build SUBDIRS=/usr/src/r1000/src modules
make[2]: Entering directory `/usr/src/linux-2.6.16.18'
CC [M] /usr/src/r1000/src/r1000_n.o
CC [M] /usr/src/r1000/src/r1000_ioctl.o
LD [M] /usr/src/r1000/src/r1000.o
Building modules, stage 2.
MODPOST
CC /usr/src/r1000/src/r1000.mod.o
LD [M] /usr/src/r1000/src/r1000.ko
make[2]: Leaving directory `/usr/src/linux-2.6.16.18'
make[1]: Leaving directory `/usr/src/r1000/src'
Il modulo è pronto:
root@moveaway:/usr/src/r1000# ls -lah src/r1000.ko
-rw-r--r-- 1 root root 23K 2006-07-06 10:31 src/r1000.ko
root@moveaway:/usr/src/r1000#
Non rimane che lanciare gli ultimi due comandi necessari per l’installazione del nuovo modulo e il suo caricamento automatico all’avvio:
make install
depmod -a
Con buona pace dei programmatori dislessici di Realtek…
l’hanno fatto ancora >>> r1000_v1.04.
stesso sorgente con bug, fixato grazie a san google e all’unico link scovato dalla ricerca sullerrore:
http://se.os.st/bbs/viewthread.php?action=printable&tid=5278
grazie giorgio per questo articolo che mi ha dato il “coraggio” di mettere le mani su un driver ^^!!!
Laura.
E ti pareva…i vizi sono duri a sparire.
Forza, dopo la prima volta modificare un driver mette meno patemi d’animo 🙂
Complimenti!
Grazie mille,
sia a Giorgio che ha aperto la discussione e ha infuso coraggio anche a me… spero non troppo se no mi dovrò abituare ai Kernel Panic 😉 …. e anche a Laura che grazie al suo link ho corretto nello specifico il mio problema.
Fabio
P.S..
come minimo mi aspettavo che provassero a compilarli prima di metterli su sito…
Grazie ragazzi! mi avete salvato un sacco di notti insonni 😉
Grande! non sai quanto sto sclerando per far funzionare ‘sto driver!
Speriamo bene.
Se funziona ti linko sul forum di Ubuntu
La versione 1.05 dei driver sembra essere stata corretta.
Ciao!
Ho dei problemi a compilare l’ultima versione dei driver per l’ultima serie di kernel… sai darmi qualche informazione in merito?
Grazie 🙂
Ciao,
prova a copiare qui i messaggi di errore che ti vengono indicati.
Eccoli:
alessio@quadrispro-laptop:~/Scrivania/r8101-1.007.00$ sudo -s
root@quadrispro-laptop:~/Scrivania/r8101-1.007.00# make clean modules
make -C src/ clean
make[1]: Entering directory `/home/alessio/Scrivania/r8101-1.007.00/src’
rm -rf *.o *.ko *~ core* .dep* .*.d .*.cmd *.mod.c *.a *.s .*.flags .tmp_versions Module.symvers Modules.symvers rset
make[1]: Leaving directory `/home/alessio/Scrivania/r8101-1.007.00/src’
make -C src/ modules
make[1]: Entering directory `/home/alessio/Scrivania/r8101-1.007.00/src’
make -C /lib/modules/2.6.24-19-generic/build SUBDIRS=/home/alessio/Scrivania/r8101-1.007.00/src modules
make[2]: Entering directory `/usr/src/linux-headers-2.6.24-19-generic’
CC [M] /home/alessio/Scrivania/r8101-1.007.00/src/r8101_n.o
/home/alessio/Scrivania/r8101-1.007.00/src/r8101_n.c: In function ‘rtl8101_init_board’:
/home/alessio/Scrivania/r8101-1.007.00/src/r8101_n.c:2244: error: implicit declaration of function ‘SET_MODULE_OWNER’
/home/alessio/Scrivania/r8101-1.007.00/src/r8101_n.c: In function ‘rtl8101_init_one’:
/home/alessio/Scrivania/r8101-1.007.00/src/r8101_n.c:2643: error: ‘struct net_device’ has no member named ‘poll’
/home/alessio/Scrivania/r8101-1.007.00/src/r8101_n.c:2644: error: ‘struct net_device’ has no member named ‘weight’
/home/alessio/Scrivania/r8101-1.007.00/src/r8101_n.c: In function ‘rtl8101_rx_interrupt’:
/home/alessio/Scrivania/r8101-1.007.00/src/r8101_n.c:3686: error: ‘struct net_device’ has no member named ‘quota’
/home/alessio/Scrivania/r8101-1.007.00/src/r8101_n.c:3686: warning: type defaults to ‘int’ in declaration of ‘_y’
/home/alessio/Scrivania/r8101-1.007.00/src/r8101_n.c:3686: error: ‘struct net_device’ has no member named ‘quota’
/home/alessio/Scrivania/r8101-1.007.00/src/r8101_n.c:3686: warning: comparison of distinct pointer types lacks a cast
/home/alessio/Scrivania/r8101-1.007.00/src/r8101_n.c: In function ‘rtl8101_interrupt’:
/home/alessio/Scrivania/r8101-1.007.00/src/r8101_n.c:3866: error: too few arguments to function ‘netif_rx_schedule_prep’
/home/alessio/Scrivania/r8101-1.007.00/src/r8101_n.c:3867: error: too few arguments to function ‘__netif_rx_schedule’
/home/alessio/Scrivania/r8101-1.007.00/src/r8101_n.c: In function ‘rtl8101_poll’:
/home/alessio/Scrivania/r8101-1.007.00/src/r8101_n.c:3913: error: ‘struct net_device’ has no member named ‘quota’
/home/alessio/Scrivania/r8101-1.007.00/src/r8101_n.c:3913: warning: type defaults to ‘int’ in declaration of ‘_y’
/home/alessio/Scrivania/r8101-1.007.00/src/r8101_n.c:3913: error: ‘struct net_device’ has no member named ‘quota’
/home/alessio/Scrivania/r8101-1.007.00/src/r8101_n.c:3921: error: ‘struct net_device’ has no member named ‘quota’
/home/alessio/Scrivania/r8101-1.007.00/src/r8101_n.c:3924: error: too few arguments to function ‘netif_rx_complete’
make[3]: *** [/home/alessio/Scrivania/r8101-1.007.00/src/r8101_n.o] Error 1
make[2]: *** [_module_/home/alessio/Scrivania/r8101-1.007.00/src] Error 2
make[2]: Leaving directory `/usr/src/linux-headers-2.6.24-19-generic’
make[1]: *** [modules] Error 2
make[1]: Leaving directory `/home/alessio/Scrivania/r8101-1.007.00/src’
make: *** [modules] Error 2
Questa è la versione del kernel (uso Ubuntu 8.04 «Hardy Heron»):
2.6.24-19-generic
Non saprei che dirti su questo tipo di errore, prova a dare un’occhiata a questo thread:
http://forum.ubuntu-it.org/index.php?topic=182174.msg1206942
La soluzione me la sono letteralmente “costruita” io:
http://www.alessiotreglia.com/articoli/compilare-il-modulo-r8168-per-le-schede-ethernet-realtek-su-hardy/
PS
Ti ho incluso nel mio blogroll 😉