Wie im Artikel Projekt: Linux Router mit Fitlet XA-10 bauen beschrieben, betreibe ich seit etwas mehr als 2 Monaten einen WLAN Router mit einem USB RT5370 WLAN Dongle. Im Laufe dieser zwei Monate habe ich folgendem Fehlermeldungen im syslog festgestellt, wobei ich noch nicht für jede Meldunge eine Lösung gefunden habe.
Warning – TX queue 2 DMA timed out, invoke forced forced reset
Dieser Fehlermeldung scheint mit der Aktivierung von 802.11n zusammen zu hängen, wie in folgendem OpenWRT Ticket zu lesen ist.
Warning – TX status timeout for entry" and "Got TX status for an empty queue
Die Fehlermeldung scheint bis Kernel 4.1 noch nicht behoben zu sein, wie aus folgendem Bug-Report hervorgeht.
Warning – TX HW queue 0 timed out, invoke forced kick
Hierzu habe ich nicht wirklich viel gefunden, außer folgenden Beitrag.
Warning – Data pending for entry ? in queue ?
Im Eventlog taucht mehrfach die in der Überschrift genannte Fehlermeldung auf. Die Anzahl dieser Meldungen konnte ich durch das aktualisieren des Treibers sowie der Deaktivierung der Hardwareverschlüsselung reduzieren.
Treiber aktualisieren
Das Paket firmware-ralink liefert für den RT5370 die notwendigern Treiber um diesen zu betreiben. Aus der Beschreibung des Paketes geht jervor, dass der mitgliefert Treiber (rt2870.bin) in der Version 0.29 vorliegt. Diese Information kann man übrigens auch auch dem syslog entnehmen:
ieee80211 phy0: rt2x00lib_request_firmware: Info - Loading firmware file 'rt2870.bin'
rt2800usb 3-1.1:1.0: firmware: direct-loading firmware rt2870.bin
ieee80211 phy0: rt2x00lib_request_firmware: Info - Firmware detected - version: 0.29
Vom Hersteller selber gibt es auch ein Treiberpaket, welches aus dem Jahr 2013 stammt. Auch wenn dieses Treiberpaket selber mittlerweile schon mehr als 2 Jahre alt ist, enthält es dennoch einen neue Version des Treibers (rt2870.bin) in der Version 0.33. Leider ist der Changelog für zwischen Version 0.29 bis 0.33 unvollständig.
Um diesen Treiber zu verwenden reicht es den alten Treiber zu entladen, sich das Treiberpaket herunterzuladen, zu entpacken und die Datei rt2870.bin auszutauschen.
rmmod rt2800usb cd /usr wget wget http://www.mediatek.com/AmazonS3/Downloads/linux/DPO_MT7601U_LinuxSTA_3.0.0.4_20130913.tar.bz2 bunzip2 DPO_MT7601U_LinuxSTA_3.0.0.4_20130913.tar.bz2 tar xfv DPO_MT7601U_LinuxSTA_3.0.0.4_20130913.tar cd DPO_MT7601U_LinuxSTA_3.0.0.4_20130913/mcu/bin/ cp rt2870.bin /lib/firmware/rt2870.bin modprobe rt2800usb
Anschließend ist im syslog zu sehen, dass der neue Treiber geladen wurde.
ieee80211 phy0: rt2x00lib_request_firmware: Info - Loading firmware file 'rt2870.bin'
rt2800usb 3-1.1:1.0: firmware: direct-loading firmware rt2870.bin ieee80211 phy0:
rt2x00lib_request_firmware: Info - Firmware detected - version: 0.33
Hardwareverschlüsselung deaktivieren
Die Hardwareverschlüsselung kann entwender testweise oder dauerhaft deaktiviert werden. Testweise emfpiehlt sich, um Performance Probleme vor der dauerhaften Aktivierung zu identifizieren, da eine Abschaltung der Hardwareverschlüsselung die CPU Last erhöht.
rmmod rt2800usb modprobe rt2800usb nohwcrypt=1
Um das ganze dauerhaft zu aktivieren, wird die Einstellung in eine Konfig-Datei geschrieben
echo 'options rt2800usb nohwcrypt=1' > /etc/modprobe.d/rt2800usb.conf
Module Parameter kontrollieren
Wer sicherstellen möchte, dass nach der permanenten Aktivierung das Module mit der option nohwcrypt correct geladen wurde, kann sich die Modul Optionen auflisten lassen. Dort sollte dann eine entsprechender Eintrag vorhanden sein.
$ systool -vm rt2800usb
Module = "rt2800usb"
Attributes:
coresize = "28672"
initsize = "0"
initstate = "live"
refcnt = "0"
srcversion = "10BE053D7391DE77EB2FD99"
taint = ""
uevent = <store method only>
version = "2.3.0"
Parameters:
nohwcrypt = "Y"
Sections:
.bss = "0xffffffffa0427740"
.data = "0xffffffffa0425000"
.exit.text = "0xffffffffa042348b"
.gnu.linkonce.this_module= "0xffffffffa04273c0"
.init.text = "0xffffffffa0455000"
.note.gnu.build-id = "0xffffffffa0424000"
.rodata = "0xffffffffa0424340"
.rodata.str1.1 = "0xffffffffa0424024"
.rodata.str1.8 = "0xffffffffa0424040"
.smp_locks = "0xffffffffa0424314"
.strtab = "0xffffffffa0458a90"
.symtab = "0xffffffffa0456000"
.text = "0xffffffffa0422000"
__bug_table = "0xffffffffa0424320"
__mcount_loc = "0xffffffffa04249d8"
__param = "0xffffffffa04249b0"
__verbose = "0xffffffffa0427320"
Hostapd ht_capab korrekt setzten
Der Parameter ht_capab teilt Hostapd mit, über welche Funktionen eine WLAN Karte verfügt, wie zum Beispiel die möglichen Frequenzen, Stromsparfunktionen, Fragementierung oder ähnliches. Hostapd erkennt die möglichen Funktionen der WLAN Karten jedoch meißt nicht richtig, weswegen es zu empfehlen ist, diese manuell zu setzten. Dazu müssen diese zuerst ausgelesen werrden.
Capabilities auslesen
Wenn der Treiber für die WLAN Karte geladen ist, kann man die Capabilities der Karte über iw list auslesen. Interessant sind dabei die Angaben im Abschnitt Capabilities
$ iw list | grep Bitrates -B 100 | grep Capabilities -B 1 -A 100 Band 1: Capabilities: 0x172 HT20/HT40 Static SM Power Save RX Greenfield RX HT20 SGI RX HT40 SGI RX STBC 1-stream Max AMSDU length: 3839 bytes No DSSS/CCK HT40 Maximum RX AMPDU length 65535 bytes (exponent: 0x003) Minimum RX AMPDU time spacing: 2 usec (0x04) HT RX MCS rate indexes supported: 0-7, 32 TX unequal modulation not supported HT TX Max spatial streams: 1 HT TX MCS rate indexes supported may differ Bitrates (non-HT):
Anhand der dort gelieferten Einträge muss man sich nun leider den dazu passenden Parameter für ht_capab manuell heraussuchen. Dies geht entweder indem man in die Beispielconfig von hostapd schaut oder sich die Parameter mittels iw anzeigen lässt
iw --help |less
Capabilities setzten
Nachdem alle Paremter für die unterstützten Paremter rausgesucht und gesetzt wurden,
ht_capab=[HT20][HW40][SMPS-STATIC][GF][SHORT-GI-20][SHORT-GI-40][RX-STBC-1][MAX-AMSDU-3839][MAX-A-MPDU-LEN-EXP3][ht-mcs-7 32]
empfiehlt es sich, hostap mit dem Debug Parameter im Vordergrund zu starten, um die sehen ob alles sauber läuft.
/usr/sbin/hostapd -td /etc/hostapd/hostapd.conf -P /var/run/hostapd.pid
Ein Kommentar
Pingback: Projekt: Fitlet XA-10 als Linux Router › .: blog.cscholz.io :.