qcacmn: Restructure and add new files in wmi layer

Add new directory structure and new files for
tlv and non-tlv implementation.
wmi layer shall not use global context of other layer,
remove global context and unused methods.

CRs-Fixed: 978547
Change-Id: I230f59052d9db8e1660cc087b09e03641227f490
This commit is contained in:
Govind Singh
2016-03-06 19:55:02 +05:30
parent 142cee4bf2
commit d88ae7fd2e
6 changed files with 599 additions and 360 deletions

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2013-2015 The Linux Foundation. All rights reserved. * Copyright (c) 2013-2016 The Linux Foundation. All rights reserved.
* *
* Previously licensed under the ISC license by Qualcomm Atheros, Inc. * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
* *
@@ -25,8 +25,6 @@
* to the Linux Foundation. * to the Linux Foundation.
*/ */
/* wmi_tlv_platform.c file will be different for different components like Pronto firmware, Pronto windows host driver,
Pronto LA host driver because their memory management functions are different */
#include "wmi_tlv_platform.c" #include "wmi_tlv_platform.c"
#include "wmi_tlv_defs.h" #include "wmi_tlv_defs.h"
#include "wmi_version.h" #include "wmi_version.h"
@@ -41,15 +39,19 @@
#define WMITLV_GET_TAG_ARRAY_SIZE(val) ((val >> 21) & 0x000001FF) #define WMITLV_GET_TAG_ARRAY_SIZE(val) ((val >> 21) & 0x000001FF)
#define WMITLV_GET_TAG_VARIED(val) ((val >> 30) & 0x00000001) #define WMITLV_GET_TAG_VARIED(val) ((val >> 30) & 0x00000001)
#define WMITLV_SET_ATTRB0(id) ((WMITLV_GET_TAG_NUM_TLV_ATTRIB(id) << 24) | (id & 0x00FFFFFF)) #define WMITLV_SET_ATTRB0(id) ((WMITLV_GET_TAG_NUM_TLV_ATTRIB(id) << 24) | \
#define WMITLV_SET_ATTRB1(tagID, tagStructSize, tagArraySize, tagVaried) (((tagVaried&0x1)<<30) | ((tagArraySize&0x1FF)<<21) | ((tagStructSize&0x1FF)<<12) | (tagID&0xFFF)) (id & 0x00FFFFFF))
#define WMITLV_SET_ATTRB1(tagID, tagStructSize, tagArraySize, tagVaried) \
(((tagVaried&0x1)<<30) | ((tagArraySize&0x1FF)<<21) | \
((tagStructSize&0x1FF)<<12) | (tagID&0xFFF))
#define WMITLV_OP_SET_TLV_ATTRIB_macro(param_ptr, param_len, wmi_cmd_event_id, elem_tlv_tag, elem_struc_type, elem_name, var_len, arr_size) \ #define WMITLV_OP_SET_TLV_ATTRIB_macro(param_ptr, param_len, wmi_cmd_event_id, \
elem_tlv_tag, elem_struc_type, elem_name, var_len, arr_size) \
WMITLV_SET_ATTRB1(elem_tlv_tag, sizeof(elem_struc_type), arr_size, var_len), WMITLV_SET_ATTRB1(elem_tlv_tag, sizeof(elem_struc_type), arr_size, var_len),
#define WMITLV_GET_CMD_EVT_ATTRB_LIST(id) \ #define WMITLV_GET_CMD_EVT_ATTRB_LIST(id) \
WMITLV_SET_ATTRB0(id), \ WMITLV_SET_ATTRB0(id), \
WMITLV_TABLE(id,SET_TLV_ATTRIB,NULL,0) WMITLV_TABLE(id,SET_TLV_ATTRIB, NULL, 0)
A_UINT32 cmd_attr_list[] = { A_UINT32 cmd_attr_list[] = {
WMITLV_ALL_CMD_LIST(WMITLV_GET_CMD_EVT_ATTRB_LIST) WMITLV_ALL_CMD_LIST(WMITLV_GET_CMD_EVT_ATTRB_LIST)
@@ -60,21 +62,26 @@ A_UINT32 evt_attr_list[] = {
}; };
#ifdef NO_DYNAMIC_MEM_ALLOC #ifdef NO_DYNAMIC_MEM_ALLOC
static wmitlv_cmd_param_info *g_wmi_static_cmd_param_info_buf = NULL; static wmitlv_cmd_param_info *g_wmi_static_cmd_param_info_buf;
A_UINT32 g_wmi_static_max_cmd_param_tlvs = 0; A_UINT32 g_wmi_static_max_cmd_param_tlvs;
#endif #endif
/* TLV helper routines */
/* /**
* WMI TLV Helper function to set the static cmd_param_tlv structure and number of TLVs that can be * wmitlv_set_static_param_tlv_buf() - tlv helper function
* accomodated in the structure. This function should be used when dynamic memory allocation is not * @param_tlv_buf: tlv buffer parameter
* supported. * @max_tlvs_accomodated: max no of tlv entries
* *
* When dynamic memory allocation is not supported by any component then NO_DYNAMIC_MEMALLOC *
* macro has to be defined in respective tlv_platform.c file. And respective component has to allocate * WMI TLV Helper function to set the static cmd_param_tlv structure
* cmd_param_tlv structure buffer to accomodate whatever number of TLV's. Both the buffer address * and number of TLVs that can be accomodated in the structure.
* and number of TLV's that can be accomodated in the buffer should be sent as arguments to this function. * This function should be used when dynamic memory allocation is not
* supported. When dynamic memory allocation is not supported by any
* component then NO_DYNAMIC_MEMALLOC macro has to be defined in respective
* tlv_platform.c file. And respective component has to allocate
* cmd_param_tlv structure buffer to accomodate whatever number of TLV's.
* Both the buffer address and number of TLV's that can be accomodated in
* the buffer should be sent as arguments to this function.
* *
* Return None * Return None
*/ */
@@ -88,9 +95,18 @@ wmitlv_set_static_param_tlv_buf(void *param_tlv_buf,
#endif #endif
} }
/* /**
* WMI TLV Helper functions to find the attributes of the Command/Event TLVs. * wmitlv_get_attributes() - tlv helper function
* Return 0 if success. Return >=1 if failure. * @is_cmd_id: boolean for command attribute
* @cmd_event_id: command event id
* @curr_tlv_order: tlv order
* @tlv_attr_ptr: pointer to tlv attribute
*
*
* WMI TLV Helper functions to find the attributes of the
* Command/Event TLVs.
*
* Return: 0 if success. Return >=1 if failure.
*/ */
A_UINT32 wmitlv_get_attributes(A_UINT32 is_cmd_id, A_UINT32 cmd_event_id, A_UINT32 wmitlv_get_attributes(A_UINT32 is_cmd_id, A_UINT32 cmd_event_id,
A_UINT32 curr_tlv_order, A_UINT32 curr_tlv_order,
@@ -112,7 +128,8 @@ A_UINT32 wmitlv_get_attributes(A_UINT32 is_cmd_id, A_UINT32 cmd_event_id,
if (WMITLV_GET_CMDID(cmd_event_id) == if (WMITLV_GET_CMDID(cmd_event_id) ==
WMITLV_GET_CMDID(pAttrArrayList[i])) { WMITLV_GET_CMDID(pAttrArrayList[i])) {
tlv_attr_ptr->cmd_num_tlv = num_tlvs; tlv_attr_ptr->cmd_num_tlv = num_tlvs;
/* Return success from here when only number of TLVS for this command/event is required */ /* Return success from here when only number of TLVS for
* this command/event is required */
if (curr_tlv_order == WMITLV_GET_ATTRIB_NUM_TLVS) { if (curr_tlv_order == WMITLV_GET_ATTRIB_NUM_TLVS) {
wmi_tlv_print_verbose wmi_tlv_print_verbose
("%s: WMI TLV attribute definitions for %s:0x%x found; num_of_tlvs:%d\n", ("%s: WMI TLV attribute definitions for %s:0x%x found; num_of_tlvs:%d\n",
@@ -121,7 +138,8 @@ A_UINT32 wmitlv_get_attributes(A_UINT32 is_cmd_id, A_UINT32 cmd_event_id,
return 0; return 0;
} }
/* Return failure if tlv_order is more than the expected number of TLVs */ /* Return failure if tlv_order is more than the expected
* number of TLVs */
if (curr_tlv_order >= num_tlvs) { if (curr_tlv_order >= num_tlvs) {
wmi_tlv_print_error wmi_tlv_print_error
("%s: ERROR: TLV order %d greater than num_of_tlvs:%d for %s:0x%x\n", ("%s: ERROR: TLV order %d greater than num_of_tlvs:%d for %s:0x%x\n",
@@ -163,10 +181,18 @@ A_UINT32 wmitlv_get_attributes(A_UINT32 is_cmd_id, A_UINT32 cmd_event_id,
return 1; return 1;
} }
/* /**
* Helper Function to vaidate the prepared TLV's for an WMI event/command to be sent * wmitlv_check_tlv_params() - tlv helper function
* Return 0 if success. * @os_handle: os context handle
* <0 if failure. * @param_struc_ptr: pointer to tlv structure
* @is_cmd_id: boolean for command attribute
* @wmi_cmd_event_id: command event id
*
*
* Helper Function to vaidate the prepared TLV's for
* an WMI event/command to be sent.
*
* Return: 0 if success. Return < 0 if failure.
*/ */
static int static int
wmitlv_check_tlv_params(void *os_handle, void *param_struc_ptr, wmitlv_check_tlv_params(void *os_handle, void *param_struc_ptr,
@@ -178,6 +204,7 @@ wmitlv_check_tlv_params(void *os_handle, void *param_struc_ptr,
A_UINT32 tlv_index = 0; A_UINT32 tlv_index = 0;
A_UINT8 *buf_ptr = (unsigned char *)param_struc_ptr; A_UINT8 *buf_ptr = (unsigned char *)param_struc_ptr;
A_UINT32 expected_num_tlvs, expected_tlv_len; A_UINT32 expected_num_tlvs, expected_tlv_len;
A_INT32 error = -1;
/* Get the number of TLVs for this command/event */ /* Get the number of TLVs for this command/event */
if (wmitlv_get_attributes if (wmitlv_get_attributes
@@ -251,7 +278,9 @@ wmitlv_check_tlv_params(void *os_handle, void *param_struc_ptr,
expected_tlv_len = expected_tlv_len =
attr_struct_ptr.tag_array_size * attr_struct_ptr.tag_array_size *
attr_struct_ptr.tag_struct_size; attr_struct_ptr.tag_struct_size;
/* Paddding is only required for Byte array Tlvs all other array tlv's should be aligned to 4 bytes during their definition */ /* Paddding is only required for Byte array Tlvs all other
* array tlv's should be aligned to 4 bytes during their
* definition */
if (WMITLV_TAG_ARRAY_BYTE == if (WMITLV_TAG_ARRAY_BYTE ==
attr_struct_ptr.tag_id) { attr_struct_ptr.tag_id) {
expected_tlv_len = expected_tlv_len =
@@ -278,8 +307,9 @@ wmitlv_check_tlv_params(void *os_handle, void *param_struc_ptr,
goto Error_wmitlv_check_tlv_params; goto Error_wmitlv_check_tlv_params;
} }
/* Incase of variable length TLV's, there is no expectation on the length field so do whatever checking /* Incase of variable length TLV's, there is no expectation
you can depending on the TLV tag if TLV length is non-zero */ * on the length field so do whatever checking you can
* depending on the TLV tag if TLV length is non-zero */
if (curr_tlv_len != 0) { if (curr_tlv_len != 0) {
/* Verify TLV length is aligned to the size of structure */ /* Verify TLV length is aligned to the size of structure */
if ((curr_tlv_len % if ((curr_tlv_len %
@@ -345,8 +375,7 @@ wmitlv_check_tlv_params(void *os_handle, void *param_struc_ptr,
|| (curr_tlv_tag == || (curr_tlv_tag ==
WMITLV_TAG_ARRAY_BYTE) WMITLV_TAG_ARRAY_BYTE)
|| (curr_tlv_tag == || (curr_tlv_tag ==
WMITLV_TAG_ARRAY_FIXED_STRUC)) WMITLV_TAG_ARRAY_FIXED_STRUC)) {
{
/* Nothing to verify here */ /* Nothing to verify here */
} else { } else {
wmi_tlv_print_error wmi_tlv_print_error
@@ -392,30 +421,47 @@ wmitlv_check_tlv_params(void *os_handle, void *param_struc_ptr,
__func__, wmi_cmd_event_id, tlv_index, expected_num_tlvs); __func__, wmi_cmd_event_id, tlv_index, expected_num_tlvs);
} }
return (0); return 0;
Error_wmitlv_check_tlv_params: Error_wmitlv_check_tlv_params:
return (-1); return error;
} }
/* /**
* Helper Function to vaidate the prepared TLV's for an WMI event to be sent * wmitlv_check_event_tlv_params() - tlv helper function
* Return 0 if success. * @os_handle: os context handle
* <0 if failure. * @param_struc_ptr: pointer to tlv structure
* @is_cmd_id: boolean for command attribute
* @wmi_cmd_event_id: command event id
*
*
* Helper Function to vaidate the prepared TLV's for
* an WMI event/command to be sent.
*
* Return: 0 if success. Return < 0 if failure.
*/ */
int int
wmitlv_check_event_tlv_params(void *os_handle, void *param_struc_ptr, wmitlv_check_event_tlv_params(void *os_handle, void *param_struc_ptr,
A_UINT32 param_buf_len, A_UINT32 wmi_cmd_event_id) A_UINT32 param_buf_len, A_UINT32 wmi_cmd_event_id)
{ {
A_UINT32 is_cmd_id = 0; A_UINT32 is_cmd_id = 0;
return (wmitlv_check_tlv_params
return wmitlv_check_tlv_params
(os_handle, param_struc_ptr, param_buf_len, is_cmd_id, (os_handle, param_struc_ptr, param_buf_len, is_cmd_id,
wmi_cmd_event_id)); wmi_cmd_event_id);
} }
/* /**
* Helper Function to vaidate the prepared TLV's for an WMI command to be sent * wmitlv_check_command_tlv_params() - tlv helper function
* Return 0 if success. * @os_handle: os context handle
* <0 if failure. * @param_struc_ptr: pointer to tlv structure
* @is_cmd_id: boolean for command attribute
* @wmi_cmd_event_id: command event id
*
*
* Helper Function to vaidate the prepared TLV's for
* an WMI event/command to be sent.
*
* Return: 0 if success. Return < 0 if failure.
*/ */
int int
wmitlv_check_command_tlv_params(void *os_handle, void *param_struc_ptr, wmitlv_check_command_tlv_params(void *os_handle, void *param_struc_ptr,
@@ -423,15 +469,26 @@ wmitlv_check_command_tlv_params(void *os_handle, void *param_struc_ptr,
A_UINT32 wmi_cmd_event_id) A_UINT32 wmi_cmd_event_id)
{ {
A_UINT32 is_cmd_id = 1; A_UINT32 is_cmd_id = 1;
return (wmitlv_check_tlv_params
return wmitlv_check_tlv_params
(os_handle, param_struc_ptr, param_buf_len, is_cmd_id, (os_handle, param_struc_ptr, param_buf_len, is_cmd_id,
wmi_cmd_event_id)); wmi_cmd_event_id);
} }
/* /**
* Helper Function to vaidate the TLV's coming for an event/command and also pads data to TLV's if necessary * wmitlv_check_and_pad_tlvs() - tlv helper function
* Return 0 if success. * @os_handle: os context handle
<0 if failure. * @param_buf_len: length of tlv parameter
* @param_struc_ptr: pointer to tlv structure
* @is_cmd_id: boolean for command attribute
* @wmi_cmd_event_id: command event id
* @wmi_cmd_struct_ptr: wmi command structure
*
*
* vaidate the TLV's coming for an event/command and
* also pads data to TLV's if necessary
*
* Return: 0 if success. Return < 0 if failure.
*/ */
static int static int
wmitlv_check_and_pad_tlvs(void *os_handle, void *param_struc_ptr, wmitlv_check_and_pad_tlvs(void *os_handle, void *param_struc_ptr,
@@ -447,6 +504,7 @@ wmitlv_check_and_pad_tlvs(void *os_handle, void *param_struc_ptr,
wmitlv_cmd_param_info *cmd_param_tlvs_ptr = NULL; wmitlv_cmd_param_info *cmd_param_tlvs_ptr = NULL;
A_UINT32 remaining_expected_tlvs = 0xFFFFFFFF; A_UINT32 remaining_expected_tlvs = 0xFFFFFFFF;
A_UINT32 len_wmi_cmd_struct_buf; A_UINT32 len_wmi_cmd_struct_buf;
A_INT32 error = -1;
/* Get the number of TLVs for this command/event */ /* Get the number of TLVs for this command/event */
if (wmitlv_get_attributes if (wmitlv_get_attributes
@@ -455,7 +513,7 @@ wmitlv_check_and_pad_tlvs(void *os_handle, void *param_struc_ptr,
wmi_tlv_print_error wmi_tlv_print_error
("%s: ERROR: Couldn't get expected number of TLVs for Cmd=%d\n", ("%s: ERROR: Couldn't get expected number of TLVs for Cmd=%d\n",
__func__, wmi_cmd_event_id); __func__, wmi_cmd_event_id);
return -1; return error;
} }
/* NOTE: the returned number of TLVs is in "attr_struct_ptr.cmd_num_tlv" */ /* NOTE: the returned number of TLVs is in "attr_struct_ptr.cmd_num_tlv" */
@@ -467,8 +525,10 @@ wmitlv_check_and_pad_tlvs(void *os_handle, void *param_struc_ptr,
wmi_tlv_os_mem_alloc(os_handle, *wmi_cmd_struct_ptr, wmi_tlv_os_mem_alloc(os_handle, *wmi_cmd_struct_ptr,
len_wmi_cmd_struct_buf); len_wmi_cmd_struct_buf);
#else #else
/* Dynamic memory allocation is not supported. Use the buffer g_wmi_static_cmd_param_info_buf, which should be set using wmi_tlv_set_static_param_tlv_buf(), /* Dynamic memory allocation is not supported. Use the buffer
for base structure of format wmi_cmd_event_id##_param_tlvs */ * g_wmi_static_cmd_param_info_buf, which should be set using
* wmi_tlv_set_static_param_tlv_buf(),
* for base structure of format wmi_cmd_event_id##_param_tlvs */
*wmi_cmd_struct_ptr = g_wmi_static_cmd_param_info_buf; *wmi_cmd_struct_ptr = g_wmi_static_cmd_param_info_buf;
if (attr_struct_ptr.cmd_num_tlv > g_wmi_static_max_cmd_param_tlvs) { if (attr_struct_ptr.cmd_num_tlv > g_wmi_static_max_cmd_param_tlvs) {
/* Error: Expecting more TLVs that accomodated for static structure */ /* Error: Expecting more TLVs that accomodated for static structure */
@@ -476,7 +536,7 @@ wmitlv_check_and_pad_tlvs(void *os_handle, void *param_struc_ptr,
("%s: Error: Expecting more TLVs that accomodated for static structure. Expected:%d Accomodated:%d\n", ("%s: Error: Expecting more TLVs that accomodated for static structure. Expected:%d Accomodated:%d\n",
__func__, attr_struct_ptr.cmd_num_tlv, __func__, attr_struct_ptr.cmd_num_tlv,
g_wmi_static_max_cmd_param_tlvs); g_wmi_static_max_cmd_param_tlvs);
return -1; return error;
} }
#endif #endif
if (*wmi_cmd_struct_ptr == NULL) { if (*wmi_cmd_struct_ptr == NULL) {
@@ -484,7 +544,7 @@ wmitlv_check_and_pad_tlvs(void *os_handle, void *param_struc_ptr,
wmi_tlv_print_error wmi_tlv_print_error
("%s: Error: unable to alloc memory (size=%d) for TLV\n", ("%s: Error: unable to alloc memory (size=%d) for TLV\n",
__func__, len_wmi_cmd_struct_buf); __func__, len_wmi_cmd_struct_buf);
return -1; return error;
} }
cmd_param_tlvs_ptr = (wmitlv_cmd_param_info *) *wmi_cmd_struct_ptr; cmd_param_tlvs_ptr = (wmitlv_cmd_param_info *) *wmi_cmd_struct_ptr;
@@ -603,9 +663,12 @@ wmitlv_check_and_pad_tlvs(void *os_handle, void *param_struc_ptr,
A_UINT32 i; A_UINT32 i;
if (attr_struct_ptr.tag_varied_size == WMITLV_SIZE_FIX) { if (attr_struct_ptr.tag_varied_size == WMITLV_SIZE_FIX) {
/* This is not allowed. The tag WMITLV_TAG_ARRAY_STRUC can only be used with variable-length structure array /* This is not allowed. The tag WMITLV_TAG_ARRAY_STRUC can
should not have a fixed number of elements (contradicting). Use WMITLV_TAG_ARRAY_FIXED_STRUC tag for * only be used with variable-length structure array
fixed size structure array(where structure never change without breaking compatibility) */ * should not have a fixed number of elements (contradicting).
* Use WMITLV_TAG_ARRAY_FIXED_STRUC tag for fixed size
* structure array(where structure never change without
* breaking compatibility) */
wmi_tlv_print_error wmi_tlv_print_error
("%s: ERROR: TLV (tag=%d) should be variable-length and not fixed length\n", ("%s: ERROR: TLV (tag=%d) should be variable-length and not fixed length\n",
__func__, curr_tlv_tag); __func__, curr_tlv_tag);
@@ -642,8 +705,9 @@ wmitlv_check_and_pad_tlvs(void *os_handle, void *param_struc_ptr,
tlv_buf_ptr = (A_UINT8 *) new_tlv_buf; tlv_buf_ptr = (A_UINT8 *) new_tlv_buf;
for (i = 0; i < num_of_elems; i++) { for (i = 0; i < num_of_elems; i++) {
if (tlv_size_diff > 0) { if (tlv_size_diff > 0) {
/* Incoming structure size is greater than expected structure size. /* Incoming structure size is greater than expected
so copy the number of bytes equal to expected structure size */ * structure size. so copy the number of bytes equal
* to expected structure size */
wmi_tlv_OS_MEMCPY(tlv_buf_ptr, wmi_tlv_OS_MEMCPY(tlv_buf_ptr,
(void *)(buf_ptr + (void *)(buf_ptr +
i * i *
@@ -651,9 +715,9 @@ wmitlv_check_and_pad_tlvs(void *os_handle, void *param_struc_ptr,
attr_struct_ptr. attr_struct_ptr.
tag_struct_size); tag_struct_size);
} else { } else {
/* Incoming structure size is smaller than expected structure size. /* Incoming structure size is smaller than expected
so copy the number of bytes equal to incoming structure size * structure size. so copy the number of bytes equal
(other bytes would be zeroes) */ * to incoming structure size */
wmi_tlv_OS_MEMCPY(tlv_buf_ptr, wmi_tlv_OS_MEMCPY(tlv_buf_ptr,
(void *)(buf_ptr + (void *)(buf_ptr +
i * i *
@@ -669,12 +733,14 @@ wmitlv_check_and_pad_tlvs(void *os_handle, void *param_struc_ptr,
A_UINT32 buf_mov_len; A_UINT32 buf_mov_len;
if (tlv_size_diff < 0) { if (tlv_size_diff < 0) {
/* Incoming structure size is smaller than expected size then this needs padding for each element in the array */ /* Incoming structure size is smaller than expected size
* then this needs padding for each element in the array */
/* Find amount of bytes to be padded for one element */ /* Find amount of bytes to be padded for one element */
num_padding_bytes = tlv_size_diff * -1; num_padding_bytes = tlv_size_diff * -1;
/* Move subsequent TLVs by number of bytes to be padded for all elements */ /* Move subsequent TLVs by number of bytes to be padded
* for all elements */
if (param_buf_len > if (param_buf_len >
(buf_idx + curr_tlv_len)) { (buf_idx + curr_tlv_len)) {
src_addr = src_addr =
@@ -692,13 +758,16 @@ wmitlv_check_and_pad_tlvs(void *os_handle, void *param_struc_ptr,
buf_mov_len); buf_mov_len);
} }
/* Move subsequent elements of array down by number of bytes to be padded for one element and alse set padding bytes to zero */ /* Move subsequent elements of array down by number of
* bytes to be padded for one element and alse set
* padding bytes to zero */
tlv_buf_ptr = buf_ptr; tlv_buf_ptr = buf_ptr;
for (i = 0; i < num_of_elems; i++) { for (i = 0; i < num_of_elems; i++) {
src_addr = src_addr =
tlv_buf_ptr + in_tlv_len; tlv_buf_ptr + in_tlv_len;
if (i != (num_of_elems - 1)) { if (i != (num_of_elems - 1)) {
/* Need not move anything for last element in the array */ /* Need not move anything for last element
* in the array */
dst_addr = dst_addr =
tlv_buf_ptr + tlv_buf_ptr +
in_tlv_len + in_tlv_len +
@@ -722,18 +791,21 @@ wmitlv_check_and_pad_tlvs(void *os_handle, void *param_struc_ptr,
tag_struct_size; tag_struct_size;
} }
/* Update the number of padding bytes to total number of bytes padded for all elements in the array */ /* Update the number of padding bytes to total number
* of bytes padded for all elements in the array */
num_padding_bytes = num_padding_bytes =
num_padding_bytes * num_of_elems; num_padding_bytes * num_of_elems;
new_tlv_buf = buf_ptr; new_tlv_buf = buf_ptr;
} else { } else {
/* Incoming structure size is greater than expected size then this needs shrinking for each element in the array */ /* Incoming structure size is greater than expected size
* then this needs shrinking for each element in the array */
/* Find amount of bytes to be shrinked for one element */ /* Find amount of bytes to be shrinked for one element */
num_padding_bytes = tlv_size_diff * -1; num_padding_bytes = tlv_size_diff * -1;
/* Move subsequent elements of array up by number of bytes to be shrinked for one element */ /* Move subsequent elements of array up by number of bytes
* to be shrinked for one element */
tlv_buf_ptr = buf_ptr; tlv_buf_ptr = buf_ptr;
for (i = 0; i < (num_of_elems - 1); i++) { for (i = 0; i < (num_of_elems - 1); i++) {
src_addr = src_addr =
@@ -754,7 +826,8 @@ wmitlv_check_and_pad_tlvs(void *os_handle, void *param_struc_ptr,
tag_struct_size; tag_struct_size;
} }
/* Move subsequent TLVs by number of bytes to be shrinked for all elements */ /* Move subsequent TLVs by number of bytes to be shrinked
* for all elements */
if (param_buf_len > if (param_buf_len >
(buf_idx + curr_tlv_len)) { (buf_idx + curr_tlv_len)) {
src_addr = src_addr =
@@ -772,7 +845,8 @@ wmitlv_check_and_pad_tlvs(void *os_handle, void *param_struc_ptr,
buf_mov_len); buf_mov_len);
} }
/* Update the number of padding bytes to total number of bytes shrinked for all elements in the array */ /* Update the number of padding bytes to total number of
* bytes shrinked for all elements in the array */
num_padding_bytes = num_padding_bytes =
num_padding_bytes * num_of_elems; num_padding_bytes * num_of_elems;
@@ -824,8 +898,9 @@ wmitlv_check_and_pad_tlvs(void *os_handle, void *param_struc_ptr,
wmi_tlv_OS_MEMCPY(new_tlv_buf, (void *)buf_ptr, wmi_tlv_OS_MEMCPY(new_tlv_buf, (void *)buf_ptr,
curr_tlv_len); curr_tlv_len);
#else #else
/* Dynamic memory allocation is not supported. Padding has to be done with in the existing buffer assuming we have enough space /* Dynamic memory allocation is not supported. Padding has
to grow */ * to be done with in the existing buffer assuming we have
* enough space to grow */
{ {
/* Note: tlv_size_diff is a value less than zero */ /* Note: tlv_size_diff is a value less than zero */
/* Move the Subsequent TLVs by amount of bytes needs to be padded */ /* Move the Subsequent TLVs by amount of bytes needs to be padded */
@@ -861,7 +936,7 @@ wmitlv_check_and_pad_tlvs(void *os_handle, void *param_struc_ptr,
buf_idx += curr_tlv_len + num_padding_bytes; buf_idx += curr_tlv_len + num_padding_bytes;
} }
return (0); return 0;
Error_wmitlv_check_and_pad_tlvs: Error_wmitlv_check_and_pad_tlvs:
if (is_cmd_id) { if (is_cmd_id) {
wmitlv_free_allocated_command_tlvs(wmi_cmd_event_id, wmitlv_free_allocated_command_tlvs(wmi_cmd_event_id,
@@ -871,13 +946,21 @@ Error_wmitlv_check_and_pad_tlvs:
wmi_cmd_struct_ptr); wmi_cmd_struct_ptr);
} }
*wmi_cmd_struct_ptr = NULL; *wmi_cmd_struct_ptr = NULL;
return (-1); return error;
} }
/* /**
* Helper Function to validate and pad(if necessary) for incoming WMI Event TLVs * wmitlv_check_and_pad_event_tlvs() - tlv helper function
* Return 0 if success. * @os_handle: os context handle
<0 if failure. * @param_struc_ptr: pointer to tlv structure
* @param_buf_len: length of tlv parameter
* @wmi_cmd_event_id: command event id
* @wmi_cmd_struct_ptr: wmi command structure
*
*
* validate and pad(if necessary) for incoming WMI Event TLVs
*
* Return: 0 if success. Return < 0 if failure.
*/ */
int int
wmitlv_check_and_pad_event_tlvs(void *os_handle, void *param_struc_ptr, wmitlv_check_and_pad_event_tlvs(void *os_handle, void *param_struc_ptr,
@@ -886,15 +969,23 @@ wmitlv_check_and_pad_event_tlvs(void *os_handle, void *param_struc_ptr,
void **wmi_cmd_struct_ptr) void **wmi_cmd_struct_ptr)
{ {
A_UINT32 is_cmd_id = 0; A_UINT32 is_cmd_id = 0;
return (wmitlv_check_and_pad_tlvs return wmitlv_check_and_pad_tlvs
(os_handle, param_struc_ptr, param_buf_len, is_cmd_id, (os_handle, param_struc_ptr, param_buf_len, is_cmd_id,
wmi_cmd_event_id, wmi_cmd_struct_ptr)); wmi_cmd_event_id, wmi_cmd_struct_ptr);
} }
/* /**
* Helper Function to validate and pad(if necessary) for incoming WMI Command TLVs * wmitlv_check_and_pad_command_tlvs() - tlv helper function
* Return 0 if success. * @os_handle: os context handle
<0 if failure. * @param_struc_ptr: pointer to tlv structure
* @param_buf_len: length of tlv parameter
* @wmi_cmd_event_id: command event id
* @wmi_cmd_struct_ptr: wmi command structure
*
*
* validate and pad(if necessary) for incoming WMI Command TLVs
*
* Return: 0 if success. Return < 0 if failure.
*/ */
int int
wmitlv_check_and_pad_command_tlvs(void *os_handle, void *param_struc_ptr, wmitlv_check_and_pad_command_tlvs(void *os_handle, void *param_struc_ptr,
@@ -903,14 +994,21 @@ wmitlv_check_and_pad_command_tlvs(void *os_handle, void *param_struc_ptr,
void **wmi_cmd_struct_ptr) void **wmi_cmd_struct_ptr)
{ {
A_UINT32 is_cmd_id = 1; A_UINT32 is_cmd_id = 1;
return (wmitlv_check_and_pad_tlvs return wmitlv_check_and_pad_tlvs
(os_handle, param_struc_ptr, param_buf_len, is_cmd_id, (os_handle, param_struc_ptr, param_buf_len, is_cmd_id,
wmi_cmd_event_id, wmi_cmd_struct_ptr)); wmi_cmd_event_id, wmi_cmd_struct_ptr);
} }
/* /**
* Helper Function to free any allocated buffers for WMI Event/Command TLV processing * wmitlv_free_allocated_tlvs() - tlv helper function
* Return None * @is_cmd_id: bollean to check if cmd or event tlv
* @cmd_event_id: command or event id
* @wmi_cmd_struct_ptr: wmi command structure
*
*
* free any allocated buffers for WMI Event/Command TLV processing
*
* Return: none
*/ */
static void wmitlv_free_allocated_tlvs(A_UINT32 is_cmd_id, static void wmitlv_free_allocated_tlvs(A_UINT32 is_cmd_id,
A_UINT32 cmd_event_id, A_UINT32 cmd_event_id,
@@ -965,9 +1063,15 @@ break;
return; return;
} }
/* /**
* Helper Function to free any allocated buffers for WMI Command TLV processing * wmitlv_free_allocated_command_tlvs() - tlv helper function
* Return None * @cmd_event_id: command or event id
* @wmi_cmd_struct_ptr: wmi command structure
*
*
* free any allocated buffers for WMI Event/Command TLV processing
*
* Return: none
*/ */
void wmitlv_free_allocated_command_tlvs(A_UINT32 cmd_event_id, void wmitlv_free_allocated_command_tlvs(A_UINT32 cmd_event_id,
void **wmi_cmd_struct_ptr) void **wmi_cmd_struct_ptr)
@@ -975,9 +1079,15 @@ void wmitlv_free_allocated_command_tlvs(A_UINT32 cmd_event_id,
wmitlv_free_allocated_tlvs(1, cmd_event_id, wmi_cmd_struct_ptr); wmitlv_free_allocated_tlvs(1, cmd_event_id, wmi_cmd_struct_ptr);
} }
/* /**
* Helper Function to free any allocated buffers for WMI Event TLV processing * wmitlv_free_allocated_event_tlvs() - tlv helper function
* Return None * @cmd_event_id: command or event id
* @wmi_cmd_struct_ptr: wmi command structure
*
*
* free any allocated buffers for WMI Event/Command TLV processing
*
* Return: none
*/ */
void wmitlv_free_allocated_event_tlvs(A_UINT32 cmd_event_id, void wmitlv_free_allocated_event_tlvs(A_UINT32 cmd_event_id,
void **wmi_cmd_struct_ptr) void **wmi_cmd_struct_ptr)
@@ -985,9 +1095,15 @@ void wmitlv_free_allocated_event_tlvs(A_UINT32 cmd_event_id,
wmitlv_free_allocated_tlvs(0, cmd_event_id, wmi_cmd_struct_ptr); wmitlv_free_allocated_tlvs(0, cmd_event_id, wmi_cmd_struct_ptr);
} }
/* /**
* Returns 1 if the two given versions are compatible. * wmi_versions_are_compatible() - tlv helper function
* Else return 0 if Incompatible. * @vers1: host wmi version
* @vers2: target wmi version
*
*
* check if two given wmi versions are compatible
*
* Return: none
*/ */
int int
wmi_versions_are_compatible(wmi_abi_version *vers1, wmi_abi_version *vers2) wmi_versions_are_compatible(wmi_abi_version *vers1, wmi_abi_version *vers2)
@@ -1008,9 +1124,17 @@ wmi_versions_are_compatible(wmi_abi_version *vers1, wmi_abi_version *vers2)
return 1; return 1;
} }
/* /**
* Returns 1 if the two given versions are compatible. * wmi_versions_can_downgrade() - tlv helper function
* Else return 0 if Incompatible. * @version_whitelist_table: version table
* @my_vers: host version
* @opp_vers: target version
* @out_vers: downgraded version
*
*
* check if target wmi version can be downgraded
*
* Return: 0 if success. Return < 0 if failure.
*/ */
int int
wmi_versions_can_downgrade(int num_whitelist, wmi_versions_can_downgrade(int num_whitelist,
@@ -1111,13 +1235,21 @@ wmi_versions_can_downgrade(int num_whitelist,
} }
} }
/* /**
* wmi_cmp_and_set_abi_version() - tlv helper function
* @version_whitelist_table: version table
* @my_vers: host version
* @opp_vers: target version
* @out_vers: downgraded version
*
* This routine will compare and set the WMI ABI version. * This routine will compare and set the WMI ABI version.
* First, compare my version with the opposite side's version. * First, compare my version with the opposite side's version.
* If incompatible, then check the whitelist to see if our side can downgrade. * If incompatible, then check the whitelist to see if our side can downgrade.
* Finally, fill in the final ABI version into the output, out_vers. * Finally, fill in the final ABI version into the output, out_vers.
* Return 0 if the output version is compatible . * Return 0 if the output version is compatible
* Else return 1 if the output version is incompatible. . * Else return 1 if the output version is incompatible
*
* Return: 0 if the output version is compatible else < 0.
*/ */
int int
wmi_cmp_and_set_abi_version(int num_whitelist, wmi_cmp_and_set_abi_version(int num_whitelist,

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2013-2014 The Linux Foundation. All rights reserved. * Copyright (c) 2013-2014, 2016 The Linux Foundation. All rights reserved.
* *
* Previously licensed under the ISC license by Qualcomm Atheros, Inc. * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
* *
@@ -36,12 +36,8 @@
#include "wmi.h" #include "wmi.h"
#include "wma.h" #include "wma.h"
/* QCA Main host has dynamic memory allocation and should not define NO_DYNAMIC_MEM_ALLOC */
/* #define NO_DYNAMIC_MEM_ALLOC */
/* Following macro definitions use OS or platform specific functions */ /* Following macro definitions use OS or platform specific functions */
/* Following macro definitions use QCA MAIN windows host driver(applicable for Perigrene and its future platforms,
Pronto and its future platforms) specific APIs */
#define dummy_print(fmt, ...) {} #define dummy_print(fmt, ...) {}
#define wmi_tlv_print_verbose dummy_print #define wmi_tlv_print_verbose dummy_print
#define wmi_tlv_print_error cdf_print #define wmi_tlv_print_error cdf_print

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2013-2014 The Linux Foundation. All rights reserved. * Copyright (c) 2013-2014, 2016 The Linux Foundation. All rights reserved.
* *
* Previously licensed under the ISC license by Qualcomm Atheros, Inc. * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
* *
@@ -34,5 +34,5 @@
*/ */
wmi_whitelist_version_info version_whitelist[] = { wmi_whitelist_version_info version_whitelist[] = {
{0, 0, 0x5F414351, 0x00004C4D, 0, 0} {0, 0, 0x5F414351, 0x00004C4D, 0, 0}
, /* Placeholder: Major=0, Minor=0, Namespace="QCA_ML" (Dummy entry) */ /* Placeholder: Major=0, Minor=0, Namespace="QCA_ML" (Dummy entry) */
}; };