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:

revīziju iesūtīja
Rahul Choudhary

vecāks
afc7a80790
revīzija
f4e0145655
81
cnss2/qmi.c
81
cnss2/qmi.c
@@ -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)
|
||||
{
|
||||
|
Atsaukties uz šo jaunā problēmā
Block a user