RT2870 unter (K)Ubuntu Natty (11.04)

Die neueste Version von (K)Ubuntu, Natty (11.04),  bringt trotz des neuen Kernels 2.6.38 nur den alten RT2870 Wireless-Treiber mit. Wer nicht mit angezogener Handbremse Daten über’s WLAN senden will, der muss auch unter Natty den Treiber für den RT2870 manuell kompilieren, was ohne Fehler aber nicht funktioniert. Abhilfe schafft auch hier die Vorgehensweise für die Vorgängerversion Maverick, wie ich in meinem Artikel [intlink id=“40″ type=“post“]“RT2870-Kompilierungsfehler unter (K)Ubuntu Maverick (10.10)“[/intlink] beschrieben hab.

Mit DKMS alle Kernelmodule neu kompilieren

Mit dem Dynamic Kernel Module Support (DKMS) Framework kann man zwar alle Module komfortabel kompilieren lassen, jedoch lassen sich nicht alle Module auf einmal neu kompilieren. Ferner muss jedes Modul und jede Modulversion, inkl. des Kernels jedes mal separat angegeben werden. Die folgenden Zeilen bringen DKMS jedoch dazu, alle Module für den aktuellen Kernel neu zu kompilieren.

[bash]
for mod in `dkms status | cut -d, -f1 | uniq`;
do for ver in `dkms status | cut -d, -f2 | uniq`;
do dkms remove -m $mod -v $ver -k `uname -r` && dkms build -m $mod -v $ver -k `uname -r` && dkms install -m $mod -v $ver -k `uname -r`;
done;
done
[/bash]

RT2870-Kompilierungsfehler unter (K)Ubuntu Maverick (10.10)

Gestern wurde die neue Version der beliebten Linux-Distribution veröffentlicht. Mit im Gepäck der Kernel 2.6.35. Wer wie ich im Besitz eines WLAN-Sticks mit dem RT2870-Chipsatz ist, stellt das erst mal vor Probleme. Ich nutze nicht den mitgelieferten Treiber rt2870sta, da dieser meine WLAN-Übertragung von 130 MBit/s auf 54 MBit/s drosselt.

Abhilfe schafft da den aktuellsten Ralink-Treiber zu kompilieren, was aber mit dem neuen Kernel 2.6.35 zu folgendem Fehler führt:

CC [M]  2010_0709_RT2870_Linux_STA_v2.4.0.1/os/linux/../../common/cmm_mac_usb.o
2010_0709_RT2870_Linux_STA_v2.4.0.1/os/linux/../../common/cmm_mac_usb.c: In function ‘RTMPAllocUsbBulkBufStruct’:
2010_0709_RT2870_Linux_STA_v2.4.0.1/os/linux/../../common/cmm_mac_usb.c:52: error: implicit declaration of function ‘usb_buffer_alloc’
2010_0709_RT2870_Linux_STA_v2.4.0.1/os/linux/../../common/cmm_mac_usb.c:52: warning: assignment makes pointer from integer without a cast
2010_0709_RT2870_Linux_STA_v2.4.0.1/os/linux/../../common/cmm_mac_usb.c: In function ‘RTMPFreeUsbBulkBufStruct’:
2010_0709_RT2870_Linux_STA_v2.4.0.1/os/linux/../../common/cmm_mac_usb.c:78: error: implicit declaration of function ‘usb_buffer_free’
2010_0709_RT2870_Linux_STA_v2.4.0.1/os/linux/../../common/cmm_mac_usb.c: In function ‘RTMPFreeTxRxRingMemory’:
make[2]: *** [2010_0709_RT2870_Linux_STA_v2.4.0.1/os/linux/../../common/cmm_mac_usb.o] Fehler 1
make[1]: *** [_module_2010_0709_RT2870_Linux_STA_v2.4.0.1/os/linux] Fehler 2
make[1]: Verlasse Verzeichnis '/usr/src/linux-headers-2.6.35-22-generic'
make: *** [LINUX] Fehler 2

Schuld daran ist der Rückgriff auf die Funktionen usb_buffer_alloc() und usb_buffer_free(). Diese wurden umbenannt, was sich auch der Changelog des Kernels entnehmen lässt:

    USB: rename usb_buffer_alloc() and usb_buffer_free() users

    For more clearance what the functions actually do,

      usb_buffer_alloc() is renamed to usb_alloc_coherent()
      usb_buffer_free()  is renamed to usb_free_coherent()

Alles was man also tun muss ist die entsprechenden Funktionen in der include/os/rt_linux.h umzubenennen. Einen entsprechenden Patch könnt ihr hier runterladen. Einfach folgendes Kommando im Treiberverzeichnis ausführen:

patch -ul -p0 -i pfad/zur/patchdatei

Oder bequem per Einzeiler:

wget -qO- http://www.linuxcrew.de/wp-content/uploads/2010/10/rt2870sta_usb_kernel2635.patch | patch -ul -p0

Danach lässt sich der Treiber wieder problemlos kompilieren.