【この門をくぐる者は、一切の希望を捨てよ】
気まぐれで購入した WI-U3-866DS だけど、Rapberry Pi に繋げると信じられないほど不安定で苦労している。
ここで言う不安定とは、ネットワークに繋がりにくい、よく切れるといった類ではなく、よくフリーズするということ。
カーネルコード (kernel code)
デバイスドライバはカーネルの一部なので、カーネル内の他のコードと同様に、もし 上手く動かないとシステムに深刻な影響を与える。出来の悪いドライバはシステムを クラッシュさせる場合すらあり、その結果ファイルシステムが破壊されデータが喪失 することもあり得る。
堅牢とされる Linux が固まるって何だよと最初は思ったけど、獅子、身中の虫ってやつか。ファイルが壊れたことはないけど、とにかくよく固まる。
もう何度 WI-U3-866DS を窓から投げ捨てようとした Raspberry Pi 電源USBの OFF/ON を繰り返したことか。思わずアマゾンで ON/OFFスイッチ付き USBケーブルをポチってしまった程。(これはこれで便利で重宝しているけど)
この WI-U3-866DS を Linux環境(Raspberry Pi)で使う方法をぐぐると沢山のページがヒットするけど、書かれているのはドライバのインストール方法だけ。皆さんまともに使えているんだろうか? フリーズしまくるのは自分だけ?
でも rtl8812au freeze
等でぐぐると、これまた色々と出てくる。やはり不安定なドライバっぽい。
互換性のあるWiFiチップセットの可用性
Wifiは常に自由ソフトウェアユーザーにとって問題でした。
(中略)
次回ハードウェアを購入するときは、それが自由ソフトウェアと互換性があるかどうかを自問してください。
つくづく無線LAN は Linux の鬼門だよなぁ。これがオープンソースの現実というか。只より高いものはないっていう。
ビルド済みドライバのインストールやソースファイルからのビルド・インストールだけではなく、できるだけ安定させる方法も含めて情報共有したい。
【ビルド済みドライバのダウンロードとインストール】
1. ビルド済みドライバのダウンロード
これまた不思議と WI-U3-866DS(チップセットrtl8812au)ドライバの Rapberry Pi へのインストール方法をぐぐると、ドライバソースのダウンロード、ビルド、インストールの手順しか出てこない。
しかし、(実は自分も後から知ったんだけど)ビルド済ドライバを有志の方がアップしていて以下からダウンロードできる。
Index of /wifi-drivers/8812au-drivers
8812au-5.10.17-
は対応する WI-U3-866DS のチップセット、カーネルのバージョン。
それに続くファイル名が、無印、v7、v7l、v8 の四つでワンセットになっていることが分かると思う。
これらは対応する Raspberry Pi を表している。以下参照。
ファイル名 | 対応Pi |
---|---|
無印 | Pi1、PiZero、PiZeroW、CM |
v7 | Pi2、Pi3、Pi3+、CM3 |
v7l | Pi4 |
v8 | 64bit用 |
自身のカーネルバージョンの確認は uname -r
で。
pi@raspberrypi4:~/rtl8821au/aircrack-ng $ uname -r
5.10.17-v7l+
pi@raspberrypi4:~/rtl8821au/aircrack-ng $
該当ファイルは 8812au-5.10.17-v7l-1403.tar.gz
となる。これをダウンロードし、Rasberry Pi の任意のフォルダに配置。
または Raspberry Pi 上で wget
コマンドで取得。
pi@raspberrypi4:~/rtl8821au/aircrack-ng $ wget http://downloads.fars-robotics.net/wifi-drivers/8812au-drivers/8812au-5.10.17-v7l-1403.tar.gz
--2021-03-28 18:58:47-- http://downloads.fars-robotics.net/wifi-drivers/8812au-drivers/8812au-5.10.17-v7l-1403.tar.gz
downloads.fars-robotics.net (downloads.fars-robotics.net) をDNSに問いあわせています... 82.68.133.179
downloads.fars-robotics.net (downloads.fars-robotics.net)|82.68.133.179|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 1060984 (1.0M) [application/x-gzip]
`8812au-5.10.17-v7l-1403.tar.gz' に保存中
8812au-5.10.17-v7l-1403.tar.gz 100%[=====================================================================>] 1.01M 38.7KB/s 時間 28s
2021-03-28 18:59:16 (36.4 KB/s) - `8812au-5.10.17-v7l-1403.tar.gz' へ保存完了 [1060984/1060984]
pi@raspberrypi4:~/rtl8821au/aircrack-ng $
2. ダウンロードファイル解凍
ダウンロードしたファイルを tar -zxf
で解凍。(転載する上で邪魔くさいので vオプションは省略)
pi@raspberrypi4:~/rtl8821au/aircrack-ng $ tar -zxf 8812au-5.10.17-v7l-1403.tar.gz
pi@raspberrypi4:~/rtl8821au/aircrack-ng $ ls
8812au-5.10.17-v7l-1403.tar.gz 8812au.conf 8812au.ko install.sh
以下のファイルが展開される。
ファイル名 | 内容 |
---|---|
8812au.conf | ドライバパラメータファイル |
8812au.ko | ドライバ本体 |
install.sh | インストールシェルスクリプト |
3. インストール
解凍した ./install.sh
を実行。
pi@raspberrypi4:~/rtl8821au/aircrack-ng $ ./install.sh
sudo install -p -m 644 8812au.ko /lib/modules/5.10.17-v7l+/kernel/drivers/net/wireless
sudo depmod 5.10.17-v7l+
Reboot to run the driver.
If you have already configured your wifi it should start up and connect to your
wireless network.
If you have not configured your wifi you will need to do that to enable the wifi.
pi@raspberrypi4:~/rtl8821au/aircrack-ng $
reboot を促すメッセージが表示されるけど、単にドライバを入れただけの状態で WI-U3-866DS を刺すと最悪フリーズする。
より安定させる為の方法があり、再起動前にその設定を行う。
また再起動後に WI-U3-866DS を刺した方が無難。(それでもフリーズする場合はあるけど)
4. インストール後の設定
- 内蔵無線LAN 停止
話がややこしくなるので止めておく。/boot/config.txt
の最後に以下追記。
dtoverlay=disable-bt
dtoverlay=disable-wifi
disable-bt
は Bluetooth、disable-wifi
は WiFi。Bluetoothも? と思われるかもしれないけど、内臓無線LAN のチップセットは Bluetooth も統合されているので。
rtl8812auチップセットも Bluetooth が統合されているので、必要があればそちらから利用できる筈。(多分)
それとよく以下を追記する手順を見かけるけど、これは古い記述方法。
dtoverlay=pi3-disable-wifi
dtoverlay=pi3-disable-bt
後方互換でこの記述はまだ許されているようだけど、/boot/overlays/README
を見れば以下の説明が確認できる。
Name: disable-bt
Info: Disable onboard Bluetooth on Pi 3B, 3B+, 3A+, 4B and Zero W, restoring
UART0/ttyAMA0 over GPIOs 14 & 15.
N.B. To disable the systemd service that initialises the modem so it
doesn't use the UART, use 'sudo systemctl disable hciuart'.
Load: dtoverlay=disable-bt
Params: <None>
Name: disable-wifi
Info: Disable onboard WiFi on Pi 3B, 3B+, 3A+, 4B and Zero W.
Load: dtoverlay=disable-wifi
Params: <None>
又は、/etc/modprobe.d/raspi-blacklist.conf
に以下の記述でも良い。
blacklist brcmfmac
blacklist brcmutil
こちらは汎用的な方法。逆に 8812auドライバを無効にしたい場合はこのファイルに以下のように記述すれば良い。
blacklist 8812au
- 安定度を増す為の設定
/etc/iwd
ディレクトリが無ければまず sudo mkdir /etc/iwd
で作成。/etc/iwd/main.conf
に以下追記。
[General]
UseDefaultInterface=true
この情報の出どころは ここ。
この設定でフリーズしなくなる、とまでは残念ながらいかないけど、フリーズする頻度はかなり下がる。
- 起動時にドライバを明示的に読み込む設定
sudo su -
等で root に切り替え以下実行。
echo 8812au > /etc/modules-load.d/8812au.conf
この設定を行わなくても、Raspberry Pi 本体が WI-U3-866DSを検知すれば自動的にドライバをロードしてくれるので、あっても無くても同じ。
但し、起動時にフリーズが頻発する場合はこの設定を外したり(その場合はファイル自体削除)、逆に設定してみたりとかの試行錯誤には使えるかな。多分変わらないと思うけど。
- USB3モード設定
この製品、USB3.0で高速な転送速度を実現
を謳っているのに、デフォルトでは USB2.0モードだったりする。
それは、lsusb -t
コマンドで確認できる。
pi@raspberrypi4:~ $ lsusb -t
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M
|__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 2: Dev 3, If 0, Class=Vendor Specific Class, Driver=8812au, 480M
|__ Port 3: Dev 4, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
|__ Port 4: Dev 5, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
pi@raspberrypi4:~ $
Driver=8812au, 480M
とあり、転送速度から USB2.0モードであることが分かる。
ドライバインストール時、/etc/modprobe.d/8812au.conf
の初期設定は options 8812au rtw_power_mgnt=0 rtw_enusbss=0 rtw_drv_log_level=0
となっている。
rtw_power_mgnt=0
は省電力設定OFF、rtw_enusbss=0
は自動サスペンド OFF。動作が安定する。
USB3モードに切り替える為にはこれに rtw_switch_usb_mode=1
を追記する。
pi@raspberrypi4:~/rtl8821au/aircrack-ng $ cat /etc/modprobe.d/8812au.conf
#blacklist brcmfmac
options 8812au rtw_power_mgnt=0 rtw_enusbss=0 rtw_drv_log_level=0 rtw_switch_usb_mode=1
pi@raspberrypi4:~/rtl8821au/aircrack-ng $
ネットを検索すると、ドライバ読み込み時に設定する方法や、/sys/module/8812au/parameters/rtw_switch_usb_mode
に記述する方法が出てくるけど、再起動後に元に戻ってしまったり、後者はそもそも設定値を保存する場所だったりする。
あくまでも 8812auドライバは起動時に /etc/modprobe.d/8812au.conf
を読み込んで挙動を決定するのでこの方法が一番間違いない。
再起動後、再度 lsusb -t
で USB3.0モードに切り替わっていることを確認。
pi@raspberrypi4:~ $ lsusb -t
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M
|__ Port 2: Dev 2, If 0, Class=Vendor Specific Class, Driver=8812au, 5000M
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M
|__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 3: Dev 4, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
|__ Port 4: Dev 5, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
pi@raspberrypi4:~ $
Driver=8812au, 5000M
転送速度が 5G、これはつまり USB3.0 の転送速度。
因みに、WiFi の転送速度が 2、300Mbits/sec 程度であるなら、どのみち USB2.0 の転送レンジで足りるのでは? という意見もネット上で見受けられるけど、少なくとも 8812auドライバに関しては USB3.0モードに切り替えた方がリンクスピードはアップする。USB2.0モード時で内蔵WiFi の約1.5倍、USB3.0モード時で約3倍。
特別な理由がない限りは USB3.0モード推奨。
【その他設定】
- monitorモード設定
現在のモードの確認は iwconfig
コマンドで、monitorモード設定は以下で。
sudo ip link set wlan0 down && sudo iw dev wlan0 set type monitor && sudo ip link set wlan0 up
managedモードに戻す場合は以下で。
sudo ip link set wlan0 down && sudo iw dev wlan0 set type managed && sudo ip link set wlan0 up
実行例は以下。
pi@raspberrypi4:~ $ iwconfig wlan0 | grep Mode:
Mode:Managed Frequency:5.26 GHz Access Point: 1*:**:**:**:**:*5
pi@raspberrypi4:~ $ sudo ip link set wlan0 down && sudo iw dev wlan0 set type monitor && sudo ip link set wlan0 up
pi@raspberrypi4:~ $ iwconfig wlan0 | grep Mode:
Mode:Monitor Frequency:5.26 GHz Access Point: 1*:**:**:**:**:*5
pi@raspberrypi4:~ $ sudo ip link set wlan0 down && sudo iw dev wlan0 set type managed && sudo ip link set wlan0 up
pi@raspberrypi4:~ $ iwconfig wlan0 | grep Mode:
Mode:Managed Frequency=5.26 GHz Access Point: Not-Associated
pi@raspberrypi4:~ $
- 送信出力設定
現在の送信出力設定の確認は iw dev
コマンドで。送信出力設定は以下で。
sudo iw wlan0 set txpower fixed 2000
実行例は以下。
pi@raspberrypi4:~ $ iw dev | grep txpower
txpower 16.00 dBm
pi@raspberrypi4:~ $ sudo iw wlan0 set txpower fixed 2000
pi@raspberrypi4:~ $ iw dev | grep txpower
txpower 20.00 dBm
pi@raspberrypi4:~ $
尚、送信出力の上限は法律(電波法って言うの?)で決まっているので注意。使用して良いチャンネル(周波数)、送信出力上限は iw
コマンドで確認できる。
pi@raspberrypi4:~ $ iw reg get
global
country JP: DFS-JP
(2402 - 2482 @ 40), (N/A, 20), (N/A)
(2474 - 2494 @ 20), (N/A, 20), (N/A), NO-OFDM
(4910 - 4990 @ 40), (N/A, 23), (N/A)
(5030 - 5090 @ 40), (N/A, 23), (N/A)
(5170 - 5250 @ 80), (N/A, 20), (N/A), AUTO-BW
(5250 - 5330 @ 80), (N/A, 20), (0 ms), DFS, AUTO-BW
(5490 - 5710 @ 160), (N/A, 23), (0 ms), DFS
(59000 - 66000 @ 2160), (N/A, 10), (N/A)
pi@raspberrypi4:~ $ iw list
Wiphy phy0
(中略)
Frequencies:
* 5180 MHz [36] (20.0 dBm)
* 5200 MHz [40] (20.0 dBm)
* 5220 MHz [44] (20.0 dBm)
* 5240 MHz [48] (20.0 dBm)
* 5260 MHz [52] (20.0 dBm) (no IR, radar detection)
* 5280 MHz [56] (20.0 dBm) (no IR, radar detection)
* 5300 MHz [60] (20.0 dBm) (no IR, radar detection)
* 5320 MHz [64] (20.0 dBm) (no IR, radar detection)
* 5500 MHz [100] (23.0 dBm) (no IR, radar detection)
* 5520 MHz [104] (23.0 dBm) (no IR, radar detection)
* 5540 MHz [108] (23.0 dBm) (no IR, radar detection)
* 5560 MHz [112] (23.0 dBm) (no IR, radar detection)
* 5580 MHz [116] (23.0 dBm) (no IR, radar detection)
* 5600 MHz [120] (23.0 dBm) (no IR, radar detection)
* 5620 MHz [124] (23.0 dBm) (no IR, radar detection)
* 5640 MHz [128] (23.0 dBm) (no IR, radar detection)
* 5660 MHz [132] (23.0 dBm) (no IR, radar detection)
* 5680 MHz [136] (23.0 dBm) (no IR, radar detection)
* 5700 MHz [140] (23.0 dBm) (no IR, radar detection)
* 5720 MHz [144] (disabled)
* 5745 MHz [149] (disabled)
* 5765 MHz [153] (disabled)
* 5785 MHz [157] (disabled)
* 5805 MHz [161] (disabled)
* 5825 MHz [165] (disabled)
* 5845 MHz [169] (disabled)
* 5865 MHz [173] (disabled)
* 5885 MHz [177] (disabled)
(中略)
pi@raspberrypi4:~ $
チャンネル36~64 は 20.0 dBm、100~140 は 23.0 dBm が上限の模様。実際はそれを超える値が設定できてしまうしザル法かなって気もするけど。
ただ、送信出力を上げたからといって、安定するとか、リンクスピードが上がるというものでもないみたいだし、それでいて消費電力はアップするしで、特別な理由が無ければ変更する必要はないと思われ。寧ろ省電力や隣近所の事を考えたら下げるべき?
それと、ここら辺の設定はドライバのパラメータでは設定できないようで、コマンドを叩くしかないっぽい。rc.local に仕込むとかそんな感じか。
更に書くと、rtl8812auドライバによっては設定できたりできなかったりする。少なくとも自分が試し限りでは、aircrack-ng版ではできなかった。
【更なる任意設定】
CUI環境だと分かりやすいけど、起動時にフリーズするケースは大抵 dhcpcdサービス開始で止まっている。
元凶は勿論 8812auドライバだろうけど、芋づる式に sshdサービスやら色々とコケて、dhcpcdサービスが止まっているっぽい。dhcpcdサービスの設定を色々と弄ってみるもフリーズ発生を抑えられない。
そこで NetworkManager に差し替えることに。
そもそもこの 8812au ドライバは Raspberry Pi 専用という訳ではなく、Linux汎用。Linuxデスクトップ環境では NetworkManager が一般的であり、こちらを使った方が相性が良いのでは? とうい判断。
実際、こちらの方が安定度は増す印象。速度に関しても高い数値が出やすくなる。フリーズする時はするけど。
但しこれはあくまでも個人的な経験則であり、取り合えず現状のまま使ってみて、あまりにもフリーズが頻発するようなら NetworkManager に切り替えて様子見、で良いと思う。
Raspberry Pi に NetworkManager を導入する手順はぐぐれば出てくるのでそちらを、だけど簡単な説明は以下。
要は NetworkManager のインストール、サービスの有効化、dhcpcdサービスは停止。但し設定ファイルの話となると多少ややこしいので、導入前はイメージバックアップを。
NetworkManagerパッケージのインストールは以下。デスクトップ環境の場合は network-manager-gnome
も一緒に。
sudo apt-get install -y network-manager network-manager-gnome
GNOME用みたいだけどいいの? と思うけど(Raspberry Pi標準デスクトップは LXDE系)、システムトレイががあるデスクトップなら対応しているらしい。固定IP化設定等ここから GUIで操作出来て便利なので入れるが吉。
/etc/NetworkManager/NetworkManager.conf
に以下設定。
[ifupdown]
managed=true
[device]
wifi.scan-rand-mac-address=no
/etc/network/interfaces
には以下設定。
auto wlan0
iface wlan0 inet dhcp
dhcpcd は NetworkManager と共存できないので止め、再起動。
sudo systemctl stop dhcpcd.service
sudo systemctl disable dhcpcd.service
sudo reboot
標準の WireLess && Wired Network Settings
は機能しなくなっているのでシステムトレイから削除。
代わりに ネットワークの管理
を追加。network-manager-gnome
は勝手にシステムトレイに入っている筈。(階段状のグラフのアイコンね)
ネットワークの接続はこれらから、又はコマンドライン sudo nmtui
で。
ここら辺は説明無くても使い方は分かるよね。AP一覧から目的の物を選択しパスワードを入れるだけ。
又はコマンドラインから以下でも設定できる。
sudo nmcli d wifi connect <接続先> password <パスワード>
ところがこの接続設定でよくフリーズするんだよね。めげずにやるしかない。
そんな意味でも、コマンドラインから上記の接続コマンドを用意して実行するだけにしておいた方がやり直す時に楽。
【NetworkManagerが遅い問題対応】
NetworkManager に切り替えたら起動が妙に遅い、と感じると思う。デフォルトのタイムアウトはかなり余裕のある値になっていたり、そのままではかなり遅い。
フリーズしているのか、単に遅いのか分かりにくいのでカスタマイズする。
まず定番 systemd-analyze
コマンドで確認。
pi@raspberrypi4:~ $ systemd-analyze
Startup finished in 2.080s (kernel) + 30.905s (userspace) = 32.985s
graphical.target reached after 30.859s in userspace
pi@raspberrypi4:~ $ systemd-analyze blame
23.806s networking.service
8.058s rpi-eeprom-update.service
8.017s ModemManager.service
6.146s udisks2.service
5.508s NetworkManager.service
5.356s colord.service
4.726s polkit.service
4.710s cpufrequtils.service
2.804s ifupdown-pre.service
2.219s dev-mmcblk0p2.device
1.708s raspi-config.service
1.628s systemd-rfkill.service
やはりネットワークがらみで遅い。ぐぐれば対応方法は色々と出てくるけど、取り合えず効果があった方法を以下に。
1. タイムアウト時間調整
/lib/systemd/system/NetworkManager-wait-online.service
の --timeout=
の値を、初期値 30
から 10
等に変更。
[Service]
Type=oneshot
ExecStart=/usr/bin/nm-online -s -q --timeout=30
2. NetworkManager-wait-online.service停止
pi@raspberrypi4:~ $ sudo systemctl disable NetworkManager-wait-online.service
Removed /etc/systemd/system/network-online.target.wants/NetworkManager-wait-online.service.
pi@raspberrypi4:~ $
3. 有線LAN停止
WiFiオンリーで有線LAN を使用していない場合は無駄なので明示的に止める。
4. IP固定化
IP決め打ちの方が、DHCP の IP 振り出しを通さない分、速くなる。設定は GUI上で可能。
また、/etc/network/interfaces
は以下の記述でいいっぽい。
source-directory /etc/network/interfaces.d
iface wlan0 inet static
allow-hotplug eth0
WiFiオンリーで有線LAN を繋げていない場合は最後の一行も不要か。
5. haveged を入れる
haveged
とは乱数生成器。そんな物入れて効果があるの? と自分も最初は思ったけど。確かに多少は効果あり。裏技的なものか。インストールコマンドは以下。
sudo apt install haveged -y
6. 不要なサービスの停止
基本的なことだけど。良い機会なのでサービスを見直し不要なものは停止、削除。最終的には自分の場合は以下のようになった。
pi@raspberrypi4:~ $ systemd-analyze
Startup finished in 2.073s (kernel) + 14.335s (userspace) = 16.408s
graphical.target reached after 14.261s in userspace
pi@raspberrypi4:~ $ systemd-analyze blame
5.049s udisks2.service
3.680s lightdm.service
3.609s rpi-eeprom-update.service
3.381s dev-mmcblk0p2.device
3.172s NetworkManager.service
2.339s gpm.service
2.084s colord.service
1.777s raspi-config.service
1.767s systemd-modules-load.service
1.666s systemd-rfkill.service
1.505s plymouth-quit-wait.service
1.483s ssh.service
1.276s loadcpufreq.service
1.228s systemd-remount-fs.service
pi@raspberrypi4:~ $
参考URL は以下。
Ubuntu 15.04 network manager causing slow boot
Debian - Slow boot waiting for network
【フリーズ対応】
フリーズしても可能であれば電プチは避けたい。
まずキーボード入力が可能であるか確認。NUM LOCKキー ON/OFF で LED が反応するか、[Ctrl] + [Alt] + ファンクションキー
押下で tty の切り替えができるか、等で判断。
キーボード入力が死んでいる場合は流石に対処法は無い。USB電源を抜くしかない。
キーボード入力が生きている場合は以下のショートカット実行。
操作 | ショートカット |
---|---|
再起動 | [Alt] + [PrintScreen] を押下したまま [r], [s], [e], [i], [u], [b]の順に押下 |
終了 | 上記同様で最後は [o] |
詳細は以下参照
Linux PC環境構築[49]:Ubuntuが反応しないときの対処方法
Ubuntu フリーズした Ubuntu から安全に再起動する方法
ファイルシステムのSync実行、ファイルシステムを読み込み専用モードでリマウントを行っているのでストレージやファイルの破損は防ぐことができる。かなり完璧な感じ。
もしこれが業務システムで tty が生きているなら、他の tty でログイン、問題のプロセスを kill したり、サービスを restart、って感じだろうけど、8812auドライバの問題に限ってしまえば無理。
ネットワーク関係のコマンドを実行しても反応が返ってこないし、そのままキー入力を受け付けなくなり完全フリーズに陥り、状況が悪化するだけ。
CUI環境の起動時にフリーズした場合も同様。上記ショートカットのプロセス終了が効いて、起動を妨げていたプロセスが消えログインに漕ぎ着けたりもするけど、そこからログインして何かしようとしても完全フリーズするだけで時間の無駄。
余程腕に自信が無い限りは一連のショートカットを連投し、再起動か終了した方が無難。
【アンインストール手順】
手動でインストールを行う場合のコマンド例は以下。(8812au.ko が存在するパスで実行ね)
sudo install -p -m 644 8812au.ko /lib/modules/$(uname -r)/kernel/drivers/net/wireless
sudo /sbin/depmod -a $(uname -r)
設定ファイル等細かい話を除けば、ドライバ本体に関してはこれだけ。
要するに /lib/modules/$(uname -r)/
配下(場所はどこでも良い)にカーネルドライバファイル(xxx.ko)を配置し、depmod
コマンドで依存関係を更新しているだけ。意外と単純。
アンインストールはその逆を行えば良い。配置したカーネルドライバファイルを削除、depmod
コマンドで依存関係を再更新、ということになる。
カーネルドライバファイルの配置場所が分からない場合は、modinfo
コマンドで確認することができる。
pi@raspberrypi4:~ $ modinfo -F filename 8812au
/lib/modules/5.10.17-v7l+/kernel/drivers/net/wireless/8812au.ko
pi@raspberrypi4:~ $
但し、複数ファイルが配置されているような不正な状況の場合はあてにならないので、ベタな方法だけど find
コマンドで検索した方が確実。
pi@raspberrypi4:~ $ sudo find /lib/modules/$(uname -r)/kernel/drivers/ -name 8812au.ko
/lib/modules/5.10.17-v7l+/kernel/drivers/net/wireless/8812au.ko
pi@raspberrypi4:~ $
アンインストールのコマンド例は以下。
sudo rm -f /lib/modules/5.10.17-v7l+/kernel/drivers/net/wireless/8812au.ko
sudo /sbin/depmod -a $(uname -r)
pi@raspberrypi4:~ $
インストール済みの状況から再インストールを行いたい場合は、カーネルドライバファイルの配置場所が同じなら、上書きインストールでも大丈夫な気もするけど、明示的にアンインストールを行ってからの再インストールの方が無難かな。
pi@raspberrypi4:~/rtl8821au/aircrack-ng $ sudo rm -f /lib/modules/$(uname -r)/kernel/drivers/net/wireless/8812au.ko
pi@raspberrypi4:~/rtl8821au/aircrack-ng $ sudo /sbin/depmod -a $(uname -r)
pi@raspberrypi4:~/rtl8821au/aircrack-ng $ depmod -n | grep 8812au.ko
pi@raspberrypi4:~/rtl8821au/aircrack-ng $
pi@raspberrypi4:~/rtl8821au/aircrack-ng $ sudo install -p -m 644 8812au.ko /lib/modules/$(uname -r)/kernel/drivers/net/wireless
pi@raspberrypi4:~/rtl8821au/aircrack-ng $ sudo /sbin/depmod -a $(uname -r)
pi@raspberrypi4:~/rtl8821au/aircrack-ng $ depmod -n | grep 8812au.ko
kernel/drivers/net/wireless/8812au.ko: kernel/net/wireless/cfg80211.ko kernel/net/rfkill/rfkill.ko
pi@raspberrypi4:~/rtl8821au/aircrack-ng $
dkms 登録を削除する場合は以下。(後述するソースファイルビルドからのインストール時)
sudo dkms remove -m rtl8812au -v 5.9.3.2 --all
バージョン番号とかは適宜読み替えてね。
【ソースファイルビルドからのインストールについての予備知識】
rtl8812auドライバのビルド方法をぐぐると幾つかのページが見つかる。
しかし今となっては古いページもあり、それを参考にするのは避けるべき。何故なら、その手順で示しているソースも古く、ビルドさえも通らなかったりする。更にそのパッチも探せば出てきたりするけど、そのパッチを当てて……などとやるのは時間の無駄。そのパッチが当てられた更に新しいソースが存在する筈と考えるべき。
そもそもビルド方法を解説しているサイトで引用しているソースはほぼすべて github上の物。
github で rtl8812au を検索 してみれば、多数のリポジトリがアップされていることが分かる。
ソースファイルからのビルドを行いたいと思ったらまずやるべきことは日本語圏から解説サイトを探す、ではなく、github上で rtl8812au のリポジトリを探すこと。
これだけあれば中には更新が停止しているもの、古いものも多いから、今でもメンテナンスされているものを絞り込む。
ピックアップすると以下。
aircrack-ng_rtl8812au_ RTL8812AU_21AU and RTL8814AU driver with monitor mode and frame injection
morrownr_8812au_ Linux Driver for USB WiFi Adapters that are based on the RTL8812AU Chipset
gordboy_rtl8812au-5.9.3.2_ Realtek 8812AU driver version 5.9.3.2.html
gnab_rtl8812au_ Realtek 802.11n WLAN Adapter Linux driver
diederikdehaas_rtl8812AU_ Realtek 8812AU USB WiFi driver
また、大抵の README.md にはビルド、インストール方法も記されている。幾つか見て周れば、大体の感じは掴める。
まずこれが出発点。因みに冒頭の有志がアップしているコンパイル済みのドライバの元ソースは上記 aircrack-ng
のリポジトリ。
【ソースファイルビルドからのインストール】
1. ビルド準備
ソースの取得ビルドにはストレージ数百M を消費する。1G程度の空きは必要。df
コマンドで空き容量を確認し、足りない場合は確保すること。
pi@raspberrypi4:~ $ df -h
ファイルシス サイズ 使用 残り 使用% マウント位置
/dev/root 7.7G 6.1G 1.2G 84% /
devtmpfs 1.7G 0 1.7G 0% /dev
tmpfs 1.8G 0 1.8G 0% /dev/shm
tmpfs 1.8G 9.6M 1.8G 1% /run
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 1.8G 0 1.8G 0% /sys/fs/cgroup
tmpfs 32M 4.0K 32M 1% /tmp
tmpfs 16M 0 16M 0% /var/tmp
/dev/mmcblk0p1 253M 48M 205M 19% /boot
tmpfs 359M 4.0K 359M 1% /run/user/1000
pi@raspberrypi4:~ $
ビルド & インストールの手順は大きく分けて以下の二通。
- 手動ビルド、インストール
- DKMS を使ったビルド、インストール
DKMS が良い とされているので、ここではその手順で進める。
まず各種アップデートとビルド環境のインストール。以下実行。
sudo apt update -y && sudo apt upgrade -y
sudo apt install build-essential git dkms -y
これだけで数分かかるので気長に待つ。
dkms
インストールで /usr/src
配下にカーネルヘッダが配置される。カーネルドライバのビルドにはこれが必要。
pi@raspberrypi:/usr/src $ ls -la
合計 20
drwxr-xr-x 5 root root 4096 3月 13 12:30 .
drwxr-xr-x 10 root root 4096 1月 11 21:50 ..
drwxr-xr-x 23 root root 4096 3月 13 12:30 linux-headers-5.10.17+
drwxr-xr-x 23 root root 4096 3月 13 12:30 linux-headers-5.10.17-v7+
drwxr-xr-x 23 root root 4096 3月 13 12:30 linux-headers-5.10.17-v7l+
pi@raspberrypi:/usr/src $
dkms
を利用しない場合は sudo apt install raspberrypi-kernel-headers
でカーネルヘッダの配置ができる。
sudo apt update -y && sudo apt upgrade -y
でカーネルのアップデートがあった場合は再起動すること。
uname -a
で本体のカーネルバージョンを確認。
pi@raspberrypi4:/usr/src $ uname -a
Linux raspberrypi4 5.10.17-v7l+ #1403 SMP Mon Feb 22 11:33:35 GMT 2021 armv7l GNU/Linux
pi@raspberrypi4:/usr/src $
配置したカーネルヘッダとバージョンが一致していること。
ソースからビルドというと初めは難しく感じるかもしれないけど慣れてしまえば10~15分程度の簡単な作業。殆どコピペでの実行だけ。但し唯一の鬼門がこのバージョン。本体のカーネルバージョンとビルド用カーネルヘッダのバージョン更新の同期が完全には取れていないようで、取得のタイミングが悪いとずれている場合がある。
この件は 公式 にも説明がある。そうなるとカーネル本体のソースをまず取得してきて……となるそうだけど、これが実際にやってみると一筋縄でいかない。
又は rpi-update [ハッシュ値]
で任意のカーネルバージョンに差し替え、rpi-source でソース取得、という方法もあるけど、面倒であることには変わりなし。
同期されるのを待った方が無難っぽい。
2. ドライバソース取得
cd /usr/src/
で作業フォルダに移動し、sudo git clone https://github.com/gordboy/rtl8812au-5.9.3.2
でソース取得。
pi@raspberrypi:/usr/src $ sudo git clone https://github.com/gordboy/rtl8812au-5.9.3.2
Cloning into 'rtl8812au-5.9.3.2'...
remote: Enumerating objects: 766, done.
remote: Counting objects: 100% (766/766), done.
remote: Compressing objects: 100% (433/433), done.
remote: Total 766 (delta 331), reused 762 (delta 327), pack-reused 0
Receiving objects: 100% (766/766), 2.72 MiB | 43.00 KiB/s, done.
Resolving deltas: 100% (331/331), done.
pi@raspberrypi:/usr/src $ ls -la
合計 24
drwxr-xr-x 6 root root 4096 3月 13 15:07 .
drwxr-xr-x 10 root root 4096 1月 11 21:50 ..
drwxr-xr-x 23 root root 4096 3月 13 12:30 linux-headers-5.10.17+
drwxr-xr-x 23 root root 4096 3月 13 12:30 linux-headers-5.10.17-v7+
drwxr-xr-x 23 root root 4096 3月 13 12:30 linux-headers-5.10.17-v7l+
drwxr-xr-x 8 root root 4096 3月 13 15:08 rtl8812au-5.9.3.2
pi@raspberrypi:/usr/src $
これで材料が揃った。
3. Makefile の更新
以下で Makefile に定義されている対象プラットフォームの確認。
DRV_NAME=rtl8812au
DRV_VERSION=5.9.3.2
grep 'CONFIG_PLATFORM_I386_PC =' ${DRV_NAME}-${DRV_VERSION}/Makefile
grep 'CONFIG_PLATFORM_ARM_RPI =' ${DRV_NAME}-${DRV_VERSION}/Makefile
初期状態では i386
が対象になっている。以下で arm
に切り替える。
sudo sed -i 's/CONFIG_PLATFORM_I386_PC = y/CONFIG_PLATFORM_I386_PC = n/g' ${DRV_NAME}-${DRV_VERSION}/Makefile
sudo sed -i 's/CONFIG_PLATFORM_ARM_RPI = n/CONFIG_PLATFORM_ARM_RPI = y/g' ${DRV_NAME}-${DRV_VERSION}/Makefile
実行例は以下。
pi@raspberrypi:/usr/src $ grep 'CONFIG_PLATFORM_I386_PC =' ${DRV_NAME}-${DRV_VERSION}/Makefile
CONFIG_PLATFORM_I386_PC = y
pi@raspberrypi:/usr/src $ grep 'CONFIG_PLATFORM_ARM_RPI =' ${DRV_NAME}-${DRV_VERSION}/Makefile
CONFIG_PLATFORM_ARM_RPI = n
pi@raspberrypi:/usr/src $
pi@raspberrypi:/usr/src $ sudo sed -i 's/CONFIG_PLATFORM_I386_PC = y/CONFIG_PLATFORM_I386_PC = n/g' ${DRV_NAME}-${DRV_VERSION}/Makefile
pi@raspberrypi:/usr/src $ sudo sed -i 's/CONFIG_PLATFORM_ARM_RPI = n/CONFIG_PLATFORM_ARM_RPI = y/g' ${DRV_NAME}-${DRV_VERSION}/Makefile
pi@raspberrypi:/usr/src $
pi@raspberrypi:/usr/src $ grep 'CONFIG_PLATFORM_I386_PC =' ${DRV_NAME}-${DRV_VERSION}/Makefile
CONFIG_PLATFORM_I386_PC = n
pi@raspberrypi:/usr/src $ grep 'CONFIG_PLATFORM_ARM_RPI =' ${DRV_NAME}-${DRV_VERSION}/Makefile
CONFIG_PLATFORM_ARM_RPI = y
pi@raspberrypi:/usr/src $
CONFIG_PLATFORM_I386_PC = n
CONFIG_PLATFORM_ARM_RPI = y
となっていること。
4. ベンダーID:プロダクト番号の確認
BUFFALO WI-U3-866DS のベンダーID:プロダクト番号は 0411:025d
。これは lsusb
コマンドで確認できる。
pi@raspberrypi:/usr/src $ lsusb
Bus 002 Device 002: ID 0411:025d BUFFALO INC. (formerly MelCo., Inc.)
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 005: ID 0461:4d04 Primax Electronics, Ltd Mouse
Bus 001 Device 004: ID 0dc6:9811 Precision Squared Technology Corp.
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
pi@raspberrypi:/usr/src $
ドライバが対応するベンダーID:プロダクト番号の一覧は os_dep/linux/usb_intf.c
に定義されている。当然そこには BUFFALO WI-U3-866DS のベンダーID:プロダクト番号が含まれている必要がある。
以下で確認。
grep 'USB_DEVICE(0x0411, 0x025D)' ${DRV_NAME}-${DRV_VERSION}/os_dep/linux/usb_intf.c
実行例は以下。
pi@raspberrypi:/usr/src $ grep 'USB_DEVICE(0x0411, 0x025D)' ${DRV_NAME}-${DRV_VERSION}/os_dep/linux/usb_intf.c
{USB_DEVICE(0x0411, 0x025D), .driver_info = RTL8812}, /* Buffalo - WI-U3-866D */
pi@raspberrypi:/usr/src $
もし含まれていない場合は追記する、という手順も見かけるけど、それはもう何年もメンテナンスされていないような古いソースなので、手を加えたところでビルドも通らなかったりして時間の無駄。もっと新しいソースを探して取得するべし。
因みに、カーネルドライバ本体に対応するベンダーID:プロダクト番号を埋め込まなくても認識させる(任意のUSB機器とドライバを連動させる)方法はあるみたいだけど、今回は未検証。
カーネルモジュールとデバイス管理 - 知らざるを知らずと為す是知るなり
modalias
がキーワードですな。
5. ビルド、インストール
以下を実行。3行まとめて実行でも構わない。
sudo dkms add -m ${DRV_NAME} -v ${DRV_VERSION}
sudo dkms build -m ${DRV_NAME} -v ${DRV_VERSION}
sudo dkms install -m ${DRV_NAME} -v ${DRV_VERSION}
ビルドに少し時間がかかる。実行例は以下。
pi@raspberrypi:/usr/src $ sudo dkms add -m ${DRV_NAME} -v ${DRV_VERSION}
sudo dkms build -m ${DRV_NAME} -v ${DRV_VERSION}
Creating symlink /var/lib/dkms/rtl8812au/5.9.3.2/source ->
/usr/src/rtl8812au-5.9.3.2
DKMS: add completed.
pi@raspberrypi:/usr/src $ sudo dkms build -m ${DRV_NAME} -v ${DRV_VERSION}
Kernel preparation unnecessary for this kernel. Skipping...
Building module:
cleaning build area...
'make' -j4 KVER=5.10.17-v7l+ KSRC=/lib/modules/5.10.17-v7l+/build.......................................
cleaning build area...
DKMS: build completed.
pi@raspberrypi:/usr/src $ sudo dkms install -m ${DRV_NAME} -v ${DRV_VERSION}
8812au.ko:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/5.10.17-v7l+/updates/dkms/
depmod...
DKMS: install completed.
pi@raspberrypi:/usr/src $
ビルド、インストールが成功すること。
万が一失敗しやり直す場合は、最初の sudo dkms add -m ${DRV_NAME} -v ${DRV_VERSION}
は不要。(実行しても、登録済みだよというエラーが出るだけで実害はないけど)
以上で手動ビルドインストールは終了。お疲れさまでした、と言いたいところだけど、【ビルド済みドライバのダウンロードとインストール】手順同様に、「4. インストール後の設定」、必要があれば【更なる任意設定】も行うこと。
【各種コマンド例】
- 使用できるパラメータの確認。
modinfo
コマンドで。
実行例
pi@raspberrypi4:~ $ modinfo -F parm 8812au
rtw_wireless_mode: (int)
rtw_ips_mode:The default IPS mode (int)
rtw_lps_level:The default LPS level (int)
rtw_lps_chk_by_tp: (int)
rtw_max_bss_cnt: (int)
rtw_usb_rxagg_mode: (int)
rtw_dynamic_agg_enable: (int)
rtw_drv_log_level:set log level when insert driver module, default log level is _DRV_INFO_ = 4 (uint)
rtw_tx_aclt_flags:device TX AC queue packet lifetime control flags (uint)
rtw_tx_aclt_conf_default:device TX AC queue lifetime config for default status (array of uint)
rtw_tx_aclt_conf_ap_m2u:device TX AC queue lifetime config for AP mode M2U status (array of uint)
rtw_tx_bw_mode:The max tx bw for 2.4G and 5G. format is the same as rtw_bw_mode (uint)
rtw_rx_ampdu_sz_limit_1ss:RX AMPDU size limit for 1SS link of each BW, 0xFF: no limitation (array of uint)
rtw_rx_ampdu_sz_limit_2ss:RX AMPDU size limit for 2SS link of each BW, 0xFF: no limitation (array of uint)
rtw_rx_ampdu_sz_limit_3ss:RX AMPDU size limit for 3SS link of each BW, 0xFF: no limitation (array of uint)
rtw_rx_ampdu_sz_limit_4ss:RX AMPDU size limit for 4SS link of each BW, 0xFF: no limitation (array of uint)
rtw_vht_enable: (int)
rtw_vht_rx_mcs_map:VHT RX MCS map (uint)
rtw_trx_path_bmp: (int)
rtw_tx_path_lmt: (int)
rtw_rx_path_lmt: (int)
rtw_tx_nss: (int)
rtw_rx_nss: (int)
rtw_country_code:The default country code (in alpha2) (charp)
rtw_channel_plan:The default chplan ID when rtw_alpha2 is not specified or valid (int)
rtw_excl_chs:exclusive channel array (array of uint)
rtw_pci_dynamic_aspm_linkctrl: (int)
rtw_qos_opt_enable: (int)
ifname:The default name to allocate for first interface (charp)
if2name:The default name to allocate for second interface (charp)
rtw_wowlan_sta_mix_mode: (int)
rtw_pwrtrim_enable: (int)
rtw_initmac: (charp)
rtw_chip_version: (int)
rtw_rfintfs: (int)
rtw_lbkmode: (int)
rtw_network_mode: (int)
rtw_channel: (int)
rtw_mp_mode: (int)
rtw_wmm_enable: (int)
rtw_vrtl_carrier_sense: (int)
rtw_vcs_type: (int)
rtw_busy_thresh: (int)
rtw_ht_enable: (int)
rtw_bw_mode: (int)
rtw_ampdu_enable: (int)
rtw_rx_stbc: (int)
rtw_rx_ampdu_amsdu: (int)
rtw_tx_ampdu_amsdu: (int)
rtw_quick_addba_req: (int)
rtw_beamform_cap: (int)
rtw_lowrate_two_xmit: (int)
rtw_power_mgnt: (int)
rtw_smart_ps: (int)
rtw_low_power: (int)
rtw_wifi_spec: (int)
rtw_full_ch_in_p2p_handshake: (int)
rtw_antdiv_cfg: (int)
rtw_antdiv_type: (int)
rtw_drv_ant_band_switch: (int)
rtw_single_ant_path: (int)
rtw_switch_usb_mode: (int)
rtw_enusbss: (int)
rtw_hwpdn_mode: (int)
rtw_hwpwrp_detect: (int)
rtw_hw_wps_pbc: (int)
rtw_check_hw_status: (int)
rtw_led_ctrl:Led Control: 0=Always off, 1=Normal blink, 2=Always on (int)
rtw_max_roaming_times:The max roaming times to try (uint)
rtw_mc2u_disable: (int)
rtw_notch_filter:0:Disable, 1:Enable, 2:Enable only for P2P (uint)
rtw_hiq_filter:0:allow all, 1:allow special, 2:deny all (uint)
rtw_adaptivity_en:0:disable, 1:enable (uint)
rtw_adaptivity_mode:0:normal, 1:carrier sense (uint)
rtw_adaptivity_th_l2h_ini:th_l2h_ini for Adaptivity (int)
rtw_adaptivity_th_edcca_hl_diff:th_edcca_hl_diff for Adaptivity (int)
rtw_dfs_region_domain:0:UNKNOWN, 1:FCC, 2:MKK, 3:ETSI (uint)
rtw_amplifier_type_2g:BIT3:2G ext-PA, BIT4:2G ext-LNA (uint)
rtw_amplifier_type_5g:BIT6:5G ext-PA, BIT7:5G ext-LNA (uint)
rtw_RFE_type:default init value:64 (uint)
rtw_powertracking_type:default init value:64 (uint)
rtw_GLNA_type:default init value:0 (uint)
rtw_TxBBSwing_2G:default init value:0xFF (uint)
rtw_TxBBSwing_5G:default init value:0xFF (uint)
rtw_OffEfuseMask:default open Efuse Mask value:0 (uint)
rtw_FileMaskEfuse:default drv Mask Efuse value:0 (uint)
rtw_rxgain_offset_2g:default RF Gain 2G Offset value:0 (uint)
rtw_rxgain_offset_5gl:default RF Gain 5GL Offset value:0 (uint)
rtw_rxgain_offset_5gh: (uint)
rtw_rxgain_offset_5gm:default RF Gain 5GM Offset value:0 (uint)
rtw_pll_ref_clk_sel:force pll_ref_clk_sel, 0xF:use autoload value (uint)
rtw_tx_pwr_by_rate:0:Disable, 1:Enable, 2: Depend on efuse (int)
rtw_tx_pwr_lmt_enable:0:Disable, 1:Enable, 2: Depend on efuse (int)
rtw_target_tx_pwr_2g_a:2.4G target tx power (unit:dBm) of RF path A for each rate section, should match the real calibrate power, -1: undefined (array of int)
rtw_target_tx_pwr_2g_b:2.4G target tx power (unit:dBm) of RF path B for each rate section, should match the real calibrate power, -1: undefined (array of int)
rtw_target_tx_pwr_2g_c:2.4G target tx power (unit:dBm) of RF path C for each rate section, should match the real calibrate power, -1: undefined (array of int)
rtw_target_tx_pwr_2g_d:2.4G target tx power (unit:dBm) of RF path D for each rate section, should match the real calibrate power, -1: undefined (array of int)
rtw_target_tx_pwr_5g_a:5G target tx power (unit:dBm) of RF path A for each rate section, should match the real calibrate power, -1: undefined (array of int)
rtw_target_tx_pwr_5g_b:5G target tx power (unit:dBm) of RF path B for each rate section, should match the real calibrate power, -1: undefined (array of int)
rtw_target_tx_pwr_5g_c:5G target tx power (unit:dBm) of RF path C for each rate section, should match the real calibrate power, -1: undefined (array of int)
rtw_target_tx_pwr_5g_d:5G target tx power (unit:dBm) of RF path D for each rate section, should match the real calibrate power, -1: undefined (array of int)
rtw_tsf_update_pause_factor:num of bcn intervals to stay TSF update pause status (int)
rtw_tsf_update_restore_factor:num of bcn intervals to stay TSF update restore status (int)
rtw_phy_file_path:The path of phy parameter (charp)
rtw_load_phy_file:PHY File Bit Map (int)
rtw_decrypt_phy_file:Enable Decrypt PHY File (int)
rtw_phydm_ability: (uint)
rtw_halrf_ability: (uint)
rtw_en_napi: (int)
rtw_en_gro: (int)
rtw_iqk_fw_offload: (int)
rtw_ch_switch_offload: (int)
rtw_en_dyn_rrsr: (int)
rtw_rrsr_value: (int)
rtw_scan_interval_thr:Threshold used to judge if scan request comes from scan UI, unit is ms. (uint)
pi@raspberrypi4:~ $
又は /sys/module/8812au/parameters/
配下確認。
pi@raspberrypi4:~ $ ls /sys/module/8812au/parameters/
if2name rtw_drv_ant_band_switch rtw_network_mode rtw_target_tx_pwr_2g_b
ifname rtw_dynamic_agg_enable rtw_notch_filter rtw_target_tx_pwr_2g_c
rtw_FileMaskEfuse rtw_en_gro rtw_pci_dynamic_aspm_linkctrl rtw_target_tx_pwr_2g_d
rtw_GLNA_type rtw_en_napi rtw_phy_file_path rtw_target_tx_pwr_5g_a
rtw_OffEfuseMask rtw_enusbss rtw_phydm_ability rtw_target_tx_pwr_5g_b
rtw_RFE_type rtw_excl_chs rtw_pll_ref_clk_sel rtw_target_tx_pwr_5g_c
rtw_TxBBSwing_2G rtw_full_ch_in_p2p_handshake rtw_power_mgnt rtw_target_tx_pwr_5g_d
rtw_TxBBSwing_5G rtw_halrf_ability rtw_powertracking_type rtw_tsf_update_pause_factor
rtw_adaptivity_en rtw_hiq_filter rtw_pwrtrim_enable rtw_tsf_update_restore_factor
rtw_adaptivity_mode rtw_ht_enable rtw_qos_opt_enable rtw_tx_aclt_conf_ap_m2u
rtw_adaptivity_th_edcca_hl_diff rtw_hw_wps_pbc rtw_rf_path rtw_tx_aclt_conf_default
rtw_adaptivity_th_l2h_ini rtw_hwpdn_mode rtw_rfintfs rtw_tx_aclt_flags
rtw_ampdu_enable rtw_hwpwrp_detect rtw_rx_ampdu_amsdu rtw_tx_ampdu_amsdu
rtw_amplifier_type_2g rtw_initmac rtw_rx_ampdu_sz_limit_1ss rtw_tx_bw_mode
rtw_amplifier_type_5g rtw_ips_mode rtw_rx_ampdu_sz_limit_2ss rtw_tx_nss
rtw_antdiv_cfg rtw_iqk_fw_offload rtw_rx_ampdu_sz_limit_3ss rtw_tx_pwr_by_rate
rtw_antdiv_type rtw_lbkmode rtw_rx_ampdu_sz_limit_4ss rtw_tx_pwr_lmt_enable
rtw_beamform_cap rtw_led_ctrl rtw_rx_nss rtw_usb_rxagg_mode
rtw_busy_thresh rtw_load_phy_file rtw_rx_stbc rtw_vcs_type
rtw_bw_mode rtw_low_power rtw_rxgain_offset_2g rtw_vht_enable
rtw_ch_switch_offload rtw_lowrate_two_xmit rtw_rxgain_offset_5gh rtw_vht_rx_mcs_map
rtw_channel rtw_lps_chk_by_tp rtw_rxgain_offset_5gl rtw_vrtl_carrier_sense
rtw_channel_plan rtw_lps_level rtw_rxgain_offset_5gm rtw_wifi_spec
rtw_check_hw_status rtw_max_bss_cnt rtw_single_ant_path rtw_wireless_mode
rtw_chip_version rtw_max_roaming_times rtw_smart_ps rtw_wmm_enable
rtw_country_code rtw_mc2u_disable rtw_switch_usb_mode rtw_wowlan_sta_mix_mode
rtw_decrypt_phy_file rtw_mp_mode rtw_target_tx_pwr_2g_a
pi@raspberrypi4:~ $
設定値(保存されている値)の確認は grep -i [a-z0-9] /sys/module/8812au/parameters/*
で。
実行例
pi@raspberrypi4:~ $ grep -i [a-z0-9] /sys/module/8812au/parameters/*
/sys/module/8812au/parameters/if2name:wlan%d
/sys/module/8812au/parameters/ifname:wlan%d
/sys/module/8812au/parameters/rtw_FileMaskEfuse:0
/sys/module/8812au/parameters/rtw_GLNA_type:0
/sys/module/8812au/parameters/rtw_OffEfuseMask:0
/sys/module/8812au/parameters/rtw_RFE_type:64
/sys/module/8812au/parameters/rtw_TxBBSwing_2G:255
/sys/module/8812au/parameters/rtw_TxBBSwing_5G:255
/sys/module/8812au/parameters/rtw_adaptivity_en:0
/sys/module/8812au/parameters/rtw_adaptivity_mode:0
/sys/module/8812au/parameters/rtw_adaptivity_th_edcca_hl_diff:0
/sys/module/8812au/parameters/rtw_adaptivity_th_l2h_ini:0
/sys/module/8812au/parameters/rtw_ampdu_enable:1
/sys/module/8812au/parameters/rtw_amplifier_type_2g:0
/sys/module/8812au/parameters/rtw_amplifier_type_5g:0
/sys/module/8812au/parameters/rtw_antdiv_cfg:2
/sys/module/8812au/parameters/rtw_antdiv_type:0
/sys/module/8812au/parameters/rtw_beamform_cap:10
/sys/module/8812au/parameters/rtw_busy_thresh:40
/sys/module/8812au/parameters/rtw_bw_mode:33
/sys/module/8812au/parameters/rtw_ch_switch_offload:0
/sys/module/8812au/parameters/rtw_channel:1
/sys/module/8812au/parameters/rtw_channel_plan:255
/sys/module/8812au/parameters/rtw_check_hw_status:0
/sys/module/8812au/parameters/rtw_chip_version:0
/sys/module/8812au/parameters/rtw_decrypt_phy_file:0
/sys/module/8812au/parameters/rtw_dfs_region_domain:0
/sys/module/8812au/parameters/rtw_drv_ant_band_switch:1
/sys/module/8812au/parameters/rtw_drv_log_level:0
/sys/module/8812au/parameters/rtw_dynamic_agg_enable:1
/sys/module/8812au/parameters/rtw_en_dyn_rrsr:1
/sys/module/8812au/parameters/rtw_en_gro:1
/sys/module/8812au/parameters/rtw_en_napi:1
/sys/module/8812au/parameters/rtw_enusbss:0
/sys/module/8812au/parameters/rtw_full_ch_in_p2p_handshake:0
/sys/module/8812au/parameters/rtw_halrf_ability:4294967295
/sys/module/8812au/parameters/rtw_hiq_filter:1
/sys/module/8812au/parameters/rtw_ht_enable:1
/sys/module/8812au/parameters/rtw_hw_wps_pbc:1
/sys/module/8812au/parameters/rtw_hwpdn_mode:2
/sys/module/8812au/parameters/rtw_hwpwrp_detect:0
/sys/module/8812au/parameters/rtw_initmac:(null)
/sys/module/8812au/parameters/rtw_ips_mode:0
/sys/module/8812au/parameters/rtw_iqk_fw_offload:0
/sys/module/8812au/parameters/rtw_lbkmode:0
/sys/module/8812au/parameters/rtw_led_ctrl:1
/sys/module/8812au/parameters/rtw_load_phy_file:68
/sys/module/8812au/parameters/rtw_low_power:0
/sys/module/8812au/parameters/rtw_lowrate_two_xmit:1
/sys/module/8812au/parameters/rtw_lps_chk_by_tp:1
/sys/module/8812au/parameters/rtw_lps_level:0
/sys/module/8812au/parameters/rtw_max_bss_cnt:0
/sys/module/8812au/parameters/rtw_max_roaming_times:2
/sys/module/8812au/parameters/rtw_mc2u_disable:0
/sys/module/8812au/parameters/rtw_mp_mode:0
/sys/module/8812au/parameters/rtw_network_mode:0
/sys/module/8812au/parameters/rtw_notch_filter:0
/sys/module/8812au/parameters/rtw_pci_dynamic_aspm_linkctrl:0
/sys/module/8812au/parameters/rtw_phy_file_path:/lib/firmware/
/sys/module/8812au/parameters/rtw_phydm_ability:4294967295
/sys/module/8812au/parameters/rtw_pll_ref_clk_sel:15
/sys/module/8812au/parameters/rtw_power_mgnt:0
/sys/module/8812au/parameters/rtw_powertracking_type:64
/sys/module/8812au/parameters/rtw_pwrtrim_enable:0
/sys/module/8812au/parameters/rtw_qos_opt_enable:0
/sys/module/8812au/parameters/rtw_quick_addba_req:0
/sys/module/8812au/parameters/rtw_rfintfs:2
/sys/module/8812au/parameters/rtw_rrsr_value:-1
/sys/module/8812au/parameters/rtw_rx_ampdu_amsdu:0
/sys/module/8812au/parameters/rtw_rx_nss:0
/sys/module/8812au/parameters/rtw_rx_path_lmt:0
/sys/module/8812au/parameters/rtw_rx_stbc:1
/sys/module/8812au/parameters/rtw_rxgain_offset_2g:0
/sys/module/8812au/parameters/rtw_rxgain_offset_5gh:0
/sys/module/8812au/parameters/rtw_rxgain_offset_5gl:0
/sys/module/8812au/parameters/rtw_rxgain_offset_5gm:0
/sys/module/8812au/parameters/rtw_scan_interval_thr:16000
/sys/module/8812au/parameters/rtw_single_ant_path:0
/sys/module/8812au/parameters/rtw_smart_ps:2
/sys/module/8812au/parameters/rtw_switch_usb_mode:1
/sys/module/8812au/parameters/rtw_trx_path_bmp:0
/sys/module/8812au/parameters/rtw_tsf_update_pause_factor:200
/sys/module/8812au/parameters/rtw_tsf_update_restore_factor:5
/sys/module/8812au/parameters/rtw_tx_aclt_flags:0
/sys/module/8812au/parameters/rtw_tx_ampdu_amsdu:2
/sys/module/8812au/parameters/rtw_tx_bw_mode:33
/sys/module/8812au/parameters/rtw_tx_nss:0
/sys/module/8812au/parameters/rtw_tx_path_lmt:0
/sys/module/8812au/parameters/rtw_tx_pwr_by_rate:0
/sys/module/8812au/parameters/rtw_tx_pwr_lmt_enable:0
/sys/module/8812au/parameters/rtw_usb_rxagg_mode:2
/sys/module/8812au/parameters/rtw_vcs_type:1
/sys/module/8812au/parameters/rtw_vht_enable:1
/sys/module/8812au/parameters/rtw_vht_rx_mcs_map:43690
/sys/module/8812au/parameters/rtw_vrtl_carrier_sense:2
/sys/module/8812au/parameters/rtw_wifi_spec:0
/sys/module/8812au/parameters/rtw_wireless_mode:95
/sys/module/8812au/parameters/rtw_wmm_enable:1
/sys/module/8812au/parameters/rtw_wowlan_sta_mix_mode:0
pi@raspberrypi4:~ $
しかし、全パラメータの説明一覧みたいな情報って存在しないんだよね。せいぜい ソース を直接確認するしかないという(Linuxあるある)。
- 無線LAN情報確認
iwconfig
コマンドや iw
コマンドで。
pi@raspberrypi4:~ $ iwconfig wlan0
wlan0 IEEE 802.11AC ESSID:"B******-*-***8" Nickname:"<WIFI@REALTEK>"
Mode:Managed Frequency:5.5 GHz Access Point: 6*:**:**:**:**:*C
Bit Rate:867 Mb/s Sensitivity:0/0
Retry:off RTS thr:off Fragment thr:off
Power Management:off
Link Quality=86/100 Signal level=41/100 Noise level=0/100
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
pi@raspberrypi4:~ $
pi@raspberrypi4:~ $ iw dev
phy#0
Interface wlan0
ifindex 3
wdev 0x1
addr 5*:**:**:**:**:*7
ssid B******-*-***8
type managed
txpower 12.00 dBm
pi@raspberrypi4:~ $
ESSID:
項目は接続AP、Nickname:
項目の <WIFI@REALTEK>
はチップメーカ Realtek、Mode:Managed
で Managedモード(非Monitorモード)、Bit Rate:867 Mb/s
は規格上の上限値(実測値ではなくて)、Power Management:off
は省電力設定OFF、txpower 12.00 dBm
は送信出力、等々が読み取れる。
- リンクスピードの確認
pi@raspberrypi4:~ $ iw dev wlan0 link
Connected to 6*:**:**:**:**:*c (on wlan0)
SSID: B******-*-***8
freq: 5500
signal: -59 dBm
tx bitrate: 867.0 MBit/s
pi@raspberrypi4:~ $
おぉ、送信速度は 867.0 MBit/s。残念ながら受信速度は表示されず。
因みに、Frequency:5.5 GHz
freq: 5500
は、5GHz帯(Wi-Fi5)ってことだけど、厳密には接続している帯域を表している。
これをチャンネル数に置き換えたい場合は以下。
pi@raspberrypi4:~ $ iw list | grep 5500
* 5500 MHz [100] (23.0 dBm) (no IR, radar detection)
pi@raspberrypi4:~ $
チャンネル100 であること分かる。
【トラブルシューティング】
1. WI-U3-866DS を USBポートに差しても LEDが点灯しない(反応なし)
前述手順のように lsusb
コマンドで確認。
pi@raspberrypi:/usr/src $ lsusb
Bus 002 Device 002: ID 0411:025d BUFFALO INC. (formerly MelCo., Inc.)
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 005: ID 0461:4d04 Primax Electronics, Ltd Mouse
Bus 001 Device 004: ID 0dc6:9811 Precision Squared Technology Corp.
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
pi@raspberrypi:/usr/src $
ドライバがインストールされていなくても、ID 0411:025d BUFFALO INC. (formerly MelCo., Inc.)
が確認できる筈。
そもそもここで表示されない場合は、WI-U3-866DS か Raspberry Pi 又は USBポートの不具合、初期不良ということになる。
かなりレアな話だけど、公式フォーラムで Raspberry Pi の USBポートが取れてしまった、なんて報告を見かけたことがある。(URL は失念)
WI-U3-866DS を他の PC(Windows PC等)に接続しても認識されなければ WI-U3-866DS の不良。
Raspberry Pi に他の USB機器を接続しても lsusb
コマンドで見えなければ Raspberry Pi側の問題。
初期不良ということで購入したお店に問い合わせるしかない。
自分も Raspberry Pi ではないけど、Intel NUC なら 初期不良を引いた経験あり。
因みに、udevadm
コマンドで USB機器接続、取り外しをモニターできる。
実行例
pi@raspberrypi:~ $ sudo udevadm monitor -p -s net
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent
KERNEL[428.001083] add /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/net/wlan1 (net)
ACTION=add
DEVPATH=/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/net/wlan1
SUBSYSTEM=net
DEVTYPE=wlan
INTERFACE=wlan1
IFINDEX=5
SEQNUM=1725
UDEV [428.056716] add /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/net/wlan1 (net)
ACTION=add
DEVPATH=/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/net/wlan1
SUBSYSTEM=net
DEVTYPE=wlan
INTERFACE=wlan1
IFINDEX=5
SEQNUM=1725
USEC_INITIALIZED=428026173
ID_NET_NAMING_SCHEME=v240
ID_NET_NAME_MAC=wlx50c4ddb30427
ID_OUI_FROM_DATABASE=BUFFALO.INC
ID_NET_NAME_PATH=wlp1s0u2
ID_VENDOR=Buffalo
ID_VENDOR_ENC=Buffalo
ID_VENDOR_ID=0411
ID_MODEL=WI-U3-866D
ID_MODEL_ENC=WI-U3-866D
ID_MODEL_ID=025d
ID_REVISION=0000
ID_SERIAL=Buffalo_WI-U3-866D_123456
ID_SERIAL_SHORT=123456
ID_TYPE=generic
ID_BUS=usb
ID_USB_INTERFACES=:ffffff:
ID_USB_INTERFACE_NUM=00
ID_USB_DRIVER=rtl88XXau
ID_VENDOR_FROM_DATABASE=BUFFALO INC. (formerly MelCo., Inc.)
ID_PATH=platform-fd500000.pcie-pci-0000:01:00.0-usb-0:2:1.0
ID_PATH_TAG=platform-fd500000_pcie-pci-0000_01_00_0-usb-0_2_1_0
ID_NET_DRIVER=rtl88XXau
SYSTEMD_ALIAS=/sys/subsystem/net/devices/wlan1
TAGS=:systemd:
WI-U3-866DS 接続時は上記のように表示、取り外し時は以下のように表示される。
実行例
```shell-session
KERNEL[568.242617] remove /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/net/wlan1 (net)
ACTION=remove
DEVPATH=/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/net/wlan1
SUBSYSTEM=net
DEVTYPE=wlan
INTERFACE=wlan1
IFINDEX=5
SEQNUM=1744
UDEV [568.283601] remove /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/net/wlan1 (net)
ACTION=remove
DEVPATH=/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/net/wlan1
SUBSYSTEM=net
DEVTYPE=wlan
INTERFACE=wlan1
IFINDEX=5
SEQNUM=1744
USEC_INITIALIZED=428026173
ID_NET_NAMING_SCHEME=v240
ID_NET_NAME_MAC=wlx50c4ddb30427
ID_OUI_FROM_DATABASE=BUFFALO.INC
ID_NET_NAME_PATH=wlp1s0u2
ID_VENDOR=Buffalo
ID_VENDOR_ENC=Buffalo
ID_VENDOR_ID=0411
ID_MODEL=WI-U3-866D
ID_MODEL_ENC=WI-U3-866D
ID_MODEL_ID=025d
ID_REVISION=0000
ID_SERIAL=Buffalo_WI-U3-866D_123456
ID_SERIAL_SHORT=123456
ID_TYPE=generic
ID_BUS=usb
ID_USB_INTERFACES=:ffffff:
ID_USB_INTERFACE_NUM=00
ID_USB_DRIVER=rtl88XXau
ID_VENDOR_FROM_DATABASE=BUFFALO INC. (formerly MelCo., Inc.)
ID_PATH=platform-fd500000.pcie-pci-0000:01:00.0-usb-0:2
ID_PATH_TAG=platform-fd500000_pcie-pci-0000_01_00_0-usb-0_2
ID_NET_DRIVER=rtl88XXau
SYSTEMD_ALIAS=/sys/subsystem/net/devices/wlan1
TAGS=:systemd:
2. lsusb では認識されているのに動作しない
lsmod | grep 8812au
で 8812au
ドライバがロードされているか確認。
pi@raspberrypi4:~ $ lsmod | grep 8812au
8812au 2285568 0
cfg80211 761856 1 8812au
pi@raspberrypi4:~ $
cfg80211
と依存関係があるので、その行にも表示されることが重要。
もしくは journalctl
コマンドで確認。
pi@raspberrypi4:~ $ sudo journalctl -b | grep 8812au
4月 04 20:58:29 raspberrypi4 kernel: 8812au: loading out-of-tree module taints kernel.
4月 04 20:58:29 raspberrypi4 kernel: 8812au: unknown parameter 'rtw_drv_log_level' ignored
4月 04 20:58:29 raspberrypi4 systemd-modules-load[113]: Inserted module '8812au'
4月 04 20:58:29 raspberrypi4 kernel: usbcore: registered new interface driver 8812au
4月 04 20:58:39 raspberrypi4 NetworkManager[386]: <info> [1617537519.1217] rfkill0: found WiFi radio killswitch (at /sys/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/ieee80211/phy0/rfkill0) (driver 8812au)
(以下略))
ロードされていない場合は以下で手動ロード。
sudo modprobe 8812au
手動ロードでも失敗する場合は depmod
コマンドで確認。
pi@raspberrypi4:~ $ depmod -n | grep 8812au.ko
kernel/drivers/net/wireless/8812au.ko: kernel/net/wireless/cfg80211.ko kernel/net/rfkill/rfkill.ko
pi@raspberrypi4:~ $
ここで表示されない場合は、ロード可能なドライバとして認識されていなことになる。sudo /sbin/depmod -a $(uname -r)
で依存関係を更新し改善されるか確認。
改善されない場合は sudo find /lib/modules/$(uname -r)/ -name 8812au.ko
でドライバファイルの存在を確認。
pi@raspberrypi4:~ $ sudo find /lib/modules/$(uname -r)/ -name 8812au.ko
/lib/modules/5.10.17-v7l+/kernel/drivers/net/wireless/8812au.ko
pi@raspberrypi4:~ $
ドライバファイルが /lib/modules/$(uname -r)/
配下に存在しかつ、depmod -a
コマンドで登録されているなら、仕組み上ドライバは機能する。
それでも動作しないことはあり得ないけど、唯一考えられる可能性は、手動ビルドの場合。
ソースファイル /os_dep/linux/usb_intf.c
内に BUFFALO WI-U3-866DS のベンダーID:プロダクト番号が含まれていること確認。
{USB_DEVICE(0x0411, 0x025D), .driver_info = RTL8812}, /* Buffalo - WI-U3-866D */
又は、ビルド・インストールのやり直し。エラーが発生しないことをこと確認。
3. フリーズしまくるんですけど
バグではありません。仕様です。 そもそも dmesg
コマンドで確認すれば分かるけど、ばきばきとワーニングが出てるんだよね。
`dmesg`コマンド出力例
[ 28.481920] ------------[ cut here ]------------
[ 28.481944] WARNING: CPU: 0 PID: 0 at kernel/softirq.c:174 __local_bh_enable_ip+0xc8/0x100
[ 28.481950] Modules linked in: fuse v3d gpu_sched raspberrypi_hwmon bcm2835_codec(C) bcm2835_isp(C) bcm2835_v4l2(C) v4l2_mem2mem bcm2835_mmal_vchiq(C) videobuf2_dma_contig videobuf2_vmalloc videobuf2_memops videobuf2_v4l2 videobuf2_common vc4 videodev snd_bcm2835(C) vc_sm_cma(C) cec mc drm_kms_helper drm drm_panel_orientation_quirks snd_soc_core snd_compress snd_pcm_dmaengine snd_pcm rpivid_mem snd_timer snd syscopyarea sysfillrect sysimgblt fb_sys_fops backlight nvmem_rmem uio_pdrv_genirq uio i2c_dev 8812au(O) sha256_generic cfg80211 rfkill ip_tables x_tables ipv6
[ 28.482191] CPU: 0 PID: 0 Comm: swapper/0 Tainted: G WC O 5.10.17-v7l+ #1403
[ 28.482195] Hardware name: BCM2711
[ 28.482200] Backtrace:
[ 28.482216] [<c0b63050>] (dump_backtrace) from [<c0b633e4>] (show_stack+0x20/0x24)
[ 28.482222] r7:ffffffff r6:00000000 r5:60000013 r4:c12e69fc
[ 28.482230] [<c0b633c4>] (show_stack) from [<c0b67774>] (dump_stack+0xcc/0xf8)
[ 28.482237] [<c0b676a8>] (dump_stack) from [<c0220bac>] (__warn+0xfc/0x114)
[ 28.482243] r10:ecbdc7d4 r9:00000009 r8:c0227168 r7:000000ae r6:00000009 r5:c0227168
[ 28.482247] r4:c0e1c5d4 r3:c1205094
[ 28.482254] [<c0220ab0>] (__warn) from [<c0b63b54>] (warn_slowpath_fmt+0x70/0xd8)
[ 28.482259] r7:000000ae r6:c0e1c5d4 r5:c1205048 r4:00000000
[ 28.482267] [<c0b63ae8>] (warn_slowpath_fmt) from [<c0227168>] (__local_bh_enable_ip+0xc8/0x100)
[ 28.482273] r9:ecbdbce0 r8:00000000 r7:ffffffff r6:ecbdc7d4 r5:ec83f018 r4:00000200
[ 28.482281] [<c02270a0>] (__local_bh_enable_ip) from [<c0b7324c>] (_raw_spin_unlock_bh+0x38/0x3c)
[ 28.482285] r5:ec83f018 r4:ec83f000
[ 28.482477] [<c0b73214>] (_raw_spin_unlock_bh) from [<bf189248>] (rtw_joinbss_event_prehandle+0xec/0x630 [8812au])
[ 28.482685] [<bf18915c>] (rtw_joinbss_event_prehandle [8812au]) from [<bf191c20>] (report_join_res+0xb8/0xe4 [8812au])
[ 28.482693] r10:00000000 r9:c3d4a808 r8:00000000 r7:00000004 r6:ec83f000 r5:c4205340
[ 28.482697] r4:c3d4a800
[ 28.482896] [<bf191b68>] (report_join_res [8812au]) from [<bf191dc8>] (OnAssocRsp+0x17c/0x260 [8812au])
[ 28.482903] r9:00000004 r8:c3d48d3d r7:000000fe r6:000000fe r5:c3d48c48 r4:ec83f000
[ 28.483097] [<bf191c4c>] (OnAssocRsp [8812au]) from [<bf18a454>] (_mgt_dispatcher+0x8c/0xcc [8812au])
[ 28.483104] r10:ec841000 r9:00000000 r8:c3d48c4c r7:ecbd4850 r6:ec83f000 r5:c3d48c4c
[ 28.483108] r4:bf2a0620
[ 28.483302] [<bf18a3c8>] (_mgt_dispatcher [8812au]) from [<bf18be18>] (mgt_dispatcher+0x130/0x1e8 [8812au])
[ 28.483308] r7:00000000 r6:ecbd4850 r5:ec83f000 r4:c3d48c48
[ 28.483498] [<bf18bce8>] (mgt_dispatcher [8812au]) from [<bf1a74f4>] (validate_recv_mgnt_frame+0x358/0x450 [8812au])
[ 28.483505] r8:00000010 r7:ec83f000 r6:00000000 r5:ec83f000 r4:ecbd4850
[ 28.483692] [<bf1a719c>] (validate_recv_mgnt_frame [8812au]) from [<bf1a7764>] (validate_recv_frame+0x178/0x1d4 [8812au])
[ 28.483707] r10:ec841000 r9:00000000 r8:00000010 r7:ec83f000 r6:00000000 r5:c3d48c48
[ 28.483711] r4:ecbd4850
[ 28.483901] [<bf1a75ec>] (validate_recv_frame [8812au]) from [<bf1a86c8>] (recv_func_prehandle+0x40/0x78 [8812au])
[ 28.483908] r8:ec83f000 r7:c3cb0048 r6:ecbd4850 r5:c3cb0060 r4:ec83f000
[ 28.484098] [<bf1a8688>] (recv_func_prehandle [8812au]) from [<bf1a8a0c>] (recv_func+0x3c/0x13c [8812au])
[ 28.484104] r7:c3cb0048 r6:ecbd4850 r5:c3cb0060 r4:ec83f000
[ 28.484282] [<bf1a89d0>] (recv_func [8812au]) from [<bf1a8b30>] (rtw_recv_entry+0x24/0x74 [8812au])
[ 28.484293] r7:c3cb0048 r6:0000013a r5:c3cb0060 r4:ec83f000
[ 28.484482] [<bf1a8b0c>] (rtw_recv_entry [8812au]) from [<bf1a9128>] (pre_recv_entry+0x60/0x9c [8812au])
[ 28.484486] r5:c3cb0060 r4:ecbd4850
[ 28.484665] [<bf1a90c8>] (pre_recv_entry [8812au]) from [<bf216cfc>] (recvbuf2recvframe+0x124/0x224 [8812au])
[ 28.484676] r5:0000013a r4:ecbd4850
[ 28.484866] [<bf216bd8>] (recvbuf2recvframe [8812au]) from [<bf1c13a8>] (usb_recv_tasklet+0x6c/0xc0 [8812au])
[ 28.484872] r10:00000040 r9:00000006 r8:00000000 r7:ec8402c8 r6:ec8401d0 r5:ec83f000
[ 28.484876] r4:c1a32240
[ 28.484976] [<bf1c133c>] (usb_recv_tasklet [8812au]) from [<c0227610>] (tasklet_action_common.constprop.4+0x84/0x128)
[ 28.484987] r9:00000006 r8:00000000 r7:ebefa2e0 r6:00000000 r5:ec8402a4 r4:ec8402a0
[ 28.484994] [<c022758c>] (tasklet_action_common.constprop.4) from [<c02276dc>] (tasklet_action+0x28/0x30)
[ 28.485000] r9:ffffe000 r8:c1810800 r7:00000100 r6:00000006 r5:00000007 r4:c1203098
[ 28.485008] [<c02276b4>] (tasklet_action) from [<c0201508>] (__do_softirq+0x198/0x49c)
[ 28.485016] [<c0201370>] (__do_softirq) from [<c0227474>] (irq_exit+0xd0/0xf8)
[ 28.485021] r10:c0e1edfc r9:c1200000 r8:c1810800 r7:00000001 r6:00000000 r5:00000000
[ 28.485025] r4:ffffe000
[ 28.485034] [<c02273a4>] (irq_exit) from [<c0287540>] (__handle_domain_irq+0x70/0xc4)
[ 28.485038] r5:00000000 r4:c1094d10
[ 28.485045] [<c02874d0>] (__handle_domain_irq) from [<c020135c>] (gic_handle_irq+0x90/0xa4)
[ 28.485050] r9:c1200000 r8:c1094d1c r7:c1201ec8 r6:ec81400c r5:ec814000 r4:c1205b3c
[ 28.485057] [<c02012cc>] (gic_handle_irq) from [<c0200abc>] (__irq_svc+0x5c/0x7c)
[ 28.485061] Exception stack(0xc1201ec8 to 0xc1201f10)
[ 28.485067] 1ec0: 00000000 0003f2a8 ebf062c4 c021ac00 ffffe000 c120509c
[ 28.485072] 1ee0: c12050e4 00000001 00000001 c133ba3f c0e1edfc c1201f24 c1201f28 c1201f18
[ 28.485077] 1f00: c02088c0 c02088c4 60000013 ffffffff
[ 28.485084] r9:c1200000 r8:00000001 r7:c1201efc r6:ffffffff r5:60000013 r4:c02088c4
[ 28.485092] [<c020887c>] (arch_cpu_idle) from [<c0b72ef0>] (default_idle_call+0x4c/0x118)
[ 28.485100] [<c0b72ea4>] (default_idle_call) from [<c02587d4>] (do_idle+0x118/0x168)
[ 28.485107] [<c02586bc>] (do_idle) from [<c0258af8>] (cpu_startup_entry+0x28/0x30)
[ 28.485113] r10:000001b6 r9:c1053a60 r8:ffffffff r7:c1053a60 r6:c1205040 r5:c1205048
[ 28.485117] r4:000000d8 r3:c108a294
[ 28.485124] [<c0258ad0>] (cpu_startup_entry) from [<c0b6be28>] (rest_init+0xbc/0xc4)
[ 28.485134] [<c0b6bd6c>] (rest_init) from [<c1000ab4>] (arch_call_rest_init+0x18/0x1c)
[ 28.485141] r5:c1205048 r4:c1354068
[ 28.485147] [<c1000a9c>] (arch_call_rest_init) from [<c1001098>] (start_kernel+0x568/0x59c)
[ 28.485153] [<c1000b30>] (start_kernel) from [<00000000>] (0x0)
[ 28.485200] ---[ end trace d36fe8faab1fcab6 ]---
ここら辺の問題は github の issues でも指摘されているんだけど。何とかならんものかねぇ。
経験則になってしまうけど、フリーズが多発する場合は WiFi親機を再起動すると改善する場合あり。
4. USB3.0モードに設定しても相応のリンクスピードが出ない
lsusb -t
コマンドで間違いなく USB3.0モードに切り替わっていることが確認できて、USB2.0モード時と転送速度が大して変わらないか寧ろ低い場合や、USB3.0モード相応のリンクスピードが出ていたのに、気が付いたら低下していて復活しない場合は、WiFi親機の接続数が多すぎて干渉している可能性がある。
可能であれば WI-U3-866DS だけが接続している状態、とまではいかなくてもできる限り他の WiFi通信機器は止め、WiFi親機を再起動。多分これで改善される。
接続台数が限られているのに遅くなる場合もあり(何だかなぁ)、やはり WiFi親機を再起動。
【全般的knowledge】
- rtl8812auチップ採用の製品一覧
rtl8812auチップを採用している他メーカーの製品を知りたい場合。
DeviWiki で探すのも手だろうけど、ソース内の定義を見た方が手っ取り早いか。
#ifdef CONFIG_RTL8812A
/*=== Realtek demoboard ===*/
{USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8812), .driver_info = RTL8812}, /* Default ID */
{USB_DEVICE(USB_VENDER_ID_REALTEK, 0x881A), .driver_info = RTL8812}, /* Default ID */
{USB_DEVICE(USB_VENDER_ID_REALTEK, 0x881B), .driver_info = RTL8812}, /* Default ID */
{USB_DEVICE(USB_VENDER_ID_REALTEK, 0x881C), .driver_info = RTL8812}, /* Default ID */
/*=== Customer ID ===*/
{USB_DEVICE(0x0409, 0x0408), .driver_info = RTL8812}, /* NEC - */
{USB_DEVICE(0x0411, 0x025D), .driver_info = RTL8812}, /* Buffalo - WI-U3-866D */
{USB_DEVICE(0x04BB, 0x0952), .driver_info = RTL8812}, /* I-O DATA - Edimax */
{USB_DEVICE(0x050D, 0x1106), .driver_info = RTL8812}, /* Belkin - sercomm */
{USB_DEVICE(0x050D, 0x1109), .driver_info = RTL8812}, /* Belkin F9L1109 - SerComm */
{USB_DEVICE(0x0586, 0x3426), .driver_info = RTL8812}, /* ZyXEL - */
{USB_DEVICE(0x0789, 0x016E), .driver_info = RTL8812}, /* Logitec - Edimax */
{USB_DEVICE(0x07B8, 0x8812), .driver_info = RTL8812}, /* Abocom - Abocom */
{USB_DEVICE(0x0846, 0x9051), .driver_info = RTL8812}, /* Netgear A6200 v2 */
{USB_DEVICE(0x0B05, 0x17D2), .driver_info = RTL8812}, /* ASUS - Edimax */
{USB_DEVICE(0x0DF6, 0x0074), .driver_info = RTL8812}, /* Sitecom - Edimax */
{USB_DEVICE(0x0E66, 0x0022), .driver_info = RTL8812}, /* HAWKING - Edimax */
{USB_DEVICE(0x1058, 0x0632), .driver_info = RTL8812}, /* WD - Cybertan */
{USB_DEVICE(0x1740, 0x0100), .driver_info = RTL8812}, /* EnGenius - EnGenius */
{USB_DEVICE(0x13B1, 0x003F), .driver_info = RTL8812}, /* Linksys - WUSB6300 */
{USB_DEVICE(0x148F, 0x9097), .driver_info = RTL8812}, /* Amped Wireless ACA1 */
{USB_DEVICE(0x2001, 0x330E), .driver_info = RTL8812}, /* D-Link - ALPHA */
{USB_DEVICE(0x2001, 0x3313), .driver_info = RTL8812}, /* D-Link - ALPHA */
{USB_DEVICE(0x2001, 0x3315), .driver_info = RTL8812}, /* D-Link - Cameo */
{USB_DEVICE(0x2001, 0x3316), .driver_info = RTL8812}, /* D-Link - Cameo */
{USB_DEVICE(0x2019, 0xAB30), .driver_info = RTL8812}, /* Planex - Abocom */
{USB_DEVICE(0x20F4, 0x805B), .driver_info = RTL8812}, /* TRENDnet - */
{USB_DEVICE(0x2357, 0x0101), .driver_info = RTL8812}, /* TP-Link - Archer T4U AC1200 */
{USB_DEVICE(0x2357, 0x0103), .driver_info = RTL8812}, /* TP-Link - T4UH */
{USB_DEVICE(0x2357, 0x010D), .driver_info = RTL8812}, /* TP-Link - Archer T4U AC1300 */
{USB_DEVICE(0x2357, 0x010E), .driver_info = RTL8812}, /* TP-Link - Archer T4UH AC1300 */
{USB_DEVICE(0x2357, 0x010F), .driver_info = RTL8812}, /* TP-Link - T4UHP */
{USB_DEVICE(0x2357, 0x0115), .driver_info = RTL8812}, /* TP-Link - Archer T4U AC1300 */
{USB_DEVICE(0x2357, 0x0122), .driver_info = RTL8812}, /* TP-Link - T4UHP (other) */
{USB_DEVICE(0x2604, 0x0012), .driver_info = RTL8812}, /* Tenda U12 */
{USB_DEVICE(0x7392, 0xA822), .driver_info = RTL8812}, /* Edimax - Edimax */
#endif
rtl8812au は今となっては古いチップセットで、これを採用した新製品はもう早々出ないだろうし(時代は Wi-Fi6だし)。この情報で足りると思われ。
- ドライバ格納ディレクトリついて
前述の通り、ドライバ格納ディレクトリは /lib/modules/$(uname -r)/
。カーネルバージョンが 5.10.17-v7l+
なら、実ディレクトは /lib/modules/5.10.17-v7l+/
。
カーネルバージョンが上がれば対応するディレクトリも差し変わる。ここが Linux のバージョン管理が厳密な点でもあり面倒な点。カーネルツリー外ドライバは差し変わったディレクトリに再配置しなければならない。
ぶっちゃけメンテンナンスバージョンが少々上がったぐらいなら古いドライバでもそのまま動きそうなものだけど。一応再ビルドして入れるのが作法。そこら辺の面倒な手順を自動化してくれる(とされている)のが DKMS ということになる。
WiFi標準ドライバは /lib/modules/$(uname -r)/kernel/drivers/net/wireless
配下にメーカー別に格納されている。
この中を検索すれば、組み込み済みのドライバが分かる。Realtek なら以下。古いチップセットばかりだろうけど。
pi@raspberrypi4:~ $ find /lib/modules/$(uname -r)/kernel/drivers/net/wireless/realtek -name *.ko
/lib/modules/5.10.17-v7l+/kernel/drivers/net/wireless/realtek/rtl818x/rtl8187/rtl8187.ko
/lib/modules/5.10.17-v7l+/kernel/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.ko
/lib/modules/5.10.17-v7l+/kernel/drivers/net/wireless/realtek/rtlwifi/rtlwifi.ko
/lib/modules/5.10.17-v7l+/kernel/drivers/net/wireless/realtek/rtlwifi/rtl_usb.ko
/lib/modules/5.10.17-v7l+/kernel/drivers/net/wireless/realtek/rtlwifi/rtl8192cu/rtl8192cu.ko
/lib/modules/5.10.17-v7l+/kernel/drivers/net/wireless/realtek/rtlwifi/rtl8192c/rtl8192c-common.ko
pi@raspberrypi4:~ $
対応するソースは以下。
linux/drivers/net/wireless/realtek/
- ディストリビューション配布パッケージの検索
ここまでくると最早ドライバの話ではなくて基本的な操作法になってしまうけど。apt-cache search
コマンドで。Realtek 検索結果は以下。残念ながら rtl8812auドライバは存在しない模様。
pi@raspberrypi4:~ $ apt-cache search realtek
flashrom - Identify, read, write, erase, and verify BIOS/ROM/flash chips
librtlsdr-dev - Software defined radio receiver for Realtek RTL2832U (development)
librtlsdr0 - Software defined radio receiver for Realtek RTL2832U (library)
nictools-pci - Diagnostic tools for many PCI Ethernet cards
rtl-sdr - Software defined radio receiver for Realtek RTL2832U (tools)
soapysdr-module-rtlsdr - RTL-SDR device support for SoapySDR (default version)
soapysdr0.6-module-rtlsdr - RTL-SDR device support for SoapySDR
r8168-dkms - dkms source for the r8168 network driver
firmware-realtek - Binary firmware for Realtek wired/wifi/BT adapters
pi@raspberrypi4:~ $
本家Debian ならここで rtl8812auドライバが手に入る模様。
【ビルド不要!_】WI-U3-866DSをLinuxで使う!
モジュール名が 88XXau
ってことは aircrack-ng版ですな。
因みに、aircrack-ng版 8812auドライバは、rtl8821au、rtl8814auチップセットにも対応しているのでこの名前らしい。
rtl8821au は Wi-Fi4、rtl8814au は Wi-Fi5 でアンテナ3本タイプの製品に採用されているもの。
- カーネルモジュールの管理
sudo /sbin/depmod -a $(uname -r)
を実行すると、/lib/modules/$(uname -r)/modules.dep
が更新される。ここにカーネルモジュールの依存関係が保存されていて、modprobe
コマンド等でカーネルモジュールをロードする場合は内部的にこのファイルを参照する仕組みらしい。
pi@raspberrypi4:~ $ grep 8812 /lib/modules/$(uname -r)/modules.dep
kernel/drivers/net/wireless/8812au.ko: kernel/net/wireless/cfg80211.ko kernel/net/rfkill/rfkill.ko
pi@raspberrypi4:~ $
【通信速度】
定番 iperf3コマンド で。自分の環境では以下。
pi@raspberrypi4:~ $ iperf3 -c 192.168.11.115
Connecting to host 192.168.11.115, port 5201
[ 5] local 192.168.11.113 port 41298 connected to 192.168.11.115 port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 29.3 MBytes 246 Mbits/sec 0 221 KBytes
[ 5] 1.00-2.00 sec 32.0 MBytes 269 Mbits/sec 0 221 KBytes
[ 5] 2.00-3.00 sec 31.8 MBytes 267 Mbits/sec 0 221 KBytes
[ 5] 3.00-4.00 sec 31.7 MBytes 266 Mbits/sec 0 221 KBytes
[ 5] 4.00-5.00 sec 31.6 MBytes 265 Mbits/sec 0 221 KBytes
[ 5] 5.00-6.00 sec 31.6 MBytes 265 Mbits/sec 0 221 KBytes
[ 5] 6.00-7.00 sec 32.3 MBytes 271 Mbits/sec 0 221 KBytes
[ 5] 7.00-8.00 sec 31.9 MBytes 268 Mbits/sec 0 221 KBytes
[ 5] 8.00-9.00 sec 32.0 MBytes 268 Mbits/sec 0 221 KBytes
[ 5] 9.00-10.00 sec 31.4 MBytes 264 Mbits/sec 0 221 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 316 MBytes 265 Mbits/sec 0 sender
[ 5] 0.00-10.00 sec 315 MBytes 265 Mbits/sec receiver
iperf Done.
pi@raspberrypi4:~ $
残念ながら常時このスピードという訳ではなく、調子が良ければ最大これぐらい出る、というものだけど。
製品公式サイト で公開されている実測値は 491Mbps
。
また、こちらのサイトの報告では 470 Mbits/sec
前後。
morrownr_8812au_ Linux Driver for USB WiFi Adapters that are based on the RTL8812AU Chipset
iperf3 test results with USB 3 mode on
Bitrate
482 Mbits/sec
472 Mbits/sec
461 Mbits/sec
472 Mbits/sec
472 Mbits/sec
482 Mbits/sec
481 Mbits/sec
462 Mbits/sec
482 Mbits/sec
環境(WiFi親機の性能?)次第ではここまで出るらしい。
【パラメータに関する考察】
- rtw_power_mgnt
ソースから rtw_power_mgnt
を検索。以下が見つかる。
#ifdef CONFIG_POWER_SAVING
int rtw_power_mgnt = PS_MODE_MAX;
#ifdef CONFIG_IPS_LEVEL_2
int rtw_ips_mode = IPS_LEVEL_2;
#else
int rtw_ips_mode = IPS_NORMAL;
#endif /*CONFIG_IPS_LEVEL_2*/
#ifdef CONFIG_USB_HCI
int rtw_lps_level = LPS_NORMAL; /*USB default LPS level*/
#else /*SDIO,PCIE*/
#if defined(CONFIG_LPS_PG)
/*int rtw_lps_level = LPS_PG;*//*FW not support yet*/
int rtw_lps_level = LPS_LCLK;
#elif defined(CONFIG_LPS_PG_DDMA)
int rtw_lps_level = LPS_PG;
#elif defined(CONFIG_LPS_LCLK)
int rtw_lps_level = LPS_LCLK;
#else
int rtw_lps_level = LPS_NORMAL;
#endif
#endif/*CONFIG_USB_HCI*/
int rtw_lps_chk_by_tp = 1;
#else /* !CONFIG_POWER_SAVING */
int rtw_power_mgnt = PS_MODE_ACTIVE;
int rtw_ips_mode = IPS_NONE;
int rtw_lps_level = LPS_NORMAL;
int rtw_lps_chk_by_tp = 0;
#endif /* CONFIG_POWER_SAVING */
(中略)
module_param(rtw_power_mgnt, int, 0644);
(中略)
registry_par->power_mgnt = (u8)rtw_power_mgnt;
(中略)
パラメータ名とソース内で定義する変数名は一致させるのが作法らしく(逆に合わせない理由がない)、int rtw_power_mgnt
のようにパラメータ名がそのまま変数名で分かりやすい。
module_param(rtw_power_mgnt, int, 0644);
は /sys/module/8812au/parameters/
配下に保存されるパラメータファイルの実装。第三引数 0644
なんて如何にもファイルの属性。
registry_par->power_mgnt
に代入しているので、後はこの構造体変数を検索すれば rtw_power_mgnt
に連動する箇所を追うことができる。
パラメータ PS_MODE_MAX
PS_MODE_ACTIVE
の定義箇所は以下。 enum で定義されいている。
enum Power_Mgnt {
PS_MODE_ACTIVE = 0 ,
PS_MODE_MIN ,
PS_MODE_MAX ,
PS_MODE_DTIM , /* PS_MODE_SELF_DEFINED */
PS_MODE_VOIP ,
PS_MODE_UAPSD_WMM ,
PS_MODE_UAPSD ,
PS_MODE_IBSS ,
PS_MODE_WWLAN ,
PM_Radio_Off ,
PM_Card_Disable ,
PS_MODE_NUM,
};
rtw_power_mgnt=0
は内部的には rtw_power_mgnt=PS_MODE_ACTIVE
ということになる。アクティブ、つまり非省電力、省電力OFF ということで辻褄が合っている感じ。
又、この enum値も検索の足掛かりになる。以上を踏まえて更に検索。
void rtl8812_set_FwPwrMode_cmd(PADAPTER padapter, u8 PSMode)
{
u8 u1H2CSetPwrMode[H2C_PWRMODE_LEN] = {0};
struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
u8 Mode = 0, RLBM = 0, PowerState = 0, LPSAwakeIntvl = 2;
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
u8 allQueueUAPSD = 0;
RTW_INFO("%s: Mode=%d SmartPS=%d\n", __FUNCTION__, PSMode, pwrpriv->smart_ps);
switch (PSMode) {
case PS_MODE_ACTIVE:
Mode = 0;
break;
case PS_MODE_MIN:
Mode = 1;
break;
case PS_MODE_MAX:
RLBM = 1;
Mode = 1;
break;
case PS_MODE_DTIM:
RLBM = 2;
Mode = 1;
break;
case PS_MODE_UAPSD_WMM:
Mode = 2;
break;
default:
Mode = 0;
break;
}
if (Mode > PS_MODE_ACTIVE) {
#ifdef CONFIG_BT_COEXIST
if ((rtw_btcoex_IsBtControlLps(padapter) == _TRUE) && (_TRUE == pHalData->EEPROMBluetoothCoexist))
PowerState = rtw_btcoex_RpwmVal(padapter);
else
#endif /* CONFIG_BT_COEXIST */
PowerState = 0x00;/* AllON(0x0C), RFON(0x04), RFOFF(0x00) */
#ifdef CONFIG_EXT_CLK
Mode |= BIT(7);/* supporting 26M XTAL CLK_Request feature. */
#endif /* CONFIG_EXT_CLK */
} else
PowerState = 0x0C;/* AllON(0x0C), RFON(0x04), RFOFF(0x00) */
(中略)
/* AllON(0x0C), RFON(0x04), RFOFF(0x00) */
SET_8812_H2CCMD_PWRMODE_PARM_PWR_STATE(u1H2CSetPwrMode, PowerState);
PS_MODE_ACTIVE
なら PowerState = 0x0C;/* AllON(0x0C), RFON(0x04), RFOFF(0x00) */
、そうでなければ PowerState = 0x00;/* AllON(0x0C), RFON(0x04), RFOFF(0x00) */
。ふむふむ。
#ifdef CONFIG_AUTOSUSPEND
if (padapter->registrypriv.power_mgnt != PS_MODE_ACTIVE) {
if (padapter->registrypriv.usbss_enable) { /* autosuspend (2s delay) */
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 38))
dvobj->pusbdev->dev.power.autosuspend_delay = 0 * HZ;/* 15 * HZ; idle-delay time */
#else
dvobj->pusbdev->autosuspend_delay = 0 * HZ;/* 15 * HZ; idle-delay time */
#endif
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35))
usb_enable_autosuspend(dvobj->pusbdev);
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22) && LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 34))
padapter->bDisableAutosuspend = dvobj->pusbdev->autosuspend_disabled ;
dvobj->pusbdev->autosuspend_disabled = 0;/* autosuspend disabled by the user */
#endif
/* usb_autopm_get_interface(adapter_to_dvobj(padapter)->pusbintf ); */ /* init pm_usage_cnt ,let it start from 1 */
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 32))
RTW_INFO("%s...pm_usage_cnt(%d).....\n", __FUNCTION__, atomic_read(&(dvobj->pusbintf->pm_usage_cnt)));
#else
RTW_INFO("%s...pm_usage_cnt(%d).....\n", __FUNCTION__, dvobj->pusbintf->pm_usage_cnt);
#endif
}
}
#endif
PS_MODE_ACTIVE
以外であれば自動サスペンドが有効になる模様。rtw_power_mgnt=0
で省電力OFF は間違い無さそう。
でも、そもそも Makefile でコンパイルスイッチ CONFIG_POWER_SAVING = n
が指定されているから、デフォルトで省電力機能は OFF じゃないのかな。
CONFIG_MP_INCLUDED = y
CONFIG_POWER_SAVING = n
CONFIG_USB_AUTOSUSPEND = n
- rtw_enusbss
このパラメータ名がまた分かりにくい。初見で意味が判別できる人間なんていないのでは。
こちらも os_intfs.c
に定義されていて #ifdef CONFIG_USB_AUTOSUSPEND
で囲まれていることから、自動サスペンドであることが分かる。enable usb (auto) suspend
を縮めて enusbss
かな?
#ifdef CONFIG_USB_AUTOSUSPEND
int rtw_enusbss = 1;/* 0:disable,1:enable */
#else
int rtw_enusbss = 0;/* 0:disable,1:enable */
#endif
省電力を OFF にする場合の設定をぐぐってよく見かけるのが rtw_power_mgnt=0 rtw_enusbss=1
という設定値。省電力は OFF(rtw_power_mgnt=0) なのに自動サスペンドはON(rtw_enusbss=1)?
しかし前述のソースの通り、省電力OFF なら自動サスペンドも機能しないっぽい。それに自動サスペンドがらみの箇所は #ifdef CONFIG_AUTOSUSPEND
で囲まれている。
CONFIG_AUTOSUSPEND
の #define定義箇所は以下。
#ifdef CONFIG_USB_HCI
typedef struct urb *PURB;
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22))
#ifdef CONFIG_USB_SUSPEND
#define CONFIG_AUTOSUSPEND 0
#endif
#endif
#endif
#ifdef CONFIG_USB_SUSPEND
で囲まれている。そして CONFIG_USB_SUSPEND
の #define は検索したところどこにも定義されていなかった。
つまり自動サスペンドはそもそも機能しない(実装が外されている)という結論。
- rtw_ips_mode
更に分からなかったのがこれ。そもそも IPSモードって何?
最初は IPSモードはありまぁす 侵入検知システム(Intrusion prevention system)の IPS かと思ったけど、リンク省電力機能らしい。
Debianユーザーフォーラム•トピックを表示-[解決済み]ワイヤレスネットワークが断続的に再接続する
「ips」モードはこれまで、リンクが検出されない場合にチップをスリープモードで送信するrealtekドライバーの機能でした。
Realtek wifi rtl8723のパラメーターを設定する方法
ips:using no link power save (default 1 is open)
ソースを確認。
enum { /* for ips_mode */
IPS_NONE = 0,
IPS_NORMAL,
IPS_LEVEL_2,
IPS_NUM
};
int rtw_pm_set_ips(_adapter *padapter, u8 mode)
{
struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);
if (mode == IPS_NORMAL || mode == IPS_LEVEL_2) {
rtw_ips_mode_req(pwrctrlpriv, mode);
RTW_INFO("%s %s\n", __FUNCTION__, mode == IPS_NORMAL ? "IPS_NORMAL" : "IPS_LEVEL_2");
return 0;
} else if (mode == IPS_NONE) {
rtw_ips_mode_req(pwrctrlpriv, mode);
RTW_INFO("%s %s\n", __FUNCTION__, "IPS_NONE");
if (!rtw_is_surprise_removed(padapter) && (_FAIL == rtw_pwr_wakeup(padapter)))
return -EFAULT;
} else
return -EINVAL;
return 0;
}
イマイチ意味が掴み切れないけど、rtw_ips_mode=0
でリンク省電力機能OFF という理解でいいのかな。前述の rtw_power_mgnt でも一緒に rtw_ips_mode も設定しているし。
#ifdef CONFIG_POWER_SAVING
(中略)
#else /* !CONFIG_POWER_SAVING */
int rtw_power_mgnt = PS_MODE_ACTIVE;
int rtw_ips_mode = IPS_NONE;
int rtw_lps_level = LPS_NORMAL;
int rtw_lps_chk_by_tp = 0;
#endif /* CONFIG_POWER_SAVING */
- rtw_switch_usb_mode
興味本位でこちらもソースを確認。USB2.0 から USB3.0 への切り替え(rtw_switch_usb_mode=1)やその逆(rtw_switch_usb_mode=2)の設定に対応する処理は多分ここ。
hal/rtl8812a/usb/usb_halinit.c
case HW_VAR_USB_MODE:
/* U2 to U3 */
if (registry_par->switch_usb_mode == 1) {
if (IS_HIGH_SPEED_USB(Adapter)) {
if ((rtw_read8(Adapter, 0x74) & (BIT(2) | BIT(3))) != BIT(3)) {
rtw_write8(Adapter, 0x74, 0x8);
rtw_write8(Adapter, 0x70, 0x2);
rtw_write8(Adapter, 0x3e, 0x1);
rtw_write8(Adapter, 0x3d, 0x3);
/* usb disconnect */
rtw_write8(Adapter, 0x5, 0x80);
*val = _TRUE;
}
} else if (IS_SUPER_SPEED_USB(Adapter)) {
rtw_write8(Adapter, 0x70, rtw_read8(Adapter, 0x70) & (~BIT(1)));
rtw_write8(Adapter, 0x3e, rtw_read8(Adapter, 0x3e) & (~BIT(0)));
}
} else if (registry_par->switch_usb_mode == 2) {
/* U3 to U2 */
if (IS_SUPER_SPEED_USB(Adapter)) {
if ((rtw_read8(Adapter, 0x74) & (BIT(2) | BIT(3))) != BIT(2)) {
rtw_write8(Adapter, 0x74, 0x4);
rtw_write8(Adapter, 0x70, 0x2);
rtw_write8(Adapter, 0x3e, 0x1);
rtw_write8(Adapter, 0x3d, 0x3);
/* usb disconnect */
rtw_write8(Adapter, 0x5, 0x80);
*val = _TRUE;
}
} else if (IS_HIGH_SPEED_USB(Adapter)) {
rtw_write8(Adapter, 0x70, rtw_read8(Adapter, 0x70) & (~BIT(1)));
rtw_write8(Adapter, 0x3e, rtw_read8(Adapter, 0x3e) & (~BIT(0)));
}
}
break;
default:
ret = SetHwReg8812A(Adapter, variable, val);
break;
}
rtw_write8(Adapter, 0x74, 0x8);
などとマジックナンバーを書き込んでいる箇所は IOポートを叩いている処理?
こればかりはハードの仕様を知らないと読み解けないよな。ただ、このモード切り替えでよくフリーズするから、ここら辺にバグが潜んでいる可能性が高く、気になるところではある。
- rtw_hwpwrp_detect
省電力がらみでぐぐるとこのパラメータも目にすることがあるので確認。
#ifdef CONFIG_HW_PWRP_DETECTION
int rtw_hwpwrp_detect = 1;
#else
int rtw_hwpwrp_detect = 0; /* HW power ping detect 0:disable , 1:enable */
#endif
(中略)
#ifdef SUPPORT_HW_RFOFF_DETECTED
registry_par->hwpdn_mode = (u8)rtw_hwpdn_mode;/* 0:disable,1:enable,2:by EFUSE config */
registry_par->hwpwrp_detect = (u8)rtw_hwpwrp_detect;/* 0:disable,1:enable */
#endif
u8 bHWPwrPindetect; /* come from registrypriv.hwpwrp_detect. enable power down function. 0:disable, 1:enable */
#endif
/* RTW_INFO("==> fw report state(0x%x)\n",rtw_read8(padapter,0x1ca)); */
if (pwrpriv->bHWPwrPindetect) {
#ifdef CONFIG_AUTOSUSPEND
if (padapter->registrypriv.usbss_enable) {
if (pwrpriv->rf_pwrstate == rf_on) {
if (padapter->net_closed == _TRUE)
pwrpriv->ps_flag = _TRUE;
つらつらと辿っていくと自動サスペンドが絡んでくるので、これも省電力がらみっぽい。一応 rtw_hwpwrp_detect=0
も設定しておいた方がいいかも。
【そもそもソースの出自は?】
aircrack-ng版 rtl8812au のフォーク元を辿っていくと、EW-7822UAC_Linux_driver_v1.0.1.6.zip
に辿り着く。
これは Edimax EW-7822UAC の Linux版ドライバで、今でも 公式サイト からダウンロードできる。
こちら からダウンロードできる物は更に新しいようだけど、いずれにしても今となっては古いもので使えない。
Edimaxの公式サイトには Linuxドライバに関して以下のページがある。
How to install EW-7811 AC600 & EW-7822UAC in Linux with kernel higher than v4.1
2017年11月の時点で、上記のアダプターの公式Linuxドライバーは、v4.1までのLinuxカーネルのみをサポートしています。それ以降のバージョンはサポートされていません。唯一の回避策は、GitHubのオープンソースドライバーを使用することです。参考のためのリンクは次のとおりです。
How to install EW-7811 AC600 Series and EW-7822UAC adapters on Raspberry Pi
[5.] GitHubリポジトリからオープンソースドライバーのクローンを作成します。
$ git clone https://github.com/aircrack-ng/rtl8812au .git
Raspberry Pi で使用する場合に指定されているドライバも aircrack-ng版だっていう。
メーカー製のドライバの方が安定しているのではと思って色々と調べてみたけど、結局一周周って github に辿り着いてしまうという。
現在公式では Kernel 5.3対応が最新版がみたいだけど未検証。
https://www.edimax.com/edimax/download/download/data/edimax/us/download/wireless_adapters_ac1200_dual-band/ew-7822uac
また、ASUS で rtl8812auチップを使用している製品は USB-AC56 で、github 上のフォークは こちら。
Raspberry Pi 用は こちら。
PLANEX は基本的に Linux版ドライバも公開しているらしく確認すると以下。
ダウンロード|GW-900Dシリーズ|プラネックス
これまた古くて結局 github頼みになる模様。
[レビュー] Linuxで使えるUSB無線LAN PLANEX「GW-900D-BK」をUbuntuで試してみました
LibreELEC では rtl8812au が標準でサポートされているという 情報 をたまたま見つけ、ソース を確認したところ、結局これも aircrack-ng版だっていうね。
PKG_SITE="https://github.com/aircrack-ng/rtl8812au"
PKG_URL="https://github.com/aircrack-ng/rtl8812au/archive/${PKG_VERSION}.tar.gz"
PKG_LONGDESC="Realtek RTL8812AU Linux 3.x driver"
フォーラムには
現在9.0にあるドライバーは、8812auスティックを使用して5GHzで安定して動作した最初のドライバーであると言いたかっただけです。8.2で数日間問題なく使用しています。
とあるけどホンマかいな。昔は安定していたんですかね。更には
あなたの話の教訓は、realtekのがらくたの一部ではなく、まともなチップセットとカーネル内ドライバーを備えたUSBワイヤレスドングルを購入することです。
LEのスタッフは、Realtekワイヤレスデバイスについて一般的に低い意見を持っています。ハードウェアはおそらく合理的であり、Windowsでのパフォーマンスは、エンジニアリングにすべての時間を費やす場所であるため、おそらく素晴らしいものです。彼らのLinuxドライバーは後から付け加えられたものであり、同じ最大ヒット数のハックのコンパイルを何度も再ハッシュするチップセットや新しいドライバーを繁殖させる方法にうんざりしています。
と酷い言われよう。しかも LibreELEC開発者の書き込みだという。結局ドライバ以前にチップセットの質の問題らしい。
それと Windows版ドライバも以前は酷かったみたいだね。例えば Windows 10 64bit版ドライバのファイル名は u3866dx.sys みたいだけど、このファイル名でぐぐるとブルースクリーンの報告例がぼこぼこヒットするという。
一応現在は対応済みみたいだけど。
エアナビゲータ2ライト (Windows) 個別版 _ ダウンロード _ バッファロー
更新履歴
Ver.2.22b[2020/07/15]
1.ドライバー
1.1 WI-U3-866D / WI-U3-866DS
1.お使いのパソコン環境によって青い画面(ブルースクリーン)が表示され、パソコンが操作できなくなる問題を改善しました。
Linux版も何とかならんものかね。
とまぁ大長編になってしまったけど、散々苦労させられたお陰で多少はカーネルモジュールの知識が身についた。丁度 動かしながらゼロから学ぶ Linuxカーネルの教科書 も読んでいて、こちらも参考になった。比較的新しい本で、内容も平易なので入門書としてお勧め。
あ、それと最後に。
冒頭に挙げた有志がアップしている rtl8812auドライバ。64bit版もあったので試したけど、AP接続の段階でフリーズしまくりでまったく使い物にならなかった。
何回か試して、1回だけで接続に成功したけど、その後もフリーズしまくり、心が折れて断念。つくづく Raspberry Pi 64bit 対応の道は遠く険しい。