Loading drivers/net/wireless/cnss2/main.h +2 −0 Original line number Diff line number Diff line Loading @@ -279,6 +279,8 @@ struct cnss_plat_data { struct completion rddm_complete; struct completion recovery_complete; struct cnss_control_params ctrl_params; u64 antenna; u64 grant; }; struct cnss_plat_data *cnss_get_plat_priv(struct platform_device *plat_dev); Loading drivers/net/wireless/cnss2/qmi.c +141 −0 Original line number Diff line number Diff line Loading @@ -1053,6 +1053,147 @@ int cnss_wlfw_ini_send_sync(struct cnss_plat_data *plat_priv, return ret; } int cnss_wlfw_antenna_switch_send_sync(struct cnss_plat_data *plat_priv) { struct wlfw_antenna_switch_req_msg_v01 *req; struct wlfw_antenna_switch_resp_msg_v01 *resp; struct qmi_txn txn; int ret = 0; if (!plat_priv) return -ENODEV; cnss_pr_dbg("Sending antenna switch sync request, state: 0x%lx\n", plat_priv->driver_state); req = kzalloc(sizeof(*req), GFP_KERNEL); if (!req) return -ENOMEM; resp = kzalloc(sizeof(*resp), GFP_KERNEL); if (!resp) { kfree(req); return -ENOMEM; } ret = qmi_txn_init(&plat_priv->qmi_wlfw, &txn, wlfw_antenna_switch_resp_msg_v01_ei, resp); if (ret < 0) { cnss_pr_err("Failed to initialize txn for antenna switch request, err: %d\n", ret); goto out; } ret = qmi_send_request(&plat_priv->qmi_wlfw, NULL, &txn, QMI_WLFW_ANTENNA_SWITCH_REQ_V01, WLFW_ANTENNA_SWITCH_REQ_MSG_V01_MAX_MSG_LEN, wlfw_antenna_switch_req_msg_v01_ei, req); if (ret < 0) { qmi_txn_cancel(&txn); cnss_pr_err("Failed to send antenna switch request, err: %d\n", ret); goto out; } ret = qmi_txn_wait(&txn, QMI_WLFW_TIMEOUT_JF); if (ret < 0) { cnss_pr_err("Failed to wait for response of antenna switch request, err: %d\n", ret); goto out; } if (resp->resp.result != QMI_RESULT_SUCCESS_V01) { cnss_pr_err("Antenna switch request failed, result: %d, err: %d\n", resp->resp.result, resp->resp.error); ret = -resp->resp.result; goto out; } if (resp->antenna_valid) plat_priv->antenna = resp->antenna; cnss_pr_dbg("Antenna valid: %u, antenna 0x%llx\n", resp->antenna_valid, resp->antenna); kfree(req); kfree(resp); return 0; out: kfree(req); kfree(resp); return ret; } int cnss_wlfw_antenna_grant_send_sync(struct cnss_plat_data *plat_priv) { struct wlfw_antenna_grant_req_msg_v01 *req; struct wlfw_antenna_grant_resp_msg_v01 *resp; struct qmi_txn txn; int ret = 0; if (!plat_priv) return -ENODEV; cnss_pr_dbg("Sending antenna grant sync request, state: 0x%lx, grant 0x%llx\n", plat_priv->driver_state, plat_priv->grant); req = kzalloc(sizeof(*req), GFP_KERNEL); if (!req) return -ENOMEM; resp = kzalloc(sizeof(*resp), GFP_KERNEL); if (!resp) { kfree(req); return -ENOMEM; } req->grant_valid = 1; req->grant = plat_priv->grant; ret = qmi_txn_init(&plat_priv->qmi_wlfw, &txn, wlfw_antenna_grant_resp_msg_v01_ei, resp); if (ret < 0) { cnss_pr_err("Failed to initialize txn for antenna grant request, err: %d\n", ret); goto out; } ret = qmi_send_request(&plat_priv->qmi_wlfw, NULL, &txn, QMI_WLFW_ANTENNA_GRANT_REQ_V01, WLFW_ANTENNA_GRANT_REQ_MSG_V01_MAX_MSG_LEN, wlfw_antenna_grant_req_msg_v01_ei, req); if (ret < 0) { qmi_txn_cancel(&txn); cnss_pr_err("Failed to send antenna grant request, err: %d\n", ret); goto out; } ret = qmi_txn_wait(&txn, QMI_WLFW_TIMEOUT_JF); if (ret < 0) { cnss_pr_err("Failed to wait for response of antenna grant request, err: %d\n", ret); goto out; } if (resp->resp.result != QMI_RESULT_SUCCESS_V01) { cnss_pr_err("Antenna grant request failed, result: %d, err: %d\n", resp->resp.result, resp->resp.error); ret = -resp->resp.result; goto out; } kfree(req); kfree(resp); return 0; out: kfree(req); kfree(resp); return ret; } unsigned int cnss_get_qmi_timeout(struct cnss_plat_data *plat_priv) { cnss_pr_dbg("QMI timeout is %u ms\n", QMI_WLFW_TIMEOUT_MS); Loading drivers/net/wireless/cnss2/qmi.h +14 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,8 @@ int cnss_wlfw_athdiag_write_send_sync(struct cnss_plat_data *plat_priv, u32 data_len, u8 *data); int cnss_wlfw_ini_send_sync(struct cnss_plat_data *plat_priv, u8 fw_log_mode); int cnss_wlfw_antenna_switch_send_sync(struct cnss_plat_data *plat_priv); int cnss_wlfw_antenna_grant_send_sync(struct cnss_plat_data *plat_priv); #else #define QMI_WLFW_TIMEOUT_MS 10000 Loading Loading @@ -125,6 +127,18 @@ int cnss_wlfw_ini_send_sync(struct cnss_plat_data *plat_priv, { return 0; } static inline int cnss_wlfw_antenna_switch_send_sync(struct cnss_plat_data *plat_priv) { return 0; } static inline int cnss_wlfw_antenna_grant_send_sync(struct cnss_plat_data *plat_priv) { return 0; } #endif /* CONFIG_CNSS2_QMI */ #endif /* _CNSS_QMI_H */ Loading
drivers/net/wireless/cnss2/main.h +2 −0 Original line number Diff line number Diff line Loading @@ -279,6 +279,8 @@ struct cnss_plat_data { struct completion rddm_complete; struct completion recovery_complete; struct cnss_control_params ctrl_params; u64 antenna; u64 grant; }; struct cnss_plat_data *cnss_get_plat_priv(struct platform_device *plat_dev); Loading
drivers/net/wireless/cnss2/qmi.c +141 −0 Original line number Diff line number Diff line Loading @@ -1053,6 +1053,147 @@ int cnss_wlfw_ini_send_sync(struct cnss_plat_data *plat_priv, return ret; } int cnss_wlfw_antenna_switch_send_sync(struct cnss_plat_data *plat_priv) { struct wlfw_antenna_switch_req_msg_v01 *req; struct wlfw_antenna_switch_resp_msg_v01 *resp; struct qmi_txn txn; int ret = 0; if (!plat_priv) return -ENODEV; cnss_pr_dbg("Sending antenna switch sync request, state: 0x%lx\n", plat_priv->driver_state); req = kzalloc(sizeof(*req), GFP_KERNEL); if (!req) return -ENOMEM; resp = kzalloc(sizeof(*resp), GFP_KERNEL); if (!resp) { kfree(req); return -ENOMEM; } ret = qmi_txn_init(&plat_priv->qmi_wlfw, &txn, wlfw_antenna_switch_resp_msg_v01_ei, resp); if (ret < 0) { cnss_pr_err("Failed to initialize txn for antenna switch request, err: %d\n", ret); goto out; } ret = qmi_send_request(&plat_priv->qmi_wlfw, NULL, &txn, QMI_WLFW_ANTENNA_SWITCH_REQ_V01, WLFW_ANTENNA_SWITCH_REQ_MSG_V01_MAX_MSG_LEN, wlfw_antenna_switch_req_msg_v01_ei, req); if (ret < 0) { qmi_txn_cancel(&txn); cnss_pr_err("Failed to send antenna switch request, err: %d\n", ret); goto out; } ret = qmi_txn_wait(&txn, QMI_WLFW_TIMEOUT_JF); if (ret < 0) { cnss_pr_err("Failed to wait for response of antenna switch request, err: %d\n", ret); goto out; } if (resp->resp.result != QMI_RESULT_SUCCESS_V01) { cnss_pr_err("Antenna switch request failed, result: %d, err: %d\n", resp->resp.result, resp->resp.error); ret = -resp->resp.result; goto out; } if (resp->antenna_valid) plat_priv->antenna = resp->antenna; cnss_pr_dbg("Antenna valid: %u, antenna 0x%llx\n", resp->antenna_valid, resp->antenna); kfree(req); kfree(resp); return 0; out: kfree(req); kfree(resp); return ret; } int cnss_wlfw_antenna_grant_send_sync(struct cnss_plat_data *plat_priv) { struct wlfw_antenna_grant_req_msg_v01 *req; struct wlfw_antenna_grant_resp_msg_v01 *resp; struct qmi_txn txn; int ret = 0; if (!plat_priv) return -ENODEV; cnss_pr_dbg("Sending antenna grant sync request, state: 0x%lx, grant 0x%llx\n", plat_priv->driver_state, plat_priv->grant); req = kzalloc(sizeof(*req), GFP_KERNEL); if (!req) return -ENOMEM; resp = kzalloc(sizeof(*resp), GFP_KERNEL); if (!resp) { kfree(req); return -ENOMEM; } req->grant_valid = 1; req->grant = plat_priv->grant; ret = qmi_txn_init(&plat_priv->qmi_wlfw, &txn, wlfw_antenna_grant_resp_msg_v01_ei, resp); if (ret < 0) { cnss_pr_err("Failed to initialize txn for antenna grant request, err: %d\n", ret); goto out; } ret = qmi_send_request(&plat_priv->qmi_wlfw, NULL, &txn, QMI_WLFW_ANTENNA_GRANT_REQ_V01, WLFW_ANTENNA_GRANT_REQ_MSG_V01_MAX_MSG_LEN, wlfw_antenna_grant_req_msg_v01_ei, req); if (ret < 0) { qmi_txn_cancel(&txn); cnss_pr_err("Failed to send antenna grant request, err: %d\n", ret); goto out; } ret = qmi_txn_wait(&txn, QMI_WLFW_TIMEOUT_JF); if (ret < 0) { cnss_pr_err("Failed to wait for response of antenna grant request, err: %d\n", ret); goto out; } if (resp->resp.result != QMI_RESULT_SUCCESS_V01) { cnss_pr_err("Antenna grant request failed, result: %d, err: %d\n", resp->resp.result, resp->resp.error); ret = -resp->resp.result; goto out; } kfree(req); kfree(resp); return 0; out: kfree(req); kfree(resp); return ret; } unsigned int cnss_get_qmi_timeout(struct cnss_plat_data *plat_priv) { cnss_pr_dbg("QMI timeout is %u ms\n", QMI_WLFW_TIMEOUT_MS); Loading
drivers/net/wireless/cnss2/qmi.h +14 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,8 @@ int cnss_wlfw_athdiag_write_send_sync(struct cnss_plat_data *plat_priv, u32 data_len, u8 *data); int cnss_wlfw_ini_send_sync(struct cnss_plat_data *plat_priv, u8 fw_log_mode); int cnss_wlfw_antenna_switch_send_sync(struct cnss_plat_data *plat_priv); int cnss_wlfw_antenna_grant_send_sync(struct cnss_plat_data *plat_priv); #else #define QMI_WLFW_TIMEOUT_MS 10000 Loading Loading @@ -125,6 +127,18 @@ int cnss_wlfw_ini_send_sync(struct cnss_plat_data *plat_priv, { return 0; } static inline int cnss_wlfw_antenna_switch_send_sync(struct cnss_plat_data *plat_priv) { return 0; } static inline int cnss_wlfw_antenna_grant_send_sync(struct cnss_plat_data *plat_priv) { return 0; } #endif /* CONFIG_CNSS2_QMI */ #endif /* _CNSS_QMI_H */