最近在调试Qualcomm的QCA2066 WiFi 6E平台,主控处理器信息如下所示:
6nm AMD APU
CPU:Zen 2 4c/8t、2.4-3.5GHz(最高可达 448GFlops FP32)
GPU:8 RDNA 2 CUs、1.6GHz(1.6 TFlops FP32)
到这里,大家应该能猜到是那个项目,hahaha...。没错,就是如你所想的那样,Valve的最新一代Steam Deck OLED:https://store.steampowered.com/steamdeck
言归正传,回到我们的问题点。在客户的使用Steam Deck OLED的过程中,偶然间发现,Kernel会持续的打印如下的kernel trace,但是Wi-Fi还是可以正常使用,并没有影响其Wi-Fi功能。初步分析可能是一个Warning信息,但是总归有概率性会打印相关log,本着解决客户一切问题的态度,开始着手排查此问题。
May 30 18:56:25 SteamBe kernel: ------------[ cut here ]------------
May 30 18:56:25 SteamBe kernel: invalid HE MCS: bw:6, ru:6
May 30 18:56:25 SteamBe kernel: WARNING: CPU: 5 PID: 2312 at net/wireless/util.c:1501 cfg80211_calculate_bitrate_he+0x22b/0x270 [cfg80211]
May 30 18:56:25 SteamBe kernel: Modules linked in: tls uinput snd_seq_dummy snd_hrtimer rfcomm snd_seq snd_seq_device michael_mic nft_fib_inet nft_fib_ipv4 nft_fib_ipv6 nft_fib nft_reject_inet nf_reject_ipv4 nf_reject_ipv6 nft_reject nft_ct nft_chain_nat nf_tables ip6table_nat ip6table_mangle ip6table_raw ip6table_security iptable_nat nf_nat nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 iptable_mangle iptable_raw iptable_security ccm algif_aead crypto_null cbc des_generic libdes ecb uhid cmac ip6table_filter ip6_tables md4 algif_skcipher algif_hash ramoops af_alg iptable_filter bnep reed_solomon qrtr_mhi squashfs amdgpu intel_rapl_msr intel_rapl_common edac_mce_amd kvm_amd qrtr snd_acp_sof_mach snd_sof_probes snd_acp_mach ath11k_pci kvm snd_soc_dmic amdxcp ath11k irqbypass crct10dif_pclmul i2c_algo_bit qmi_helpers hci_uart crc32_pclmul snd_sof_amd_vangogh btqca polyval_clmulni polyval_generic r8153_ecm btrtl drm_exec snd_sof_amd_acp hid_multitouch btbcm mac80211 gf128mul cdc_ether snd_sof_pci gpu_sched snd_sof_xtensa_dsp ghash_clmulni_intel
May 30 18:56:25 SteamBe kernel: drm_suballoc_helper btintel snd_hda_codec_hdmi sha512_ssse3 usbnet snd_sof drm_buddy libarc4 aesni_intel crypto_simd drm_ttm_helper snd_hda_intel snd_sof_utils cryptd mousedev joydev snd_hda_codec snd_intel_dspcfg ttm bluetooth atkbd rapl snd_hda_core cfg80211 snd_intel_sdw_acpi drm_display_helper libps2 snd_soc_max98388 wdat_wdt snd_soc_nau8821 snd_pci_acp5x sp5100_tco snd_hwdep snd_acp_config cec tpm_crb ecdh_generic pcspkr snd_soc_core snd_compress vivaldi_fmap acpi_cpufreq tpm_tis ac97_bus snd_pcm_dmaengine r8152 mii snd_pcm rfkill mmc_block video i2c_piix4 hid_steam cdc_acm snd_soc_acpi ccp mhi snd_timer ltrf216a snd ff_memless tpm_tis_core 8250_dw wmi i2c_hid_acpi industrialio soundcore i2c_hid mac_hid pkcs8_key_parser i2c_dev crypto_user dm_mod fuse loop nfnetlink zram tpm ip_tables x_tables overlay ext4 crc16 mbcache jbd2 usbhid vfat fat btrfs blake2b_generic libcrc32c crc32c_generic xor raid6_pq serio_raw extcon_steamdeck steamdeck_hwmon leds_steamdeck sdhci_pci nvme cqhci crc32c_intel sdhci
May 30 18:56:25 SteamBe kernel: xhci_pci nvme_core i8042 xhci_pci_renesas mmc_core nvme_common serio steamdeck spi_amd
May 30 18:56:25 SteamBe kernel: CPU: 5 PID: 2312 Comm: NetworkManager Not tainted 6.5.0-valve7-1-neptune-65-gbb001cd639ba #1 2c0c0bd32b97c03c98ce17cfa084cf1c9f9be83b
May 30 18:56:25 SteamBe kernel: Hardware name: Valve Galileo/Galileo, BIOS F7G0110 04/09/2024
May 30 18:56:25 SteamBe kernel: RIP: 0010:cfg80211_calculate_bitrate_he+0x22b/0x270 [cfg80211]
May 30 18:56:25 SteamBe kernel: Code: fa 02 74 4d 80 fa 01 74 51 84 d2 75 11 8b 44 84 60 eb 8a 8b 44 84 10 eb 84 40 84 f6 74 1e 48 c7 c7 3d 5e 0e c1 e8 b5 b1 4b e2 <0f> 0b 31 c0 eb a1 0f 0b 31 c0 eb 9b 0f 0b 31 c0 eb 95 8b 44 84 30
May 30 18:56:25 SteamBe kernel: RSP: 0018:ffffa0e84bbeb598 EFLAGS: 00010282
May 30 18:56:25 SteamBe kernel: RAX: 0000000000000000 RBX: ffff8c71560a3900 RCX: 0000000000000027
May 30 18:56:25 SteamBe kernel: RDX: ffff8c7371d60748 RSI: 0000000000000001 RDI: ffff8c7371d60740
May 30 18:56:25 SteamBe kernel: RBP: ffffa0e84bbeb760 R08: 0000000000000000 R09: ffffa0e84bbeb420
May 30 18:56:25 SteamBe kernel: R10: 0000000000000003 R11: ffff8c737ef7ffe8 R12: ffff8c71fa7a3f74
May 30 18:56:25 SteamBe kernel: R13: ffff8c71252e83c0 R14: 0000000000003ef0 R15: ffff8c71fa7a3ef0
May 30 18:56:25 SteamBe kernel: FS: 00007f719a307200(0000) GS:ffff8c7371d40000(0000) knlGS:0000000000000000
May 30 18:56:25 SteamBe kernel: CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
May 30 18:56:25 SteamBe kernel: CR2: 00005599344e1028 CR3: 000000016b2c8000 CR4: 0000000000350ee0
May 30 18:56:25 SteamBe kernel: Call Trace:
May 30 18:56:25 SteamBe kernel: <TASK>
May 30 18:56:25 SteamBe kernel: ? cfg80211_calculate_bitrate_he+0x22b/0x270 [cfg80211 fcf90004dc54bed01f0e724730aa1704ae8671a3]
May 30 18:56:25 SteamBe kernel: ? __warn+0x81/0x130
May 30 18:56:25 SteamBe kernel: ? cfg80211_calculate_bitrate_he+0x22b/0x270 [cfg80211 fcf90004dc54bed01f0e724730aa1704ae8671a3]
May 30 18:56:25 SteamBe kernel: ? report_bug+0x171/0x1a0
May 30 18:56:25 SteamBe kernel: ? prb_read_valid+0x1b/0x30
May 30 18:56:25 SteamBe kernel: ? srso_return_thunk+0x5/0x10
May 30 18:56:25 SteamBe kernel: ? handle_bug+0x3a/0x70
May 30 18:56:25 SteamBe kernel: ? exc_invalid_op+0x17/0x70
May 30 18:56:25 SteamBe kernel: ? asm_exc_invalid_op+0x1a/0x20
May 30 18:56:25 SteamBe kernel: ? cfg80211_calculate_bitrate_he+0x22b/0x270 [cfg80211 fcf90004dc54bed01f0e724730aa1704ae8671a3]
May 30 18:56:25 SteamBe kernel: ? cfg80211_calculate_bitrate_he+0x22b/0x270 [cfg80211 fcf90004dc54bed01f0e724730aa1704ae8671a3]
May 30 18:56:25 SteamBe kernel: nl80211_put_sta_rate+0x5b/0x4d0 [cfg80211 fcf90004dc54bed01f0e724730aa1704ae8671a3]
May 30 18:56:25 SteamBe kernel: nl80211_send_station+0x9ce/0x1000 [cfg80211 fcf90004dc54bed01f0e724730aa1704ae8671a3]
May 30 18:56:25 SteamBe kernel: nl80211_dump_station+0xef/0x290 [cfg80211 fcf90004dc54bed01f0e724730aa1704ae8671a3]
May 30 18:56:25 SteamBe kernel: netlink_dump+0x129/0x320
May 30 18:56:25 SteamBe kernel: __netlink_dump_start+0x1cd/0x290
May 30 18:56:25 SteamBe kernel: genl_family_rcv_msg_dumpit+0x110/0x120
May 30 18:56:25 SteamBe kernel: ? __pfx_genl_start+0x10/0x10
May 30 18:56:25 SteamBe kernel: ? __pfx_nl80211_dump_station+0x10/0x10 [cfg80211 fcf90004dc54bed01f0e724730aa1704ae8671a3]
May 30 18:56:25 SteamBe kernel: ? __pfx_genl_parallel_done+0x10/0x10
May 30 18:56:25 SteamBe kernel: genl_rcv_msg+0x146/0x2c0
May 30 18:56:25 SteamBe kernel: ? __pfx_nl80211_dump_station+0x10/0x10 [cfg80211 fcf90004dc54bed01f0e724730aa1704ae8671a3]
May 30 18:56:25 SteamBe kernel: ? __pfx_genl_rcv_msg+0x10/0x10
May 30 18:56:25 SteamBe kernel: netlink_rcv_skb+0x5b/0x110
May 30 18:56:25 SteamBe kernel: genl_rcv+0x28/0x40
May 30 18:56:25 SteamBe kernel: netlink_unicast+0x1a1/0x290
May 30 18:56:25 SteamBe kernel: netlink_sendmsg+0x254/0x4d0
May 30 18:56:25 SteamBe kernel: sock_sendmsg+0x96/0xa0
May 30 18:56:25 SteamBe kernel: ____sys_sendmsg+0x278/0x300
May 30 18:56:25 SteamBe kernel: ? copy_msghdr_from_user+0x7d/0xc0
May 30 18:56:25 SteamBe kernel: ___sys_sendmsg+0x9a/0xe0
May 30 18:56:25 SteamBe kernel: ? __fget_light+0x99/0x100
May 30 18:56:25 SteamBe kernel: __sys_sendmsg+0x7a/0xd0
May 30 18:56:25 SteamBe kernel: do_syscall_64+0x60/0x90
May 30 18:56:25 SteamBe kernel: ? syscall_exit_to_user_mode+0x26/0x40
May 30 18:56:25 SteamBe kernel: ? srso_return_thunk+0x5/0x10
May 30 18:56:25 SteamBe kernel: ? do_syscall_64+0x6c/0x90
May 30 18:56:25 SteamBe kernel: ? srso_return_thunk+0x5/0x10
May 30 18:56:25 SteamBe kernel: ? do_syscall_64+0x6c/0x90
May 30 18:56:25 SteamBe kernel: ? srso_return_thunk+0x5/0x10
May 30 18:56:25 SteamBe kernel: ? srso_return_thunk+0x5/0x10
May 30 18:56:25 SteamBe kernel: ? srso_return_thunk+0x5/0x10
May 30 18:56:25 SteamBe kernel: ? syscall_exit_to_user_mode+0x26/0x40
May 30 18:56:25 SteamBe kernel: ? srso_return_thunk+0x5/0x10
May 30 18:56:25 SteamBe kernel: ? do_syscall_64+0x6c/0x90
May 30 18:56:25 SteamBe kernel: ? do_syscall_64+0x6c/0x90
May 30 18:56:25 SteamBe kernel: ? __irq_exit_rcu+0x46/0xc0
May 30 18:56:25 SteamBe kernel: ? srso_return_thunk+0x5/0x10
May 30 18:56:25 SteamBe kernel: entry_SYSCALL_64_after_hwframe+0x6e/0xd8
May 30 18:56:25 SteamBe kernel: RIP: 0033:0x7f719b293e6d
May 30 18:56:25 SteamBe kernel: Code: 28 89 54 24 1c 48 89 74 24 10 89 7c 24 08 e8 2a c9 f7 ff 8b 54 24 1c 48 8b 74 24 10 41 89 c0 8b 7c 24 08 b8 2e 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 33 44 89 c7 48 89 44 24 08 e8 7e c9 f7 ff 48
May 30 18:56:25 SteamBe kernel: RSP: 002b:00007ffe3712c6a0 EFLAGS: 00000293 ORIG_RAX: 000000000000002e
May 30 18:56:25 SteamBe kernel: RAX: ffffffffffffffda RBX: 0000561b21172fb0 RCX: 00007f719b293e6d
May 30 18:56:25 SteamBe kernel: RDX: 0000000000000000 RSI: 00007ffe3712c6e0 RDI: 000000000000000b
May 30 18:56:25 SteamBe kernel: RBP: 00007ffe3712c770 R08: 0000000000000000 R09: 0000000000000001
May 30 18:56:25 SteamBe kernel: R10: 0000000000000003 R11: 0000000000000293 R12: 0000561b2105cc60
May 30 18:56:25 SteamBe kernel: R13: 0000561b21172fb0 R14: 00007ffe3712c9bc R15: 0000561b21037b70
May 30 18:56:25 SteamBe kernel: </TASK>
May 30 18:56:25 SteamBe kernel: ---[ end trace 0000000000000000 ]---
好巧不巧,我们在排查此问题的过程中,发现Kernel社区邮件列表里面已经有此问题的相关patch,并且状态是Accepted。那这不就是得来全不费工夫嘛,我们直接应用相关patch即可(具体patch内容我们这里就不做更多的解释,一看便知):
[2/2] wifi: cfg80211: handle 2x996 RU allocation in cfg80211_calculate_bitrate_he() - Patchwork
以前在社区邮件列表找到patch,我们都是通过网页直接下载,本着学习的态度,我们多尝试其他方法。这里介绍下pwclientrc这个工具的使用方法。
Pwclient安装和使用指导
Pwclient is the command-line client for Patchwork. Currently, it provides access to some read-only features of Patchwork, such as downloading and applying patches. The pwclient program: GitHub - getpatchwork/pwclient: The command-line client for the patchwork patch tracking tool
1. 安装相关依赖
在安装pwclient之前,需要先安装相关依赖。此示例是基于Ubuntu 18.04的环境。
1.1 安装"python"
sudo apt install python3
Note: 这里最好使用python3.8以上的版本,因为使用"importlib_metadata"模块。因为这个模块在Python 3.8及更高版本中是内置的,但对于Python 2.7和早期的Python 3版本,需要手动安装。
1.2 安装"pip3"
sudo apt install python3-pip
1.3 安装"importlib_metadata"
pip3 install importlib_metadata
2. 安装"pwclient"
git clone https://github.com/getpatchwork/patchwork
cd patchwork
sudo python setup.py install
3. 配置"pwclient"
pwclient需要一个配置文件来指定Patchwork服务器和项目。你可以在~/.pwclientrc文件中配置,例如:
[options]
default=linux-wireless[linux-wireless]
backend = xmlrpc
url = https://patchwork.kernel.org/xmlrpc/
4. 使用"pwclient"
4.1 检索补丁
xx@q-PowerEdge-R740xd:~$ pwclient search "cfg80211: handle 2x996 RU allocation in cfg80211_calculate_bitrate_he()"
ID State Name
-- ----- ----
13687774 Accepted [2/2] wifi: cfg80211: handle 2x996 RU allocation in cfg80211_calculate_bitrate_he()
4.2 获取补丁
pwclient get <patch id>
xx@q-PowerEdge-R740xd:~$ pwclient get 13687774
Saved patch to 2-2-wifi-cfg80211-handle-2x996-RU-allocation-in-cfg80211_calculate_bitrate_he.patch
4.3 应用补丁
git am xx.patch