Iwlwifi

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page Iwlwifi and the translation is 68% complete.
Outdated translations are marked like this.


Resources

iwlwifi — это драйвер для современных беспроводных чипов Intel.

Ядро

Чтобы заставить его работать, нужно сделать небольшую настройку ядра. Драйвер поддерживает 802.11a/b/g/n/ac (в зависимости от устройства), поэтому IEEE 802.11 должно быть включено.

IEEE 802.11

Включите по крайней мере cfg80211 (CONFIG_CFG80211) и mac80211 (CONFIG_MAC80211).

Драйвер устройства iwlwifi

Используйте этот драйвер для современных беспроводных чипов Intel. Установите как модуль, как показано <M>. Также необходим DVM или MVM вариант согласно записи в колонке Module в таблице firmware.

ЯДРО Параметры для Linux Kernel 4.19
Device Drivers  --->
    [*] Network device support  --->
        [*]   Wireless LAN  --->
            [*]     Intel devices
            <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
Важно
В случае если драйвер встроен в ядро (<*>), а не собран как модуль (<M>), firmware необходимо собрать также непосредственно в ядре. Смотрите раздел если предпочтительней собирать в ядро.
После внесения изменений в конфигурацию ядра не забудьте перекомпилировать ядро.

После перекомпиляции ядра и перезагрузки с использованием нового ядра, выбранные параметры можно проверить следующим образом:

user $zgrep 'IWLWIFI\|IWLDVM\|IWLMVM' /proc/config.gz
Заметка
Поддержка псевдо-файла /proc/config.gz включена с помощью параметра Kernel/IKCONFIG support.

Firmware

Необходимые firmware для конкретных устройств перечислены в этой таблице. Они доступны в пакетах sys-kernel/linux-firmware, а также, для конкретного устройства, в пакетах 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

Если предпочтительней собирать в ядро

В случае если драйвер будет компилироваться в ядре (<*>), а не как модуль (<M>), прошивку необходимо также собирать в ядре.

ЯДРО linux-4.19
Device Drivers  --->
            Generic Driver Options  --->
                Firmware loader --->
 
                    -*- Firmware loading facility
                    (iwlwifi-xxxx.ucode) Build named firmware blobs into the kernel binary
                    (/lib/firmware) Firmware blobs root directory
                    [ ] Enable the firmware sysfs fallback mechanism

В этом примере замените iwlwifi-xxxx.ucode на подходящее имя firmware. Уделите некоторое внимание для 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.

ФАЙЛ /etc/portage/savedconfig/sys-kernel/linux-firmwareTake care that version number is removed
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,}

Имена сетевых устройств

Предупреждение
This section is obsolete. See Udev#Optional: Disable_or_override_predictable_network_interface_naming for updated instructions.

Имена сетевых устройств, такие как eth0 или wlan0 и так далее, как предусмотрено ядром, обычно меняются во время загрузки системы (смотрите dmesg) с помощью /lib/udev/rules.d/80-net-name-slot.rules правила udev.

Чтобы сохранить классическое именование это правило может быть перезаписано пустым файлом с таким же именем в каталоге /etc/udev/rules.d:

root #touch /etc/udev/rules.d/80-net-name-slot.rules


Тестирование

После обновления ядра и перезагрузки или после загрузки модулей, устройства можно проверить на доступность с помощью следующих методов:

Файловая система /sys

Узнать имя устройства можно с помощью просмотра каталога /sys/class/net используя ls -al или команду tree (из пакета app-text/tree):

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

Команда ip

Чтобы убедится, что беспроводная карта обнаружена, а также чтобы узнать имя карты, выполните следующую команду ip:

user $ip addr
3: wlan0:   ...

Команда ifconfig

Команда ifconfig предоставляется пакетом sys-apps/net-tools. Используйте ifconfig -a, чтобы вывести список всех обнаруженных сетевых карт, даже если они не включены/активированы:

user $ifconfig -a
wlan0     ...

Сетевая карта может быть активирована так:

root #ifconfig -v wlan0 up
SIOCSIFFLAGS: Operation not possible due to RF-kill
WARNING: at least one error occurred. (-1)

В этом примере включить беспроводную карту не удалось, поскольку был установлен radio frequency kill state (RF-kill). Как правило, он устанавливается в целях энергосбережения и избежания случайного соединения с беспроводными сетями.

Команда iw

Если драйвер беспроводной сетевой карты поддерживает стэк nl80211, команда iw, которая есть в паете net-wireless/iw, может отобразить обнаруженную беспроводную сетевую карту:

root #iw dev
   phy#0
	Interface wlan0
		ifindex 4
		type managed

modprobe и modinfo

modprobe не должен возвращать что-либо:

root #modprobe iwlwifi

Большую часть информации о драйвере можно получить с помощью modinfo iwlwifi:

user $modinfo iwlwifi

lspci

lspci должен показать iwlwifi в Kernel driver in use: и Kernel modules:.

root #lspci -nnkv | sed -n '/Network/,/^$/p'
03:00.0 Network controller [0280]: Intel Corporation Centrino Advanced-N 6205 [Taylor Peak] [8086:0082] (rev 34)
        Subsystem: Intel Corporation Centrino Advanced-N 6205 AGN [8086:1321]
        Flags: bus master, fast devsel, latency 0, IRQ 33
        Memory at f7d00000 (64-bit, non-prefetchable) [size=8K]
        Capabilities: [c8] Power Management version 3
        Capabilities: [d0] MSI: Enable+ Count=1/1 Maskable- 64bit+
        Capabilities: [e0] Express Endpoint, MSI 00
        Capabilities: [100] Advanced Error Reporting
        Capabilities: [140] Device Serial Number confidential
        Kernel driver in use: iwlwifi
        Kernel modules: iwlwifi

Идентификатор xx:xx.x будет весьма полезен при поиске специфичной информации для этого устройства в выводе dmesg.

dmesg

Проверьте вывод dmesg. Замените 03:00.0 на идентификатор из lspci, а wlp на имя сетевого устройства.

user $dmesg | grep -i -E '03:00.0|wlp|iwl|80211'
[    0.251986] pci 0000:03:00.0: [8086:0082] type 00 class 0x028000
[    0.252146] pci 0000:03:00.0: reg 0x10: [mem 0xf7d00000-0xf7d01fff 64bit]
[    0.252863] pci 0000:03:00.0: PME# supported from D0 D3hot D3cold
[    3.621978] cfg80211: Loading compiled-in X.509 certificates for regulatory database
[    3.629362] cfg80211: Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
[    3.634986] iwlwifi 0000:03:00.0: enabling device (0100 -> 0102)
[    3.635111] iwlwifi 0000:03:00.0: can't disable ASPM; OS doesn't have ASPM control
[    3.644480] iwlwifi 0000:03:00.0: loaded firmware version 18.168.6.1 op_mode iwldvm
[    3.659269] iwlwifi 0000:03:00.0: CONFIG_IWLWIFI_DEBUG disabled
[    3.659270] iwlwifi 0000:03:00.0: CONFIG_IWLWIFI_DEBUGFS disabled
[    3.659271] iwlwifi 0000:03:00.0: CONFIG_IWLWIFI_DEVICE_TRACING enabled
[    3.659273] iwlwifi 0000:03:00.0: Detected Intel(R) Centrino(R) Advanced-N 6205 AGN, REV=0xB0
[    3.694543] ieee80211 phy0: Selected rate control algorithm 'iwl-agn-rs'
[    3.695812] iwlwifi 0000:03:00.0 wlp3s0: renamed from wlan0
[    5.060307] iwlwifi 0000:03:00.0: Radio type=0x1-0x2-0x0
[    5.352853] iwlwifi 0000:03:00.0: Radio type=0x1-0x2-0x0
[    5.431804] IPv6: ADDRCONF(NETDEV_UP): wlp3s0: link is not ready
[    8.908518] wlp3s0: authenticate with <my WLAN AP>
[    8.912238] wlp3s0: send auth to <my WLAN AP> (try 1/3)
[    9.016437] wlp3s0: send auth to <my WLAN AP> (try 2/3)
[    9.120455] wlp3s0: send auth to <my WLAN AP> (try 3/3)
[    9.125773] wlp3s0: authenticated
[    9.126019] wlp3s0: waiting for beacon from <my WLAN AP>
[    9.148418] wlp3s0: associate with <my WLAN AP> (try 1/3)
[    9.191232] wlp3s0: RX AssocResp from <my WLAN AP> (capab=0x1431 status=0 aid=2)
[    9.211860] wlp3s0: associated
[    9.242532] IPv6: ADDRCONF(NETDEV_CHANGE): wlp3s0: link becomes ready
[    9.249856] wlp3s0: Limiting TX power to 20 (20 - 0) dBm as advertised by <my WLAN AP>

Устранение проблем

Ядро не загружается

Проверьте, что загружено правильное ядро. Это можно сделать (зависит от параметра IKCONFIG) так:

user $zgrep CONFIG_IWL /proc/config.gz

Проблемы с прошивкой

  • Для систем использующих udev или systemd надо настроить ядро для загрузки бинарного блоба (binary blob). В случае firmware для беспроводной карты это firmware, который нуждается в загрузки. Больше информации о конфигурации ядра для такой ситуации можно найти в следующей ветке форума Gentoo: FW_LOADER_USER_HELPER_FALLBACK.

Беспроводная сетевая карта не работает

ЯДРО
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:

ФАЙЛ /etc/modprobe.d/iwlwifi.confОтключение 802.11n, включение программной криптографии
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):

ФАЙЛ /etc/modprobe.d/iwlmvm.confChanging power_scheme to '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:

ФАЙЛ /etc/modprobe.d/cfg80211.confTurning off 40 MHz channels usage (2.4 Ghz band)
options cfg80211 cfg80211_disable_40mhz_24ghz=Y

Смотрите также

Внешние ресурсы

References