qcacld-3.0: Add QMI files for WFDS service

Add initial version of QMI files that are used for
communication between WLAN host driver on APSS and
WiFi driver on LPASS.

Change-Id: If7352490d73457479e85958b90066f9c397bb310
CRs-Fixed: 3328378
This commit is contained in:
Yeshwanth Sriram Guntuka
2022-11-18 17:47:44 +05:30
committed by Madan Koyyalamudi
父節點 d2cc52d5ae
當前提交 c589e67a42
共有 10 個文件被更改,包括 1791 次插入1 次删除

查看文件

@@ -30,6 +30,14 @@
#include <linux/types.h>
#include "wlan_cfg80211.h"
#include "wlan_objmgr_psoc_obj.h"
#include <qdf_time.h>
#define QMI_WFDS_MAX_RECV_BUF_SIZE 4096
#define QMI_WFDS_SERVICE_INS_ID_V01 0x0
#define QMI_WFDS_TIMEOUT_MS 10000
#define QMI_WFDS_TIMEOUT_JF \
qdf_system_msecs_to_ticks(QMI_WFDS_TIMEOUT_MS)
#ifdef QMI_COMPONENT_ENABLE
/**
@@ -134,6 +142,21 @@ void os_if_qmi_txn_cancel(struct qmi_txn *qmi_txn);
*/
void os_if_qmi_register_callbacks(struct wlan_objmgr_psoc *psoc,
struct wlan_qmi_psoc_callbacks *cb_obj);
#ifdef QMI_WFDS
/**
* os_if_qmi_wfds_register_callbacks() - Register WFDS callback handlers
* @cb_obj: Callback object pointer
*
* Return: None
*/
void os_if_qmi_wfds_register_callbacks(struct wlan_qmi_psoc_callbacks *cb_obj);
#else
static inline
void os_if_qmi_wfds_register_callbacks(struct wlan_qmi_psoc_callbacks *cb_obj)
{
}
#endif
#else
static inline
QDF_STATUS os_if_qmi_handle_init(struct qmi_handle *qmi_hdl,

查看文件

@@ -0,0 +1,292 @@
/*
* Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifndef WIFI_DRIVER_SERVICE_V01_H
#define WIFI_DRIVER_SERVICE_V01_H
#include <linux/soc/qcom/qmi.h>
#define WFDS_SERVICE_ID_V01 0x043C
#define WFDS_SERVICE_VERS_V01 0x01
#define QMI_WFDS_IPCC_MAP_N_CFG_RESP_V01 0x0003
#define QMI_WFDS_MISC_REQ_V01 0x0004
#define QMI_WFDS_MISC_RESP_V01 0x0004
#define QMI_WFDS_MEM_RESP_V01 0x0002
#define QMI_WFDS_IPCC_MAP_N_CFG_REQ_V01 0x0003
#define QMI_WFDS_MISC_IND_V01 0x0004
#define QMI_WFDS_CONFIG_REQ_V01 0x0001
#define QMI_WFDS_IPCC_MAP_N_CFG_IND_V01 0x0003
#define QMI_WFDS_CONFIG_RESP_V01 0x0001
#define QMI_WFDS_MEM_REQ_V01 0x0002
#define QMI_WFDS_MEM_IND_V01 0x0002
#define WFDS_CE_MAX_SRNG_V01 3
#define WFDS_MEM_ARENA_MAX_V01 8
#define WFDS_PAGE_INFO_MAX_ARRAY_SIZE_V01 255
/**
* struct wfds_gen_resp_msg_v01 - Generic QMI response message
* @resp: QMI result code
*/
struct wfds_gen_resp_msg_v01 {
struct qmi_response_type_v01 resp;
};
#define WFDS_GEN_RESP_MSG_V01_MAX_MSG_LEN 7
extern struct qmi_elem_info wfds_gen_resp_msg_v01_ei[];
/**
* enum wifi_drv_qmi_srng_direction_v01 - SRNG direction
* @WIFI_DRV_QMI_SRNG_DIRECTION_MIN_VAL_V01: SRNG direction enum min value
* @WFDS_SRNG_SOURCE_RING_V01: SRNG source ring
* @WFDS_SRNG_DESTINATION_RING_V01: SRNG destination ring
* @WIFI_DRV_QMI_SRNG_DIRECTION_MAX_VAL_V01: SRNG direction enum max value
*/
enum wifi_drv_qmi_srng_direction_v01 {
WIFI_DRV_QMI_SRNG_DIRECTION_MIN_VAL_V01 = INT_MIN,
WFDS_SRNG_SOURCE_RING_V01 = 0,
WFDS_SRNG_DESTINATION_RING_V01 = 1,
WIFI_DRV_QMI_SRNG_DIRECTION_MAX_VAL_V01 = INT_MAX,
};
/**
* struct wifi_drv_qmi_srng_information_v01 - SRNG information
* @ring_id: SRNG ring id
* @dir: SRNG direction
* @num_entries: number of entries in SRNG
* @entry_size: size of SRNG descriptor
* @ring_base_paddr: ring base physical address of SRNG
* @hp_paddr: HP physical address of SRNG
* @tp_paddr: TP physical address of SRNG
*/
struct wifi_drv_qmi_srng_information_v01 {
u8 ring_id;
enum wifi_drv_qmi_srng_direction_v01 dir;
u32 num_entries;
u32 entry_size;
u64 ring_base_paddr;
u64 hp_paddr;
u64 tp_paddr;
};
/**
* enum wifi_drv_qmi_pipe_dir_v01 - pipe direction
* @WIFI_DRV_QMI_PIPE_DIR_MIN_VAL_V01: pipe direction enum min value
* @WFDS_PIPEDIR_NONE_V01: none pipe direction
* @WFDS_PIPEDIR_IN_V01: target to host pipe direction
* @WFDS_PIPEDIR_OUT_V01: host to target pipe direction
* @WIFI_DRV_QMI_PIPE_DIR_MAX_VAL_V01: pipe direction enum max value
*/
enum wifi_drv_qmi_pipe_dir_v01 {
WIFI_DRV_QMI_PIPE_DIR_MIN_VAL_V01 = INT_MIN,
WFDS_PIPEDIR_NONE_V01 = 0,
WFDS_PIPEDIR_IN_V01 = 1,
WFDS_PIPEDIR_OUT_V01 = 2,
WIFI_DRV_QMI_PIPE_DIR_MAX_VAL_V01 = INT_MAX,
};
/**
* struct wifi_drv_qmi_ce_information_v01 - CE information
* @ce_id: CE id
* @ce_dir: CE direction
* @srng_info: SRNG information
*/
struct wifi_drv_qmi_ce_information_v01 {
u8 ce_id;
enum wifi_drv_qmi_pipe_dir_v01 ce_dir;
struct wifi_drv_qmi_srng_information_v01 srng_info;
};
/**
* struct wfds_config_req_msg_v01 - WFDS config request message
* @ce_info_len: size of ce_info with valid entries
* @ce_info: CE information array
* @rx_refill_ring: refill SRNG information
* @shadow_rdptr_mem_paddr: shadow read memory physical address
* @shadow_rdptr_mem_size: shadow read memory size
* @shadow_wrptr_mem_paddr: shadow write memory physical address
* @shadow_wrptr_mem_size: shadow write memory size
* @rx_pkt_tlv_len: rx packet tlvs length
* @rx_rbm: return buffer manager for rx buffers
* @pcie_bar_pa: PCIe BAR physical address
* @pci_slot: PCIe slot
* @lpass_ep_id: LPASS data message service endpoint id
*/
struct wfds_config_req_msg_v01 {
u32 ce_info_len;
struct wifi_drv_qmi_ce_information_v01 ce_info[WFDS_CE_MAX_SRNG_V01];
struct wifi_drv_qmi_srng_information_v01 rx_refill_ring;
u64 shadow_rdptr_mem_paddr;
u64 shadow_rdptr_mem_size;
u64 shadow_wrptr_mem_paddr;
u64 shadow_wrptr_mem_size;
u32 rx_pkt_tlv_len;
u32 rx_rbm;
u64 pcie_bar_pa;
u32 pci_slot;
u32 lpass_ep_id;
};
#define WFDS_CONFIG_REQ_MSG_V01_MAX_MSG_LEN 253
extern struct qmi_elem_info wfds_config_req_msg_v01_ei[];
/**
* enum wifi_drv_qmi_mem_arenas_v01 - Memory arena
* @WIFI_DRV_QMI_MEM_ARENAS_MIN_VAL_V01: memory arena enum min value
* @WFDS_MEM_ARENA_TX_BUFFERS_V01: TX buffers memory arena
* @WFDS_MEM_ARENA_CE_TX_MSG_BUFFERS_V01: CE TX message buffers memory arena
* @WFDS_MEM_ARENA_CE_RX_MSG_BUFFERS_V01: CE RX message buffers memory arena
* @WIFI_DRV_QMI_MEM_ARENAS_MAX_VAL_V01: memory arena enum max value
*/
enum wifi_drv_qmi_mem_arenas_v01 {
WIFI_DRV_QMI_MEM_ARENAS_MIN_VAL_V01 = INT_MIN,
WFDS_MEM_ARENA_TX_BUFFERS_V01 = 0,
WFDS_MEM_ARENA_CE_TX_MSG_BUFFERS_V01 = 1,
WFDS_MEM_ARENA_CE_RX_MSG_BUFFERS_V01 = 2,
WIFI_DRV_QMI_MEM_ARENAS_MAX_VAL_V01 = INT_MAX,
};
/**
* struct wifi_drv_qmi_mem_arena_information_v01 - Memory arena information
* @entry_size: entry size
* @num_entries: total number of entries required
*/
struct wifi_drv_qmi_mem_arena_information_v01 {
u16 entry_size;
u16 num_entries;
};
/**
* struct wfds_mem_ind_msg_v01 - Memory indication message
* @mem_arena_info_len: number of valid entries in mem_arena_info array
* @mem_arena_info: memory arena information array
*/
struct wfds_mem_ind_msg_v01 {
u32 mem_arena_info_len;
struct wifi_drv_qmi_mem_arena_information_v01 mem_arena_info[WFDS_MEM_ARENA_MAX_V01];
};
#define WFDS_MEM_IND_MSG_V01_MAX_MSG_LEN 36
extern struct qmi_elem_info wfds_mem_ind_msg_v01_ei[];
/**
* struct wifi_drv_qmi_mem_arena_page_information_v01 - Memory arena
* page information
* @num_entries_per_page: number of entries per page
* @page_dma_addr_len: number of valid entries in page_dma_addr array
* @page_dma_addr: page dma address array
*/
struct wifi_drv_qmi_mem_arena_page_information_v01 {
u16 num_entries_per_page;
u32 page_dma_addr_len;
u64 page_dma_addr[WFDS_PAGE_INFO_MAX_ARRAY_SIZE_V01];
};
/**
* struct wfds_mem_req_msg_v01 - Memory request message
* page information
* @mem_arena_page_info_len: number of valid entries in
* mem_arena_page_info array
* @mem_arena_page_info: memory arena information
*/
struct wfds_mem_req_msg_v01 {
u32 mem_arena_page_info_len;
struct wifi_drv_qmi_mem_arena_page_information_v01 mem_arena_page_info[WFDS_MEM_ARENA_MAX_V01];
};
#define WFDS_MEM_REQ_MSG_V01_MAX_MSG_LEN 16348
extern struct qmi_elem_info wfds_mem_req_msg_v01_ei[];
/**
* struct wifi_drv_qmi_ipcc_information_v01 - IPCC information
* @ce_id: CE id
* @ipcc_trig_addr: IPCC trigger address
* @ipcc_trig_data: IPCC trigger data
*/
struct wifi_drv_qmi_ipcc_information_v01 {
u8 ce_id;
u64 ipcc_trig_addr;
u32 ipcc_trig_data;
};
/**
* struct wfds_ipcc_map_n_cfg_ind_msg_v01 - IPCC map and configure
* indication message
* @ipcc_ce_info_len: number of valid entries in ipcc_ce_info array
* @ipcc_ce_info: IPCC information for CE
*/
struct wfds_ipcc_map_n_cfg_ind_msg_v01 {
u32 ipcc_ce_info_len;
struct wifi_drv_qmi_ipcc_information_v01 ipcc_ce_info[WFDS_CE_MAX_SRNG_V01];
};
#define WFDS_IPCC_MAP_N_CFG_IND_MSG_V01_MAX_MSG_LEN 43
extern struct qmi_elem_info wfds_ipcc_map_n_cfg_ind_msg_v01_ei[];
/**
* struct wfds_ipcc_map_n_cfg_req_msg_v01 - IPCC map and configure
* request message
* @status: IPCC configuration status
*/
struct wfds_ipcc_map_n_cfg_req_msg_v01 {
u8 status;
};
#define WFDS_IPCC_MAP_N_CFG_REQ_MSG_V01_MAX_MSG_LEN 4
extern struct qmi_elem_info wfds_ipcc_map_n_cfg_req_msg_v01_ei[];
/**
* enum wifi_drv_qmi_event_v01 - driver event
* @WIFI_DRV_QMI_EVENT_MIN_VAL_V01: event enum min value
* @WFDS_EVENT_WLAN_HOST_RMMOD_V01: host driver rmmod event
* @WFDS_EVENT_WLAN_SSR_V01: wlan SSR event
* @WFDS_EVENT_LPASS_SSR_V01: LPASS SSR event
* @WIFI_DRV_QMI_EVENT_MAX_VAL_V01: event enum max value
*/
enum wifi_drv_qmi_event_v01 {
WIFI_DRV_QMI_EVENT_MIN_VAL_V01 = INT_MIN,
WFDS_EVENT_WLAN_HOST_RMMOD_V01 = 0,
WFDS_EVENT_WLAN_SSR_V01 = 1,
WFDS_EVENT_LPASS_SSR_V01 = 2,
WIFI_DRV_QMI_EVENT_MAX_VAL_V01 = INT_MAX,
};
/**
* struct wfds_misc_req_msg_v01 - Miscellaneous request
* message
* @event: driver event
*/
struct wfds_misc_req_msg_v01 {
enum wifi_drv_qmi_event_v01 event;
};
#define WFDS_MISC_REQ_MSG_V01_MAX_MSG_LEN 7
extern struct qmi_elem_info wfds_misc_req_msg_v01_ei[];
/**
* struct wfds_misc_ind_msg_v01 - Miscellaneous indication
* message
* @event: driver event
*/
struct wfds_misc_ind_msg_v01 {
enum wifi_drv_qmi_event_v01 event;
};
#define WFDS_MISC_IND_MSG_V01_MAX_MSG_LEN 7
extern struct qmi_elem_info wfds_misc_ind_msg_v01_ei[];
#endif

查看文件

@@ -21,6 +21,7 @@
*/
#include "os_if_qmi.h"
#include "wlan_qmi_ucfg_api.h"
QDF_STATUS os_if_qmi_handle_init(struct qmi_handle *qmi_hdl,
qdf_size_t recv_buf_size,
@@ -130,4 +131,6 @@ void os_if_qmi_txn_cancel(struct qmi_txn *qmi_txn)
void os_if_qmi_register_callbacks(struct wlan_objmgr_psoc *psoc,
struct wlan_qmi_psoc_callbacks *cb_obj)
{
os_if_qmi_wfds_register_callbacks(cb_obj);
ucfg_qmi_register_os_if_callbacks(psoc, cb_obj);
}

查看文件

@@ -0,0 +1,513 @@
/*
* Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "os_if_qmi.h"
#include "os_if_qmi_wifi_driver_service_v01.h"
#include <qdf_util.h>
#include "wlan_qmi_public_struct.h"
static struct qmi_handle qmi_wfds;
/*
* os_if_ce_dir_qmi_to_wfds_type() - Convert ce direction from internal
* type to type used in QMI message
* @ce_dir: internal ce direction
*
* Return: ce direction in QMI type
*/
static enum wifi_drv_qmi_pipe_dir_v01
os_if_ce_dir_qmi_to_wfds_type(enum wlan_qmi_wfds_pipe_dir ce_dir)
{
switch (ce_dir) {
case QMI_WFDS_PIPEDIR_NONE:
return WFDS_PIPEDIR_NONE_V01;
case QMI_WFDS_PIPEDIR_IN:
return WFDS_PIPEDIR_IN_V01;
case QMI_WFDS_PIPEDIR_OUT:
return WFDS_PIPEDIR_OUT_V01;
default:
return WIFI_DRV_QMI_PIPE_DIR_MAX_VAL_V01;
}
}
/*
* os_if_srng_dir_qmi_to_wfds_type() - Convert srng direction from internal
* type to type used in QMI message
* @srng_dir: internal srng direction
*
* Return: srng direction in QMI type
*/
static enum wifi_drv_qmi_srng_direction_v01
os_if_srng_dir_qmi_to_wfds_type(enum wlan_qmi_wfds_srng_dir srng_dir)
{
switch (srng_dir) {
case QMI_WFDS_SRNG_SOURCE_RING:
return WFDS_SRNG_SOURCE_RING_V01;
case QMI_WFDS_SRNG_DESTINATION_RING:
return WFDS_SRNG_DESTINATION_RING_V01;
default:
return WIFI_DRV_QMI_SRNG_DIRECTION_MAX_VAL_V01;
}
}
/*
* os_if_qmi_wfds_send_config_msg() - Send config message to QMI server
* to QMI server
* @src_info: source information to be filled in QMI message
*
* Return: QDF status
*/
static QDF_STATUS
os_if_qmi_wfds_send_config_msg(struct wlan_qmi_wfds_config_req_msg *src_info)
{
struct wfds_config_req_msg_v01 *req;
struct wfds_gen_resp_msg_v01 *resp;
struct qmi_txn txn;
QDF_STATUS status;
uint8_t i;
req = qdf_mem_malloc(sizeof(*req));
if (!req)
return QDF_STATUS_E_NOMEM;
resp = qdf_mem_malloc(sizeof(*resp));
if (!resp) {
qdf_mem_free(req);
return QDF_STATUS_E_NOMEM;
}
if (src_info->ce_info_len > QMI_WFDS_CE_MAX_SRNG) {
status = QDF_STATUS_E_INVAL;
goto out;
}
req->ce_info_len = src_info->ce_info_len;
for (i = 0; i < req->ce_info_len; i++) {
req->ce_info[i].ce_id = src_info->ce_info[i].ce_id;
req->ce_info[i].ce_dir =
os_if_ce_dir_qmi_to_wfds_type(src_info->ce_info[i].ce_dir);
req->ce_info[i].srng_info.ring_id =
src_info->ce_info[i].srng_info.ring_id;
req->ce_info[i].srng_info.dir =
os_if_srng_dir_qmi_to_wfds_type(src_info->ce_info[i].srng_info.dir);
req->ce_info[i].srng_info.num_entries =
src_info->ce_info[i].srng_info.num_entries;
req->ce_info[i].srng_info.entry_size =
src_info->ce_info[i].srng_info.entry_size;
req->ce_info[i].srng_info.ring_base_paddr =
src_info->ce_info[i].srng_info.ring_base_paddr;
req->ce_info[i].srng_info.hp_paddr =
src_info->ce_info[i].srng_info.hp_paddr;
req->ce_info[i].srng_info.tp_paddr =
src_info->ce_info[i].srng_info.tp_paddr;
}
req->rx_refill_ring.ring_id = src_info->rx_refill_ring.ring_id;
req->rx_refill_ring.dir =
os_if_srng_dir_qmi_to_wfds_type(src_info->rx_refill_ring.dir);
req->rx_refill_ring.num_entries = src_info->rx_refill_ring.num_entries;
req->rx_refill_ring.entry_size = src_info->rx_refill_ring.entry_size;
req->rx_refill_ring.ring_base_paddr =
src_info->rx_refill_ring.ring_base_paddr;
req->rx_refill_ring.hp_paddr = src_info->rx_refill_ring.hp_paddr;
req->rx_refill_ring.tp_paddr = src_info->rx_refill_ring.tp_paddr;
req->shadow_rdptr_mem_paddr = src_info->shadow_rdptr_mem_paddr;
req->shadow_rdptr_mem_size = src_info->shadow_rdptr_mem_size;
req->shadow_wrptr_mem_paddr = src_info->shadow_wrptr_mem_paddr;
req->shadow_wrptr_mem_size = src_info->shadow_wrptr_mem_size;
req->rx_pkt_tlv_len = src_info->rx_pkt_tlv_len;
req->rx_rbm = src_info->rx_rbm;
req->pcie_bar_pa = src_info->pcie_bar_pa;
req->pci_slot = src_info->pci_slot;
req->lpass_ep_id = src_info->lpass_ep_id;
status = os_if_qmi_txn_init(&qmi_wfds, &txn, wfds_gen_resp_msg_v01_ei,
resp);
if (QDF_IS_STATUS_ERROR(status)) {
osif_info("QMI transaction init failed for WFDS config message");
goto out;
}
status = os_if_qmi_send_request(&qmi_wfds, NULL, &txn,
QMI_WFDS_CONFIG_REQ_V01,
WFDS_CONFIG_REQ_MSG_V01_MAX_MSG_LEN,
wfds_config_req_msg_v01_ei, req);
if (QDF_IS_STATUS_ERROR(status)) {
osif_info("QMI WFDS config send request failed");
os_if_qmi_txn_cancel(&txn);
goto out;
}
status = os_if_qmi_txn_wait(&txn, QMI_WFDS_TIMEOUT_JF);
if (QDF_IS_STATUS_ERROR(status)) {
osif_info("Failed to wait for QMI WFDS config response");
goto out;
}
qdf_assert(resp->resp.result == QMI_RESULT_SUCCESS_V01);
out:
qdf_mem_free(resp);
qdf_mem_free(req);
return status;
}
/*
* os_if_qmi_wfds_send_req_mem_msg() - Send Request Memory message to QMI server
* @src_info: source information to be filled in QMI message
*
* Return: QDF status
*/
static QDF_STATUS
os_if_qmi_wfds_send_req_mem_msg(struct wlan_qmi_wfds_mem_req_msg *src_info)
{
struct wfds_mem_req_msg_v01 *req;
struct wfds_gen_resp_msg_v01 *resp;
struct qmi_txn txn;
QDF_STATUS status;
uint8_t i;
uint16_t j;
req = qdf_mem_malloc(sizeof(*req));
if (!req)
return QDF_STATUS_E_NOMEM;
resp = qdf_mem_malloc(sizeof(*resp));
if (!resp) {
qdf_mem_free(req);
return QDF_STATUS_E_NOMEM;
}
if (src_info->mem_arena_page_info_len > QMI_WFDS_MEM_ARENA_MAX) {
status = QDF_STATUS_E_INVAL;
goto out;
}
req->mem_arena_page_info_len = src_info->mem_arena_page_info_len;
for (i = 0; i < req->mem_arena_page_info_len; i++) {
req->mem_arena_page_info[i].num_entries_per_page =
src_info->mem_arena_page_info[i].num_entries_per_page;
req->mem_arena_page_info[i].page_dma_addr_len =
src_info->mem_arena_page_info[i].page_dma_addr_len;
if (src_info->mem_arena_page_info[i].page_dma_addr_len >
QMI_WFDS_PAGE_INFO_ARRAY_MAX_SIZE) {
status = QDF_STATUS_E_INVAL;
goto out;
}
for (j = 0; j < req->mem_arena_page_info[i].page_dma_addr_len;
j++)
req->mem_arena_page_info[i].page_dma_addr[j] =
src_info->mem_arena_page_info[i].page_dma_addr[j];
}
status = os_if_qmi_txn_init(&qmi_wfds, &txn, wfds_gen_resp_msg_v01_ei,
resp);
if (QDF_IS_STATUS_ERROR(status)) {
osif_info("QMI transaction init failed for WFDS config message");
goto out;
}
status = os_if_qmi_send_request(&qmi_wfds, NULL, &txn,
QMI_WFDS_MEM_REQ_V01,
WFDS_MEM_REQ_MSG_V01_MAX_MSG_LEN,
wfds_mem_req_msg_v01_ei, req);
if (QDF_IS_STATUS_ERROR(status)) {
osif_info("QMI WFDS config send request failed");
os_if_qmi_txn_cancel(&txn);
goto out;
}
status = os_if_qmi_txn_wait(&txn, QMI_WFDS_TIMEOUT_JF);
if (QDF_IS_STATUS_ERROR(status)) {
osif_info("Failed to wait for QMI WFDS config response");
goto out;
}
qdf_assert(resp->resp.result == QMI_RESULT_SUCCESS_V01);
out:
qdf_mem_free(resp);
qdf_mem_free(req);
return status;
}
/*
* os_if_srng_dir_qmi_to_wfds_type() - Convert status from internal
* type to type used in QMI message
* @status: internal status
*
* Return: status in QMI type
*/
static uint8_t
os_if_status_qmi_to_wfds_type(enum wlan_qmi_wfds_status status)
{
switch (status) {
case QMI_WFDS_STATUS_SUCCESS:
return QMI_RESULT_SUCCESS_V01;
case QMI_WFDS_STATUS_FAILURE:
default:
return QMI_RESULT_FAILURE_V01;
}
}
/*
* os_if_qmi_wfds_ipcc_map_n_cfg_msg() - Send the IPCC map and configure message
* to QMI server
* @src_info: source information to be filled in QMI message
*
* Return: QDF status
*/
static QDF_STATUS
os_if_qmi_wfds_ipcc_map_n_cfg_msg(struct wlan_qmi_wfds_ipcc_map_n_cfg_req_msg *src_info)
{
struct wfds_ipcc_map_n_cfg_req_msg_v01 *req;
struct wfds_gen_resp_msg_v01 *resp;
struct qmi_txn txn;
QDF_STATUS status;
req = qdf_mem_malloc(sizeof(*req));
if (!req)
return QDF_STATUS_E_NOMEM;
resp = qdf_mem_malloc(sizeof(*resp));
if (!resp) {
qdf_mem_free(req);
return QDF_STATUS_E_NOMEM;
}
req->status = os_if_status_qmi_to_wfds_type(src_info->status);
status = os_if_qmi_txn_init(&qmi_wfds, &txn, wfds_gen_resp_msg_v01_ei,
resp);
if (QDF_IS_STATUS_ERROR(status)) {
osif_info("QMI transaction init failed for WFDS config message");
goto out;
}
status = os_if_qmi_send_request(&qmi_wfds, NULL, &txn,
QMI_WFDS_IPCC_MAP_N_CFG_REQ_V01,
WFDS_IPCC_MAP_N_CFG_REQ_MSG_V01_MAX_MSG_LEN,
wfds_ipcc_map_n_cfg_req_msg_v01_ei, req);
if (QDF_IS_STATUS_ERROR(status)) {
osif_info("QMI WFDS config send request failed");
os_if_qmi_txn_cancel(&txn);
goto out;
}
status = os_if_qmi_txn_wait(&txn, QMI_WFDS_TIMEOUT_JF);
if (QDF_IS_STATUS_ERROR(status)) {
osif_info("Failed to wait for QMI WFDS config response");
goto out;
}
qdf_assert(resp->resp.result == QMI_RESULT_SUCCESS_V01);
out:
qdf_mem_free(resp);
qdf_mem_free(req);
return status;
}
/*
* os_if_qmi_wfds_request_mem_ind_cb() - Process request memory indication
* received from QMI server
* @qmi_hdl: QMI handle
* @sq: pointer to QRTR sock address
* @qmi_txn: pointer to QMI transaction
* @data: pointer to QMI data
*
* Return: None
*/
static void os_if_qmi_wfds_request_mem_ind_cb(struct qmi_handle *qmi_hdl,
struct sockaddr_qrtr *sq,
struct qmi_txn *qmi_txn,
const void *data)
{
struct wfds_mem_ind_msg_v01 *src_info =
(struct wfds_mem_ind_msg_v01 *)data;
struct wlan_qmi_wfds_mem_ind_msg mem_ind_msg = {0};
uint8_t i;
if (!qmi_hdl || !qmi_txn)
return;
if (src_info->mem_arena_info_len > QMI_WFDS_MEM_ARENA_MAX) {
osif_info("Memory arena information array size %d exceeds max length",
src_info->mem_arena_info_len);
return;
}
mem_ind_msg.mem_arena_info_len = src_info->mem_arena_info_len;
for (i = 0; i < src_info->mem_arena_info_len; i++) {
mem_ind_msg.mem_arena_info[i].entry_size =
src_info->mem_arena_info[i].entry_size;
mem_ind_msg.mem_arena_info[i].num_entries =
src_info->mem_arena_info[i].num_entries;
}
}
/*
* os_if_wfds_ipcc_map_n_cfg_ind_cb() - Process IPCC map and configure
* indication received from QMI server
* @qmi_hdl: QMI handle
* @sq: pointer to QRTR sock address
* @qmi_txn: pointer to QMI transaction
* @data: pointer to QMI data
*
* Return: None
*/
static void os_if_wfds_ipcc_map_n_cfg_ind_cb(struct qmi_handle *qmi_hdl,
struct sockaddr_qrtr *sq,
struct qmi_txn *qmi_txn,
const void *data)
{
struct wfds_ipcc_map_n_cfg_ind_msg_v01 *src_info =
(struct wfds_ipcc_map_n_cfg_ind_msg_v01 *)data;
struct wlan_qmi_wfds_ipcc_map_n_cfg_ind_msg ipcc_ind_msg = {0};
uint8_t i;
if (!qmi_hdl || !qmi_txn)
return;
if (src_info->ipcc_ce_info_len > QMI_WFDS_CE_MAX_SRNG) {
osif_info("IPCC CE information array size %d exceeds max length",
src_info->ipcc_ce_info_len);
return;
}
ipcc_ind_msg.ipcc_ce_info_len = src_info->ipcc_ce_info_len;
for (i = 0; i < src_info->ipcc_ce_info_len; i++) {
ipcc_ind_msg.ipcc_ce_info[i].ce_id =
src_info->ipcc_ce_info[i].ce_id;
ipcc_ind_msg.ipcc_ce_info[i].ipcc_trig_addr =
src_info->ipcc_ce_info[i].ipcc_trig_addr;
ipcc_ind_msg.ipcc_ce_info[i].ipcc_trig_data =
src_info->ipcc_ce_info[i].ipcc_trig_data;
}
}
/**
* os_if_qmi_wfds_new_server() - New server callback triggered when service is
* up.
* @qmi_hdl: QMI client handle
* @qmi_svc: QMI service handle
*
* Returns: 0 on success else OS failure code
*/
static int
os_if_qmi_wfds_new_server(struct qmi_handle *qmi_hdl,
struct qmi_service *qmi_svc)
{
QDF_STATUS status;
status = os_if_qmi_connect_to_svc(qmi_hdl, qmi_svc);
if (QDF_IS_STATUS_ERROR(status)) {
osif_err("Failed to connect to WFDS QMI service port");
return qdf_status_to_os_return(status);
}
return qdf_status_to_os_return(status);
}
/**
* os_if_qmi_wfds_del_server() - Del server callback triggered when service is
* down.
* @qmi_hdl: QMI client handle
* @qmi_svc: QMI service handle
*
* Returns: None
*/
static void
os_if_qmi_wfds_del_server(struct qmi_handle *qmi_hdl,
struct qmi_service *qmi_svc)
{
}
static struct qmi_msg_handler qmi_wfds_msg_handler[] = {
{
.type = QMI_INDICATION,
.msg_id = QMI_WFDS_MEM_REQ_V01,
.ei = wfds_mem_ind_msg_v01_ei,
.decoded_size = sizeof(struct wfds_mem_ind_msg_v01),
.fn = os_if_qmi_wfds_request_mem_ind_cb
},
{
.type = QMI_INDICATION,
.msg_id = QMI_WFDS_IPCC_MAP_N_CFG_IND_V01,
.ei = wfds_ipcc_map_n_cfg_ind_msg_v01_ei,
.decoded_size = sizeof(struct wfds_ipcc_map_n_cfg_ind_msg_v01),
.fn = os_if_wfds_ipcc_map_n_cfg_ind_cb
},
};
static struct qmi_ops qmi_wfds_ops = {
.new_server = os_if_qmi_wfds_new_server,
.del_server = os_if_qmi_wfds_del_server,
};
/**
* os_if_qmi_wfds_init() - Initialize WFDS QMI client
*
* Returns: QDF status
*/
static QDF_STATUS os_if_qmi_wfds_init(void)
{
QDF_STATUS status;
status = os_if_qmi_handle_init(&qmi_wfds, QMI_WFDS_MAX_RECV_BUF_SIZE,
&qmi_wfds_ops, qmi_wfds_msg_handler);
if (QDF_IS_STATUS_ERROR(status)) {
osif_err("WFDS QMI handle init failed");
return status;
}
status = os_if_qmi_add_lookup(&qmi_wfds, WFDS_SERVICE_ID_V01,
WFDS_SERVICE_VERS_V01,
QMI_WFDS_SERVICE_INS_ID_V01);
if (QDF_IS_STATUS_ERROR(status)) {
osif_err("WFDS QMI add lookup failed");
os_if_qmi_handle_release(&qmi_wfds);
return status;
}
return status;
}
/**
* os_if_qmi_wfds_deinit() - Deinitialize WFDS QMI client
*
* Returns: None
*/
static void os_if_qmi_wfds_deinit(void)
{
os_if_qmi_handle_release(&qmi_wfds);
}
void os_if_qmi_wfds_register_callbacks(struct wlan_qmi_psoc_callbacks *cb_obj)
{
cb_obj->qmi_wfds_init = os_if_qmi_wfds_init;
cb_obj->qmi_wfds_deinit = os_if_qmi_wfds_deinit;
cb_obj->qmi_wfds_send_config_msg = os_if_qmi_wfds_send_config_msg;
cb_obj->qmi_wfds_send_req_mem_msg = os_if_qmi_wfds_send_req_mem_msg;
cb_obj->qmi_wfds_send_ipcc_map_n_cfg_msg =
os_if_qmi_wfds_ipcc_map_n_cfg_msg;
}

查看文件

@@ -0,0 +1,489 @@
/*
* Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "os_if_qmi_wifi_driver_service_v01.h"
#include <linux/module.h>
struct qmi_elem_info wfds_gen_resp_msg_v01_ei[] = {
{
.data_type = QMI_STRUCT,
.elem_len = 1,
.elem_size = sizeof(struct qmi_response_type_v01),
.array_type = NO_ARRAY,
.tlv_type = 0x02,
.offset = offsetof(struct wfds_gen_resp_msg_v01,
resp),
.ei_array = qmi_response_type_v01_ei,
},
{
.data_type = QMI_EOTI,
.array_type = NO_ARRAY,
.tlv_type = QMI_COMMON_TLV_TYPE,
},
};
static struct qmi_elem_info wifi_drv_qmi_srng_information_v01_ei[] = {
{
.data_type = QMI_UNSIGNED_1_BYTE,
.elem_len = 1,
.elem_size = sizeof(u8),
.array_type = NO_ARRAY,
.tlv_type = 0,
.offset = offsetof(struct wifi_drv_qmi_srng_information_v01,
ring_id),
},
{
.data_type = QMI_SIGNED_4_BYTE_ENUM,
.elem_len = 1,
.elem_size = sizeof(enum wifi_drv_qmi_srng_direction_v01),
.array_type = NO_ARRAY,
.tlv_type = 0,
.offset = offsetof(struct wifi_drv_qmi_srng_information_v01,
dir),
},
{
.data_type = QMI_UNSIGNED_4_BYTE,
.elem_len = 1,
.elem_size = sizeof(u32),
.array_type = NO_ARRAY,
.tlv_type = 0,
.offset = offsetof(struct wifi_drv_qmi_srng_information_v01,
num_entries),
},
{
.data_type = QMI_UNSIGNED_4_BYTE,
.elem_len = 1,
.elem_size = sizeof(u32),
.array_type = NO_ARRAY,
.tlv_type = 0,
.offset = offsetof(struct wifi_drv_qmi_srng_information_v01,
entry_size),
},
{
.data_type = QMI_UNSIGNED_8_BYTE,
.elem_len = 1,
.elem_size = sizeof(u64),
.array_type = NO_ARRAY,
.tlv_type = 0,
.offset = offsetof(struct wifi_drv_qmi_srng_information_v01,
ring_base_paddr),
},
{
.data_type = QMI_UNSIGNED_8_BYTE,
.elem_len = 1,
.elem_size = sizeof(u64),
.array_type = NO_ARRAY,
.tlv_type = 0,
.offset = offsetof(struct wifi_drv_qmi_srng_information_v01,
hp_paddr),
},
{
.data_type = QMI_UNSIGNED_8_BYTE,
.elem_len = 1,
.elem_size = sizeof(u64),
.array_type = NO_ARRAY,
.tlv_type = 0,
.offset = offsetof(struct wifi_drv_qmi_srng_information_v01,
tp_paddr),
},
{
.data_type = QMI_EOTI,
.array_type = NO_ARRAY,
.tlv_type = QMI_COMMON_TLV_TYPE,
},
};
static struct qmi_elem_info wifi_drv_qmi_ce_information_v01_ei[] = {
{
.data_type = QMI_UNSIGNED_1_BYTE,
.elem_len = 1,
.elem_size = sizeof(u8),
.array_type = NO_ARRAY,
.tlv_type = 0,
.offset = offsetof(struct wifi_drv_qmi_ce_information_v01,
ce_id),
},
{
.data_type = QMI_SIGNED_4_BYTE_ENUM,
.elem_len = 1,
.elem_size = sizeof(enum wifi_drv_qmi_pipe_dir_v01),
.array_type = NO_ARRAY,
.tlv_type = 0,
.offset = offsetof(struct wifi_drv_qmi_ce_information_v01,
ce_dir),
},
{
.data_type = QMI_STRUCT,
.elem_len = 1,
.elem_size = sizeof(struct wifi_drv_qmi_srng_information_v01),
.array_type = NO_ARRAY,
.tlv_type = 0,
.offset = offsetof(struct wifi_drv_qmi_ce_information_v01,
srng_info),
.ei_array = wifi_drv_qmi_srng_information_v01_ei,
},
{
.data_type = QMI_EOTI,
.array_type = NO_ARRAY,
.tlv_type = QMI_COMMON_TLV_TYPE,
},
};
struct qmi_elem_info wfds_config_req_msg_v01_ei[] = {
{
.data_type = QMI_DATA_LEN,
.elem_len = 1,
.elem_size = sizeof(u8),
.array_type = NO_ARRAY,
.tlv_type = 0x01,
.offset = offsetof(struct wfds_config_req_msg_v01,
ce_info_len),
},
{
.data_type = QMI_STRUCT,
.elem_len = WFDS_CE_MAX_SRNG_V01,
.elem_size = sizeof(struct wifi_drv_qmi_ce_information_v01),
.array_type = VAR_LEN_ARRAY,
.tlv_type = 0x01,
.offset = offsetof(struct wfds_config_req_msg_v01,
ce_info),
.ei_array = wifi_drv_qmi_ce_information_v01_ei,
},
{
.data_type = QMI_STRUCT,
.elem_len = 1,
.elem_size = sizeof(struct wifi_drv_qmi_srng_information_v01),
.array_type = NO_ARRAY,
.tlv_type = 0x02,
.offset = offsetof(struct wfds_config_req_msg_v01,
rx_refill_ring),
.ei_array = wifi_drv_qmi_srng_information_v01_ei,
},
{
.data_type = QMI_UNSIGNED_8_BYTE,
.elem_len = 1,
.elem_size = sizeof(u64),
.array_type = NO_ARRAY,
.tlv_type = 0x03,
.offset = offsetof(struct wfds_config_req_msg_v01,
shadow_rdptr_mem_paddr),
},
{
.data_type = QMI_UNSIGNED_8_BYTE,
.elem_len = 1,
.elem_size = sizeof(u64),
.array_type = NO_ARRAY,
.tlv_type = 0x04,
.offset = offsetof(struct wfds_config_req_msg_v01,
shadow_rdptr_mem_size),
},
{
.data_type = QMI_UNSIGNED_8_BYTE,
.elem_len = 1,
.elem_size = sizeof(u64),
.array_type = NO_ARRAY,
.tlv_type = 0x05,
.offset = offsetof(struct wfds_config_req_msg_v01,
shadow_wrptr_mem_paddr),
},
{
.data_type = QMI_UNSIGNED_8_BYTE,
.elem_len = 1,
.elem_size = sizeof(u64),
.array_type = NO_ARRAY,
.tlv_type = 0x06,
.offset = offsetof(struct wfds_config_req_msg_v01,
shadow_wrptr_mem_size),
},
{
.data_type = QMI_UNSIGNED_4_BYTE,
.elem_len = 1,
.elem_size = sizeof(u32),
.array_type = NO_ARRAY,
.tlv_type = 0x07,
.offset = offsetof(struct wfds_config_req_msg_v01,
rx_pkt_tlv_len),
},
{
.data_type = QMI_UNSIGNED_4_BYTE,
.elem_len = 1,
.elem_size = sizeof(u32),
.array_type = NO_ARRAY,
.tlv_type = 0x08,
.offset = offsetof(struct wfds_config_req_msg_v01,
rx_rbm),
},
{
.data_type = QMI_UNSIGNED_8_BYTE,
.elem_len = 1,
.elem_size = sizeof(u64),
.array_type = NO_ARRAY,
.tlv_type = 0x09,
.offset = offsetof(struct wfds_config_req_msg_v01,
pcie_bar_pa),
},
{
.data_type = QMI_UNSIGNED_4_BYTE,
.elem_len = 1,
.elem_size = sizeof(u32),
.array_type = NO_ARRAY,
.tlv_type = 0x0A,
.offset = offsetof(struct wfds_config_req_msg_v01,
pci_slot),
},
{
.data_type = QMI_UNSIGNED_4_BYTE,
.elem_len = 1,
.elem_size = sizeof(u32),
.array_type = NO_ARRAY,
.tlv_type = 0x0B,
.offset = offsetof(struct wfds_config_req_msg_v01,
lpass_ep_id),
},
{
.data_type = QMI_EOTI,
.array_type = NO_ARRAY,
.tlv_type = QMI_COMMON_TLV_TYPE,
},
};
static struct qmi_elem_info wifi_drv_qmi_mem_arena_information_v01_ei[] = {
{
.data_type = QMI_UNSIGNED_2_BYTE,
.elem_len = 1,
.elem_size = sizeof(u16),
.array_type = NO_ARRAY,
.tlv_type = 0,
.offset = offsetof(struct wifi_drv_qmi_mem_arena_information_v01,
entry_size),
},
{
.data_type = QMI_UNSIGNED_2_BYTE,
.elem_len = 1,
.elem_size = sizeof(u16),
.array_type = NO_ARRAY,
.tlv_type = 0,
.offset = offsetof(struct wifi_drv_qmi_mem_arena_information_v01,
num_entries),
},
{
.data_type = QMI_EOTI,
.array_type = NO_ARRAY,
.tlv_type = QMI_COMMON_TLV_TYPE,
},
};
struct qmi_elem_info wfds_mem_ind_msg_v01_ei[] = {
{
.data_type = QMI_DATA_LEN,
.elem_len = 1,
.elem_size = sizeof(u8),
.array_type = NO_ARRAY,
.tlv_type = 0x01,
.offset = offsetof(struct wfds_mem_ind_msg_v01,
mem_arena_info_len),
},
{
.data_type = QMI_STRUCT,
.elem_len = WFDS_MEM_ARENA_MAX_V01,
.elem_size = sizeof(struct wifi_drv_qmi_mem_arena_information_v01),
.array_type = VAR_LEN_ARRAY,
.tlv_type = 0x01,
.offset = offsetof(struct wfds_mem_ind_msg_v01,
mem_arena_info),
.ei_array = wifi_drv_qmi_mem_arena_information_v01_ei,
},
{
.data_type = QMI_EOTI,
.array_type = NO_ARRAY,
.tlv_type = QMI_COMMON_TLV_TYPE,
},
};
static struct qmi_elem_info wifi_drv_qmi_mem_arena_page_information_v01_ei[] = {
{
.data_type = QMI_UNSIGNED_2_BYTE,
.elem_len = 1,
.elem_size = sizeof(u16),
.array_type = NO_ARRAY,
.tlv_type = 0,
.offset = offsetof(struct wifi_drv_qmi_mem_arena_page_information_v01,
num_entries_per_page),
},
{
.data_type = QMI_DATA_LEN,
.elem_len = 1,
.elem_size = sizeof(u8),
.array_type = NO_ARRAY,
.tlv_type = 0,
.offset = offsetof(struct wifi_drv_qmi_mem_arena_page_information_v01,
page_dma_addr_len),
},
{
.data_type = QMI_UNSIGNED_8_BYTE,
.elem_len = WFDS_PAGE_INFO_MAX_ARRAY_SIZE_V01,
.elem_size = sizeof(u64),
.array_type = VAR_LEN_ARRAY,
.tlv_type = 0,
.offset = offsetof(struct wifi_drv_qmi_mem_arena_page_information_v01,
page_dma_addr),
},
{
.data_type = QMI_EOTI,
.array_type = NO_ARRAY,
.tlv_type = QMI_COMMON_TLV_TYPE,
},
};
struct qmi_elem_info wfds_mem_req_msg_v01_ei[] = {
{
.data_type = QMI_DATA_LEN,
.elem_len = 1,
.elem_size = sizeof(u8),
.array_type = NO_ARRAY,
.tlv_type = 0x01,
.offset = offsetof(struct wfds_mem_req_msg_v01,
mem_arena_page_info_len),
},
{
.data_type = QMI_STRUCT,
.elem_len = WFDS_MEM_ARENA_MAX_V01,
.elem_size = sizeof(struct wifi_drv_qmi_mem_arena_page_information_v01),
.array_type = VAR_LEN_ARRAY,
.tlv_type = 0x01,
.offset = offsetof(struct wfds_mem_req_msg_v01,
mem_arena_page_info),
.ei_array = wifi_drv_qmi_mem_arena_page_information_v01_ei,
},
{
.data_type = QMI_EOTI,
.array_type = NO_ARRAY,
.tlv_type = QMI_COMMON_TLV_TYPE,
},
};
static struct qmi_elem_info wifi_drv_qmi_ipcc_information_v01_ei[] = {
{
.data_type = QMI_UNSIGNED_1_BYTE,
.elem_len = 1,
.elem_size = sizeof(u8),
.array_type = NO_ARRAY,
.tlv_type = 0,
.offset = offsetof(struct wifi_drv_qmi_ipcc_information_v01,
ce_id),
},
{
.data_type = QMI_UNSIGNED_8_BYTE,
.elem_len = 1,
.elem_size = sizeof(u64),
.array_type = NO_ARRAY,
.tlv_type = 0,
.offset = offsetof(struct wifi_drv_qmi_ipcc_information_v01,
ipcc_trig_addr),
},
{
.data_type = QMI_UNSIGNED_4_BYTE,
.elem_len = 1,
.elem_size = sizeof(u32),
.array_type = NO_ARRAY,
.tlv_type = 0,
.offset = offsetof(struct wifi_drv_qmi_ipcc_information_v01,
ipcc_trig_data),
},
{
.data_type = QMI_EOTI,
.array_type = NO_ARRAY,
.tlv_type = QMI_COMMON_TLV_TYPE,
},
};
struct qmi_elem_info wfds_ipcc_map_n_cfg_ind_msg_v01_ei[] = {
{
.data_type = QMI_DATA_LEN,
.elem_len = 1,
.elem_size = sizeof(u8),
.array_type = NO_ARRAY,
.tlv_type = 0x01,
.offset = offsetof(struct wfds_ipcc_map_n_cfg_ind_msg_v01,
ipcc_ce_info_len),
},
{
.data_type = QMI_STRUCT,
.elem_len = WFDS_CE_MAX_SRNG_V01,
.elem_size = sizeof(struct wifi_drv_qmi_ipcc_information_v01),
.array_type = VAR_LEN_ARRAY,
.tlv_type = 0x01,
.offset = offsetof(struct wfds_ipcc_map_n_cfg_ind_msg_v01,
ipcc_ce_info),
.ei_array = wifi_drv_qmi_ipcc_information_v01_ei,
},
{
.data_type = QMI_EOTI,
.array_type = NO_ARRAY,
.tlv_type = QMI_COMMON_TLV_TYPE,
},
};
struct qmi_elem_info wfds_ipcc_map_n_cfg_req_msg_v01_ei[] = {
{
.data_type = QMI_UNSIGNED_1_BYTE,
.elem_len = 1,
.elem_size = sizeof(u8),
.array_type = NO_ARRAY,
.tlv_type = 0x01,
.offset = offsetof(struct wfds_ipcc_map_n_cfg_req_msg_v01,
status),
},
{
.data_type = QMI_EOTI,
.array_type = NO_ARRAY,
.tlv_type = QMI_COMMON_TLV_TYPE,
},
};
struct qmi_elem_info wfds_misc_req_msg_v01_ei[] = {
{
.data_type = QMI_SIGNED_4_BYTE_ENUM,
.elem_len = 1,
.elem_size = sizeof(enum wifi_drv_qmi_event_v01),
.array_type = NO_ARRAY,
.tlv_type = 0x01,
.offset = offsetof(struct wfds_misc_req_msg_v01,
event),
},
{
.data_type = QMI_EOTI,
.array_type = NO_ARRAY,
.tlv_type = QMI_COMMON_TLV_TYPE,
},
};
struct qmi_elem_info wfds_misc_ind_msg_v01_ei[] = {
{
.data_type = QMI_SIGNED_4_BYTE_ENUM,
.elem_len = 1,
.elem_size = sizeof(enum wifi_drv_qmi_event_v01),
.array_type = NO_ARRAY,
.tlv_type = 0x01,
.offset = offsetof(struct wfds_misc_ind_msg_v01,
event),
},
{
.data_type = QMI_EOTI,
.array_type = NO_ARRAY,
.tlv_type = QMI_COMMON_TLV_TYPE,
},
};