From 9146af24071356334bef635e9871d8844bf2265c Mon Sep 17 00:00:00 2001 From: Shobek Attupurath Date: Fri, 18 Jul 2025 23:12:45 +0000 Subject: [PATCH] rtl8852ce: Add driver v126-1 to fix kernel panic Fix kernel panic observed in rtl8852ce driver [ 179.040508] Call trace: [ 179.040512] rtw_fsm_stop+0x138/0x174 [rtl8852ce] [ 179.040592] rtw_fsm_notify_disconnect+0x50/0x60 [rtl8852ce][ 179.040672] rtw_free_assoc_resources+0x128/0x330 [rtl8852ce] [ 179.040751] rtw_indicate_disconnect+0x4cc/0x984 [rtl8852ce] [ 179.040831] rtw_indicate_disconnect+0x978/0x984 [rtl8852ce] [ 179.040910] cur_req_hdl+0x3c/0x4c [rtl8852ce] [ 179.040988] msg_dispatch+0x2dc/0x3f8 [rtl8852ce][ 179.041067] dispr_thread_loop_hdl+0x270/0x2dc [rtl8852ce] [ 179.041146] dispr_share_thread_loop_hdl+0x10/0x1c [rtl8852ce] [ 179.041225] share_thread_hdl+0xb8/0x1a0 [rtl8852ce] [ 179.041305] kthread+0x110/0x124 [ 179.041325] ret_from_fork+0x10/0x20[ 179.041348] Code: f9400273 eb16027f 540000c0 b4ffff15 (f9402e60) [ 179.041353] ---[ end trace 0000000000000000 ]--- Bug 5207091 Change-Id: I22d153c0ef970efad888fcce668d0d19e95f4e17 Signed-off-by: Shobek Attupurath Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3415007 Reviewed-by: Bibek Basu --- .../net/wireless/realtek/rtl8852ce/Makefile | 42 +++-------- .../net/wireless/realtek/rtl8852ce/common.mk | 2 +- .../wireless/realtek/rtl8852ce/core/rtw_fsm.c | 72 +++++++++++++++++-- .../realtek/rtl8852ce/core/rtw_mlme.c | 4 +- .../realtek/rtl8852ce/include/rtw_version.h | 2 +- .../realtek/rtl8852ce/phl/hal_g6/btc/btc.mk | 4 +- .../realtek/rtl8852ce/phl/hal_g6/hal.mk | 4 +- .../realtek/rtl8852ce/phl/hal_g6/mac/mac.mk | 4 +- .../realtek/rtl8852ce/phl/hal_g6/phy/bb/bb.mk | 4 +- .../realtek/rtl8852ce/phl/hal_g6/phy/rf/rf.mk | 4 +- .../net/wireless/realtek/rtl8852ce/phl/phl.mk | 4 +- .../realtek/rtl8852ce/phl/phl_cmd_scan.c | 4 +- .../realtek/rtl8852ce/phl/phl_git_info.h | 6 +- 13 files changed, 96 insertions(+), 60 deletions(-) diff --git a/drivers/net/wireless/realtek/rtl8852ce/Makefile b/drivers/net/wireless/realtek/rtl8852ce/Makefile index 42c00833..3aab93ba 100644 --- a/drivers/net/wireless/realtek/rtl8852ce/Makefile +++ b/drivers/net/wireless/realtek/rtl8852ce/Makefile @@ -14,9 +14,6 @@ EXTRA_CFLAGS += -Wno-unused-label #EXTRA_CFLAGS += -Wno-unused-function EXTRA_CFLAGS += -Wno-unused #EXTRA_CFLAGS += -Wno-uninitialized -EXTRA_CFLAGS += -Wno-missing-prototypes -EXTRA_CFLAGS += -Wno-missing-declarations -EXTRA_CFLAGS += -Wno-enum-conversion ############ ANDROID COMMON KERNEL ############ # clang @@ -38,8 +35,7 @@ ifeq ($(GCC_VER_49),1) EXTRA_CFLAGS += -Wno-date-time # Fix compile error && warning on gcc 4.9 and later endif -SOURCETREE = $(srctree.nvidia-oot)/drivers/net/wireless/realtek/rtl8852ce -EXTRA_CFLAGS += -I$(SOURCETREE)/include +EXTRA_CFLAGS += -I$(src)/include EXTRA_LDFLAGS += --strip-debug @@ -165,8 +161,8 @@ endif CONFIG_RTW_DEBUG = y # default log level is _DRV_INFO_ = 4, # please refer to "How_to_set_driver_debug_log_level.doc" to set the available level. -CONFIG_RTW_LOG_LEVEL = 0 -CONFIG_RTW_PHL_LOG_LEVEL = 0 +CONFIG_RTW_LOG_LEVEL = 4 +CONFIG_RTW_PHL_LOG_LEVEL = 3 # CONFIG_RTW_APPEND_LOGLEVEL decide if append kernel log level to each messages. # default "n" for don't append. @@ -242,8 +238,7 @@ CONFIG_ROAMING_FLAG = 0x3f CONFIG_ROAM_SCAN_ORDER = 526 ###################### Platform Related ####################### -CONFIG_PLATFORM_TEGRA = y -CONFIG_PLATFORM_I386_PC = n +CONFIG_PLATFORM_I386_PC = y CONFIG_PLATFORM_RTL8198D = n CONFIG_PLATFORM_ANDROID_X86 = n CONFIG_PLATFORM_ANDROID_INTEL_X86 = n @@ -773,16 +768,6 @@ ifeq ($(CONFIG_DBG_AX_CAM), y) EXTRA_CFLAGS += -DCONFIG_DBG_AX_CAM endif -ifeq ($(CONFIG_PLATFORM_TEGRA), y) -ARCH = arm64 -KVER := $(shell uname -r) -KSRC := /lib/modules/$(KVER)/build -EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT -EXTRA_CFLAGS += -Wno-error=date-time -MODULE_NAME = rtl8852ce -endif - ifeq ($(CONFIG_I386_BUILD_VERIFY), y) EXTRA_CFLAGS += -DCONFIG_I386_BUILD_VERIFY endif @@ -799,18 +784,8 @@ endif include $(wildcard $(DRV_PATH)/platform/*.mk) # Import platform specific compile options -EXTRA_CFLAGS += -I$(SOURCETREE)/platform +EXTRA_CFLAGS += -I$(src)/platform #_PLATFORM_FILES := platform/platform_ops.o -ifeq ($(CONFIG_PCI_HCI), y) -EXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS -_PLATFORM_FILES := platform/platform_linux_pc_pci.o -OBJS += $(_PLATFORM_FILES) -# Core Config -CONFIG_MSG_NUM = 128 -EXTRA_CFLAGS += -DCONFIG_MSG_NUM=$(CONFIG_MSG_NUM) -#EXTRA_CFLAGS += -DCONFIG_TX_SKB_ORPHAN -endif -_PLATFORM_FILES += platform/platform_ops.o OBJS += $(_PLATFORM_FILES) ########### CUSTOMER ################################ @@ -830,7 +805,7 @@ endif ifneq ($(KERNELRELEASE),) ########### COMMON ################################# -include $(SOURCETREE)/common.mk +include $(src)/common.mk EXTRA_CFLAGS += -DPHL_PLATFORM_LINUX EXTRA_CFLAGS += -DCONFIG_PHL_ARCH @@ -851,10 +826,11 @@ ifeq ($(DIRTY_FOR_WORK), y) EXTRA_CFLAGS += -DDIRTY_FOR_WORK endif -include $(SOURCETREE)/phl/phl.mk +include $(src)/phl/phl.mk -obj-m := $(MODULE_NAME).o +obj-$(CONFIG_RTL8852CE) := $(MODULE_NAME).o +obj-$(CONFIG_RTL8852CE) := $(MODULE_NAME).o $(MODULE_NAME)-y = $(OBJS) ############# MEMORY MANAGMENT ############# diff --git a/drivers/net/wireless/realtek/rtl8852ce/common.mk b/drivers/net/wireless/realtek/rtl8852ce/common.mk index f6eb419e..b5cf5649 100644 --- a/drivers/net/wireless/realtek/rtl8852ce/common.mk +++ b/drivers/net/wireless/realtek/rtl8852ce/common.mk @@ -99,7 +99,7 @@ _CORE_FILES := core/rtw_fsm.o \ _CORE_FILES += core/rtw_phl.o \ core/rtw_phl_cmd.o -EXTRA_CFLAGS += -I$(SOURCETREE)/core/crypto +EXTRA_CFLAGS += -I$(src)/core/crypto _CORE_FILES += core/crypto/aes-internal.o \ core/crypto/aes-internal-enc.o \ core/crypto/aes-gcm.o \ diff --git a/drivers/net/wireless/realtek/rtl8852ce/core/rtw_fsm.c b/drivers/net/wireless/realtek/rtl8852ce/core/rtw_fsm.c index d80b8646..1e98db8a 100644 --- a/drivers/net/wireless/realtek/rtl8852ce/core/rtw_fsm.c +++ b/drivers/net/wireless/realtek/rtl8852ce/core/rtw_fsm.c @@ -21,6 +21,7 @@ /* #define USE_PHL_CMD_DISPR */ +#define MAX_OBJ_NUM 8 #define CLOCK_NUM 3 #define CLOCK_UNIT 10 #define IS_CLK_OFF(clk) (clk->remain < 0) /* Negative value means disabled */ @@ -1582,22 +1583,81 @@ msg_fail: return _FAIL; } +static void fsm_ucast_msg(struct fsm_priv *fsmpriv, + struct sta_info *psta, char *pbuf, u32 sz, u16 event) +{ + struct fsm_root *root = fsmpriv->root; + struct fsm_main *fsm; + struct fsm_obj *obj; + struct fsm_obj *obj_ary[MAX_OBJ_NUM]; + int i, obj_num = 0; + + if (!psta) + return; + + memset(obj_ary, 0, sizeof(obj_ary)); + + list_for_each_entry(fsm, &root->q_share_thd.q, list) { + if (fsm_status(fsm) != FSM_STATUS_ENABLE) + continue; + + _rtw_spinlock_bh(&fsm->obj_queue.lock); + list_for_each_entry(obj, &fsm->obj_queue.q, list) { + if (obj->psta == psta) { + obj_ary[obj_num++] = obj; + if (obj_num > MAX_OBJ_NUM) { + FSM_WARN_(obj->fsm, "obj num exceed, event %04x(%s)\n", + event, fsm_evt_name(obj->fsm, event)); + _rtw_spinunlock_bh(&fsm->obj_queue.lock); + goto done; + } + } + } + _rtw_spinunlock_bh(&fsm->obj_queue.lock); + } +done: + for (i = 0; i < obj_num; i++) + fsm_gen_msg(obj_ary[i], pbuf, sz, event); +} + +#if 0 static void fsm_bcast_msg(struct fsm_priv *fsmpriv, struct sta_info *psta, char *pbuf, u32 sz, u16 event) { struct fsm_root *root = fsmpriv->root; struct fsm_main *fsm; struct fsm_obj *obj; + struct fsm_obj *obj_ary[MAX_OBJ_NUM]; + int i, obj_num = 0; + + if (!psta) + return; + + memset(obj_ary, 0, sizeof(obj_ary)); list_for_each_entry(fsm, &root->q_share_thd.q, list) { if (fsm_status(fsm) != FSM_STATUS_ENABLE) continue; + + _rtw_spinlock_bh(&fsm->obj_queue.lock); list_for_each_entry(obj, &fsm->obj_queue.q, list) { if (!psta || (psta && obj->psta == psta)) - fsm_gen_msg(obj, pbuf, sz, event); + obj_ary[obj_num++] = obj; + if (obj_num > MAX_OBJ_NUM) { + FSM_WARN_(obj->fsm, "obj num exceed, event %04x(%s)\n", + event, fsm_evt_name(obj->fsm, event)); + _rtw_spinunlock_bh(&fsm->obj_queue.lock); + goto done; + } + } } + _rtw_spinunlock_bh(&fsm->obj_queue.lock); } +done: + for (i = 0; i < obj_num; i++) + fsm_gen_msg(obj_ary[i], pbuf, sz, event); } +#endif void rtw_fsm_notify_connect(struct fsm_priv *fsmpriv, struct sta_info *psta, int res) { @@ -1606,9 +1666,9 @@ void rtw_fsm_notify_connect(struct fsm_priv *fsmpriv, struct sta_info *psta, int pself = rtw_get_stainfo(&a->stapriv, a->phl_role->mac_addr); if (res >= 0) /* success */ - fsm_bcast_msg(fsmpriv, pself, (char *)psta, 0, FSM_EV_CONNECTED); + fsm_ucast_msg(fsmpriv, pself, (char *)psta, 0, FSM_EV_CONNECTED); else - fsm_bcast_msg(fsmpriv, pself, (char *)psta, 0, FSM_EV_CONNECT_FAIL); + fsm_ucast_msg(fsmpriv, pself, (char *)psta, 0, FSM_EV_CONNECT_FAIL); } void rtw_fsm_notify_disconnect(struct fsm_priv *fsmpriv, struct sta_info *psta) @@ -1618,17 +1678,17 @@ void rtw_fsm_notify_disconnect(struct fsm_priv *fsmpriv, struct sta_info *psta) pself = rtw_get_stainfo(&a->stapriv, a->phl_role->mac_addr); if (pself) - fsm_bcast_msg(fsmpriv, psta, (char *)pself, 0, FSM_EV_DISCONNECTED); + fsm_ucast_msg(fsmpriv, psta, (char *)pself, 0, FSM_EV_DISCONNECTED); } void rtw_fsm_notify_scan_start(struct fsm_priv *fsmpriv, struct sta_info *psta) { - fsm_bcast_msg(fsmpriv, psta, NULL, 0, FSM_EV_SCAN_START); + fsm_ucast_msg(fsmpriv, psta, NULL, 0, FSM_EV_SCAN_START); } void rtw_fsm_notify_scan_done(struct fsm_priv *fsmpriv, struct sta_info *psta) { - fsm_bcast_msg(fsmpriv, psta, NULL, 0, FSM_EV_SCAN_DONE); + fsm_ucast_msg(fsmpriv, psta, NULL, 0, FSM_EV_SCAN_DONE); } /** Debug funcitons diff --git a/drivers/net/wireless/realtek/rtl8852ce/core/rtw_mlme.c b/drivers/net/wireless/realtek/rtl8852ce/core/rtw_mlme.c index 07ceae31..dc224097 100644 --- a/drivers/net/wireless/realtek/rtl8852ce/core/rtw_mlme.c +++ b/drivers/net/wireless/realtek/rtl8852ce/core/rtw_mlme.c @@ -177,8 +177,8 @@ sint _rtw_init_mlme_priv(_adapter *padapter) #else #define RTW_ROAM_SCAN_RESULT_EXP_MS (10*1000) #endif -#define RTW_ROAM_SCAN_INTERVAL (2) /* 5*(2 second)*/ -#define RTW_ROAM_RSSI_THRESHOLD 45 +#define RTW_ROAM_SCAN_INTERVAL (5) /* 5*(2 second)*/ +#define RTW_ROAM_RSSI_THRESHOLD 30 #define RTW_ROAM_RSSI_IDLE_TH RTW_ROAM_RSSI_THRESHOLD #define RTW_ROAM_RSSI_BUSY_TH RTW_ROAM_RSSI_THRESHOLD + 5 diff --git a/drivers/net/wireless/realtek/rtl8852ce/include/rtw_version.h b/drivers/net/wireless/realtek/rtl8852ce/include/rtw_version.h index 2df9d7cf..c63e51a7 100644 --- a/drivers/net/wireless/realtek/rtl8852ce/include/rtw_version.h +++ b/drivers/net/wireless/realtek/rtl8852ce/include/rtw_version.h @@ -1 +1 @@ -#define DRIVERVERSION "v1.19.16_nv-126-g455ab52c9.20241107_Certified_Module" +#define DRIVERVERSION "v1.19.16_nv-126-1-g1b567deb3.20250716_Certified_Module" diff --git a/drivers/net/wireless/realtek/rtl8852ce/phl/hal_g6/btc/btc.mk b/drivers/net/wireless/realtek/rtl8852ce/phl/hal_g6/btc/btc.mk index cd107811..918b129f 100644 --- a/drivers/net/wireless/realtek/rtl8852ce/phl/hal_g6/btc/btc.mk +++ b/drivers/net/wireless/realtek/rtl8852ce/phl/hal_g6/btc/btc.mk @@ -7,10 +7,10 @@ ifeq ($(CONFIG_PHL_ARCH), y) phl_path := phl/$(HAL) -phl_path_d1 := $(SOURCETREE)/phl/$(HAL) +phl_path_d1 := $(src)/phl/$(HAL) else phl_path := $(HAL) -phl_path_d1 := $(SOURCETREE)/$(HAL) +phl_path_d1 := $(src)/$(HAL) endif # Base directory diff --git a/drivers/net/wireless/realtek/rtl8852ce/phl/hal_g6/hal.mk b/drivers/net/wireless/realtek/rtl8852ce/phl/hal_g6/hal.mk index 073d84e0..8660c88d 100644 --- a/drivers/net/wireless/realtek/rtl8852ce/phl/hal_g6/hal.mk +++ b/drivers/net/wireless/realtek/rtl8852ce/phl/hal_g6/hal.mk @@ -2,10 +2,10 @@ ifeq ($(CONFIG_PHL_ARCH), y) phl_path := phl/ -phl_path_d1 := $(SOURCETREE)/phl/$(HAL) +phl_path_d1 := $(src)/phl/$(HAL) else phl_path := -phl_path_d1 := $(SOURCETREE)/$(HAL) +phl_path_d1 := $(src)/$(HAL) endif _HAL_FILES := $(phl_path)$(HAL)/hal_api_mac.o \ diff --git a/drivers/net/wireless/realtek/rtl8852ce/phl/hal_g6/mac/mac.mk b/drivers/net/wireless/realtek/rtl8852ce/phl/hal_g6/mac/mac.mk index ad635a48..6342c487 100644 --- a/drivers/net/wireless/realtek/rtl8852ce/phl/hal_g6/mac/mac.mk +++ b/drivers/net/wireless/realtek/rtl8852ce/phl/hal_g6/mac/mac.mk @@ -7,10 +7,10 @@ HAL = hal_g6 ifeq ($(CONFIG_PHL_ARCH), y) phl_path := phl/hal_g6 -phl_path_d1 := $(SOURCETREE)/phl/$(HAL) +phl_path_d1 := $(src)/phl/$(HAL) else phl_path := hal_g6 -phl_path_d1 := $(SOURCETREE)/$(HAL) +phl_path_d1 := $(src)/$(HAL) endif # Base directory diff --git a/drivers/net/wireless/realtek/rtl8852ce/phl/hal_g6/phy/bb/bb.mk b/drivers/net/wireless/realtek/rtl8852ce/phl/hal_g6/phy/bb/bb.mk index 02785e87..a1273e96 100644 --- a/drivers/net/wireless/realtek/rtl8852ce/phl/hal_g6/phy/bb/bb.mk +++ b/drivers/net/wireless/realtek/rtl8852ce/phl/hal_g6/phy/bb/bb.mk @@ -7,10 +7,10 @@ ifeq ($(CONFIG_PHL_ARCH), y) phl_path := phl/$(HAL) -phl_path_d1 := $(SOURCETREE)/phl/$(HAL) +phl_path_d1 := $(src)/phl/$(HAL) else phl_path := $(HAL) -phl_path_d1 := $(SOURCETREE)/$(HAL) +phl_path_d1 := $(src)/$(HAL) endif # Base directory diff --git a/drivers/net/wireless/realtek/rtl8852ce/phl/hal_g6/phy/rf/rf.mk b/drivers/net/wireless/realtek/rtl8852ce/phl/hal_g6/phy/rf/rf.mk index 21dd2569..717e176e 100644 --- a/drivers/net/wireless/realtek/rtl8852ce/phl/hal_g6/phy/rf/rf.mk +++ b/drivers/net/wireless/realtek/rtl8852ce/phl/hal_g6/phy/rf/rf.mk @@ -7,10 +7,10 @@ ifeq ($(CONFIG_PHL_ARCH), y) phl_path := phl/$(HAL) -phl_path_d1 := $(SOURCETREE)/phl/$(HAL) +phl_path_d1 := $(src)/phl/$(HAL) else phl_path := $(HAL) -phl_path_d1 := $(SOURCETREE)/$(HAL) +phl_path_d1 := $(src)/$(HAL) endif # Base directory diff --git a/drivers/net/wireless/realtek/rtl8852ce/phl/phl.mk b/drivers/net/wireless/realtek/rtl8852ce/phl/phl.mk index aa31e68d..20c1368c 100644 --- a/drivers/net/wireless/realtek/rtl8852ce/phl/phl.mk +++ b/drivers/net/wireless/realtek/rtl8852ce/phl/phl.mk @@ -11,10 +11,10 @@ endif ifeq ($(CONFIG_PHL_ARCH), y) phl_path := phl/ -phl_path_d1 := $(SOURCETREE)/phl/$(HAL) +phl_path_d1 := $(src)/phl/$(HAL) else phl_path := -phl_path_d1 := $(SOURCETREE)/$(HAL) +phl_path_d1 := $(src)/$(HAL) endif _PHL_FILES := $(phl_path)phl_init.o \ diff --git a/drivers/net/wireless/realtek/rtl8852ce/phl/phl_cmd_scan.c b/drivers/net/wireless/realtek/rtl8852ce/phl/phl_cmd_scan.c index 22004d5d..33c54617 100644 --- a/drivers/net/wireless/realtek/rtl8852ce/phl/phl_cmd_scan.c +++ b/drivers/net/wireless/realtek/rtl8852ce/phl/phl_cmd_scan.c @@ -343,12 +343,12 @@ next_ch: goto next_ch; } else { - PHL_INFO("%s: scan done\n", __func__); + printk("%s: scan done\n", __func__); return NULL; } param->done_num = param->ch_num - sctrl->chlist.cnt; - PHL_INFO("%s:[%d] idx=%d, r=%d, ch=%d, p=%d\n", __func__, + printk("%s:[%d] idx=%d, r=%d, ch=%d, p=%d\n", __func__, band_idx, sctrl->ch_idx, sctrl->chlist.cnt, sctrl->scan_ch->channel, phl_get_passing_time_ms(param->start_time)); diff --git a/drivers/net/wireless/realtek/rtl8852ce/phl/phl_git_info.h b/drivers/net/wireless/realtek/rtl8852ce/phl/phl_git_info.h index 663d6808..62cb6d5f 100644 --- a/drivers/net/wireless/realtek/rtl8852ce/phl/phl_git_info.h +++ b/drivers/net/wireless/realtek/rtl8852ce/phl/phl_git_info.h @@ -26,16 +26,16 @@ #define __PHL_GIT_INFO_H__ /*@--------------------------[Define] ---------------------------------------*/ -#define RTK_CORE_SHA1 "455ab52c9370743897f9a49005601e716c23ea73" +#define RTK_CORE_SHA1 "1b567deb317b6f9c4afa584602c34212ac1be727" #define RTK_PHL_SHA1 "cb718610a2b894e972b2c1179b4c24775480605e" #define RTK_HALMAC_SHA1 "a8003e258e7ceec767c2e329732e7e3b63934473" #define RTK_HALBB_SHA1 "8f07cd65ef4ef6867255f3a95706e417c8d31bf3" #define RTK_HALRF_SHA1 "01c1864e02ade0c1d1482c85d6bb0fa0f4799651" #define RTK_BTC_SHA1 "33bcdb9f10f24aa8b92ee86a7076f89faf6ccbed" -#define RTK_CORE_TAGINFO "v1.19.16_nv-126-g455ab52c9" +#define RTK_CORE_TAGINFO "v1.19.16_nv-126-1-g1b567deb3" #define RTK_PHL_TAGINFO "PHL_1_19_111_0100-86-gcb718610a" -#define RTK_HALMAC_TAGINFO "HALMAC_0_29_95_0-1-ga8003e258" +#define RTK_HALMAC_TAGINFO "HALMAC_0_29_95_0-1-ga8003e258e" #define RTK_HALBB_TAGINFO "HALBB_029_167_15-2-g8f07cd65" #define RTK_HALRF_TAGINFO "HALRF_029_00_161_HOTFIX_001-0-g01c1864e" #define RTK_BTC_TAGINFO "HALBTC_029_087-8-g33bcdb9"