iwlwifi

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page Iwlwifi and the translation is 100% complete.
Resources

iwlwifiIntel の現行の無線チップのための無線ドライバです。正常に機能させるには、カーネルの wifi スタックによるサポートと、カード固有のファームウェアが実行時にロードされていることが必要です。

カーネル

動作させるためにはカーネルコンフィグが必要です。ドライバは 802.11a/b/g/n/ac(デバイスによって異なります)をサポートしているので、IEEE 802.11 を有効にする必要があります。

IEEE 802.11

少なくとも cfg80211 (CONFIG_CFG80211) と mac80211 (CONFIG_MAC80211) を有効にしてください。詳細については Wi-Fi の記事の IEEE 802.11 の節を参照してください。

iwlwifi デバイスドライバ

Intel の現行の無線チップにはこのドライバを使用してください。次に示すとおり、モジュール <M> として設定してください。加えて、DVM または MVM のうち正しいほうをファームウェアの表Module の列を見て選択する必要があります。

カーネル Linux カーネル 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>)のではなく、カーネルに組み込む(<*>)場合は、ファームウェアもカーネルに組み込む必要があります。カーネルに組み込む場合の節を見てください。
カーネルコンフィグを変更した後は忘れずにカーネルを再ビルドしてください。

カーネルを再ビルドし、このカーネルで再起動したら、選択は次のように確認できます:

user $zgrep 'IWLWIFI\|IWLDVM\|IWLMVM' /proc/config.gz
メモ
/proc/config.gz ファイルのサポートは Kernel/IKCONFIG support 機能によって有効化することができます。

ファームウェア

この表にある通り、各デバイス毎に追加のファームウェアも必要です。現代的なファームウェアは sys-linux/linux-firmware パッケージでいつでも利用可能です。もし linux-firmware に存在しない場合は、デバイス個別の sys-firmware/iwlxxxx-*ucode パッケージで見つかるかもしれません。

Intel の上流の手順[1]では、すべての iwlwifi ucode をカーネルイメージに追加することを推奨しています。これは利便性を考えて推奨されていますが、カーネルを多少肥大化させるでしょう。

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を実際のファームウェア名に置き換えてください。FW_LOADER_USER_HELPER_FALLBACK にも注意してください。

追加可能: savedconfig

/lib/firmware に不要なものがインストールされるのを防ぐために、Linux ファームウェアsavedconfig USE フラグを設定することができます。

例えば、 Intel® Centrino® Advanced-N 6205iwlwifi-6000g2a-ucode を必要としている一方で、他はすべてコメントアウト、あるいは削除できます。

ファイル /etc/portage/savedconfig/sys-kernel/linux-firmwareバージョン番号が取り除かれていることに注意してください
iwlwifi-6000g2a-5.ucode
iwlwifi-6000g2a-6.ucode

次のファームウェアアップデート時にこれらの設定が失われないようにするには、バージョン番号を取り除く必要があります。

user $cd /etc/portage/savedconfig/sys-kernel
root #mv linux-firmware{-20200316,}

ネットワークデバイス名

警告
このセクションの情報は古くなっています。更新された手順については Udev#省略可能: 予測可能なネットワークインターフェース名を無効化または上書きするを参照してください。

カーネルによって提供される eth0 や wlan0 のようなネットワークデバイス名は、通常は /lib/udev/rules.d/80-net-name-slot.rules での udev ルールによってシステムの起動時に変更されます (dmesg 参照)。

旧来の命名ルールを維持するには、/etc/udev/rules.d ディレクトリ内に、同じ名称のファイルを空で作成することで上書きします:

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


テスト

新しいカーネルで再起動するかモジュールを読み込んだ後で、以下の方法を使ってデバイスが利用可能かテストできます:

/sys ファイルシステム

/sys/class/net ディレクトリの内容を ls -al や(app-text/tree パッケージに入っている)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 がセットされているため、ワイヤレスカードの有効化は失敗しています。

iw コマンド

ワイヤレスネットワークカードのドライバーが nl80211 スタックをサポートしていれば、 net-wireless/iw パッケージで提供される iw コマンドで、認識されているワイヤレスカードを表示できます:

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

modprobe と modinfo

modprobe は何も出力しないはずです:

root #modprobe iwlwifi

ドライバモジュールに関するほとんどの情報は modinfo iwlwifi から得られます

user $modinfo iwlwifi

lspci

lspciKernel driver in use:Kernel modules: の欄に iwlwifi と表示するはずです:

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 からの特定の情報を grep するのに役立ちます。

dmesg

dmesg の出力を確認してください。03:00.0lspci から得られた識別名で読み替え、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を使っているシステムに対して、バイナリを読み込むようにカーネルを設定することは必須事項です。カーネルの設定に関するさらなる詳細は、以下のGentoo forumsのスレッドを参照してください: FW_LOADER_USER_HELPER_FALLBACK.

無線が動作していない

カーネル
Device Drivers  --->
    [*] PCI support  --->
        [*] Network device support  --->
        [*]   Message Signaled Interrupts (MSI and MSI-X)

インターネットに接続されていない

アクセスポイントに接続済みであるが、未だにどのサーバーもしくはインターネットにアクセスできない場合は、802.11nを無効化して、(もしくは)software encryptionを有効化することが良いかもしれません。iwlwifiモジュールに11n_disable=1または11n_disable=8と(もしくは)swcrypto=1のオプションを設定することができます。モジュールを読み込む時に自動的にオプションを適応するには、以下のように次のファイル(/etc/modprobe.d/iwlwifi.conf)を設定してください。

ファイル /etc/modprobe.d/iwlwifi.conf802.11nを無効化して、software cryptoを有効化する
options iwlwifi 11n_disable=1 swcrypto=1
メモ
より新しいカーネルでは、5.3.7 で確認されていますが、11n_disable=1 を設定する (または 0x01 でマスクされる) と 802.11ac が無効化されてしまいます。これは最大スループット 54Mbit にデバイスを制限するでしょう。

カーネルログ中の "Microcode SW error detected. Restarting 0x0" メッセージ

root #dmesg | grep iwlwifi
(... 省略 ...)
[ 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
(... 省略 ...)
[ 5711.329587] iwlwifi 0000:28:00.0: ieee80211 phy0: Hardware restart was requested

これは、リセットされることになった WiFi アダプタのマイクロコントローラが、深刻なエラーに遭遇したことを示しています。その結果として、AP への接続が回復した後も、ネットワークに参加できなかったり、深刻な速度低下が発生することがあります。根本原因を特定するのは難しいかもしれません (プラットフォーム自身の無線ノイズ/バグのあるファームウェア/など) が、まず試してみるべきことのひとつは、iwlwifi モジュールの電源管理が無効化されていたとしても、WiFi アダプタ PCIe リンクが省電力モードにならないように設定することです。これは iwlmvm モジュールによって使用される power_scheme の値を 1 (アクティブ) に変更することで行えます:

ファイル /etc/modprobe.d/iwlmvm.confpower_scheme を 'active' に変更する
options iwlmvm power_scheme=1

https://wireless.wiki.kernel.org/en/users/drivers/iwlwifi で提案されている追加の対策のうち、2.4GHz バンドでの 40 MHz チャネルの使用を無効化することも助けになるかもしれません:

ファイル /etc/modprobe.d/cfg80211.conf40 MHz チャネルの使用をオフにする (2.4 Ghz バンド)
options cfg80211 cfg80211_disable_40mhz_24ghz=Y

関連項目

外部資料

References