Loading drivers/soc/qcom/icnss2/main.c +8 −0 Original line number Diff line number Diff line Loading @@ -2763,6 +2763,14 @@ static int icnss_pm_resume(struct device *dev) !test_bit(ICNSS_DRIVER_PROBED, &priv->state)) goto out; if (priv->device_id == WCN6750_DEVICE_ID) { ret = wlfw_exit_power_save_send_msg(priv); if (ret) { priv->stats.pm_resume_err++; return ret; } } ret = priv->ops->pm_resume(dev); out: Loading drivers/soc/qcom/icnss2/main.h +3 −0 Original line number Diff line number Diff line Loading @@ -207,6 +207,9 @@ struct icnss_stats { uint32_t device_info_req; uint32_t device_info_resp; uint32_t device_info_err; u32 exit_power_save_req; u32 exit_power_save_resp; u32 exit_power_save_err; }; #define WLFW_MAX_TIMESTAMP_LEN 32 Loading drivers/soc/qcom/icnss2/qmi.c +73 −0 Original line number Diff line number Diff line Loading @@ -340,6 +340,79 @@ int wlfw_device_info_send_msg(struct icnss_priv *priv) return ret; } int wlfw_exit_power_save_send_msg(struct icnss_priv *priv) { int ret; struct wlfw_exit_power_save_req_msg_v01 *req; struct wlfw_exit_power_save_resp_msg_v01 *resp; struct qmi_txn txn; if (!priv) return -ENODEV; if (test_bit(ICNSS_FW_DOWN, &priv->state)) return -EINVAL; icnss_pr_dbg("Sending exit power save, state: 0x%lx\n", priv->state); req = kzalloc(sizeof(*req), GFP_KERNEL); if (!req) return -ENOMEM; resp = kzalloc(sizeof(*resp), GFP_KERNEL); if (!resp) { kfree(req); return -ENOMEM; } priv->stats.exit_power_save_req++; ret = qmi_txn_init(&priv->qmi, &txn, wlfw_exit_power_save_resp_msg_v01_ei, resp); if (ret < 0) { icnss_qmi_fatal_err("Fail to init txn for exit power save%d\n", ret); goto out; } ret = qmi_send_request(&priv->qmi, NULL, &txn, QMI_WLFW_EXIT_POWER_SAVE_REQ_V01, WLFW_EXIT_POWER_SAVE_REQ_MSG_V01_MAX_MSG_LEN, wlfw_exit_power_save_req_msg_v01_ei, req); if (ret < 0) { qmi_txn_cancel(&txn); icnss_qmi_fatal_err("Fail to send exit power save req %d\n", ret); goto out; } ret = qmi_txn_wait(&txn, priv->ctrl_params.qmi_timeout); if (ret < 0) { icnss_qmi_fatal_err("Exit power save wait failed with ret %d\n", ret); goto out; } else if (resp->resp.result != QMI_RESULT_SUCCESS_V01) { icnss_qmi_fatal_err( "QMI exit power save request rejected,result:%d error:%d\n", resp->resp.result, resp->resp.error); ret = -resp->resp.result; goto out; } priv->stats.exit_power_save_resp++; kfree(resp); kfree(req); return 0; out: kfree(resp); kfree(req); priv->stats.exit_power_save_err++; return ret; } int wlfw_ind_register_send_sync_msg(struct icnss_priv *priv) { int ret; Loading drivers/soc/qcom/icnss2/qmi.h +6 −0 Original line number Diff line number Diff line Loading @@ -128,6 +128,11 @@ int wlfw_qdss_trace_mem_info_send_sync(struct icnss_priv *priv) { return 0; } int wlfw_exit_power_save_send_msg(struct icnss_priv *priv) { return 0; } #else int wlfw_ind_register_send_sync_msg(struct icnss_priv *priv); int icnss_connect_to_fw_server(struct icnss_priv *priv, void *data); Loading Loading @@ -163,6 +168,7 @@ int wlfw_wlan_mode_send_sync_msg(struct icnss_priv *priv, enum wlfw_driver_mode_enum_v01 mode); int icnss_wlfw_bdf_dnld_send_sync(struct icnss_priv *priv, u32 bdf_type); int wlfw_qdss_trace_mem_info_send_sync(struct icnss_priv *priv); int wlfw_exit_power_save_send_msg(struct icnss_priv *priv); #endif #endif /* __ICNSS_QMI_H__*/ Loading
drivers/soc/qcom/icnss2/main.c +8 −0 Original line number Diff line number Diff line Loading @@ -2763,6 +2763,14 @@ static int icnss_pm_resume(struct device *dev) !test_bit(ICNSS_DRIVER_PROBED, &priv->state)) goto out; if (priv->device_id == WCN6750_DEVICE_ID) { ret = wlfw_exit_power_save_send_msg(priv); if (ret) { priv->stats.pm_resume_err++; return ret; } } ret = priv->ops->pm_resume(dev); out: Loading
drivers/soc/qcom/icnss2/main.h +3 −0 Original line number Diff line number Diff line Loading @@ -207,6 +207,9 @@ struct icnss_stats { uint32_t device_info_req; uint32_t device_info_resp; uint32_t device_info_err; u32 exit_power_save_req; u32 exit_power_save_resp; u32 exit_power_save_err; }; #define WLFW_MAX_TIMESTAMP_LEN 32 Loading
drivers/soc/qcom/icnss2/qmi.c +73 −0 Original line number Diff line number Diff line Loading @@ -340,6 +340,79 @@ int wlfw_device_info_send_msg(struct icnss_priv *priv) return ret; } int wlfw_exit_power_save_send_msg(struct icnss_priv *priv) { int ret; struct wlfw_exit_power_save_req_msg_v01 *req; struct wlfw_exit_power_save_resp_msg_v01 *resp; struct qmi_txn txn; if (!priv) return -ENODEV; if (test_bit(ICNSS_FW_DOWN, &priv->state)) return -EINVAL; icnss_pr_dbg("Sending exit power save, state: 0x%lx\n", priv->state); req = kzalloc(sizeof(*req), GFP_KERNEL); if (!req) return -ENOMEM; resp = kzalloc(sizeof(*resp), GFP_KERNEL); if (!resp) { kfree(req); return -ENOMEM; } priv->stats.exit_power_save_req++; ret = qmi_txn_init(&priv->qmi, &txn, wlfw_exit_power_save_resp_msg_v01_ei, resp); if (ret < 0) { icnss_qmi_fatal_err("Fail to init txn for exit power save%d\n", ret); goto out; } ret = qmi_send_request(&priv->qmi, NULL, &txn, QMI_WLFW_EXIT_POWER_SAVE_REQ_V01, WLFW_EXIT_POWER_SAVE_REQ_MSG_V01_MAX_MSG_LEN, wlfw_exit_power_save_req_msg_v01_ei, req); if (ret < 0) { qmi_txn_cancel(&txn); icnss_qmi_fatal_err("Fail to send exit power save req %d\n", ret); goto out; } ret = qmi_txn_wait(&txn, priv->ctrl_params.qmi_timeout); if (ret < 0) { icnss_qmi_fatal_err("Exit power save wait failed with ret %d\n", ret); goto out; } else if (resp->resp.result != QMI_RESULT_SUCCESS_V01) { icnss_qmi_fatal_err( "QMI exit power save request rejected,result:%d error:%d\n", resp->resp.result, resp->resp.error); ret = -resp->resp.result; goto out; } priv->stats.exit_power_save_resp++; kfree(resp); kfree(req); return 0; out: kfree(resp); kfree(req); priv->stats.exit_power_save_err++; return ret; } int wlfw_ind_register_send_sync_msg(struct icnss_priv *priv) { int ret; Loading
drivers/soc/qcom/icnss2/qmi.h +6 −0 Original line number Diff line number Diff line Loading @@ -128,6 +128,11 @@ int wlfw_qdss_trace_mem_info_send_sync(struct icnss_priv *priv) { return 0; } int wlfw_exit_power_save_send_msg(struct icnss_priv *priv) { return 0; } #else int wlfw_ind_register_send_sync_msg(struct icnss_priv *priv); int icnss_connect_to_fw_server(struct icnss_priv *priv, void *data); Loading Loading @@ -163,6 +168,7 @@ int wlfw_wlan_mode_send_sync_msg(struct icnss_priv *priv, enum wlfw_driver_mode_enum_v01 mode); int icnss_wlfw_bdf_dnld_send_sync(struct icnss_priv *priv, u32 bdf_type); int wlfw_qdss_trace_mem_info_send_sync(struct icnss_priv *priv); int wlfw_exit_power_save_send_msg(struct icnss_priv *priv); #endif #endif /* __ICNSS_QMI_H__*/