|
@@ -590,6 +590,10 @@ int cnss_wlfw_tgt_cap_send_sync(struct cnss_plat_data *plat_priv)
|
|
|
if (resp->fw_caps_valid) {
|
|
|
plat_priv->fw_pcie_gen_switch =
|
|
|
!!(resp->fw_caps & QMI_WLFW_HOST_PCIE_GEN_SWITCH_V01);
|
|
|
+ plat_priv->fw_aux_uc_support =
|
|
|
+ !!(resp->fw_caps & QMI_WLFW_AUX_UC_SUPPORT_V01);
|
|
|
+ cnss_pr_dbg("FW aux uc support capability: %d\n",
|
|
|
+ plat_priv->fw_aux_uc_support);
|
|
|
plat_priv->fw_caps = resp->fw_caps;
|
|
|
}
|
|
|
|
|
@@ -1090,6 +1094,83 @@ out:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+int cnss_wlfw_aux_dnld_send_sync(struct cnss_plat_data *plat_priv)
|
|
|
+{
|
|
|
+ struct wlfw_aux_uc_info_req_msg_v01 *req;
|
|
|
+ struct wlfw_aux_uc_info_resp_msg_v01 *resp;
|
|
|
+ struct qmi_txn txn;
|
|
|
+ struct cnss_fw_mem *aux_mem = &plat_priv->aux_mem;
|
|
|
+ int ret = 0;
|
|
|
+
|
|
|
+ cnss_pr_dbg("Sending QMI_WLFW_AUX_UC_INFO_REQ_V01 message, 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;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!aux_mem->pa || !aux_mem->size) {
|
|
|
+ cnss_pr_err("Memory for AUX is not available\n");
|
|
|
+ ret = -ENOMEM;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ cnss_pr_dbg("AUX memory, va: 0x%pK, pa: %pa, size: 0x%zx\n",
|
|
|
+ aux_mem->va, &aux_mem->pa, aux_mem->size);
|
|
|
+
|
|
|
+ req->addr = plat_priv->aux_mem.pa;
|
|
|
+ req->size = plat_priv->aux_mem.size;
|
|
|
+
|
|
|
+ ret = qmi_txn_init(&plat_priv->qmi_wlfw, &txn,
|
|
|
+ wlfw_aux_uc_info_resp_msg_v01_ei, resp);
|
|
|
+ if (ret < 0) {
|
|
|
+ cnss_pr_err("Failed to initialize txn for QMI_WLFW_AUX_UC_INFO_REQ_V01 request, err: %d\n",
|
|
|
+ ret);
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = qmi_send_request(&plat_priv->qmi_wlfw, NULL, &txn,
|
|
|
+ QMI_WLFW_AUX_UC_INFO_REQ_V01,
|
|
|
+ WLFW_AUX_UC_INFO_REQ_MSG_V01_MAX_MSG_LEN,
|
|
|
+ wlfw_aux_uc_info_req_msg_v01_ei, req);
|
|
|
+ if (ret < 0) {
|
|
|
+ qmi_txn_cancel(&txn);
|
|
|
+ cnss_pr_err("Failed to send QMI_WLFW_AUX_UC_INFO_REQ_V01 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 QMI_WLFW_AUX_UC_INFO_REQ_V01 request, err: %d\n",
|
|
|
+ ret);
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (resp->resp.result != QMI_RESULT_SUCCESS_V01) {
|
|
|
+ cnss_pr_err("QMI_WLFW_AUX_UC_INFO_REQ_V01 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:
|
|
|
+ CNSS_QMI_ASSERT();
|
|
|
+ kfree(req);
|
|
|
+ kfree(resp);
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
int cnss_wlfw_wlan_mac_req_send_sync(struct cnss_plat_data *plat_priv,
|
|
|
u8 *mac, u32 mac_len)
|
|
|
{
|