sabato 19 ottobre 2013

Linux: Problemi di connessione con Realtek r8169 / r8111

Le schede indicate nel titolo vengono spesso riconosciute da Linux come delle r8169 e quindi il sistema provvede a caricare il modulo r8169 che potrebbe darvi qualche problema.

Su una Ubuntu 12.04LTS il driver r8168  e' già compilato all'interno del kernel di default. In questo caso sara' sufficiente bloccare il caricamento del modulo sbagliato inserendo la riga:
blacklist r8169 
nel file:
/etc/modprobe.d/blacklist-network.conf

Per altri sistemi che non avessero il driver r8168 precompilato nel kernel consigliamo di seguire la procedura seguente:
cd /usr/src
wget http://djlab.com/stuff/r8168-8.032.00.tar.bz2
tar jxvf r8168-8.032.00.tar.bz2
cd r8168-8.032.00
make clean modules
make install
depmod -a
echo "blacklist r8169" >> /etc/modprobe.d/blacklist-network.conf
update-initramfs -u
Per poter compilare automaticamente il modulo ad ogni aggiornamento di kernel, e' necessario ricorrere al sistema dkms.
Verifichiamo di avere installato dkms:
apt-get install dkms gcc
Creare il file:
dkms.conf
con il seguente comando:
cat < /usr/src/r8168-8.032.00/dkms.conf
PACKAGE_NAME=r8168
PACKAGE_VERSION=8.032.00
MAKE[0]="'make'"
BUILT_MODULE_NAME[0]=r8168
BUILT_MODULE_LOCATION[0]="src/"
DEST_MODULE_LOCATION[0]="/kernel/updates/dkms"
AUTOINSTALL="YES"
EOF
ed eseguire i comandi seguenti:
dkms add -m r8168 -v 8.032.00
dkms build -m r8168 -v 8.032.00
dkms install -m r8168 -v 8.032.00
Se non avete ricevuto errori, il vostro modulo e' stato installato correttamente e sara' ricompilato in automatico dal sistema ad ogni aggiornamento di kernel.

Se per caso, durante la compilazione del modulo, doveste avere errori del tipo:
root/r8168-8.035.00/src/r8168_n.c:14545: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘rtl8168_init_board’
Sara' necessario applicare la patch seguente:
diff -ruB r8168-8.035.00/src/r8168_n.c r8168-8.035.00/src/r8168_n.c
--- r8168-8.035.00/src/r8168_n.c        2012-12-19 05:38:56.000000000 -0500
+++ r8168-8.035.00/src/r8168_n.c        2013-03-17 12:48:58.693002848 -0400
@@ -14541,7 +14541,7 @@
        spin_unlock_irqrestore(&tp->phy_lock, flags);
 }

-static int __devinit
+static int
 rtl8168_init_board(struct pci_dev *pdev,
                   struct net_device **dev_out,
                   void __iomem **ioaddr_out)
@@ -14711,7 +14711,7 @@
        goto out;
 }

-static void __devinit
+static void
 rtl8168_init_sequence(struct rtl8168_private *tp)
 {
        void __iomem *ioaddr = tp->mmio_addr;
@@ -14964,7 +14964,7 @@
 };
 #endif

-static int __devinit
+static int
 rtl8168_init_one(struct pci_dev *pdev,
                 const struct pci_device_id *ent)
 {
@@ -15128,7 +15128,7 @@
        return 0;
 }

-static void __devexit
+static void
 rtl8168_remove_one(struct pci_dev *pdev)
 {
        struct net_device *dev = pci_get_drvdata(pdev);
@@ -17649,7 +17649,7 @@
        .name           = MODULENAME,
        .id_table       = rtl8168_pci_tbl,
        .probe          = rtl8168_init_one,
-       .remove         = __devexit_p(rtl8168_remove_one),
+       .remove         = rtl8168_remove_one,
 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,11)
        .shutdown       = rtl8168_shutdown,
 #endif

e ripetere la compilazione. Tutto qua :)



Nessun commento: