【2021年 最新版】Raspberry Pi 4B で BUFFALO WI-U3-866DS(rtl8812au) を使う

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/c565c06d-c4b4-a8dc-f43c-bd03a89a2970.png" width=80%>

## [【この門をくぐる者は、一切の希望を捨てよ】](https://meigen-ijin.com/dante-alighieri/ "ダンテの名言・言葉（英語＆日本語） _ 名言+Quotes")
気まぐれで購入した WI-U3-866DS だけど、Rapberry Pi に繋げると信じられないほど不安定で苦労している。
ここで言う不安定とは、ネットワークに繋がりにくい、よく切れるといった類ではなく、よくフリーズするということ。

[The Linux Kernel_ デバイスドライバ](https://linuxjf.osdn.jp/JFdocs/The-Linux-Kernel-9.html "The Linux Kernel_ デバイスドライバ")
> カーネルコード (kernel code)
> デバイスドライバはカーネルの一部なので、カーネル内の他のコードと同様に、もし 上手く動かないとシステムに深刻な影響を与える。出来の悪いドライバはシステムを クラッシュさせる場合すらあり、その結果ファイルシステムが破壊されデータが喪失 することもあり得る。

堅牢とされる Linux が固まるって何だよと最初は思ったけど、獅子、身中の虫ってやつか。ファイルが壊れたことはないけど、とにかくよく固まる。
もう何度 ~~WI-U3-866DS を窓から投げ捨てようとした~~ Raspberry Pi 電源USBの OFF/ON を繰り返したことか。思わずアマゾンで ON/OFFスイッチ付き USBケーブルをポチってしまった程。(これはこれで便利で重宝しているけど)

この WI-U3-866DS を Linux環境(Raspberry Pi)で使う方法をぐぐると沢山のページがヒットするけど、書かれているのはドライバのインストール方法だけ。皆さんまともに使えているんだろうか？ フリーズしまくるのは自分だけ？
でも `rtl8812au freeze`等でぐぐると、これまた色々と出てくる。やはり不安定なドライバっぽい。

[WiFi - Debian Wiki](https://wiki.debian.org/WiFi "WiFi - Debian Wiki")
> 互換性のあるWiFiチップセットの可用性
> Wifiは常に自由ソフトウェアユーザーにとって問題でした。
> (中略)
> 次回ハードウェアを購入するときは、それが自由ソフトウェアと互換性があるかどうかを自問してください。

つくづく無線LAN は Linux の鬼門だよなぁ。これがオープンソースの現実というか。只より高いものはないっていう。
ビルド済みドライバのインストールやソースファイルからのビルド・インストールだけではなく、できるだけ安定させる方法も含めて情報共有したい。

## 【ビルド済みドライバのダウンロードとインストール】

### 1. ビルド済みドライバのダウンロード

これまた不思議と WI-U3-866DS(チップセットrtl8812au)ドライバの Rapberry Pi へのインストール方法をぐぐると、ドライバソースのダウンロード、ビルド、インストールの手順しか出てこない。
しかし、(実は自分も後から知ったんだけど)ビルド済ドライバを有志の方がアップしていて以下からダウンロードできる。
[Index of /wifi-drivers/8812au-drivers](http://downloads.fars-robotics.net/wifi-drivers/8812au-drivers/ "Index of _wifi-drivers_8812au-drivers")
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/a6b56412-43f2-48f7-30fe-465ca679d376.png" width=50%>
`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` で。

```shell-session
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`コマンドで取得。

```shell-session
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オプションは省略)

```shell-session
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` を実行。

```shell-session
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` の最後に以下追記。

```shell-session
dtoverlay=disable-bt
dtoverlay=disable-wifi
```

`disable-bt` は Bluetooth、`disable-wifi` は WiFi。Bluetoothも？ と思われるかもしれないけど、内臓無線LAN のチップセットは Bluetooth も統合されているので。
rtl8812auチップセットも Bluetooth が統合されているので、必要があればそちらから利用できる筈。(多分)

それとよく以下を追記する手順を見かけるけど、これは古い記述方法。

```shell-session
dtoverlay=pi3-disable-wifi
dtoverlay=pi3-disable-bt
```

後方互換でこの記述はまだ許されているようだけど、`/boot/overlays/README` を見れば以下の説明が確認できる。

```shell-session
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` に以下の記述でも良い。

```shell-session
blacklist brcmfmac
blacklist brcmutil
```

こちらは汎用的な方法。逆に 8812auドライバを無効にしたい場合はこのファイルに以下のように記述すれば良い。

```shell-session
blacklist 8812au
```

- **安定度を増す為の設定**

`/etc/iwd`ディレクトリが無ければまず `sudo mkdir /etc/iwd` で作成。`/etc/iwd/main.conf` に以下追記。

```shell-session
[General]
UseDefaultInterface=true
```

この情報の出どころは [ここ](https://github.com/aircrack-ng/rtl8812au/issues/498#issuecomment-586586696 "Possible dead lock with v5.6.4.2 + kernel 5.3.13 · Issue #498 · aircrack-ng_rtl8812au")。
この設定でフリーズしなくなる、とまでは残念ながらいかないけど、フリーズする頻度はかなり下がる。

- **起動時にドライバを明示的に読み込む設定**

`sudo su -` 等で root に切り替え以下実行。

```shell-session
echo 8812au > /etc/modules-load.d/8812au.conf
```

この設定を行わなくても、Raspberry Pi 本体が WI-U3-866DSを検知すれば自動的にドライバをロードしてくれるので、あっても無くても同じ。
但し、起動時にフリーズが頻発する場合はこの設定を外したり(その場合はファイル自体削除)、逆に設定してみたりとかの試行錯誤には使えるかな。多分変わらないと思うけど。

- **USB3モード設定**

[この製品](https://www.buffalo.jp/product/detail/wi-u3-866ds.html "WI-U3-866DS _ Wi-Fiアダプター _ AirStation _ バッファロー")、`USB3.0で高速な転送速度を実現` を謳っているのに、デフォルトでは USB2.0モードだったりする。
それは、`lsusb -t`コマンドで確認できる。

```shell-session
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` を追記する。

```shell-session
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モードに切り替わっていることを確認。

```shell-session
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モード設定は以下で。

```shell-session
sudo ip link set wlan0 down && sudo iw dev wlan0 set type monitor && sudo ip link set wlan0 up
```

managedモードに戻す場合は以下で。

```shell-session
sudo ip link set wlan0 down && sudo iw dev wlan0 set type managed && sudo ip link set wlan0 up
```

実行例は以下。

```shell-session
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`コマンドで。送信出力設定は以下で。

```shell-session
sudo iw wlan0 set txpower fixed 2000
```

実行例は以下。

```shell-session
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`コマンドで確認できる。

```shell-session
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)
```

```shell-session
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` も一緒に。

```shell-session
sudo apt-get install -y network-manager network-manager-gnome
```

GNOME用みたいだけどいいの？ と思うけど(Raspberry Pi標準デスクトップは LXDE系)、[システムトレイががあるデスクトップなら対応しているらしい](https://packages.debian.org/ja/buster/network-manager-gnome "Debian -- buster の network-manager-gnome パッケージに関する詳細")。固定IP化設定等ここから GUIで操作出来て便利なので入れるが吉。

`/etc/NetworkManager/NetworkManager.conf` に以下設定。

```shell-session
[ifupdown]
managed=true

[device]
wifi.scan-rand-mac-address=no
```

`/etc/network/interfaces` には以下設定。

```shell-session
auto wlan0
iface wlan0 inet dhcp
```

dhcpcd は NetworkManager と共存できないので止め、再起動。

```shell-session
sudo systemctl stop dhcpcd.service
sudo systemctl disable dhcpcd.service
sudo reboot
```

標準の `WireLess && Wired Network Settings` は機能しなくなっているのでシステムトレイから削除。
代わりに `ネットワークの管理` を追加。`network-manager-gnome` は勝手にシステムトレイに入っている筈。(階段状のグラフのアイコンね)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/47cddaf8-f1b6-cb25-c65f-ebc265e71574.png" width=50%>

ネットワークの接続はこれらから、又はコマンドライン `sudo nmtui` で。
ここら辺は説明無くても使い方は分かるよね。AP一覧から目的の物を選択しパスワードを入れるだけ。
又はコマンドラインから以下でも設定できる。

```shell-session
sudo nmcli d wifi connect <接続先> password <パスワード>
```

ところがこの接続設定でよくフリーズするんだよね。めげずにやるしかない。
そんな意味でも、コマンドラインから上記の接続コマンドを用意して実行するだけにしておいた方がやり直す時に楽。

## 【NetworkManagerが遅い問題対応】

NetworkManager に切り替えたら起動が妙に遅い、と感じると思う。デフォルトのタイムアウトはかなり余裕のある値になっていたり、そのままではかなり遅い。
フリーズしているのか、単に遅いのか分かりにくいのでカスタマイズする。
まず定番 `systemd-analyze`コマンドで確認。

```shell-session
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` 等に変更。

```shell-session
[Service]
Type=oneshot
ExecStart=/usr/bin/nm-online -s -q --timeout=30
```

### 2. NetworkManager-wait-online.service停止

```shell-session
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 を使用していない場合は無駄なので明示的に止める。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/45ac37b5-8989-bed8-3517-daaa178c35ce.png" width=50%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/1237ca48-bc55-bf4a-0021-d54704a35ba1.png" width=50%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/f9be7e5b-50fc-a89f-153f-8bd4c12d0153.png" width=50%>

### 4. IP固定化

IP決め打ちの方が、DHCP の IP 振り出しを通さない分、速くなる。設定は GUI上で可能。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/3a083970-ef47-1d3d-74cf-4832d45e250e.png" width=50%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/39f603d4-39a3-530a-9d14-6d440b324d20.png" width=50%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/e29a1da9-629a-0dfe-b4ba-373ef61c7162.png" width=50%>
また、`/etc/network/interfaces` は以下の記述でいいっぽい。

```shell-session
source-directory /etc/network/interfaces.d
iface wlan0 inet static
allow-hotplug eth0
```

WiFiオンリーで有線LAN を繋げていない場合は最後の一行も不要か。

### 5. haveged を入れる

`haveged` とは乱数生成器。そんな物入れて効果があるの？　と自分も最初は思ったけど。確かに多少は効果あり。裏技的なものか。インストールコマンドは以下。

```shell-session
sudo apt install haveged -y
```

### 6. 不要なサービスの停止

基本的なことだけど。良い機会なのでサービスを見直し不要なものは停止、削除。最終的には自分の場合は以下のようになった。

```shell-session
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](https://askubuntu.com/questions/615006/ubuntu-15-04-network-manager-causing-slow-boot "Ubuntu 15.04 network manager causing slow boot - Ask Ubuntu")
[Debian - Slow boot waiting for network](https://serverfault.com/questions/972634/debian-slow-boot-waiting-for-network "linux networking - Debian - Slow boot waiting for network - Server Fault")

## 【フリーズ対応】

フリーズしても可能であれば電プチは避けたい。
まずキーボード入力が可能であるか確認。NUM LOCKキー ON/OFF で LED が反応するか、`[Ctrl] + [Alt] + ファンクションキー` 押下で tty の切り替えができるか、等で判断。

キーボード入力が死んでいる場合は流石に対処法は無い。USB電源を抜くしかない。
キーボード入力が生きている場合は以下のショートカット実行。

| 操作 | ショートカット |
| ---- | ---- |
| 再起動 | [Alt] + [PrintScreen] を押下したまま [r], [s], [e], [i], [u], [b]の順に押下 |
| 終了 | 上記同様で最後は [o] |

詳細は以下参照
[Linux PC環境構築[49]：Ubuntuが反応しないときの対処方法](https://plaza.rakuten.co.jp/kurokawa110/diary/201912290000/ "Linux PC環境構築[49]：Ubuntuが反応しないときの対処方法 _ クロカワ工房 - 楽天ブログ")
[Ubuntu　　フリーズした Ubuntu から安全に再起動する方法](http://kurumatorajirou.blogspot.com/2013/02/ubuntu-ubuntu.html "虎の備忘録_ Ubuntu　　フリーズした Ubuntu から安全に再起動する方法")

ファイルシステムのSync実行、ファイルシステムを読み込み専用モードでリマウントを行っているのでストレージやファイルの破損は防ぐことができる。かなり完璧な感じ。
もしこれが業務システムで tty が生きているなら、他の tty でログイン、問題のプロセスを kill したり、サービスを restart、って感じだろうけど、8812auドライバの問題に限ってしまえば無理。
ネットワーク関係のコマンドを実行しても反応が返ってこないし、そのままキー入力を受け付けなくなり完全フリーズに陥り、状況が悪化するだけ。
CUI環境の起動時にフリーズした場合も同様。上記ショートカットのプロセス終了が効いて、起動を妨げていたプロセスが消えログインに漕ぎ着けたりもするけど、そこからログインして何かしようとしても完全フリーズするだけで時間の無駄。
余程腕に自信が無い限りは一連のショートカットを連投し、再起動か終了した方が無難。

## 【アンインストール手順】

手動でインストールを行う場合のコマンド例は以下。(8812au.ko が存在するパスで実行ね)

```shell-session
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`コマンドで確認することができる。

```shell-session
pi@raspberrypi4:~ $ modinfo -F filename 8812au
/lib/modules/5.10.17-v7l+/kernel/drivers/net/wireless/8812au.ko
pi@raspberrypi4:~ $
```

但し、複数ファイルが配置されているような不正な状況の場合はあてにならないので、ベタな方法だけど `find`コマンドで検索した方が確実。

```shell-session
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:~ $
```

アンインストールのコマンド例は以下。

```shell-session
sudo rm -f /lib/modules/5.10.17-v7l+/kernel/drivers/net/wireless/8812au.ko
sudo /sbin/depmod -a $(uname -r)
pi@raspberrypi4:~ $
```

インストール済みの状況から再インストールを行いたい場合は、カーネルドライバファイルの配置場所が同じなら、上書きインストールでも大丈夫な気もするけど、明示的にアンインストールを行ってからの再インストールの方が無難かな。

```shell-session
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 登録を削除する場合は以下。(後述するソースファイルビルドからのインストール時)

```shell-session
sudo dkms remove -m rtl8812au -v 5.9.3.2 --all
```
バージョン番号とかは適宜読み替えてね。

## 【ソースファイルビルドからのインストールについての予備知識】

rtl8812auドライバのビルド方法をぐぐると幾つかのページが見つかる。
しかし今となっては古いページもあり、それを参考にするのは避けるべき。何故なら、その手順で示しているソースも古く、ビルドさえも通らなかったりする。更にそのパッチも探せば出てきたりするけど、そのパッチを当てて……などとやるのは時間の無駄。そのパッチが当てられた更に新しいソースが存在する筈と考えるべき。

そもそもビルド方法を解説しているサイトで引用しているソースはほぼすべて github上の物。
[github で rtl8812au を検索](https://github.com/search?q=rtl8812au "Search · rtl8812au") してみれば、多数のリポジトリがアップされていることが分かる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/045d3b0c-468e-6be8-830e-039874dd2f4d.png" width=80%>
ソースファイルからのビルドを行いたいと思ったらまずやるべきことは日本語圏から解説サイトを探す、ではなく、github上で rtl8812au のリポジトリを探すこと。
これだけあれば中には更新が停止しているもの、古いものも多いから、今でもメンテナンスされているものを絞り込む。
ピックアップすると以下。

[aircrack-ng_rtl8812au_ RTL8812AU_21AU and RTL8814AU driver with monitor mode and frame injection](https://github.com/aircrack-ng/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](https://github.com/morrownr/8812au "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](https://github.com/gordboy/rtl8812au-5.9.3.2 "gordboy_rtl8812au-5.9.3.2_ Realtek 8812AU driver version 5.9.3.2.html")
[gnab_rtl8812au_ Realtek 802.11n WLAN Adapter Linux driver](https://github.com/gnab/rtl8812au "gnab_rtl8812au_ Realtek 802.11n WLAN Adapter Linux driver")
[diederikdehaas_rtl8812AU_ Realtek 8812AU USB WiFi driver](https://github.com/diederikdehaas/rtl8812AU "diederikdehaas_rtl8812AU_ Realtek 8812AU USB WiFi driver")

また、大抵の README.md にはビルド、インストール方法も記されている。幾つか見て周れば、大体の感じは掴める。
まずこれが出発点。因みに冒頭の有志がアップしているコンパイル済みのドライバの元ソースは上記 `aircrack-ng` のリポジトリ。

## 【ソースファイルビルドからのインストール】

### 1. ビルド準備

ソースの取得ビルドにはストレージ数百M を消費する。1G程度の空きは必要。`df`コマンドで空き容量を確認し、足りない場合は確保すること。

```shell-session
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 が良い](https://www.akiradeveloper.com/post/introduction-to-dkms/ "DKMSが素晴らしい - テストステ論") とされているので、ここではその手順で進める。

まず各種アップデートとビルド環境のインストール。以下実行。

```shell-session
sudo apt update -y && sudo apt upgrade -y
sudo apt install build-essential git dkms -y
```

これだけで数分かかるので気長に待つ。
`dkms` インストールで `/usr/src`配下にカーネルヘッダが配置される。カーネルドライバのビルドにはこれが必要。

```shell-session
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` で本体のカーネルバージョンを確認。

```shell-session
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分程度の簡単な作業。殆どコピペでの実行だけ。但し唯一の鬼門がこのバージョン。本体のカーネルバージョンとビルド用カーネルヘッダのバージョン更新の同期が完全には取れていないようで、取得のタイミングが悪いとずれている場合がある。
この件は [公式](https://www.raspberrypi.org/documentation/linux/kernel/headers.md "Kernel Headers - Raspberry Pi Documentation") にも説明がある。そうなるとカーネル本体のソースをまず取得してきて……となるそうだけど、これが実際にやってみると一筋縄でいかない。
又は `rpi-update [ハッシュ値]` で任意のカーネルバージョンに差し替え、[rpi-source](https://github.com/RPi-Distro/rpi-source "RPi-Distro_rpi-source_ Raspberry Pi kernel source installer") でソース取得、という方法もあるけど、面倒であることには変わりなし。
同期されるのを待った方が無難っぽい。

### 2. ドライバソース取得

`cd /usr/src/` で作業フォルダに移動し、`sudo git clone https://github.com/gordboy/rtl8812au-5.9.3.2` でソース取得。

```shell-session
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 に定義されている対象プラットフォームの確認。

```shell-session
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` に切り替える。

```shell-session
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
```

実行例は以下。

```shell-session
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`コマンドで確認できる。

```shell-session
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:プロダクト番号が含まれている必要がある。
以下で確認。

```shell-session
grep 'USB_DEVICE(0x0411, 0x025D)' ${DRV_NAME}-${DRV_VERSION}/os_dep/linux/usb_intf.c
```

実行例は以下。

```shell-session
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機器とドライバを連動させる)方法はあるみたいだけど、今回は未検証。
[カーネルモジュールとデバイス管理 - 知らざるを知らずと為す是知るなり](https://pikesaku.wiki.fc2.com/wiki/%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%A8%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E7%AE%A1%E7%90%86 "カーネルモジュールとデバイス管理 - 知らざるを知らずと為す是知るなり")
`modalias` がキーワードですな。

### 5. ビルド、インストール

以下を実行。3行まとめて実行でも構わない。

```shell-session
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}
```

ビルドに少し時間がかかる。実行例は以下。

```shell-session
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`コマンドで。
<details><summary>実行例</summary><div>

```shell-session
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:~ $
```
</div></details>

又は `/sys/module/8812au/parameters/`配下確認。

```shell-session
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/*` で。
<details><summary>実行例</summary><div>

```shell-session
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:~ $
```
</div></details>

しかし、全パラメータの説明一覧みたいな情報って存在しないんだよね。せいぜい [ソース](https://github.com/aircrack-ng/rtl8812au/blob/e9fbf5c051453941bbc029810b893a6c010714e6/os_dep/linux/os_intfs.c "rtl8812au_os_intfs.c at e9fbf5c051453941bbc029810b893a6c010714e6 · aircrack-ng_rtl8812au") を直接確認するしかないという(Linuxあるある)。

- **無線LAN情報確認**

`iwconfig`コマンドや `iw`コマンドで。

```shell-session
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:~ $
```

```shell-session
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` は送信出力、等々が読み取れる。

- **リンクスピードの確認**

```shell-session
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)ってことだけど、厳密には接続している帯域を表している。
これをチャンネル数に置き換えたい場合は以下。

```shell-session
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`コマンドで確認。

```shell-session
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 なら [初期不良を引いた経験あり](https://qiita.com/god19/items/0e4d987c8bbf70458c31 "NUC 電源トラブル - Qiita")。

因みに、`udevadm`コマンドで USB機器接続、取り外しをモニターできる。
<details><summary>実行例</summary><div>

```shell-session
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:
```
</div></details>

WI-U3-866DS 接続時は上記のように表示、取り外し時は以下のように表示される。
<details><summary>実行例</summary><div>

```shell-session
```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:
```
</div></details>

### 2. lsusb では認識されているのに動作しない
`lsmod | grep 8812au` で `8812au`ドライバがロードされているか確認。

```shell-session
pi@raspberrypi4:~ $ lsmod | grep 8812au
8812au               2285568  0
cfg80211              761856  1 8812au
pi@raspberrypi4:~ $ 
```
`cfg80211` と依存関係があるので、その行にも表示されることが重要。
もしくは `journalctl`コマンドで確認。

```shell-session
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)
(以下略))
```

ロードされていない場合は以下で手動ロード。

```shell-session
sudo modprobe 8812au
```

手動ロードでも失敗する場合は `depmod`コマンドで確認。

```shell-session
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` でドライバファイルの存在を確認。

```shell-session
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:プロダクト番号が含まれていること確認。

```shell-session
  {USB_DEVICE(0x0411, 0x025D), .driver_info = RTL8812}, /* Buffalo - WI-U3-866D */
```

又は、ビルド・インストールのやり直し。エラーが発生しないことをこと確認。

### 3. フリーズしまくるんですけど
~~バグではありません。仕様です。~~ そもそも `dmesg`コマンドで確認すれば分かるけど、ばきばきとワーニングが出てるんだよね。
<details><summary>`dmesg`コマンド出力例</summary><div>

```shell-session
[   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 ]---
```
</div></details>

ここら辺の問題は github の [issues](https://github.com/aircrack-ng/rtl8812au/issues/498 "Possible dead lock with v5.6.4.2 + kernel 5.3.13 · Issue #498 · aircrack-ng_rtl8812au") でも指摘されているんだけど。何とかならんものかねぇ。
経験則になってしまうけど、フリーズが多発する場合は WiFi親機を再起動すると改善する場合あり。

### 4. USB3.0モードに設定しても相応のリンクスピードが出ない
`lsusb -t`コマンドで間違いなく USB3.0モードに切り替わっていることが確認できて、USB2.0モード時と転送速度が大して変わらないか寧ろ低い場合や、USB3.0モード相応のリンクスピードが出ていたのに、気が付いたら低下していて復活しない場合は、WiFi親機の接続数が多すぎて干渉している可能性がある。
可能であれば WI-U3-866DS だけが接続している状態、とまではいかなくてもできる限り他の WiFi通信機器は止め、WiFi親機を再起動。多分これで改善される。
接続台数が限られているのに遅くなる場合もあり(何だかなぁ)、やはり WiFi親機を再起動。

## 【全般的knowledge】

- **rtl8812auチップ採用の製品一覧**

rtl8812auチップを採用している他メーカーの製品を知りたい場合。
[DeviWiki](https://deviwiki.com/wiki "DeviWiki (ex WikiDevi)") で探すのも手だろうけど、ソース内の定義を見た方が手っ取り早いか。

[/os_dep/linux/usb_intf.c](https://github.com/aircrack-ng/rtl8812au/blob/v5.6.4.2/os_dep/linux/usb_intf.c "rtl8812au_usb_intf.c at v5.6.4.2 · aircrack-ng_rtl8812au · GitHub")

```usb_intf.c
#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 なら以下。古いチップセットばかりだろうけど。

```shell-session
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/](https://github.com/raspberrypi/linux/tree/rpi-5.10.y/drivers/net/wireless/realtek "linux_drivers_net_wireless_realtek at rpi-5.10.y · raspberrypi_linux · GitHub")

- **ディストリビューション配布パッケージの検索**

ここまでくると最早ドライバの話ではなくて基本的な操作法になってしまうけど。`apt-cache search`コマンドで。Realtek 検索結果は以下。残念ながら rtl8812auドライバは存在しない模様。

```shell-session
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で使う！](https://fzmy--i401--shion.blogspot.com/2019/06/wi-u3-866dslinux.html "【ビルド不要!_】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`コマンド等でカーネルモジュールをロードする場合は内部的にこのファイルを参照する仕組みらしい。


```shell-session
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コマンド](https://qiita.com/god19/items/a3d76434ee24d2001923 "Wi-Fi通信速度測定 - Qiita") で。自分の環境では以下。

```shell-session
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:~ $
```

残念ながら常時このスピードという訳ではなく、調子が良ければ最大これぐらい出る、というものだけど。

[製品公式サイト](https://www.buffalo.jp/product/detail/wi-u3-866ds.html "WI-U3-866DS _ Wi-Fiアダプター _ AirStation _ バッファロー") で公開されている実測値は `491Mbps`。
また、こちらのサイトの報告では `470 Mbits/sec`前後。
[morrownr_8812au_ Linux Driver for USB WiFi Adapters that are based on the RTL8812AU Chipset](https://github.com/morrownr/8812au "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` を検索。以下が見つかる。

[os_dep/linux/os_intfs.c](https://github.com/aircrack-ng/rtl8812au/blob/e9fbf5c051453941bbc029810b893a6c010714e6/os_dep/linux/os_intfs.c "rtl8812au_os_intfs.c at e9fbf5c051453941bbc029810b893a6c010714e6 · aircrack-ng_rtl8812au · GitHub")

```os_intfs.c
#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 で定義されいている。

[include/rtw_pwrctrl.h](https://github.com/aircrack-ng/rtl8812au/blob/e9fbf5c051453941bbc029810b893a6c010714e6/include/rtw_pwrctrl.h "rtl8812au_rtw_pwrctrl.h at e9fbf5c051453941bbc029810b893a6c010714e6 · aircrack-ng_rtl8812au · GitHub.html")

```rtw_pwrctrl.h
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値も検索の足掛かりになる。以上を踏まえて更に検索。

[hal/rtl8812a/rtl8812a_cmd.c](https://github.com/aircrack-ng/rtl8812au/blob/e9fbf5c051453941bbc029810b893a6c010714e6/hal/rtl8812a/rtl8812a_cmd.c "rtl8812au_rtl8812a_cmd.c at e9fbf5c051453941bbc029810b893a6c010714e6 · aircrack-ng_rtl8812au · GitHub.html")

```rtl8812a_cmd.c
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) */`。ふむふむ。

[os_dep/linux/usb_intf.c](https://github.com/aircrack-ng/rtl8812au/blob/e9fbf5c051453941bbc029810b893a6c010714e6/os_dep/linux/usb_intf.c "rtl8812au_usb_intf.c at e9fbf5c051453941bbc029810b893a6c010714e6 · aircrack-ng_rtl8812au · GitHub")

```usb_intf.c
#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 じゃないのかな。

[Makefile](https://github.com/aircrack-ng/rtl8812au/blob/e9fbf5c051453941bbc029810b893a6c010714e6/Makefile "rtl8812au_Makefile at e9fbf5c051453941bbc029810b893a6c010714e6 · aircrack-ng_rtl8812au · GitHub")

```shell-session
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` かな？

[os_dep/linux/os_intfs.c](https://github.com/aircrack-ng/rtl8812au/blob/e9fbf5c051453941bbc029810b893a6c010714e6/os_dep/linux/os_intfs.c "rtl8812au_os_intfs.c at e9fbf5c051453941bbc029810b893a6c010714e6 · aircrack-ng_rtl8812au · GitHub")

```os_intfs.c
#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定義箇所は以下。

[include/osdep_service_linux.h](https://github.com/aircrack-ng/rtl8812au/blob/e9fbf5c051453941bbc029810b893a6c010714e6/include/osdep_service_linux.h "rtl8812au_osdep_service_linux.h at e9fbf5c051453941bbc029810b893a6c010714e6 · aircrack-ng_rtl8812au · GitHub")

```osdep_service_linux.h
#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](https://ja.wikipedia.org/wiki/%E4%BE%B5%E5%85%A5%E6%A4%9C%E7%9F%A5%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0 "侵入検知システム - Wikipedia") かと思ったけど、リンク省電力機能らしい。

[Debianユーザーフォーラム•トピックを表示-[解決済み]ワイヤレスネットワークが断続的に再接続する](http://forums.debian.net/viewtopic.php?f=5&t=125402 "Debianユーザーフォーラム•トピックを表示-[解決済み]ワイヤレスネットワークが断続的に再接続する")
> 「ips」モードはこれまで、リンクが検出されない場合にチップをスリープモードで送信するrealtekドライバーの機能でした。

[Realtek wifi rtl8723のパラメーターを設定する方法](http://forums.debian.net/viewtopic.php?f=5&t=125402 "14.04 — Realtek wifi rtl8723のパラメーターを設定する方法")
> ips:using no link power save (default 1 is open)

ソースを確認。

[include/rtw_pwrctrl.h](https://github.com/aircrack-ng/rtl8812au/blob/e9fbf5c051453941bbc029810b893a6c010714e6/include/rtw_pwrctrl.h "rtl8812au_rtw_pwrctrl.h at e9fbf5c051453941bbc029810b893a6c010714e6 · aircrack-ng_rtl8812au · GitHub")

```rtw_pwrctrl.h
enum { /* for ips_mode */
	IPS_NONE = 0,
	IPS_NORMAL,
	IPS_LEVEL_2,
	IPS_NUM
};
```

[core/rtw_pwrctrl.c](https://github.com/aircrack-ng/rtl8812au/blob/e9fbf5c051453941bbc029810b893a6c010714e6/core/rtw_pwrctrl.c "rtl8812au_rtw_pwrctrl.c at e9fbf5c051453941bbc029810b893a6c010714e6 · aircrack-ng_rtl8812au · GitHub")

```rtw_pwrctrl.c
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 も設定しているし。

[os_dep/linux/os_intfs.c](https://github.com/aircrack-ng/rtl8812au/blob/e9fbf5c051453941bbc029810b893a6c010714e6/os_dep/linux/os_intfs.c "rtl8812au_os_intfs.c at e9fbf5c051453941bbc029810b893a6c010714e6 · aircrack-ng_rtl8812au · GitHub")

```os_intfs.c
#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](https://github.com/aircrack-ng/rtl8812au/blob/e9fbf5c051453941bbc029810b893a6c010714e6/hal/rtl8812a/usb/usb_halinit.c "rtl8812au_usb_halinit.c at e9fbf5c051453941bbc029810b893a6c010714e6 · aircrack-ng_rtl8812au · GitHub")

```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**

省電力がらみでぐぐるとこのパラメータも目にすることがあるので確認。

[os_dep/linux/os_intfs.c](https://github.com/aircrack-ng/rtl8812au/blob/e9fbf5c051453941bbc029810b893a6c010714e6/os_dep/linux/os_intfs.c "rrtl8812au_os_intfs.c at e9fbf5c051453941bbc029810b893a6c010714e6 · aircrack-ng_rtl8812au · GitHub.html")

```os_intfs.c
#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
```

[include/rtw_pwrctrl.h](https://github.com/aircrack-ng/rtl8812au/blob/e9fbf5c051453941bbc029810b893a6c010714e6/include/rtw_pwrctrl.h "rtl8812au_rtw_pwrctrl.h at e9fbf5c051453941bbc029810b893a6c010714e6 · aircrack-ng_rtl8812au · GitHub.html")

```rtw_pwrctrl.h
	u8		bHWPwrPindetect; /* come from registrypriv.hwpwrp_detect. enable power down function. 0:disable, 1:enable */
#endif
```

[core/rtw_pwrctrl.c](https://github.com/aircrack-ng/rtl8812au/blob/e9fbf5c051453941bbc029810b893a6c010714e6/core/rtw_pwrctrl.c "rtl8812au_rtw_pwrctrl.c at e9fbf5c051453941bbc029810b893a6c010714e6 · aircrack-ng_rtl8812au · GitHub")

```rtw_pwrctrl.c
	/* 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版ドライバで、今でも [公式サイト](http://free4wireless.blogspot.com/2016/02/edimax-ew-7822uac-driver-windowsmac-and.html "Edimax EW-7822UAC Driver Windows,Mac And Linux - Wireless, Wifi, Printer Driver Download") からダウンロードできる。
[こちら](https://deviwiki.com/wiki/Edimax_EW-7822UAC "Edimax EW-7822UAC - DeviWiki (ex WikiDevi)") からダウンロードできる物は更に新しいようだけど、いずれにしても今となっては古いもので使えない。

Edimaxの公式サイトには Linuxドライバに関して以下のページがある。

[How to install EW-7811 AC600 & EW-7822UAC in Linux with kernel higher than v4.1](https://edimax.freshdesk.com/support/solutions/articles/14000041287-how-to-install-ew-7811-ac600-ew-7822uac-in-linux-with-kernel-higher-than-v4-1 "How to install EW-7811 AC600 & EW-7822UAC in Linux with kernel higher than v4.1")
> 2017年11月の時点で、上記のアダプターの公式Linuxドライバーは、v4.1までのLinuxカーネルのみをサポートしています。それ以降のバージョンはサポートされていません。唯一の回避策は、GitHubのオープンソースドライバーを使用することです。参考のためのリンクは次のとおりです。
> 
> https://github.com/aircrack-ng/rtl8812au

[How to install EW-7811 AC600 Series and EW-7822UAC adapters on Raspberry Pi](https://edimax.freshdesk.com/support/solutions/articles/14000032146-how-to-install-ew-7811-ac600-series-and-ew-7822uac-adapters-on-raspberry-pi "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](https://www.asus.com/jp/Networking-IoT-Servers/Adapters/All-series/USBAC56/ "USB-AC56｜子機｜ASUS 日本") で、github 上のフォークは [こちら](https://github.com/napalu/RTL8812AU_ASUS "napalu_RTL8812AU_ASUS_ ASUS USB-AC56 (RTL8812AU) driver from Asus, modified to compile against kernels _ 3.18")。
Raspberry Pi 用は [こちら](https://github.com/zorani/USB-AC56-raspi "zorani_USB-AC56-raspi")。

PLANEX は基本的に Linux版ドライバも公開しているらしく確認すると以下。
[ダウンロード｜GW-900Dシリーズ｜プラネックス](https://www.planex.co.jp/support/download/gw-900d/driver_linux.shtml "ダウンロード｜GW-900Dシリーズ｜プラネックス")
これまた古くて結局 github頼みになる模様。
[[レビュー] Linuxで使えるUSB無線LAN PLANEX「GW-900D-BK」をUbuntuで試してみました](https://gadgetrip.jp/2018/10/review_planex_gw_900d_bk/ "[レビュー] Linuxで使えるUSB無線LAN PLANEX「GW-900D-BK」をUbuntuで試してみました")

LibreELEC では rtl8812au が標準でサポートされているという [情報](https://forum.libreelec.tv/thread/6133-rtl8812au-wifi-dongle-on-rpi-3/?pageNo=3 "rtl8812au wifi dongle on RPi 3 - Page 3 - General Support - LibreELEC Forum") をたまたま見つけ、[ソース](https://github.com/LibreELEC/LibreELEC.tv/blob/19675d422daed4b8d813ed871524a22d9d4548bf/packages/linux-drivers/RTL8812AU/package.mk "LibreELEC.tv_package.mk at 19675d422daed4b8d813ed871524a22d9d4548bf · LibreELEC_LibreELEC.tv · GitHub") を確認したところ、結局これも aircrack-ng版だっていうね。

```shell-session
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](http://buffalo.jp/download/driver/lan/txt/airnavi2-222b-readme.txt "airnavi2-222b-readme.txt") みたいだけど、このファイル名でぐぐるとブルースクリーンの報告例がぼこぼこヒットするという。
一応現在は対応済みみたいだけど。

[エアナビゲータ２ライト (Windows) 個別版 _ ダウンロード _ バッファロー](https://www.buffalo.jp/support/download/detail/?dl_contents_id=62176 "エアナビゲータ２ライト (Windows) 個別版 _ ダウンロード _ バッファロー")

> 更新履歴
Ver.2.22b[2020/07/15]
１．ドライバー
１.１ WI-U3-866D / WI-U3-866DS
1.お使いのパソコン環境によって青い画面(ブルースクリーン)が表示され、パソコンが操作できなくなる問題を改善しました。

Linux版も何とかならんものかね。
とまぁ大長編になってしまったけど、散々苦労させられたお陰で多少はカーネルモジュールの知識が身についた。丁度 [動かしながらゼロから学ぶ Linuxカーネルの教科書](https://www.amazon.co.jp/%E5%8B%95%E3%81%8B%E3%81%97%E3%81%AA%E3%81%8C%E3%82%89%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B6-Linux%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E6%9C%AB%E5%AE%89-%E6%B3%B0%E4%B8%89/dp/4296106953 "動かしながらゼロから学ぶ Linuxカーネルの教科書 _ 末安 泰三, 日経Linux _本 _ 通販 _ Amazon") も読んでいて、こちらも参考になった。比較的新しい本で、内容も平易なので入門書としてお勧め。

あ、それと最後に。
冒頭に挙げた有志がアップしている rtl8812auドライバ。64bit版もあったので試したけど、AP接続の段階でフリーズしまくりでまったく使い物にならなかった。
何回か試して、1回だけで接続に成功したけど、その後もフリーズしまくり、心が折れて断念。つくづく Raspberry Pi 64bit 対応の道は遠く険しい。