Linux のドライバを拝借する仕組み LinuxKPI
新しいハードウェアは次々生まれるが FreeBSD 向けにドライバを作るのは大変、ということで Linux のドライバを動かせたら……、しかし GPL コードは取り込みたくない、ということで生まれたのが LinuxKPI というサブシステムです。
LinuxKPIはカーネルレベルの Linux の互換レイヤーです。作成はプログラマが GPL ソースを見ないで作成されています。この互換レイヤーにより、Linuxのドライバを修正することなくFreeBSD でコンパイル&実行できるようになります。
この仕組みはグラフィックドライバ drm ですでに使用されていて、Intel / AMD の新しいグラフィックボード対応が拡充されました。
この成功で波に乗って、WiFi ドライバでも LinuxKPI を使っちゃおうということで、Linux 向けの Intelチップ用 WiFi ドライバ iwlwifi が FreeBSD に取り込まれました。iwlwifi 自体は GPLv2とBSD 3-clause のデュアルライセンスなので、FreeBSD ソースツリーにcontrib として入れることができます(src/sys/contrib/dev/{iwlwifi,iwlwififw} )。
対応は13.1-RELEASE から
iwlwifi は FreeBSD 13.1-RELEASE から導入されました。12系には入らない予定のようです(FreeBSD wiki のFAQ "Will you support FreeBSD 13 or 12? "より)。
対応チップ
current の iwlwifi の man (14-current)によると、
• Intel(R) Dual Band Wireless AC 7260
• Intel(R) Dual Band Wireless N 7260
• Intel(R) Wireless N 7260
• Intel(R) Dual Band Wireless AC 3160
• Intel(R) Dual Band Wireless N 3160
• Intel(R) Wireless N 3160
• Intel(R) Dual Band Wireless AC 3165
• Intel(R) Dual Band Wireless AC 3168
• Intel(R) Dual Band Wireless AC 7265
• Intel(R) Wireless N 7265
• Intel(R) Dual Band Wireless N 7265
• Intel(R) Dual Band Wireless AC 8260
• Intel(R) Dual Band Wireless N 8260
• Intel(R) Dual Band Wireless AC 4165
• Intel(R) Dual Band Wireless AC 8265
• Intel(R) Dual Band Wireless AC 8275
• Killer (R) Wireless-AC 1550 Wireless Network Adapter (9260NGW) 160MHz
• Killer (R) Wireless-AC 1550s Wireless Network Adapter (9560NGW)
• Killer (R) Wireless-AC 1550i Wireless Network Adapter (9560NGW)
• Killer(R) Wireless-AC 1550s Wireless Network Adapter (9560D2W) 160MHz
• Killer(R) Wireless-AC 1550i Wireless Network Adapter (9560NGW) 160MHz
• Killer(R) Wi-Fi 6E AX1690s 160MHz Wireless Network Adapter (411D2W)
• Killer(R) Wi-Fi 6E AX1690i 160MHz Wireless Network Adapter (411NGW)
• Intel(R) Wireless-AC 9260-1
• Intel(R) Wi-Fi 6 AX200 160MHz
• Killer(R) Wi-Fi 6 AX1650w 160MHz Wireless Network Adapter (200D2W)
• Killer(R) Wi-Fi 6 AX1650x 160MHz Wireless Network Adapter (200NGW)
• Intel(R) Wi-Fi 6 AX201 160MHz
• Killer(R) Wi-Fi 6 AX1650s 160MHz Wireless Network Adapter (201D2W)
• Killer(R) Wi-Fi 6 AX1650i 160MHz Wireless Network Adapter (201NGW)
• Killer(R) Wi-Fi 6 AX1650s 160MHz Wireless Network Adapter (201NGW)
• Killer(R) Wi-Fi 6 AX1650i 160MHz Wireless Network Adapter (201D2W)
• Intel(R) Wi-Fi 6E AX211 160MHz
• Intel(R) Wi-Fi 6 AX210 160MHz
• Killer(R) Wi-Fi 6E AX1675w 160MHz Wireless Network Adapter (210D2W)
• Killer(R) Wi-Fi 6E AX1675x 160MHz Wireless Network Adapter (210NGW)
• Intel(R) Wi-Fi 6E AX411 160MHz
• Killer(R) Wi-Fi 6E AX1675s 160MHz Wireless Network Adapter (211NGW)
• Killer(R) Wi-Fi 6E AX1675i 160MHz Wireless Network Adapter (211NGW)
• Intel(R) Wireless-AC 9461 160MHz
• Intel(R) Wireless-AC 9461
• Intel(R) Wireless-AC 9462 160MHz
• Intel(R) Wireless-AC 9462
• Intel(R) Wireless-AC 9560 160MHz
• Intel(R) Wireless-AC 9560
• Intel(R) Wireless-AC 9270 160MHz
• Intel(R) Wireless-AC 9270
• Intel(R) Wireless-AC 9162 160MHz
• Intel(R) Wireless-AC 9162
• Intel(R) Wireless-AC 9260 160MHz
• Intel(R) Wireless-AC 9260
• Intel(R) Wi-Fi 6 AX101
• Intel(R) Wi-Fi 6 AX203
• Intel(R) Wi-Fi 6E AX221 160MHz
• Intel(R) Wi-Fi 6E AX231 160MHz
• Intel(R) TBD Bz device
• Intel(R) Wi-Fi 6 AX204 160MHz
current の man なので 13.1-RELEASE とは状況が違うかもしれません。
上記には従来 iwm でサポートされていたチップも含まれていますので、古いチップならばどちらのドライバを使うか選ぶこともできます。
使い方
肝心の使い方ですが、だいたい従来の WiFi ドライバと同じです。
ドライバのカーネルモジュールを明示的にロードするため/etc/rc.conf の kld_list にif_iwlwifiを追記します。
kld_list="if_iwlwifi"
グラフィックドライバも Intel を使っている人はすでに i915kms.ko が入っていると思うので、
kld_list="/boot/modules/i915kms.ko if_iwlwifi"
という風にスペースを挟んで追記する形になると思います。
あとは他の WiFiドライバと同様に設定します。
/etc/rc.conf には
wlans_iwlwifi0=wlan0
ifconfig_wlan0="DHCP WPA -powersave"
上記では DHCP を設定しています。
あとは wpa_passphrase コマンドで
wpa_passphrase お家のssid password
でssidとパスワード指定して出力された
network={
ssid="お家のssid"
#psk="password"
psk=a11c3e81e37118ce8e640b076239ef95f3cbc5a3b961010e10255b31ba69aace
}
を /etc/wpa_supplicant.conf に書き込めばWiFi 設定完了です。
dmesg で確認です。ThinkPad X250 で、Intel(R) Wireless N 7265 が認識されています。
Intel(R) Wireless WiFi based driver for FreeBSD
iwlwifi0: <iwlwifi> mem 0xf1000000-0xf1001fff at device 0.0 on pci2
iwlwifi0: successfully loaded firmware image 'iwlwifi-7265D-29.ucode'
iwlwifi0: Found debug destination: EXTERNAL_DRAM
iwlwifi0: Found debug configuration: 0
iwlwifi0: loaded firmware version 29.4063824552.0 7265D-29.ucode op_mode iwlmvm
iwlwifi0: Detected Intel(R) Wireless N 7265, REV=0x210
iwlwifi0: Applying debug destination EXTERNAL_DRAM
iwlwifi0: Allocated 0x00400000 bytes for firmware monitor.
iwlwifi0: base HW address: 18:5e:0f:24:e3:39, OTP minor version: 0x0
lagg が使えない
私の環境では iwm ドライバでも使用可能です。現状私が使う上で2つのドライバの大きな違いは、iwlwifi では lagg が使えないということです。
有線と WiFi が両方使用できるノートPCでは、有線のインターフェースと無線のインターフェースを フェイルオーバーのlaggでまとめて、有線接続時は有線、有線ケーブルを外したら WiFiに切り替わるように設定するのが定番です。それが今は iwlwifiではできないので、私はまだ iwm ドライバを使っています。ここらへんはそのうち改善されると思うので、今後に期待です。