Loading arch/arm64/configs/vendor/lahaina_QGKI.config +1 −0 Original line number Diff line number Diff line Loading @@ -168,6 +168,7 @@ CONFIG_SLIMBUS_MSM_NGD=m CONFIG_QCOM_KGSL=y CONFIG_QCOM_KGSL_CONTEXT_DEBUG=y CONFIG_QCOM_QFPROM=y CONFIG_ICNSS2_RESTART_LEVEL_NOTIF=y CONFIG_ARM_QCOM_CPUFREQ_HW=y CONFIG_NETFILTER_XT_TARGET_TEE=y CONFIG_NETFILTER_XT_TARGET_NOTRACK=y Loading drivers/net/wireless/cnss_utils/wlan_firmware_service_v01.c +69 −0 Original line number Diff line number Diff line Loading @@ -1765,6 +1765,26 @@ struct qmi_elem_info wlfw_cap_resp_msg_v01_ei[] = { dev_mem_info), .ei_array = wlfw_dev_mem_info_s_v01_ei, }, { .data_type = QMI_OPT_FLAG, .elem_len = 1, .elem_size = sizeof(u8), .array_type = NO_ARRAY, .tlv_type = 0x1D, .offset = offsetof(struct wlfw_cap_resp_msg_v01, foundry_name_valid), }, { .data_type = QMI_STRING, .elem_len = QMI_WLFW_MAX_STR_LEN_V01 + 1, .elem_size = sizeof(char), .array_type = NO_ARRAY, .tlv_type = 0x1D, .offset = offsetof(struct wlfw_cap_resp_msg_v01, foundry_name), }, { .data_type = QMI_EOTI, .array_type = NO_ARRAY, Loading Loading @@ -5477,5 +5497,54 @@ struct qmi_elem_info wlfw_m3_dump_upload_segments_req_ind_msg_v01_ei[] = { }; EXPORT_SYMBOL(wlfw_m3_dump_upload_segments_req_ind_msg_v01_ei); struct qmi_elem_info wlfw_subsys_restart_level_req_msg_v01_ei[] = { { .data_type = QMI_OPT_FLAG, .elem_len = 1, .elem_size = sizeof(u8), .array_type = NO_ARRAY, .tlv_type = 0x10, .offset = offsetof(struct wlfw_subsys_restart_level_req_msg_v01, restart_level_type_valid), }, { .data_type = QMI_UNSIGNED_1_BYTE, .elem_len = 1, .elem_size = sizeof(u8), .array_type = NO_ARRAY, .tlv_type = 0x10, .offset = offsetof(struct wlfw_subsys_restart_level_req_msg_v01, restart_level_type), }, { .data_type = QMI_EOTI, .array_type = NO_ARRAY, .tlv_type = QMI_COMMON_TLV_TYPE, }, }; EXPORT_SYMBOL(wlfw_subsys_restart_level_req_msg_v01_ei); struct qmi_elem_info wlfw_subsys_restart_level_resp_msg_v01_ei[] = { { .data_type = QMI_STRUCT, .elem_len = 1, .elem_size = sizeof(struct qmi_response_type_v01), .array_type = NO_ARRAY, .tlv_type = 0x02, .offset = offsetof(struct wlfw_subsys_restart_level_resp_msg_v01, resp), .ei_array = qmi_response_type_v01_ei, }, { .data_type = QMI_EOTI, .array_type = NO_ARRAY, .tlv_type = QMI_COMMON_TLV_TYPE, }, }; EXPORT_SYMBOL(wlfw_subsys_restart_level_resp_msg_v01_ei); MODULE_LICENSE("GPL v2"); MODULE_DESCRIPTION("WLAN FW QMI service"); drivers/net/wireless/cnss_utils/wlan_firmware_service_v01.h +21 −2 Original line number Diff line number Diff line Loading @@ -9,6 +9,8 @@ #define WLFW_SERVICE_ID_V01 0x45 #define WLFW_SERVICE_VERS_V01 0x01 #define QMI_WLFW_SUBSYS_RESTART_LEVEL_RESP_V01 0x0055 #define QMI_WLFW_SUBSYS_RESTART_LEVEL_REQ_V01 0x0055 #define QMI_WLFW_POWER_SAVE_RESP_V01 0x0050 #define QMI_WLFW_CAP_REQ_V01 0x0024 #define QMI_WLFW_CAL_REPORT_REQ_V01 0x0026 Loading Loading @@ -529,8 +531,11 @@ struct wlfw_cap_resp_msg_v01 { enum wlfw_rd_card_chain_cap_v01 rd_card_chain_cap; u8 dev_mem_info_valid; struct wlfw_dev_mem_info_s_v01 dev_mem_info[QMI_WLFW_MAX_DEV_MEM_NUM_V01]; u8 foundry_name_valid; char foundry_name[QMI_WLFW_MAX_STR_LEN_V01 + 1]; }; #define WLFW_CAP_RESP_MSG_V01_MAX_MSG_LEN 320 #define WLFW_CAP_RESP_MSG_V01_MAX_MSG_LEN 339 extern struct qmi_elem_info wlfw_cap_resp_msg_v01_ei[]; struct wlfw_bdf_download_req_msg_v01 { Loading Loading @@ -805,7 +810,6 @@ struct wlfw_host_cap_req_msg_v01 { u8 wlan_enable_delay_valid; u32 wlan_enable_delay; }; #define WLFW_HOST_CAP_REQ_MSG_V01_MAX_MSG_LEN 396 extern struct qmi_elem_info wlfw_host_cap_req_msg_v01_ei[]; Loading Loading @@ -1218,4 +1222,19 @@ struct wlfw_m3_dump_upload_segments_req_ind_msg_v01 { #define WLFW_M3_DUMP_UPLOAD_SEGMENTS_REQ_IND_MSG_V01_MAX_MSG_LEN 387 extern struct qmi_elem_info wlfw_m3_dump_upload_segments_req_ind_msg_v01_ei[]; struct wlfw_subsys_restart_level_req_msg_v01 { u8 restart_level_type_valid; u8 restart_level_type; }; #define WLFW_SUBSYS_RESTART_LEVEL_REQ_MSG_V01_MAX_MSG_LEN 4 extern struct qmi_elem_info wlfw_subsys_restart_level_req_msg_v01_ei[]; struct wlfw_subsys_restart_level_resp_msg_v01 { struct qmi_response_type_v01 resp; }; #define WLFW_SUBSYS_RESTART_LEVEL_RESP_MSG_V01_MAX_MSG_LEN 7 extern struct qmi_elem_info wlfw_subsys_restart_level_resp_msg_v01_ei[]; #endif drivers/soc/qcom/icnss2/Kconfig +9 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,15 @@ config ICNSS2_QMI and configurations. It also send WLAN on/off control message to FW over QMI channel. config ICNSS2_RESTART_LEVEL_NOTIF bool "Enable Restart level change notification" depends on ICNSS2 help Say 'Y' here to enable ICNSS2_RESTART_LEVEL_NOTIF support. This will be needed to register notifier and get notification for restart_level change of WLAN Sub system. On receiving notification ICNSS2 enable/disable M3 SSR. This is only enabled for QGKI config. config CNSS_QCA6750 bool "Enable ICNSS QCA6750 chipset specific changes" depends on ICNSS2 Loading drivers/soc/qcom/icnss2/main.c +58 −0 Original line number Diff line number Diff line Loading @@ -44,6 +44,7 @@ #include <soc/qcom/ramdump.h> #include <linux/soc/qcom/smem.h> #include <linux/soc/qcom/smem_state.h> #include <trace/events/trace_msm_ssr_event.h> #include "main.h" #include "qmi.h" #include "debug.h" Loading Loading @@ -187,6 +188,8 @@ char *icnss_driver_event_to_str(enum icnss_driver_event_type type) return "M3_DUMP_UPLOAD"; case ICNSS_DRIVER_EVENT_QDSS_TRACE_REQ_DATA: return "QDSS_TRACE_REQ_DATA"; case ICNSS_DRIVER_EVENT_SUBSYS_RESTART_LEVEL: return "SUBSYS_RESTART_LEVEL"; case ICNSS_DRIVER_EVENT_MAX: return "EVENT_MAX"; } Loading Loading @@ -1085,6 +1088,25 @@ static int icnss_qdss_trace_req_data_hdlr(struct icnss_priv *priv, return ret; } static int icnss_subsys_restart_level_type(struct icnss_priv *priv, void *data) { int ret = 0; struct icnss_subsys_restart_level_data *event_data = data; if (!priv) return -ENODEV; if (!data) return -EINVAL; ret = wlfw_subsys_restart_level_msg(priv, event_data->restart_level); kfree(data); return ret; } static int icnss_event_soc_wake_request(struct icnss_priv *priv, void *data) { int ret = 0; Loading Loading @@ -1517,6 +1539,9 @@ static void icnss_driver_event_work(struct work_struct *work) ret = icnss_qdss_trace_req_data_hdlr(priv, event->data); break; case ICNSS_DRIVER_EVENT_SUBSYS_RESTART_LEVEL: ret = icnss_subsys_restart_level_type(priv, event->data); break; default: icnss_pr_err("Invalid Event type: %d", event->type); kfree(event); Loading Loading @@ -3907,6 +3932,33 @@ static inline bool icnss_use_nv_mac(struct icnss_priv *priv) "use-nv-mac"); } #ifdef CONFIG_ICNSS2_RESTART_LEVEL_NOTIF static void pil_restart_level_notifier(void *ignore, int restart_level, const char *fw) { struct icnss_subsys_restart_level_data *restart_level_data; icnss_pr_err("PIL Notifier, restart_level: %d, FW:%s", restart_level, fw); restart_level_data = kzalloc(sizeof(*restart_level_data), GFP_ATOMIC); if (!restart_level_data) return; if (!strcmp(fw, "wpss")) { if (restart_level == RESET_SUBSYS_COUPLED) restart_level_data->restart_level = ICNSS_ENABLE_M3_SSR; else restart_level_data->restart_level = ICNSS_DISABLE_M3_SSR; icnss_driver_event_post(penv, ICNSS_DRIVER_EVENT_SUBSYS_RESTART_LEVEL, 0, restart_level_data); } } #endif static int icnss_probe(struct platform_device *pdev) { int ret = 0; Loading Loading @@ -4023,6 +4075,9 @@ static int icnss_probe(struct platform_device *pdev) icnss_pr_dbg("NV MAC feature is %s\n", priv->use_nv_mac ? "Mandatory":"Not Mandatory"); INIT_WORK(&wpss_loader, icnss_wpss_load); #ifdef CONFIG_ICNSS2_RESTART_LEVEL_NOTIF register_trace_pil_restart_level(pil_restart_level_notifier, NULL); #endif } INIT_LIST_HEAD(&priv->icnss_tcdev_list); Loading Loading @@ -4054,6 +4109,9 @@ static int icnss_remove(struct platform_device *pdev) icnss_dms_deinit(priv); icnss_genl_exit(); icnss_runtime_pm_deinit(priv); #ifdef CONFIG_ICNSS2_RESTART_LEVEL_NOTIF unregister_trace_pil_restart_level(pil_restart_level_notifier, NULL); #endif } device_init_wakeup(&priv->pdev->dev, false); Loading Loading
arch/arm64/configs/vendor/lahaina_QGKI.config +1 −0 Original line number Diff line number Diff line Loading @@ -168,6 +168,7 @@ CONFIG_SLIMBUS_MSM_NGD=m CONFIG_QCOM_KGSL=y CONFIG_QCOM_KGSL_CONTEXT_DEBUG=y CONFIG_QCOM_QFPROM=y CONFIG_ICNSS2_RESTART_LEVEL_NOTIF=y CONFIG_ARM_QCOM_CPUFREQ_HW=y CONFIG_NETFILTER_XT_TARGET_TEE=y CONFIG_NETFILTER_XT_TARGET_NOTRACK=y Loading
drivers/net/wireless/cnss_utils/wlan_firmware_service_v01.c +69 −0 Original line number Diff line number Diff line Loading @@ -1765,6 +1765,26 @@ struct qmi_elem_info wlfw_cap_resp_msg_v01_ei[] = { dev_mem_info), .ei_array = wlfw_dev_mem_info_s_v01_ei, }, { .data_type = QMI_OPT_FLAG, .elem_len = 1, .elem_size = sizeof(u8), .array_type = NO_ARRAY, .tlv_type = 0x1D, .offset = offsetof(struct wlfw_cap_resp_msg_v01, foundry_name_valid), }, { .data_type = QMI_STRING, .elem_len = QMI_WLFW_MAX_STR_LEN_V01 + 1, .elem_size = sizeof(char), .array_type = NO_ARRAY, .tlv_type = 0x1D, .offset = offsetof(struct wlfw_cap_resp_msg_v01, foundry_name), }, { .data_type = QMI_EOTI, .array_type = NO_ARRAY, Loading Loading @@ -5477,5 +5497,54 @@ struct qmi_elem_info wlfw_m3_dump_upload_segments_req_ind_msg_v01_ei[] = { }; EXPORT_SYMBOL(wlfw_m3_dump_upload_segments_req_ind_msg_v01_ei); struct qmi_elem_info wlfw_subsys_restart_level_req_msg_v01_ei[] = { { .data_type = QMI_OPT_FLAG, .elem_len = 1, .elem_size = sizeof(u8), .array_type = NO_ARRAY, .tlv_type = 0x10, .offset = offsetof(struct wlfw_subsys_restart_level_req_msg_v01, restart_level_type_valid), }, { .data_type = QMI_UNSIGNED_1_BYTE, .elem_len = 1, .elem_size = sizeof(u8), .array_type = NO_ARRAY, .tlv_type = 0x10, .offset = offsetof(struct wlfw_subsys_restart_level_req_msg_v01, restart_level_type), }, { .data_type = QMI_EOTI, .array_type = NO_ARRAY, .tlv_type = QMI_COMMON_TLV_TYPE, }, }; EXPORT_SYMBOL(wlfw_subsys_restart_level_req_msg_v01_ei); struct qmi_elem_info wlfw_subsys_restart_level_resp_msg_v01_ei[] = { { .data_type = QMI_STRUCT, .elem_len = 1, .elem_size = sizeof(struct qmi_response_type_v01), .array_type = NO_ARRAY, .tlv_type = 0x02, .offset = offsetof(struct wlfw_subsys_restart_level_resp_msg_v01, resp), .ei_array = qmi_response_type_v01_ei, }, { .data_type = QMI_EOTI, .array_type = NO_ARRAY, .tlv_type = QMI_COMMON_TLV_TYPE, }, }; EXPORT_SYMBOL(wlfw_subsys_restart_level_resp_msg_v01_ei); MODULE_LICENSE("GPL v2"); MODULE_DESCRIPTION("WLAN FW QMI service");
drivers/net/wireless/cnss_utils/wlan_firmware_service_v01.h +21 −2 Original line number Diff line number Diff line Loading @@ -9,6 +9,8 @@ #define WLFW_SERVICE_ID_V01 0x45 #define WLFW_SERVICE_VERS_V01 0x01 #define QMI_WLFW_SUBSYS_RESTART_LEVEL_RESP_V01 0x0055 #define QMI_WLFW_SUBSYS_RESTART_LEVEL_REQ_V01 0x0055 #define QMI_WLFW_POWER_SAVE_RESP_V01 0x0050 #define QMI_WLFW_CAP_REQ_V01 0x0024 #define QMI_WLFW_CAL_REPORT_REQ_V01 0x0026 Loading Loading @@ -529,8 +531,11 @@ struct wlfw_cap_resp_msg_v01 { enum wlfw_rd_card_chain_cap_v01 rd_card_chain_cap; u8 dev_mem_info_valid; struct wlfw_dev_mem_info_s_v01 dev_mem_info[QMI_WLFW_MAX_DEV_MEM_NUM_V01]; u8 foundry_name_valid; char foundry_name[QMI_WLFW_MAX_STR_LEN_V01 + 1]; }; #define WLFW_CAP_RESP_MSG_V01_MAX_MSG_LEN 320 #define WLFW_CAP_RESP_MSG_V01_MAX_MSG_LEN 339 extern struct qmi_elem_info wlfw_cap_resp_msg_v01_ei[]; struct wlfw_bdf_download_req_msg_v01 { Loading Loading @@ -805,7 +810,6 @@ struct wlfw_host_cap_req_msg_v01 { u8 wlan_enable_delay_valid; u32 wlan_enable_delay; }; #define WLFW_HOST_CAP_REQ_MSG_V01_MAX_MSG_LEN 396 extern struct qmi_elem_info wlfw_host_cap_req_msg_v01_ei[]; Loading Loading @@ -1218,4 +1222,19 @@ struct wlfw_m3_dump_upload_segments_req_ind_msg_v01 { #define WLFW_M3_DUMP_UPLOAD_SEGMENTS_REQ_IND_MSG_V01_MAX_MSG_LEN 387 extern struct qmi_elem_info wlfw_m3_dump_upload_segments_req_ind_msg_v01_ei[]; struct wlfw_subsys_restart_level_req_msg_v01 { u8 restart_level_type_valid; u8 restart_level_type; }; #define WLFW_SUBSYS_RESTART_LEVEL_REQ_MSG_V01_MAX_MSG_LEN 4 extern struct qmi_elem_info wlfw_subsys_restart_level_req_msg_v01_ei[]; struct wlfw_subsys_restart_level_resp_msg_v01 { struct qmi_response_type_v01 resp; }; #define WLFW_SUBSYS_RESTART_LEVEL_RESP_MSG_V01_MAX_MSG_LEN 7 extern struct qmi_elem_info wlfw_subsys_restart_level_resp_msg_v01_ei[]; #endif
drivers/soc/qcom/icnss2/Kconfig +9 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,15 @@ config ICNSS2_QMI and configurations. It also send WLAN on/off control message to FW over QMI channel. config ICNSS2_RESTART_LEVEL_NOTIF bool "Enable Restart level change notification" depends on ICNSS2 help Say 'Y' here to enable ICNSS2_RESTART_LEVEL_NOTIF support. This will be needed to register notifier and get notification for restart_level change of WLAN Sub system. On receiving notification ICNSS2 enable/disable M3 SSR. This is only enabled for QGKI config. config CNSS_QCA6750 bool "Enable ICNSS QCA6750 chipset specific changes" depends on ICNSS2 Loading
drivers/soc/qcom/icnss2/main.c +58 −0 Original line number Diff line number Diff line Loading @@ -44,6 +44,7 @@ #include <soc/qcom/ramdump.h> #include <linux/soc/qcom/smem.h> #include <linux/soc/qcom/smem_state.h> #include <trace/events/trace_msm_ssr_event.h> #include "main.h" #include "qmi.h" #include "debug.h" Loading Loading @@ -187,6 +188,8 @@ char *icnss_driver_event_to_str(enum icnss_driver_event_type type) return "M3_DUMP_UPLOAD"; case ICNSS_DRIVER_EVENT_QDSS_TRACE_REQ_DATA: return "QDSS_TRACE_REQ_DATA"; case ICNSS_DRIVER_EVENT_SUBSYS_RESTART_LEVEL: return "SUBSYS_RESTART_LEVEL"; case ICNSS_DRIVER_EVENT_MAX: return "EVENT_MAX"; } Loading Loading @@ -1085,6 +1088,25 @@ static int icnss_qdss_trace_req_data_hdlr(struct icnss_priv *priv, return ret; } static int icnss_subsys_restart_level_type(struct icnss_priv *priv, void *data) { int ret = 0; struct icnss_subsys_restart_level_data *event_data = data; if (!priv) return -ENODEV; if (!data) return -EINVAL; ret = wlfw_subsys_restart_level_msg(priv, event_data->restart_level); kfree(data); return ret; } static int icnss_event_soc_wake_request(struct icnss_priv *priv, void *data) { int ret = 0; Loading Loading @@ -1517,6 +1539,9 @@ static void icnss_driver_event_work(struct work_struct *work) ret = icnss_qdss_trace_req_data_hdlr(priv, event->data); break; case ICNSS_DRIVER_EVENT_SUBSYS_RESTART_LEVEL: ret = icnss_subsys_restart_level_type(priv, event->data); break; default: icnss_pr_err("Invalid Event type: %d", event->type); kfree(event); Loading Loading @@ -3907,6 +3932,33 @@ static inline bool icnss_use_nv_mac(struct icnss_priv *priv) "use-nv-mac"); } #ifdef CONFIG_ICNSS2_RESTART_LEVEL_NOTIF static void pil_restart_level_notifier(void *ignore, int restart_level, const char *fw) { struct icnss_subsys_restart_level_data *restart_level_data; icnss_pr_err("PIL Notifier, restart_level: %d, FW:%s", restart_level, fw); restart_level_data = kzalloc(sizeof(*restart_level_data), GFP_ATOMIC); if (!restart_level_data) return; if (!strcmp(fw, "wpss")) { if (restart_level == RESET_SUBSYS_COUPLED) restart_level_data->restart_level = ICNSS_ENABLE_M3_SSR; else restart_level_data->restart_level = ICNSS_DISABLE_M3_SSR; icnss_driver_event_post(penv, ICNSS_DRIVER_EVENT_SUBSYS_RESTART_LEVEL, 0, restart_level_data); } } #endif static int icnss_probe(struct platform_device *pdev) { int ret = 0; Loading Loading @@ -4023,6 +4075,9 @@ static int icnss_probe(struct platform_device *pdev) icnss_pr_dbg("NV MAC feature is %s\n", priv->use_nv_mac ? "Mandatory":"Not Mandatory"); INIT_WORK(&wpss_loader, icnss_wpss_load); #ifdef CONFIG_ICNSS2_RESTART_LEVEL_NOTIF register_trace_pil_restart_level(pil_restart_level_notifier, NULL); #endif } INIT_LIST_HEAD(&priv->icnss_tcdev_list); Loading Loading @@ -4054,6 +4109,9 @@ static int icnss_remove(struct platform_device *pdev) icnss_dms_deinit(priv); icnss_genl_exit(); icnss_runtime_pm_deinit(priv); #ifdef CONFIG_ICNSS2_RESTART_LEVEL_NOTIF unregister_trace_pil_restart_level(pil_restart_level_notifier, NULL); #endif } device_init_wakeup(&priv->pdev->dev, false); Loading