Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

rtw88: 8821c: fix access const table of channel parameters

We would like to make chip_info table const, but 8821c uses one field as
a variable, and causes core dump. To fix this, move the field to another
struct that can be read and written.

BUG: unable to handle page fault for address: ffffffffc09f52f4
PGD 5b5215067 P4D 5b5215067 PUD 5b5217067 PMD 111f61067 PTE 8000000111e07161
Oops: 0003 [#1] PREEMPT SMP NOPTI
CPU: 6 PID: 436 Comm: NetworkManager Not tainted 5.18.0-rc7-debug-01822-g89d8f53ff6e7 #1 5cac31ca93432e53341863abfb3332fd98b144da
Hardware name: HP HP Desktop M01-F1xxx/87D6, BIOS F.12 12/17/2020
RIP: 0010:rtw8821c_phy_set_param+0x262/0x380 [rtw88_8821c]
Code: e8 53 f3 c0 d6 48 8b 43 10 4c 8b 63 38 be 24 0a 00 00 48 89 df 48
8b 40 68 e8 3a f3 c0 d6 89 e9 be 28 0a 00 00 48 89 df d3 e8 <41> 89 84
24 54 01 00 00 48 8b 43 10 4c 8b 63 38 48 8b 40 68 e8 15
RSP: 0018:ffffb08c417cb6f0 EFLAGS: 00010286
RAX: 0000000064b80c1c RBX: ffff93d15a0120e0 RCX: 0000000000000000
RDX: 0000000034028211 RSI: 0000000000000a28 RDI: ffff93d15a0120e0
RBP: 0000000000000000 R08: 0000000000000000 R09: 0000000000000000
R10: 0000000000000001 R11: 0000000000000006 R12: ffffffffc09f51a0
R13: ffff93d15a0156d0 R14: 0000000000000000 R15: 0000000000000001
FS: 00007f4e9b73d1c0(0000) GS:ffff93d83ab80000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: ffffffffc09f52f4 CR3: 0000000103b9e000 CR4: 0000000000350ee0
Call Trace:
<TASK>
rtw_core_start+0xbd/0x190 [rtw88_core de79d6bdfd083d102030858972032e5706726279]
rtw_ops_start+0x26/0x40 [rtw88_core de79d6bdfd083d102030858972032e5706726279]
drv_start+0x42/0x100 [mac80211 21e803d0ad10691f64c6c81ecc24c0c6c36e5d58]
ieee80211_do_open+0x2fb/0x900 [mac80211 21e803d0ad10691f64c6c81ecc24c0c6c36e5d58]
ieee80211_open+0x67/0x80 [mac80211 21e803d0ad10691f64c6c81ecc24c0c6c36e5d58]
__dev_open+0xdd/0x180
[...]

Fixes: 89d8f53ff6e7 ("wifi: rtw88: Fix Sparse warning for rtw8821c_hw_spec")
Reported-by: Nathan Chancellor <nathan@kernel.org>
Cc: Larry Finger <Larry.Finger@lwfinger.net>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Tested-by: Nathan Chancellor <nathan@kernel.org>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20220608020312.9663-1-pkshih@realtek.com

authored by

Ping-Ke Shih and committed by
Kalle Valo
90f4b549 bf56a091

+11 -9
+3 -3
drivers/net/wireless/realtek/rtw88/main.h
··· 1233 1233 const struct wiphy_wowlan_support *wowlan_stub; 1234 1234 const u8 max_sched_scan_ssids; 1235 1235 1236 - /* for 8821c set channel */ 1237 - u32 ch_param[3]; 1238 - 1239 1236 /* coex paras */ 1240 1237 u32 coex_para_ver; 1241 1238 u8 bt_desired_ver; ··· 1934 1937 1935 1938 enum rtw_sar_bands sar_band; 1936 1939 struct rtw_sar sar; 1940 + 1941 + /* for 8821c set channel */ 1942 + u32 ch_param[3]; 1937 1943 }; 1938 1944 1939 1945 struct rtw_path_div {
+8 -6
drivers/net/wireless/realtek/rtw88/rtw8821c.c
··· 125 125 126 126 static void rtw8821c_phy_set_param(struct rtw_dev *rtwdev) 127 127 { 128 + struct rtw_hal *hal = &rtwdev->hal; 128 129 u8 crystal_cap, val; 129 130 130 131 /* power on BB/RF domain */ ··· 160 159 161 160 /* post init after header files config */ 162 161 rtw_write32_set(rtwdev, REG_RXPSEL, BIT_RX_PSEL_RST); 163 - rtwdev->chip->ch_param[0] = rtw_read32_mask(rtwdev, REG_TXSF2, MASKDWORD); 164 - rtwdev->chip->ch_param[1] = rtw_read32_mask(rtwdev, REG_TXSF6, MASKDWORD); 165 - rtwdev->chip->ch_param[2] = rtw_read32_mask(rtwdev, REG_TXFILTER, MASKDWORD); 162 + hal->ch_param[0] = rtw_read32_mask(rtwdev, REG_TXSF2, MASKDWORD); 163 + hal->ch_param[1] = rtw_read32_mask(rtwdev, REG_TXSF6, MASKDWORD); 164 + hal->ch_param[2] = rtw_read32_mask(rtwdev, REG_TXFILTER, MASKDWORD); 166 165 167 166 rtw_phy_init(rtwdev); 168 167 rtwdev->dm_info.cck_pd_default = rtw_read8(rtwdev, REG_CSRATIO) & 0x1f; ··· 352 351 static void rtw8821c_set_channel_bb(struct rtw_dev *rtwdev, u8 channel, u8 bw, 353 352 u8 primary_ch_idx) 354 353 { 354 + struct rtw_hal *hal = &rtwdev->hal; 355 355 u32 val32; 356 356 357 357 if (channel <= 14) { ··· 369 367 rtw_write32_mask(rtwdev, REG_TXFILTER, MASKDWORD, 0x00003667); 370 368 } else { 371 369 rtw_write32_mask(rtwdev, REG_TXSF2, MASKDWORD, 372 - rtwdev->chip->ch_param[0]); 370 + hal->ch_param[0]); 373 371 rtw_write32_mask(rtwdev, REG_TXSF6, MASKLWORD, 374 - rtwdev->chip->ch_param[1] & MASKLWORD); 372 + hal->ch_param[1] & MASKLWORD); 375 373 rtw_write32_mask(rtwdev, REG_TXFILTER, MASKDWORD, 376 - rtwdev->chip->ch_param[2]); 374 + hal->ch_param[2]); 377 375 } 378 376 } else if (channel > 35) { 379 377 rtw_write32_mask(rtwdev, REG_ENTXCCK, BIT(18), 0x1);