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

    Links

    1 Kommentar

    1. Pingback: Projekt: Fitlet XA-10 als Linux Router › .: blog.cscholz.io :.

    Leave A Reply