{"id":308,"date":"2006-07-06T09:48:27","date_gmt":"2006-07-06T08:48:27","guid":{"rendered":"http:\/\/www.zarrelli.org\/new_blog\/?p=308"},"modified":"2006-07-06T09:48:27","modified_gmt":"2006-07-06T08:48:27","slug":"i-driver-linux-realtek-rtl8111brtl8168b-e-i-programmatori-dislessici","status":"publish","type":"post","link":"https:\/\/www.zarrelli.org\/blog\/i-driver-linux-realtek-rtl8111brtl8168b-e-i-programmatori-dislessici\/","title":{"rendered":"I driver Linux Realtek RTL8111(B)\/RTL8168(B) e i programmatori dislessici"},"content":{"rendered":"<p>Se qualcuno avesse in mente di compilare i driver <a href=\"ftp:\/\/152.104.238.194\/cn\/nic\/rtl8111brtl8168b\/linux-r1000(103).zip\" target=\"_blank\">linux-r1000(103).zip<\/a> per il kernel 2.6.x Linux, abbia la bont\u00e0 d&#8217;animo di sopportare la caritatevole indulgenza di Realtek, che ha deciso di dare pane e lavoro a programmatori dislessici.<\/p>\n<p>Se provate a compilare i sorgenti come modulo, infatti, vi troverete con una bella caterva di errori:<\/p>\n<p><code><br \/>\nroot@moveaway:\/usr\/src\/r1000# make clean modules<br \/>\nmake -C src\/ clean<br \/>\nmake[1]: Entering directory `\/usr\/src\/r1000\/src'<br \/>\nrm -f *.o *.ko *~ core* .dep* .*.d .*.cmd *.mod.c *.a *.s .*.flags<br \/>\nmake[1]: Leaving directory `\/usr\/src\/r1000\/src'<br \/>\nmake -C src\/ modules<br \/>\nmake[1]: Entering directory `\/usr\/src\/r1000\/src'<br \/>\nmake -C \/lib\/modules\/2.6.16.18\/build SUBDIRS=\/usr\/src\/r1000\/src modules<br \/>\nmake[2]: Entering directory `\/usr\/src\/linux-2.6.16.18'<br \/>\n  CC [M]  \/usr\/src\/r1000\/src\/r1000_n.o<br \/>\n\/usr\/src\/r1000\/src\/r1000_n.c: In function \u2018r1000_close\u2019:<br \/>\n<b>\/usr\/src\/r1000\/src\/r1000_n.c:1450: error: \u2018entdev\u2019 undeclared (first use in this function)<\/b><br \/>\n\/usr\/src\/r1000\/src\/r1000_n.c:1450: error: (Each undeclared identifier is reported only once<br \/>\n\/usr\/src\/r1000\/src\/r1000_n.c:1450: error: for each function it appears in.)<br \/>\nmake[3]: *** [\/usr\/src\/r1000\/src\/r1000_n.o] Error 1<br \/>\nmake[2]: *** [_module_\/usr\/src\/r1000\/src] Error 2<br \/>\nmake[2]: Leaving directory `\/usr\/src\/linux-2.6.16.18'<br \/>\nmake[1]: *** [modules] Error 2<br \/>\nmake[1]: Leaving directory `\/usr\/src\/r1000\/src'<br \/>\nmake: *** [modules] Error 2<br \/>\nroot@moveaway:\/usr\/src\/r1000#<br \/>\n<\/code><\/p>\n<p>Ahi, ahi. Che \u00e8 successo? Osservate la riga evidenziata in grassetto:<\/p>\n<p><b>\/usr\/src\/r1000\/src\/r1000_n.c:1450: error: \u2018entdev\u2019 undeclared (first use in this function)<\/b><\/p>\n<p>Mmmmmmmm&#8230;..ma cosa \u00e8 questa entdev?<\/p>\n<p>All&#8217;interno della directory in cui \u00e8 sono stati decompressi i sorgenti del driver si trova una directory<\/p>\n<p><b>src<\/b><\/p>\n<p>nella quale \u00e8 presente il file<\/p>\n<p><b>r1000_n.c<\/b><\/p>\n<p>Apriamolo e posizioniamoci alla riga <b>1450<\/b>:<\/p>\n<p><code><br \/>\n#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)\n        synchronize_irq ();\n#else\n        synchronize_irq(entdev->irq);<br \/>\n#endif<br \/>\n        free_irq (netdev->irq, netdev);<br \/>\n<\/code><\/p>\n<p>Notato qualcosa? Semplicemente <b>netdev<\/b> (NETwork DEVice) \u00e8 magicamente diventato <b>entdev<\/b>, il tutto per 1 sola volta. Il che porta a una inconsistenza dei sorgenti. Come riparare il tutto? Semplicemente correggendo entdev in netdev:<\/p>\n<p><code><br \/>\n#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)\n        synchronize_irq ();\n#else\n        synchronize_irq(netdev->irq);<br \/>\n#endif<br \/>\n        free_irq (netdev->irq, netdev);<br \/>\n<\/code><\/p>\n<p>Ora non resta che lanciare una nuova compilazione:<\/p>\n<p><code><br \/>\nroot@moveaway:\/usr\/src\/r1000# make clean modules<br \/>\nmake -C src\/ clean<br \/>\nmake[1]: Entering directory `\/usr\/src\/r1000\/src'<br \/>\nrm -f *.o *.ko *~ core* .dep* .*.d .*.cmd *.mod.c *.a *.s .*.flags<br \/>\nmake[1]: Leaving directory `\/usr\/src\/r1000\/src'<br \/>\nmake -C src\/ modules<br \/>\nmake[1]: Entering directory `\/usr\/src\/r1000\/src'<br \/>\nmake -C \/lib\/modules\/2.6.16.18\/build SUBDIRS=\/usr\/src\/r1000\/src modules<br \/>\nmake[2]: Entering directory `\/usr\/src\/linux-2.6.16.18'<br \/>\n  CC [M]  \/usr\/src\/r1000\/src\/r1000_n.o<br \/>\n  CC [M]  \/usr\/src\/r1000\/src\/r1000_ioctl.o<br \/>\n  LD [M]  \/usr\/src\/r1000\/src\/r1000.o<br \/>\n  Building modules, stage 2.<br \/>\n  MODPOST<br \/>\n  CC      \/usr\/src\/r1000\/src\/r1000.mod.o<br \/>\n  LD [M]  \/usr\/src\/r1000\/src\/r1000.ko<br \/>\nmake[2]: Leaving directory `\/usr\/src\/linux-2.6.16.18'<br \/>\nmake[1]: Leaving directory `\/usr\/src\/r1000\/src'<br \/>\n<\/code><\/p>\n<p>Il modulo \u00e8 pronto:<br \/>\n<code><br \/>\nroot@moveaway:\/usr\/src\/r1000# ls -lah src\/r1000.ko<br \/>\n-rw-r--r-- 1 root root 23K 2006-07-06 10:31 src\/r1000.ko<br \/>\nroot@moveaway:\/usr\/src\/r1000#<br \/>\n<\/code><\/p>\n<p>Non rimane che lanciare gli ultimi due comandi necessari per l&#8217;installazione del nuovo modulo e il suo caricamento automatico all&#8217;avvio:<\/p>\n<p><code><br \/>\nmake install<br \/>\ndepmod -a<br \/>\n<\/code><\/p>\n<p>Con buona pace dei programmatori dislessici di Realtek&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Se qualcuno avesse in mente di compilare i driver linux-r1000(103).zip per il kernel 2.6.x Linux, abbia la bont\u00e0 d&#8217;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# &hellip;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13,31,62],"tags":[87,139],"class_list":["post-308","post","type-post","status-publish","format-standard","hentry","category-computer","category-gnulinux","category-sysadmin","tag-ftp","tag-linux","without-featured-image"],"_links":{"self":[{"href":"https:\/\/www.zarrelli.org\/blog\/wp-json\/wp\/v2\/posts\/308","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.zarrelli.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.zarrelli.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.zarrelli.org\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.zarrelli.org\/blog\/wp-json\/wp\/v2\/comments?post=308"}],"version-history":[{"count":0,"href":"https:\/\/www.zarrelli.org\/blog\/wp-json\/wp\/v2\/posts\/308\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.zarrelli.org\/blog\/wp-json\/wp\/v2\/media?parent=308"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.zarrelli.org\/blog\/wp-json\/wp\/v2\/categories?post=308"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.zarrelli.org\/blog\/wp-json\/wp\/v2\/tags?post=308"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}