TP-Link Archer T4EをLinuxまたはWindowsで使うコツ

TP-Linkは安価で結構ちゃんと動くネットワーク機器を売ってるメーカーで、そんなTP-Link製のPCI-Express (x1)接続の無線LANカード Archer T4Eを買って2年が経った。 Archer T4E はRealtek RTL8812AE (PCI id=10ec:8812)を使っていて、LinuxでもWindowsでも動かすことができる。 どちらのOSで使う場合でも、それぞれちょっとしたコツでより快適に使えることがわかったので、このページでは私がこれまでに「発見」したコツを書いておく。 なお、このカードはRyzen 3500搭載の自作PCで動かしている。

  1. Linux編
  2. Windows 10/11編
TP-Link Archer T4E box
TP-Link Archer T4Eの外箱。AC1200が型番かと思いきやそうではないし、最大通信速度は867 Mbpsだ。

Linux編

Linuxでは、このチップはrtl8821ae(8812ではない)というインカーネルのドライバで使うことになる。 Ubuntu Linux 21.04と21.10と、たしか20.04くらいでもそうだったのだが、長い時間アクセスポイントに接続していると、カーネルから以下のメッセージが出て接続が切れてしまうことがある。 このログはUbuntu 21.10のLinux 5.13.0-22-genericから出たもの。

wlp6s0: send auth to 11:22:33:44:55:66 (try 2/3)
wlp6s0: send auth to 11:22:33:44:55:66 (try 3/3)
wlp6s0: authentication with 11:22:33:44:55:66 timed out
wlp6s0: authenticate with 11:22:33:44:55:66
wlp6s0: send auth to 11:22:33:44:55:66 (try 1/3)
wlp6s0: send auth to 11:22:33:44:55:66 (try 2/3)
wlp6s0: send auth to 11:22:33:44:55:66 (try 3/3)
wlp6s0: authentication with 11:22:33:44:55:66 timed out
wlp6s0: authenticate with 11:22:33:44:55:66
wlp6s0: send auth to 11:22:33:44:55:66 (try 1/3)
wlp6s0: authenticated
wlp6s0: associate with 11:22:33:44:55:66 (try 1/3)
wlp6s0: RX AssocResp from 11:22:33:44:55:66 (capab=0x411 status=0 aid=3)
wlp6s0: associated
wlp6s0: Limiting TX power to 30 (30 - 0) dBm as advertised by 11:22:33:44:55:66
wlp6s0: deauthenticated from 11:22:33:44:55:66 (Reason: 15=4WAY_HANDSHAKE_TIMEOUT)
------------[ cut here ]------------
WARNING: CPU: 1 PID: 1116 at drivers/iommu/dma-iommu.c:504 __iommu_dma_unmap_swiotlb+0x85/0xa0
Modules linked in: overlay ccm xt_CHECKSUM xt_MASQUERADE ipt_REJECT nf_reject_ipv4 nft_chain_nat nf_nat bridge stp llc nft_counter xt_tcpudp xt_state xt_conntrack nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 nft_compat nf_tables nfnetlink binfmt_misc nls_iso8859_1 snd_hda_codec_realtek snd_hda_codec_generic ledtrig_audio snd_hda_codec_hdmi snd_hda_intel intel_rapl_msr intel_rapl_common snd_intel_dspcfg snd_intel_sdw_acpi rtl8821ae snd_hda_codec snd_hda_core snd_hwdep btcoexist snd_pcm rtl_pci rtlwifi edac_mce_amd snd_seq_midi snd_seq_midi_event snd_rawmidi kvm_amd snd_seq mac80211 snd_seq_device kvm snd_timer rapl wmi_bmof cfg80211 gigabyte_wmi xpad snd ff_memless joydev input_leds serio_raw ccp soundcore libarc4 k10temp efi_pstore mac_hid nvidia_uvm(PO) sch_fq_codel msr parport_pc ppdev lp parport sunrpc ip_tables x_tables autofs4 xfs libcrc32c hid_logitech_hidpp hid_logitech_dj hid_generic usbhid hid nvidia_drm(PO) nvidia_modeset(PO) nvidia(PO) crct10dif_pclmul crc32_pclmul
 ghash_clmulni_intel drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops cec aesni_intel crypto_simd cryptd rc_core psmouse r8169 i2c_piix4 drm realtek ahci xhci_pci gpio_amdpt libahci xhci_pci_renesas wmi gpio_generic
CPU: 1 PID: 1116 Comm: wpa_supplicant Tainted: P           O      5.13.0-22-generic #22-Ubuntu
Hardware name: Gigabyte Technology Co., Ltd. B450M S2H/B450M S2H, BIOS F62d 10/13/2021
RIP: 0010:__iommu_dma_unmap_swiotlb+0x85/0xa0
Code: 1a 4c 3b 60 08 73 14 8b 4d d4 49 89 d8 4c 89 ea 4c 89 e6 4c 89 ff e8 0a 9c 99 ff 48 83 c4 08 5b 41 5c 41 5d 41 5e 41 5f 5d c3 <0f> 0b 48 83 c4 08 5b 41 5c 41 5d 41 5e 41 5f 5d c3 66 2e 0f 1f 84
RSP: 0018:ffffb838c1a07600 EFLAGS: 00010046
RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000015
RDX: 0000000040000000 RSI: 0000000000000000 RDI: ffffb838c1a075b8
RBP: ffffb838c1a07630 R08: 0000000000000000 R09: 0000000000000000
R10: 0000000000000081 R11: 0000000000000001 R12: ffff9a8ac12ce0c8
R13: 00000000000009d8 R14: 0000000000000000 R15: ffff9a8ac12ce0c8
FS:  00007ff1c962ac40(0000) GS:ffff9a8dee840000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 00007fb43bc55000 CR3: 000000010fa56000 CR4: 0000000000350ee0
Call Trace:
 iommu_dma_unmap_page+0x4a/0x50
 dma_unmap_page_attrs+0x187/0x1c0
 rtl_pci_reset_trx_ring+0x18c/0x360 [rtl_pci]
 rtl_ps_enable_nic+0x2d/0x130 [rtlwifi]
 _rtl8821ae_phy_set_rf_power_state+0x288/0x2c0 [rtl8821ae]
 rtl8821ae_phy_set_rf_power_state+0x1a/0x20 [rtl8821ae]
 rtl_ps_set_rf_state.isra.0+0xb8/0x100 [rtlwifi]
 _rtl_ps_inactive_ps+0x3b/0xd0 [rtlwifi]
 rtl_ips_nic_on+0x90/0xd0 [rtlwifi]
 rtl_op_config+0x256/0x420 [rtlwifi]
 ieee80211_hw_config+0x7d/0xf0 [mac80211]
 ieee80211_recalc_idle+0x29/0x30 [mac80211]
 __ieee80211_start_scan+0x212/0x600 [mac80211]
 ? __cond_resched+0x1a/0x50
 ieee80211_request_scan+0x30/0x50 [mac80211]
 ieee80211_scan+0x5c/0xa0 [mac80211]
 cfg80211_scan+0x1a5/0x250 [cfg80211]
 nl80211_trigger_scan+0x41c/0x6c0 [cfg80211]
 genl_family_rcv_msg_doit+0xe7/0x150
 genl_rcv_msg+0xe2/0x1e0
 ? nl80211_send_scan_start+0xa0/0xa0 [cfg80211]
 ? genl_get_cmd+0xd0/0xd0
 netlink_rcv_skb+0x55/0x100
 genl_rcv+0x29/0x40
 netlink_unicast+0x21d/0x330
 netlink_sendmsg+0x246/0x490
 sock_sendmsg+0x65/0x70
 ____sys_sendmsg+0x24e/0x290
 ? import_iovec+0x31/0x40
 ? sendmsg_copy_msghdr+0x7b/0xa0
 ___sys_sendmsg+0x81/0xc0
 ? sock_do_ioctl+0x41/0x140
 ? __cond_resched+0x1a/0x50
 ? begin_current_label_crit_section+0x2a/0xd0
 ? __check_object_size.part.0+0x3a/0x150
 ? __cond_resched+0x1a/0x50
 ? aa_sk_perm+0x43/0x1b0
 ? sock_getsockopt+0x11a/0xce0
 ? _copy_from_user+0x2e/0x60
 __sys_sendmsg+0x62/0xb0
 __x64_sys_sendmsg+0x1d/0x20
 do_syscall_64+0x61/0xb0
 ? syscall_exit_to_user_mode+0x27/0x50
 ? __x64_sys_setsockopt+0x1f/0x30
 ? do_syscall_64+0x6e/0xb0
 ? __x64_sys_getsockopt+0x1f/0x30
 ? do_syscall_64+0x6e/0xb0
 ? do_syscall_64+0x6e/0xb0
 entry_SYSCALL_64_after_hwframe+0x44/0xae
RIP: 0033:0x7ff1c9a853c7
Code: 0e 00 f7 d8 64 89 02 48 c7 c0 ff ff ff ff eb b9 0f 1f 00 f3 0f 1e fa 64 8b 04 25 18 00 00 00 85 c0 75 10 b8 2e 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 51 c3 48 83 ec 28 89 54 24 1c 48 89 74 24 10
RSP: 002b:00007ffdc3917788 EFLAGS: 00000246 ORIG_RAX: 000000000000002e
RAX: ffffffffffffffda RBX: 00005611efc79590 RCX: 00007ff1c9a853c7
RDX: 0000000000000000 RSI: 00007ffdc39177c0 RDI: 0000000000000006
RBP: 00005611efc794a0 R08: 0000000000000004 R09: 00007ff1c9b73c60
R10: 00007ffdc3917890 R11: 0000000000000246 R12: 00005611efcb4260
R13: 00007ffdc39177c0 R14: 00007ffdc3917890 R15: 00005611efcccd30
---[ end trace b5c34f7f16c98629 ]---

原因はまったくわかっていないのだが、適当に勘で以下の対応をしたところ、最近は起きていない。

  1. /etc/default/grubにて、GRUB_CMDLINE_LINUX_DEFAULTの末尾に swiotlb=4096を追加
  2. sudo grub-mkconfig -o /boot/grub/grub.cfg実行
  3. 以上の操作は、再起動後cat /proc/cmdlineswiotlb=4096が見えることを確認。
  4. /etc/modprobe.d/rtl8821ae.confを作成。中身はoptions rtl8821ae int_clear=0
  5. sudo update-initramfs -u実行
  6. 以上の操作は、再起動後cat /sys/module/rtl8821ae/parameters/int_clearNになっていることを確認。

swiotlb=は、PCI DMA用のsoftware bounce buffer (SWIOTLB)の大きさを指定するパラメータで、通常64 MBytesのところ4096×slab (128 KBytes)の512 MBytesに拡大する指定。

本当はこのドライバを作ってる人に相談したりするのが良いのだと思うが、NVIDIAのカーネルモジュール使っていてtaintedである関係で直接言うのが後ろめたい気持ち。

Windows 10/11編

Windows 10とWindows 11では、メーカー配布のArcher T4E(UN)_V1_190108_Wins 公開日: 2019-01-16を使うことになる。

アクセスポイントとの接続がきれることはないのだが、一秒ほど通信がされない状況が数秒おきに続きことがあった。 これは朝電源を入れてから作業を初めて午後中頃なったくらいに起きることが多かった。 Microsoft Teamsやリモートデスクトップのような、継続的に通信していないといけないソフトで数秒〜10秒ほどに一回データの流れが止まってしまい、音声が一瞬途切れたり、文字入力の反映が遅れたりすることで気づく。 一度この状態になってしまうと、再起動するまで戻らないのが症状の特徴だ。

今は再起動したくない、という場合、以下の操作で必ずデータの流れはスムーズに戻った。

  1. コマンドプロンプトを右クリック、管理者権限で実行
  2. netsh wlan show interfacesで該当する無線LANカードのインターフェース名を調べる。
  3. netsh wlan set autoconfig enabled=no interface="↑で調べた名前"を実行。
  4. この状態だと、無線LANのアクセスポイントへの自動接続はされないので、電源を切る前などに適宜上記コマンドでenabled=yesにしてもとに戻しておく。

バッチファイルにしておくと便利かもしれない。

結論

というわけで、今どきめずらしい、ちょっと工夫がいるタイプの自作PCパーツなのであった。 西暦2000年ごろは今よりもっともっとこういう感じのパーツが多くて楽しかったと記憶していて、これからも安くて怪しいパーツを積極的に選んで買っていきたいと思っている。(おわり)