diff --git a/cnss2/qmi.c b/cnss2/qmi.c index 290b543252..4134c270eb 100644 --- a/cnss2/qmi.c +++ b/cnss2/qmi.c @@ -45,6 +45,9 @@ #define QMI_WLFW_MAX_RECV_BUF_SIZE SZ_8K #define IMSPRIVATE_SERVICE_MAX_MSG_LEN SZ_8K #define DMS_QMI_MAX_MSG_LEN SZ_256 +#define MAX_SHADOW_REG_RESERVED 2 +#define MAX_NUM_SHADOW_REG_V3 (QMI_WLFW_MAX_NUM_SHADOW_REG_V3_USAGE_V01 - \ + MAX_SHADOW_REG_RESERVED) #define QMI_WLFW_MAC_READY_TIMEOUT_MS 50 #define QMI_WLFW_MAC_READY_MAX_RETRY 200 @@ -1379,16 +1382,31 @@ int cnss_wlfw_wlan_cfg_send_sync(struct cnss_plat_data *plat_priv, req->svc_cfg[i].pipe_num = config->ce_svc_cfg[i].pipe_num; } - req->shadow_reg_v2_valid = 1; - if (config->num_shadow_reg_v2_cfg > - QMI_WLFW_MAX_NUM_SHADOW_REG_V2_V01) - req->shadow_reg_v2_len = QMI_WLFW_MAX_NUM_SHADOW_REG_V2_V01; - else - req->shadow_reg_v2_len = config->num_shadow_reg_v2_cfg; + if (plat_priv->device_id != KIWI_DEVICE_ID) { + req->shadow_reg_v2_valid = 1; + if (config->num_shadow_reg_v2_cfg > + QMI_WLFW_MAX_NUM_SHADOW_REG_V2_V01) + req->shadow_reg_v2_len = QMI_WLFW_MAX_NUM_SHADOW_REG_V2_V01; + else + req->shadow_reg_v2_len = config->num_shadow_reg_v2_cfg; - memcpy(req->shadow_reg_v2, config->shadow_reg_v2_cfg, - sizeof(struct wlfw_shadow_reg_v2_cfg_s_v01) - * req->shadow_reg_v2_len); + memcpy(req->shadow_reg_v2, config->shadow_reg_v2_cfg, + sizeof(struct wlfw_shadow_reg_v2_cfg_s_v01) + * req->shadow_reg_v2_len); + } else { + cnss_pr_dbg("Shadow reg v3 len: %d\n", + config->num_shadow_reg_v3_cfg); + req->shadow_reg_v3_valid = 1; + if (config->num_shadow_reg_v3_cfg > + MAX_NUM_SHADOW_REG_V3) + req->shadow_reg_v3_len = MAX_NUM_SHADOW_REG_V3; + else + req->shadow_reg_v3_len = config->num_shadow_reg_v3_cfg; + + memcpy(req->shadow_reg_v3, config->shadow_reg_v3_cfg, + sizeof(struct wlfw_shadow_reg_v3_cfg_s_v01) + * req->shadow_reg_v3_len); + } ret = qmi_txn_init(&plat_priv->qmi_wlfw, &txn, wlfw_wlan_cfg_resp_msg_v01_ei, resp); diff --git a/inc/cnss2.h b/inc/cnss2.h index dcf6d3dc5e..d31c032bad 100644 --- a/inc/cnss2.h +++ b/inc/cnss2.h @@ -1,5 +1,8 @@ /* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2016-2021, The Linux Foundation. All rights reserved. */ +/* + * Copyright (c) 2016-2021, The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + */ #ifndef _NET_CNSS2_H #define _NET_CNSS2_H @@ -160,6 +163,10 @@ struct cnss_rri_over_ddr_cfg { u32 base_addr_high; }; +struct cnss_shadow_reg_v3_cfg { + u32 addr; +}; + struct cnss_wlan_enable_cfg { u32 num_ce_tgt_cfg; struct cnss_ce_tgt_pipe_cfg *ce_tgt_cfg; @@ -171,6 +178,8 @@ struct cnss_wlan_enable_cfg { struct cnss_shadow_reg_v2_cfg *shadow_reg_v2_cfg; bool rri_over_ddr_cfg_valid; struct cnss_rri_over_ddr_cfg rri_over_ddr_cfg; + u32 num_shadow_reg_v3_cfg; + struct cnss_shadow_reg_v3_cfg *shadow_reg_v3_cfg; }; enum cnss_driver_mode {