Iwlwifi
iwlwifi es el driver para los chips actuales de Intel.
Kernel
Para que funcione es necesario configurar algunas opciones del kernel. El controlador soporta 802.11a/b/g/n/ac (dependiendo del dispositivo), por lo que debe habilitarse IEEE 802.11.
IEEE 802.11
Activate at least cfg80211 (CONFIG_CFG80211) and mac80211 (CONFIG_MAC80211). For details see IEEE 802.11 section of Wi-Fi artice.
Controlador de dispositivo iwlwifi
Usa este driver para chips Intel actuales. Configúralo como módulo de esta forma: <M>
. También es necesaria la opción DVM o MVM correcta, acorde a la columna Module de la tabla de firmware.
Device Drivers --->
[*] Network device support --->
--- Network device support
[*] Wireless LAN --->
--- Wireless LAN
[ ] ADMtek devices
[ ] Atheros/Qualcomm devices
[ ] Atmel devices
[ ] Broadcom devices
[ ] Cisco devices
[*] Intel devices
< > Intel PRO/Wireless 2100 Network Connection
< > Intel PRO/Wireless 2200BG and 2915ABG Network Connection
< > Intel Wireless WiFi 4965AGN (iwl4965)
< > Intel PRO/Wireless 3945ABG/BG Network Connection (iwl3945)
<M> Intel Wireless WiFi Next Gen AGN - Wireless-N/Advanced-N/Ultimate-N (iwlwifi)
<M> Intel Wireless WiFi DVM Firmware support
<M> Intel Wireless WiFi MVM Firmware support
[ ] Enable broadcast filtering (NEW)
[ ] Enable runtime power management mode for PCIe devices (NEW)
Debugging Options --->
[ ] Intersil devices
[ ] Marvell devices
[ ] MediaTek devices
[ ] Ralink devices
[ ] Realtek devices
[ ] Redpine Signals Inc devices
[ ] STMicroelectronics devices
[ ] Texas Instrument devices
[ ] ZyDAS devices
< > Simulated radio testing tool for mac80211
< > Wireless RNDIS USB support
En caso de compilar el driver dentro del kernel (
<*>
) en lugar de como módulo (<M>
), también el firmware debe ser compilado dentro del kernel. Vea la sección When using built-in configuration.
Luego de los cambios en la configuración del kernel, no olvide recompilarlo.
Abajo se muestra cómo se puede comprobar las opciones seleccionadas una vez reconstruido el núcleo y reiniciado con él:
user $
zgrep 'IWLWIFI\|IWLDVM\|IWLMVM' /proc/config.gz
El soporte para el pseudofichero /proc/config.gz se habilita a través de la característica Kernel/IKCONFIG_support.
Firmware
También es necesario firmware individual para los dispositivos como se muestra en esta tabla. Está disponible en el paquete sys-kernel/linux-firmware y en los paquetes para dispositivos específicos sys-firmware/iwlxxxx-*ucode.
Upstream Intel instructions recommend[1] adding all iwlwifi ucode to the kernel image. This is recommended for convenience, however it will bloat the kernel slightly.
root #
emerge --ask sys-kernel/linux-firmware
Compilando el driver dentro del kernel
En caso de compilar el driver dentro del kernel (<*>
) en lugar de como módulo (<M>
), también el firmware debe ser compilado dentro del kernel.
Device Drivers --->
Generic Driver Options --->
-*- Userspace firmware loading support
[ ] Include in-kernel firmware blobs in kernel binary
(iwlwifi-xxxx.ucode) External firmware blobs to build into the kernel binary
(/lib64/firmware) Firmware blobs root directory
[ ] Fallback user-helper invocation for firmware loading
En este caso reemplace iwlwifi-xxxx.ucode
con el nombre exacto del firmware. Parece que es necesario cierta atención para FW_LOADER_USER_HELPER_FALLBACK.
Optional: savedconfig
The savedconfig
USE flag could be set for Linux firmware in order to avoid unneeded stuff in /lib/firmware/.
As for example the Intel® Centrino® Advanced-N 6205 needs iwlwifi-6000g2a-ucode while anything else may be commented out or deleted.
iwlwifi-6000g2a-5.ucode
iwlwifi-6000g2a-6.ucode
In order to not lose these settings on next firmware update the version number needs to be removed:
user $
cd /etc/portage/savedconfig/sys-kernel
root #
mv linux-firmware{-20200316,}
Nombres de los dispositivos de red
This section is obsolete. See Udev#Optional: Disable_or_override_predictable_network_interface_naming for updated instructions.
Los nombres de dispositivos de red eth0
, eth1
, etc. tal y como los suministra el núcleo podrían cambiar en el arranque (ver dmesg) por la regla udev /lib/udev/rules.d/80-net-name-slot.rules.
Para mantener el nombrado clásico, se puede sobrescribir esta regla con un fichero vacío con el mismo nombre en el directorio /etc/udev/rules.d:
root #
touch /etc/udev/rules.d/80-net-name-slot.rules
Testing
Después de reiniciar con el nuevo kernel o de cargar los módulos, Se puede chequear la disponibilidad del dispositivo usando los siguientes métodos:
- Mediante el sistema de ficheros /sys
- Mediante la orden ip
- Mediante la orden ifconfig
- Mediante la orden iw
Sistema de archivos /sys
Get the device name by listing the /sys/class/net directory contents using ls -al or the tree command (provided by the app-text/tree package):
user $
tree /sys/class/net
/sys/class/net/ ├── enp2s14 -> ../../devices/pci0000:00/0000:00:1e.0/0000:02:0e.0/net/enp2s14 ├── lo -> ../../devices/virtual/net/lo ├── sit0 -> ../../devices/virtual/net/sit0 └── wlp8s0 -> ../../devices/pci0000:00/0000:00:1c.0/0000:08:00.0/net/wlp8s0
Orden ip
Para obtener el nombre del dispositivo y verificar que la tarjeta inalámbrica es detectada, ejecute el siguiente ip comando:
user $
ip addr
3: wlan0: ...
Orden ifconfig
El comando ifconfig es provisto por el paquete sys-apps/net-tools. Usa ifconfig -a para listar todas las tarjetas de red detectadas, incluso si aún no están activas o habilitadas:
user $
ifconfig -a
wlan0 ...
Una tarjeta de red puede ser activada de la siguiente forma:
root #
ifconfig -v wlan0 up
SIOCSIFFLAGS: Operation not possible due to RF-kill WARNING: at least one error occurred. (-1)
En este ejemplo, la habilitación de la tarjeta de red falló debido a que el estado RF-kill (radio frequency kill state) está habilitado (usualmente para evitar el consumo de energía y no conectar por accidente a una red inalámbrica).
Orden iw
Si el controlador de la tarjeta de red soporta nl80211, entonces el comando iw del paquete net-wireless/iw puede mostrar las tarjetas de red inalámbricas:
root #
iw dev
phy#0 Interface wlan0 ifindex 4 type managed
modprobe y modinfo
modprobe no debe devolver nada:
root #
modprobe iwlwifi
Puede obtenerse más información sobre el módulo con modinfo iwlwifi.
user $
modinfo iwlwifi
lspci
lspci debe mostrar iwlwifi
tanto Kernel driver in use:
como Kernel modules:
.
root #
lspci -k
xx:xx.x Network controller: Intel Corporation Wireless xxxx Kernel driver in use: iwlwifi Kernel modules: iwlwifi
El identificador xx:xx.x
será útil para buscar información específica con dmesg.
dmesg
Comprobar la salida de dmesg. Reemplazar xx:xx.x
por el identificador que se muestra en lspci y wlan
por el nombre de la interfaz de red.
user $
dmesg | grep -i -E 'xx:xx.x|wlan|iwl|80211'
Resolución de problemas
No se ha cargado el núcleo
Comprobar que se ha cargado el núcleo correcto. A continuación se muestra cómo se puede hacer esto (depende del la característica IKCONFIG):
user $
zgrep CONFIG_IWL /proc/config.gz
Problemas de firmware
- Es necesario configurar el kernel para que cargue blobs binarios en sistemas que utilizan udev o systemd. En este caso el firmware de la tarjeta inalámbrica es el firmware que debe ser cargado. Más información sobre esta forma de configurar el kernel se puede encontrar en el siguiente hilo de los foros de Gentoo: FW_LOADER_USER_HELPER_FALLBACK.
Wireless no funciona
- Intel Corporation Wireless 8260 (rev 3a) can't access the RSA semaphore it is write protected
Device Drivers --->
[*] PCI support --->
[*] Network device support --->
[*] Message Signaled Interrupts (MSI and MSI-X)
No internet connection
If you can connect to an access point, but still can't connect to any server or get any connection to the internet it might be worth a try to disable 802.11n and/or enable software encryption. You can pass the 11n_disable=1
or 11n_disable=8
and/or swcrypto=1
option to the iwlwifi
module. In order to pass the option automatically on module load create the file /etc/modprobe.d/iwlwifi.conf as follows:
options iwlwifi 11n_disable=1 swcrypto=1
In newer kernels, inspected as of 5.3.7, setting 11n_disable=1 (or masked with 0x01) will result in 802.11ac being disabled. This will limit the device to a maximum of 54Mbit throughput.
"Microcode SW error detected. Restarting 0x0" message in kernel logs
root #
dmesg | grep iwlwifi
(... redacted ...) [ 5711.326985] iwlwifi 0000:28:00.0: Microcode SW error detected. Restarting 0x0. [ 5711.326987] iwlwifi 0000:28:00.0: Start IWL Error Log Dump: [ 5711.326990] iwlwifi 0000:28:00.0: Transport status: 0x0000004A, valid: 6 [ 5711.326992] iwlwifi 0000:28:00.0: Loaded firmware version: 71.058653f6.0 ty-a0-gf-a0-71.ucode [ 5711.326993] iwlwifi 0000:28:00.0: 0x00000071 | NMI_INTERRUPT_UMAC_FATAL [ 5711.326995] iwlwifi 0000:28:00.0: 0x00008210 | trm_hw_status0 [ 5711.326998] iwlwifi 0000:28:00.0: 0x00000000 | trm_hw_status1 [ 5711.327001] iwlwifi 0000:28:00.0: 0x004DAEA2 | branchlink2 [ 5711.327003] iwlwifi 0000:28:00.0: 0x004D9974 | interruptlink1 [ 5711.327004] iwlwifi 0000:28:00.0: 0x004D9974 | interruptlink2 [ 5711.327006] iwlwifi 0000:28:00.0: 0x0000C314 | data1 [ 5711.327008] iwlwifi 0000:28:00.0: 0x00000010 | data2 [ 5711.327009] iwlwifi 0000:28:00.0: 0x00000000 | data3 (... redacted ...) [ 5711.329587] iwlwifi 0000:28:00.0: ieee80211 phy0: Hardware restart was requested
This indicates that a severe error has been encountered by the WiFi adapter's micro-controller which led it to be reset. Consequences might be network drop outs and/and severe slow downs even after the connection to the AP has been restored. The root cause might be difficult to point out (platform own radio noise/buggy firmware/etc) however one of the very first things to try, even if the power management has been disabled for the iwlwifi module, is to prevent the WiFi adapter PCIe link to go in power save mode. This is accomplished by changing the power_scheme
value used by the iwlmvm module to 1 (active):
options iwlmvm power_scheme=1
Amongst additional countermeasures suggested on https://wireless.wiki.kernel.org/en/users/drivers/iwlwifi disabling 40 MHz channels usage on the 2.4GHz band might also help:
options cfg80211 cfg80211_disable_40mhz_24ghz=Y