Wifi stuck at lower bitrate

Hello fellow endeavourers!

I recently realized that my low internet speeds were not due to an outdated modem but my computer being locked at a lower bitrate. Currently using a Gen 3 Rogers Xfinity modem, so definitely not a modem issue.

Ookla speedtest on phone and macbook gives around 200-400 mb/s (we are maxed at 500 mb/s), while speedtest on my HP Victus Laptop gives about 20 mb/s. Tried to debug with an LLM, but of course none of them as insightful as you guys. Some info that will be helpful:

$ uname -a
Linux <hiding> 7.0.10-arch1-1 #1 SMP PREEMPT_DYNAMIC Sat, 23 May 2026 14:21:20 +0000 x86_64 GNU/Linux
$ lspci -knn | grep -A 3 -i network
pcilib: Error reading /sys/bus/pci/devices/0000:00:08.3/label: Operation not permitted
04:00.0 Network controller [0280]: Realtek Semiconductor Co., Ltd. RTL8852BE PCIe 802.11ax Wireless Network Controller [10ec:b852]
	DeviceName: WLAN Realtek Cava2 8852BE Wi-Fi 6 +BT 5.3 WW
	Subsystem: Hewlett-Packard Company Device [103c:88e3]
	Kernel driver in use: rtw89_8852be

$ iw dev wlo1 link
Connected to 12:36:aa:05:cf:1a (on wlo1)
	SSID: <hiding>
	freq: 5220.0
	RX: 25201114 bytes (31216 packets)
	TX: 4491047 bytes (16089 packets)
	signal: -44 dBm
	rx bitrate: 54.0 MBit/s
	tx bitrate: 54.0 MBit/s
	bss flags: short-slot-time
	dtim period: 1
	beacon int: 100
$ iw list | head -n 100
Wiphy phy1
	wiphy index: 1
	max # scan SSIDs: 8
	max scan IEs length: 394 bytes
	max # sched scan SSIDs: 8
	max # match sets: 0
	Retry short limit: 7
	Retry long limit: 4
	Coverage class: 0 (up to 0m)
	Device supports AP-side u-APSD.
	Device supports T-DLS.
	Supported Ciphers:
		* WEP40 (00-0f-ac:1)
		* WEP104 (00-0f-ac:5)
		* TKIP (00-0f-ac:2)
		* CCMP-128 (00-0f-ac:4)
		* CCMP-256 (00-0f-ac:10)
		* GCMP-128 (00-0f-ac:8)
		* GCMP-256 (00-0f-ac:9)
		* CMAC (00-0f-ac:6)
		* CMAC-256 (00-0f-ac:13)
		* GMAC-128 (00-0f-ac:11)
		* GMAC-256 (00-0f-ac:12)
	Available Antennas: TX 0x3 RX 0x3
	Configured Antennas: TX 0 RX 0
	Supported interface modes:
		 * managed
		 * AP
		 * AP/VLAN
		 * monitor
		 * P2P-client
		 * P2P-GO
	Band 1:
		Capabilities: 0x19ef
			RX LDPC
			HT20/HT40
			SM Power Save disabled
			RX HT20 SGI
			RX HT40 SGI
			TX STBC
			RX STBC 1-stream
			Max AMSDU length: 7935 bytes
			DSSS/CCK HT40
		Maximum RX AMPDU length 65535 bytes (exponent: 0x003)
		Minimum RX AMPDU time spacing: No restriction (0x00)
		HT Max RX data rate: 300 Mbps
		HT TX/RX MCS rate indexes supported: 0-15, 32
		HE Iftypes: managed
			HE MAC Capabilities (0x0801100a8060):
				+HTC HE Supported
				Trigger Frame MAC Padding Duration: 2
				All Ack
				BSR
				Maximum A-MPDU Length Exponent: 2
				OPS
				A-MSDU in A-MPDU
			HE PHY Capabilities: (0x02701e1f0dc0270e91bd00):
				HE40/2.4GHz
				Device Class: 1
				LDPC Coding in Payload
				HE SU PPDU with 1x HE-LTF and 0.8us GI
				NDP with 4x HE-LTF and 3.2us GI
				STBC Tx <= 80MHz
				STBC Rx <= 80MHz
				Doppler Tx
				DCM Max Constellation: 3
				DCM Max NSS Tx: 1
				DCM Max Constellation Rx: 3
				SU Beamformee
				Beamformee STS <= 80MHz: 3
				Ng = 16 SU Feedback
				Ng = 16 MU Feedback
				Codebook Size SU Feedback
				Codebook Size MU Feedback
				Triggered SU Beamforming Feedback
				Partial Bandwidth Extended Range
				Power Boost Factor ar
				HE SU PPDU & HE PPDU 4x HE-LTF 0.8us GI
				Max NC: 1
				HE ER SU PPDU 4x HE-LTF 0.8us GI
				HE ER SU PPDU 1x HE-LTF 0.8us GI
				DCM Max BW: 2
				Longer Than 16HE SIG-B OFDM Symbols
				TX 1024-QAM
				RX 1024-QAM
				RX Full BW SU Using HE MU PPDU with Compression SIGB
				RX Full BW SU Using HE MU PPDU with Non-Compression SIGB
			HE RX MCS and NSS set <= 80 MHz
				1 streams: MCS 0-11
				2 streams: MCS 0-11
				3 streams: not supported
				4 streams: not supported
				5 streams: not supported
				6 streams: not supported
				7 streams: not supported
				8 streams: not supported
			HE TX MCS and NSS set <= 80 MHz
				1 streams: MCS 0-11
				2 streams: MCS 0-11
				3 streams: not supported

$ sudo iw reg get
global
country 00: DFS-UNSET
	(2402 - 2472 @ 40), (6, 20), (N/A)
	(2457 - 2482 @ 20), (6, 20), (N/A), AUTO-BW, PASSIVE-SCAN
	(2474 - 2494 @ 20), (6, 20), (N/A), NO-OFDM, PASSIVE-SCAN
	(5170 - 5250 @ 80), (6, 20), (N/A), AUTO-BW, PASSIVE-SCAN
	(5250 - 5330 @ 80), (6, 20), (0 ms), DFS, AUTO-BW, PASSIVE-SCAN
	(5490 - 5730 @ 160), (6, 20), (0 ms), DFS, PASSIVE-SCAN
	(5735 - 5835 @ 80), (6, 20), (N/A), PASSIVE-SCAN
	(57240 - 63720 @ 2160), (N/A, 0), (N/A)

$ sudo dmesg | grep -iE 'rtw89|8852be' | tail -n 80
[    7.017041] rtw89_8852be 0000:04:00.0: loaded firmware rtw89/rtw8852b_fw-1.bin
[    7.017139] rtw89_8852be 0000:04:00.0: enabling device (0000 -> 0003)
[    7.024128] rtw89_8852be 0000:04:00.0: Firmware version 0.29.29.15 (6fb3ec41), cmd version 0, type 5
[    7.024132] rtw89_8852be 0000:04:00.0: Firmware version 0.29.29.15 (6fb3ec41), cmd version 0, type 3
[    7.338753] rtw89_8852be 0000:04:00.0: chip info CID: 0, CV: 1, AID: 0, ACV: 1, RFE: 1
[    7.932354] rtw89_8852be 0000:04:00.0: rfkill hardware state changed to enable
[    8.516899] rtw89_8852be 0000:04:00.0 wlo1: renamed from wlan0
[  463.797417] rtw89_8852be 0000:04:00.0: loaded firmware rtw89/rtw8852b_fw-1.bin
[  463.820159] rtw89_8852be 0000:04:00.0: Firmware version 0.29.29.15 (6fb3ec41), cmd version 0, type 5
[  463.820171] rtw89_8852be 0000:04:00.0: Firmware version 0.29.29.15 (6fb3ec41), cmd version 0, type 3
[  464.247857] rtw89_8852be 0000:04:00.0: chip info CID: 0, CV: 1, AID: 0, ACV: 1, RFE: 1
[  464.256467] rtw89_8852be 0000:04:00.0: rfkill hardware state changed to enable
[  464.265925] rtw89_8852be 0000:04:00.0 wlo1: renamed from wlan0

Please let me know if any additional info is missing! As you can see seems to be locked at 54 mb/s. Any help will be greatly appreciated!

Edit: Already tried disabling power saving with iw dev wlo1 set power_save off

Check your /etc/conf.d/wireless-regdom to be sure your country is not commented out. It looks to me as if you’re set up only for the lowest-common-denominator defaults.

With my country (US) uncommented, my sudo iw reg get looks like this and I get full speed:

sudo iw reg get
global
country US: DFS-FCC
(902 - 904 @ 2), (N/A, 30), (N/A)
(904 - 920 @ 16), (N/A, 30), (N/A)
(920 - 928 @ 8), (N/A, 30), (N/A)
(2400 - 2472 @ 40), (N/A, 30), (N/A)
(5150 - 5250 @ 80), (N/A, 23), (N/A), AUTO-BW
(5250 - 5350 @ 80), (N/A, 24), (0 ms), DFS, AUTO-BW
(5470 - 5730 @ 160), (N/A, 24), (0 ms), DFS
(5730 - 5850 @ 80), (N/A, 30), (N/A), AUTO-BW
(5850 - 5895 @ 40), (N/A, 27), (N/A), NO-OUTDOOR, AUTO-BW, PASSIVE-SCAN
(5925 - 7125 @ 320), (N/A, 12), (N/A), NO-OUTDOOR, PASSIVE-SCAN
(57240 - 71000 @ 2160), (N/A, 40), (N/A)

phy#0 (self-managed)
country US: DFS-UNSET
(2402 - 2437 @ 40), (6, 22), (N/A), AUTO-BW, NO-HT40MINUS, NO-80MHZ, NO-160MHZ
(2422 - 2462 @ 40), (6, 22), (N/A), AUTO-BW, NO-80MHZ, NO-160MHZ
(2447 - 2482 @ 40), (6, 22), (N/A), AUTO-BW, NO-HT40PLUS, NO-80MHZ, NO-160MHZ
(5170 - 5190 @ 160), (6, 22), (N/A), AUTO-BW, NO-HT40MINUS, NO-320MHZ
(5190 - 5210 @ 160), (6, 22), (N/A), AUTO-BW, NO-HT40PLUS, NO-320MHZ
(5210 - 5230 @ 160), (6, 22), (N/A), AUTO-BW, NO-HT40MINUS, NO-320MHZ
(5230 - 5250 @ 160), (6, 22), (N/A), AUTO-BW, NO-HT40PLUS, NO-320MHZ
(5250 - 5270 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40MINUS, NO-320MHZ, PASSIVE-SCAN
(5270 - 5290 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40PLUS, NO-320MHZ, PASSIVE-SCAN
(5290 - 5310 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40MINUS, NO-320MHZ, PASSIVE-SCAN
(5310 - 5330 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40PLUS, NO-320MHZ, PASSIVE-SCAN
(5490 - 5510 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40MINUS, NO-320MHZ, PASSIVE-SCAN
(5510 - 5530 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40PLUS, NO-320MHZ, PASSIVE-SCAN
(5530 - 5550 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40MINUS, NO-320MHZ, PASSIVE-SCAN
(5550 - 5570 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40PLUS, NO-320MHZ, PASSIVE-SCAN
(5570 - 5590 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40MINUS, NO-320MHZ, PASSIVE-SCAN
(5590 - 5610 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40PLUS, NO-320MHZ, PASSIVE-SCAN
(5610 - 5630 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40MINUS, NO-320MHZ, PASSIVE-SCAN
(5630 - 5650 @ 160), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40PLUS, NO-320MHZ, PASSIVE-SCAN
(5650 - 5670 @ 80), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40MINUS, NO-160MHZ, NO-320MHZ, PASSIVE-SCAN
(5670 - 5690 @ 80), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40PLUS, NO-160MHZ, NO-320MHZ, PASSIVE-SCAN
(5690 - 5710 @ 80), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40MINUS, NO-160MHZ, NO-320MHZ, PASSIVE-SCAN
(5710 - 5730 @ 80), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40PLUS, NO-160MHZ, NO-320MHZ, PASSIVE-SCAN
(5735 - 5755 @ 80), (6, 22), (N/A), AUTO-BW, NO-HT40MINUS, NO-160MHZ, NO-320MHZ
(5755 - 5775 @ 80), (6, 22), (N/A), AUTO-BW, NO-HT40PLUS, NO-160MHZ, NO-320MHZ
(5775 - 5795 @ 80), (6, 22), (N/A), AUTO-BW, NO-HT40MINUS, NO-160MHZ, NO-320MHZ
(5795 - 5815 @ 80), (6, 22), (N/A), AUTO-BW, NO-HT40PLUS, NO-160MHZ, NO-320MHZ
(5815 - 5835 @ 20), (6, 22), (N/A), AUTO-BW, NO-HT40MINUS, NO-HT40PLUS, NO-80MHZ, NO-160MHZ, NO-320MHZ

NOTE: This is for Wi-Fi 5. WiFi 6e and 7 have even more channels.

That package wasn’t installed on my system. I installed it and unchecked the CA line, and after rebooting it looks like a blank file:

#
# Wireless regulatory domain configuration
#

#WIRELESS_REGDOM="00"
#WIRELESS_REGDOM="AD"
#WIRELESS_REGDOM="AE"
#WIRELESS_REGDOM="AF"
#WIRELESS_REGDOM="AI"
#WIRELESS_REGDOM="AL"
#WIRELESS_REGDOM="AM"
#WIRELESS_REGDOM="AN"
#WIRELESS_REGDOM="AR"
#WIRELESS_REGDOM="AS"
#WIRELESS_REGDOM="AT"
#WIRELESS_REGDOM="AU"
#WIRELESS_REGDOM="AW"
#WIRELESS_REGDOM="AZ"
#WIRELESS_REGDOM="BA"
#WIRELESS_REGDOM="BB"
#WIRELESS_REGDOM="BD"
#WIRELESS_REGDOM="BE"
#WIRELESS_REGDOM="BF"
#WIRELESS_REGDOM="BG"
#WIRELESS_REGDOM="BH"
#WIRELESS_REGDOM="BL"
#WIRELESS_REGDOM="BM"
#WIRELESS_REGDOM="BN"
#WIRELESS_REGDOM="BO"
#WIRELESS_REGDOM="BR"
#WIRELESS_REGDOM="BS"
#WIRELESS_REGDOM="BT"
#WIRELESS_REGDOM="BW"
#WIRELESS_REGDOM="BY"
#WIRELESS_REGDOM="BZ"
WIRELESS_REGDOM="CA"
#WIRELESS_REGDOM="CF"
#WIRELESS_REGDOM="CH"
#WIRELESS_REGDOM="CI"
#WIRELESS_REGDOM="CL"
#WIRELESS_REGDOM="CN"
#WIRELESS_REGDOM="CO"
#WIRELESS_REGDOM="CR"
#WIRELESS_REGDOM="CU"
#WIRELESS_REGDOM="CX"
#WIRELESS_REGDOM="CY"
#WIRELESS_REGDOM="CZ"
#WIRELESS_REGDOM="DE"
#WIRELESS_REGDOM="DK"
#WIRELESS_REGDOM="DM"
#WIRELESS_REGDOM="DO"
#WIRELESS_REGDOM="DZ"
#WIRELESS_REGDOM="EC"
#WIRELESS_REGDOM="EE"
#WIRELESS_REGDOM="EG"
#WIRELESS_REGDOM="ES"
#WIRELESS_REGDOM="ET"
#WIRELESS_REGDOM="FI"
#WIRELESS_REGDOM="FM"
#WIRELESS_REGDOM="FR"
#WIRELESS_REGDOM="GB"
#WIRELESS_REGDOM="GD"
#WIRELESS_REGDOM="GE"
#WIRELESS_REGDOM="GF"
#WIRELESS_REGDOM="GH"
#WIRELESS_REGDOM="GL"
#WIRELESS_REGDOM="GP"
#WIRELESS_REGDOM="GR"
#WIRELESS_REGDOM="GT"
#WIRELESS_REGDOM="GU"
#WIRELESS_REGDOM="GY"
#WIRELESS_REGDOM="HK"
#WIRELESS_REGDOM="HN"
#WIRELESS_REGDOM="HR"
#WIRELESS_REGDOM="HT"
#WIRELESS_REGDOM="HU"
#WIRELESS_REGDOM="ID"
#WIRELESS_REGDOM="IE"
#WIRELESS_REGDOM="IL"
#WIRELESS_REGDOM="IN"
#WIRELESS_REGDOM="IR"
#WIRELESS_REGDOM="IS"
#WIRELESS_REGDOM="IT"
#WIRELESS_REGDOM="JM"
#WIRELESS_REGDOM="JO"
#WIRELESS_REGDOM="JP"
#WIRELESS_REGDOM="KE"
#WIRELESS_REGDOM="KH"
#WIRELESS_REGDOM="KN"
#WIRELESS_REGDOM="KP"
#WIRELESS_REGDOM="KR"
#WIRELESS_REGDOM="KW"
#WIRELESS_REGDOM="KY"
#WIRELESS_REGDOM="KZ"
#WIRELESS_REGDOM="LB"
#WIRELESS_REGDOM="LC"
#WIRELESS_REGDOM="LI"
#WIRELESS_REGDOM="LK"
#WIRELESS_REGDOM="LS"
#WIRELESS_REGDOM="LT"
#WIRELESS_REGDOM="LU"
#WIRELESS_REGDOM="LV"
#WIRELESS_REGDOM="MA"
#WIRELESS_REGDOM="MC"
#WIRELESS_REGDOM="MD"
#WIRELESS_REGDOM="ME"
#WIRELESS_REGDOM="MF"
#WIRELESS_REGDOM="MH"
#WIRELESS_REGDOM="MK"
#WIRELESS_REGDOM="MN"
#WIRELESS_REGDOM="MO"
#WIRELESS_REGDOM="MP"
#WIRELESS_REGDOM="MQ"
#WIRELESS_REGDOM="MR"
#WIRELESS_REGDOM="MT"
#WIRELESS_REGDOM="MU"
#WIRELESS_REGDOM="MV"
#WIRELESS_REGDOM="MW"
#WIRELESS_REGDOM="MX"
#WIRELESS_REGDOM="MY"
#WIRELESS_REGDOM="NA"
#WIRELESS_REGDOM="NG"
#WIRELESS_REGDOM="NI"
#WIRELESS_REGDOM="NL"
#WIRELESS_REGDOM="NO"
#WIRELESS_REGDOM="NP"
#WIRELESS_REGDOM="NZ"
#WIRELESS_REGDOM="OM"
#WIRELESS_REGDOM="PA"
#WIRELESS_REGDOM="PE"
#WIRELESS_REGDOM="PF"
#WIRELESS_REGDOM="PG"
#WIRELESS_REGDOM="PH"
#WIRELESS_REGDOM="PK"
#WIRELESS_REGDOM="PL"
#WIRELESS_REGDOM="PM"
#WIRELESS_REGDOM="PR"
#WIRELESS_REGDOM="PT"
#WIRELESS_REGDOM="PW"
#WIRELESS_REGDOM="PY"
#WIRELESS_REGDOM="QA"
#WIRELESS_REGDOM="RE"
#WIRELESS_REGDOM="RO"
#WIRELESS_REGDOM="RS"
#WIRELESS_REGDOM="RU"
#WIRELESS_REGDOM="RW"
#WIRELESS_REGDOM="SA"
#WIRELESS_REGDOM="SE"
#WIRELESS_REGDOM="SG"
#WIRELESS_REGDOM="SI"
#WIRELESS_REGDOM="SK"
#WIRELESS_REGDOM="SN"
#WIRELESS_REGDOM="SR"
#WIRELESS_REGDOM="SV"
#WIRELESS_REGDOM="SX"
#WIRELESS_REGDOM="SY"
#WIRELESS_REGDOM="TC"
#WIRELESS_REGDOM="TD"
#WIRELESS_REGDOM="TG"
#WIRELESS_REGDOM="TH"
#WIRELESS_REGDOM="TN"
#WIRELESS_REGDOM="TR"
#WIRELESS_REGDOM="TT"
#WIRELESS_REGDOM="TW"
#WIRELESS_REGDOM="TZ"
#WIRELESS_REGDOM="UA"
#WIRELESS_REGDOM="UG"
#WIRELESS_REGDOM="US"
#WIRELESS_REGDOM="UY"
#WIRELESS_REGDOM="UZ"
#WIRELESS_REGDOM="VC"
#WIRELESS_REGDOM="VE"
#WIRELESS_REGDOM="VI"
#WIRELESS_REGDOM="VN"
#WIRELESS_REGDOM="VU"
#WIRELESS_REGDOM="WF"
#WIRELESS_REGDOM="WS"
#WIRELESS_REGDOM="YE"
#WIRELESS_REGDOM="YT"
#WIRELESS_REGDOM="ZA"
#WIRELESS_REGDOM="ZW"

Did sudo iw reg set CA to make sure

This is working though (is missing a block compared to yours):

$ sudo iw reg get
global
country CA: DFS-FCC
	(2400 - 2483 @ 40), (N/A, 36), (N/A)
	(5150 - 5250 @ 80), (N/A, 23), (N/A), NO-OUTDOOR, AUTO-BW
	(5250 - 5350 @ 80), (N/A, 26), (0 ms), DFS, AUTO-BW
	(5470 - 5730 @ 160), (N/A, 26), (0 ms), DFS
	(5730 - 5850 @ 80), (N/A, 36), (N/A), AUTO-BW
	(5850 - 5895 @ 40), (N/A, 27), (N/A), AUTO-BW
	(5925 - 7125 @ 320), (N/A, 12), (N/A), NO-OUTDOOR


But still stuck at 54

$ iw dev wlo1 link
Connected to 12:36:aa:05:cf:1a (on wlo1)
	SSID: <>
	freq: 5220.0
	RX: 17874276 bytes (17288 packets)
	TX: 2916140 bytes (12251 packets)
	signal: -46 dBm
	rx bitrate: 54.0 MBit/s
	tx bitrate: 54.0 MBit/s
	bss flags: short-slot-time
	dtim period: 1
	beacon int: 100

I found a solution! The problem came from a firmware update to Rogers and other modems causing my laptop to fall back to 802.11a stuck at 54 mb/s. Doing this easy fix from GitHub completely fixed it and I’m getting full internet speeds!