Disconnessioni con Atheros AR9485

Da alcuni mesi ho un bug decisamente antipatico con il WiFi nel mio portatile ASUS N550, dotato di una Qualcomm Atheros AR9485.

La scheda ha sempre funzionato abbastanza bene, viene gestita dal leggendario driver ath9k, uno dei migliori driver prima dell’arrivo di 802.11AC, anche se comunque il mio modello di scheda non è mai stato considerato uno dei migliori.

Ad un certo punto, però, ho cominciato a riscontrare continue disconnessioni, o in alcuni test con wget e altri computer della LAN, riscontravo un brusco calo della velocità di download fino al fermarsi dello stesso.

In particolare, su dmesg riscontravo questo errore:

[   65.582958] ath: phy0: DMA failed to stop in 10 ms AR_CR=0x00000024 AR_DIAG_SW=0x02000020 DMADBG_7=0x00006100
[   66.744578] wlp4s0: authenticate with e8:de:27:xx:xx:xx
[   66.764530] wlp4s0: send auth to e8:de:27:xx:xx:xx (try 1/3)
[   66.769890] wlp4s0: authenticated
[   66.771192] wlp4s0: associate with e8:de:27:xx:xx:xx (try 1/3)
[   66.775556] wlp4s0: RX AssocResp from e8:de:27:xx:xx:xx (capab=0x431 status=0 aid=6)
[   66.775668] wlp4s0: associated

Come potete vedere, è capitato a solo un minuto dal boot.

Fino a poco tempo fa, lo avevo ignorato, perché da diversi mesi ho cominciato a usare quasi unicamente il PC fisso. Se succedeva, resettavo la scheda in hardware con la combinazione da tastiera e dopo per un po’ riprendeva a funzionare, oppure passavo direttamente ai buoni vecchi cavi Ethernet.

In ogni caso ero sicuro che il problema non fosse hardware, perché su quel laptop ho il dual boot con Windows, dove la scheda non mi ha mai dato problemi.

Questo mese ho ricominciato a lavorare, ma non avendo ancora trovato una sistemazione, mi sono adattato un po’ con degli Airbnb, e ho ripreso a usare il notebook come daily driver. A questo punto ho dovuto risolvere il problema.

Non è stato facile trovare la soluzione al problema, finché non ho incluso anche il chip della mia scheda nella ricerca, e a quel punto è venuto in mio soccorso forum di Arch Linux.

La soluzione infatti si è dimostrata molto semplice: basta aggiungere il parametro intel_iommu=off alla riga del comando del kernel Linux, il che può essere fatto, se usate GRUB, semplicemente modificando la variabile GRUB_CMDLINE_LINUX_DEFAULT nel file /etc/default/grub.

Questo parametro disabilità una funzionalità utile solo per fare macchine virtuali con alcune funzionalità avanzate, quali il PCI passthrough. In tutti gli altri casi, comprese le macchine virtuali normali, disabilitarlo non comporta alcun problema, almeno secondo il subreddit, ancora una volta, di Arch Linux.

In particolare questa funzionalità era stata abilitata col kernel Linux 4.13, ma poi aveva creato diversi problemi ed era stata disabilitata di nuovo nel 4.13.5. Magari su Debian hanno deciso di tenerla attiva, anche se non ho ben trovato dove questo sia configurato, e alla fine non mi sono neanche interessato più di tanto e ho semplicemente aggiunto questo parametro.