Loading drivers/net/wireless/cnss2/debug.c +3 −0 Original line number Diff line number Diff line Loading @@ -131,6 +131,9 @@ static int cnss_stats_show_state(struct seq_file *s, case CNSS_IN_REBOOT: seq_puts(s, "IN_REBOOT"); continue; case CNSS_QMI_DEL_SERVER: seq_puts(s, "DEL_SERVER_IN_PROGRESS"); continue; } seq_printf(s, "UNKNOWN-%d", i); Loading drivers/net/wireless/cnss2/main.h +1 −0 Original line number Diff line number Diff line Loading @@ -239,6 +239,7 @@ enum cnss_driver_state { CNSS_IMS_CONNECTED, CNSS_IN_SUSPEND_RESUME, CNSS_IN_REBOOT, CNSS_QMI_DEL_SERVER, }; struct cnss_recovery_data { Loading drivers/net/wireless/cnss2/pci.c +3 −0 Original line number Diff line number Diff line Loading @@ -4465,12 +4465,14 @@ static void cnss_mhi_notify_status(struct mhi_controller *mhi_ctrl, void *priv, case MHI_CB_EE_MISSION_MODE: return; case MHI_CB_FATAL_ERROR: cnss_ignore_qmi_failure(true); set_bit(CNSS_DEV_ERR_NOTIFY, &plat_priv->driver_state); del_timer(&plat_priv->fw_boot_timer); cnss_pci_update_status(pci_priv, CNSS_FW_DOWN); cnss_reason = CNSS_REASON_DEFAULT; break; case MHI_CB_SYS_ERROR: cnss_ignore_qmi_failure(true); set_bit(CNSS_DEV_ERR_NOTIFY, &plat_priv->driver_state); del_timer(&plat_priv->fw_boot_timer); mod_timer(&pci_priv->dev_rddm_timer, Loading @@ -4478,6 +4480,7 @@ static void cnss_mhi_notify_status(struct mhi_controller *mhi_ctrl, void *priv, cnss_pci_update_status(pci_priv, CNSS_FW_DOWN); return; case MHI_CB_EE_RDDM: cnss_ignore_qmi_failure(true); set_bit(CNSS_DEV_ERR_NOTIFY, &plat_priv->driver_state); del_timer(&plat_priv->fw_boot_timer); del_timer(&pci_priv->dev_rddm_timer); Loading drivers/net/wireless/cnss2/qmi.c +54 −9 Original line number Diff line number Diff line Loading @@ -30,6 +30,18 @@ #define QMI_WLFW_MAC_READY_TIMEOUT_MS 50 #define QMI_WLFW_MAC_READY_MAX_RETRY 200 #ifdef CONFIG_CNSS2_DEBUG static bool ignore_qmi_failure; #define CNSS_QMI_ASSERT() CNSS_ASSERT(ignore_qmi_failure) void cnss_ignore_qmi_failure(bool ignore) { ignore_qmi_failure = ignore; } #else #define CNSS_QMI_ASSERT() do { } while (0) void cnss_ignore_qmi_failure(bool ignore) { } #endif static char *cnss_qmi_mode_to_str(enum cnss_driver_mode mode) { switch (mode) { Loading Loading @@ -142,7 +154,7 @@ static int cnss_wlfw_ind_register_send_sync(struct cnss_plat_data *plat_priv) return 0; out: CNSS_ASSERT(0); CNSS_QMI_ASSERT(); qmi_registered: kfree(req); Loading Loading @@ -262,7 +274,7 @@ static int cnss_wlfw_host_cap_send_sync(struct cnss_plat_data *plat_priv) return 0; out: CNSS_ASSERT(0); CNSS_QMI_ASSERT(); kfree(req); kfree(resp); return ret; Loading Loading @@ -351,7 +363,7 @@ int cnss_wlfw_respond_mem_send_sync(struct cnss_plat_data *plat_priv) return 0; out: CNSS_ASSERT(0); CNSS_QMI_ASSERT(); kfree(req); kfree(resp); return ret; Loading Loading @@ -463,7 +475,7 @@ int cnss_wlfw_tgt_cap_send_sync(struct cnss_plat_data *plat_priv) return 0; out: CNSS_ASSERT(0); CNSS_QMI_ASSERT(); kfree(req); kfree(resp); return ret; Loading Loading @@ -643,7 +655,8 @@ int cnss_wlfw_bdf_dnld_send_sync(struct cnss_plat_data *plat_priv, release_firmware(fw_entry); err_req_fw: if (bdf_type != CNSS_BDF_REGDB) CNSS_ASSERT(0); CNSS_QMI_ASSERT(); kfree(req); kfree(resp); return ret; Loading Loading @@ -720,7 +733,7 @@ int cnss_wlfw_m3_dnld_send_sync(struct cnss_plat_data *plat_priv) return 0; out: CNSS_ASSERT(0); CNSS_QMI_ASSERT(); kfree(req); kfree(resp); return ret; Loading Loading @@ -931,7 +944,7 @@ int cnss_wlfw_wlan_mode_send_sync(struct cnss_plat_data *plat_priv, cnss_pr_dbg("WLFW service is disconnected while sending mode off request\n"); ret = 0; } else { CNSS_ASSERT(0); CNSS_QMI_ASSERT(); } kfree(req); kfree(resp); Loading Loading @@ -1041,7 +1054,7 @@ int cnss_wlfw_wlan_cfg_send_sync(struct cnss_plat_data *plat_priv, return 0; out: CNSS_ASSERT(0); CNSS_QMI_ASSERT(); kfree(req); kfree(resp); return ret; Loading Loading @@ -2099,7 +2112,7 @@ static int cnss_wlfw_connect_to_server(struct cnss_plat_data *plat_priv, return 0; out: CNSS_ASSERT(0); CNSS_QMI_ASSERT(); kfree(data); return ret; } Loading @@ -2116,6 +2129,8 @@ int cnss_wlfw_server_arrive(struct cnss_plat_data *plat_priv, void *data) return -EINVAL; } cnss_ignore_qmi_failure(false); ret = cnss_wlfw_connect_to_server(plat_priv, data); if (ret < 0) goto out; Loading @@ -2139,6 +2154,8 @@ int cnss_wlfw_server_arrive(struct cnss_plat_data *plat_priv, void *data) int cnss_wlfw_server_exit(struct cnss_plat_data *plat_priv) { int ret; if (!plat_priv) return -ENODEV; Loading @@ -2147,6 +2164,15 @@ int cnss_wlfw_server_exit(struct cnss_plat_data *plat_priv) cnss_pr_info("QMI WLFW service disconnected, state: 0x%lx\n", plat_priv->driver_state); cnss_qmi_deinit(plat_priv); clear_bit(CNSS_QMI_DEL_SERVER, &plat_priv->driver_state); ret = cnss_qmi_init(plat_priv); if (ret < 0) { cnss_pr_err("QMI WLFW service registraton failed, ret\n", ret); CNSS_ASSERT(0); } return 0; } Loading @@ -2157,6 +2183,13 @@ static int wlfw_new_server(struct qmi_handle *qmi_wlfw, container_of(qmi_wlfw, struct cnss_plat_data, qmi_wlfw); struct cnss_qmi_event_server_arrive_data *event_data; if (plat_priv && test_bit(CNSS_QMI_DEL_SERVER, &plat_priv->driver_state)) { cnss_pr_info("WLFW server delete in progress, Ignore server arrive, state: 0x%lx\n", plat_priv->driver_state); return 0; } cnss_pr_dbg("WLFW server arriving: node %u port %u\n", service->node, service->port); Loading @@ -2179,8 +2212,20 @@ static void wlfw_del_server(struct qmi_handle *qmi_wlfw, struct cnss_plat_data *plat_priv = container_of(qmi_wlfw, struct cnss_plat_data, qmi_wlfw); if (plat_priv && test_bit(CNSS_QMI_DEL_SERVER, &plat_priv->driver_state)) { cnss_pr_info("WLFW server delete in progress, Ignore server delete, state: 0x%lx\n", plat_priv->driver_state); return; } cnss_pr_dbg("WLFW server exiting\n"); if (plat_priv) { cnss_ignore_qmi_failure(true); set_bit(CNSS_QMI_DEL_SERVER, &plat_priv->driver_state); } cnss_driver_event_post(plat_priv, CNSS_DRIVER_EVENT_SERVER_EXIT, 0, NULL); } Loading drivers/net/wireless/cnss2/qmi.h +2 −0 Original line number Diff line number Diff line Loading @@ -70,6 +70,7 @@ int coex_antenna_switch_to_mdm_send_sync_msg(struct cnss_plat_data *plat_priv); int cnss_wlfw_qdss_trace_mem_info_send_sync(struct cnss_plat_data *plat_priv); int cnss_register_ims_service(struct cnss_plat_data *plat_priv); void cnss_unregister_ims_service(struct cnss_plat_data *plat_priv); void cnss_ignore_qmi_failure(bool ignore); #else #define QMI_WLFW_TIMEOUT_MS 10000 Loading Loading @@ -224,6 +225,7 @@ int cnss_register_ims_service(struct cnss_plat_data *plat_priv) static inline void cnss_unregister_ims_service(struct cnss_plat_data *plat_priv) {} void cnss_ignore_qmi_failure(bool ignore) {}; #endif /* CONFIG_CNSS2_QMI */ #endif /* _CNSS_QMI_H */ Loading
drivers/net/wireless/cnss2/debug.c +3 −0 Original line number Diff line number Diff line Loading @@ -131,6 +131,9 @@ static int cnss_stats_show_state(struct seq_file *s, case CNSS_IN_REBOOT: seq_puts(s, "IN_REBOOT"); continue; case CNSS_QMI_DEL_SERVER: seq_puts(s, "DEL_SERVER_IN_PROGRESS"); continue; } seq_printf(s, "UNKNOWN-%d", i); Loading
drivers/net/wireless/cnss2/main.h +1 −0 Original line number Diff line number Diff line Loading @@ -239,6 +239,7 @@ enum cnss_driver_state { CNSS_IMS_CONNECTED, CNSS_IN_SUSPEND_RESUME, CNSS_IN_REBOOT, CNSS_QMI_DEL_SERVER, }; struct cnss_recovery_data { Loading
drivers/net/wireless/cnss2/pci.c +3 −0 Original line number Diff line number Diff line Loading @@ -4465,12 +4465,14 @@ static void cnss_mhi_notify_status(struct mhi_controller *mhi_ctrl, void *priv, case MHI_CB_EE_MISSION_MODE: return; case MHI_CB_FATAL_ERROR: cnss_ignore_qmi_failure(true); set_bit(CNSS_DEV_ERR_NOTIFY, &plat_priv->driver_state); del_timer(&plat_priv->fw_boot_timer); cnss_pci_update_status(pci_priv, CNSS_FW_DOWN); cnss_reason = CNSS_REASON_DEFAULT; break; case MHI_CB_SYS_ERROR: cnss_ignore_qmi_failure(true); set_bit(CNSS_DEV_ERR_NOTIFY, &plat_priv->driver_state); del_timer(&plat_priv->fw_boot_timer); mod_timer(&pci_priv->dev_rddm_timer, Loading @@ -4478,6 +4480,7 @@ static void cnss_mhi_notify_status(struct mhi_controller *mhi_ctrl, void *priv, cnss_pci_update_status(pci_priv, CNSS_FW_DOWN); return; case MHI_CB_EE_RDDM: cnss_ignore_qmi_failure(true); set_bit(CNSS_DEV_ERR_NOTIFY, &plat_priv->driver_state); del_timer(&plat_priv->fw_boot_timer); del_timer(&pci_priv->dev_rddm_timer); Loading
drivers/net/wireless/cnss2/qmi.c +54 −9 Original line number Diff line number Diff line Loading @@ -30,6 +30,18 @@ #define QMI_WLFW_MAC_READY_TIMEOUT_MS 50 #define QMI_WLFW_MAC_READY_MAX_RETRY 200 #ifdef CONFIG_CNSS2_DEBUG static bool ignore_qmi_failure; #define CNSS_QMI_ASSERT() CNSS_ASSERT(ignore_qmi_failure) void cnss_ignore_qmi_failure(bool ignore) { ignore_qmi_failure = ignore; } #else #define CNSS_QMI_ASSERT() do { } while (0) void cnss_ignore_qmi_failure(bool ignore) { } #endif static char *cnss_qmi_mode_to_str(enum cnss_driver_mode mode) { switch (mode) { Loading Loading @@ -142,7 +154,7 @@ static int cnss_wlfw_ind_register_send_sync(struct cnss_plat_data *plat_priv) return 0; out: CNSS_ASSERT(0); CNSS_QMI_ASSERT(); qmi_registered: kfree(req); Loading Loading @@ -262,7 +274,7 @@ static int cnss_wlfw_host_cap_send_sync(struct cnss_plat_data *plat_priv) return 0; out: CNSS_ASSERT(0); CNSS_QMI_ASSERT(); kfree(req); kfree(resp); return ret; Loading Loading @@ -351,7 +363,7 @@ int cnss_wlfw_respond_mem_send_sync(struct cnss_plat_data *plat_priv) return 0; out: CNSS_ASSERT(0); CNSS_QMI_ASSERT(); kfree(req); kfree(resp); return ret; Loading Loading @@ -463,7 +475,7 @@ int cnss_wlfw_tgt_cap_send_sync(struct cnss_plat_data *plat_priv) return 0; out: CNSS_ASSERT(0); CNSS_QMI_ASSERT(); kfree(req); kfree(resp); return ret; Loading Loading @@ -643,7 +655,8 @@ int cnss_wlfw_bdf_dnld_send_sync(struct cnss_plat_data *plat_priv, release_firmware(fw_entry); err_req_fw: if (bdf_type != CNSS_BDF_REGDB) CNSS_ASSERT(0); CNSS_QMI_ASSERT(); kfree(req); kfree(resp); return ret; Loading Loading @@ -720,7 +733,7 @@ int cnss_wlfw_m3_dnld_send_sync(struct cnss_plat_data *plat_priv) return 0; out: CNSS_ASSERT(0); CNSS_QMI_ASSERT(); kfree(req); kfree(resp); return ret; Loading Loading @@ -931,7 +944,7 @@ int cnss_wlfw_wlan_mode_send_sync(struct cnss_plat_data *plat_priv, cnss_pr_dbg("WLFW service is disconnected while sending mode off request\n"); ret = 0; } else { CNSS_ASSERT(0); CNSS_QMI_ASSERT(); } kfree(req); kfree(resp); Loading Loading @@ -1041,7 +1054,7 @@ int cnss_wlfw_wlan_cfg_send_sync(struct cnss_plat_data *plat_priv, return 0; out: CNSS_ASSERT(0); CNSS_QMI_ASSERT(); kfree(req); kfree(resp); return ret; Loading Loading @@ -2099,7 +2112,7 @@ static int cnss_wlfw_connect_to_server(struct cnss_plat_data *plat_priv, return 0; out: CNSS_ASSERT(0); CNSS_QMI_ASSERT(); kfree(data); return ret; } Loading @@ -2116,6 +2129,8 @@ int cnss_wlfw_server_arrive(struct cnss_plat_data *plat_priv, void *data) return -EINVAL; } cnss_ignore_qmi_failure(false); ret = cnss_wlfw_connect_to_server(plat_priv, data); if (ret < 0) goto out; Loading @@ -2139,6 +2154,8 @@ int cnss_wlfw_server_arrive(struct cnss_plat_data *plat_priv, void *data) int cnss_wlfw_server_exit(struct cnss_plat_data *plat_priv) { int ret; if (!plat_priv) return -ENODEV; Loading @@ -2147,6 +2164,15 @@ int cnss_wlfw_server_exit(struct cnss_plat_data *plat_priv) cnss_pr_info("QMI WLFW service disconnected, state: 0x%lx\n", plat_priv->driver_state); cnss_qmi_deinit(plat_priv); clear_bit(CNSS_QMI_DEL_SERVER, &plat_priv->driver_state); ret = cnss_qmi_init(plat_priv); if (ret < 0) { cnss_pr_err("QMI WLFW service registraton failed, ret\n", ret); CNSS_ASSERT(0); } return 0; } Loading @@ -2157,6 +2183,13 @@ static int wlfw_new_server(struct qmi_handle *qmi_wlfw, container_of(qmi_wlfw, struct cnss_plat_data, qmi_wlfw); struct cnss_qmi_event_server_arrive_data *event_data; if (plat_priv && test_bit(CNSS_QMI_DEL_SERVER, &plat_priv->driver_state)) { cnss_pr_info("WLFW server delete in progress, Ignore server arrive, state: 0x%lx\n", plat_priv->driver_state); return 0; } cnss_pr_dbg("WLFW server arriving: node %u port %u\n", service->node, service->port); Loading @@ -2179,8 +2212,20 @@ static void wlfw_del_server(struct qmi_handle *qmi_wlfw, struct cnss_plat_data *plat_priv = container_of(qmi_wlfw, struct cnss_plat_data, qmi_wlfw); if (plat_priv && test_bit(CNSS_QMI_DEL_SERVER, &plat_priv->driver_state)) { cnss_pr_info("WLFW server delete in progress, Ignore server delete, state: 0x%lx\n", plat_priv->driver_state); return; } cnss_pr_dbg("WLFW server exiting\n"); if (plat_priv) { cnss_ignore_qmi_failure(true); set_bit(CNSS_QMI_DEL_SERVER, &plat_priv->driver_state); } cnss_driver_event_post(plat_priv, CNSS_DRIVER_EVENT_SERVER_EXIT, 0, NULL); } Loading
drivers/net/wireless/cnss2/qmi.h +2 −0 Original line number Diff line number Diff line Loading @@ -70,6 +70,7 @@ int coex_antenna_switch_to_mdm_send_sync_msg(struct cnss_plat_data *plat_priv); int cnss_wlfw_qdss_trace_mem_info_send_sync(struct cnss_plat_data *plat_priv); int cnss_register_ims_service(struct cnss_plat_data *plat_priv); void cnss_unregister_ims_service(struct cnss_plat_data *plat_priv); void cnss_ignore_qmi_failure(bool ignore); #else #define QMI_WLFW_TIMEOUT_MS 10000 Loading Loading @@ -224,6 +225,7 @@ int cnss_register_ims_service(struct cnss_plat_data *plat_priv) static inline void cnss_unregister_ims_service(struct cnss_plat_data *plat_priv) {} void cnss_ignore_qmi_failure(bool ignore) {}; #endif /* CONFIG_CNSS2_QMI */ #endif /* _CNSS_QMI_H */