cnss2: Add AUX UC download functionality

Add support for AUX UC download functionality if aux support is
indicated by both host and fw.

Change-Id: I3bfbebbb5cdfbbaa350a34378ab2f0809f27affb
CRs-Fixed: 3402104
Šī revīzija ir iekļauta:
Alan Chen
2023-02-01 16:15:19 -08:00
revīziju iesūtīja Rahul Choudhary
vecāks afc7a80790
revīzija f4e0145655
9 mainīti faili ar 195 papildinājumiem un 1 dzēšanām

Parādīt failu

@@ -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)
{