Merge /local/mnt/workspace/naveen1/srcs/qcacld-3.0 into wlan-cmn.driver.lnx.2.0

Change-Id: I880638078022d6ce6898924b25bb02eb4593080d
Signed-off-by: Linux Build Service Account <lnxbuild@localhost>
This commit is contained in:
Linux Build Service Account
2021-11-22 11:37:30 +05:30
parent 0982d4f9ad
commit 7735770d6d
378 changed files with 0 additions and 200796 deletions

View File

@@ -1,79 +0,0 @@
/*
* Copyright (c) 2018 The Linux Foundation. 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.
*/
/**
* DOC: Declare private API which shall be used internally only
* in action_oui component. This file shall include prototypes of
* various notification handlers and logging functions.
*
* Note: This API should be never accessed out of action_oui component.
*/
#ifndef _WLAN_ACTION_OUI_MAIN_H_
#define _WLAN_ACTION_OUI_MAIN_H_
#include <qdf_types.h>
#include "wlan_action_oui_public_struct.h"
#include "wlan_action_oui_priv.h"
#include "wlan_action_oui_objmgr.h"
#define action_oui_log(level, args...) \
QDF_TRACE(QDF_MODULE_ID_ACTION_OUI, level, ## args)
#define action_oui_logfl(level, format, args...) \
action_oui_log(level, FL(format), ## args)
#define action_oui_fatal(format, args...) \
action_oui_logfl(QDF_TRACE_LEVEL_FATAL, format, ## args)
#define action_oui_err(format, args...) \
action_oui_logfl(QDF_TRACE_LEVEL_ERROR, format, ## args)
#define action_oui_warn(format, args...) \
action_oui_logfl(QDF_TRACE_LEVEL_WARN, format, ## args)
#define action_oui_info(format, args...) \
action_oui_logfl(QDF_TRACE_LEVEL_INFO, format, ## args)
#define action_oui_debug(format, args...) \
action_oui_logfl(QDF_TRACE_LEVEL_DEBUG, format, ## args)
#define ACTION_OUI_ENTER() action_oui_debug("enter")
#define ACTION_OUI_EXIT() action_oui_debug("exit")
/**
* action_oui_psoc_create_notification(): Handler for psoc create notify.
* @psoc: psoc which is going to be created by objmgr
* @arg: argument for notification handler.
*
* Allocate and attach psoc private object.
*
* Return: QDF_STATUS status in case of success else return error.
*/
QDF_STATUS
action_oui_psoc_create_notification(struct wlan_objmgr_psoc *psoc, void *arg);
/**
* action_oui_psoc_destroy_notification(): Handler for psoc destroy notify.
* @psoc: psoc which is going to be destroyed by objmgr
* @arg: argument for notification handler.
*
* Deallocate and detach psoc private object.
*
* Return QDF_STATUS status in case of success else return error
*/
QDF_STATUS
action_oui_psoc_destroy_notification(struct wlan_objmgr_psoc *psoc, void *arg);
#endif /* end of _WLAN_ACTION_OUI_MAIN_H_ */

View File

@@ -1,79 +0,0 @@
/*
* Copyright (c) 2018 The Linux Foundation. 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.
*/
/**
* DOC: This file contains various object manager related wrappers and helpers
*/
#ifndef _WLAN_ACTION_OUI_OBJMGR_H
#define _WLAN_ACTION_OUI_OBJMGR_H
#include "wlan_cmn.h"
#include "wlan_objmgr_cmn.h"
#include "wlan_objmgr_psoc_obj.h"
/**
* action_oui_psoc_get_ref() - Wrapper to increment action_oui ref count
* @psoc: psoc object
*
* Wrapper for action_oui to increment ref count after checking valid
* object state.
*
* Return: SUCCESS/FAILURE
*/
static inline
QDF_STATUS action_oui_psoc_get_ref(struct wlan_objmgr_psoc *psoc)
{
return wlan_objmgr_psoc_try_get_ref(psoc, WLAN_ACTION_OUI_ID);
}
/**
* action_oui_psoc_put_ref() - Wrapper to decrement action_oui ref count
* @psoc: psoc object
*
* Wrapper for action_oui to decrement ref count of psoc.
*
* Return: SUCCESS/FAILURE
*/
static inline
void action_oui_psoc_put_ref(struct wlan_objmgr_psoc *psoc)
{
return wlan_objmgr_psoc_release_ref(psoc, WLAN_ACTION_OUI_ID);
}
/**
* action_oui_psoc_get_priv(): Wrapper to retrieve psoc priv obj
* @psoc: psoc pointer
*
* Wrapper for action_oui to get psoc private object pointer.
*
* Return: Private object of psoc
*/
static inline struct action_oui_psoc_priv *
action_oui_psoc_get_priv(struct wlan_objmgr_psoc *psoc)
{
struct action_oui_psoc_priv *psoc_priv;
psoc_priv = wlan_objmgr_psoc_get_comp_private_obj(psoc,
WLAN_UMAC_COMP_ACTION_OUI);
QDF_BUG(psoc_priv);
return psoc_priv;
}
#endif /* _WLAN_ACTION_OUI_OBJMGR_H */

View File

@@ -1,147 +0,0 @@
/*
* Copyright (c) 2012-2018 The Linux Foundation. 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.
*/
/**
* DOC: Declare private API which shall be used internally only
* in action_oui component. This file shall include prototypes of
* action_oui parsing and send logic.
*
* Note: This API should be never accessed out of action_oui component.
*/
#ifndef _WLAN_ACTION_OUI_PRIV_STRUCT_H_
#define _WLAN_ACTION_OUI_PRIV_STRUCT_H_
#include <qdf_list.h>
#include <qdf_types.h>
#include "wlan_action_oui_public_struct.h"
#include "wlan_action_oui_tgt_api.h"
#include "wlan_action_oui_objmgr.h"
/**
* enum action_oui_token_type - String token types expected.
* @ACTION_OUI_TOKEN: oui string
* @ACTION_OUI_DATA_LENGTH_TOKEN: data length string
* @ACTION_OUI_DATA_TOKEN: OUI data string
* @ACTION_OUI_DATA_MASK_TOKEN: data mask string
* @ACTION_OUI_INFO_MASK_TOKEN: info mask string
* @ACTION_OUI_MAC_ADDR_TOKEN: mac addr string
* @ACTION_OUI_MAC_MASK_TOKEN: mac mask string
* @ACTION_OUI_CAPABILITY_TOKEN: capability string
* @ACTION_OUI_END_TOKEN: end of one oui extension
*/
enum action_oui_token_type {
ACTION_OUI_TOKEN = 1 << 0,
ACTION_OUI_DATA_LENGTH_TOKEN = 1 << 1,
ACTION_OUI_DATA_TOKEN = 1 << 2,
ACTION_OUI_DATA_MASK_TOKEN = 1 << 3,
ACTION_OUI_INFO_MASK_TOKEN = 1 << 4,
ACTION_OUI_MAC_ADDR_TOKEN = 1 << 5,
ACTION_OUI_MAC_MASK_TOKEN = 1 << 6,
ACTION_OUI_CAPABILITY_TOKEN = 1 << 7,
ACTION_OUI_END_TOKEN = 1 << 8,
};
/**
* struct action_oui_extension_priv - Private contents of extension.
* @item: list element
* @extension: Extension contents
*
* This structure encapsulates action_oui_extension and list item.
*/
struct action_oui_extension_priv {
qdf_list_node_t item;
struct action_oui_extension extension;
};
/**
* struct action_oui_priv - Each action info.
* @id: type of action
* @extension_list: list of extensions
* @extension_lock: lock to control access to @extension_list
*
* All extensions of action specified by action_id are stored
* at @extension_list as linked list.
*/
struct action_oui_priv {
enum action_oui_id id;
qdf_list_t extension_list;
qdf_mutex_t extension_lock;
};
/**
* struct action_oui_psoc_priv - Private object to be stored in psoc
* @psoc: pointer to psoc object
* @total_extensions: total count of extensions from all actions
* @oui_priv: array of pointers used to refer each action info
* @tx_ops: call-back functions to send OUIs to firmware
*/
struct action_oui_psoc_priv {
struct wlan_objmgr_psoc *psoc;
uint32_t total_extensions;
struct action_oui_priv *oui_priv[ACTION_OUI_MAXIMUM_ID];
struct action_oui_tx_ops tx_ops;
};
/**
* action_oui_parse() - Parse action oui string
* @psoc_priv: pointer to action_oui psoc priv obj
* @oui_string: string to be parsed
* @ation_id: type of the action to be parsed
*
* This function parses the action oui string, extracts extensions and
* stores them @action_oui_priv using list data structure.
*
* Return: QDF_STATUS
*
*/
QDF_STATUS
action_oui_parse(struct action_oui_psoc_priv *psoc_priv,
uint8_t *oui_string, enum action_oui_id action_id);
/**
* action_oui_send() - Send action oui extensions to target_if.
* @psoc_priv: pointer to action_oui psoc priv obj
* @ation_id: type of the action to be send
*
* This function sends action oui extensions to target_if.
*
* Return: QDF_STATUS
*
*/
QDF_STATUS
action_oui_send(struct action_oui_psoc_priv *psoc_priv,
enum action_oui_id action_id);
/**
* action_oui_search() - Check if Vendor OUIs are present in IE buffer
* @psoc_priv: pointer to action_oui psoc priv obj
* @attr: pointer to structure containing type of action, beacon IE data etc.,
* @action_id: type of action to be checked
*
* This function parses the IE buffer and finds if any of the vendor OUI
* and related attributes are present in it.
*
* Return: If vendor OUI is present return true else false
*/
bool
action_oui_search(struct action_oui_psoc_priv *psoc_priv,
struct action_oui_search_attr *attr,
enum action_oui_id action_id);
#endif /* End of _WLAN_ACTION_OUI_PRIV_STRUCT_H_ */

View File

@@ -1,198 +0,0 @@
/*
* Copyright (c) 2012-2018, 2020 The Linux Foundation. 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.
*/
/**
* DOC: Implement various notification handlers which are accessed
* internally in action_oui component only.
*/
#include "wlan_action_oui_main.h"
#include "wlan_action_oui_public_struct.h"
#include "wlan_action_oui_tgt_api.h"
#include "target_if_action_oui.h"
/**
* action_oui_allocate() - Allocates memory for various actions.
* @psoc_priv: pointer to action_oui psoc priv obj
*
* This function allocates memory for all the action_oui types
* and initializes the respective lists to store extensions
* extracted from action_oui_extract().
*
* Return: QDF_STATUS
*/
static QDF_STATUS
action_oui_allocate(struct action_oui_psoc_priv *psoc_priv)
{
struct action_oui_priv *oui_priv;
uint32_t i;
uint32_t j;
for (i = 0; i < ACTION_OUI_MAXIMUM_ID; i++) {
oui_priv = qdf_mem_malloc(sizeof(*oui_priv));
if (!oui_priv) {
action_oui_err("Mem alloc failed for oui_priv id: %u",
i);
goto free_mem;
}
oui_priv->id = i;
qdf_list_create(&oui_priv->extension_list,
ACTION_OUI_MAX_EXTENSIONS);
qdf_mutex_create(&oui_priv->extension_lock);
psoc_priv->oui_priv[i] = oui_priv;
}
return QDF_STATUS_SUCCESS;
free_mem:
for (j = 0; j < i; j++) {
oui_priv = psoc_priv->oui_priv[j];
if (!oui_priv)
continue;
qdf_list_destroy(&oui_priv->extension_list);
qdf_mutex_destroy(&oui_priv->extension_lock);
psoc_priv->oui_priv[j] = NULL;
}
return QDF_STATUS_E_NOMEM;
}
/**
* action_oui_destroy() - Deallocates memory for various actions.
* @psoc_priv: pointer to action_oui psoc priv obj
*
* This function Deallocates memory for all the action_oui types.
* As a part of deallocate, all extensions are destroyed.
*
* Return: None
*/
static void
action_oui_destroy(struct action_oui_psoc_priv *psoc_priv)
{
struct action_oui_priv *oui_priv;
struct action_oui_extension_priv *ext_priv;
qdf_list_t *ext_list;
QDF_STATUS status;
qdf_list_node_t *node = NULL;
uint32_t i;
psoc_priv->total_extensions = 0;
for (i = 0; i < ACTION_OUI_MAXIMUM_ID; i++) {
oui_priv = psoc_priv->oui_priv[i];
psoc_priv->oui_priv[i] = NULL;
if (!oui_priv)
continue;
ext_list = &oui_priv->extension_list;
qdf_mutex_acquire(&oui_priv->extension_lock);
while (!qdf_list_empty(ext_list)) {
status = qdf_list_remove_front(ext_list, &node);
if (!QDF_IS_STATUS_SUCCESS(status)) {
action_oui_err("Invalid delete in action: %u",
oui_priv->id);
break;
}
ext_priv = qdf_container_of(node,
struct action_oui_extension_priv,
item);
qdf_mem_free(ext_priv);
ext_priv = NULL;
}
qdf_list_destroy(ext_list);
qdf_mutex_release(&oui_priv->extension_lock);
qdf_mutex_destroy(&oui_priv->extension_lock);
qdf_mem_free(oui_priv);
oui_priv = NULL;
}
}
QDF_STATUS
action_oui_psoc_create_notification(struct wlan_objmgr_psoc *psoc, void *arg)
{
struct action_oui_psoc_priv *psoc_priv;
QDF_STATUS status;
ACTION_OUI_ENTER();
psoc_priv = qdf_mem_malloc(sizeof(*psoc_priv));
if (!psoc_priv) {
status = QDF_STATUS_E_NOMEM;
goto exit;
}
status = wlan_objmgr_psoc_component_obj_attach(psoc,
WLAN_UMAC_COMP_ACTION_OUI,
(void *)psoc_priv, QDF_STATUS_SUCCESS);
if (!QDF_IS_STATUS_SUCCESS(status)) {
action_oui_err("Failed to attach priv with psoc");
goto free_psoc_priv;
}
target_if_action_oui_register_tx_ops(&psoc_priv->tx_ops);
psoc_priv->psoc = psoc;
status = action_oui_allocate(psoc_priv);
if (!QDF_IS_STATUS_SUCCESS(status)) {
action_oui_err("Failed to alloc action_oui");
goto detach_psoc_priv;
}
action_oui_debug("psoc priv attached");
goto exit;
detach_psoc_priv:
wlan_objmgr_psoc_component_obj_detach(psoc,
WLAN_UMAC_COMP_ACTION_OUI,
(void *)psoc_priv);
free_psoc_priv:
qdf_mem_free(psoc_priv);
status = QDF_STATUS_E_INVAL;
exit:
ACTION_OUI_EXIT();
return status;
}
QDF_STATUS
action_oui_psoc_destroy_notification(struct wlan_objmgr_psoc *psoc, void *arg)
{
struct action_oui_psoc_priv *psoc_priv = NULL;
QDF_STATUS status = QDF_STATUS_E_FAILURE;
ACTION_OUI_ENTER();
psoc_priv = action_oui_psoc_get_priv(psoc);
if (!psoc_priv) {
action_oui_err("psoc priv is NULL");
goto exit;
}
status = wlan_objmgr_psoc_component_obj_detach(psoc,
WLAN_UMAC_COMP_ACTION_OUI,
(void *)psoc_priv);
if (!QDF_IS_STATUS_SUCCESS(status))
action_oui_err("Failed to detach priv with psoc");
action_oui_destroy(psoc_priv);
qdf_mem_free(psoc_priv);
exit:
ACTION_OUI_EXIT();
return status;
}

View File

@@ -1,949 +0,0 @@
/*
* Copyright (c) 2012-2020 The Linux Foundation. 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.
*/
/**
* DOC: Implement parsing logic for action_oui strings, extract
* extensions and store them using linked list. Functions defined in
* this file can be accessed internally in action_oui component only.
*/
#include "wlan_action_oui_main.h"
#include "wlan_action_oui_public_struct.h"
#include "wlan_action_oui_tgt_api.h"
#include "target_if_action_oui.h"
#include <qdf_str.h>
#include <wlan_utility.h>
/**
* action_oui_string_to_hex() - convert string to uint8_t hex array
* @token - string to be converted
* @hex - output string to hold converted string
* @no_of_lengths - count of possible lengths for input string
* @possible_lengths - array holding possible lengths
*
* This function converts the continuous input string of even length and
* containing hexa decimal characters into hexa decimal array of uint8_t type.
* Input string needs to be NULL terminated and the length should match with
* one of entries in @possible_lengths
*
* Return: If conversion is successful return true else false
*/
static bool action_oui_string_to_hex(uint8_t *token, uint8_t *hex,
uint32_t no_of_lengths,
uint32_t *possible_lengths)
{
uint32_t token_len = qdf_str_len(token);
uint32_t hex_str_len;
uint32_t i;
int ret;
if (!token_len || (token_len & 0x01)) {
action_oui_err("Token len is not multiple of 2");
return false;
}
for (i = 0; i < no_of_lengths; i++)
if (token_len == possible_lengths[i])
break;
if (i == no_of_lengths) {
action_oui_err("Token len doesn't match with expected len");
return false;
}
hex_str_len = token_len / 2;
ret = qdf_hex_str_to_binary(hex, token, hex_str_len);
if (ret) {
action_oui_err("Token doesn't contain hex digits");
return false;
}
return true;
}
/**
* action_oui_token_string() - converts enum value to string
* token_id: enum value to be converted to string
*
* This function converts the enum value of type action_oui_token_type
* to string
*
* Return: converted string
*/
static
uint8_t *action_oui_token_string(enum action_oui_token_type token_id)
{
switch (token_id) {
CASE_RETURN_STRING(ACTION_OUI_TOKEN);
CASE_RETURN_STRING(ACTION_OUI_DATA_LENGTH_TOKEN);
CASE_RETURN_STRING(ACTION_OUI_DATA_TOKEN);
CASE_RETURN_STRING(ACTION_OUI_DATA_MASK_TOKEN);
CASE_RETURN_STRING(ACTION_OUI_INFO_MASK_TOKEN);
CASE_RETURN_STRING(ACTION_OUI_MAC_ADDR_TOKEN);
CASE_RETURN_STRING(ACTION_OUI_MAC_MASK_TOKEN);
CASE_RETURN_STRING(ACTION_OUI_CAPABILITY_TOKEN);
CASE_RETURN_STRING(ACTION_OUI_END_TOKEN);
}
return (uint8_t *) "UNKNOWN";
}
/**
* validate_and_convert_oui() - validate and convert OUI str to hex array
* @token: OUI string
* @ext: pointer to container which holds converted hex array
* @action_token: next action to be parsed
*
* This is an internal function invoked from action_oui_parse to validate
* the OUI string for action OUI inis, convert them to hex array and store it
* in action_oui extension. After successful parsing update the
* @action_token to hold the next expected string.
*
* Return: If conversion is successful return true else false
*/
static
bool validate_and_convert_oui(uint8_t *token,
struct action_oui_extension *ext,
enum action_oui_token_type *action_token)
{
bool valid;
uint32_t expected_token_len[2] = {6, 10};
valid = action_oui_string_to_hex(token, ext->oui, 2,
expected_token_len);
if (!valid)
return false;
ext->oui_length = qdf_str_len(token) / 2;
*action_token = ACTION_OUI_DATA_LENGTH_TOKEN;
return valid;
}
/**
* validate_and_convert_data_length() - validate data len str
* @token: data length string
* @ext: pointer to container which holds hex value formed from input str
* @action_token: next action to be parsed
*
* This is an internal function invoked from action_oui_parse to validate
* the data length string for action OUI inis, convert it to hex value and
* store it in action_oui extension. After successful parsing update the
* @action_token to hold the next expected string.
*
* Return: If conversion is successful return true else false
*/
static bool
validate_and_convert_data_length(uint8_t *token,
struct action_oui_extension *ext,
enum action_oui_token_type *action_token)
{
uint32_t token_len = qdf_str_len(token);
int ret;
uint8_t len = 0;
if (token_len != 1 && token_len != 2) {
action_oui_err("Invalid str token len for action OUI data len");
return false;
}
ret = kstrtou8(token, 16, &len);
if (ret) {
action_oui_err("Invalid char in action OUI data len str token");
return false;
}
if ((uint32_t)len > ACTION_OUI_MAX_DATA_LENGTH) {
action_oui_err("action OUI data len is more than %u",
ACTION_OUI_MAX_DATA_LENGTH);
return false;
}
ext->data_length = len;
if (!ext->data_length)
*action_token = ACTION_OUI_INFO_MASK_TOKEN;
else
*action_token = ACTION_OUI_DATA_TOKEN;
return true;
}
/**
* validate_and_convert_data() - validate and convert data str to hex array
* @token: data string
* @ext: pointer to container which holds converted hex array
* @action_token: next action to be parsed
*
* This is an internal function invoked from action_oui_parse to validate
* the data string for action OUI inis, convert it to hex array and store in
* action_oui extension. After successful parsing update the @action_token
* to hold the next expected string.
*
* Return: If conversion is successful return true else false
*/
static bool
validate_and_convert_data(uint8_t *token,
struct action_oui_extension *ext,
enum action_oui_token_type *action_token)
{
bool valid;
uint32_t expected_token_len[1] = {2 * ext->data_length};
valid = action_oui_string_to_hex(token, ext->data, 1,
expected_token_len);
if (!valid)
return false;
*action_token = ACTION_OUI_DATA_MASK_TOKEN;
return true;
}
/**
* validate_and_convert_data_mask() - validate and convert data mask str
* @token: data mask string
* @ext: pointer to container which holds converted hex array
* @action_token: next action to be parsed
*
* This is an internal function invoked from action_oui_parse to validate
* the data mask string for action OUI inis, convert it to hex array and store
* in action_oui extension. After successful parsing update the
* @action_token to hold the next expected string.
*
* Return: If conversion is successful return true else false
*/
static bool
validate_and_convert_data_mask(uint8_t *token,
struct action_oui_extension *ext,
enum action_oui_token_type *action_token)
{
bool valid;
uint32_t expected_token_len[1];
uint32_t data_mask_length;
uint32_t data_length = ext->data_length;
if (data_length % 8 == 0)
data_mask_length = data_length / 8;
else
data_mask_length = ((data_length / 8) + 1);
if (data_mask_length > ACTION_OUI_MAX_DATA_MASK_LENGTH)
return false;
expected_token_len[0] = 2 * data_mask_length;
valid = action_oui_string_to_hex(token, ext->data_mask, 1,
expected_token_len);
if (!valid)
return false;
ext->data_mask_length = data_mask_length;
*action_token = ACTION_OUI_INFO_MASK_TOKEN;
return valid;
}
/**
* validate_and_convert_info_mask() - validate and convert info mask str
* @token: info mask string
* @ext: pointer to container which holds converted hex array
* @action_token: next action to be parsed
*
* This is an internal function invoked from action_oui_parse to validate
* the info mask string for action OUI inis, convert it to hex array and store
* in action_oui extension. After successful parsing update the
* @action_token to hold the next expected string.
*
* Return: If conversion is successful return true else false
*/
static bool
validate_and_convert_info_mask(uint8_t *token,
struct action_oui_extension *ext,
enum action_oui_token_type *action_token)
{
uint32_t token_len = qdf_str_len(token);
uint8_t hex_value = 0;
uint32_t info_mask;
int ret;
if (token_len != 2) {
action_oui_err("action OUI info mask str token len is not of 2 chars");
return false;
}
ret = kstrtou8(token, 16, &hex_value);
if (ret) {
action_oui_err("Invalid char in action OUI info mask str token");
return false;
}
info_mask = hex_value;
ext->info_mask = info_mask;
if (!info_mask || !(info_mask & ~ACTION_OUI_INFO_OUI)) {
*action_token = ACTION_OUI_END_TOKEN;
return true;
}
if (info_mask & ~ACTION_OUI_INFO_MASK) {
action_oui_err("Invalid bits are set in action OUI info mask");
return false;
}
/*
* If OUI bit is not set in the info presence, we need to ignore the
* OUI and OUI Data. Set OUI and OUI data length to 0 here.
*/
if (!(info_mask & ACTION_OUI_INFO_OUI)) {
ext->oui_length = 0;
ext->data_length = 0;
ext->data_mask_length = 0;
}
if (info_mask & ACTION_OUI_INFO_MAC_ADDRESS) {
*action_token = ACTION_OUI_MAC_ADDR_TOKEN;
return true;
}
*action_token = ACTION_OUI_CAPABILITY_TOKEN;
return true;
}
/**
* validate_and_convert_mac_addr() - validate and convert mac addr str
* @token: mac address string
* @ext: pointer to container which holds converted hex array
* @action_token: next action to be parsed
*
* This is an internal function invoked from action_oui_parse to validate
* the mac address string for action OUI inis, convert it to hex array and store
* in action_oui extension. After successful parsing update the
* @action_token to hold the next expected string.
*
* Return: If conversion is successful return true else false
*/
static bool
validate_and_convert_mac_addr(uint8_t *token,
struct action_oui_extension *ext,
enum action_oui_token_type *action_token)
{
uint32_t expected_token_len[1] = {2 * QDF_MAC_ADDR_SIZE};
bool valid;
valid = action_oui_string_to_hex(token, ext->mac_addr, 1,
expected_token_len);
if (!valid)
return false;
ext->mac_addr_length = QDF_MAC_ADDR_SIZE;
*action_token = ACTION_OUI_MAC_MASK_TOKEN;
return true;
}
/**
* validate_and_convert_mac_mask() - validate and convert mac mask
* @token: mac mask string
* @ext: pointer to container which holds converted hex value
* @action_token: next action to be parsed
*
* This is an internal function invoked from action_oui_parse to validate
* the mac mask string for action OUI inis, convert it to hex value and store
* in action_oui extension. After successful parsing update the
* @action_token to hold the next expected string.
*
* Return: If conversion is successful return true else false
*/
static bool
validate_and_convert_mac_mask(uint8_t *token,
struct action_oui_extension *ext,
enum action_oui_token_type *action_token)
{
uint32_t expected_token_len[1] = {2};
uint32_t info_mask = ext->info_mask;
bool valid;
uint32_t mac_mask_length;
valid = action_oui_string_to_hex(token, ext->mac_mask, 1,
expected_token_len);
if (!valid)
return false;
mac_mask_length = qdf_str_len(token) / 2;
if (mac_mask_length > ACTION_OUI_MAC_MASK_LENGTH) {
action_oui_err("action OUI mac mask str token len is more than %u chars",
expected_token_len[0]);
return false;
}
ext->mac_mask_length = mac_mask_length;
if ((info_mask & ACTION_OUI_INFO_AP_CAPABILITY_NSS) ||
(info_mask & ACTION_OUI_INFO_AP_CAPABILITY_HT) ||
(info_mask & ACTION_OUI_INFO_AP_CAPABILITY_VHT) ||
(info_mask & ACTION_OUI_INFO_AP_CAPABILITY_BAND)) {
*action_token = ACTION_OUI_CAPABILITY_TOKEN;
return true;
}
*action_token = ACTION_OUI_END_TOKEN;
return true;
}
/**
* validate_and_convert_capability() - validate and convert capability str
* @token: capability string
* @ext: pointer to container which holds converted hex value
* @action_token: next action to be parsed
*
* This is an internal function invoked from action_oui_parse to validate
* the capability string for action OUI inis, convert it to hex value and store
* in action_oui extension. After successful parsing update the
* @action_token to hold the next expected string.
*
* Return: If conversion is successful return true else false
*/
static bool
validate_and_convert_capability(uint8_t *token,
struct action_oui_extension *ext,
enum action_oui_token_type *action_token)
{
uint32_t expected_token_len[1] = {2};
uint32_t info_mask = ext->info_mask;
uint32_t capability_length;
uint8_t caps_0;
bool valid;
valid = action_oui_string_to_hex(token, ext->capability, 1,
expected_token_len);
if (!valid)
return false;
capability_length = qdf_str_len(token) / 2;
if (capability_length > ACTION_OUI_MAX_CAPABILITY_LENGTH) {
action_oui_err("action OUI capability str token len is more than %u chars",
expected_token_len[0]);
return false;
}
caps_0 = ext->capability[0];
if ((info_mask & ACTION_OUI_INFO_AP_CAPABILITY_NSS) &&
(!(caps_0 & ACTION_OUI_CAPABILITY_NSS_MASK))) {
action_oui_err("Info presence for NSS is set but respective bits in capability are not set");
return false;
}
if ((info_mask & ACTION_OUI_INFO_AP_CAPABILITY_BAND) &&
(!(caps_0 & ACTION_OUI_CAPABILITY_BAND_MASK))) {
action_oui_err("Info presence for BAND is set but respective bits in capability are not set");
return false;
}
ext->capability_length = capability_length;
*action_token = ACTION_OUI_END_TOKEN;
return true;
}
/**
* action_oui_extension_store() - store action oui extension
* @priv_obj: pointer to action_oui priv obj
* @oui_priv: type of the action
* @ext: oui extension to store in sme
*
* This function stores the parsed oui extension
*
* Return: QDF_STATUS
*
*/
static QDF_STATUS
action_oui_extension_store(struct action_oui_psoc_priv *psoc_priv,
struct action_oui_priv *oui_priv,
struct action_oui_extension ext)
{
struct action_oui_extension_priv *ext_priv;
qdf_mutex_acquire(&oui_priv->extension_lock);
if (qdf_list_size(&oui_priv->extension_list) ==
ACTION_OUI_MAX_EXTENSIONS) {
qdf_mutex_release(&oui_priv->extension_lock);
action_oui_err("Reached maximum OUI extensions");
return QDF_STATUS_E_FAILURE;
}
ext_priv = qdf_mem_malloc(sizeof(*ext_priv));
if (!ext_priv) {
qdf_mutex_release(&oui_priv->extension_lock);
return QDF_STATUS_E_NOMEM;
}
ext_priv->extension = ext;
qdf_list_insert_back(&oui_priv->extension_list, &ext_priv->item);
psoc_priv->total_extensions++;
qdf_mutex_release(&oui_priv->extension_lock);
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
action_oui_parse(struct action_oui_psoc_priv *psoc_priv,
uint8_t *oui_string, enum action_oui_id action_id)
{
struct action_oui_extension ext = {0};
enum action_oui_token_type action_token = ACTION_OUI_TOKEN;
char *str1;
char *str2;
char *token;
bool valid = true;
bool oui_count_exceed = false;
uint32_t oui_index = 0;
QDF_STATUS status = QDF_STATUS_SUCCESS;
struct action_oui_priv *oui_priv;
if (!oui_string) {
action_oui_err("Invalid string for action oui: %u", action_id);
return QDF_STATUS_E_INVAL;
}
oui_priv = psoc_priv->oui_priv[action_id];
if (!oui_priv) {
action_oui_err("action oui priv not allocated");
return QDF_STATUS_E_INVAL;
}
str1 = qdf_str_trim((char *)oui_string);
while (str1) {
str2 = (char *)qdf_str_left_trim(str1);
if (str2[0] == '\0') {
action_oui_err("Invalid spaces in action oui: %u at extension: %u for token: %s",
action_id,
oui_index + 1,
action_oui_token_string(action_token));
valid = false;
break;
}
token = strsep(&str2, " ");
if (!token) {
action_oui_err("Invalid string for token: %s at extension: %u in action oui: %u",
action_oui_token_string(action_token),
oui_index + 1, action_id);
valid = false;
break;
}
str1 = str2;
switch (action_token) {
case ACTION_OUI_TOKEN:
valid = validate_and_convert_oui(token, &ext,
&action_token);
break;
case ACTION_OUI_DATA_LENGTH_TOKEN:
valid = validate_and_convert_data_length(token, &ext,
&action_token);
break;
case ACTION_OUI_DATA_TOKEN:
valid = validate_and_convert_data(token, &ext,
&action_token);
break;
case ACTION_OUI_DATA_MASK_TOKEN:
valid = validate_and_convert_data_mask(token, &ext,
&action_token);
break;
case ACTION_OUI_INFO_MASK_TOKEN:
valid = validate_and_convert_info_mask(token, &ext,
&action_token);
break;
case ACTION_OUI_MAC_ADDR_TOKEN:
valid = validate_and_convert_mac_addr(token, &ext,
&action_token);
break;
case ACTION_OUI_MAC_MASK_TOKEN:
valid = validate_and_convert_mac_mask(token, &ext,
&action_token);
break;
case ACTION_OUI_CAPABILITY_TOKEN:
valid = validate_and_convert_capability(token, &ext,
&action_token);
break;
default:
valid = false;
break;
}
if (!valid) {
action_oui_err("Invalid string for token: %s at extension: %u in action oui: %u",
action_oui_token_string(action_token),
oui_index + 1,
action_id);
break;
}
if (action_token != ACTION_OUI_END_TOKEN)
continue;
status = action_oui_extension_store(psoc_priv, oui_priv, ext);
if (!QDF_IS_STATUS_SUCCESS(status)) {
valid = false;
action_oui_err("sme set of extension: %u for action oui: %u failed",
oui_index + 1, action_id);
break;
}
oui_index++;
if (oui_index == ACTION_OUI_MAX_EXTENSIONS) {
if (str1)
oui_count_exceed = true;
break;
}
/* reset the params for next action OUI parse */
action_token = ACTION_OUI_TOKEN;
qdf_mem_zero(&ext, sizeof(ext));
}
if (oui_count_exceed) {
action_oui_err("Reached Maximum extensions: %u in action_oui: %u, ignoring the rest",
ACTION_OUI_MAX_EXTENSIONS, action_id);
return QDF_STATUS_SUCCESS;
}
if (action_token != ACTION_OUI_TOKEN &&
action_token != ACTION_OUI_END_TOKEN &&
valid && !str1) {
action_oui_err("No string for token: %s at extension: %u in action oui: %u",
action_oui_token_string(action_token),
oui_index + 1,
action_id);
valid = false;
}
if (!oui_index) {
action_oui_err("Not able to parse any extension in action oui: %u",
action_id);
return QDF_STATUS_E_INVAL;
}
if (valid)
action_oui_debug("All extensions: %u parsed successfully in action oui: %u",
oui_index, action_id);
else
action_oui_err("First %u extensions parsed successfully in action oui: %u",
oui_index, action_id);
return QDF_STATUS_SUCCESS;
}
QDF_STATUS action_oui_send(struct action_oui_psoc_priv *psoc_priv,
enum action_oui_id action_id)
{
QDF_STATUS status;
struct action_oui_request *req;
struct action_oui_priv *oui_priv;
struct action_oui_extension *extension;
struct action_oui_extension_priv *ext_priv;
qdf_list_node_t *node = NULL;
qdf_list_node_t *next_node = NULL;
qdf_list_t *extension_list;
uint32_t len;
uint32_t no_oui_extensions;
oui_priv = psoc_priv->oui_priv[action_id];
if (!oui_priv)
return QDF_STATUS_SUCCESS;
extension_list = &oui_priv->extension_list;
qdf_mutex_acquire(&oui_priv->extension_lock);
if (qdf_list_empty(extension_list)) {
qdf_mutex_release(&oui_priv->extension_lock);
return QDF_STATUS_SUCCESS;
}
no_oui_extensions = qdf_list_size(extension_list);
len = sizeof(*req) + no_oui_extensions * sizeof(*extension);
req = qdf_mem_malloc(len);
if (!req) {
qdf_mutex_release(&oui_priv->extension_lock);
return QDF_STATUS_E_NOMEM;
}
req->action_id = oui_priv->id;
req->no_oui_extensions = no_oui_extensions;
req->total_no_oui_extensions = psoc_priv->total_extensions;
extension = req->extension;
qdf_list_peek_front(extension_list, &node);
while (node) {
ext_priv = qdf_container_of(node,
struct action_oui_extension_priv,
item);
*extension = ext_priv->extension;
status = qdf_list_peek_next(extension_list, node,
&next_node);
if (!QDF_IS_STATUS_SUCCESS(status))
break;
node = next_node;
next_node = NULL;
extension++;
}
qdf_mutex_release(&oui_priv->extension_lock);
status = tgt_action_oui_send(psoc_priv->psoc, req);
qdf_mem_free(req);
return status;
}
/**
* check_for_vendor_oui_data() - compares for vendor OUI data from IE
* and returns true if OUI data matches with the ini
* @extension: pointer to action oui extension data
* @oui_ptr: pointer to Vendor IE in the beacon
*
* Return: true or false
*/
static bool
check_for_vendor_oui_data(struct action_oui_extension *extension,
const uint8_t *oui_ptr)
{
const uint8_t *data;
uint8_t i, j, elem_len, data_len;
uint8_t data_mask = 0x80;
if (!oui_ptr)
return false;
elem_len = oui_ptr[1];
if (elem_len < extension->oui_length)
return false;
data_len = elem_len - extension->oui_length;
if (data_len < extension->data_length)
return false;
data = &oui_ptr[2 + extension->oui_length];
for (i = 0, j = 0;
(i < data_len && j < extension->data_mask_length);
i++) {
if ((extension->data_mask[j] & data_mask) &&
!(extension->data[i] == data[i]))
return false;
data_mask = data_mask >> 1;
if (!data_mask) {
data_mask = 0x80;
j++;
}
}
return true;
}
/**
* check_for_vendor_ap_mac() - compares for vendor AP MAC in the ini with
* bssid from the session and returns true if matches
* @extension: pointer to action oui extension data
* @attr: pointer to structure containing mac_addr (bssid) of AP
*
* Return: true or false
*/
static bool
check_for_vendor_ap_mac(struct action_oui_extension *extension,
struct action_oui_search_attr *attr)
{
uint8_t i;
uint8_t mac_mask = 0x80;
uint8_t *mac_addr = attr->mac_addr;
for (i = 0; i < QDF_MAC_ADDR_SIZE; i++) {
if ((*extension->mac_mask & mac_mask) &&
!(extension->mac_addr[i] == mac_addr[i]))
return false;
mac_mask = mac_mask >> 1;
}
return true;
}
/**
* check_for_vendor_ap_capabilities() - Compares various Vendor AP
* capabilities like NSS, HT, VHT, Band from the ini with the AP's capability
* from the beacon and returns true if all the capability matches
* @extension: pointer to oui extension data
* @attr: pointer to structure containing type of action, ap capabilities
*
* Return: true or false
*/
static bool
check_for_vendor_ap_capabilities(struct action_oui_extension *extension,
struct action_oui_search_attr *attr)
{
uint8_t nss_mask;
if (extension->info_mask & ACTION_OUI_INFO_AP_CAPABILITY_NSS) {
nss_mask = 1 << (attr->nss - 1);
if (!((*extension->capability &
ACTION_OUI_CAPABILITY_NSS_MASK) &
nss_mask))
return false;
}
if (extension->info_mask & ACTION_OUI_INFO_AP_CAPABILITY_HT) {
if (*extension->capability &
ACTION_OUI_CAPABILITY_HT_ENABLE_MASK) {
if (!attr->ht_cap)
return false;
} else {
if (attr->ht_cap)
return false;
}
}
if (extension->info_mask & ACTION_OUI_INFO_AP_CAPABILITY_VHT) {
if (*extension->capability &
ACTION_OUI_CAPABILITY_VHT_ENABLE_MASK) {
if (!attr->vht_cap)
return false;
} else {
if (attr->vht_cap)
return false;
}
}
if (extension->info_mask & ACTION_OUI_INFO_AP_CAPABILITY_BAND &&
((attr->enable_5g &&
!(*extension->capability & ACTION_CAPABILITY_5G_BAND_MASK)) ||
(attr->enable_2g &&
!(*extension->capability & ACTION_OUI_CAPABILITY_2G_BAND_MASK))))
return false;
return true;
}
static const uint8_t *
action_oui_get_oui_ptr(struct action_oui_extension *extension,
struct action_oui_search_attr *attr)
{
if (!attr->ie_data || !attr->ie_length)
return NULL;
return wlan_get_vendor_ie_ptr_from_oui(extension->oui,
extension->oui_length,
attr->ie_data,
attr->ie_length);
}
bool
action_oui_search(struct action_oui_psoc_priv *psoc_priv,
struct action_oui_search_attr *attr,
enum action_oui_id action_id)
{
struct action_oui_priv *oui_priv;
struct action_oui_extension_priv *priv_ext;
struct action_oui_extension *extension;
qdf_list_node_t *node = NULL;
qdf_list_node_t *next_node = NULL;
qdf_list_t *extension_list;
QDF_STATUS qdf_status;
const uint8_t *oui_ptr;
bool wildcard_oui = false;
oui_priv = psoc_priv->oui_priv[action_id];
if (!oui_priv) {
action_oui_debug("action oui for id %d is empty",
action_id);
return false;
}
extension_list = &oui_priv->extension_list;
qdf_mutex_acquire(&oui_priv->extension_lock);
if (qdf_list_empty(extension_list)) {
qdf_mutex_release(&oui_priv->extension_lock);
return false;
}
qdf_list_peek_front(extension_list, &node);
while (node) {
priv_ext = qdf_container_of(node,
struct action_oui_extension_priv,
item);
extension = &priv_ext->extension;
/*
* If a wildcard OUI bit is not set in the info_mask, proceed
* to other checks skipping the OUI and vendor data checks
*/
if (!(extension->info_mask & ACTION_OUI_INFO_OUI))
wildcard_oui = true;
oui_ptr = action_oui_get_oui_ptr(extension, attr);
if (!oui_ptr && !wildcard_oui)
goto next;
if (extension->data_length && !wildcard_oui &&
!check_for_vendor_oui_data(extension, oui_ptr))
goto next;
if ((extension->info_mask & ACTION_OUI_INFO_MAC_ADDRESS) &&
!check_for_vendor_ap_mac(extension, attr))
goto next;
if (!check_for_vendor_ap_capabilities(extension, attr))
goto next;
action_oui_debug("Vendor AP/STA found for OUI");
QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
extension->oui, extension->oui_length);
qdf_mutex_release(&oui_priv->extension_lock);
return true;
next:
qdf_status = qdf_list_peek_next(extension_list,
node, &next_node);
if (!QDF_IS_STATUS_SUCCESS(qdf_status))
break;
node = next_node;
next_node = NULL;
wildcard_oui = false;
}
qdf_mutex_release(&oui_priv->extension_lock);
return false;
}

View File

@@ -1,215 +0,0 @@
/*
* Copyright (c) 2016-2020 The Linux Foundation. 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.
*/
/**
* DOC: Declare structs and macros which can be accessed by various
* components and modules.
*/
#ifndef _WLAN_ACTION_OUI_PUBLIC_STRUCT_H_
#define _WLAN_ACTION_OUI_PUBLIC_STRUCT_H_
#include <wlan_cmn.h>
#include <qdf_status.h>
#include <qdf_types.h>
/*
* Maximum ini string length of actions oui extensions,
* (n * 83) + (n - 1) spaces + 1 (terminating character),
* where n is the no of oui extensions
* currently, max no of oui extensions is 10
*/
#define ACTION_OUI_MAX_STR_LEN 840
/*
* Maximum number of action oui extensions supported in
* each action oui category
*/
#define ACTION_OUI_MAX_EXTENSIONS 10
#define ACTION_OUI_MAX_OUI_LENGTH 5
#define ACTION_OUI_MAX_DATA_LENGTH 20
#define ACTION_OUI_MAX_DATA_MASK_LENGTH 3
#define ACTION_OUI_MAC_MASK_LENGTH 1
#define ACTION_OUI_MAX_CAPABILITY_LENGTH 1
/*
* NSS Mask and NSS Offset to extract NSS info from
* capability field of action oui extension
*/
#define ACTION_OUI_CAPABILITY_NSS_MASK 0x0f
#define ACTION_OUI_CAPABILITY_NSS_OFFSET 0
#define ACTION_OUI_CAPABILITY_NSS_MASK_1X1 1
#define ACTION_OUI_CAPABILITY_NSS_MASK_2X2 2
#define ACTION_OUI_CAPABILITY_NSS_MASK_3X3 4
#define ACTION_OUI_CAPABILITY_NSS_MASK_4X4 8
/*
* Mask and offset to extract HT and VHT info from
* capability field of action oui extension
*/
#define ACTION_OUI_CAPABILITY_HT_ENABLE_MASK 0x10
#define ACTION_OUI_CAPABILITY_HT_ENABLE_OFFSET 4
#define ACTION_OUI_CAPABILITY_VHT_ENABLE_MASK 0x20
#define ACTION_OUI_CAPABILITY_VHT_ENABLE_OFFSET 5
/*
* Mask and offset to extract Band (2G and 5G) info from
* capability field of action oui extension
*/
#define ACTION_OUI_CAPABILITY_BAND_MASK 0xC0
#define ACTION_OUI_CAPABILITY_BAND_OFFSET 6
#define ACTION_OUI_CAPABILITY_2G_BAND_MASK 0x40
#define ACTION_OUI_CAPABILITY_2G_BAND_OFFSET 6
#define ACTION_CAPABILITY_5G_BAND_MASK 0x80
#define ACTION_CAPABILITY_5G_BAND_OFFSET 7
/**
* enum action_oui_id - to identify type of action oui
* @ACTION_OUI_CONNECT_1X1: for 1x1 connection only
* @ACTION_OUI_ITO_EXTENSION: for extending inactivity time of station
* @ACTION_OUI_CCKM_1X1: for TX with CCKM 1x1 only
* @ACTION_OUI_ITO_ALTERNATE: alternate ITO extensions used by firmware
* @ACTION_OUI_SWITCH_TO_11N_MODE: connect in 11n
* @ACTION_OUI_CONNECT_1X1_WITH_1_CHAIN: connect in 1x1 & disable diversity gain
* @ACTION_OUI_DISABLE_AGGRESSIVE_TX: disable aggressive TX in firmware
* @ACTION_OUI_FORCE_MAX_NSS: Force Max NSS connection with few IOT APs
* @ACTION_OUI_DISABLE_AGGRESSIVE_EDCA: disable aggressive EDCA with the ap
* @ACTION_OUI_DISABLE_TWT: disable TWT with the ap
* @ACTION_OUI_HOST_ONLY: host only action id start - placeholder.
* New Firmware related "ACTION" needs to be added before this placeholder.
* @ACTION_OUI_HOST_RECONN: reconnect to the same BSSID when wait for
* association response timeout from AP
* @ACTION_OUI_MAXIMUM_ID: maximum number of action oui types
*/
enum action_oui_id {
ACTION_OUI_CONNECT_1X1 = 0,
ACTION_OUI_ITO_EXTENSION = 1,
ACTION_OUI_CCKM_1X1 = 2,
ACTION_OUI_ITO_ALTERNATE = 3,
ACTION_OUI_SWITCH_TO_11N_MODE = 4,
ACTION_OUI_CONNECT_1X1_WITH_1_CHAIN = 5,
ACTION_OUI_DISABLE_AGGRESSIVE_TX = 6,
ACTION_OUI_FORCE_MAX_NSS = 7,
ACTION_OUI_DISABLE_AGGRESSIVE_EDCA = 8,
ACTION_OUI_DISABLE_TWT = 9,
ACTION_OUI_HOST_ONLY,
ACTION_OUI_HOST_RECONN = ACTION_OUI_HOST_ONLY,
ACTION_OUI_MAXIMUM_ID
};
/**
* enum action_oui_info - to indicate presence of various action OUI
* fields in action oui extension, following identifiers are to be set in
* the info mask field of action oui extension
* @ACTION_OUI_INFO_OUI: to indicate presence of OUI string
* @ACTION_OUI_INFO_MAC_ADDRESS: to indicate presence of mac address
* @ACTION_OUI_INFO_AP_CAPABILITY_NSS: to indicate presence of nss info
* @ACTION_OUI_INFO_AP_CAPABILITY_HT: to indicate presence of HT cap
* @ACTION_OUI_INFO_AP_CAPABILITY_VHT: to indicate presence of VHT cap
* @ACTION_OUI_INFO_AP_CAPABILITY_BAND: to indicate presence of band info
*/
enum action_oui_info {
/*
* OUI centric parsing, expect OUI in each action OUI extension,
* hence, ACTION_OUI_INFO_OUI is dummy
*/
ACTION_OUI_INFO_OUI = 1 << 0,
ACTION_OUI_INFO_MAC_ADDRESS = 1 << 1,
ACTION_OUI_INFO_AP_CAPABILITY_NSS = 1 << 2,
ACTION_OUI_INFO_AP_CAPABILITY_HT = 1 << 3,
ACTION_OUI_INFO_AP_CAPABILITY_VHT = 1 << 4,
ACTION_OUI_INFO_AP_CAPABILITY_BAND = 1 << 5,
};
/* Total mask of all enum action_oui_info IDs */
#define ACTION_OUI_INFO_MASK 0x3F
/**
* struct action_oui_extension - action oui extension contents
* @info_mask: info mask
* @oui_length: length of the oui, either 3 or 5 bytes
* @data_length: length of the oui data
* @data_mask_length: length of the data mask
* @mac_addr_length: length of the mac addr
* @mac_mask_length: length of the mac mask
* @capability_length: length of the capability
* @oui: oui value
* @data: data buffer
* @data_mask: data mask buffer
* @mac_addr: mac addr
* @mac_mask: mac mask
* @capability: capability buffer
*/
struct action_oui_extension {
uint32_t info_mask;
uint32_t oui_length;
uint32_t data_length;
uint32_t data_mask_length;
uint32_t mac_addr_length;
uint32_t mac_mask_length;
uint32_t capability_length;
uint8_t oui[ACTION_OUI_MAX_OUI_LENGTH];
uint8_t data[ACTION_OUI_MAX_DATA_LENGTH];
uint8_t data_mask[ACTION_OUI_MAX_DATA_MASK_LENGTH];
uint8_t mac_addr[QDF_MAC_ADDR_SIZE];
uint8_t mac_mask[ACTION_OUI_MAC_MASK_LENGTH];
uint8_t capability[ACTION_OUI_MAX_CAPABILITY_LENGTH];
};
/**
* struct action_oui_request - Contains specific action oui information
* @action_id: type of action from enum action_oui_info
* @no_oui_extensions: number of action oui extensions of type @action_id
* @total_no_oui_extensions: total no of oui extensions from all
* action oui types, this is just a total count needed by firmware
* @extension: pointer to zero length array, to indicate this structure is
* followed by a array of @no_oui_extensions structures of
* type struct action_oui_extension
*/
struct action_oui_request {
enum action_oui_id action_id;
uint32_t no_oui_extensions;
uint32_t total_no_oui_extensions;
struct action_oui_extension extension[0];
};
/**
* struct action_oui_search_attr - Used to check against action_oui ini input
*
* @ie_data: beacon ie data
* @ie_length: length of ie data
* @mac_addr: bssid of access point
* @nss: AP spatial stream info
* @ht_cap: Whether AP is HT capable
* @vht_cap: Whether AP is VHT capable
* @enable_2g: Whether 2.4GHz band is enabled in AP
* @enable_5g: Whether 5GHz band is enabled in AP
*/
struct action_oui_search_attr {
uint8_t *ie_data;
uint32_t ie_length;
uint8_t *mac_addr;
uint32_t nss;
bool ht_cap;
bool vht_cap;
bool enable_2g;
bool enable_5g;
};
#endif /* _WLAN_ACTION_OUI_PUBLIC_STRUCT_H_ */

View File

@@ -1,51 +0,0 @@
/*
* Copyright (c) 2018 The Linux Foundation. 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.
*/
/**
* DOC: Declare public API for action_oui to interact with target/WMI
*/
#ifndef _WLAN_ACTION_OUI_TGT_API_H_
#define _WLAN_ACTION_OUI_TGT_API_H_
#include "wlan_action_oui_public_struct.h"
#include "wlan_action_oui_objmgr.h"
#define GET_ACTION_OUI_TX_OPS_FROM_PSOC(psoc) \
(&action_oui_psoc_get_priv(psoc)->tx_ops)
/**
* tgt_action_oui_send() - Send request to target if
* @psoc: objmgr psoc object
* @req: action_oui request to be send
*
* Return: QDF_STATUS
*/
QDF_STATUS tgt_action_oui_send(struct wlan_objmgr_psoc *psoc,
struct action_oui_request *req);
/**
* struct action_oui_tx_ops - structure of tx operations
* @send_req: Pointer to hold target_if send function
*/
struct action_oui_tx_ops {
QDF_STATUS (*send_req)(struct wlan_objmgr_psoc *psoc,
struct action_oui_request *req);
};
#endif /* _WLAN_ACTION_OUI_TGT_API_H_ */

View File

@@ -1,210 +0,0 @@
/*
* Copyright (c) 2012-2018 The Linux Foundation. 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.
*/
/**
* DOC: Declare public API related to the action_oui called by north bound
* HDD/OSIF/LIM
*/
#ifndef _WLAN_ACTION_OUI_UCFG_API_H_
#define _WLAN_ACTION_OUI_UCFG_API_H_
#include <qdf_status.h>
#include <qdf_types.h>
#include "wlan_action_oui_public_struct.h"
#include "wlan_action_oui_objmgr.h"
#ifdef WLAN_FEATURE_ACTION_OUI
/**
* ucfg_action_oui_init() - Register notification handlers.
*
* This function registers action_oui notification handlers which are
* invoked from psoc create/destroy handlers.
*
* Return: For successful registration - QDF_STATUS_SUCCESS,
* else QDF_STATUS error codes.
*/
QDF_STATUS ucfg_action_oui_init(void);
/**
* ucfg_action_oui_deinit() - Unregister notification handlers.
*
* This function Unregisters action_oui notification handlers which are
* invoked from psoc create/destroy handlers.
*
* Return: None
*/
void ucfg_action_oui_deinit(void);
/**
* ucfg_action_oui_parse() - Parse input string and extract extensions.
* @psoc: objmgr psoc object
* @in_str: input string to be parsed
* @action_id: action to which given string corresponds
*
* This is a wrapper function which invokes internal function
* action_oui_extract() to extract OUIs and related attributes.
*
* Return: For successful parse - QDF_STATUS_SUCCESS,
* else QDF_STATUS error codes.
*/
QDF_STATUS
ucfg_action_oui_parse(struct wlan_objmgr_psoc *psoc,
const uint8_t *in_str,
enum action_oui_id action_id);
/**
* ucfg_action_oui_send() - Send action_oui and related attributes to Fw.
* @psoc: objmgr psoc object
*
* This is a wrapper function which invokes internal function
* action_oui_send() to send OUIs and related attributes to firmware.
*
* Return: For successful send - QDF_STATUS_SUCCESS,
* else QDF_STATUS error codes.
*/
QDF_STATUS ucfg_action_oui_send(struct wlan_objmgr_psoc *psoc);
/**
* ucfg_action_oui_enabled() - State of action_oui component
*
* Return: When action_oui component is present return true
* else return false.
*/
static inline bool ucfg_action_oui_enabled(void)
{
return true;
}
/**
* ucfg_action_oui_search() - Check for OUIs and related info in IE data.
* @psoc: objmgr psoc object
* @attr: pointer to structure containing type of action, beacon IE data etc.,
* @action_id: type of action to be checked
*
* This is a wrapper function which invokes internal function to search
* for OUIs and related info (specified from ini file) in vendor specific
* data of beacon IE for given action.
*
* Return: If search is successful return true else false.
*/
bool ucfg_action_oui_search(struct wlan_objmgr_psoc *psoc,
struct action_oui_search_attr *attr,
enum action_oui_id action_id);
#else
/**
* ucfg_action_oui_init() - Register notification handlers.
*
* This function registers action_oui notification handlers which are
* invoked from psoc create/destroy handlers.
*
* Return: For successful registration - QDF_STATUS_SUCCESS,
* else QDF_STATUS error codes.
*/
static inline
QDF_STATUS ucfg_action_oui_init(void)
{
return QDF_STATUS_SUCCESS;
}
/**
* ucfg_action_oui_deinit() - Unregister notification handlers.
*
* This function Unregisters action_oui notification handlers which are
* invoked from psoc create/destroy handlers.
*
* Return: None
*/
static inline
void ucfg_action_oui_deinit(void)
{
}
/**
* ucfg_action_oui_parse() - Parse input string of action_id specified.
* @psoc: objmgr psoc object
* @in_str: input string to be parsed
* @action_id: action to which given string corresponds
*
* This is a wrapper function which invokes internal function
* action_oui_extract() to extract OUIs and related attributes.
*
* Return: For successful parse - QDF_STATUS_SUCCESS,
* else QDF_STATUS error codes.
*/
static inline QDF_STATUS
ucfg_action_oui_parse(struct wlan_objmgr_psoc *psoc,
const uint8_t *in_str,
enum action_oui_id action_id)
{
return QDF_STATUS_SUCCESS;
}
/**
* ucfg_action_oui_send() - Send action_oui and related attributes to Fw.
* @psoc: objmgr psoc object
*
* This is a wrapper function which invokes internal function
* action_oui_send() to send OUIs and related attributes to firmware.
*
* Return: For successful send - QDF_STATUS_SUCCESS,
* else QDF_STATUS error codes.
*/
static inline
QDF_STATUS ucfg_action_oui_send(struct wlan_objmgr_psoc *psoc)
{
return QDF_STATUS_SUCCESS;
}
/**
* ucfg_action_oui_enabled() - State of action_oui component
*
* Return: When action_oui component is present return true
* else return false.
*/
static inline bool ucfg_action_oui_enabled(void)
{
return false;
}
/**
* ucfg_action_oui_search() - Check for OUIs and related info in IE data.
* @psoc: objmgr psoc object
* @attr: pointer to structure containing type of action, beacon IE data etc.,
* @action_id: type of action to be checked
*
* This is a wrapper function which invokes internal function to search
* for OUIs and related info (specified from ini file) in vendor specific
* data of beacon IE for given action.
*
* Return: If search is successful return true else false.
*/
static inline
bool ucfg_action_oui_search(struct wlan_objmgr_psoc *psoc,
struct action_oui_search_attr *attr,
enum action_oui_id action_id)
{
return false;
}
#endif /* WLAN_FEATURE_ACTION_OUI */
#endif /* _WLAN_ACTION_OUI_UCFG_API_H_ */

View File

@@ -1,43 +0,0 @@
/*
* Copyright (c) 2018 The Linux Foundation. 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.
*/
/**
* DOC: Implements public API for action_oui to interact with target/WMI
*/
#include "wlan_action_oui_tgt_api.h"
#include "wlan_action_oui_main.h"
#include "wlan_action_oui_public_struct.h"
QDF_STATUS tgt_action_oui_send(struct wlan_objmgr_psoc *psoc,
struct action_oui_request *req)
{
struct action_oui_tx_ops *tx_ops;
QDF_STATUS status = QDF_STATUS_E_FAILURE;
ACTION_OUI_ENTER();
tx_ops = GET_ACTION_OUI_TX_OPS_FROM_PSOC(psoc);
QDF_ASSERT(tx_ops->send_req);
if (tx_ops->send_req)
status = tx_ops->send_req(psoc, req);
ACTION_OUI_EXIT();
return status;
}

View File

@@ -1,195 +0,0 @@
/*
* Copyright (c) 2012-2018, 2020-2021 The Linux Foundation. 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.
*/
/**
* DOC: Public API implementation of action_oui called by north bound HDD/OSIF.
*/
#include "wlan_action_oui_ucfg_api.h"
#include "wlan_action_oui_main.h"
#include "wlan_action_oui_main.h"
#include "target_if_action_oui.h"
#include "wlan_action_oui_tgt_api.h"
#include <qdf_str.h>
QDF_STATUS ucfg_action_oui_init(void)
{
QDF_STATUS status;
ACTION_OUI_ENTER();
status = wlan_objmgr_register_psoc_create_handler(
WLAN_UMAC_COMP_ACTION_OUI,
action_oui_psoc_create_notification, NULL);
if (!QDF_IS_STATUS_SUCCESS(status)) {
action_oui_err("Failed to register psoc create handler");
goto exit;
}
status = wlan_objmgr_register_psoc_destroy_handler(
WLAN_UMAC_COMP_ACTION_OUI,
action_oui_psoc_destroy_notification, NULL);
if (QDF_IS_STATUS_SUCCESS(status)) {
action_oui_debug("psoc create/delete notifications registered");
goto exit;
}
action_oui_err("Failed to register psoc delete handler");
wlan_objmgr_unregister_psoc_create_handler(WLAN_UMAC_COMP_ACTION_OUI,
action_oui_psoc_create_notification, NULL);
exit:
ACTION_OUI_EXIT();
return status;
}
void ucfg_action_oui_deinit(void)
{
QDF_STATUS status;
ACTION_OUI_ENTER();
status = wlan_objmgr_unregister_psoc_create_handler(
WLAN_UMAC_COMP_ACTION_OUI,
action_oui_psoc_create_notification, NULL);
if (!QDF_IS_STATUS_SUCCESS(status))
action_oui_err("Failed to unregister psoc create handler");
status = wlan_objmgr_unregister_psoc_destroy_handler(
WLAN_UMAC_COMP_ACTION_OUI,
action_oui_psoc_destroy_notification,
NULL);
if (!QDF_IS_STATUS_SUCCESS(status))
action_oui_err("Failed to unregister psoc delete handler");
ACTION_OUI_EXIT();
}
QDF_STATUS
ucfg_action_oui_parse(struct wlan_objmgr_psoc *psoc,
const uint8_t *in_str,
enum action_oui_id action_id)
{
struct action_oui_psoc_priv *psoc_priv;
QDF_STATUS status = QDF_STATUS_E_INVAL;
uint8_t *oui_str;
int len;
ACTION_OUI_ENTER();
if (!psoc) {
action_oui_err("psoc is NULL");
goto exit;
}
if (action_id >= ACTION_OUI_MAXIMUM_ID) {
action_oui_err("Invalid action_oui id: %u", action_id);
goto exit;
}
psoc_priv = action_oui_psoc_get_priv(psoc);
if (!psoc_priv) {
action_oui_err("psoc priv is NULL");
goto exit;
}
len = qdf_str_len(in_str);
if (len <= 0 || len > ACTION_OUI_MAX_STR_LEN - 1) {
action_oui_err("Invalid string length: %u", action_id);
goto exit;
}
oui_str = qdf_mem_malloc(len + 1);
if (!oui_str) {
status = QDF_STATUS_E_NOMEM;
goto exit;
}
qdf_mem_copy(oui_str, in_str, len);
oui_str[len] = '\0';
status = action_oui_parse(psoc_priv, oui_str, action_id);
if (!QDF_IS_STATUS_SUCCESS(status))
action_oui_err("Failed to parse: %u", action_id);
qdf_mem_free(oui_str);
exit:
ACTION_OUI_EXIT();
return status;
}
QDF_STATUS ucfg_action_oui_send(struct wlan_objmgr_psoc *psoc)
{
struct action_oui_psoc_priv *psoc_priv;
QDF_STATUS status = QDF_STATUS_E_INVAL;
uint32_t id;
if (!psoc) {
action_oui_err("psoc is NULL");
goto exit;
}
psoc_priv = action_oui_psoc_get_priv(psoc);
if (!psoc_priv) {
action_oui_err("psoc priv is NULL");
goto exit;
}
for (id = 0; id < ACTION_OUI_MAXIMUM_ID; id++) {
if (id >= ACTION_OUI_HOST_ONLY)
continue;
status = action_oui_send(psoc_priv, id);
if (!QDF_IS_STATUS_SUCCESS(status))
action_oui_debug("Failed to send: %u", id);
}
exit:
return status;
}
bool ucfg_action_oui_search(struct wlan_objmgr_psoc *psoc,
struct action_oui_search_attr *attr,
enum action_oui_id action_id)
{
struct action_oui_psoc_priv *psoc_priv;
bool found = false;
if (!psoc || !attr) {
action_oui_err("Invalid psoc or search attrs");
goto exit;
}
if (action_id >= ACTION_OUI_MAXIMUM_ID) {
action_oui_err("Invalid action_oui id: %u", action_id);
goto exit;
}
psoc_priv = action_oui_psoc_get_priv(psoc);
if (!psoc_priv) {
action_oui_err("psoc priv is NULL");
goto exit;
}
found = action_oui_search(psoc_priv, attr, action_id);
exit:
return found;
}

View File

@@ -1,302 +0,0 @@
/*
* Copyright (c) 2011-2021 The Linux Foundation. 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.
*/
/**
* DOC: declare internal APIs related to the blacklist component
*/
#ifndef _WLAN_BLM_CORE_H_
#define _WLAN_BLM_CORE_H_
#include <wlan_blm_main.h>
#define BLM_IS_AP_AVOIDED_BY_USERSPACE(cur_node) \
cur_node->userspace_avoidlist
#define BLM_IS_AP_AVOIDED_BY_DRIVER(cur_node) \
cur_node->driver_avoidlist
#define BLM_IS_AP_BLACKLISTED_BY_USERSPACE(cur_node) \
cur_node->userspace_blacklist
#define BLM_IS_AP_BLACKLISTED_BY_DRIVER(cur_node) \
cur_node->driver_blacklist
#define BLM_IS_AP_IN_MONITOR_LIST(cur_node) \
cur_node->driver_monitorlist
#define BLM_IS_AP_IN_RSSI_REJECT_LIST(cur_node) \
cur_node->rssi_reject_list
#define BLM_IS_AP_IN_BLACKLIST(cur_node) \
(BLM_IS_AP_BLACKLISTED_BY_USERSPACE(cur_node) | \
BLM_IS_AP_BLACKLISTED_BY_DRIVER(cur_node) | \
BLM_IS_AP_IN_RSSI_REJECT_LIST(cur_node))
#define BLM_IS_AP_IN_AVOIDLIST(cur_node) \
(BLM_IS_AP_AVOIDED_BY_USERSPACE(cur_node) | \
BLM_IS_AP_AVOIDED_BY_DRIVER(cur_node))
#define IS_AP_IN_USERSPACE_BLACKLIST_ONLY(cur_node) \
(BLM_IS_AP_BLACKLISTED_BY_USERSPACE(cur_node) & \
!(BLM_IS_AP_IN_AVOIDLIST(cur_node) | \
BLM_IS_AP_IN_MONITOR_LIST(cur_node) | \
BLM_IS_AP_IN_RSSI_REJECT_LIST(cur_node) | \
BLM_IS_AP_BLACKLISTED_BY_DRIVER(cur_node)))
#define IS_AP_IN_MONITOR_LIST_ONLY(cur_node) \
(BLM_IS_AP_IN_MONITOR_LIST(cur_node) & \
!(BLM_IS_AP_IN_AVOIDLIST(cur_node) | \
BLM_IS_AP_IN_BLACKLIST(cur_node)))
#define IS_AP_IN_AVOID_LIST_ONLY(cur_node) \
(BLM_IS_AP_IN_AVOIDLIST(cur_node) & \
!(BLM_IS_AP_IN_MONITOR_LIST(cur_node) | \
BLM_IS_AP_IN_BLACKLIST(cur_node)))
#define IS_AP_IN_DRIVER_BLACKLIST_ONLY(cur_node) \
(BLM_IS_AP_BLACKLISTED_BY_DRIVER(cur_node) & \
!(BLM_IS_AP_IN_AVOIDLIST(cur_node) | \
BLM_IS_AP_IN_MONITOR_LIST(cur_node) | \
BLM_IS_AP_IN_RSSI_REJECT_LIST(cur_node) | \
BLM_IS_AP_BLACKLISTED_BY_USERSPACE(cur_node)))
#define IS_AP_IN_RSSI_REJECT_LIST_ONLY(cur_node) \
(BLM_IS_AP_IN_RSSI_REJECT_LIST(cur_node) & \
!(BLM_IS_AP_IN_AVOIDLIST(cur_node) | \
BLM_IS_AP_IN_MONITOR_LIST(cur_node) | \
BLM_IS_AP_BLACKLISTED_BY_DRIVER(cur_node) | \
BLM_IS_AP_BLACKLISTED_BY_USERSPACE(cur_node)))
#define IS_AP_IN_USERSPACE_AVOID_LIST_ONLY(cur_node) \
(BLM_IS_AP_AVOIDED_BY_USERSPACE(cur_node) & \
!(BLM_IS_AP_AVOIDED_BY_DRIVER(cur_node) | \
BLM_IS_AP_IN_MONITOR_LIST(cur_node) | \
BLM_IS_AP_IN_BLACKLIST(cur_node)))
#define IS_AP_IN_DRIVER_AVOID_LIST_ONLY(cur_node) \
(BLM_IS_AP_AVOIDED_BY_DRIVER(cur_node) & \
!(BLM_IS_AP_AVOIDED_BY_USERSPACE(cur_node) | \
BLM_IS_AP_IN_MONITOR_LIST(cur_node) | \
BLM_IS_AP_IN_BLACKLIST(cur_node)))
/**
* struct blm_reject_ap_timestamp - Structure to store the reject list BSSIDs
* entry time stamp.
* @userspace_avoid_timestamp: Time when userspace adds BSSID to avoid list.
* @driver_avoid_timestamp: Time when driver adds BSSID to avoid list.
* @userspace_blacklist_timestamp: Time when userspace adds BSSID to black list.
* @driver_blacklist_timestamp: Time when driver adds BSSID to black list.
* @rssi_reject_timestamp: Time when driver adds BSSID to rssi reject list.
* @driver_monitor_timestamp: Time when driver adds BSSID to monitor list.
*/
struct blm_reject_ap_timestamp {
qdf_time_t userspace_avoid_timestamp;
qdf_time_t driver_avoid_timestamp;
qdf_time_t userspace_blacklist_timestamp;
qdf_time_t driver_blacklist_timestamp;
qdf_time_t rssi_reject_timestamp;
qdf_time_t driver_monitor_timestamp;
};
/**
* struct blm_reject_ap - Structure of a node added to blacklist manager
* @node: Node of the entry
* @bssid: Bssid of the AP entry.
* @rssi_reject_params: Rssi reject params of the AP entry.
* @bad_bssid_counter: It represent how many times data stall happened.
* @ap_timestamp: Ap timestamp.
* @reject_ap_type: what is the type of rejection for the AP (avoid, black etc.)
* @reject_ap_reason: reason for adding the BSSID to BLM
* @connect_timestamp: Timestamp when the STA got connected with this BSSID
*/
struct blm_reject_ap {
qdf_list_node_t node;
struct qdf_mac_addr bssid;
struct blm_rssi_disallow_params rssi_reject_params;
uint8_t bad_bssid_counter;
struct blm_reject_ap_timestamp ap_timestamp;
union {
struct {
uint8_t userspace_blacklist:1,
driver_blacklist:1,
userspace_avoidlist:1,
driver_avoidlist:1,
rssi_reject_list:1,
driver_monitorlist:1;
};
uint8_t reject_ap_type;
};
union {
struct {
uint32_t nud_fail:1,
sta_kickout:1,
ho_fail:1,
poor_rssi:1,
oce_assoc_reject:1,
blacklist_userspace:1,
avoid_userspace:1,
btm_disassoc_imminent:1,
btm_bss_termination:1,
btm_mbo_retry:1,
reassoc_rssi_reject:1,
no_more_stas:1;
};
uint32_t reject_ap_reason;
};
enum blm_reject_ap_source source;
qdf_time_t connect_timestamp;
};
/**
* blm_add_bssid_to_reject_list() - Add BSSID to the specific reject list.
* @pdev: Pdev object
* @ap_info: Ap info params such as BSSID, and the type of rejection to be done
*
* This API will add the BSSID to the reject AP list maintained by the blacklist
* manager.
*
* Return: QDF status
*/
QDF_STATUS
blm_add_bssid_to_reject_list(struct wlan_objmgr_pdev *pdev,
struct reject_ap_info *ap_info);
#if defined(WLAN_FEATURE_ROAM_OFFLOAD)
/**
* blm_send_reject_ap_list_to_fw() - Send the blacklist BSSIDs to FW
* @pdev: Pdev object
* @reject_db_list: List of blacklist BSSIDs
* @cfg: Blacklist manager cfg
*
* This API will send the blacklist BSSIDs to FW for avoiding or blacklisting
* in roaming scenarios.
*
* Return: None
*/
void
blm_send_reject_ap_list_to_fw(struct wlan_objmgr_pdev *pdev,
qdf_list_t *reject_db_list,
struct blm_config *cfg);
/**
* blm_update_reject_ap_list_to_fw() - Send the blacklist BSSIDs to FW
* @psoc: psoc object
*
* This API will send the blacklist BSSIDs to FW.
*
* Return: None
*/
void blm_update_reject_ap_list_to_fw(struct wlan_objmgr_psoc *psoc);
#else
static inline void blm_send_reject_ap_list_to_fw(struct wlan_objmgr_pdev *pdev,
qdf_list_t *reject_db_list,
struct blm_config *cfg)
{
}
static inline void
blm_update_reject_ap_list_to_fw(struct wlan_objmgr_psoc *psoc)
{
}
#endif
/**
* blm_add_userspace_black_list() - Clear already existing userspace BSSID, and
* add the new ones to blacklist manager.
* @pdev: pdev object
* @bssid_black_list: BSSIDs to be blacklisted by userspace.
* @num_of_bssid: num of bssids to be blacklisted.
*
* This API will Clear already existing userspace BSSID, and add the new ones
* to blacklist manager's reject list.
*
* Return: QDF status
*/
QDF_STATUS
blm_add_userspace_black_list(struct wlan_objmgr_pdev *pdev,
struct qdf_mac_addr *bssid_black_list,
uint8_t num_of_bssid);
/**
* blm_update_bssid_connect_params() - Inform the BLM about connect/disconnect
* with the current AP.
* @pdev: pdev object
* @bssid: BSSID of the AP
* @con_state: Connection stae (connected/disconnected)
*
* This API will inform the BLM about the state with the AP so that if the AP
* is selected, and the connection went through, and the connection did not
* face any data stall till the bad bssid reset timer, BLM can remove the
* AP from the reject ap list maintained by it.
*
* Return: None
*/
void
blm_update_bssid_connect_params(struct wlan_objmgr_pdev *pdev,
struct qdf_mac_addr bssid,
enum blm_connection_state con_state);
/**
* blm_flush_reject_ap_list() - Clear away BSSID and destroy the reject ap list
* @blm_ctx: blacklist manager pdev priv object
*
* This API will clear the BSSID info in the reject AP list maintained by the
* blacklist manager, and will destroy the list as well.
*
* Return: None
*/
void
blm_flush_reject_ap_list(struct blm_pdev_priv_obj *blm_ctx);
/**
* blm_get_bssid_reject_list() - Get the BSSIDs in reject list from BLM
* @pdev: pdev object
* @reject_list: reject list to be filled (passed by caller)
* @max_bssid_to_be_filled: num of bssids filled in reject list by BLM
* @reject_ap_type: reject ap type of the BSSIDs to be filled.
*
* This API will fill the reject ap list requested by caller of type given as
* argument reject_ap_type, and will return the number of BSSIDs filled.
*
* Return: Unsigned integer (number of BSSIDs filled by the blacklist manager)
*/
uint8_t
blm_get_bssid_reject_list(struct wlan_objmgr_pdev *pdev,
struct reject_ap_config_params *reject_list,
uint8_t max_bssid_to_be_filled,
enum blm_reject_ap_type reject_ap_type);
/**
* blm_dump_blacklist_bssid - Dump blacklisted bssids
* @pdev: pdev object
*
* Return: None
*/
void blm_dump_blacklist_bssid(struct wlan_objmgr_pdev *pdev);
/**
* blm_get_rssi_blacklist_threshold() - Get rssi blacklist threshold value
* @pdev: pdev object
*
* This API will get the RSSI blacklist threshold info.
*
* Return: rssi theshold value
*/
int32_t
blm_get_rssi_blacklist_threshold(struct wlan_objmgr_pdev *pdev);
#endif

View File

@@ -1,177 +0,0 @@
/*
* Copyright (c) 2019-2021 The Linux Foundation. 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.
*/
/**
* DOC: declare internal APIs related to the blacklist manager component
*/
#ifndef _WLAN_BLM_MAIN_H_
#define _WLAN_BLM_MAIN_H_
#include <qdf_time.h>
#include <wlan_objmgr_cmn.h>
#include <wlan_objmgr_global_obj.h>
#include <wlan_blm_ucfg_api.h>
#define blm_fatal(params...)\
QDF_TRACE_FATAL(QDF_MODULE_ID_BLACKLIST_MGR, params)
#define blm_err(params...)\
QDF_TRACE_ERROR(QDF_MODULE_ID_BLACKLIST_MGR, params)
#define blm_warn(params...)\
QDF_TRACE_WARN(QDF_MODULE_ID_BLACKLIST_MGR, params)
#define blm_info(params...)\
QDF_TRACE_INFO(QDF_MODULE_ID_BLACKLIST_MGR, params)
#define blm_debug(params...)\
QDF_TRACE_DEBUG(QDF_MODULE_ID_BLACKLIST_MGR, params)
#define blm_nofl_debug(params...)\
QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_BLACKLIST_MGR, params)
/**
* struct blm_pdev_priv_obj - Pdev priv struct to store list of blacklist mgr.
* @reject_ap_list_lock: Mutex needed to restrict two threads updating the list.
* @reject_ap_list: The reject Ap list which would contain the list of bad APs.
* @blm_tx_ops: tx ops to send reject ap list to FW
*/
struct blm_pdev_priv_obj {
qdf_mutex_t reject_ap_list_lock;
qdf_list_t reject_ap_list;
struct wlan_blm_tx_ops blm_tx_ops;
};
/**
* struct blm_config - Structure to define the config params for blacklist mgr.
* @avoid_list_exipry_time: Timer after which transition from avoid->monitor
* would happen for the BSSID which is in avoid list.
* @black_list_exipry_time: Timer after which transition from black->monitor
* would happen for the BSSID which is in black list.
* @bad_bssid_counter_reset_time: Timer after which the bssid would be removed
* from the reject list when connected, and data stall is not seen with the AP.
* @bad_bssid_counter_thresh: This is the threshold count which is incremented
* after every NUD fail, and after this much count, the BSSID would be moved to
* blacklist.
* @delta_rssi: This is the rssi threshold, only when rssi
* improves by this value the entry for BSSID should be removed from black
* list manager list.
*/
struct blm_config {
qdf_time_t avoid_list_exipry_time;
qdf_time_t black_list_exipry_time;
qdf_time_t bad_bssid_counter_reset_time;
uint8_t bad_bssid_counter_thresh;
uint32_t delta_rssi;
};
/**
* struct blm_psoc_priv_obj - Psoc priv structure of the blacklist manager.
* @pdev_id: pdev id
* @is_suspended: is black list manager state suspended
* @blm_cfg: These are the config ini params that the user can configure.
*/
struct blm_psoc_priv_obj {
uint8_t pdev_id;
bool is_suspended;
struct blm_config blm_cfg;
};
/**
* blm_pdev_object_created_notification() - blacklist mgr pdev create
* handler
* @pdev: pdev which is going to be created by objmgr
* @arg: argument for pdev create handler
*
* Register this api with objmgr to detect if pdev is created.
*
* Return: QDF_STATUS status in case of success else return error
*/
QDF_STATUS
blm_pdev_object_created_notification(struct wlan_objmgr_pdev *pdev,
void *arg);
/**
* blm_pdev_object_destroyed_notification() - blacklist mgr pdev delete handler
* @pdev: pdev which is going to be deleted by objmgr
* @arg: argument for pdev delete handler
*
* Register this api with objmgr to detect if pdev is deleted.
*
* Return: QDF_STATUS status in case of success else return error
*/
QDF_STATUS
blm_pdev_object_destroyed_notification(struct wlan_objmgr_pdev *pdev,
void *arg);
/**
* blm_psoc_object_created_notification() - blacklist mgr psoc create handler
* @psoc: psoc which is going to be created by objmgr
* @arg: argument for psoc create handler
*
* Register this api with objmgr to detect if psoc is created.
*
* Return: QDF_STATUS status in case of success else return error
*/
QDF_STATUS
blm_psoc_object_created_notification(struct wlan_objmgr_psoc *psoc,
void *arg);
/**
* blm_psoc_object_destroyed_notification() - blacklist mgr psoc delete handler
* @psoc: psoc which is going to be deleted by objmgr
* @arg: argument for psoc delete handler.
*
* Register this api with objmgr to detect if psoc is deleted.
*
* Return: QDF_STATUS status in case of success else return error
*/
QDF_STATUS
blm_psoc_object_destroyed_notification(struct wlan_objmgr_psoc *psoc,
void *arg);
/**
* blm_cfg_psoc_open() - blacklist mgr psoc open handler
* @psoc: psoc which is initialized by objmgr
*
* This API will initialize the config file, and store the config while in the
* psoc priv object of the blacklist manager.
*
* Return: QDF_STATUS status in case of success else return error
*/
QDF_STATUS
blm_cfg_psoc_open(struct wlan_objmgr_psoc *psoc);
/**
* blm_get_pdev_obj() - Get the pdev priv object of the blacklist manager
* @pdev: pdev object
*
* Get the pdev priv object of the blacklist manager
*
* Return: Pdev priv object if present, else NULL.
*/
struct blm_pdev_priv_obj *
blm_get_pdev_obj(struct wlan_objmgr_pdev *pdev);
/**
* blm_get_psoc_obj() - Get the psoc priv object of the blacklist manager
* @psoc: psoc object
*
* Get the psoc priv object of the blacklist manager
*
* Return: Psoc priv object if present, else NULL.
*/
struct blm_psoc_priv_obj *
blm_get_psoc_obj(struct wlan_objmgr_psoc *psoc);
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -1,189 +0,0 @@
/*
* Copyright (c) 2019-2020 The Linux Foundation. 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.
*/
/**
* DOC: wlan_blm_main.c
*
* WLAN Blacklist Mgr related APIs
*
*/
/* Include files */
#include "target_if_blm.h"
#include <wlan_blm_ucfg_api.h>
#include "cfg_ucfg_api.h"
#include <wlan_blm_core.h>
struct blm_pdev_priv_obj *
blm_get_pdev_obj(struct wlan_objmgr_pdev *pdev)
{
struct blm_pdev_priv_obj *blm_pdev_obj;
blm_pdev_obj = wlan_objmgr_pdev_get_comp_private_obj(pdev,
WLAN_UMAC_COMP_BLACKLIST_MGR);
return blm_pdev_obj;
}
struct blm_psoc_priv_obj *
blm_get_psoc_obj(struct wlan_objmgr_psoc *psoc)
{
struct blm_psoc_priv_obj *blm_psoc_obj;
blm_psoc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
WLAN_UMAC_COMP_BLACKLIST_MGR);
return blm_psoc_obj;
}
QDF_STATUS
blm_pdev_object_created_notification(struct wlan_objmgr_pdev *pdev,
void *arg)
{
struct blm_pdev_priv_obj *blm_ctx;
QDF_STATUS status;
blm_ctx = qdf_mem_malloc(sizeof(*blm_ctx));
if (!blm_ctx)
return QDF_STATUS_E_FAILURE;
status = qdf_mutex_create(&blm_ctx->reject_ap_list_lock);
if (QDF_IS_STATUS_ERROR(status)) {
blm_err("Failed to create mutex");
qdf_mem_free(blm_ctx);
return status;
}
qdf_list_create(&blm_ctx->reject_ap_list, MAX_BAD_AP_LIST_SIZE);
target_if_blm_register_tx_ops(&blm_ctx->blm_tx_ops);
status = wlan_objmgr_pdev_component_obj_attach(pdev,
WLAN_UMAC_COMP_BLACKLIST_MGR,
blm_ctx,
QDF_STATUS_SUCCESS);
if (QDF_IS_STATUS_ERROR(status)) {
blm_err("Failed to attach pdev_ctx with pdev");
qdf_list_destroy(&blm_ctx->reject_ap_list);
qdf_mutex_destroy(&blm_ctx->reject_ap_list_lock);
qdf_mem_free(blm_ctx);
}
return status;
}
QDF_STATUS
blm_pdev_object_destroyed_notification(struct wlan_objmgr_pdev *pdev,
void *arg)
{
struct blm_pdev_priv_obj *blm_ctx;
blm_ctx = blm_get_pdev_obj(pdev);
if (!blm_ctx) {
blm_err("BLM Pdev obj is NULL");
return QDF_STATUS_E_FAILURE;
}
/* Clear away the memory allocated for the bad BSSIDs */
blm_flush_reject_ap_list(blm_ctx);
qdf_list_destroy(&blm_ctx->reject_ap_list);
qdf_mutex_destroy(&blm_ctx->reject_ap_list_lock);
wlan_objmgr_pdev_component_obj_detach(pdev,
WLAN_UMAC_COMP_BLACKLIST_MGR,
blm_ctx);
qdf_mem_free(blm_ctx);
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
blm_psoc_object_created_notification(struct wlan_objmgr_psoc *psoc,
void *arg)
{
struct blm_psoc_priv_obj *blm_psoc_obj;
QDF_STATUS status;
blm_psoc_obj = qdf_mem_malloc(sizeof(*blm_psoc_obj));
if (!blm_psoc_obj)
return QDF_STATUS_E_FAILURE;
status = wlan_objmgr_psoc_component_obj_attach(psoc,
WLAN_UMAC_COMP_BLACKLIST_MGR,
blm_psoc_obj,
QDF_STATUS_SUCCESS);
if (QDF_IS_STATUS_ERROR(status)) {
blm_err("Failed to attach psoc_ctx with psoc");
qdf_mem_free(blm_psoc_obj);
}
return status;
}
QDF_STATUS
blm_psoc_object_destroyed_notification(struct wlan_objmgr_psoc *psoc, void *arg)
{
struct blm_psoc_priv_obj *blm_psoc_obj;
blm_psoc_obj = blm_get_psoc_obj(psoc);
if (!blm_psoc_obj) {
blm_err("BLM psoc obj NULL");
return QDF_STATUS_E_FAILURE;
}
wlan_objmgr_psoc_component_obj_detach(psoc,
WLAN_UMAC_COMP_BLACKLIST_MGR,
blm_psoc_obj);
qdf_mem_free(blm_psoc_obj);
return QDF_STATUS_SUCCESS;
}
static void
blm_init_cfg(struct wlan_objmgr_psoc *psoc, struct blm_config *blm_cfg)
{
blm_cfg->avoid_list_exipry_time =
cfg_get(psoc, CFG_AVOID_LIST_EXPIRY_TIME);
blm_cfg->black_list_exipry_time =
cfg_get(psoc, CFG_BLACK_LIST_EXPIRY_TIME);
blm_cfg->bad_bssid_counter_reset_time =
cfg_get(psoc, CFG_BAD_BSSID_RESET_TIME);
blm_cfg->bad_bssid_counter_thresh =
cfg_get(psoc, CFG_BAD_BSSID_COUNTER_THRESHOLD);
blm_cfg->delta_rssi =
cfg_get(psoc, CFG_BLACKLIST_RSSI_THRESHOLD);
}
QDF_STATUS
blm_cfg_psoc_open(struct wlan_objmgr_psoc *psoc)
{
struct blm_psoc_priv_obj *blm_psoc_obj;
blm_psoc_obj = blm_get_psoc_obj(psoc);
if (!blm_psoc_obj) {
blm_err("BLM psoc obj NULL");
return QDF_STATUS_E_FAILURE;
}
blm_init_cfg(psoc, &blm_psoc_obj->blm_cfg);
return QDF_STATUS_SUCCESS;
}

View File

@@ -1,151 +0,0 @@
/*
* Copyright (c) 2019-2021 The Linux Foundation. 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.
*/
/**
* DOC: declare public APIs exposed by the blacklist manager component
*/
#ifndef _WLAN_BLM_API_H_
#define _WLAN_BLM_API_H_
#include "qdf_types.h"
#include "wlan_objmgr_pdev_obj.h"
#include <wlan_blm_public_struct.h>
#ifdef FEATURE_BLACKLIST_MGR
#include "wlan_blm_core.h"
/**
* wlan_blm_add_bssid_to_reject_list() - Add BSSID to the specific reject list.
* @pdev: Pdev object
* @ap_info: Ap info params such as BSSID, and the type of rejection to be done
*
* This API will add the BSSID to the reject AP list maintained by the blacklist
* manager.
*/
static inline QDF_STATUS
wlan_blm_add_bssid_to_reject_list(struct wlan_objmgr_pdev *pdev,
struct reject_ap_info *ap_info)
{
return blm_add_bssid_to_reject_list(pdev, ap_info);
}
/**
* wlan_blm_update_bssid_connect_params() - Inform the BLM about connect or
* disconnect with the current AP.
* @pdev: pdev object
* @bssid: BSSID of the AP
* @con_state: Connection stae (connected/disconnected)
*
* This API will inform the BLM about the state with the AP so that if the AP
* is selected, and the connection went through, and the connection did not
* face any data stall till the bad bssid reset timer, BLM can remove the
* AP from the reject ap list maintained by it.
*
* Return: None
*/
static inline void
wlan_blm_update_bssid_connect_params(struct wlan_objmgr_pdev *pdev,
struct qdf_mac_addr bssid,
enum blm_connection_state con_state)
{
return blm_update_bssid_connect_params(pdev, bssid, con_state);
}
/**
* wlan_blm_get_bssid_reject_list() - Get the BSSIDs in reject list from BLM
* @pdev: pdev object
* @reject_list: reject list to be filled (passed by caller)
* @max_bssid_to_be_filled: num of bssids filled in reject list by BLM
* @reject_ap_type: reject ap type of the BSSIDs to be filled.
*
* This API is a wrapper to an API of blacklist manager which will fill the
* reject ap list requested by caller of type given as argument reject_ap_type,
* and will return the number of BSSIDs filled.
*
* Return: Unsigned integer (number of BSSIDs filled by the blacklist manager)
*/
static inline uint8_t
wlan_blm_get_bssid_reject_list(struct wlan_objmgr_pdev *pdev,
struct reject_ap_config_params *reject_list,
uint8_t max_bssid_to_be_filled,
enum blm_reject_ap_type reject_ap_type)
{
return blm_get_bssid_reject_list(pdev, reject_list,
max_bssid_to_be_filled,
reject_ap_type);
}
/**
* wlan_blm_dump_blcklist_bssid() - dump the blacklisted BSSIDs from BLM
* @pdev: pdev object
*
* Return: None
*/
static inline void
wlan_blm_dump_blcklist_bssid(struct wlan_objmgr_pdev *pdev)
{
return blm_dump_blacklist_bssid(pdev);
}
/**
* wlan_blm_get_rssi_blacklist_threshold() - Get the RSSI blacklist threshold
* @pdev: pdev object
*
* This API will get the rssi blacklist threshold value configured via
* CFG_BLACKLIST_RSSI_THRESHOLD.
*
* Return: int32_t (threshold value)
*/
static inline int32_t
wlan_blm_get_rssi_blacklist_threshold(struct wlan_objmgr_pdev *pdev)
{
return blm_get_rssi_blacklist_threshold(pdev);
}
#else
static inline QDF_STATUS
wlan_blm_add_bssid_to_reject_list(struct wlan_objmgr_pdev *pdev,
struct reject_ap_info *ap_info)
{
return QDF_STATUS_SUCCESS;
}
static inline uint8_t
wlan_blm_get_bssid_reject_list(struct wlan_objmgr_pdev *pdev,
struct reject_ap_config_params *reject_list,
uint8_t max_bssid_to_be_filled,
enum blm_reject_ap_type reject_ap_type)
{
return 0;
}
static inline void
wlan_blm_update_bssid_connect_params(struct wlan_objmgr_pdev *pdev,
struct qdf_mac_addr bssid,
enum blm_connection_state con_state)
{
}
static inline int32_t
wlan_blm_get_rssi_blacklist_threshold(struct wlan_objmgr_pdev *pdev)
{
return 0;
}
#endif
#endif

View File

@@ -1,178 +0,0 @@
/*
* Copyright (c) 2019-2021 The Linux Foundation. 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.
*/
/**
* DOC: define public structures of blacklist mgr.
*/
#ifndef _WLAN_BLM_PUBLIC_STRUCT_H
#define _WLAN_BLM_PUBLIC_STRUCT_H
#include <qdf_types.h>
#include "wlan_objmgr_pdev_obj.h"
#define MAX_BAD_AP_LIST_SIZE 28
#define MAX_RSSI_AVOID_BSSID_LIST 10
#define PDEV_MAX_NUM_BSSID_DISALLOW_LIST 28
/**
* enum blm_reject_ap_reason - Rejection reason for adding BSSID to BLM
* @ADDED_BY_DRIVER: Source adding this BSSID is driver
* @ADDED_BY_TARGET: Source adding this BSSID is target
*/
enum blm_reject_ap_source {
ADDED_BY_DRIVER = 1,
ADDED_BY_TARGET,
};
/**
* struct blm_rssi_disallow_params - structure to specify params for RSSI reject
* @retry_delay: Time before which the AP doesn't expect a connection.
* @expected_rssi: RSSI less than which only the STA should try association.
* @received_time: Time at which the AP was added to blacklist.
* @original_timeout: Original timeout which the AP sent while blacklisting.
* @source: Source of adding this BSSID to RSSI reject list
*/
struct blm_rssi_disallow_params {
uint32_t retry_delay;
int8_t expected_rssi;
qdf_time_t received_time;
uint32_t original_timeout;
enum blm_reject_ap_source source;
};
/**
* enum blm_reject_ap_type - Rejection type of the AP
* @USERSPACE_AVOID_TYPE: userspace wants the AP to be avoided.
* @USERSPACE_BLACKLIST_TYPE: userspace wants the AP to be blacklisted.
* @DRIVER_AVOID_TYPE: driver wants the AP to be avoided.
* @DRIVER_BLACKLIST_TYPE: driver wants the AP to be blacklisted.
* @DRIVER_RSSI_REJECT_TYPE: driver wants the AP to be in driver rssi reject.
* @DRIVER_MONITOR_TYPE: driver wants the AP to be in monitor list.
* @REJECT_REASON_UNKNOWN: Rejection reason unknown
*/
enum blm_reject_ap_type {
USERSPACE_AVOID_TYPE = 0,
USERSPACE_BLACKLIST_TYPE = 1,
DRIVER_AVOID_TYPE = 2,
DRIVER_BLACKLIST_TYPE = 3,
DRIVER_RSSI_REJECT_TYPE = 4,
DRIVER_MONITOR_TYPE = 5,
REJECT_REASON_UNKNOWN = 6,
};
/**
* enum blm_reject_ap_reason - Rejection reason for adding BSSID to BLM
* @REASON_UNKNOWN: Unknown reason
* @REASON_NUD_FAILURE: NUD failure happened with this BSSID
* @REASON_STA_KICKOUT: STA kickout happened with this BSSID
* @REASON_ROAM_HO_FAILURE: HO failure happenend with this BSSID
* @REASON_ASSOC_REJECT_POOR_RSSI: assoc rsp with reason 71 received from AP.
* @REASON_ASSOC_REJECT_OCE: OCE assoc reject received from the AP.
* @REASON_USERSPACE_BL: Userspace wants to blacklist this AP.
* @REASON_USERSPACE_AVOID_LIST: Userspace wants to avoid this AP.
* @REASON_BTM_DISASSOC_IMMINENT: BTM IE received with disassoc imminent set.
* @REASON_BTM_BSS_TERMINATION: BTM IE received with BSS termination set.
* @REASON_BTM_MBO_RETRY: BTM IE received from AP with MBO retry set.
* @REASON_REASSOC_RSSI_REJECT: Re-Assoc resp received with reason code 34
* @REASON_REASSOC_NO_MORE_STAS: Re-assoc reject received with reason code 17
*/
enum blm_reject_ap_reason {
REASON_UNKNOWN = 0,
REASON_NUD_FAILURE,
REASON_STA_KICKOUT,
REASON_ROAM_HO_FAILURE,
REASON_ASSOC_REJECT_POOR_RSSI,
REASON_ASSOC_REJECT_OCE,
REASON_USERSPACE_BL,
REASON_USERSPACE_AVOID_LIST,
REASON_BTM_DISASSOC_IMMINENT,
REASON_BTM_BSS_TERMINATION,
REASON_BTM_MBO_RETRY,
REASON_REASSOC_RSSI_REJECT,
REASON_REASSOC_NO_MORE_STAS,
};
/**
* enum blm_connection_state - State with AP (Connected, Disconnected)
* @BLM_AP_CONNECTED: Connected with the AP
* @BLM_AP_DISCONNECTED: Disconnected with the AP
*/
enum blm_connection_state {
BLM_AP_CONNECTED,
BLM_AP_DISCONNECTED,
};
/**
* struct reject_ap_config_params - Structure to send reject ap list to FW
* @bssid: BSSID of the AP
* @reject_ap_type: Type of the rejection done with the BSSID
* @reject_duration: time left till the AP is in the reject list.
* @expected_rssi: expected RSSI when the AP expects the connection to be made.
* @reject_reason: reason to add the BSSID to BLM
* @source: Source of adding the BSSID to BLM
* @received_time: Time at which the AP was added to blacklist.
* @original_timeout: Original timeout which the AP sent while blacklisting.
*/
struct reject_ap_config_params {
struct qdf_mac_addr bssid;
enum blm_reject_ap_type reject_ap_type;
uint32_t reject_duration;
int32_t expected_rssi;
enum blm_reject_ap_reason reject_reason;
enum blm_reject_ap_source source;
qdf_time_t received_time;
uint32_t original_timeout;
};
/**
* struct reject_ap_params - Struct to send bssid list and there num to FW
* @num_of_reject_bssid: num of bssid params there in bssid config.
* @bssid_list: Pointer to the bad bssid list
*/
struct reject_ap_params {
uint8_t num_of_reject_bssid;
struct reject_ap_config_params *bssid_list;
};
/**
* struct wlan_blm_tx_ops - structure of tx operation function
* pointers for blacklist manager component
* @blm_send_reject_ap_list: send reject ap list to fw
*/
struct wlan_blm_tx_ops {
QDF_STATUS (*blm_send_reject_ap_list)(struct wlan_objmgr_pdev *pdev,
struct reject_ap_params *reject_params);
};
/**
* struct reject_ap_info - structure to specify the reject ap info.
* @bssid: BSSID of the AP.
* @rssi_reject_params: RSSI reject params of the AP is of type RSSI reject
* @reject_ap_type: Reject type of AP (eg. avoid, blacklist, rssi reject etc.)
* @reject_reason: reason to add the BSSID to BLM
* @source: Source of adding the BSSID to BLM
*/
struct reject_ap_info {
struct qdf_mac_addr bssid;
struct blm_rssi_disallow_params rssi_reject_params;
enum blm_reject_ap_type reject_ap_type;
enum blm_reject_ap_reason reject_reason;
enum blm_reject_ap_source source;
};
#endif

View File

@@ -1,41 +0,0 @@
/*
* Copyright (c) 2019 The Linux Foundation. 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.
*/
/**
* DOC: Declare public API for blacklist manager to interact with target/WMI
*/
#ifndef _WLAN_BLM_TGT_API_H
#define _WLAN_BLM_TGT_API_H
#include "wlan_blm_main.h"
/**
* tgt_blm_send_reject_list_to_fw() - API to send the reject ap list to FW.
* @pdev: pdev object
* @reject_params: Reject params contains the bssid list, and num of bssids
*
* This API will send the reject AP list maintained by the blacklist manager
* to the target.
*
* Return: QDF status
*/
QDF_STATUS
tgt_blm_send_reject_list_to_fw(struct wlan_objmgr_pdev *pdev,
struct reject_ap_params *reject_params);
#endif

View File

@@ -1,221 +0,0 @@
/*
* Copyright (c) 2019-2021 The Linux Foundation. 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.
*/
/**
* DOC: declare UCFG APIs exposed by the blacklist manager component
*/
#ifndef _WLAN_BLM_UCFG_H_
#define _WLAN_BLM_UCFG_H_
#include "qdf_types.h"
#include "wlan_objmgr_psoc_obj.h"
#include <wlan_blm_public_struct.h>
#ifdef FEATURE_BLACKLIST_MGR
/**
* ucfg_blm_init() - initialize blacklist mgr context
*
* This function initializes the blacklist mgr context
*
* Return: QDF_STATUS_SUCCESS - in case of success else return error
*/
QDF_STATUS ucfg_blm_init(void);
/**
* ucfg_blm_deinit() - De initialize blacklist mgr context
*
* This function De initializes blacklist mgr context
*
* Return: QDF_STATUS_SUCCESS - in case of success else return error
*/
QDF_STATUS ucfg_blm_deinit(void);
/**
* ucfg_blm_psoc_set_suspended() - API to set blacklist mgr state suspended
* @psoc: pointer to psoc object
* @state: state to be set
*
* This function sets blacklist mgr state to suspended
*
* Return: QDF_STATUS_SUCCESS - in case of success else return error
*/
QDF_STATUS ucfg_blm_psoc_set_suspended(struct wlan_objmgr_psoc *psoc,
bool state);
/**
* ucfg_blm_psoc_get_suspended() - API to get blacklist mgr state suspended
* @psoc: pointer to psoc object
* @state: pointer to get suspend state of blacklist manager
*
* Return: QDF_STATUS_SUCCESS - in case of success else return error
*/
QDF_STATUS ucfg_blm_psoc_get_suspended(struct wlan_objmgr_psoc *psoc,
bool *state);
/**
* ucfg_blm_psoc_open() - API to initialize the cfg when psoc is initialized.
* @psoc: psoc object
*
* This function initializes the config of blacklist mgr.
*
* Return: QDF_STATUS_SUCCESS - in case of success else return error
*/
QDF_STATUS ucfg_blm_psoc_open(struct wlan_objmgr_psoc *psoc);
/**
* ucfg_blm_psoc_close() - API to deinit the blm when psoc is deinitialized.
* @psoc: psoc object
*
* This function deinits the blm psoc object.
*
* Return: QDF_STATUS_SUCCESS - in case of success else return error
*/
QDF_STATUS ucfg_blm_psoc_close(struct wlan_objmgr_psoc *psoc);
/**
* ucfg_blm_add_userspace_black_list() - Clear already existing userspace BSSID,
* and add the new ones to blacklist manager.
* @pdev: pdev object
* @bssid_black_list: BSSIDs to be blacklisted by userspace.
* @num_of_bssid: num of bssids to be blacklisted.
*
* This API clear already existing userspace BSSID, and add the new ones to
* blacklist manager
*
* Return: QDF_STATUS_SUCCESS - in case of success else return error.
*/
QDF_STATUS
ucfg_blm_add_userspace_black_list(struct wlan_objmgr_pdev *pdev,
struct qdf_mac_addr *bssid_black_list,
uint8_t num_of_bssid);
/**
* ucfg_blm_dump_black_list_ap() - get blacklisted bssid.
* @pdev: pdev object
*
* This API dumps blacklist ap
*
* Return: None
*/
void ucfg_blm_dump_black_list_ap(struct wlan_objmgr_pdev *pdev);
/**
* ucfg_blm_update_bssid_connect_params() - Inform the BLM about connect or
* disconnect with the current AP.
* @pdev: pdev object
* @bssid: BSSID of the AP
* @con_state: Connection stae (connected/disconnected)
*
* This API will inform the BLM about the state with the AP so that if the AP
* is selected, and the connection went through, and the connection did not
* face any data stall till the bad bssid reset timer, BLM can remove the
* AP from the reject ap list maintained by it.
*
* Return: None
*/
void
ucfg_blm_update_bssid_connect_params(struct wlan_objmgr_pdev *pdev,
struct qdf_mac_addr bssid,
enum blm_connection_state con_state);
/**
* ucfg_blm_add_bssid_to_reject_list() - Add BSSID to the specific reject list.
* @pdev: Pdev object
* @ap_info: Ap info params such as BSSID, and the type of rejection to be done
*
* This API will add the BSSID to the reject AP list maintained by the blacklist
* manager.
*
* Return: QDF_STATUS_SUCCESS - in case of success else return error.
*/
QDF_STATUS
ucfg_blm_add_bssid_to_reject_list(struct wlan_objmgr_pdev *pdev,
struct reject_ap_info *ap_info);
/**
* ucfg_blm_wifi_off() - Inform the blacklist manager about wifi off
* @blm_ctx: blacklist manager pdev priv object
*
* This API will inform the blacklist manager that the user has turned wifi off
* from the UI, and the blacklist manager can take action based upon this.
*
* Return: None
*/
void
ucfg_blm_wifi_off(struct wlan_objmgr_pdev *pdev);
#else
static inline
QDF_STATUS ucfg_blm_init(void)
{
return QDF_STATUS_SUCCESS;
}
static inline
QDF_STATUS ucfg_blm_deinit(void)
{
return QDF_STATUS_SUCCESS;
}
static inline
QDF_STATUS ucfg_blm_psoc_open(struct wlan_objmgr_psoc *psoc)
{
return QDF_STATUS_SUCCESS;
}
static inline
QDF_STATUS ucfg_blm_psoc_close(struct wlan_objmgr_psoc *psoc)
{
return QDF_STATUS_SUCCESS;
}
static inline
void ucfg_blm_dump_black_list_ap(struct wlan_objmgr_pdev *pdev)
{}
static inline
QDF_STATUS
ucfg_blm_add_bssid_to_reject_list(struct wlan_objmgr_pdev *pdev,
struct reject_ap_info *ap_info)
{
return QDF_STATUS_SUCCESS;
}
static inline QDF_STATUS
ucfg_blm_add_userspace_black_list(struct wlan_objmgr_pdev *pdev,
struct qdf_mac_addr *bssid_black_list,
uint8_t num_of_bssid)
{
return QDF_STATUS_SUCCESS;
}
static inline void
ucfg_blm_update_bssid_connect_params(struct wlan_objmgr_pdev *pdev,
struct qdf_mac_addr bssid,
enum blm_connection_state con_state)
{
}
static inline
void ucfg_blm_wifi_off(struct wlan_objmgr_pdev *pdev)
{
}
#endif
#endif /* _WLAN_BLM_UCFG_H_ */

View File

@@ -1,175 +0,0 @@
/*
* Copyright (c) 2019-2020 The Linux Foundation. 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.
*/
/**
* DOC: This file contains ini params for blacklist mgr component
*/
#ifndef __CFG_BLM_H_
#define __CFG_BLM_H_
#ifdef FEATURE_BLACKLIST_MGR
/*
* <ini>
* avoid_list_expiry_time - Config Param to move AP from avoid to monitor list.
* @Min: 1 minutes
* @Max: 300 minutes
* @Default: 5 minutes
*
* This ini is used to specify the time after which the BSSID which is in the
* avoid list should be moved to monitor list, assuming that the AP or the
* gateway with which the data stall happenend might have recovered, and now
* the STA can give another chance to connect to the AP.
*
* Supported Feature: Data Stall Recovery
*
* Usage: External
*
* </ini>
*/
#define CFG_AVOID_LIST_EXPIRY_TIME CFG_INI_UINT( \
"avoid_list_expiry_time", \
1, \
300, \
5, \
CFG_VALUE_OR_DEFAULT, \
"avoid list expiry")
/*
* <ini>
* bad_bssid_counter_thresh - Threshold to move the Ap from avoid to blacklist.
* @Min: 2
* @Max: 10
* @Default: 3
*
* This ini is used to specify the threshld after which the BSSID which is in
* the avoid list should be moved to black list, assuming that the AP or the
* gateway with which the data stall happenend has no recovered, and now
* the STA got the NUD failure again with the BSSID
*
* Supported Feature: Data Stall Recovery
*
* Usage: External
*
* </ini>
*/
#define CFG_BAD_BSSID_COUNTER_THRESHOLD CFG_INI_UINT( \
"bad_bssid_counter_thresh", \
2, \
10, \
3, \
CFG_VALUE_OR_DEFAULT, \
"bad bssid counter thresh")
/*
* <ini>
* black_list_expiry_time - Config Param to move AP from blacklist to monitor
* list.
* @Min: 1 minutes
* @Max: 600 minutes
* @Default: 10 minutes
*
* This ini is used to specify the time after which the BSSID which is in the
* black list should be moved to monitor list, assuming that the AP or the
* gateway with which the data stall happenend might have recovered, and now
* the STA can give another chance to connect to the AP.
*
* Supported Feature: Data Stall Recovery
*
* Usage: External
*
* </ini>
*/
#define CFG_BLACK_LIST_EXPIRY_TIME CFG_INI_UINT( \
"black_list_expiry_time", \
1, \
600, \
10, \
CFG_VALUE_OR_DEFAULT, \
"black list expiry")
/*
* <ini>
* bad_bssid_reset_time - Config Param to specify time after which AP would be
* removed from monitor/avoid when connected.
* @Min: 30 seconds
* @Max: 1 minute
* @Default: 30 seconds
*
* This ini is used to specify the time after which the BSSID which is in the
* avoid or monitor list should be removed from the respective list, if the
* data stall has not happened till the mentioned time after connection to the
* AP. That means that the AP has recovered from the previous state where
* data stall was observed with it, and was moved to avoid list.
*
* Supported Feature: Data Stall Recovery
*
* Usage: External
*
* </ini>
*/
#define CFG_BAD_BSSID_RESET_TIME CFG_INI_UINT( \
"bad_bssid_reset_time", \
30, \
60, \
30, \
CFG_VALUE_OR_DEFAULT, \
"bad bssid reset time")
/*
* <ini>
* delta_rssi - RSSI threshold value, only when AP rssi improves
* by threshold value entry would be removed from blacklist manager and assoc
* req would be sent by FW.
* @Min: 0
* @Max: 10
* @Default: 5
*
* This ini is used to specify the rssi threshold value, after rssi improves
* by threshold the BSSID which is in the blacklist manager list should be
* removed from the respective list.
*
* Supported Feature: Customer requirement
*
* Usage: Internal/External
*
* </ini>
*/
#define CFG_BLACKLIST_RSSI_THRESHOLD CFG_INI_INT( \
"delta_rssi", \
0, \
10, \
5, \
CFG_VALUE_OR_DEFAULT, \
"Configure delta RSSI")
#define CFG_BLACKLIST_MGR_ALL \
CFG(CFG_AVOID_LIST_EXPIRY_TIME) \
CFG(CFG_BAD_BSSID_COUNTER_THRESHOLD) \
CFG(CFG_BLACK_LIST_EXPIRY_TIME) \
CFG(CFG_BAD_BSSID_RESET_TIME) \
CFG(CFG_BLACKLIST_RSSI_THRESHOLD)
#else
#define CFG_BLACKLIST_MGR_ALL
#endif /* FEATURE_BLACKLIST_MGR */
#endif /* __CFG_BLACKLIST_MGR */

View File

@@ -1,50 +0,0 @@
/*
* Copyright (c) 2019-2020 The Linux Foundation. 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.
*/
/**
* DOC: Implements public API for blacklist manager to interact with target/WMI
*/
#include "wlan_blm_tgt_api.h"
#if defined(WLAN_FEATURE_ROAM_OFFLOAD)
QDF_STATUS
tgt_blm_send_reject_list_to_fw(struct wlan_objmgr_pdev *pdev,
struct reject_ap_params *reject_params)
{
struct wlan_blm_tx_ops *blm_tx_ops;
struct blm_pdev_priv_obj *blm_priv;
blm_priv = blm_get_pdev_obj(pdev);
if (!blm_priv) {
blm_err("blm_priv is NULL");
return QDF_STATUS_E_FAILURE;
}
blm_tx_ops = &blm_priv->blm_tx_ops;
if (!blm_tx_ops) {
blm_err("blm_tx_ops is NULL");
return QDF_STATUS_E_FAILURE;
}
if (blm_tx_ops->blm_send_reject_ap_list)
return blm_tx_ops->blm_send_reject_ap_list(pdev, reject_params);
blm_err("Tx ops not registered, failed to send reject list to FW");
return QDF_STATUS_E_FAILURE;
}
#endif

View File

@@ -1,252 +0,0 @@
/*
* Copyright (c) 2019-2021 The Linux Foundation. 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.
*/
/**
* DOC: define UCFG APIs exposed by the blacklist mgr component
*/
#include <wlan_blm_ucfg_api.h>
#include <wlan_blm_core.h>
#include <wlan_blm_api.h>
#include "wlan_pmo_obj_mgmt_api.h"
QDF_STATUS ucfg_blm_init(void)
{
QDF_STATUS status;
status = wlan_objmgr_register_pdev_create_handler(
WLAN_UMAC_COMP_BLACKLIST_MGR,
blm_pdev_object_created_notification,
NULL);
if (QDF_IS_STATUS_ERROR(status)) {
blm_err("pdev create register notification failed");
goto fail_create_pdev;
}
status = wlan_objmgr_register_pdev_destroy_handler(
WLAN_UMAC_COMP_BLACKLIST_MGR,
blm_pdev_object_destroyed_notification,
NULL);
if (QDF_IS_STATUS_ERROR(status)) {
blm_err("pdev destroy register notification failed");
goto fail_destroy_pdev;
}
status = wlan_objmgr_register_psoc_create_handler(
WLAN_UMAC_COMP_BLACKLIST_MGR,
blm_psoc_object_created_notification,
NULL);
if (QDF_IS_STATUS_ERROR(status)) {
blm_err("psoc create register notification failed");
goto fail_create_psoc;
}
status = wlan_objmgr_register_psoc_destroy_handler(
WLAN_UMAC_COMP_BLACKLIST_MGR,
blm_psoc_object_destroyed_notification,
NULL);
if (QDF_IS_STATUS_ERROR(status)) {
blm_err("psoc destroy register notification failed");
goto fail_destroy_psoc;
}
return QDF_STATUS_SUCCESS;
fail_destroy_psoc:
wlan_objmgr_unregister_psoc_create_handler(WLAN_UMAC_COMP_BLACKLIST_MGR,
blm_psoc_object_created_notification, NULL);
fail_create_psoc:
wlan_objmgr_unregister_pdev_destroy_handler(
WLAN_UMAC_COMP_BLACKLIST_MGR,
blm_pdev_object_destroyed_notification, NULL);
fail_destroy_pdev:
wlan_objmgr_unregister_pdev_create_handler(WLAN_UMAC_COMP_BLACKLIST_MGR,
blm_pdev_object_created_notification, NULL);
fail_create_pdev:
return status;
}
QDF_STATUS ucfg_blm_deinit(void)
{
QDF_STATUS status;
status = wlan_objmgr_unregister_psoc_destroy_handler(
WLAN_UMAC_COMP_BLACKLIST_MGR,
blm_psoc_object_destroyed_notification,
NULL);
status = wlan_objmgr_unregister_psoc_create_handler(
WLAN_UMAC_COMP_BLACKLIST_MGR,
blm_psoc_object_created_notification,
NULL);
status = wlan_objmgr_unregister_pdev_destroy_handler(
WLAN_UMAC_COMP_BLACKLIST_MGR,
blm_pdev_object_destroyed_notification,
NULL);
status = wlan_objmgr_unregister_pdev_create_handler(
WLAN_UMAC_COMP_BLACKLIST_MGR,
blm_pdev_object_created_notification,
NULL);
return status;
}
QDF_STATUS ucfg_blm_psoc_set_suspended(struct wlan_objmgr_psoc *psoc,
bool state)
{
struct blm_psoc_priv_obj *blm_psoc_obj;
blm_psoc_obj = blm_get_psoc_obj(psoc);
if (!blm_psoc_obj) {
blm_err("BLM psoc obj NULL");
return QDF_STATUS_E_FAILURE;
}
blm_psoc_obj->is_suspended = state;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS ucfg_blm_psoc_get_suspended(struct wlan_objmgr_psoc *psoc,
bool *state)
{
struct blm_psoc_priv_obj *blm_psoc_obj;
blm_psoc_obj = blm_get_psoc_obj(psoc);
if (!blm_psoc_obj) {
blm_err("BLM psoc obj NULL");
*state = true;
return QDF_STATUS_E_FAILURE;
}
*state = blm_psoc_obj->is_suspended;
return QDF_STATUS_SUCCESS;
}
static QDF_STATUS
ucfg_blm_suspend_handler(struct wlan_objmgr_psoc *psoc, void *arg)
{
ucfg_blm_psoc_set_suspended(psoc, true);
return QDF_STATUS_SUCCESS;
}
static QDF_STATUS
ucfg_blm_resume_handler(struct wlan_objmgr_psoc *psoc, void *arg)
{
ucfg_blm_psoc_set_suspended(psoc, false);
blm_update_reject_ap_list_to_fw(psoc);
return QDF_STATUS_SUCCESS;
}
static inline void
ucfg_blm_register_pmo_handler(void)
{
pmo_register_suspend_handler(WLAN_UMAC_COMP_BLACKLIST_MGR,
ucfg_blm_suspend_handler, NULL);
pmo_register_resume_handler(WLAN_UMAC_COMP_BLACKLIST_MGR,
ucfg_blm_resume_handler, NULL);
}
static inline void
ucfg_blm_unregister_pmo_handler(void)
{
pmo_unregister_suspend_handler(WLAN_UMAC_COMP_BLACKLIST_MGR,
ucfg_blm_suspend_handler);
pmo_unregister_resume_handler(WLAN_UMAC_COMP_BLACKLIST_MGR,
ucfg_blm_resume_handler);
}
QDF_STATUS ucfg_blm_psoc_open(struct wlan_objmgr_psoc *psoc)
{
ucfg_blm_register_pmo_handler();
return blm_cfg_psoc_open(psoc);
}
QDF_STATUS ucfg_blm_psoc_close(struct wlan_objmgr_psoc *psoc)
{
ucfg_blm_unregister_pmo_handler();
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
ucfg_blm_add_bssid_to_reject_list(struct wlan_objmgr_pdev *pdev,
struct reject_ap_info *ap_info)
{
return blm_add_bssid_to_reject_list(pdev, ap_info);
}
QDF_STATUS
ucfg_blm_add_userspace_black_list(struct wlan_objmgr_pdev *pdev,
struct qdf_mac_addr *bssid_black_list,
uint8_t num_of_bssid)
{
return blm_add_userspace_black_list(pdev, bssid_black_list,
num_of_bssid);
}
void
ucfg_blm_dump_black_list_ap(struct wlan_objmgr_pdev *pdev)
{
return wlan_blm_dump_blcklist_bssid(pdev);
}
void
ucfg_blm_update_bssid_connect_params(struct wlan_objmgr_pdev *pdev,
struct qdf_mac_addr bssid,
enum blm_connection_state con_state)
{
wlan_blm_update_bssid_connect_params(pdev, bssid, con_state);
}
void
ucfg_blm_wifi_off(struct wlan_objmgr_pdev *pdev)
{
struct blm_pdev_priv_obj *blm_ctx;
struct blm_psoc_priv_obj *blm_psoc_obj;
struct blm_config *cfg;
QDF_STATUS status;
if (!pdev) {
blm_err("pdev is NULL");
return;
}
blm_ctx = blm_get_pdev_obj(pdev);
blm_psoc_obj = blm_get_psoc_obj(wlan_pdev_get_psoc(pdev));
if (!blm_ctx || !blm_psoc_obj) {
blm_err("blm_ctx or blm_psoc_obj is NULL");
return ;
}
status = qdf_mutex_acquire(&blm_ctx->reject_ap_list_lock);
if (QDF_IS_STATUS_ERROR(status)) {
blm_err("failed to acquire reject_ap_list_lock");
return;
}
cfg = &blm_psoc_obj->blm_cfg;
blm_flush_reject_ap_list(blm_ctx);
blm_send_reject_ap_list_to_fw(pdev, &blm_ctx->reject_ap_list, cfg);
qdf_mutex_release(&blm_ctx->reject_ap_list_lock);
}

View File

@@ -1,69 +0,0 @@
/*
* Copyright (c) 2018-2020 The Linux Foundation. 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 "wlan_policy_mgr_cfg.h"
#include "cfg_define.h"
#include "cfg_converged.h"
#include "cfg_mlme.h"
#include "cfg_fwol.h"
#include "cfg_ipa.h"
#ifdef CONVERGED_P2P_ENABLE
#include "wlan_p2p_cfg.h"
#else
#define CFG_P2P_ALL
#endif
#ifdef FEATURE_WLAN_TDLS
#include "wlan_tdls_cfg.h"
#else
#define CFG_TDLS_ALL
#endif
#ifdef WLAN_FEATURE_NAN
#include "cfg_nan.h"
#else
#define CFG_NAN_ALL
#endif
#include "cfg_ftm_time_sync.h"
#include "wlan_pmo_cfg.h"
#include "hdd_config.h"
#include "hdd_dp_cfg.h"
#include "cfg_legacy_dp.h"
#include "wlan_cfg_blm.h"
#include "cfg_pkt_capture.h"
/* Maintain Alphabetic order here while adding components */
#define CFG_ALL \
CFG_BLACKLIST_MGR_ALL \
CFG_CONVERGED_ALL \
CFG_FWOL_ALL \
CFG_POLICY_MGR_ALL \
CFG_HDD_ALL \
CFG_HDD_DP_ALL \
CFG_IPA \
CFG_LEGACY_DP_ALL \
CFG_MLME_ALL \
CFG_NAN_ALL \
CFG_P2P_ALL \
CFG_PMO_ALL \
CFG_TDLS_ALL \
CFG_PKT_CAPTURE_MODE_ALL \
CFG_TIME_SYNC_FTM_ALL

View File

@@ -1,198 +0,0 @@
/*
* Copyright (c) 2020-2021, The Linux Foundation. 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.
*/
/*
* DOC: contains interface manager public api
*/
#ifndef _WLAN_IF_MGR_ROAM_H_
#define _WLAN_IF_MGR_ROAM_H_
#include "wlan_objmgr_psoc_obj.h"
#include "wlan_objmgr_pdev_obj.h"
#include "wlan_objmgr_vdev_obj.h"
#include "wlan_policy_mgr_api.h"
#include "wlan_if_mgr_public_struct.h"
#include "wlan_if_mgr_roam.h"
/**
* struct change_roam_state_arg - Contains roam state arguments
* @requestor: Driver disabled roaming requestor
* @curr_vdev_id: virtual device ID
*
* This structure is used to pass the roam state change information to the
* callback
*/
struct change_roam_state_arg {
enum wlan_cm_rso_control_requestor requestor;
uint8_t curr_vdev_id;
};
/**
* struct bssid_search_arg - Contains candidate validation arguments
* @peer_addr: MAC address of the BSS
* @vdev_id: virtual device ID
*
* This structure is used to pass the candidate validation information to the
* callback
*/
struct bssid_search_arg {
struct qdf_mac_addr peer_addr;
uint8_t vdev_id;
};
/**
* allow_mcc_go_diff_bi_definition - Defines the config values for allowing
* different beacon intervals between P2P-G0 and STA
* @ALLOW_MCC_GO_DIFF_BI_WFA_CERT: GO Beacon interval is not changed.
* MCC GO doesn't work well in optimized way. In worst scenario, it may
* invite STA disconnection.
* @ALLOW_MCC_GO_DIFF_BI_WORKAROUND: Workaround 1 disassoc all the clients and
* update beacon Interval.
* @ALLOW_MCC_GO_DIFF_BI_TEAR_DOWN: Tear down the P2P link in
* auto/Non-autonomous -GO case.
* @ALLOW_MCC_GO_DIFF_BI_NO_DISCONNECT: Don't disconnect the P2P client in
* autonomous/Non-autonomous -GO case update the BI dynamically
*/
enum allow_mcc_go_diff_bi_definition {
ALLOW_MCC_GO_DIFF_BI_WFA_CERT = 1,
ALLOW_MCC_GO_DIFF_BI_WORKAROUND,
ALLOW_MCC_GO_DIFF_BI_TEAR_DOWN,
ALLOW_MCC_GO_DIFF_BI_NO_DISCONNECT,
};
/**
* struct beacon_interval_arg - Contains beacon interval validation arguments
* @curr_vdev_id: current iterator vdev ID
* @curr_bss_opmode: current iterator BSS's opmode
* @ch_freq: current operating channel frequency
* @bss_beacon_interval: beacon interval that can be updated by callee
* @status: status to be filled by callee
* @is_done: boolean to stop iterating
* @update_beacon_interval: boolean to mark beacon interval as updated by callee
*
* This structure is used to pass the candidate validation information to the
* callback
*/
struct beacon_interval_arg {
uint8_t curr_vdev_id;
enum QDF_OPMODE curr_bss_opmode;
qdf_freq_t ch_freq;
uint16_t bss_beacon_interval;
QDF_STATUS status;
bool is_done;
bool update_beacon_interval;
};
/**
* if_mgr_enable_roaming() - interface manager enable roaming
* @pdev: pdev object
* @vdev: vdev object
* @requestor: RSO enable requestor
*
* Interface manager api to enable roaming for all other active vdev id's
*
* Context: It should run in thread context
*
* Return: QDF_STATUS
*/
QDF_STATUS if_mgr_enable_roaming(struct wlan_objmgr_pdev *pdev,
struct wlan_objmgr_vdev *vdev,
enum wlan_cm_rso_control_requestor requestor);
/**
* if_mgr_disable_roaming() - interface manager disable roaming
* @pdev: pdev object
* @vdev: vdev object
* @requestor: RSO disable requestor
*
* Interface manager api to disable roaming for all other active vdev id's
*
* Context: It should run in thread context
*
* Return: QDF_STATUS
*/
QDF_STATUS if_mgr_disable_roaming(struct wlan_objmgr_pdev *pdev,
struct wlan_objmgr_vdev *vdev,
enum wlan_cm_rso_control_requestor requestor);
/**
* if_mgr_enable_roaming_on_connected_sta() - interface manager disable roaming
* on connected STA
* @pdev: pdev object
* @vdev: vdev object
*
* Loops through connected vdevs and disables roaming if it is STA
*
* Context: It should run in thread context
*
* Return: QDF_STATUS
*/
QDF_STATUS
if_mgr_enable_roaming_on_connected_sta(struct wlan_objmgr_pdev *pdev,
struct wlan_objmgr_vdev *vdev);
/**
* if_mgr_enable_roaming_after_p2p_disconnect() - interface manager enable
* roaming after p2p disconnect
* @pdev: pdev object
* @vdev: vdev object
* @requestor: RSO enable requestor
*
* Disables roaming on p2p vdevs if the state is disconnected
*
* Context: It should run in thread context
*
* Return: QDF_STATUS
*/
QDF_STATUS if_mgr_enable_roaming_after_p2p_disconnect(
struct wlan_objmgr_pdev *pdev,
struct wlan_objmgr_vdev *vdev,
enum wlan_cm_rso_control_requestor requestor);
/**
* if_mgr_is_beacon_interval_valid() - checks if the concurrent session is
* valid
* @pdev: pdev object
* @vdev_id: vdev ID
* @candidate: concurrent candidate info
*
* This function validates the beacon interval with all other active vdevs.
*
* Context: It should run in thread context
*
* Return: true if session is valid, false if not
*/
bool if_mgr_is_beacon_interval_valid(struct wlan_objmgr_pdev *pdev,
uint8_t vdev_id,
struct validate_bss_data *candidate);
/**
* if_mgr_validate_candidate() - validate candidate event handler
* @vdev: vdev object
* @event_data: Interface mgr event data
*
* This function will validate the candidate to see if it is a suitable option
* for roaming to.
*
* Context: It should run in thread context
*
* Return: QDF_STATUS
*/
QDF_STATUS if_mgr_validate_candidate(struct wlan_objmgr_vdev *vdev,
struct if_mgr_event_data *event_data);
#endif

View File

@@ -1,845 +0,0 @@
/*
* Copyright (c) 2020-2021, The Linux Foundation. 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.
*/
/*
* DOC: contains interface manager roam public api
*/
#include "wlan_objmgr_psoc_obj.h"
#include "wlan_objmgr_pdev_obj.h"
#include "wlan_objmgr_vdev_obj.h"
#include "wlan_policy_mgr_api.h"
#include "wlan_policy_mgr_i.h"
#include "wlan_if_mgr_roam.h"
#include "wlan_if_mgr_public_struct.h"
#include "wlan_cm_roam_api.h"
#include "wlan_if_mgr_main.h"
#include "wlan_p2p_ucfg_api.h"
#include "cds_api.h"
#include "sme_api.h"
#include "wlan_vdev_mgr_utils_api.h"
#include "wni_api.h"
#include "wlan_mlme_vdev_mgr_interface.h"
static void if_mgr_enable_roaming_on_vdev(struct wlan_objmgr_pdev *pdev,
void *object, void *arg)
{
struct wlan_objmgr_vdev *vdev = (struct wlan_objmgr_vdev *)object;
struct change_roam_state_arg *roam_arg = arg;
uint8_t vdev_id, curr_vdev_id;
vdev_id = wlan_vdev_get_id(vdev);
curr_vdev_id = roam_arg->curr_vdev_id;
if (curr_vdev_id != vdev_id &&
vdev->vdev_mlme.vdev_opmode == QDF_STA_MODE &&
vdev->vdev_mlme.mlme_state == WLAN_VDEV_S_UP) {
ifmgr_debug("Roaming enabled on vdev_id %d", vdev_id);
wlan_cm_enable_rso(pdev, vdev_id,
roam_arg->requestor,
REASON_DRIVER_ENABLED);
}
}
QDF_STATUS if_mgr_enable_roaming(struct wlan_objmgr_pdev *pdev,
struct wlan_objmgr_vdev *vdev,
enum wlan_cm_rso_control_requestor requestor)
{
QDF_STATUS status = QDF_STATUS_SUCCESS;
struct change_roam_state_arg roam_arg;
uint8_t vdev_id;
vdev_id = wlan_vdev_get_id(vdev);
roam_arg.requestor = requestor;
roam_arg.curr_vdev_id = vdev_id;
status = wlan_objmgr_pdev_iterate_obj_list(pdev, WLAN_VDEV_OP,
if_mgr_enable_roaming_on_vdev,
&roam_arg, 0,
WLAN_IF_MGR_ID);
return status;
}
static void if_mgr_disable_roaming_on_vdev(struct wlan_objmgr_pdev *pdev,
void *object, void *arg)
{
struct wlan_objmgr_vdev *vdev = (struct wlan_objmgr_vdev *)object;
struct change_roam_state_arg *roam_arg = arg;
uint8_t vdev_id, curr_vdev_id;
vdev_id = wlan_vdev_get_id(vdev);
curr_vdev_id = roam_arg->curr_vdev_id;
if (curr_vdev_id != vdev_id &&
wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE &&
vdev->vdev_mlme.mlme_state == WLAN_VDEV_S_UP) {
/* IFMGR Verification: Temporary call to sme_stop_roaming api,
* will be replaced by converged roaming api
* once roaming testing is complete.
*/
ifmgr_debug("Roaming disabled on vdev_id %d", vdev_id);
wlan_cm_disable_rso(pdev, vdev_id,
roam_arg->requestor,
REASON_DRIVER_DISABLED);
}
}
QDF_STATUS if_mgr_disable_roaming(struct wlan_objmgr_pdev *pdev,
struct wlan_objmgr_vdev *vdev,
enum wlan_cm_rso_control_requestor requestor)
{
QDF_STATUS status = QDF_STATUS_SUCCESS;
struct change_roam_state_arg roam_arg;
uint8_t vdev_id;
vdev_id = wlan_vdev_get_id(vdev);
roam_arg.requestor = requestor;
roam_arg.curr_vdev_id = vdev_id;
status = wlan_objmgr_pdev_iterate_obj_list(pdev, WLAN_VDEV_OP,
if_mgr_disable_roaming_on_vdev,
&roam_arg, 0,
WLAN_IF_MGR_ID);
return status;
}
QDF_STATUS
if_mgr_enable_roaming_on_connected_sta(struct wlan_objmgr_pdev *pdev,
struct wlan_objmgr_vdev *vdev)
{
struct wlan_objmgr_psoc *psoc;
uint8_t vdev_id;
psoc = wlan_vdev_get_psoc(vdev);
if (!psoc)
return QDF_STATUS_E_FAILURE;
vdev_id = wlan_vdev_get_id(vdev);
if (policy_mgr_is_sta_active_connection_exists(psoc) &&
wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE) {
ifmgr_debug("Enable roaming on connected sta for vdev_id %d", vdev_id);
wlan_cm_enable_roaming_on_connected_sta(pdev, vdev_id);
policy_mgr_set_pcl_for_connected_vdev(psoc, vdev_id, true);
}
return QDF_STATUS_SUCCESS;
}
QDF_STATUS if_mgr_enable_roaming_after_p2p_disconnect(
struct wlan_objmgr_pdev *pdev,
struct wlan_objmgr_vdev *vdev,
enum wlan_cm_rso_control_requestor requestor)
{
QDF_STATUS status = QDF_STATUS_SUCCESS;
struct wlan_objmgr_psoc *psoc;
struct change_roam_state_arg roam_arg;
uint8_t vdev_id;
psoc = wlan_vdev_get_psoc(vdev);
if (!psoc)
return QDF_STATUS_E_FAILURE;
vdev_id = wlan_vdev_get_id(vdev);
roam_arg.requestor = requestor;
roam_arg.curr_vdev_id = vdev_id;
/*
* Due to audio share glitch with P2P clients due
* to roam scan on concurrent interface, disable
* roaming if "p2p_disable_roam" ini is enabled.
* Re-enable roaming again once the p2p client
* gets disconnected.
*/
if (ucfg_p2p_is_roam_config_disabled(psoc) &&
wlan_vdev_mlme_get_opmode(vdev) == QDF_P2P_CLIENT_MODE) {
ifmgr_debug("P2P client disconnected, enable roam");
status = wlan_objmgr_pdev_iterate_obj_list(pdev, WLAN_VDEV_OP,
if_mgr_enable_roaming_on_vdev,
&roam_arg, 0,
WLAN_IF_MGR_ID);
}
return status;
}
/**
* if_mgr_calculate_mcc_beacon_interval() - Calculates the new beacon interval
* @sta_bi: station beacon interval
* @go_given_bi: P2P GO's given beacon interval
*
* This function has 3 stages. First it modifies the input go_given_bi to be
* within 100 to 199. Then it checks if the sta_bi and go_given_bi are multiples
* of each other. If they are, that means the 2 values are compatible, and just
* return as is, otherwise, find new compatible BI for P2P GO
*
* Return: valid beacon interval value
*/
static uint16_t if_mgr_calculate_mcc_beacon_interval(uint16_t sta_bi,
uint16_t go_given_bi)
{
uint8_t num_beacons, is_multiple;
uint16_t go_calculated_bi, go_final_bi, sta_calculated_bi;
/* ensure BI ranges between 100 and 200 */
if (go_given_bi < 100)
go_calculated_bi = 100;
else
go_calculated_bi = 100 + (go_given_bi % 100);
if (sta_bi == 0) {
/* There is possibility to receive zero as value.
* Which will cause divide by zero. Hence initialise with 100
*/
sta_bi = 100;
ifmgr_warn("sta_bi 2nd parameter is zero, initialize to %d",
sta_bi);
}
/* check, if either one is multiple of another */
if (sta_bi > go_calculated_bi)
is_multiple = !(sta_bi % go_calculated_bi);
else
is_multiple = !(go_calculated_bi % sta_bi);
/* if it is multiple, then accept GO's beacon interval
* range [100,199] as it is
*/
if (is_multiple)
return go_calculated_bi;
/* else , if it is not multiple, then then check for number of beacons
* to be inserted based on sta BI
*/
num_beacons = sta_bi / 100;
if (num_beacons) {
/* GO's final beacon interval will be aligned to sta beacon
* interval, but in the range of [100, 199].
*/
sta_calculated_bi = sta_bi / num_beacons;
go_final_bi = sta_calculated_bi;
} else {
/* if STA beacon interval is less than 100, use GO's change
* beacon interval instead of updating to STA's beacon interval.
*/
go_final_bi = go_calculated_bi;
}
return go_final_bi;
}
static QDF_STATUS
if_mgr_send_chng_mcc_beacon_interval(struct wlan_objmgr_vdev *vdev,
struct beacon_interval_arg *bss_arg)
{
struct scheduler_msg msg = {0};
struct wlan_change_bi *p_msg;
uint16_t len = 0;
QDF_STATUS status;
uint8_t *mac_addr;
if (!bss_arg->update_beacon_interval)
return QDF_STATUS_SUCCESS;
bss_arg->update_beacon_interval = false;
len = sizeof(*p_msg);
p_msg = qdf_mem_malloc(len);
if (!p_msg)
return QDF_STATUS_E_NOMEM;
p_msg->message_type = eWNI_SME_CHNG_MCC_BEACON_INTERVAL;
p_msg->length = len;
mac_addr = wlan_vdev_get_hw_macaddr(vdev);
qdf_mem_copy(&p_msg->bssid, mac_addr, QDF_MAC_ADDR_SIZE);
ifmgr_debug(QDF_MAC_ADDR_FMT, QDF_MAC_ADDR_REF(mac_addr));
p_msg->session_id = wlan_vdev_get_id(vdev);
ifmgr_debug("session %d BeaconInterval %d", p_msg->session_id,
bss_arg->bss_beacon_interval);
p_msg->beacon_interval = bss_arg->bss_beacon_interval;
msg.type = eWNI_SME_CHNG_MCC_BEACON_INTERVAL;
msg.bodyval = 0;
msg.bodyptr = p_msg;
status = scheduler_post_message(QDF_MODULE_ID_PE,
QDF_MODULE_ID_PE,
QDF_MODULE_ID_PE, &msg);
if (status != QDF_STATUS_SUCCESS)
qdf_mem_free(p_msg);
return status;
}
static void if_mgr_update_beacon_interval(struct wlan_objmgr_pdev *pdev,
void *object, void *arg)
{
struct wlan_objmgr_psoc *psoc;
uint8_t allow_mcc_go_diff_bi;
struct wlan_objmgr_peer *peer;
enum wlan_peer_type bss_persona;
struct beacon_interval_arg *bss_arg = arg;
struct wlan_objmgr_vdev *vdev = object;
uint8_t vdev_id = wlan_vdev_get_id(vdev);
psoc = wlan_pdev_get_psoc(pdev);
if (!psoc)
return;
policy_mgr_get_allow_mcc_go_diff_bi(psoc, &allow_mcc_go_diff_bi);
peer = wlan_objmgr_vdev_try_get_bsspeer(vdev, WLAN_IF_MGR_ID);
if (!peer)
return;
bss_persona = wlan_peer_get_peer_type(peer);
wlan_objmgr_peer_release_ref(peer, WLAN_IF_MGR_ID);
/*
* If GO in MCC support different beacon interval,
* change the BI of the P2P-GO
*/
if (bss_persona == WLAN_PEER_P2P_GO)
return;
/*
* Handle different BI scenario based on the
* configuration set. If Config is not set to 0x04 then
* Disconnect all the P2P clients associated. If config
* is set to 0x04 then update the BI without
* disconnecting all the clients
*/
if (allow_mcc_go_diff_bi == ALLOW_MCC_GO_DIFF_BI_NO_DISCONNECT &&
bss_arg->update_beacon_interval) {
bss_arg->status =
if_mgr_send_chng_mcc_beacon_interval(vdev, bss_arg);
return;
} else if (bss_arg->update_beacon_interval) {
/*
* If the configuration of fAllowMCCGODiffBI is set to
* other than 0x04
*/
bss_arg->status = wlan_sap_disconnect_all_p2p_client(vdev_id);
return;
}
}
static QDF_STATUS
if_mgr_update_mcc_p2p_beacon_interval(struct wlan_objmgr_vdev *vdev,
struct beacon_interval_arg *bss_arg)
{
struct wlan_objmgr_psoc *psoc;
struct wlan_objmgr_pdev *pdev;
uint8_t enable_mcc_mode;
pdev = wlan_vdev_get_pdev(vdev);
if (!pdev)
return QDF_STATUS_E_FAILURE;
psoc = wlan_pdev_get_psoc(pdev);
if (!psoc)
return QDF_STATUS_E_FAILURE;
/* If MCC is not supported just break and return SUCCESS */
wlan_mlme_get_mcc_feature(psoc, &enable_mcc_mode);
if (!enable_mcc_mode)
return QDF_STATUS_E_FAILURE;
wlan_objmgr_pdev_iterate_obj_list(pdev, WLAN_VDEV_OP,
if_mgr_update_beacon_interval,
bss_arg, 0, WLAN_IF_MGR_ID);
return bss_arg->status;
}
static bool if_mgr_validate_sta_bcn_intrvl(struct wlan_objmgr_vdev *vdev,
struct beacon_interval_arg *bss_arg)
{
struct wlan_objmgr_psoc *psoc;
struct vdev_mlme_obj *vdev_mlme;
struct wlan_objmgr_peer *peer;
uint16_t new_bcn_interval;
uint32_t beacon_interval;
struct wlan_channel *chan;
enum QDF_OPMODE curr_persona;
uint8_t allow_mcc_go_diff_bi;
uint8_t conc_rule1 = 0, conc_rule2 = 0;
uint8_t vdev_id = wlan_vdev_get_id(vdev);
psoc = wlan_vdev_get_psoc(vdev);
if (!psoc)
return false;
peer = wlan_objmgr_vdev_try_get_bsspeer(vdev, WLAN_IF_MGR_ID);
if (!peer)
return false;
curr_persona = wlan_vdev_mlme_get_opmode(vdev);
wlan_objmgr_peer_release_ref(peer, WLAN_IF_MGR_ID);
if (curr_persona == QDF_STA_MODE ||
curr_persona == QDF_P2P_CLIENT_MODE) {
ifmgr_debug("Bcn Intrvl validation not require for STA/CLIENT");
return false;
}
chan = wlan_vdev_get_active_channel(vdev);
if (!chan) {
ifmgr_err("failed to get active channel");
return false;
}
vdev_mlme =
wlan_objmgr_vdev_get_comp_private_obj(vdev,
WLAN_UMAC_COMP_MLME);
if (!vdev_mlme) {
QDF_ASSERT(0);
return false;
}
wlan_util_vdev_mlme_get_param(vdev_mlme, WLAN_MLME_CFG_BEACON_INTERVAL,
&beacon_interval);
if (curr_persona == QDF_SAP_MODE &&
(chan->ch_cfreq1 != bss_arg->ch_freq ||
chan->ch_cfreq2 != bss_arg->ch_freq)) {
ifmgr_debug("*** MCC with SAP+STA sessions ****");
bss_arg->status = QDF_STATUS_SUCCESS;
return true;
}
if (curr_persona == QDF_P2P_GO_MODE &&
(chan->ch_cfreq1 != bss_arg->ch_freq ||
chan->ch_cfreq2 != bss_arg->ch_freq) &&
beacon_interval != bss_arg->bss_beacon_interval) {
policy_mgr_get_allow_mcc_go_diff_bi(psoc,
&allow_mcc_go_diff_bi);
switch (allow_mcc_go_diff_bi) {
case ALLOW_MCC_GO_DIFF_BI_WFA_CERT:
bss_arg->status = QDF_STATUS_SUCCESS;
return true;
case ALLOW_MCC_GO_DIFF_BI_WORKAROUND:
/* fall through */
case ALLOW_MCC_GO_DIFF_BI_NO_DISCONNECT:
policy_mgr_get_conc_rule1(psoc, &conc_rule1);
policy_mgr_get_conc_rule2(psoc, &conc_rule2);
if (conc_rule1 || conc_rule2)
new_bcn_interval = CUSTOM_CONC_GO_BI;
else
new_bcn_interval =
if_mgr_calculate_mcc_beacon_interval(
bss_arg->bss_beacon_interval,
beacon_interval);
ifmgr_debug("Peer AP BI : %d, new Beacon Interval: %d",
bss_arg->bss_beacon_interval,
new_bcn_interval);
/* Update the beacon interval */
if (new_bcn_interval != beacon_interval) {
ifmgr_err("Beacon Interval got changed config used: %d",
allow_mcc_go_diff_bi);
bss_arg->bss_beacon_interval = new_bcn_interval;
bss_arg->update_beacon_interval = true;
bss_arg->status =
if_mgr_update_mcc_p2p_beacon_interval(
vdev,
bss_arg);
return true;
}
bss_arg->status = QDF_STATUS_SUCCESS;
return true;
case ALLOW_MCC_GO_DIFF_BI_TEAR_DOWN:
bss_arg->update_beacon_interval = false;
bss_arg->status = wlan_sap_stop_bss(vdev_id);
return true;
default:
ifmgr_err("BcnIntrvl is diff can't connect to preferred AP");
bss_arg->status = QDF_STATUS_E_FAILURE;
return true;
}
}
return false;
}
static bool if_mgr_validate_p2pcli_bcn_intrvl(struct wlan_objmgr_vdev *vdev,
struct beacon_interval_arg *bss_arg)
{
enum QDF_OPMODE curr_persona;
enum wlan_peer_type bss_persona;
uint32_t beacon_interval;
struct wlan_channel *chan;
struct wlan_objmgr_peer *peer;
struct vdev_mlme_obj *vdev_mlme;
curr_persona = wlan_vdev_mlme_get_opmode(vdev);
peer = wlan_objmgr_vdev_try_get_bsspeer(vdev, WLAN_IF_MGR_ID);
if (!peer)
return false;
bss_persona = wlan_peer_get_peer_type(peer);
wlan_objmgr_peer_release_ref(peer, WLAN_IF_MGR_ID);
chan = wlan_vdev_get_active_channel(vdev);
if (!chan) {
ifmgr_err("failed to get active channel");
return false;
}
vdev_mlme =
wlan_objmgr_vdev_get_comp_private_obj(vdev,
WLAN_UMAC_COMP_MLME);
if (!vdev_mlme) {
QDF_ASSERT(0);
return false;
}
wlan_util_vdev_mlme_get_param(vdev_mlme, WLAN_MLME_CFG_BEACON_INTERVAL,
&beacon_interval);
if (curr_persona == QDF_STA_MODE) {
ifmgr_debug("Ignore Beacon Interval Validation...");
} else if (bss_persona == WLAN_PEER_P2P_GO) {
if ((chan->ch_cfreq1 != bss_arg->ch_freq ||
chan->ch_cfreq2 != bss_arg->ch_freq) &&
beacon_interval != bss_arg->bss_beacon_interval) {
ifmgr_err("BcnIntrvl is diff can't connect to P2P_GO network");
bss_arg->status = QDF_STATUS_E_FAILURE;
return true;
}
}
return false;
}
static bool
if_mgr_validate_p2pgo_bcn_intrvl(struct wlan_objmgr_vdev *vdev,
struct beacon_interval_arg *bss_arg)
{
struct wlan_objmgr_psoc *psoc;
struct vdev_mlme_obj *vdev_mlme;
enum QDF_OPMODE curr_persona;
uint32_t beacon_interval;
struct wlan_channel *chan;
uint8_t conc_rule1 = 0, conc_rule2 = 0;
uint16_t new_bcn_interval;
curr_persona = wlan_vdev_mlme_get_opmode(vdev);
chan = wlan_vdev_get_active_channel(vdev);
if (!chan) {
ifmgr_err("failed to get active channel");
return false;
}
vdev_mlme =
wlan_objmgr_vdev_get_comp_private_obj(vdev,
WLAN_UMAC_COMP_MLME);
if (!vdev_mlme) {
QDF_ASSERT(0);
return false;
}
psoc = wlan_vdev_get_psoc(vdev);
if (!psoc)
return false;
wlan_util_vdev_mlme_get_param(vdev_mlme, WLAN_MLME_CFG_BEACON_INTERVAL,
&beacon_interval);
if ((curr_persona == QDF_P2P_CLIENT_MODE) ||
(curr_persona == QDF_STA_MODE)) {
/* check for P2P_client scenario */
if ((chan->ch_cfreq1 == 0) && (chan->ch_cfreq2 == 0) &&
(beacon_interval == 0))
return false;
if (wlan_vdev_mlme_get_state(vdev) == WLAN_VDEV_S_UP &&
(chan->ch_cfreq1 != bss_arg->ch_freq ||
chan->ch_cfreq2 != bss_arg->ch_freq) &&
beacon_interval != bss_arg->bss_beacon_interval) {
/*
* Updated beaconInterval should be used only when
* we are starting a new BSS not incase of
* client or STA case
*/
policy_mgr_get_conc_rule1(psoc, &conc_rule1);
policy_mgr_get_conc_rule2(psoc, &conc_rule2);
/* Calculate beacon Interval for P2P-GO incase of MCC */
if (conc_rule1 || conc_rule2) {
new_bcn_interval = CUSTOM_CONC_GO_BI;
} else {
new_bcn_interval =
if_mgr_calculate_mcc_beacon_interval(
beacon_interval,
bss_arg->bss_beacon_interval);
}
if (new_bcn_interval != bss_arg->bss_beacon_interval)
bss_arg->bss_beacon_interval = new_bcn_interval;
bss_arg->status = QDF_STATUS_SUCCESS;
return true;
}
}
return false;
}
static void if_mgr_validate_beacon_interval(struct wlan_objmgr_pdev *pdev,
void *object, void *arg)
{
struct beacon_interval_arg *bss_arg = arg;
struct wlan_objmgr_vdev *vdev = object;
uint8_t iter_vdev_id = wlan_vdev_get_id(vdev);
bool is_done = false;
if (iter_vdev_id == bss_arg->curr_vdev_id)
return;
if (wlan_vdev_mlme_get_state(vdev) != WLAN_VDEV_S_UP)
return;
if (bss_arg->is_done)
return;
switch (bss_arg->curr_bss_opmode) {
case QDF_STA_MODE:
is_done = if_mgr_validate_sta_bcn_intrvl(vdev, bss_arg);
break;
case QDF_P2P_CLIENT_MODE:
is_done = if_mgr_validate_p2pcli_bcn_intrvl(vdev, bss_arg);
break;
case QDF_SAP_MODE:
case QDF_IBSS_MODE:
break;
case QDF_P2P_GO_MODE:
is_done = if_mgr_validate_p2pgo_bcn_intrvl(vdev, bss_arg);
break;
default:
ifmgr_err("BSS opmode not supported: %d",
bss_arg->curr_bss_opmode);
}
if (is_done)
bss_arg->is_done = is_done;
}
bool if_mgr_is_beacon_interval_valid(struct wlan_objmgr_pdev *pdev,
uint8_t vdev_id,
struct validate_bss_data *candidate)
{
struct wlan_objmgr_psoc *psoc;
struct beacon_interval_arg bss_arg;
uint8_t enable_mcc_mode;
struct wlan_objmgr_vdev *vdev;
psoc = wlan_pdev_get_psoc(pdev);
if (!psoc)
return false;
wlan_mlme_get_mcc_feature(psoc, &enable_mcc_mode);
if (!enable_mcc_mode)
return false;
vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id,
WLAN_IF_MGR_ID);
if (!vdev)
return false;
bss_arg.curr_vdev_id = vdev_id;
bss_arg.curr_bss_opmode = wlan_vdev_mlme_get_opmode(vdev);
bss_arg.ch_freq = candidate->chan_freq;
bss_arg.bss_beacon_interval = candidate->beacon_interval;
bss_arg.is_done = false;
wlan_objmgr_vdev_release_ref(vdev, WLAN_IF_MGR_ID);
wlan_objmgr_pdev_iterate_obj_list(pdev, WLAN_VDEV_OP,
if_mgr_validate_beacon_interval,
&bss_arg, 0,
WLAN_IF_MGR_ID);
if (!bss_arg.is_done)
return true;
if (bss_arg.is_done && QDF_IS_STATUS_SUCCESS(bss_arg.status))
return true;
return false;
}
static void if_mgr_get_vdev_id_from_bssid(struct wlan_objmgr_pdev *pdev,
void *object, void *arg)
{
struct bssid_search_arg *bssid_arg = arg;
struct wlan_objmgr_vdev *vdev = (struct wlan_objmgr_vdev *)object;
struct wlan_objmgr_peer *peer;
if (!(wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE ||
wlan_vdev_mlme_get_opmode(vdev) == QDF_P2P_CLIENT_MODE))
return;
/* Need to check the connection manager state when that becomes
* available
*/
if (wlan_vdev_mlme_get_state(vdev) != WLAN_VDEV_S_UP)
return;
peer = wlan_objmgr_vdev_try_get_bsspeer(vdev, WLAN_IF_MGR_ID);
if (!peer)
return;
if (WLAN_ADDR_EQ(bssid_arg->peer_addr.bytes,
wlan_peer_get_macaddr(peer)) == QDF_STATUS_SUCCESS)
bssid_arg->vdev_id = wlan_vdev_get_id(vdev);
wlan_objmgr_peer_release_ref(peer, WLAN_IF_MGR_ID);
}
#ifdef WLAN_FEATURE_11BE_MLO
/**
* if_mgr_get_conc_ext_flags() - get extended flags for concurrency check
* @vdev: pointer to vdev on which new connection is coming up
* @candidate_info: interface manager validate candidate data
*
* Return: extended flags for concurrency check
*/
static inline uint32_t
if_mgr_get_conc_ext_flags(struct wlan_objmgr_vdev *vdev,
struct validate_bss_data *candidate_info)
{
return policy_mgr_get_conc_ext_flags(vdev, candidate_info->is_mlo);
}
#else
static inline uint32_t
if_mgr_get_conc_ext_flags(struct wlan_objmgr_vdev *vdev,
struct validate_bss_data *candidate_info)
{
return 0;
}
#endif
QDF_STATUS if_mgr_validate_candidate(struct wlan_objmgr_vdev *vdev,
struct if_mgr_event_data *event_data)
{
struct wlan_objmgr_psoc *psoc;
struct wlan_objmgr_pdev *pdev;
enum QDF_OPMODE op_mode;
enum policy_mgr_con_mode mode;
struct bssid_search_arg bssid_arg;
struct validate_bss_data *candidate_info =
&event_data->validate_bss_info;
uint32_t chan_freq = candidate_info->chan_freq;
uint32_t conc_freq = 0, conc_ext_flags;
op_mode = wlan_vdev_mlme_get_opmode(vdev);
pdev = wlan_vdev_get_pdev(vdev);
if (!pdev)
return QDF_STATUS_E_FAILURE;
psoc = wlan_pdev_get_psoc(pdev);
if (!psoc)
return QDF_STATUS_E_FAILURE;
/*
* Ignore the BSS if any other vdev is already connected to it.
*/
qdf_copy_macaddr(&bssid_arg.peer_addr,
&candidate_info->peer_addr);
bssid_arg.vdev_id = WLAN_INVALID_VDEV_ID;
wlan_objmgr_pdev_iterate_obj_list(pdev, WLAN_VDEV_OP,
if_mgr_get_vdev_id_from_bssid,
&bssid_arg, 0,
WLAN_IF_MGR_ID);
if (bssid_arg.vdev_id != WLAN_INVALID_VDEV_ID) {
ifmgr_info("vdev_id %d already connected to "QDF_MAC_ADDR_FMT". select next bss for vdev_id %d",
bssid_arg.vdev_id,
QDF_MAC_ADDR_REF(bssid_arg.peer_addr.bytes),
wlan_vdev_get_id(vdev));
return QDF_STATUS_E_INVAL;
}
/*
* If concurrency enabled take the concurrent connected channel first.
* Valid multichannel concurrent sessions exempted
*/
mode = policy_mgr_convert_device_mode_to_qdf_type(op_mode);
/* If concurrency is not allowed select next bss */
conc_ext_flags = if_mgr_get_conc_ext_flags(vdev, candidate_info);
if (!policy_mgr_is_concurrency_allowed(psoc, mode, chan_freq,
HW_MODE_20_MHZ,
conc_ext_flags)) {
ifmgr_info("Concurrency not allowed for this channel freq %d bssid "QDF_MAC_ADDR_FMT", selecting next",
chan_freq,
QDF_MAC_ADDR_REF(bssid_arg.peer_addr.bytes));
return QDF_STATUS_E_INVAL;
}
/*
* check if channel is allowed for current hw mode, if not fetch
* next BSS.
*/
if (!policy_mgr_is_hwmode_set_for_given_chnl(psoc, chan_freq)) {
ifmgr_info("HW mode isn't properly set, freq %d BSSID "QDF_MAC_ADDR_FMT,
chan_freq,
QDF_MAC_ADDR_REF(bssid_arg.peer_addr.bytes));
return QDF_STATUS_E_INVAL;
}
/* validate beacon interval */
if (policy_mgr_concurrent_open_sessions_running(psoc) &&
!if_mgr_is_beacon_interval_valid(pdev, wlan_vdev_get_id(vdev),
candidate_info)) {
conc_freq = wlan_get_conc_freq();
ifmgr_debug("csr Conc Channel freq: %d",
conc_freq);
if (conc_freq) {
if ((conc_freq == chan_freq) ||
(policy_mgr_is_hw_sbs_capable(psoc) &&
policy_mgr_are_sbs_chan(psoc, conc_freq,
chan_freq)) ||
(policy_mgr_is_hw_dbs_capable(psoc) &&
!wlan_reg_is_same_band_freqs(conc_freq,
chan_freq))) {
/*
* make this 0 because we do not want the below
* check to pass as we don't want to connect on
* other channel
*/
ifmgr_debug("Conc chnl freq match: %d",
conc_freq);
conc_freq = 0;
}
}
}
if (conc_freq)
return QDF_STATUS_E_INVAL;
return QDF_STATUS_SUCCESS;
}

View File

@@ -1,154 +0,0 @@
/*
* Copyright (c) 2020, The Linux Foundation. All rights reserved.
* Copyright (c) 2021 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.
*/
/*
* DOC: contains interface manager public api
*/
#include "wlan_objmgr_psoc_obj.h"
#include "wlan_objmgr_vdev_obj.h"
#include "wlan_if_mgr_public_struct.h"
#include "wlan_if_mgr_ap.h"
#include "wlan_if_mgr_roam.h"
#include "wlan_policy_mgr_api.h"
#include "wlan_if_mgr_main.h"
#include "wlan_p2p_cfg_api.h"
#include "wlan_tdls_api.h"
#include "wlan_p2p_api.h"
QDF_STATUS if_mgr_ap_start_bss(struct wlan_objmgr_vdev *vdev,
struct if_mgr_event_data *event_data)
{
struct wlan_objmgr_psoc *psoc;
struct wlan_objmgr_pdev *pdev;
pdev = wlan_vdev_get_pdev(vdev);
if (!pdev)
return QDF_STATUS_E_FAILURE;
psoc = wlan_pdev_get_psoc(pdev);
if (!psoc)
return QDF_STATUS_E_FAILURE;
wlan_tdls_teardown_links_sync(psoc);
if (policy_mgr_is_hw_mode_change_in_progress(psoc)) {
if (!QDF_IS_STATUS_SUCCESS(
policy_mgr_wait_for_connection_update(psoc))) {
ifmgr_err("qdf wait for event failed!!");
return QDF_STATUS_E_FAILURE;
}
}
if (policy_mgr_is_sta_active_connection_exists(psoc))
/* Disable Roaming on all vdev's before starting bss */
if_mgr_disable_roaming(pdev, vdev, RSO_START_BSS);
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
if_mgr_ap_start_bss_complete(struct wlan_objmgr_vdev *vdev,
struct if_mgr_event_data *event_data)
{
struct wlan_objmgr_psoc *psoc;
struct wlan_objmgr_pdev *pdev;
pdev = wlan_vdev_get_pdev(vdev);
if (!pdev)
return QDF_STATUS_E_FAILURE;
psoc = wlan_pdev_get_psoc(pdev);
if (!psoc)
return QDF_STATUS_E_FAILURE;
/*
* Due to audio share glitch with P2P GO caused by
* roam scan on concurrent interface, disable
* roaming if "p2p_disable_roam" ini is enabled.
* Donot re-enable roaming again on other STA interface
* if p2p GO is active on any vdev.
*/
if (cfg_p2p_is_roam_config_disabled(psoc) &&
wlan_vdev_mlme_get_opmode(vdev) == QDF_P2P_GO_MODE) {
ifmgr_debug("p2p go mode, keep roam disabled");
} else {
/* Enable Roaming after start bss in case of failure/success */
if_mgr_enable_roaming(pdev, vdev, RSO_START_BSS);
}
return QDF_STATUS_SUCCESS;
}
QDF_STATUS if_mgr_ap_stop_bss(struct wlan_objmgr_vdev *vdev,
struct if_mgr_event_data *event_data)
{
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
if_mgr_ap_stop_bss_complete(struct wlan_objmgr_vdev *vdev,
struct if_mgr_event_data *event_data)
{
struct wlan_objmgr_psoc *psoc;
struct wlan_objmgr_pdev *pdev;
pdev = wlan_vdev_get_pdev(vdev);
if (!pdev)
return QDF_STATUS_E_FAILURE;
psoc = wlan_pdev_get_psoc(pdev);
if (!psoc)
return QDF_STATUS_E_FAILURE;
/*
* Due to audio share glitch with P2P GO caused by
* roam scan on concurrent interface, disable
* roaming if "p2p_disable_roam" ini is enabled.
* Re-enable roaming on other STA interface if p2p GO
* is active on any vdev.
*/
if (cfg_p2p_is_roam_config_disabled(psoc) &&
wlan_vdev_mlme_get_opmode(vdev) == QDF_P2P_GO_MODE) {
ifmgr_debug("p2p go disconnected enable roam");
if_mgr_enable_roaming(pdev, vdev, RSO_START_BSS);
}
return QDF_STATUS_SUCCESS;
}
#ifdef WLAN_FEATURE_P2P_P2P_STA
QDF_STATUS
if_mgr_csa_complete(struct wlan_objmgr_vdev *vdev,
struct if_mgr_event_data *event_data)
{
struct wlan_objmgr_psoc *psoc;
struct wlan_objmgr_pdev *pdev;
QDF_STATUS status = QDF_STATUS_SUCCESS;
pdev = wlan_vdev_get_pdev(vdev);
if (!pdev)
return QDF_STATUS_E_FAILURE;
psoc = wlan_pdev_get_psoc(pdev);
if (!psoc)
return QDF_STATUS_E_FAILURE;
status = wlan_p2p_check_and_force_scc_go_plus_go(psoc, vdev);
if (QDF_IS_STATUS_ERROR(status))
ifmgr_err("force scc failure with status: %d", status);
return status;
}
#endif

View File

@@ -1,200 +0,0 @@
/*
* Copyright (c) 2020-2021, The Linux Foundation. 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.
*/
/*
* DOC: contains interface manager public api
*/
#include "wlan_objmgr_psoc_obj.h"
#include "wlan_objmgr_vdev_obj.h"
#include "wlan_if_mgr_public_struct.h"
#include "wlan_if_mgr_sta.h"
#include "wlan_if_mgr_roam.h"
#include "wlan_if_mgr_main.h"
#include "nan_ucfg_api.h"
#include "wlan_policy_mgr_api.h"
#include "wlan_p2p_ucfg_api.h"
#include "wlan_tdls_ucfg_api.h"
#include "wlan_tdls_api.h"
#include <wlan_cm_api.h>
QDF_STATUS if_mgr_connect_start(struct wlan_objmgr_vdev *vdev,
struct if_mgr_event_data *event_data)
{
uint8_t sta_cnt, sap_cnt;
struct wlan_objmgr_pdev *pdev;
struct wlan_objmgr_psoc *psoc;
enum QDF_OPMODE op_mode;
uint8_t vdev_id_list[MAX_NUMBER_OF_CONC_CONNECTIONS], i;
bool disable_nan = true;
pdev = wlan_vdev_get_pdev(vdev);
if (!pdev)
return QDF_STATUS_E_FAILURE;
psoc = wlan_pdev_get_psoc(pdev);
if (!psoc)
return QDF_STATUS_E_FAILURE;
/*
* Disable NAN Discovery if incoming connection is P2P or if a STA
* connection already exists and if this is a case of STA+STA
* or SAP+STA concurrency
*/
sta_cnt = policy_mgr_get_mode_specific_conn_info(psoc, NULL,
vdev_id_list,
PM_STA_MODE);
sap_cnt = policy_mgr_get_mode_specific_conn_info(psoc, NULL,
&vdev_id_list[sta_cnt],
PM_SAP_MODE);
op_mode = wlan_vdev_mlme_get_opmode(vdev);
if (op_mode == QDF_P2P_CLIENT_MODE || sap_cnt || sta_cnt) {
for (i = 0; i < sta_cnt + sap_cnt; i++)
if (vdev_id_list[i] == wlan_vdev_get_id(vdev))
disable_nan = false;
if (disable_nan)
ucfg_nan_disable_concurrency(psoc);
}
/*
* STA+NDI concurrency gets preference over NDI+NDI. Disable
* first NDI in case an NDI+NDI concurrency exists if FW does
* not support 4 port concurrency of two NDI + NAN with STA.
*/
if (!ucfg_nan_is_sta_nan_ndi_4_port_allowed(psoc))
ucfg_nan_check_and_disable_unsupported_ndi(psoc,
false);
if (!wlan_vdev_mlme_is_mlo_link_vdev(vdev)) {
/*
* In case of STA+STA concurrency, firmware might try to roam
* to same AP where host is trying to do association on the other
* STA iface. Roaming is disabled on all the ifaces to avoid
* this scenario.
*/
if_mgr_disable_roaming(pdev, vdev, RSO_CONNECT_START);
wlan_tdls_teardown_links_sync(psoc);
}
return QDF_STATUS_SUCCESS;
}
QDF_STATUS if_mgr_connect_complete(struct wlan_objmgr_vdev *vdev,
struct if_mgr_event_data *event_data)
{
struct wlan_objmgr_psoc *psoc;
struct wlan_objmgr_pdev *pdev;
QDF_STATUS status = event_data->status;
pdev = wlan_vdev_get_pdev(vdev);
if (!pdev)
return QDF_STATUS_E_FAILURE;
psoc = wlan_pdev_get_psoc(pdev);
if (!psoc)
return QDF_STATUS_E_FAILURE;
if (QDF_IS_STATUS_SUCCESS(status)) {
/*
* Due to audio share glitch with P2P clients caused by roam
* scan on concurrent interface, disable roaming if
* "p2p_disable_roam" ini is enabled. Donot re-enable roaming
* again on other STA interface if p2p client connection is
* active on any vdev.
*/
if (ucfg_p2p_is_roam_config_disabled(psoc) &&
wlan_vdev_mlme_get_opmode(vdev) == QDF_P2P_CLIENT_MODE) {
ifmgr_debug("p2p client active, keep roam disabled");
} else {
policy_mgr_set_pcl_for_connected_vdev(psoc,
vdev->vdev_objmgr.
vdev_id, false);
/*
* Enable roaming on other STA iface except this one.
* Firmware doesn't support connection on one STA iface
* while roaming on other STA iface.
*/
if_mgr_enable_roaming(pdev, vdev, RSO_CONNECT_START);
}
} else {
/* notify connect failure on final failure */
ucfg_tdls_notify_connect_failure(psoc);
/*
* Enable roaming on other STA iface except this one.
* Firmware doesn't support connection on one STA iface
* while roaming on other STA iface.
*/
if_mgr_enable_roaming(pdev, vdev, RSO_CONNECT_START);
}
policy_mgr_check_n_start_opportunistic_timer(psoc);
if (!wlan_cm_is_vdev_roaming(vdev))
policy_mgr_check_concurrent_intf_and_restart_sap(psoc);
return QDF_STATUS_SUCCESS;
}
QDF_STATUS if_mgr_disconnect_start(struct wlan_objmgr_vdev *vdev,
struct if_mgr_event_data *event_data)
{
struct wlan_objmgr_psoc *psoc;
struct wlan_objmgr_pdev *pdev;
pdev = wlan_vdev_get_pdev(vdev);
if (!pdev)
return QDF_STATUS_E_FAILURE;
psoc = wlan_pdev_get_psoc(pdev);
if (!psoc)
return QDF_STATUS_E_FAILURE;
/* Leaving as stub to fill in later */
return QDF_STATUS_SUCCESS;
}
QDF_STATUS if_mgr_disconnect_complete(struct wlan_objmgr_vdev *vdev,
struct if_mgr_event_data *event_data)
{
struct wlan_objmgr_psoc *psoc;
struct wlan_objmgr_pdev *pdev;
QDF_STATUS status;
pdev = wlan_vdev_get_pdev(vdev);
if (!pdev)
return QDF_STATUS_E_FAILURE;
psoc = wlan_pdev_get_psoc(pdev);
if (!psoc)
return QDF_STATUS_E_FAILURE;
status = if_mgr_enable_roaming_after_p2p_disconnect(pdev, vdev,
RSO_INVALID_REQUESTOR);
if (status) {
ifmgr_err("Failed to enable roaming after p2p disconnect");
return status;
}
policy_mgr_check_concurrent_intf_and_restart_sap(psoc);
status = if_mgr_enable_roaming_on_connected_sta(pdev, vdev);
if (status) {
ifmgr_err("Failed to enable roaming on connected sta");
return status;
}
return QDF_STATUS_SUCCESS;
}

View File

@@ -1,492 +0,0 @@
/*
* Copyright (c) 2021, The Linux Foundation. All rights reserved.
* Copyright (c) 2021 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.
*/
/*
* DOC: wlan_cm_roam_logging.c
*
* Implementation for the Connect/roaming logging.
*/
#ifndef _WLAN_CONNECTIVITY_LOGGING_H_
#define _WLAN_CONNECTIVITY_LOGGING_H_
#include <wlan_cm_api.h>
#include "wlan_cm_roam_api.h"
#include "wlan_logging_sock_svc.h"
#define WLAN_MAX_LOGGING_FREQ 90
/**
* enum wlan_main_tag - Main Tag used in logging
* @WLAN_CONNECTING: Connecting
* @WLAN_CONNECTING_FAIL: Connection failure
* @WLAN_AUTH_REQ: Authentication request frame
* @WLAN_AUTH_RESP: Authentication response frame
* @WLAN_ASSOC_REQ: Association request frame
* @WLAN_ASSOC_RESP: Association response frame
* @WLAN_DEAUTH_RX: Deauthentication frame received
* @WLAN_DEAUTH_TX: Deauthentication frame sent
* @WLAN_DISASSOC_RX: Disassociation frame received
* @WLAN_DISASSOC_TX: Disassociation frame sent
* @WLAN_DISCONN_BMISS: Disconnection due to beacon miss
* @WLAN_ROAM_SCAN_START: ROAM scan start
* @WLAN_ROAM_SCAN_DONE: Roam scan done
* @WLAN_ROAM_SCR_CURR_AP: Roam score current AP
* @WLAN_ROAM_SCORE_CAND_AP: Roam Score Candidate AP
* @WLAN_ROAM_RESULT: Roam Result
* @WLAN_ROAM_CANCEL: Roam Cancel
* @WLAN_BTM_REQ: BTM request
* @WLAN_BTM_QUERY: BTM Query frame
* @WLAN_BTM_RESP: BTM response frame
* @WLAN_BTM_REQ_CANDI: BTM request candidate info
* @WLAN_ROAM_WTC: ROAM WTC trigger logs
* @WLAN_DHCP_DISCOVER: DHCP discover frame
* @WLAN_DHCP_OFFER: DHCP offer frame
* @WLAN_DHCP_REQUEST: DHCP Request frame
* @WLAN_DHCP_ACK: DHCP ACK
* @WLAN_DHCP_NACK: DHCP NACK
* @WLAN_EAPOL_M1: EAPOL M1
* @WLAN_EAPOL_M2: EAPOL M2
* @WLAN_EAPOL_M3: EAPOL M3
* @WLAN_EAPOL_M4: EAPOL M4
* @WLAN_GTK_M1: GTK rekey M1 frame
* @WLAN_GTK_M2: GTK Rekey M2 frame
* @WLAN_EAP_REQUEST: EAP request frame
* @WLAN_EAP_RESPONSE: EAP response frame
* @WLAN_EAP_SUCCESS: EAP success
* @WLAN_EAP_FAILURE: EAP failure
* @WLAN_CUSTOM_LOG: Additional WLAN logs
* @WLAN_TAG_MAX: MAX tag
*/
enum wlan_main_tag {
WLAN_CONNECTING,
WLAN_CONNECTING_FAIL,
WLAN_AUTH_REQ,
WLAN_AUTH_RESP,
WLAN_ASSOC_REQ,
WLAN_ASSOC_RSP,
WLAN_DEAUTH_RX,
WLAN_DEAUTH_TX,
WLAN_DISASSOC_RX,
WLAN_DISASSOC_TX,
WLAN_DISCONN_BMISS,
WLAN_ROAM_SCAN_START,
WLAN_ROAM_SCAN_DONE,
WLAN_ROAM_SCORE_CURR_AP,
WLAN_ROAM_SCORE_CAND_AP,
WLAN_ROAM_RESULT,
WLAN_ROAM_CANCEL,
WLAN_BTM_REQ,
WLAN_BTM_QUERY,
WLAN_BTM_RESP,
WLAN_BTM_REQ_CANDI,
WLAN_ROAM_WTC,
WLAN_DHCP_DISCOVER,
WLAN_DHCP_OFFER,
WLAN_DHCP_REQUEST,
WLAN_DHCP_ACK,
WLAN_DHCP_NACK,
WLAN_EAPOL_M1,
WLAN_EAPOL_M2,
WLAN_EAPOL_M3,
WLAN_EAPOL_M4,
WLAN_GTK_M1,
WLAN_GTK_M2,
WLAN_EAP_REQUEST,
WLAN_EAP_RESPONSE,
WLAN_EAP_SUCCESS,
WLAN_EAP_FAILURE,
WLAN_CUSTOM_LOG,
/* Keep at last */
WLAN_TAG_MAX,
};
/**
* struct wlan_roam_candidate_info - Roam candidate information for logging
* @cand_bssid: BSSID of the candidate AP
* @is_current_ap: Is the entry candidate AP or connected AP
* @idx: Entry index
* @cu_load: Channel utilization load of the AP in percentage
* @freq: Candidate AP channel frequency in MHz
* @total_score: Total candidate AP score
* @rssi: Candidate AP RSSI in dBm
* @etp: Estimated throughput value of the AP in Kbps
*/
struct wlan_roam_candidate_info {
struct qdf_mac_addr cand_bssid;
bool is_current_ap;
uint8_t idx;
uint8_t cu_load;
qdf_freq_t freq;
uint16_t total_score;
int32_t rssi;
uint32_t etp;
};
/**
* struct wlan_roam_scan_info - Roam scan related information
* @cand_ap_count: Roam candidate AP count
* @num_scanned_frequencies: Number of scanned frequencies
* @scan_freq: Array of scanned frequencies value in MHz
*/
struct wlan_roam_scan_info {
uint8_t cand_ap_count;
uint16_t num_scanned_freq;
qdf_freq_t scan_freq[WLAN_MAX_LOGGING_FREQ];
};
/**
* struct wlan_roam_result_info - Roam result data
* @roam_fail_reason: Roam failure reason code defined in enum
* wlan_roam_failure_reason_code
* @is_roam_successful: True if roamed successfully or false if roaming failed
*/
struct wlan_roam_result_info {
enum wlan_roam_failure_reason_code roam_fail_reason;
bool is_roam_successful;
};
/**
* struct wlan_roam_scan_trigger_info - Structure to store roam scan trigger
* related data.
* @is_full_scan: True if the scan is Full scan. False if the roam scan is
* partial channel map scan
* @trigger_reason: Roam trigger reason defined by enum roam_trigger_reason
* @trigger_sub_reason: Roam scan trigger sub reason indicating if
* periodic/inactivity scan timer initiated roam. Defined by enum
* roam_trigger_sub_reason
* @cu_load: Current connected channel load in percentage
* @current_rssi: Connected AP RSSI in dBm
* @rssi_threshold: Roam scan trigger threshold in dBm
*/
struct wlan_roam_trigger_info {
bool is_full_scan;
enum roam_trigger_reason trigger_reason;
enum roam_trigger_sub_reason trigger_sub_reason;
uint8_t cu_load;
int32_t current_rssi;
int32_t rssi_threshold;
};
/**
* struct wlan_btm_cand_info - BTM candidate information
* @index: Candidate index
* @preference: Candidate preference
* @bssid: candidate bssid
*/
struct wlan_btm_cand_info {
uint8_t idx;
uint8_t preference;
struct qdf_mac_addr bssid;
};
/**
* struct wlan_roam_btm_info - BTM frame related logging data
* @reason: Query Reason field. Contains one of the values defined in IEEE
* Std 802.112020 Table 9-198—Transition and Transition Query reasons
* @mode: BTM Request Mode field
* @sub_reason: WTC sub reason code field in the BTM WTC vendor specific IE
* @candidate_list_count: Candidates list in the BTM frame
* @btm_status_code: BSS Transition management status codes defined in
* 802.112020 Table 9-428—BTM status code definitions
* @btm_delay: BSS Termination Delay field
* @is_disassoc_imminent: Disassociation imminent bit
* @token: dialog token. Dialog Token is a nonzero value chosen by the STA
* while sending the BTM frame to identify the query/request/response
* transaction
* @validity_timer: Validity interval in TBTT
* @disassoc_timer: Time after which the AP disassociates the STA, defined
* in TBTT.
* @wtc_duration: WTC duration field in minutes
* @target_bssid: BTM response target bssid field
*/
struct wlan_roam_btm_info {
uint8_t reason;
uint8_t mode;
uint8_t sub_reason;
uint8_t candidate_list_count;
uint8_t btm_status_code;
uint8_t btm_delay;
bool is_disassoc_imminent;
uint8_t token;
uint8_t validity_timer;
uint16_t disassoc_timer;
uint32_t wtc_duration;
struct qdf_mac_addr target_bssid;
};
/**
* struct wlan_packet_info - Data packets related info
* @tx_status: Frame TX status defined by enum qdf_dp_tx_rx_status
* @eap_type: EAP type. Values defined by IANA at:
* https://www.iana.org/assignments/eap-numbers
* @eap_len: EAP data length
* @auth_algo: authentication algorithm number defined in IEEE Std 802.112020
* Section 9.4.1.1 Authentication Algorithm Number field.
* @auth_seq_num: Authentication frame transaction sequence number
* @auth_type: Authentication frame sub-type for SAE authentication. Possible
* values:
* 1 - SAE commit frame
* 2 - SAE confirm frame
* @frame_status_code: Frame status code as defined in IEEE Std
* 802.112020 Table 9-50—Status codes.
* @seq_num: Frame sequence number
* @rssi: Peer RSSI in dBm
* @is_retry_frame: is frame retried
*/
struct wlan_packet_info {
uint8_t tx_status;
uint8_t eap_type;
uint16_t eap_len;
uint8_t auth_algo;
uint8_t auth_seq_num;
uint8_t auth_type;
uint16_t frame_status_code;
uint16_t seq_num;
int32_t rssi;
bool is_retry_frame;
};
/**
* struct wlan_connect_info - Connection related info
* @ssid: SSID
* @ssid_len: Length of the SSID
* @bssid_hint: BSSID hint provided in the connect request
* @freq: Frequency in MHz
* @freq_hint: Frequency Hint in MHz
* @akm: Auth key management suite defined in IEEE Std 802.112020
* Table 9-151—AKM suite selectors.
* @pairwise: Pairwise suite value as defined in IEEE 802.11 2020
* Table 12-10—Integrity and key wrap algorithms.
* @group: Group cipher suite value as defined in
* Table 12-10—Integrity and key wrap algorithms.
* @group_mgmt: Group manangement cipher suite as defined in
* Table 12-10—Integrity and key wrap algorithms.
* @auth_type: Authentication algorithm number field as defined in
* IEEE 802.11 - 2020 standard section 9.4.1.1
* @conn_status: Connection failure status defined by enum
* wlan_cm_connect_fail_reason
* @is_bt_coex_active: Is there active bluetooth connection
*/
struct wlan_connect_info {
char ssid[WLAN_SSID_MAX_LEN];
uint8_t ssid_len;
struct qdf_mac_addr bssid_hint;
qdf_freq_t freq;
qdf_freq_t freq_hint;
uint32_t akm;
uint32_t pairwise;
uint32_t group;
uint32_t group_mgmt;
uint8_t auth_type;
enum wlan_cm_connect_fail_reason conn_status;
bool is_bt_coex_active;
};
#define WLAN_MAX_LOG_RECORDS 45
#define WLAN_MAX_LOG_LEN 256
#define WLAN_RECORDS_PER_SEC 20
#define MAX_RECORD_IN_SINGLE_EVT 5
/**
* struct wlan_log_record - Structure for indvidual records in the ring
* buffer
* @timestamp_us: Timestamp(time of the day) in microseconds
* @fw_timestamp_us: timestamp at which roam scan was triggered
* @vdev_id: VDEV id
* @log_subtype: Tag of the log
* @bssid: AP bssid
* @is_record_filled: indicates if the current record is empty or not
* @conn_info: Connection info
* @pkt_info: Packet info
* @roam_scan: Roam scan
* @ap: Roam candidate AP info
* @roam_result: Roam result
* @roam_trig: Roam trigger related info
* @btm_info: BTM info
* @btm_cand: BTM response candidate info
*/
struct wlan_log_record {
uint64_t timestamp_us;
uint64_t fw_timestamp_us;
uint8_t vdev_id;
uint32_t log_subtype;
struct qdf_mac_addr bssid;
bool is_record_filled;
union {
struct wlan_connect_info conn_info;
struct wlan_packet_info pkt_info;
struct wlan_roam_scan_info roam_scan;
struct wlan_roam_candidate_info ap;
struct wlan_roam_result_info roam_result;
struct wlan_roam_trigger_info roam_trig;
struct wlan_roam_btm_info btm_info;
struct wlan_btm_cand_info btm_cand;
};
};
/**
* struct wlan_cl_osif_cbks - OSIF callbacks to be invoked for connectivity
* logging
* @wlan_connectivity_log_send_to_usr: Send the log buffer to user space
*/
struct wlan_cl_osif_cbks {
QDF_STATUS
(*wlan_connectivity_log_send_to_usr) (struct wlan_log_record *rec,
void *context,
uint8_t num_records);
};
/**
* struct wlan_connectivity_log_buf_data - Master structure to hold the
* pointers to the ring buffers.
* @osif_cbks: OSIF callbacks
* @osif_cb_context: Pointer to the context to be passed to OSIF
* callback
* @first_record_timestamp_in_last_sec: First record timestamp
* @sent_msgs_count: Total sent messages counter in the last 1 sec
* @head: Pointer to the 1st record allocated in the ring buffer.
* @read_ptr: Pointer to the next record that can be read.
* @write_ptr: Pointer to the next empty record to be written.
* @write_ptr_lock: Spinlock to protect the write_ptr from multiple producers.
* @max_records: Maximum records in the ring buffer.
* @read_idx: Read index
* @write_idx: Write index
* @dropped_msgs: Dropped logs counter
* @is_active: If the global buffer is initialized or not
*/
struct wlan_connectivity_log_buf_data {
struct wlan_cl_osif_cbks osif_cbks;
void *osif_cb_context;
uint64_t first_record_timestamp_in_last_sec;
uint64_t sent_msgs_count;
struct wlan_log_record *head;
struct wlan_log_record *read_ptr;
struct wlan_log_record *write_ptr;
qdf_spinlock_t write_ptr_lock;
uint8_t max_records;
uint8_t read_idx;
uint8_t write_idx;
qdf_atomic_t dropped_msgs;
qdf_atomic_t is_active;
};
#define logging_err_rl(params...) \
QDF_TRACE_ERROR_RL(QDF_MODULE_ID_MLME, ## params)
#define logging_warn_rl(params...) \
QDF_TRACE_WARN_RL(QDF_MODULE_ID_MLME, ## params)
#define logging_info_rl(params...) \
QDF_TRACE_INFO_RL(QDF_MODULE_ID_MLME, ## params)
#define logging_debug(params...) QDF_TRACE_DEBUG(QDF_MODULE_ID_QDF, ## params)
#define logging_err(params...) QDF_TRACE_ERROR(QDF_MODULE_ID_QDF, ## params)
#define logging_info(params...) QDF_TRACE_INFO(QDF_MODULE_ID_QDF, ## params)
#ifdef WLAN_FEATURE_CONNECTIVITY_LOGGING
/**
* wlan_connectivity_logging_start() - Initialize the connectivity/roaming
* logging buffer
* @osif_cbks: OSIF callbacks
* @osif_cbk_context: OSIF callback context argument
*
* Return: None
*/
void wlan_connectivity_logging_start(struct wlan_cl_osif_cbks *osif_cbks,
void *osif_cb_context);
/**
* wlan_connectivity_logging_stop() - Deinitialize the connectivity logging
* buffers and spinlocks.
*
* Return: None
*/
void wlan_connectivity_logging_stop(void);
/**
* wlan_connectivity_log_dequeue() - Send the connectivity logs to userspace
*
* Return: QDF_STATUS
*/
QDF_STATUS wlan_connectivity_log_dequeue(void);
/**
* wlan_connectivity_log_enqueue() - Add new record to the logging buffer
* @new_record: Pointer to the new record to be added
*
* Return: QDF_STATUS
*/
QDF_STATUS wlan_connectivity_log_enqueue(struct wlan_log_record *new_record);
/**
* wlan_connectivity_mgmt_event() - Fill and enqueue a new record
* for management frame information.
* @mac_hdr: 802.11 management frame header
* @vdev_id: Vdev id
* @status_code: Frame status code as defined in IEEE 802.11 - 2020 standard
* section 9.4.1.9
* @tx_status: Frame TX status defined by enum qdf_dp_tx_rx_status
* @peer_rssi: Peer RSSI in dBm
* @auth_algo: Authentication algorithm number field as defined in IEEE 802.11 -
* 2020 standard section 9.4.1.1
* @auth_type: indicates SAE authentication frame type. Possible values are:
* 1 - SAE commit frame
* 2 - SAE confirm frame
* @auth_seq: Authentication frame transaction sequence number as defined in
* IEEE 802.11 - 2020 standard section 9.4.1.2
* @tag: Record type main tag
*
* Return: QDF_STATUS
*/
void
wlan_connectivity_mgmt_event(struct wlan_frame_hdr *mac_hdr,
uint8_t vdev_id, uint16_t status_code,
enum qdf_dp_tx_rx_status tx_status,
int8_t peer_rssi,
uint8_t auth_algo, uint8_t auth_type,
uint8_t auth_seq,
enum wlan_main_tag tag);
#else
static inline
void wlan_connectivity_logging_start(struct wlan_cl_osif_cbks *osif_cbks,
void *osif_cb_context)
{}
static inline void wlan_connectivity_logging_stop(void)
{}
static inline QDF_STATUS wlan_connectivity_log_dequeue(void)
{
return QDF_STATUS_E_NOSUPPORT;
}
static inline
QDF_STATUS wlan_connectivity_log_enqueue(struct wlan_log_record *new_record)
{
return QDF_STATUS_E_NOSUPPORT;
}
static inline void
wlan_connectivity_mgmt_event(struct wlan_frame_hdr *mac_hdr,
uint8_t vdev_id, uint16_t status_code,
enum qdf_dp_tx_rx_status tx_status,
int8_t peer_rssi,
uint8_t auth_algo, uint8_t auth_type,
uint8_t auth_seq,
enum wlan_main_tag tag)
{}
#endif
#endif /* _WLAN_CONNECTIVITY_LOGGING_H_ */

View File

@@ -1,276 +0,0 @@
/*
* Copyright (c) 2021, The Linux Foundation. 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.
*/
/*
* DOC: wlan_cm_roam_logging.c
*
* Implementation for the connectivity and roam logging api.
*/
#include "wlan_mlme_api.h"
#include "wlan_mlme_main.h"
#include "wlan_connectivity_logging.h"
static struct wlan_connectivity_log_buf_data global_cl;
static void
wlan_connectivity_logging_register_callbacks(
struct wlan_cl_osif_cbks *osif_cbks,
void *osif_cb_context)
{
global_cl.osif_cbks.wlan_connectivity_log_send_to_usr =
osif_cbks->wlan_connectivity_log_send_to_usr;
global_cl.osif_cb_context = osif_cb_context;
}
void wlan_connectivity_logging_start(struct wlan_cl_osif_cbks *osif_cbks,
void *osif_cb_context)
{
global_cl.head = qdf_mem_valloc(sizeof(*global_cl.head) *
WLAN_MAX_LOG_RECORDS);
if (!global_cl.head) {
QDF_BUG(0);
return;
}
global_cl.write_idx = 0;
global_cl.read_idx = 0;
qdf_atomic_init(&global_cl.dropped_msgs);
qdf_spinlock_create(&global_cl.write_ptr_lock);
global_cl.read_ptr = global_cl.head;
global_cl.write_ptr = global_cl.head;
global_cl.max_records = WLAN_MAX_LOG_RECORDS;
wlan_connectivity_logging_register_callbacks(osif_cbks,
osif_cb_context);
qdf_atomic_set(&global_cl.is_active, 1);
}
void wlan_connectivity_logging_stop(void)
{
if (!qdf_atomic_read(&global_cl.is_active))
return;
qdf_spin_lock_bh(&global_cl.write_ptr_lock);
global_cl.osif_cb_context = NULL;
global_cl.osif_cbks.wlan_connectivity_log_send_to_usr = NULL;
qdf_atomic_set(&global_cl.is_active, 0);
global_cl.read_ptr = NULL;
global_cl.write_ptr = NULL;
global_cl.read_idx = 0;
global_cl.write_idx = 0;
qdf_mem_vfree(global_cl.head);
global_cl.head = NULL;
qdf_spin_unlock_bh(&global_cl.write_ptr_lock);
qdf_spinlock_destroy(&global_cl.write_ptr_lock);
}
void
wlan_connectivity_mgmt_event(struct wlan_frame_hdr *mac_hdr,
uint8_t vdev_id, uint16_t status_code,
enum qdf_dp_tx_rx_status tx_status,
int8_t peer_rssi,
uint8_t auth_algo, uint8_t auth_type,
uint8_t auth_seq, enum wlan_main_tag tag)
{
struct wlan_log_record *new_rec;
new_rec = qdf_mem_malloc(sizeof(*new_rec));
if (!new_rec)
return;
new_rec->timestamp_us = qdf_get_time_of_the_day_us();
new_rec->vdev_id = vdev_id;
new_rec->log_subtype = tag;
qdf_copy_macaddr(&new_rec->bssid,
(struct qdf_mac_addr *)&mac_hdr->i_addr3[0]);
new_rec->pkt_info.tx_status = tx_status;
new_rec->pkt_info.rssi = peer_rssi;
new_rec->pkt_info.seq_num =
(le16toh(*(uint16_t *)mac_hdr->i_seq) >> WLAN_SEQ_SEQ_SHIFT);
new_rec->pkt_info.frame_status_code = status_code;
new_rec->pkt_info.auth_algo = auth_algo;
new_rec->pkt_info.auth_type = auth_type;
new_rec->pkt_info.auth_seq_num = auth_seq;
new_rec->pkt_info.is_retry_frame =
(mac_hdr->i_fc[1] & IEEE80211_FC1_RETRY);
wlan_connectivity_log_enqueue(new_rec);
qdf_mem_free(new_rec);
}
static bool wlan_logging_is_queue_empty(void)
{
if (!qdf_atomic_read(&global_cl.is_active))
return true;
qdf_spin_lock_bh(&global_cl.write_ptr_lock);
if (!global_cl.write_ptr) {
qdf_spin_unlock_bh(&global_cl.write_ptr_lock);
return true;
}
if (global_cl.read_ptr == global_cl.write_ptr &&
!global_cl.write_ptr->is_record_filled) {
qdf_spin_unlock_bh(&global_cl.write_ptr_lock);
return true;
}
qdf_spin_unlock_bh(&global_cl.write_ptr_lock);
return false;
}
QDF_STATUS
wlan_connectivity_log_enqueue(struct wlan_log_record *new_record)
{
struct wlan_log_record *write_block;
if (!new_record) {
logging_debug("NULL entry");
return QDF_STATUS_E_FAILURE;
}
if (new_record->log_subtype >= WLAN_TAG_MAX) {
logging_debug("Enqueue failed subtype:%d",
new_record->log_subtype);
return QDF_STATUS_E_FAILURE;
}
/*
* This API writes to the logging buffer if the buffer is not full.
* 1. Acquire the write spinlock.
* 2. Copy the record to the write block.
* 3. Update the write pointer
* 4. Release the spinlock
*/
qdf_spin_lock_bh(&global_cl.write_ptr_lock);
write_block = global_cl.write_ptr;
/* If the buffer is full, increment the dropped msgs counter and
* return
*/
if (global_cl.read_ptr == global_cl.write_ptr &&
write_block->is_record_filled) {
qdf_spin_unlock_bh(&global_cl.write_ptr_lock);
qdf_atomic_inc(&global_cl.dropped_msgs);
logging_debug("vdev:%d dropping msg sub-type:%d total dropped:%d",
new_record->vdev_id, new_record->log_subtype,
qdf_atomic_read(&global_cl.dropped_msgs));
wlan_logging_set_connectivity_log();
return QDF_STATUS_E_NOMEM;
}
*write_block = *new_record;
write_block->is_record_filled = true;
global_cl.write_idx++;
global_cl.write_idx %= global_cl.max_records;
global_cl.write_ptr =
&global_cl.head[global_cl.write_idx];
qdf_spin_unlock_bh(&global_cl.write_ptr_lock);
wlan_logging_set_connectivity_log();
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_connectivity_log_dequeue(void)
{
struct wlan_log_record *data;
struct wlan_cl_osif_cbks *osif_cbk;
void *osif_cb_context;
uint8_t idx = 0;
uint64_t current_timestamp, time_delta;
if (wlan_logging_is_queue_empty())
return QDF_STATUS_SUCCESS;
data = qdf_mem_malloc(MAX_RECORD_IN_SINGLE_EVT * sizeof(*data));
if (!data)
return QDF_STATUS_E_NOMEM;
while (global_cl.read_ptr->is_record_filled) {
current_timestamp = qdf_get_time_of_the_day_ms();
time_delta = current_timestamp -
global_cl.first_record_timestamp_in_last_sec;
/*
* Don't send logs if the time difference between the first
* packet queued and current timestamp is less than 1 second and
* the sent messages count is 20.
* Else if the current record to be dequeued is 1 sec apart from
* the previous first packet timestamp, then reset the
* sent messages counter and first packet timestamp.
*/
if (time_delta < 1000 &&
global_cl.sent_msgs_count >= WLAN_RECORDS_PER_SEC) {
break;
} else if (time_delta > 1000) {
global_cl.sent_msgs_count = 0;
global_cl.first_record_timestamp_in_last_sec =
current_timestamp;
}
global_cl.sent_msgs_count =
qdf_do_div_rem(global_cl.sent_msgs_count,
WLAN_RECORDS_PER_SEC);
data[idx] = *global_cl.read_ptr;
/*
* Reset the read block after copy. This will set the
* is_record_filled to false.
*/
qdf_mem_zero(global_cl.read_ptr, sizeof(*global_cl.read_ptr));
global_cl.read_idx++;
global_cl.read_idx %= global_cl.max_records;
global_cl.read_ptr =
&global_cl.head[global_cl.read_idx];
global_cl.sent_msgs_count++;
idx++;
if (idx >= MAX_RECORD_IN_SINGLE_EVT) {
wlan_logging_set_connectivity_log();
break;
}
}
osif_cbk = &global_cl.osif_cbks;
osif_cb_context = global_cl.osif_cb_context;
if (osif_cbk->wlan_connectivity_log_send_to_usr)
osif_cbk->wlan_connectivity_log_send_to_usr(data,
osif_cb_context,
idx);
qdf_mem_free(data);
return QDF_STATUS_SUCCESS;
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,627 +0,0 @@
/*
* Copyright (c) 2012-2021 The Linux Foundation. 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 __CFG_POLICY_MGR
#define __CFG_POLICY_MGR
#include "qdf_types.h"
/*
* <ini>
* gWlanMccToSccSwitchMode - Control SAP channel.
* @Min: 0
* @Max: 5
* @Default: 0
*
* This ini is used to override SAP channel.
* If gWlanMccToSccSwitchMode = 0: disabled.
* If gWlanMccToSccSwitchMode = 1: Enable switch.
* If gWlainMccToSccSwitchMode = 2: Force switch with SAP restart.
* If gWlainMccToSccSwitchMode = 3: Force switch without SAP restart.
* If gWlainMccToSccSwitchMode = 4: Switch using
* fav channel(s)without SAP restart.
* If gWlainMccToSccSwitchMode = 5: Force switch without SAP restart.MCC allowed
* in exceptional cases.
* If gWlainMccToSccSwitchMode = 6: Force Switch without SAP restart only in
user preffered band.
* Related: None.
*
* Supported Feature: Concurrency
*
* Usage: External
*
* </ini>
*/
#define CFG_MCC_TO_SCC_SWITCH CFG_INI_UINT(\
"gWlanMccToSccSwitchMode", \
QDF_MCC_TO_SCC_SWITCH_DISABLE, \
QDF_MCC_TO_SCC_SWITCH_MAX - 1, \
QDF_MCC_TO_SCC_SWITCH_DISABLE, \
CFG_VALUE_OR_DEFAULT, \
"Provides MCC to SCC switch mode")
/*
* <ini>
* gSystemPref - Configure wlan system preference for PCL.
* @Min: 0
* @Max: 2
* @Default: 0
*
* This ini is used to configure wlan system preference option to help
* policy manager decide on Preferred Channel List for a new connection.
* For possible values refer to enum hdd_conc_priority_mode
*
* Related: None.
*
* Supported Feature: DBS
*
* Usage: External
*
* </ini>
*/
#define CFG_CONC_SYS_PREF CFG_INI_UINT(\
"gSystemPref", 0, 2, 0, \
CFG_VALUE_OR_DEFAULT, \
"System preference to predict PCL")
/*
* <ini>
* gMaxConcurrentActiveSessions - Maximum number of concurrent connections.
* @Min: 1
* @Max: 4
* @Default: 3
*
* This ini is used to configure the maximum number of concurrent connections.
*
* Related: None.
*
* Supported Feature: Concurrency
*
* Usage: External
*
* </ini>
*/
#define CFG_MAX_CONC_CXNS CFG_INI_UINT(\
"gMaxConcurrentActiveSessions", \
1, 4, 3, \
CFG_VALUE_OR_DEFAULT, \
"Config max num allowed connections")
#define POLICY_MGR_CH_SELECT_POLICY_DEF 0x00000003
/*
* <ini>
* channel_select_logic_conc - Set channel selection logic
* for different concurrency combinations to DBS or inter band
* MCC. Default is DBS for STA+STA and STA+P2P.
* @Min: 0x00000000
* @Max: 0xFFFFFFFF
* @Default: 0x00000000
*
* 0 - inter-band MCC
* 1 - DBS
*
* BIT 0: STA+STA
* BIT 1: STA+P2P
* BIT 2-31: Reserved
*
* Supported Feature: STA+STA, STA+P2P
*
* Usage: External
*
* </ini>
*/
#define CFG_CHNL_SELECT_LOGIC_CONC CFG_INI_UINT(\
"channel_select_logic_conc",\
0x00000000, \
0xFFFFFFFF, \
POLICY_MGR_CH_SELECT_POLICY_DEF, \
CFG_VALUE_OR_DEFAULT, \
"Set channel selection policy for various concurrency")
/*
* <ini>
* dbs_selection_policy - Configure dbs selection policy.
* @Min: 0
* @Max: 3
* @Default: 0
*
* set band preference or Vdev preference.
* bit[0] = 0: 5G 2x2 preferred to select 2x2 5G + 1x1 2G DBS mode.
* bit[0] = 1: 2G 2x2 preferred to select 2x2 2G + 1x1 5G DBS mode.
* bit[1] = 1: vdev priority enabled. The INI "vdev_priority_list" will
* specify the vdev priority.
* bit[1] = 0: vdev priority disabled.
* This INI only take effect for Genoa dual DBS hw.
*
* Supported Feature: DBS
*
* Usage: External
*
* </ini>
*/
#define CFG_DBS_SELECTION_PLCY CFG_INI_UINT(\
"dbs_selection_policy", \
0, 3, 0, \
CFG_VALUE_OR_DEFAULT, \
"Configure dbs selection policy")
/*
* <ini>
* vdev_priority_list - Configure vdev priority list.
* @Min: 0
* @Max: 0x4444
* @Default: 0x4321
*
* @vdev_priority_list: vdev priority list
* bit[0-3]: pri_id (policy_mgr_pri_id) of highest priority
* bit[4-7]: pri_id (policy_mgr_pri_id) of second priority
* bit[8-11]: pri_id (policy_mgr_pri_id) of third priority
* bit[12-15]: pri_id (policy_mgr_pri_id) of fourth priority
* example: 0x4321 - CLI < GO < SAP < STA
* vdev priority id mapping:
* PM_STA_PRI_ID = 1,
* PM_SAP_PRI_ID = 2,
* PM_P2P_GO_PRI_ID = 3,
* PM_P2P_CLI_PRI_ID = 4,
* When the previous INI "dbs_selection_policy" bit[1]=1, which means
* the vdev 2x2 prioritization enabled. Then this INI will be used to
* specify the vdev type priority list. For example :
* dbs_selection_policy=0x2
* vdev_priority_list=0x4312
* means: default preference 2x2 band is 5G, vdev 2x2 prioritization enabled.
* And the priority list is CLI < GO < STA < SAP
*
* This INI only take effect for Genoa dual DBS hw.
*
* Supported Feature: DBS
*
* Usage: External
*
* </ini>
*/
#define CFG_VDEV_CUSTOM_PRIORITY_LIST CFG_INI_UINT(\
"vdev_priority_list", \
0, 0x4444, 0x4321, \
CFG_VALUE_OR_DEFAULT, \
"Configure vdev priority list")
/*
* <ini>
* gEnableCustomConcRule1 - Enable custom concurrency rule1.
* @Min: 0
* @Max: 1
* @Default: 0
*
* This ini is used to enable/disable custom concurrency rule1.
* If SAP comes up first and STA comes up later then SAP needs to follow STA's
* channel.
*
* Related: None.
*
* Supported Feature: Concurrency
*
* Usage: External
*
* </ini>
*/
#define CFG_ENABLE_CONC_RULE1 CFG_INI_UINT(\
"gEnableCustomConcRule1", \
0, 1, 0, \
CFG_VALUE_OR_DEFAULT, \
"Enable custom concurrency rule 1")
/*
* <ini>
* gEnableCustomConcRule2 - Enable custom concurrency rule2.
* @Min: 0
* @Max: 1
* @Default: 0
*
* This ini is used to enable/disable custom concurrency rule2.
* If P2PGO comes up first and STA comes up later then P2PGO need to follow
* STA's channel in 5Ghz. In following if condition we are just adding sanity
* check to make sure that by this time P2PGO's channel is same as STA's
* channel.
*
* Related: None.
*
* Supported Feature: Concurrency
*
* Usage: External
*
* </ini>
*/
#define CFG_ENABLE_CONC_RULE2 CFG_INI_UINT(\
"gEnableCustomConcRule2", \
0, 1, 0, \
CFG_VALUE_OR_DEFAULT, \
"Enable custom concurrency rule 2")
/*
* <ini>
* gEnableMCCAdaptiveScheduler - MCC Adaptive Scheduler feature.
* @Min: 0
* @Max: 1
* @Default: 1
*
* This ini is used to enable/disable MCC Adaptive Scheduler feature.
*
* Related: None.
*
* Supported Feature: Concurrency
*
* Usage: External
*
* </ini>
*/
#define CFG_ENABLE_MCC_ADAPTIVE_SCH_ENABLED_NAME CFG_INI_BOOL(\
"gEnableMCCAdaptiveScheduler", \
true, \
"Enable/Disable MCC Adaptive Scheduler")
/*
* <ini>
* gEnableStaConnectionIn5Ghz - To enable/disable STA connection in 5G
* @Min: 0
* @Max: 1
* @Default: 1
*
* This ini is used to enable/disable STA connection in 5G band
*
* Related: STA
*
* Supported Feature: Concurrency
*
* Usage: External
*
* </ini>
*/
#define CFG_ENABLE_STA_CONNECTION_IN_5GHZ CFG_INI_UINT(\
"gEnableStaConnectionIn5Ghz", \
0, 1, 1, \
CFG_VALUE_OR_DEFAULT, \
"Enable/Disable STA connection in 5G")
/*
* <ini>
* gAllowMCCGODiffBI - Allow GO in MCC mode to accept different beacon interval
* than STA's.
* @Min: 0
* @Max: 4
* @Default: 4
*
* This ini is used to allow GO in MCC mode to accept different beacon interval
* than STA's.
* Added for Wi-Fi Cert. 5.1.12
* If gAllowMCCGODiffBI = 1
* Set to 1 for WFA certification. GO Beacon interval is not changed.
* MCC GO doesn't work well in optimized way. In worst scenario, it may
* invite STA disconnection.
* If gAllowMCCGODiffBI = 2
* If set to 2 workaround 1 disassoc all the clients and update beacon
* Interval.
* If gAllowMCCGODiffBI = 3
* If set to 3 tear down the P2P link in auto/Non-autonomous -GO case.
* If gAllowMCCGODiffBI = 4
* If set to 4 don't disconnect the P2P client in autonomous/Non-auto-
* nomous -GO case update the BI dynamically
*
* Related: None.
*
* Supported Feature: Concurrency
*
* Usage: External
*
* </ini>
*/
#define CFG_ALLOW_MCC_GO_DIFF_BI \
CFG_INI_UINT("gAllowMCCGODiffBI", 0, 4, 4, CFG_VALUE_OR_DEFAULT, \
"Allow GO in MCC mode to accept different BI than STA's")
/*
*
* <ini>
* gDualMacFeatureDisable - Disable Dual MAC feature.
* @Min: 0
* @Max: 6
* @Default: 6
*
* This ini is used to enable/disable dual MAC feature.
* 0 - enable DBS
* 1 - disable DBS
* 2 - disable DBS for connection but keep DBS for scan
* 3 - disable DBS for connection but keep DBS scan with async
* scan policy disabled
* 4 - enable DBS for connection as well as for scan with async
* scan policy disabled
* 5 - enable DBS for connection but disable DBS for scan.
* 6 - enable DBS for connection but disable simultaneous scan
* from upper layer (DBS scan remains enabled in FW).
*
* Note: INI item value should match 'enum dbs_support'
*
* Related: None.
*
* Supported Feature: DBS
*
* Usage: External
*
* </ini>
*/
#define CFG_DUAL_MAC_FEATURE_DISABLE \
CFG_INI_UINT("gDualMacFeatureDisable", 0, 6, 6, CFG_VALUE_OR_DEFAULT, \
"This INI is used to enable/disable Dual MAC feature")
/*
*
* <ini>
* enable_sbs - Enable/Disable SBS.
* @Min: 0
* @Max: 1
* @Default: 1
*
* This ini is used to enable/disable SBS feature.
* 0 - disable SBS
* 1 - enable SBS
*
*
* Related: None.
*
* Supported Feature: SBS
*
* Usage: External
*
* </ini>
*/
#define CFG_ENABLE_SBS CFG_INI_BOOL(\
"enable_sbs", \
true, \
"Enable/Disable SBS")
/*
* <ini>
* g_sta_sap_scc_on_dfs_chan - Allow STA+SAP SCC on DFS channel with master
* mode support disabled.
* @Min: 0
* @Max: 2
* @Default: 2
*
* This ini is used to allow STA+SAP SCC on DFS channel with master mode
* support disabled, the value is defined by enum PM_AP_DFS_MASTER_MODE.
* 0 - Disallow STA+SAP SCC on DFS channel
* 1 - Allow STA+SAP SCC on DFS channel with master mode disabled
* This needs gEnableDFSMasterCap enabled to allow SAP SCC with
* STA on DFS but dfs master mode disabled. Single SAP is not allowed
* on DFS.
* 2 - enhance "1" with below requirement
* a. Allow single SAP (GO) start on DFS channel.
* b. Allow CAC process on DFS channel in single SAP (GO) mode
* c. Allow DFS radar event process in single SAP (GO) mode
* d. Disallow CAC and radar event process in SAP (GO) + STA mode.
* The value 2 of this ini requires master mode to be enabled so it is
* mandatory to enable the dfs master mode ini gEnableDFSMasterCap
* along with it.
*
* Related: None.
*
* Supported Feature: Non-DBS, DBS
*
* Usage: External
*
* </ini>
*/
#define CFG_STA_SAP_SCC_ON_DFS_CHAN \
CFG_INI_UINT("g_sta_sap_scc_on_dfs_chan", 0, 2, 2, CFG_VALUE_OR_DEFAULT, \
"Allow STA+SAP SCC on DFS channel with master mode disable")
/*
* <ini>
* gForce1x1Exception - force 1x1 when connecting to certain peer
* @Min: 0
* @Max: 2
* @Default: 2
*
* This INI when enabled will force 1x1 connection with certain peer.
* The implementation for this ini would be as follows:-
* Value 0: Even if the AP is present in OUI, 1x1 will not be forced
* Value 1: If antenna sharing supported, then only do 1x1.
* Value 2: If AP present in OUI, force 1x1 connection.
*
* Related: None
*
* Supported Feature: connection
*
* Usage: External
*
* </ini>
*/
#define CFG_FORCE_1X1_FEATURE \
CFG_INI_UINT("gForce1x1Exception", 0, 2, 1, CFG_VALUE_OR_DEFAULT, \
"force 1x1 when connecting to certain peer")
/*
* <ini>
* gEnableSAPManadatoryChanList - Enable SAP Mandatory channel list
* Options.
* @Min: 0
* @Max: 1
* @Default: 0
*
* This ini is used to enable/disable the SAP manadatory chan list
* 0 - Disable SAP mandatory chan list
* 1 - Enable SAP mandatory chan list
*
* Supported Feature: SAP
*
*
* Usage: External
*
* </ini>
*/
#define CFG_ENABLE_SAP_MANDATORY_CHAN_LIST \
CFG_INI_UINT("gEnableSAPManadatoryChanList", 0, 1, 0, CFG_VALUE_OR_DEFAULT, \
"Enable SAP Mandatory channel list")
/*
* <ini>
* g_nan_sap_scc_on_lte_coex_chan - Allow NAN+SAP SCC on LTE coex channel
* @Min: 0
* @Max: 1
* @Default: 1
*
* This ini is used to allow NAN+SAP SCC on LTE coex channel
* 0 - Disallow NAN+SAP SCC on LTE coex channel
* 1 - Allow NAN+SAP SCC on LTE coex channel
*
* Related: Depends on gWlanMccToSccSwitchMode config.
*
* Supported Feature: Non-DBS, DBS
*
* Usage: External
*
* </ini>
*/
#define CFG_NAN_SAP_SCC_ON_LTE_COEX_CHAN \
CFG_INI_BOOL("g_nan_sap_scc_on_lte_coex_chan", 1, \
"Allow NAN+SAP SCC on LTE coex channel")
/*
* <ini>
* g_sta_sap_scc_on_lte_coex_chan - Allow STA+SAP SCC on LTE coex channel
* @Min: 0
* @Max: 1
* @Default: 1
*
* This ini is used to allow STA+SAP SCC on LTE coex channel
* 0 - Disallow STA+SAP SCC on LTE coex channel
* 1 - Allow STA+SAP SCC on LTE coex channel
*
* Related: None.
*
* Supported Feature: Non-DBS, DBS
*
* Usage: External
*
* </ini>
*/
#define CFG_STA_SAP_SCC_ON_LTE_COEX_CHAN \
CFG_INI_UINT("g_sta_sap_scc_on_lte_coex_chan", 0, 1, 1, CFG_VALUE_OR_DEFAULT, \
"Allow STA+SAP SCC on LTE coex channel")
/*
* <ini>
* g_mark_sap_indoor_as_disable - Enable/Disable Indoor channel
* @Min: 0
* @Max: 1
* @Default: 0
*
* This ini is used to mark the Indoor channel as
* disable when SAP start and revert it on SAP stop,
* so SAP will not turn on indoor channel and
* sta will not scan/associate and roam on indoor
* channels.
*
* Related: If g_mark_sap_indoor_as_disable set, turn the
* indoor channels to disable and update Wiphy & fw.
*
* Supported Feature: SAP/STA
*
* Usage: External
*
* </ini>
*/
#define CFG_MARK_INDOOR_AS_DISABLE_FEATURE \
CFG_INI_UINT("g_mark_sap_indoor_as_disable", 0, 1, 0, CFG_VALUE_OR_DEFAULT, \
"Enable/Disable Indoor channel")
/*
* <ini>
* g_enable_go_force_scc - Enable/Disable force SCC on P2P GO
* @Min: 0
* @Max: 2
* @Default: 0
*
* This ini and along with "gWlanMccToSccSwitchMode" is used to enable
* force SCC on P2P GO interface.
*
* GO_FORCE_SCC_DISABLED (value 0): GO force scc disabled and GO can come up
* in MCC mode
* GO_FORCE_SCC_STRICT (value 1): New GO will be forced to form on existing
* GO/STA/GC channel in start bss itself.
* GO_FORCE_SCC_LIBERAL (value 2): After SET KEY is done, do force SCC for the
* first GO to move to new GO channel.
*
* Supported Feature: P2P GO
*
* Usage: External
*
* </ini>
*/
#define CFG_P2P_GO_ENABLE_FORCE_SCC \
CFG_INI_UINT("g_enable_go_force_scc", 0, 2, 0, CFG_VALUE_OR_DEFAULT, \
"Enable/Disable P2P GO force SCC")
/**
* <ini>
* g_pcl_band_priority - Set 5G/6G Channel order
* Options.
* @Min: 0
* @Max: 1
* @Default: 0
*
* This ini is used to set preference between 5G and 6G channels during
* PCL population.
* 0 - Prefer 5G channels, 5G channels will be placed before the 6G channels
* in PCL.
* 1 - Prefer 6G channels, 6G channels will be placed before the 5G channels
* in PCL.
*
* Supported Feature: STA, SAP
*
*
* Usage: External
*
* </ini>
*/
#define CFG_PCL_BAND_PRIORITY \
CFG_INI_UINT("g_pcl_band_priority", 0, 1, 0, CFG_VALUE_OR_DEFAULT, \
"Set 5G and 6G Channel order")
#define CFG_POLICY_MGR_ALL \
CFG(CFG_MCC_TO_SCC_SWITCH) \
CFG(CFG_CONC_SYS_PREF) \
CFG(CFG_MAX_CONC_CXNS) \
CFG(CFG_DBS_SELECTION_PLCY) \
CFG(CFG_VDEV_CUSTOM_PRIORITY_LIST) \
CFG(CFG_CHNL_SELECT_LOGIC_CONC) \
CFG(CFG_ENABLE_CONC_RULE1) \
CFG(CFG_ENABLE_CONC_RULE2) \
CFG(CFG_ENABLE_MCC_ADAPTIVE_SCH_ENABLED_NAME)\
CFG(CFG_ENABLE_STA_CONNECTION_IN_5GHZ)\
CFG(CFG_DUAL_MAC_FEATURE_DISABLE)\
CFG(CFG_ENABLE_SBS)\
CFG(CFG_STA_SAP_SCC_ON_DFS_CHAN)\
CFG(CFG_FORCE_1X1_FEATURE)\
CFG(CFG_ENABLE_SAP_MANDATORY_CHAN_LIST)\
CFG(CFG_STA_SAP_SCC_ON_LTE_COEX_CHAN)\
CFG(CFG_NAN_SAP_SCC_ON_LTE_COEX_CHAN) \
CFG(CFG_MARK_INDOOR_AS_DISABLE_FEATURE)\
CFG(CFG_ALLOW_MCC_GO_DIFF_BI) \
CFG(CFG_P2P_GO_ENABLE_FORCE_SCC) \
CFG(CFG_PCL_BAND_PRIORITY)
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -1,312 +0,0 @@
/*
* Copyright (c) 2018-2021 The Linux Foundation. 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 __WLAN_POLICY_MGR_UCFG
#define __WLAN_POLICY_MGR_UCFG
#include "wlan_objmgr_psoc_obj.h"
#include "wlan_objmgr_global_obj.h"
#include "qdf_status.h"
/**
* ucfg_policy_mgr_psoc_open() - This API sets CFGs to policy manager context
*
* This API pulls policy manager's context from PSOC and initialize the CFG
* structure of policy manager.
*
* Return: QDF_STATUS_SUCCESS up on success and any other status for failure.
*/
QDF_STATUS ucfg_policy_mgr_psoc_open(struct wlan_objmgr_psoc *psoc);
/**
* ucfg_policy_mgr_psoc_close() - This API resets CFGs for policy manager ctx
*
* This API pulls policy manager's context from PSOC and resets the CFG
* structure of policy manager.
*
* Return: QDF_STATUS_SUCCESS up on success and any other status for failure.
*/
void ucfg_policy_mgr_psoc_close(struct wlan_objmgr_psoc *psoc);
#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
/**
* ucfg_policy_mgr_get_mcc_scc_switch() - To mcc to scc switch setting from INI
* @psoc: pointer to psoc
* @mcc_scc_switch: value to be filled
*
* This API pulls mcc to scc switch setting which is given as part of INI and
* stored in policy manager's CFGs.
*
* Return: QDF_STATUS_SUCCESS up on success and any other status for failure.
*/
QDF_STATUS ucfg_policy_mgr_get_mcc_scc_switch(struct wlan_objmgr_psoc *psoc,
uint8_t *mcc_scc_switch);
#else
static inline
QDF_STATUS ucfg_policy_mgr_get_mcc_scc_switch(struct wlan_objmgr_psoc *psoc,
uint8_t *mcc_scc_switch)
{
return QDF_STATUS_SUCCESS;
}
#endif //FEATURE_WLAN_MCC_TO_SCC_SWITCH
/**
* ucfg_policy_mgr_get_sys_pref() - to get system preference
* @psoc: pointer to psoc
* @sys_pref: value to be filled
*
* This API pulls the system preference for policy manager to provide
* PCL
*
* Return: QDF_STATUS_SUCCESS up on success and any other status for failure.
*/
QDF_STATUS ucfg_policy_mgr_get_sys_pref(struct wlan_objmgr_psoc *psoc,
uint8_t *sys_pref);
/**
* ucfg_policy_mgr_set_sys_pref() - to set system preference
* @psoc: pointer to psoc
* @sys_pref: value to be applied as new INI setting
*
* This API is meant to override original INI setting for system pref
* with new value which is used by policy manager to provide PCL
*
* Return: QDF_STATUS_SUCCESS up on success and any other status for failure.
*/
QDF_STATUS ucfg_policy_mgr_set_sys_pref(struct wlan_objmgr_psoc *psoc,
uint8_t sys_pref);
/**
* ucfg_policy_mgr_get_conc_rule1() - to find out if conc rule1 is enabled
* @psoc: pointer to psoc
* @conc_rule1: value to be filled
*
* This API is used to find out if conc rule-1 is enabled by user
*
* Return: QDF_STATUS_SUCCESS up on success and any other status for failure.
*/
QDF_STATUS ucfg_policy_mgr_get_conc_rule1(struct wlan_objmgr_psoc *psoc,
uint8_t *conc_rule1);
/**
* ucfg_policy_mgr_get_conc_rule2() - to find out if conc rule2 is enabled
* @psoc: pointer to psoc
* @conc_rule2: value to be filled
*
* This API is used to find out if conc rule-2 is enabled by user
*
* Return: QDF_STATUS_SUCCESS up on success and any other status for failure.
*/
QDF_STATUS ucfg_policy_mgr_get_conc_rule2(struct wlan_objmgr_psoc *psoc,
uint8_t *conc_rule2);
/**
* policy_mgr_get_chnl_select_plcy() - to get channel selection policy
* @psoc: pointer to psoc
* @chnl_select_plcy: value to be filled
*
* This API is used to find out which channel selection policy has been
* configured
*
* Return: QDF_STATUS_SUCCESS up on success and any other status for failure.
*/
QDF_STATUS ucfg_policy_mgr_get_chnl_select_plcy(struct wlan_objmgr_psoc *psoc,
uint32_t *chnl_select_plcy);
/**
* policy_mgr_get_mcc_adaptive_sch() - to get mcc adaptive scheduler
* @psoc: pointer to psoc
* @enable_mcc_adaptive_sch: value to be filled
*
* This API is used to find out if mcc adaptive scheduler enabled or disabled
*
* Return: QDF_STATUS_SUCCESS up on success and any other status for failure.
*/
QDF_STATUS
ucfg_policy_mgr_get_mcc_adaptive_sch(struct wlan_objmgr_psoc *psoc,
bool *enable_mcc_adaptive_sch);
/**
* ucfg_policy_mgr_get_dynamic_mcc_adaptive_sch() - to get dynamic mcc adaptive
* scheduler
* @psoc: pointer to psoc
* @dynamic_mcc_adaptive_sch: value to be filled
*
* This API is used to get dynamic mcc adaptive scheduler
*
* Return: QDF_STATUS_SUCCESS up on success and any other status for failure.
*/
QDF_STATUS
ucfg_policy_mgr_get_dynamic_mcc_adaptive_sch(struct wlan_objmgr_psoc *psoc,
bool *dynamic_mcc_adaptive_sch);
/**
* ucfg_policy_mgr_set_dynamic_mcc_adaptive_sch() - to set dynamic mcc adaptive
* scheduler
* @psoc: pointer to psoc
* @dynamic_mcc_adaptive_sch: value to be set
*
* This API is used to set dynamic mcc adaptive scheduler
*
* Return: QDF_STATUS_SUCCESS up on success and any other status for failure.
*/
QDF_STATUS
ucfg_policy_mgr_set_dynamic_mcc_adaptive_sch(struct wlan_objmgr_psoc *psoc,
bool dynamic_mcc_adaptive_sch);
/**
* ucfg_policy_mgr_get_sta_cxn_5g_band() - to get STA's connection in 5G config
*
* @psoc: pointer to psoc
* @enable_sta_cxn_5g_band: value to be filled
*
* This API is used to find out if STA connection in 5G band is allowed or
* disallowed.
*
* Return: QDF_STATUS_SUCCESS up on success and any other status for failure.
*/
QDF_STATUS ucfg_policy_mgr_get_sta_cxn_5g_band(struct wlan_objmgr_psoc *psoc,
uint8_t *enable_sta_cxn_5g_band);
/**
* ucfg_policy_mgr_get_allow_mcc_go_diff_bi() - to get information on whether GO
* can have diff BI than STA in MCC
* @psoc: pointer to psoc
* @allow_mcc_go_diff_bi: value to be filled
*
* This API is used to find out whether GO's BI can different than STA in MCC
* scenario
*
* Return: QDF_STATUS_SUCCESS up on success and any other status for failure.
*/
QDF_STATUS
ucfg_policy_mgr_get_allow_mcc_go_diff_bi(struct wlan_objmgr_psoc *psoc,
uint8_t *allow_mcc_go_diff_bi);
/**
* ucfg_policy_mgr_get_dual_mac_feature() - to find out if DUAL MAC feature is
* enabled
* @psoc: pointer to psoc
* @dual_mac_feature: value to be filled
*
* This API is used to find out whether dual mac (dual radio) specific feature
* is enabled or not
*
* Return: QDF_STATUS_SUCCESS up on success and any other status for failure.
*/
QDF_STATUS ucfg_policy_mgr_get_dual_mac_feature(struct wlan_objmgr_psoc *psoc,
uint8_t *dual_mac_feature);
/**
* ucfg_policy_mgr_get_force_1x1() - to find out if 1x1 connection is enforced
*
* @psoc: pointer to psoc
* @force_1x1: value to be filled
*
* This API is used to find out if 1x1 connection is enforced.
*
* Return: QDF_STATUS_SUCCESS up on success and any other status for failure.
*/
QDF_STATUS ucfg_policy_mgr_get_force_1x1(struct wlan_objmgr_psoc *psoc,
uint8_t *force_1x1);
/**
* ucfg_policy_mgr_get_sta_sap_scc_on_dfs_chnl() - to find out if STA and SAP
* SCC is allowed on DFS channel
* @psoc: pointer to psoc
* @sta_sap_scc_on_dfs_chnl: value to be filled
*
* This API is used to find out whether STA and SAP SCC is allowed on
* DFS channels
*
* Return: QDF_STATUS_SUCCESS up on success and any other status for failure.
*/
QDF_STATUS
ucfg_policy_mgr_get_sta_sap_scc_on_dfs_chnl(struct wlan_objmgr_psoc *psoc,
uint8_t *sta_sap_scc_on_dfs_chnl);
/**
* ucfg_policy_mgr_get_sta_sap_scc_lte_coex_chnl() - to find out if STA & SAP
* SCC is allowed on LTE COEX
* @psoc: pointer to psoc
* @sta_sap_scc_lte_coex: value to be filled
*
* This API is used to find out whether STA and SAP scc is allowed on LTE COEX
* channel
*
* Return: QDF_STATUS_SUCCESS up on success and any other status for failure.
*/
QDF_STATUS
ucfg_policy_mgr_get_sta_sap_scc_lte_coex_chnl(struct wlan_objmgr_psoc *psoc,
uint8_t *sta_sap_scc_lte_coex);
/**
* ucfg_policy_mgr_get_dfs_master_dynamic_enabled() - support dfs master or not
* AP interface when STA+SAP(GO) concurrency
* @psoc: pointer to psoc
* @vdev_id: sap vdev id
*
* This API is used to check SAP (GO) dfs master functionality enabled or not
* when STA+SAP(GO) concurrency.
* If g_sta_sap_scc_on_dfs_chan is non-zero, the STA+SAP(GO) is allowed on DFS
* channel SCC and the SAP's DFS master functionality should be enable/disable
* according to:
* 1. g_sta_sap_scc_on_dfs_chan is 0: function return true - dfs master
* capability enabled.
* 2. g_sta_sap_scc_on_dfs_chan is 1: function return false - dfs master
* capability disabled.
* 3. g_sta_sap_scc_on_dfs_chan is 2: dfs master capability based on STA on
* 5G or not:
* a. 5G STA active - return false
* b. no 5G STA active -return true
*
* Return: true if dfs master functionality should be enabled.
*/
bool
ucfg_policy_mgr_get_dfs_master_dynamic_enabled(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id);
/**
* ucfg_policy_mgr_init_chan_avoidance() - init channel avoidance in policy
* manager
* @psoc: pointer to psoc
* @chan_freq_list: channel frequency list
* @chan_cnt: channel count
*
* Return: QDF_STATUS_SUCCESS up on success and any other status for failure.
*/
QDF_STATUS
ucfg_policy_mgr_init_chan_avoidance(struct wlan_objmgr_psoc *psoc,
qdf_freq_t *chan_freq_list,
uint16_t chan_cnt);
/**
* ucfg_policy_mgr_get_sap_mandt_chnl() - to find out if SAP mandatory channel
* support is enabled
* @psoc: pointer to psoc
* @sap_mandt_chnl: value to be filled
*
* This API is used to find out whether SAP's mandatory channel support
* is enabled
*
* Return: QDF_STATUS_SUCCESS up on success and any other status for failure.
*/
QDF_STATUS ucfg_policy_mgr_get_sap_mandt_chnl(struct wlan_objmgr_psoc *psoc,
uint8_t *sap_mandt_chnl);
/**
* ucfg_policy_mgr_get_indoor_chnl_marking() - to get if indoor channel can be
* marked as disabled
* @psoc: pointer to psoc
* @indoor_chnl_marking: value to be filled
*
* This API is used to find out whether indoor channel can be marked as disabled
*
* Return: QDF_STATUS_SUCCESS up on success and any other status for failure.
*/
QDF_STATUS
ucfg_policy_mgr_get_indoor_chnl_marking(struct wlan_objmgr_psoc *psoc,
uint8_t *indoor_chnl_marking);
#endif //__WLAN_POLICY_MGR_UCFG

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,828 +0,0 @@
/*
* Copyright (c) 2012-2021 The Linux Foundation. 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 WLAN_POLICY_MGR_I_H
#define WLAN_POLICY_MGR_I_H
#include "wlan_policy_mgr_api.h"
#include "qdf_event.h"
#include "qdf_mc_timer.h"
#include "qdf_lock.h"
#include "qdf_defer.h"
#include "wlan_reg_services_api.h"
#include "cds_ieee80211_common_i.h"
#include "qdf_delayed_work.h"
#define DBS_OPPORTUNISTIC_TIME 5
#define POLICY_MGR_SER_CMD_TIMEOUT 4000
#ifdef QCA_WIFI_3_0_EMU
#define CONNECTION_UPDATE_TIMEOUT (POLICY_MGR_SER_CMD_TIMEOUT + 3000)
#else
#define CONNECTION_UPDATE_TIMEOUT (POLICY_MGR_SER_CMD_TIMEOUT + 2000)
#endif
#define PM_24_GHZ_CH_FREQ_6 (2437)
#define PM_5_GHZ_CH_FREQ_36 (5180)
#define CHANNEL_SWITCH_COMPLETE_TIMEOUT (2000)
#define MAX_NOA_TIME (3000)
/**
* Policy Mgr hardware mode list bit-mask definitions.
* Bits 4:0, 31:29 are unused.
*
* The below definitions are added corresponding to WMI DBS HW mode
* list to make it independent of firmware changes for WMI definitions.
* Currently these definitions have dependency with BIT positions of
* the existing WMI macros. Thus, if the BIT positions are changed for
* WMI macros, then these macros' BIT definitions are also need to be
* changed.
*/
#define POLICY_MGR_HW_MODE_MAC0_TX_STREAMS_BITPOS (28)
#define POLICY_MGR_HW_MODE_MAC0_RX_STREAMS_BITPOS (24)
#define POLICY_MGR_HW_MODE_MAC1_TX_STREAMS_BITPOS (20)
#define POLICY_MGR_HW_MODE_MAC1_RX_STREAMS_BITPOS (16)
#define POLICY_MGR_HW_MODE_MAC0_BANDWIDTH_BITPOS (12)
#define POLICY_MGR_HW_MODE_MAC1_BANDWIDTH_BITPOS (8)
#define POLICY_MGR_HW_MODE_DBS_MODE_BITPOS (7)
#define POLICY_MGR_HW_MODE_AGILE_DFS_MODE_BITPOS (6)
#define POLICY_MGR_HW_MODE_SBS_MODE_BITPOS (5)
#define POLICY_MGR_HW_MODE_MAC0_BAND_BITPOS (3)
#define POLICY_MGR_HW_MODE_ID_BITPOS (0)
#define POLICY_MGR_HW_MODE_MAC0_TX_STREAMS_MASK \
(0xf << POLICY_MGR_HW_MODE_MAC0_TX_STREAMS_BITPOS)
#define POLICY_MGR_HW_MODE_MAC0_RX_STREAMS_MASK \
(0xf << POLICY_MGR_HW_MODE_MAC0_RX_STREAMS_BITPOS)
#define POLICY_MGR_HW_MODE_MAC1_TX_STREAMS_MASK \
(0xf << POLICY_MGR_HW_MODE_MAC1_TX_STREAMS_BITPOS)
#define POLICY_MGR_HW_MODE_MAC1_RX_STREAMS_MASK \
(0xf << POLICY_MGR_HW_MODE_MAC1_RX_STREAMS_BITPOS)
#define POLICY_MGR_HW_MODE_MAC0_BANDWIDTH_MASK \
(0xf << POLICY_MGR_HW_MODE_MAC0_BANDWIDTH_BITPOS)
#define POLICY_MGR_HW_MODE_MAC1_BANDWIDTH_MASK \
(0xf << POLICY_MGR_HW_MODE_MAC1_BANDWIDTH_BITPOS)
#define POLICY_MGR_HW_MODE_DBS_MODE_MASK \
(0x1 << POLICY_MGR_HW_MODE_DBS_MODE_BITPOS)
#define POLICY_MGR_HW_MODE_AGILE_DFS_MODE_MASK \
(0x1 << POLICY_MGR_HW_MODE_AGILE_DFS_MODE_BITPOS)
#define POLICY_MGR_HW_MODE_SBS_MODE_MASK \
(0x1 << POLICY_MGR_HW_MODE_SBS_MODE_BITPOS)
#define POLICY_MGR_HW_MODE_MAC0_BAND_MASK \
(0x3 << POLICY_MGR_HW_MODE_MAC0_BAND_BITPOS)
#define POLICY_MGR_HW_MODE_ID_MASK \
(0x7 << POLICY_MGR_HW_MODE_ID_BITPOS)
#define POLICY_MGR_HW_MODE_MAC0_TX_STREAMS_SET(hw_mode, value) \
WMI_SET_BITS(hw_mode, POLICY_MGR_HW_MODE_MAC0_TX_STREAMS_BITPOS,\
4, value)
#define POLICY_MGR_HW_MODE_MAC0_RX_STREAMS_SET(hw_mode, value) \
WMI_SET_BITS(hw_mode, POLICY_MGR_HW_MODE_MAC0_RX_STREAMS_BITPOS,\
4, value)
#define POLICY_MGR_HW_MODE_MAC1_TX_STREAMS_SET(hw_mode, value) \
WMI_SET_BITS(hw_mode, POLICY_MGR_HW_MODE_MAC1_TX_STREAMS_BITPOS,\
4, value)
#define POLICY_MGR_HW_MODE_MAC1_RX_STREAMS_SET(hw_mode, value) \
WMI_SET_BITS(hw_mode, POLICY_MGR_HW_MODE_MAC1_RX_STREAMS_BITPOS,\
4, value)
#define POLICY_MGR_HW_MODE_MAC0_BANDWIDTH_SET(hw_mode, value) \
WMI_SET_BITS(hw_mode, POLICY_MGR_HW_MODE_MAC0_BANDWIDTH_BITPOS,\
4, value)
#define POLICY_MGR_HW_MODE_MAC1_BANDWIDTH_SET(hw_mode, value) \
WMI_SET_BITS(hw_mode, POLICY_MGR_HW_MODE_MAC1_BANDWIDTH_BITPOS,\
4, value)
#define POLICY_MGR_HW_MODE_DBS_MODE_SET(hw_mode, value) \
WMI_SET_BITS(hw_mode, POLICY_MGR_HW_MODE_DBS_MODE_BITPOS,\
1, value)
#define POLICY_MGR_HW_MODE_AGILE_DFS_SET(hw_mode, value) \
WMI_SET_BITS(hw_mode, POLICY_MGR_HW_MODE_AGILE_DFS_MODE_BITPOS,\
1, value)
#define POLICY_MGR_HW_MODE_SBS_MODE_SET(hw_mode, value) \
WMI_SET_BITS(hw_mode, POLICY_MGR_HW_MODE_SBS_MODE_BITPOS,\
1, value)
#define POLICY_MGR_HW_MODE_MAC0_BAND_SET(hw_mode, value) \
WMI_SET_BITS(hw_mode, POLICY_MGR_HW_MODE_MAC0_BAND_BITPOS,\
2, value)
#define POLICY_MGR_HW_MODE_ID_SET(hw_mode, value) \
WMI_SET_BITS(hw_mode, POLICY_MGR_HW_MODE_ID_BITPOS,\
3, value)
#define POLICY_MGR_HW_MODE_MAC0_TX_STREAMS_GET(hw_mode) \
(((hw_mode) & POLICY_MGR_HW_MODE_MAC0_TX_STREAMS_MASK) >> \
POLICY_MGR_HW_MODE_MAC0_TX_STREAMS_BITPOS)
#define POLICY_MGR_HW_MODE_MAC0_RX_STREAMS_GET(hw_mode) \
(((hw_mode) & POLICY_MGR_HW_MODE_MAC0_RX_STREAMS_MASK) >> \
POLICY_MGR_HW_MODE_MAC0_RX_STREAMS_BITPOS)
#define POLICY_MGR_HW_MODE_MAC1_TX_STREAMS_GET(hw_mode) \
(((hw_mode) & POLICY_MGR_HW_MODE_MAC1_TX_STREAMS_MASK) >> \
POLICY_MGR_HW_MODE_MAC1_TX_STREAMS_BITPOS)
#define POLICY_MGR_HW_MODE_MAC1_RX_STREAMS_GET(hw_mode) \
(((hw_mode) & POLICY_MGR_HW_MODE_MAC1_RX_STREAMS_MASK) >> \
POLICY_MGR_HW_MODE_MAC1_RX_STREAMS_BITPOS)
#define POLICY_MGR_HW_MODE_MAC0_BANDWIDTH_GET(hw_mode) \
(((hw_mode) & POLICY_MGR_HW_MODE_MAC0_BANDWIDTH_MASK) >> \
POLICY_MGR_HW_MODE_MAC0_BANDWIDTH_BITPOS)
#define POLICY_MGR_HW_MODE_MAC1_BANDWIDTH_GET(hw_mode) \
(((hw_mode) & POLICY_MGR_HW_MODE_MAC1_BANDWIDTH_MASK) >> \
POLICY_MGR_HW_MODE_MAC1_BANDWIDTH_BITPOS)
#define POLICY_MGR_HW_MODE_DBS_MODE_GET(hw_mode) \
(((hw_mode) & POLICY_MGR_HW_MODE_DBS_MODE_MASK) >> \
POLICY_MGR_HW_MODE_DBS_MODE_BITPOS)
#define POLICY_MGR_HW_MODE_AGILE_DFS_GET(hw_mode) \
(((hw_mode) & POLICY_MGR_HW_MODE_AGILE_DFS_MODE_MASK) >> \
POLICY_MGR_HW_MODE_AGILE_DFS_MODE_BITPOS)
#define POLICY_MGR_HW_MODE_SBS_MODE_GET(hw_mode) \
(((hw_mode) & POLICY_MGR_HW_MODE_SBS_MODE_MASK) >> \
POLICY_MGR_HW_MODE_SBS_MODE_BITPOS)
#define POLICY_MGR_HW_MODE_MAC0_BAND_GET(hw_mode) \
(((hw_mode) & POLICY_MGR_HW_MODE_MAC0_BAND_MASK) >> \
POLICY_MGR_HW_MODE_MAC0_BAND_BITPOS)
#define POLICY_MGR_HW_MODE_ID_GET(hw_mode) \
(((hw_mode) & POLICY_MGR_HW_MODE_ID_MASK) >> \
POLICY_MGR_HW_MODE_ID_BITPOS)
#define POLICY_MGR_DEFAULT_HW_MODE_INDEX 0xFFFF
#define policy_mgr_alert(params...) \
QDF_TRACE_FATAL(QDF_MODULE_ID_POLICY_MGR, params)
#define policy_mgr_err(params...) \
QDF_TRACE_ERROR(QDF_MODULE_ID_POLICY_MGR, params)
#define policy_mgr_warn(params...) \
QDF_TRACE_WARN(QDF_MODULE_ID_POLICY_MGR, params)
#define policy_mgr_notice(params...) \
QDF_TRACE_INFO(QDF_MODULE_ID_POLICY_MGR, params)
#define policy_mgr_info(params...) \
QDF_TRACE_INFO(QDF_MODULE_ID_POLICY_MGR, params)
#define policy_mgr_debug(params...) \
QDF_TRACE_DEBUG(QDF_MODULE_ID_POLICY_MGR, params)
#define policymgr_nofl_alert(params...) \
QDF_TRACE_FATAL_NO_FL(QDF_MODULE_ID_POLICY_MGR, params)
#define policymgr_nofl_err(params...) \
QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_POLICY_MGR, params)
#define policymgr_nofl_warn(params...) \
QDF_TRACE_WARN_NO_FL(QDF_MODULE_ID_POLICY_MGR, params)
#define policymgr_nofl_info(params...) \
QDF_TRACE_INFO_NO_FL(QDF_MODULE_ID_POLICY_MGR, params)
#define policymgr_nofl_debug(params...) \
QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_POLICY_MGR, params)
#define policy_mgr_rl_debug(params...) \
QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_POLICY_MGR, params)
#define PM_CONC_CONNECTION_LIST_VALID_INDEX(index) \
((MAX_NUMBER_OF_CONC_CONNECTIONS > index) && \
(pm_conc_connection_list[index].in_use))
extern struct policy_mgr_conc_connection_info
pm_conc_connection_list[MAX_NUMBER_OF_CONC_CONNECTIONS];
extern const enum policy_mgr_pcl_type
first_connection_pcl_table[PM_MAX_NUM_OF_MODE]
[PM_MAX_CONC_PRIORITY_MODE];
extern pm_dbs_pcl_second_connection_table_type
*second_connection_pcl_dbs_table;
extern enum policy_mgr_pcl_type const
(*second_connection_pcl_non_dbs_table)[PM_MAX_ONE_CONNECTION_MODE]
[PM_MAX_NUM_OF_MODE][PM_MAX_CONC_PRIORITY_MODE];
extern pm_dbs_pcl_third_connection_table_type
*third_connection_pcl_dbs_table;
extern enum policy_mgr_pcl_type const
(*third_connection_pcl_non_dbs_table)[PM_MAX_TWO_CONNECTION_MODE]
[PM_MAX_NUM_OF_MODE][PM_MAX_CONC_PRIORITY_MODE];
extern policy_mgr_next_action_two_connection_table_type
*next_action_two_connection_table;
extern policy_mgr_next_action_three_connection_table_type
*next_action_three_connection_table;
#ifdef FEATURE_FOURTH_CONNECTION
extern const enum policy_mgr_pcl_type
fourth_connection_pcl_dbs_table
[PM_MAX_THREE_CONNECTION_MODE][PM_MAX_NUM_OF_MODE]
[PM_MAX_CONC_PRIORITY_MODE];
#endif
extern policy_mgr_next_action_two_connection_table_type
*next_action_two_connection_2x2_2g_1x1_5g_table;
extern policy_mgr_next_action_three_connection_table_type
*next_action_three_connection_2x2_2g_1x1_5g_table;
extern enum policy_mgr_conc_next_action
(*policy_mgr_get_current_pref_hw_mode_ptr)
(struct wlan_objmgr_psoc *psoc);
/**
* struct policy_mgr_cfg - all the policy manager owned configs
* @mcc_to_scc_switch: switch to indicate MCC to SCC config
* @sys_pref: system's preference while selecting PCLs
* @max_conc_cxns: Max allowed concurrenct active connections
* @conc_rule1: concurrency rule1
* @conc_rule2: concurrency rule2
* @allow_mcc_go_diff_bi: Allow GO and STA diff beacon interval in MCC
* @dual_mac_feature: To enable/disable dual mac features
* @is_force_1x1_enable: Is 1x1 forced for connection
* @sta_sap_scc_on_dfs_chnl: STA-SAP SCC on DFS channel
* @sta_sap_scc_on_lte_coex_chnl: STA-SAP SCC on LTE Co-ex channel
* @nan_sap_scc_on_lte_coex_chnl: NAN-SAP SCC on LTE Co-ex channel
* @sap_mandatory_chnl_enable: To enable/disable SAP mandatory channels
* @mark_indoor_chnl_disable: Mark indoor channel as disable or enable
* @dbs_selection_plcy: DBS selection policy for concurrency
* @vdev_priority_list: Priority list for various vdevs
* @chnl_select_plcy: Channel selection policy
* @enable_mcc_adaptive_sch: Enable/Disable MCC adaptive scheduler
* @enable_sta_cxn_5g_band: Enable/Disable STA connection in 5G band
* @go_force_scc: Enable/Disable P2P GO force SCC
* @pcl_band_priority: PCL channel order between 5G and 6G.
* @sbs_enable: To enable/disable SBS
*/
struct policy_mgr_cfg {
uint8_t mcc_to_scc_switch;
uint8_t sys_pref;
uint8_t max_conc_cxns;
uint8_t conc_rule1;
uint8_t conc_rule2;
bool enable_mcc_adaptive_sch;
uint8_t allow_mcc_go_diff_bi;
uint8_t dual_mac_feature;
enum force_1x1_type is_force_1x1_enable;
uint8_t sta_sap_scc_on_dfs_chnl;
uint8_t sta_sap_scc_on_lte_coex_chnl;
uint8_t nan_sap_scc_on_lte_coex_chnl;
uint8_t sap_mandatory_chnl_enable;
uint8_t mark_indoor_chnl_disable;
uint8_t enable_sta_cxn_5g_band;
uint32_t dbs_selection_plcy;
uint32_t vdev_priority_list;
uint32_t chnl_select_plcy;
uint8_t go_force_scc;
enum policy_mgr_pcl_band_priority pcl_band_priority;
bool sbs_enable;
};
/**
* struct policy_mgr_psoc_priv_obj - Policy manager private data
* @psoc: pointer to PSOC object information
* @pdev: pointer to PDEV object information
* @connection_update_done_evt: qdf event to synchronize
* connection activities
* @qdf_conc_list_lock: To protect connection table
* @dbs_opportunistic_timer: Timer to drop down to Single Mac
* Mode opportunistically
* @sap_restart_chan_switch_cb: Callback for channel switch
* notification for SAP
* @sme_cbacks: callbacks to be registered by SME for
* interaction with Policy Manager
* @wma_cbacks: callbacks to be registered by SME for
* interaction with Policy Manager
* @tdls_cbacks: callbacks to be registered by SME for
* interaction with Policy Manager
* @cdp_cbacks: callbacks to be registered by SME for
* interaction with Policy Manager
* @conc_cbacks: callbacks to be registered by lim for
* interaction with Policy Manager
* @sap_mandatory_channels: The user preferred master list on
* which SAP can be brought up. This
* mandatory channel freq list would be as per
* OEMs preference & conforming to the
* regulatory/other considerations
* @sap_mandatory_channels_len: Length of the SAP mandatory
* channel list
* @concurrency_mode: active concurrency combination
* @no_of_open_sessions: Number of active vdevs
* @no_of_active_sessions: Number of active connections
* @sta_ap_intf_check_work: delayed sap restart work
* @num_dbs_hw_modes: Number of different HW modes supported
* @hw_mode: List of HW modes supported
* @old_hw_mode_index: Old HW mode from hw_mode table
* @new_hw_mode_index: New HW mode from hw_mode table
* @dual_mac_cfg: DBS configuration currenctly used by FW for
* scan & connections
* @hw_mode_change_in_progress: This is to track if HW mode
* change is in progress
* @enable_mcc_adaptive_scheduler: Enable MCC adaptive scheduler
* value from INI
* @unsafe_channel_list: LTE coex channel freq avoidance list
* @unsafe_channel_count: LTE coex channel avoidance list count
* @sta_ap_intf_check_work_info: Info related to sta_ap_intf_check_work
* @nan_sap_conc_work: Info related to nan sap conc work
* @opportunistic_update_done_evt: qdf event to synchronize host
* & FW HW mode
* @channel_switch_complete_evt: qdf event for channel switch completion check
* @mode_change_cb: Mode change callback
* @user_config_sap_ch_freq: SAP channel freq configured by user application
* @cfg: Policy manager config data
* @dynamic_mcc_adaptive_sched: disable/enable mcc adaptive scheduler feature
* @dynamic_dfs_master_disabled: current state of dynamic dfs master
*/
struct policy_mgr_psoc_priv_obj {
struct wlan_objmgr_psoc *psoc;
struct wlan_objmgr_pdev *pdev;
qdf_event_t connection_update_done_evt;
qdf_mutex_t qdf_conc_list_lock;
qdf_mc_timer_t dbs_opportunistic_timer;
struct policy_mgr_hdd_cbacks hdd_cbacks;
struct policy_mgr_sme_cbacks sme_cbacks;
struct policy_mgr_wma_cbacks wma_cbacks;
struct policy_mgr_tdls_cbacks tdls_cbacks;
struct policy_mgr_cdp_cbacks cdp_cbacks;
struct policy_mgr_dp_cbacks dp_cbacks;
struct policy_mgr_conc_cbacks conc_cbacks;
uint32_t sap_mandatory_channels[NUM_CHANNELS];
uint32_t sap_mandatory_channels_len;
bool do_sap_unsafe_ch_check;
uint32_t concurrency_mode;
uint8_t no_of_open_sessions[QDF_MAX_NO_OF_MODE];
uint8_t no_of_active_sessions[QDF_MAX_NO_OF_MODE];
struct qdf_delayed_work sta_ap_intf_check_work;
qdf_work_t nan_sap_conc_work;
uint32_t num_dbs_hw_modes;
struct dbs_hw_mode_info hw_mode;
uint32_t old_hw_mode_index;
uint32_t new_hw_mode_index;
struct dual_mac_config dual_mac_cfg;
uint32_t hw_mode_change_in_progress;
struct policy_mgr_user_cfg user_cfg;
uint32_t unsafe_channel_list[NUM_CHANNELS];
uint16_t unsafe_channel_count;
struct sta_ap_intf_check_work_ctx *sta_ap_intf_check_work_info;
uint8_t cur_conc_system_pref;
qdf_event_t opportunistic_update_done_evt;
qdf_event_t channel_switch_complete_evt;
send_mode_change_event_cb mode_change_cb;
uint32_t user_config_sap_ch_freq;
struct policy_mgr_cfg cfg;
uint32_t valid_ch_freq_list[NUM_CHANNELS];
uint32_t valid_ch_freq_list_count;
bool dynamic_mcc_adaptive_sched;
bool dynamic_dfs_master_disabled;
};
/**
* struct policy_mgr_mac_ss_bw_info - hw_mode_list PHY/MAC params for each MAC
* @mac_tx_stream: Max TX stream number supported on MAC
* @mac_rx_stream: Max RX stream number supported on MAC
* @mac_bw: Max bandwidth(wmi_channel_width enum type)
* @mac_band_cap: supported Band bit map(WLAN_2G_CAPABILITY = 0x1,
* WLAN_5G_CAPABILITY = 0x2)
*/
struct policy_mgr_mac_ss_bw_info {
uint32_t mac_tx_stream;
uint32_t mac_rx_stream;
uint32_t mac_bw;
uint32_t mac_band_cap;
};
#ifdef WLAN_FEATURE_11BE_MLO
/**
* union conc_ext_flag - extended flags for concurrency check
*
* @mlo: the new connection is MLO
* @mlo_link_assoc_connected: the new connection is secondary MLO link and
* the corresponding assoc link is connected
* @value: uint32 value for extended flags
*/
union conc_ext_flag {
struct {
uint32_t mlo: 1;
uint32_t mlo_link_assoc_connected: 1;
};
uint32_t value;
};
#endif
struct policy_mgr_psoc_priv_obj *policy_mgr_get_context(
struct wlan_objmgr_psoc *psoc);
QDF_STATUS policy_mgr_get_updated_scan_config(
struct wlan_objmgr_psoc *psoc,
uint32_t *scan_config,
bool dbs_scan,
bool dbs_plus_agile_scan,
bool single_mac_scan_with_dfs);
QDF_STATUS policy_mgr_get_updated_fw_mode_config(
struct wlan_objmgr_psoc *psoc,
uint32_t *fw_mode_config,
bool dbs,
bool agile_dfs);
bool policy_mgr_is_dual_mac_disabled_in_ini(
struct wlan_objmgr_psoc *psoc);
/**
* policy_mgr_find_if_hwlist_has_dbs() - Find if hw list has DBS modes or not
* @psoc: PSOC object information
*
* Find if hw list has DBS modes or not
*
* Return: true or false
*/
bool policy_mgr_find_if_hwlist_has_dbs(struct wlan_objmgr_psoc *psoc);
/**
* policy_mgr_get_mcc_to_scc_switch_mode() - MCC to SCC
* switch mode value in the user config
* @psoc: PSOC object information
*
* MCC to SCC switch mode value in user config
*
* Return: MCC to SCC switch mode value
*/
uint32_t policy_mgr_get_mcc_to_scc_switch_mode(
struct wlan_objmgr_psoc *psoc);
bool policy_mgr_get_dbs_config(struct wlan_objmgr_psoc *psoc);
bool policy_mgr_get_agile_dfs_config(struct wlan_objmgr_psoc *psoc);
bool policy_mgr_get_dbs_scan_config(struct wlan_objmgr_psoc *psoc);
void policy_mgr_get_tx_rx_ss_from_config(enum hw_mode_ss_config mac_ss,
uint32_t *tx_ss, uint32_t *rx_ss);
int8_t policy_mgr_get_matching_hw_mode_index(
struct wlan_objmgr_psoc *psoc,
uint32_t mac0_tx_ss, uint32_t mac0_rx_ss,
enum hw_mode_bandwidth mac0_bw,
uint32_t mac1_tx_ss, uint32_t mac1_rx_ss,
enum hw_mode_bandwidth mac1_bw,
enum hw_mode_mac_band_cap mac0_band_cap,
enum hw_mode_dbs_capab dbs,
enum hw_mode_agile_dfs_capab dfs,
enum hw_mode_sbs_capab sbs);
int8_t policy_mgr_get_hw_mode_idx_from_dbs_hw_list(
struct wlan_objmgr_psoc *psoc,
enum hw_mode_ss_config mac0_ss,
enum hw_mode_bandwidth mac0_bw,
enum hw_mode_ss_config mac1_ss,
enum hw_mode_bandwidth mac1_bw,
enum hw_mode_mac_band_cap mac0_band_cap,
enum hw_mode_dbs_capab dbs,
enum hw_mode_agile_dfs_capab dfs,
enum hw_mode_sbs_capab sbs);
QDF_STATUS policy_mgr_get_old_and_new_hw_index(
struct wlan_objmgr_psoc *psoc,
uint32_t *old_hw_mode_index,
uint32_t *new_hw_mode_index);
/**
* policy_mgr_update_conc_list() - Update the concurrent connection list
* @conn_index: Connection index
* @mode: Mode
* @ch_freq: channel frequency
* @bw: Bandwidth
* @mac: Mac id
* @chain_mask: Chain mask
* @vdev_id: vdev id
* @in_use: Flag to indicate if the index is in use or not
* @update_conn: Flag to indicate if mode change event should
* be sent or not
* @ch_flagext: channel state flags
*
* Updates the index value of the concurrent connection list
*
* Return: None
*/
void policy_mgr_update_conc_list(struct wlan_objmgr_psoc *psoc,
uint32_t conn_index,
enum policy_mgr_con_mode mode,
uint32_t freq,
enum hw_mode_bandwidth bw,
uint8_t mac,
enum policy_mgr_chain_mode chain_mask,
uint32_t original_nss,
uint32_t vdev_id,
bool in_use,
bool update_conn,
uint16_t ch_flagext);
void policy_mgr_store_and_del_conn_info(struct wlan_objmgr_psoc *psoc,
enum policy_mgr_con_mode mode,
bool all_matching_cxn_to_del,
struct policy_mgr_conc_connection_info *info,
uint8_t *num_cxn_del);
/**
* policy_mgr_store_and_del_conn_info_by_vdev_id() - Store and del a
* connection info by vdev id
* @psoc: PSOC object information
* @vdev_id: vdev id whose entry has to be deleted
* @info: structure array pointer where the connection info will be saved
* @num_cxn_del: number of connection which are going to be deleted
*
* Saves the connection info corresponding to the provided mode
* and deleted that corresponding entry based on vdev from the
* connection info structure
*
* Return: None
*/
void policy_mgr_store_and_del_conn_info_by_vdev_id(
struct wlan_objmgr_psoc *psoc,
uint32_t vdev_id,
struct policy_mgr_conc_connection_info *info,
uint8_t *num_cxn_del);
/**
* policy_mgr_store_and_del_conn_info_by_chan_and_mode() - Store and del a
* connection info by chan number and conn mode
* @psoc: PSOC object information
* @ch_freq: channel frequency value
* @mode: conn mode
* @info: structure array pointer where the connection info will be saved
* @num_cxn_del: number of connection which are going to be deleted
*
* Saves and deletes the entries if the active connection entry chan and mode
* matches the provided chan & mode from the function parameters.
*
* Return: None
*/
void policy_mgr_store_and_del_conn_info_by_chan_and_mode(
struct wlan_objmgr_psoc *psoc,
uint32_t ch_freq,
enum policy_mgr_con_mode mode,
struct policy_mgr_conc_connection_info *info,
uint8_t *num_cxn_del);
void policy_mgr_restore_deleted_conn_info(struct wlan_objmgr_psoc *psoc,
struct policy_mgr_conc_connection_info *info,
uint8_t num_cxn_del);
void policy_mgr_update_hw_mode_conn_info(struct wlan_objmgr_psoc *psoc,
uint32_t num_vdev_mac_entries,
struct policy_mgr_vdev_mac_map *vdev_mac_map,
struct policy_mgr_hw_mode_params hw_mode,
uint32_t num_mac_freq,
struct policy_mgr_pdev_mac_freq_map *freq_info);
void policy_mgr_pdev_set_hw_mode_cb(uint32_t status,
uint32_t cfgd_hw_mode_index,
uint32_t num_vdev_mac_entries,
struct policy_mgr_vdev_mac_map *vdev_mac_map,
uint8_t next_action,
enum policy_mgr_conn_update_reason reason,
uint32_t session_id, void *context,
uint32_t request_id);
void policy_mgr_dump_current_concurrency(struct wlan_objmgr_psoc *psoc);
/**
* policy_mgr_pdev_get_pcl() - GET PCL channel list
* @psoc: PSOC object information
* @mode: Adapter mode
* @pcl: the pointer of pcl list
*
* Fetches the PCL.
*
* Return: QDF_STATUS
*/
QDF_STATUS policy_mgr_pdev_get_pcl(struct wlan_objmgr_psoc *psoc,
enum QDF_OPMODE mode,
struct policy_mgr_pcl_list *pcl);
void pm_dbs_opportunistic_timer_handler(void *data);
enum policy_mgr_con_mode policy_mgr_get_mode(uint8_t type,
uint8_t subtype);
/**
* policy_mgr_get_bw() - Convert phy_ch_width to hw_mode_bandwidth.
* @chan_width: phy_ch_width
*
* Return: hw_mode_bandwidth
*/
enum hw_mode_bandwidth policy_mgr_get_bw(enum phy_ch_width chan_width);
/**
* policy_mgr_get_channel_list() - Get channel list based on PCL and mode
* @psoc: psoc object
* @pcl: pcl type
* @mode: interface mode
* @pcl_channels: pcl channel list buffer
* @pcl_weights: pcl weight buffer
* @pcl_sz: pcl channel list buffer size
* @len: pcl channel number returned from API
*
* Return: QDF_STATUS
*/
QDF_STATUS policy_mgr_get_channel_list(struct wlan_objmgr_psoc *psoc,
enum policy_mgr_pcl_type pcl,
enum policy_mgr_con_mode mode,
uint32_t *pcl_channels,
uint8_t *pcl_weights,
uint32_t pcl_sz, uint32_t *len);
/**
* policy_mgr_allow_new_home_channel() - Check for allowed number of
* home channels
* @psoc: PSOC Pointer
* @mode: Connection mode
* @ch_freq: channel frequency on which new connection is coming up
* @num_connections: number of current connections
* @is_dfs_ch: DFS channel or not
*
* When a new connection is about to come up check if current
* concurrency combination including the new connection is
* allowed or not based on the HW capability
*
* Return: True/False
*/
bool policy_mgr_allow_new_home_channel(
struct wlan_objmgr_psoc *psoc, enum policy_mgr_con_mode mode,
uint32_t ch_freq, uint32_t num_connections, bool is_dfs_ch);
/**
* policy_mgr_is_5g_channel_allowed() - check if 5g channel is allowed
* @ch_freq: channel frequency which needs to be validated
* @list: list of existing connections.
* @mode: mode against which channel needs to be validated
*
* This API takes the channel frequency as input and compares with existing
* connection channels. If existing connection's channel is DFS channel
* and provided channel is 5G channel then don't allow concurrency to
* happen as MCC with DFS channel is not yet supported
*
* Return: true if 5G channel is allowed, false if not allowed
*
*/
bool policy_mgr_is_5g_channel_allowed(struct wlan_objmgr_psoc *psoc,
uint32_t ch_freq, uint32_t *list,
enum policy_mgr_con_mode mode);
/**
* policy_mgr_complete_action() - initiates actions needed on
* current connections once channel has been decided for the new
* connection
* @new_nss: the new nss value
* @next_action: next action to happen at policy mgr after
* beacon update
* @reason: Reason for connection update
* @session_id: Session id
* @request_id: connection manager req id
*
* This function initiates actions
* needed on current connections once channel has been decided
* for the new connection. Notifies UMAC & FW as well
*
* Return: QDF_STATUS enum
*/
QDF_STATUS policy_mgr_complete_action(struct wlan_objmgr_psoc *psoc,
uint8_t new_nss, uint8_t next_action,
enum policy_mgr_conn_update_reason reason,
uint32_t session_id, uint32_t request_id);
enum policy_mgr_con_mode policy_mgr_get_mode_by_vdev_id(
struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id);
QDF_STATUS policy_mgr_init_connection_update(
struct policy_mgr_psoc_priv_obj *pm_ctx);
enum policy_mgr_conc_next_action
policy_mgr_get_current_pref_hw_mode_dbs_2x2(
struct wlan_objmgr_psoc *psoc);
enum policy_mgr_conc_next_action
policy_mgr_get_current_pref_hw_mode_dbs_1x1(
struct wlan_objmgr_psoc *psoc);
/**
* policy_mgr_get_current_pref_hw_mode_dual_dbs() - Get the
* current preferred hw mode
*
* Get the preferred hw mode based on the current connection combinations
*
* Return: No change (PM_NOP), (PM_SINGLE_MAC_UPGRADE),
* DBS (PM_DBS1_DOWNGRADE or PM_DBS2_DOWNGRADE)
*/
enum policy_mgr_conc_next_action
policy_mgr_get_current_pref_hw_mode_dual_dbs(
struct wlan_objmgr_psoc *psoc);
QDF_STATUS policy_mgr_reset_sap_mandatory_channels(
struct policy_mgr_psoc_priv_obj *pm_ctx);
/**
* policy_mgr_update_hw_mode_list() - Function to print frequency range
* for both MAC 0 and MAC1 for given Hw mode
*
* @freq_range: Policy Mgr context
* @hw_mode: HW mode
*
* This Function will print frequency range for both MAC 0 and MAC1 for given
* Hw mode
*
* Return: void
*
*/
void
policy_mgr_dump_freq_range_per_mac(struct policy_mgr_freq_range *freq_range,
enum policy_mgr_mode hw_mode);
/**
* policy_mgr_fill_curr_mac_freq_by_hwmode() - Fill Current Mac frequency with
* the frequency range of the given Hw Mode
*
* @pm_ctx: Policy Mgr context
* @mode_hw: Policy Mgr Hw mode
*
* Fill Current Mac frequency with the frequency range of the given Hw Mode
*
* Return: None
*/
void
policy_mgr_fill_curr_mac_freq_by_hwmode(struct policy_mgr_psoc_priv_obj *pm_ctx,
enum policy_mgr_mode mode_hw);
/**
* policy_mgr_update_hw_mode_list() - Function to print every frequency range
* for both MAC 0 and MAC1 for every Hw mode
*
* @pm_ctx: Policy Mgr context
*
* This function will print every frequency range
* for both MAC 0 and MAC1 for every Hw mode
*
* Return: void
*
*/
void
policy_mgr_dump_freq_range(struct policy_mgr_psoc_priv_obj *pm_ctx);
/**
* policy_mgr_dump_curr_freq_range() - Function to print current frequency range
* for both MAC 0 and MAC1
*
* @pm_ctx: Policy Mgr context
*
* This function will print current frequency range
* for both MAC 0 and MAC1 for every Hw mode
*
* Return: void
*
*/
void
policy_mgr_dump_curr_freq_range(struct policy_mgr_psoc_priv_obj *pm_ctx);
/**
* policy_mgr_reg_chan_change_callback() - Callback to be
* invoked by regulatory module when valid channel list changes
* @psoc: PSOC object information
* @pdev: PDEV object information
* @chan_list: New channel list
* @avoid_freq_ind: LTE coex avoid channel list
* @arg: Information passed at registration
*
* Get updated channel list from regulatory module
*
* Return: None
*/
void policy_mgr_reg_chan_change_callback(struct wlan_objmgr_psoc *psoc,
struct wlan_objmgr_pdev *pdev,
struct regulatory_channel *chan_list,
struct avoid_freq_ind_data *avoid_freq_ind,
void *arg);
/**
* policy_mgr_nss_update() - update nss for AP vdev
* @psoc: PSOC object information
* @new_nss: new NSS value
* @next_action: Next action after nss update
* @band: update AP vdev on the Band.
* @reason: action reason
* @original_vdev_id: original request hwmode change vdev id
* @request_id: request id
*
* The function will update AP vdevs on specific band.
* eg. band = POLICY_MGR_ANY will request to update all band (2g and 5g)
*
* Return: QDF_STATUS_SUCCESS, update requested successfully.
*/
QDF_STATUS policy_mgr_nss_update(struct wlan_objmgr_psoc *psoc,
uint8_t new_nss, uint8_t next_action,
enum policy_mgr_band band,
enum policy_mgr_conn_update_reason reason,
uint32_t original_vdev_id, uint32_t request_id);
/**
* policy_mgr_is_concurrency_allowed() - Check for allowed
* concurrency combination
* @psoc: PSOC object information
* @mode: new connection mode
* @ch_freq: channel frequency on which new connection is coming up
* @bw: Bandwidth requested by the connection (optional)
* @ext_flags: extended flags for concurrency check (union conc_ext_flag)
*
* When a new connection is about to come up check if current
* concurrency combination including the new connection is
* allowed or not based on the HW capability, but no need to
* invoke get_pcl
*
* Return: True/False
*/
bool policy_mgr_is_concurrency_allowed(struct wlan_objmgr_psoc *psoc,
enum policy_mgr_con_mode mode,
uint32_t ch_freq,
enum hw_mode_bandwidth bw,
uint32_t ext_flags);
#endif

View File

@@ -1,857 +0,0 @@
/*
* Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 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.
*/
/**
* DOC: wlan_policy_mgr_init_deinit.c
*
* WLAN Concurrenct Connection Management APIs
*
*/
/* Include files */
#include "wlan_policy_mgr_api.h"
#include "wlan_policy_mgr_tables_no_dbs_i.h"
#include "wlan_policy_mgr_tables_1x1_dbs_i.h"
#include "wlan_policy_mgr_tables_2x2_dbs_i.h"
#include "wlan_policy_mgr_tables_2x2_5g_1x1_2g.h"
#include "wlan_policy_mgr_tables_2x2_2g_1x1_5g.h"
#include "wlan_policy_mgr_tables_2x2_dbs_sbs_i.h"
#include "wlan_policy_mgr_i.h"
#include "qdf_types.h"
#include "qdf_trace.h"
#include "wlan_objmgr_global_obj.h"
#include "target_if.h"
static QDF_STATUS policy_mgr_psoc_obj_create_cb(struct wlan_objmgr_psoc *psoc,
void *data)
{
struct policy_mgr_psoc_priv_obj *policy_mgr_ctx;
policy_mgr_ctx = qdf_mem_malloc(
sizeof(struct policy_mgr_psoc_priv_obj));
if (!policy_mgr_ctx)
return QDF_STATUS_E_FAILURE;
policy_mgr_ctx->psoc = psoc;
policy_mgr_ctx->old_hw_mode_index = POLICY_MGR_DEFAULT_HW_MODE_INDEX;
policy_mgr_ctx->new_hw_mode_index = POLICY_MGR_DEFAULT_HW_MODE_INDEX;
wlan_objmgr_psoc_component_obj_attach(psoc,
WLAN_UMAC_COMP_POLICY_MGR,
policy_mgr_ctx,
QDF_STATUS_SUCCESS);
return QDF_STATUS_SUCCESS;
}
static QDF_STATUS policy_mgr_psoc_obj_destroy_cb(struct wlan_objmgr_psoc *psoc,
void *data)
{
struct policy_mgr_psoc_priv_obj *policy_mgr_ctx;
policy_mgr_ctx = policy_mgr_get_context(psoc);
wlan_objmgr_psoc_component_obj_detach(psoc,
WLAN_UMAC_COMP_POLICY_MGR,
policy_mgr_ctx);
qdf_mem_free(policy_mgr_ctx);
return QDF_STATUS_SUCCESS;
}
static void policy_mgr_psoc_obj_status_cb(struct wlan_objmgr_psoc *psoc,
void *data, QDF_STATUS status)
{
return;
}
static QDF_STATUS policy_mgr_pdev_obj_create_cb(struct wlan_objmgr_pdev *pdev,
void *data)
{
struct policy_mgr_psoc_priv_obj *policy_mgr_ctx;
struct wlan_objmgr_psoc *psoc;
psoc = wlan_pdev_get_psoc(pdev);
policy_mgr_ctx = policy_mgr_get_context(psoc);
if (!policy_mgr_ctx) {
policy_mgr_err("invalid context");
return QDF_STATUS_E_FAILURE;
}
policy_mgr_ctx->pdev = pdev;
wlan_reg_register_chan_change_callback(psoc,
policy_mgr_reg_chan_change_callback, NULL);
return QDF_STATUS_SUCCESS;
}
static QDF_STATUS policy_mgr_pdev_obj_destroy_cb(struct wlan_objmgr_pdev *pdev,
void *data)
{
struct policy_mgr_psoc_priv_obj *policy_mgr_ctx;
struct wlan_objmgr_psoc *psoc;
psoc = wlan_pdev_get_psoc(pdev);
policy_mgr_ctx = policy_mgr_get_context(psoc);
if (!policy_mgr_ctx) {
policy_mgr_err("invalid context");
return QDF_STATUS_E_FAILURE;
}
policy_mgr_ctx->pdev = NULL;
wlan_reg_unregister_chan_change_callback(psoc,
policy_mgr_reg_chan_change_callback);
return QDF_STATUS_SUCCESS;
}
static QDF_STATUS policy_mgr_vdev_obj_create_cb(struct wlan_objmgr_vdev *vdev,
void *data)
{
return QDF_STATUS_SUCCESS;
}
static QDF_STATUS policy_mgr_vdev_obj_destroy_cb(struct wlan_objmgr_vdev *vdev,
void *data)
{
return QDF_STATUS_SUCCESS;
}
static void policy_mgr_vdev_obj_status_cb(struct wlan_objmgr_vdev *vdev,
void *data, QDF_STATUS status)
{
return;
}
QDF_STATUS policy_mgr_init(void)
{
QDF_STATUS status = QDF_STATUS_SUCCESS;
status = wlan_objmgr_register_psoc_create_handler(
WLAN_UMAC_COMP_POLICY_MGR,
policy_mgr_psoc_obj_create_cb,
NULL);
if (status != QDF_STATUS_SUCCESS) {
policy_mgr_err("Failed to register psoc obj create cback");
goto err_psoc_create;
}
status = wlan_objmgr_register_psoc_destroy_handler(
WLAN_UMAC_COMP_POLICY_MGR,
policy_mgr_psoc_obj_destroy_cb,
NULL);
if (status != QDF_STATUS_SUCCESS) {
policy_mgr_err("Failed to register psoc obj delete cback");
goto err_psoc_delete;
}
status = wlan_objmgr_register_psoc_status_handler(
WLAN_UMAC_COMP_POLICY_MGR,
policy_mgr_psoc_obj_status_cb,
NULL);
if (status != QDF_STATUS_SUCCESS) {
policy_mgr_err("Failed to register psoc obj status cback");
goto err_psoc_status;
}
status = wlan_objmgr_register_pdev_create_handler(
WLAN_UMAC_COMP_POLICY_MGR,
policy_mgr_pdev_obj_create_cb,
NULL);
if (status != QDF_STATUS_SUCCESS) {
policy_mgr_err("Failed to register pdev obj create cback");
goto err_pdev_create;
}
status = wlan_objmgr_register_pdev_destroy_handler(
WLAN_UMAC_COMP_POLICY_MGR,
policy_mgr_pdev_obj_destroy_cb,
NULL);
if (status != QDF_STATUS_SUCCESS) {
policy_mgr_err("Failed to register pdev obj delete cback");
goto err_pdev_delete;
}
status = wlan_objmgr_register_vdev_create_handler(
WLAN_UMAC_COMP_POLICY_MGR,
policy_mgr_vdev_obj_create_cb,
NULL);
if (status != QDF_STATUS_SUCCESS) {
policy_mgr_err("Failed to register vdev obj create cback");
goto err_vdev_create;
}
status = wlan_objmgr_register_vdev_destroy_handler(
WLAN_UMAC_COMP_POLICY_MGR,
policy_mgr_vdev_obj_destroy_cb,
NULL);
if (status != QDF_STATUS_SUCCESS) {
policy_mgr_err("Failed to register vdev obj delete cback");
goto err_vdev_delete;
}
status = wlan_objmgr_register_vdev_status_handler(
WLAN_UMAC_COMP_POLICY_MGR,
policy_mgr_vdev_obj_status_cb,
NULL);
if (status != QDF_STATUS_SUCCESS) {
policy_mgr_err("Failed to register vdev obj status cback");
goto err_vdev_status;
}
policy_mgr_notice("Callbacks registered with obj mgr");
return QDF_STATUS_SUCCESS;
err_vdev_status:
wlan_objmgr_unregister_vdev_destroy_handler(WLAN_UMAC_COMP_POLICY_MGR,
policy_mgr_vdev_obj_destroy_cb,
NULL);
err_vdev_delete:
wlan_objmgr_unregister_vdev_create_handler(WLAN_UMAC_COMP_POLICY_MGR,
policy_mgr_vdev_obj_create_cb,
NULL);
err_vdev_create:
wlan_objmgr_unregister_pdev_destroy_handler(WLAN_UMAC_COMP_POLICY_MGR,
policy_mgr_pdev_obj_destroy_cb,
NULL);
err_pdev_delete:
wlan_objmgr_unregister_pdev_create_handler(WLAN_UMAC_COMP_POLICY_MGR,
policy_mgr_pdev_obj_create_cb,
NULL);
err_pdev_create:
wlan_objmgr_unregister_psoc_status_handler(WLAN_UMAC_COMP_POLICY_MGR,
policy_mgr_psoc_obj_status_cb,
NULL);
err_psoc_status:
wlan_objmgr_unregister_psoc_destroy_handler(WLAN_UMAC_COMP_POLICY_MGR,
policy_mgr_psoc_obj_destroy_cb,
NULL);
err_psoc_delete:
wlan_objmgr_unregister_psoc_create_handler(WLAN_UMAC_COMP_POLICY_MGR,
policy_mgr_psoc_obj_create_cb,
NULL);
err_psoc_create:
return status;
}
QDF_STATUS policy_mgr_deinit(void)
{
QDF_STATUS status;
status = wlan_objmgr_unregister_psoc_status_handler(
WLAN_UMAC_COMP_POLICY_MGR,
policy_mgr_psoc_obj_status_cb,
NULL);
if (status != QDF_STATUS_SUCCESS)
policy_mgr_err("Failed to deregister psoc obj status cback");
status = wlan_objmgr_unregister_psoc_destroy_handler(
WLAN_UMAC_COMP_POLICY_MGR,
policy_mgr_psoc_obj_destroy_cb,
NULL);
if (status != QDF_STATUS_SUCCESS)
policy_mgr_err("Failed to deregister psoc obj delete cback");
status = wlan_objmgr_unregister_psoc_create_handler(
WLAN_UMAC_COMP_POLICY_MGR,
policy_mgr_psoc_obj_create_cb,
NULL);
if (status != QDF_STATUS_SUCCESS)
policy_mgr_err("Failed to deregister psoc obj create cback");
status = wlan_objmgr_unregister_pdev_destroy_handler(
WLAN_UMAC_COMP_POLICY_MGR,
policy_mgr_pdev_obj_destroy_cb,
NULL);
if (status != QDF_STATUS_SUCCESS)
policy_mgr_err("Failed to deregister pdev obj delete cback");
status = wlan_objmgr_unregister_pdev_create_handler(
WLAN_UMAC_COMP_POLICY_MGR,
policy_mgr_pdev_obj_create_cb,
NULL);
if (status != QDF_STATUS_SUCCESS)
policy_mgr_err("Failed to deregister pdev obj create cback");
status = wlan_objmgr_unregister_vdev_status_handler(
WLAN_UMAC_COMP_POLICY_MGR,
policy_mgr_vdev_obj_status_cb,
NULL);
if (status != QDF_STATUS_SUCCESS)
policy_mgr_err("Failed to deregister vdev obj status cback");
status = wlan_objmgr_unregister_vdev_destroy_handler(
WLAN_UMAC_COMP_POLICY_MGR,
policy_mgr_vdev_obj_destroy_cb,
NULL);
if (status != QDF_STATUS_SUCCESS)
policy_mgr_err("Failed to deregister vdev obj delete cback");
status = wlan_objmgr_unregister_vdev_create_handler(
WLAN_UMAC_COMP_POLICY_MGR,
policy_mgr_vdev_obj_create_cb,
NULL);
if (status != QDF_STATUS_SUCCESS)
policy_mgr_err("Failed to deregister vdev obj create cback");
policy_mgr_info("deregistered callbacks with obj mgr successfully");
return status;
}
QDF_STATUS policy_mgr_psoc_open(struct wlan_objmgr_psoc *psoc)
{
struct policy_mgr_psoc_priv_obj *pm_ctx;
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
policy_mgr_err("Invalid Context");
return QDF_STATUS_E_FAILURE;
}
if (!QDF_IS_STATUS_SUCCESS(qdf_mutex_create(
&pm_ctx->qdf_conc_list_lock))) {
policy_mgr_err("Failed to init qdf_conc_list_lock");
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
pm_ctx->sta_ap_intf_check_work_info = qdf_mem_malloc(
sizeof(struct sta_ap_intf_check_work_ctx));
if (!pm_ctx->sta_ap_intf_check_work_info) {
qdf_mutex_destroy(&pm_ctx->qdf_conc_list_lock);
return QDF_STATUS_E_FAILURE;
}
pm_ctx->sta_ap_intf_check_work_info->psoc = psoc;
pm_ctx->sta_ap_intf_check_work_info->go_plus_go_force_scc.vdev_id =
WLAN_UMAC_VDEV_ID_MAX;
if (QDF_IS_STATUS_ERROR(qdf_delayed_work_create(
&pm_ctx->sta_ap_intf_check_work,
policy_mgr_check_sta_ap_concurrent_ch_intf,
pm_ctx))) {
policy_mgr_err("Failed to create dealyed work queue");
qdf_mutex_destroy(&pm_ctx->qdf_conc_list_lock);
qdf_mem_free(pm_ctx->sta_ap_intf_check_work_info);
return QDF_STATUS_E_FAILURE;
}
return QDF_STATUS_SUCCESS;
}
QDF_STATUS policy_mgr_psoc_close(struct wlan_objmgr_psoc *psoc)
{
struct policy_mgr_psoc_priv_obj *pm_ctx;
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
policy_mgr_err("Invalid Context");
return QDF_STATUS_E_FAILURE;
}
if (!QDF_IS_STATUS_SUCCESS(qdf_mutex_destroy(
&pm_ctx->qdf_conc_list_lock))) {
policy_mgr_err("Failed to destroy qdf_conc_list_lock");
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
if (pm_ctx->hw_mode.hw_mode_list) {
qdf_mem_free(pm_ctx->hw_mode.hw_mode_list);
pm_ctx->hw_mode.hw_mode_list = NULL;
policy_mgr_debug("HW list is freed");
}
if (pm_ctx->sta_ap_intf_check_work_info) {
qdf_delayed_work_destroy(&pm_ctx->sta_ap_intf_check_work);
qdf_mem_free(pm_ctx->sta_ap_intf_check_work_info);
pm_ctx->sta_ap_intf_check_work_info = NULL;
}
return QDF_STATUS_SUCCESS;
}
#ifdef FEATURE_NO_DBS_INTRABAND_MCC_SUPPORT
static void policy_mgr_init_non_dbs_pcl(struct wlan_objmgr_psoc *psoc)
{
struct wmi_unified *wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
if (!wmi_handle) {
policy_mgr_debug("Invalid WMI handle");
return;
}
if (wmi_service_enabled(wmi_handle,
wmi_service_no_interband_mcc_support) &&
!wmi_service_enabled(wmi_handle,
wmi_service_dual_band_simultaneous_support)) {
second_connection_pcl_non_dbs_table =
&second_connection_pcl_nodbs_no_interband_mcc_table;
third_connection_pcl_non_dbs_table =
&third_connection_pcl_nodbs_no_interband_mcc_table;
} else {
second_connection_pcl_non_dbs_table =
&second_connection_pcl_nodbs_table;
third_connection_pcl_non_dbs_table =
&third_connection_pcl_nodbs_table;
}
}
#else
static void policy_mgr_init_non_dbs_pcl(struct wlan_objmgr_psoc *psoc)
{
second_connection_pcl_non_dbs_table =
&second_connection_pcl_nodbs_table;
third_connection_pcl_non_dbs_table =
&third_connection_pcl_nodbs_table;
}
#endif
QDF_STATUS policy_mgr_psoc_enable(struct wlan_objmgr_psoc *psoc)
{
QDF_STATUS status;
struct policy_mgr_psoc_priv_obj *pm_ctx;
bool enable_mcc_adaptive_sch = false;
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
policy_mgr_err("Invalid Context");
return QDF_STATUS_E_FAILURE;
}
policy_mgr_debug("Initializing the policy manager");
/* init pm_conc_connection_list */
qdf_mem_zero(pm_conc_connection_list, sizeof(pm_conc_connection_list));
policy_mgr_clear_concurrent_session_count(psoc);
/* init dbs_opportunistic_timer */
status = qdf_mc_timer_init(&pm_ctx->dbs_opportunistic_timer,
QDF_TIMER_TYPE_SW,
pm_dbs_opportunistic_timer_handler,
(void *)psoc);
if (!QDF_IS_STATUS_SUCCESS(status)) {
policy_mgr_err("Failed to init DBS opportunistic timer");
return status;
}
/* init connection_update_done_evt */
status = policy_mgr_init_connection_update(pm_ctx);
if (!QDF_IS_STATUS_SUCCESS(status)) {
policy_mgr_err("connection_update_done_evt init failed");
return status;
}
status = qdf_event_create(&pm_ctx->opportunistic_update_done_evt);
if (!QDF_IS_STATUS_SUCCESS(status)) {
policy_mgr_err("opportunistic_update_done_evt init failed");
return status;
}
status = qdf_event_create(&pm_ctx->channel_switch_complete_evt);
if (!QDF_IS_STATUS_SUCCESS(status)) {
policy_mgr_err("channel_switch_complete_evt init failed");
return status;
}
policy_mgr_get_mcc_adaptive_sch(psoc, &enable_mcc_adaptive_sch);
policy_mgr_set_dynamic_mcc_adaptive_sch(psoc, enable_mcc_adaptive_sch);
pm_ctx->hw_mode_change_in_progress = POLICY_MGR_HW_MODE_NOT_IN_PROGRESS;
/* reset sap mandatory channels */
status = policy_mgr_reset_sap_mandatory_channels(pm_ctx);
if (QDF_IS_STATUS_ERROR(status)) {
policy_mgr_err("failed to reset mandatory channels");
return status;
}
/* init PCL table & function pointers based on HW capability */
if (policy_mgr_is_hw_dbs_2x2_capable(psoc) ||
policy_mgr_is_hw_dbs_required_for_band(psoc, HW_MODE_MAC_BAND_2G))
policy_mgr_get_current_pref_hw_mode_ptr =
policy_mgr_get_current_pref_hw_mode_dbs_2x2;
else if (policy_mgr_is_2x2_1x1_dbs_capable(psoc))
policy_mgr_get_current_pref_hw_mode_ptr =
policy_mgr_get_current_pref_hw_mode_dual_dbs;
else
policy_mgr_get_current_pref_hw_mode_ptr =
policy_mgr_get_current_pref_hw_mode_dbs_1x1;
if (policy_mgr_is_hw_dbs_2x2_capable(psoc) &&
policy_mgr_is_hw_sbs_capable(psoc))
second_connection_pcl_dbs_table =
&pm_second_connection_pcl_dbs_sbs_2x2_table;
else if (policy_mgr_is_hw_dbs_2x2_capable(psoc) ||
policy_mgr_is_hw_dbs_required_for_band(psoc,
HW_MODE_MAC_BAND_2G) ||
policy_mgr_is_2x2_1x1_dbs_capable(psoc))
second_connection_pcl_dbs_table =
&pm_second_connection_pcl_dbs_2x2_table;
else
second_connection_pcl_dbs_table =
&pm_second_connection_pcl_dbs_1x1_table;
if (policy_mgr_is_hw_dbs_2x2_capable(psoc) &&
policy_mgr_is_hw_sbs_capable(psoc))
third_connection_pcl_dbs_table =
&pm_third_connection_pcl_dbs_sbs_2x2_table;
else if (policy_mgr_is_hw_dbs_2x2_capable(psoc) ||
policy_mgr_is_hw_dbs_required_for_band(psoc,
HW_MODE_MAC_BAND_2G) ||
policy_mgr_is_2x2_1x1_dbs_capable(psoc))
third_connection_pcl_dbs_table =
&pm_third_connection_pcl_dbs_2x2_table;
else
third_connection_pcl_dbs_table =
&pm_third_connection_pcl_dbs_1x1_table;
/* Initialize non-DBS pcl table pointer to particular table*/
policy_mgr_init_non_dbs_pcl(psoc);
if (policy_mgr_is_hw_dbs_2x2_capable(psoc)) {
if (policy_mgr_is_hw_dbs_required_for_band(psoc,
HW_MODE_MAC_BAND_2G)) {
next_action_two_connection_table =
&pm_next_action_two_connection_dbs_2x2_table;
policy_mgr_debug("using hst/hsp policy manager table");
} else {
next_action_two_connection_table =
&pm_next_action_two_connection_dbs_2x2_table_v2;
policy_mgr_debug("using hmt policy manager table");
}
} else if (policy_mgr_is_2x2_1x1_dbs_capable(psoc)) {
next_action_two_connection_table =
&pm_next_action_two_connection_dbs_2x2_5g_1x1_2g_table;
next_action_two_connection_2x2_2g_1x1_5g_table =
&pm_next_action_two_connection_dbs_2x2_2g_1x1_5g_table;
} else {
next_action_two_connection_table =
&pm_next_action_two_connection_dbs_1x1_table;
}
if (policy_mgr_is_hw_dbs_2x2_capable(psoc) ||
policy_mgr_is_hw_dbs_required_for_band(psoc,
HW_MODE_MAC_BAND_2G)) {
next_action_three_connection_table =
&pm_next_action_three_connection_dbs_2x2_table;
} else if (policy_mgr_is_2x2_1x1_dbs_capable(psoc)) {
next_action_three_connection_table =
&pm_next_action_three_connection_dbs_2x2_5g_1x1_2g_table;
next_action_three_connection_2x2_2g_1x1_5g_table =
&pm_next_action_three_connection_dbs_2x2_2g_1x1_5g_table;
} else {
next_action_three_connection_table =
&pm_next_action_three_connection_dbs_1x1_table;
}
policy_mgr_debug("is DBS Capable %d, is SBS Capable %d",
policy_mgr_is_hw_dbs_capable(psoc),
policy_mgr_is_hw_sbs_capable(psoc));
policy_mgr_debug("is2x2 %d, 2g-on-dbs %d is2x2+1x1 %d, is2x2_5g+1x1_2g %d, is2x2_2g+1x1_5g %d",
policy_mgr_is_hw_dbs_2x2_capable(psoc),
policy_mgr_is_hw_dbs_required_for_band(
psoc, HW_MODE_MAC_BAND_2G),
policy_mgr_is_2x2_1x1_dbs_capable(psoc),
policy_mgr_is_2x2_5G_1x1_2G_dbs_capable(psoc),
policy_mgr_is_2x2_2G_1x1_5G_dbs_capable(psoc));
return QDF_STATUS_SUCCESS;
}
QDF_STATUS policy_mgr_psoc_disable(struct wlan_objmgr_psoc *psoc)
{
QDF_STATUS status = QDF_STATUS_SUCCESS;
struct policy_mgr_psoc_priv_obj *pm_ctx;
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
policy_mgr_err("Invalid Context");
return QDF_STATUS_E_FAILURE;
}
/* destroy connection_update_done_evt */
if (!QDF_IS_STATUS_SUCCESS(qdf_event_destroy
(&pm_ctx->connection_update_done_evt))) {
policy_mgr_err("Failed to destroy connection_update_done_evt");
status = QDF_STATUS_E_FAILURE;
QDF_ASSERT(0);
}
/* destroy opportunistic_update_done_evt */
if (!QDF_IS_STATUS_SUCCESS(qdf_event_destroy
(&pm_ctx->opportunistic_update_done_evt))) {
policy_mgr_err("Failed to destroy opportunistic_update_done_evt");
status = QDF_STATUS_E_FAILURE;
QDF_ASSERT(0);
}
/* destroy channel_switch_complete_evt */
if (!QDF_IS_STATUS_SUCCESS(qdf_event_destroy
(&pm_ctx->channel_switch_complete_evt))) {
policy_mgr_err("Failed to destroy channel_switch_complete evt");
status = QDF_STATUS_E_FAILURE;
QDF_ASSERT(0);
}
/* deallocate dbs_opportunistic_timer */
if (QDF_TIMER_STATE_RUNNING ==
qdf_mc_timer_get_current_state(
&pm_ctx->dbs_opportunistic_timer)) {
qdf_mc_timer_stop(&pm_ctx->dbs_opportunistic_timer);
}
if (!QDF_IS_STATUS_SUCCESS(qdf_mc_timer_destroy(
&pm_ctx->dbs_opportunistic_timer))) {
policy_mgr_err("Cannot deallocate dbs opportunistic timer");
status = QDF_STATUS_E_FAILURE;
QDF_ASSERT(0);
}
/* reset sap mandatory channels */
if (QDF_IS_STATUS_ERROR(
policy_mgr_reset_sap_mandatory_channels(pm_ctx))) {
policy_mgr_err("failed to reset sap mandatory channels");
status = QDF_STATUS_E_FAILURE;
QDF_ASSERT(0);
}
/* deinit pm_conc_connection_list */
qdf_mem_zero(pm_conc_connection_list, sizeof(pm_conc_connection_list));
policy_mgr_clear_concurrent_session_count(psoc);
return status;
}
QDF_STATUS policy_mgr_register_conc_cb(struct wlan_objmgr_psoc *psoc,
struct policy_mgr_conc_cbacks *conc_cbacks)
{
struct policy_mgr_psoc_priv_obj *pm_ctx;
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
policy_mgr_err("Invalid Context");
return QDF_STATUS_E_FAILURE;
}
pm_ctx->conc_cbacks.connection_info_update =
conc_cbacks->connection_info_update;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS policy_mgr_register_sme_cb(struct wlan_objmgr_psoc *psoc,
struct policy_mgr_sme_cbacks *sme_cbacks)
{
struct policy_mgr_psoc_priv_obj *pm_ctx;
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
policy_mgr_err("Invalid Context");
return QDF_STATUS_E_FAILURE;
}
pm_ctx->sme_cbacks.sme_get_nss_for_vdev =
sme_cbacks->sme_get_nss_for_vdev;
pm_ctx->sme_cbacks.sme_nss_update_request =
sme_cbacks->sme_nss_update_request;
if (!policy_mgr_is_hwmode_offload_enabled(psoc))
pm_ctx->sme_cbacks.sme_pdev_set_hw_mode =
sme_cbacks->sme_pdev_set_hw_mode;
pm_ctx->sme_cbacks.sme_soc_set_dual_mac_config =
sme_cbacks->sme_soc_set_dual_mac_config;
pm_ctx->sme_cbacks.sme_change_mcc_beacon_interval =
sme_cbacks->sme_change_mcc_beacon_interval;
pm_ctx->sme_cbacks.sme_rso_start_cb =
sme_cbacks->sme_rso_start_cb;
pm_ctx->sme_cbacks.sme_rso_stop_cb =
sme_cbacks->sme_rso_stop_cb;
return QDF_STATUS_SUCCESS;
}
/**
* policy_mgr_register_hdd_cb() - register HDD callbacks
* @psoc: PSOC object information
* @hdd_cbacks: function pointers from HDD
*
* API, allows HDD to register callbacks to be invoked by policy
* mgr
*
* Return: SUCCESS,
* Failure (if registration fails)
*/
QDF_STATUS policy_mgr_register_hdd_cb(struct wlan_objmgr_psoc *psoc,
struct policy_mgr_hdd_cbacks *hdd_cbacks)
{
struct policy_mgr_psoc_priv_obj *pm_ctx;
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
policy_mgr_err("Invalid Context");
return QDF_STATUS_E_FAILURE;
}
pm_ctx->hdd_cbacks.sap_restart_chan_switch_cb =
hdd_cbacks->sap_restart_chan_switch_cb;
pm_ctx->hdd_cbacks.wlan_hdd_get_channel_for_sap_restart =
hdd_cbacks->wlan_hdd_get_channel_for_sap_restart;
pm_ctx->hdd_cbacks.get_mode_for_non_connected_vdev =
hdd_cbacks->get_mode_for_non_connected_vdev;
pm_ctx->hdd_cbacks.hdd_get_device_mode =
hdd_cbacks->hdd_get_device_mode;
pm_ctx->hdd_cbacks.hdd_is_chan_switch_in_progress =
hdd_cbacks->hdd_is_chan_switch_in_progress;
pm_ctx->hdd_cbacks.hdd_is_cac_in_progress =
hdd_cbacks->hdd_is_cac_in_progress;
pm_ctx->hdd_cbacks.hdd_get_ap_6ghz_capable =
hdd_cbacks->hdd_get_ap_6ghz_capable;
pm_ctx->hdd_cbacks.wlan_hdd_indicate_active_ndp_cnt =
hdd_cbacks->wlan_hdd_indicate_active_ndp_cnt;
pm_ctx->hdd_cbacks.wlan_get_ap_prefer_conc_ch_params =
hdd_cbacks->wlan_get_ap_prefer_conc_ch_params;
pm_ctx->hdd_cbacks.wlan_get_sap_acs_band =
hdd_cbacks->wlan_get_sap_acs_band;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS policy_mgr_deregister_hdd_cb(struct wlan_objmgr_psoc *psoc)
{
struct policy_mgr_psoc_priv_obj *pm_ctx;
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
policy_mgr_err("Invalid Context");
return QDF_STATUS_E_FAILURE;
}
pm_ctx->hdd_cbacks.sap_restart_chan_switch_cb = NULL;
pm_ctx->hdd_cbacks.wlan_hdd_get_channel_for_sap_restart = NULL;
pm_ctx->hdd_cbacks.get_mode_for_non_connected_vdev = NULL;
pm_ctx->hdd_cbacks.hdd_get_device_mode = NULL;
pm_ctx->hdd_cbacks.hdd_is_chan_switch_in_progress = NULL;
pm_ctx->hdd_cbacks.hdd_is_cac_in_progress = NULL;
pm_ctx->hdd_cbacks.hdd_get_ap_6ghz_capable = NULL;
pm_ctx->hdd_cbacks.wlan_get_ap_prefer_conc_ch_params = NULL;
pm_ctx->hdd_cbacks.wlan_get_sap_acs_band = NULL;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS policy_mgr_register_wma_cb(struct wlan_objmgr_psoc *psoc,
struct policy_mgr_wma_cbacks *wma_cbacks)
{
struct policy_mgr_psoc_priv_obj *pm_ctx;
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
policy_mgr_err("Invalid Context");
return QDF_STATUS_E_FAILURE;
}
pm_ctx->wma_cbacks.wma_get_connection_info =
wma_cbacks->wma_get_connection_info;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS policy_mgr_register_cdp_cb(struct wlan_objmgr_psoc *psoc,
struct policy_mgr_cdp_cbacks *cdp_cbacks)
{
struct policy_mgr_psoc_priv_obj *pm_ctx;
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
policy_mgr_err("Invalid Context");
return QDF_STATUS_E_FAILURE;
}
pm_ctx->cdp_cbacks.cdp_update_mac_id =
cdp_cbacks->cdp_update_mac_id;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS policy_mgr_register_dp_cb(struct wlan_objmgr_psoc *psoc,
struct policy_mgr_dp_cbacks *dp_cbacks)
{
struct policy_mgr_psoc_priv_obj *pm_ctx;
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
policy_mgr_err("Invalid Context");
return QDF_STATUS_E_FAILURE;
}
pm_ctx->dp_cbacks.hdd_rx_handle_concurrency =
dp_cbacks->hdd_rx_handle_concurrency;
pm_ctx->dp_cbacks.hdd_set_rx_mode_rps_cb =
dp_cbacks->hdd_set_rx_mode_rps_cb;
pm_ctx->dp_cbacks.hdd_ipa_set_mcc_mode_cb =
dp_cbacks->hdd_ipa_set_mcc_mode_cb;
pm_ctx->dp_cbacks.hdd_v2_flow_pool_map =
dp_cbacks->hdd_v2_flow_pool_map;
pm_ctx->dp_cbacks.hdd_v2_flow_pool_unmap =
dp_cbacks->hdd_v2_flow_pool_unmap;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS policy_mgr_register_tdls_cb(struct wlan_objmgr_psoc *psoc,
struct policy_mgr_tdls_cbacks *tdls_cbacks)
{
struct policy_mgr_psoc_priv_obj *pm_ctx;
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
policy_mgr_err("Invalid Context");
return QDF_STATUS_E_FAILURE;
}
pm_ctx->tdls_cbacks.tdls_notify_increment_session =
tdls_cbacks->tdls_notify_increment_session;
pm_ctx->tdls_cbacks.tdls_notify_decrement_session =
tdls_cbacks->tdls_notify_decrement_session;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS policy_mgr_register_mode_change_cb(struct wlan_objmgr_psoc *psoc,
send_mode_change_event_cb mode_change_cb)
{
struct policy_mgr_psoc_priv_obj *pm_ctx;
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
policy_mgr_err("Invalid Context");
return QDF_STATUS_E_FAILURE;
}
pm_ctx->mode_change_cb = mode_change_cb;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS policy_mgr_deregister_mode_change_cb(struct wlan_objmgr_psoc *psoc)
{
struct policy_mgr_psoc_priv_obj *pm_ctx;
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
policy_mgr_err("Invalid Context");
return QDF_STATUS_E_FAILURE;
}
pm_ctx->mode_change_cb = NULL;
return QDF_STATUS_SUCCESS;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,150 +0,0 @@
/*
* Copyright (c) 2012-2018, 2020 The Linux Foundation. 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 __WLAN_POLICY_MGR_TABLES_2X2_2G_1X1_5G_DBS_H
#define __WLAN_POLICY_MGR_TABLES_2X2_2G_1X1_5G_DBS_H
#include "wlan_policy_mgr_api.h"
/**
* next_action_two_connection_table - table which provides next
* action while a new connection is coming up, with one
* connection already in the system
*/
static policy_mgr_next_action_two_connection_table_type
pm_next_action_two_connection_dbs_2x2_2g_1x1_5g_table = {
[PM_STA_24_1x1] = {PM_NOP, PM_DBS2},
[PM_STA_24_2x2] = {PM_NOP, PM_DBS2},
[PM_STA_5_1x1] = {PM_DBS2, PM_NOP},
[PM_STA_5_2x2] = {PM_DBS2, PM_NOP},
[PM_P2P_CLI_24_1x1] = {PM_NOP, PM_DBS2},
[PM_P2P_CLI_24_2x2] = {PM_NOP, PM_DBS2},
[PM_P2P_CLI_5_1x1] = {PM_DBS2, PM_NOP},
[PM_P2P_CLI_5_2x2] = {PM_DBS2, PM_NOP},
[PM_P2P_GO_24_1x1] = {PM_NOP, PM_DBS2},
[PM_P2P_GO_24_2x2] = {PM_NOP, PM_DBS2},
[PM_P2P_GO_5_1x1] = {PM_DBS2, PM_NOP},
[PM_P2P_GO_5_2x2] = {PM_DBS2_DOWNGRADE, PM_NOP},
[PM_SAP_24_1x1] = {PM_NOP, PM_DBS2},
[PM_SAP_24_2x2] = {PM_NOP, PM_DBS2},
[PM_SAP_5_1x1] = {PM_DBS2, PM_NOP},
[PM_SAP_5_2x2] = {PM_DBS2_DOWNGRADE, PM_NOP},
};
/**
* next_action_three_connection_table - table which provides next
* action while a new connection is coming up, with two
* connections already in the system
*/
static policy_mgr_next_action_three_connection_table_type
pm_next_action_three_connection_dbs_2x2_2g_1x1_5g_table = {
[PM_STA_SAP_SCC_24_1x1] = {PM_NOP, PM_DBS2},
[PM_STA_SAP_SCC_24_2x2] = {PM_NOP, PM_DBS2},
[PM_STA_SAP_MCC_24_1x1] = {PM_NOP, PM_DBS2},
[PM_STA_SAP_MCC_24_2x2] = {PM_NOP, PM_DBS2},
[PM_STA_SAP_SCC_5_1x1] = {PM_DBS2, PM_NOP},
[PM_STA_SAP_SCC_5_2x2] = {PM_DBS2_DOWNGRADE, PM_NOP},
[PM_STA_SAP_MCC_5_1x1] = {PM_DBS2, PM_NOP},
[PM_STA_SAP_MCC_5_2x2] = {PM_DBS2_DOWNGRADE, PM_NOP},
[PM_STA_SAP_MCC_24_5_1x1] = {PM_DBS2_DOWNGRADE, PM_DBS2_DOWNGRADE},
[PM_STA_SAP_MCC_24_5_2x2] = {PM_DBS2_DOWNGRADE, PM_DBS2_DOWNGRADE},
[PM_STA_SAP_DBS_1x1] = {PM_DBS2_DOWNGRADE, PM_DBS2_DOWNGRADE},
[PM_STA_SAP_DBS_2x2] = {PM_DBS2_DOWNGRADE, PM_DBS2_DOWNGRADE},
[PM_STA_P2P_GO_SCC_24_1x1] = {PM_NOP, PM_DBS2},
[PM_STA_P2P_GO_SCC_24_2x2] = {PM_NOP, PM_DBS2},
[PM_STA_P2P_GO_MCC_24_1x1] = {PM_NOP, PM_DBS2},
[PM_STA_P2P_GO_MCC_24_2x2] = {PM_NOP, PM_DBS2},
[PM_STA_P2P_GO_SCC_5_1x1] = {PM_DBS2, PM_NOP},
[PM_STA_P2P_GO_SCC_5_2x2] = {PM_DBS2_DOWNGRADE, PM_NOP},
[PM_STA_P2P_GO_MCC_5_1x1] = {PM_DBS2, PM_NOP},
[PM_STA_P2P_GO_MCC_5_2x2] = {PM_DBS2_DOWNGRADE, PM_NOP},
[PM_STA_P2P_GO_MCC_24_5_1x1] = {PM_DBS2_DOWNGRADE, PM_DBS2_DOWNGRADE},
[PM_STA_P2P_GO_MCC_24_5_2x2] = {PM_DBS2_DOWNGRADE, PM_DBS2_DOWNGRADE},
[PM_STA_P2P_GO_DBS_1x1] = {PM_DBS2_DOWNGRADE, PM_DBS2_DOWNGRADE},
[PM_STA_P2P_GO_DBS_2x2] = {PM_DBS2_DOWNGRADE, PM_DBS2_DOWNGRADE},
[PM_STA_P2P_CLI_SCC_24_1x1] = {PM_NOP, PM_DBS2},
[PM_STA_P2P_CLI_SCC_24_2x2] = {PM_NOP, PM_DBS2},
[PM_STA_P2P_CLI_MCC_24_1x1] = {PM_NOP, PM_DBS2},
[PM_STA_P2P_CLI_MCC_24_2x2] = {PM_NOP, PM_DBS2},
[PM_STA_P2P_CLI_SCC_5_1x1] = {PM_DBS2, PM_NOP},
[PM_STA_P2P_CLI_SCC_5_2x2] = {PM_DBS2, PM_NOP},
[PM_STA_P2P_CLI_MCC_5_1x1] = {PM_DBS2, PM_NOP},
[PM_STA_P2P_CLI_MCC_5_2x2] = {PM_DBS2, PM_NOP},
[PM_STA_P2P_CLI_MCC_24_5_1x1] = {PM_NOP, PM_DBS2},
[PM_STA_P2P_CLI_MCC_24_5_2x2] = {PM_NOP, PM_DBS2},
[PM_STA_P2P_CLI_DBS_1x1] = {PM_NOP, PM_DBS2},
[PM_STA_P2P_CLI_DBS_2x2] = {PM_NOP, PM_DBS2},
[PM_P2P_GO_P2P_CLI_SCC_24_1x1] = {PM_NOP, PM_DBS2},
[PM_P2P_GO_P2P_CLI_SCC_24_2x2] = {PM_NOP, PM_DBS2},
[PM_P2P_GO_P2P_CLI_MCC_24_1x1] = {PM_NOP, PM_DBS2},
[PM_P2P_GO_P2P_CLI_MCC_24_2x2] = {PM_NOP, PM_DBS2},
[PM_P2P_GO_P2P_CLI_SCC_5_1x1] = {PM_DBS2, PM_NOP},
[PM_P2P_GO_P2P_CLI_SCC_5_2x2] = {PM_DBS2_DOWNGRADE, PM_NOP},
[PM_P2P_GO_P2P_CLI_MCC_5_1x1] = {PM_DBS2, PM_NOP},
[PM_P2P_GO_P2P_CLI_MCC_5_2x2] = {PM_DBS2_DOWNGRADE, PM_NOP},
[PM_P2P_GO_P2P_CLI_MCC_24_5_1x1] = {PM_DBS2_DOWNGRADE,
PM_DBS2_DOWNGRADE},
[PM_P2P_GO_P2P_CLI_MCC_24_5_2x2] = {PM_DBS2_DOWNGRADE,
PM_DBS2_DOWNGRADE},
[PM_P2P_GO_P2P_CLI_DBS_1x1] = {PM_DBS2_DOWNGRADE, PM_DBS2_DOWNGRADE},
[PM_P2P_GO_P2P_CLI_DBS_2x2] = {PM_DBS2_DOWNGRADE, PM_DBS2_DOWNGRADE},
[PM_P2P_GO_SAP_SCC_24_1x1] = {PM_NOP, PM_DBS2},
[PM_P2P_GO_SAP_SCC_24_2x2] = {PM_NOP, PM_DBS2},
[PM_P2P_GO_SAP_MCC_24_1x1] = {PM_NOP, PM_DBS2},
[PM_P2P_GO_SAP_MCC_24_2x2] = {PM_NOP, PM_DBS2},
[PM_P2P_GO_SAP_SCC_5_1x1] = {PM_DBS2, PM_NOP},
[PM_P2P_GO_SAP_SCC_5_2x2] = {PM_DBS2_DOWNGRADE, PM_NOP},
[PM_P2P_GO_SAP_MCC_5_1x1] = {PM_DBS2, PM_NOP},
[PM_P2P_GO_SAP_MCC_5_2x2] = {PM_DBS2_DOWNGRADE, PM_NOP},
[PM_P2P_GO_SAP_MCC_24_5_1x1] = {PM_DBS2_DOWNGRADE, PM_DBS2_DOWNGRADE},
[PM_P2P_GO_SAP_MCC_24_5_2x2] = {PM_DBS2_DOWNGRADE, PM_DBS2_DOWNGRADE},
[PM_P2P_GO_SAP_DBS_1x1] = {PM_DBS2_DOWNGRADE, PM_DBS2_DOWNGRADE},
[PM_P2P_GO_SAP_DBS_2x2] = {PM_DBS2_DOWNGRADE, PM_DBS2_DOWNGRADE},
[PM_P2P_CLI_SAP_SCC_24_1x1] = {PM_NOP, PM_DBS2},
[PM_P2P_CLI_SAP_SCC_24_2x2] = {PM_NOP, PM_DBS2},
[PM_P2P_CLI_SAP_MCC_24_1x1] = {PM_NOP, PM_DBS2},
[PM_P2P_CLI_SAP_MCC_24_2x2] = {PM_NOP, PM_DBS2},
[PM_P2P_CLI_SAP_SCC_5_1x1] = {PM_DBS2, PM_NOP},
[PM_P2P_CLI_SAP_SCC_5_2x2] = {PM_DBS2_DOWNGRADE, PM_NOP},
[PM_P2P_CLI_SAP_MCC_5_1x1] = {PM_DBS2, PM_NOP},
[PM_P2P_CLI_SAP_MCC_5_2x2] = {PM_DBS2_DOWNGRADE, PM_NOP},
[PM_P2P_CLI_SAP_MCC_24_5_1x1] = {PM_DBS2_DOWNGRADE, PM_DBS2_DOWNGRADE},
[PM_P2P_CLI_SAP_MCC_24_5_2x2] = {PM_DBS2_DOWNGRADE, PM_DBS2_DOWNGRADE},
[PM_P2P_CLI_SAP_DBS_1x1] = {PM_DBS2_DOWNGRADE, PM_DBS2_DOWNGRADE},
[PM_P2P_CLI_SAP_DBS_2x2] = {PM_DBS2_DOWNGRADE, PM_DBS2_DOWNGRADE},
[PM_SAP_SAP_SCC_24_1x1] = {PM_NOP, PM_DBS2},
[PM_SAP_SAP_SCC_24_2x2] = {PM_NOP, PM_DBS2},
[PM_SAP_SAP_MCC_24_1x1] = {PM_NOP, PM_DBS2},
[PM_SAP_SAP_MCC_24_2x2] = {PM_NOP, PM_DBS2},
[PM_SAP_SAP_SCC_5_1x1] = {PM_DBS2, PM_NOP},
[PM_SAP_SAP_SCC_5_2x2] = {PM_DBS2_DOWNGRADE, PM_NOP},
[PM_SAP_SAP_MCC_5_1x1] = {PM_DBS2, PM_NOP},
[PM_SAP_SAP_MCC_5_2x2] = {PM_DBS2_DOWNGRADE, PM_NOP},
[PM_SAP_SAP_MCC_24_5_1x1] = {PM_DBS2_DOWNGRADE, PM_DBS2_DOWNGRADE},
[PM_SAP_SAP_MCC_24_5_2x2] = {PM_DBS2_DOWNGRADE, PM_DBS2_DOWNGRADE},
[PM_SAP_SAP_DBS_1x1] = {PM_DBS2_DOWNGRADE, PM_DBS2_DOWNGRADE},
[PM_SAP_SAP_DBS_2x2] = {PM_DBS2_DOWNGRADE, PM_DBS2_DOWNGRADE},
};
#endif

View File

@@ -1,150 +0,0 @@
/*
* Copyright (c) 2012-2018, 2020 The Linux Foundation. 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 __WLAN_POLICY_MGR_TABLES_2X2_5G_1X1_2G_DBS_H
#define __WLAN_POLICY_MGR_TABLES_2X2_5G_1X1_2G_DBS_H
#include "wlan_policy_mgr_api.h"
/**
* next_action_two_connection_table - table which provides next
* action while a new connection is coming up, with one
* connection already in the system
*/
static policy_mgr_next_action_two_connection_table_type
pm_next_action_two_connection_dbs_2x2_5g_1x1_2g_table = {
[PM_STA_24_1x1] = {PM_NOP, PM_DBS1},
[PM_STA_24_2x2] = {PM_NOP, PM_DBS1},
[PM_STA_5_1x1] = {PM_DBS1, PM_NOP},
[PM_STA_5_2x2] = {PM_DBS1, PM_NOP},
[PM_P2P_CLI_24_1x1] = {PM_NOP, PM_DBS1},
[PM_P2P_CLI_24_2x2] = {PM_NOP, PM_DBS1},
[PM_P2P_CLI_5_1x1] = {PM_DBS1, PM_NOP},
[PM_P2P_CLI_5_2x2] = {PM_DBS1, PM_NOP},
[PM_P2P_GO_24_1x1] = {PM_NOP, PM_DBS1},
[PM_P2P_GO_24_2x2] = {PM_NOP, PM_DBS1_DOWNGRADE},
[PM_P2P_GO_5_1x1] = {PM_DBS1, PM_NOP},
[PM_P2P_GO_5_2x2] = {PM_DBS1, PM_NOP},
[PM_SAP_24_1x1] = {PM_NOP, PM_DBS1},
[PM_SAP_24_2x2] = {PM_NOP, PM_DBS1_DOWNGRADE},
[PM_SAP_5_1x1] = {PM_DBS1, PM_NOP},
[PM_SAP_5_2x2] = {PM_DBS1, PM_NOP},
};
/**
* next_action_three_connection_table - table which provides next
* action while a new connection is coming up, with two
* connections already in the system
*/
static policy_mgr_next_action_three_connection_table_type
pm_next_action_three_connection_dbs_2x2_5g_1x1_2g_table = {
[PM_STA_SAP_SCC_24_1x1] = {PM_NOP, PM_DBS1},
[PM_STA_SAP_SCC_24_2x2] = {PM_NOP, PM_DBS1_DOWNGRADE},
[PM_STA_SAP_MCC_24_1x1] = {PM_NOP, PM_DBS1},
[PM_STA_SAP_MCC_24_2x2] = {PM_NOP, PM_DBS1_DOWNGRADE},
[PM_STA_SAP_SCC_5_1x1] = {PM_DBS1, PM_NOP},
[PM_STA_SAP_SCC_5_2x2] = {PM_DBS1, PM_NOP},
[PM_STA_SAP_MCC_5_1x1] = {PM_DBS1, PM_NOP},
[PM_STA_SAP_MCC_5_2x2] = {PM_DBS1, PM_NOP},
[PM_STA_SAP_MCC_24_5_1x1] = {PM_DBS1_DOWNGRADE, PM_DBS1_DOWNGRADE},
[PM_STA_SAP_MCC_24_5_2x2] = {PM_DBS1_DOWNGRADE, PM_DBS1_DOWNGRADE},
[PM_STA_SAP_DBS_1x1] = {PM_DBS1_DOWNGRADE, PM_DBS1_DOWNGRADE},
[PM_STA_SAP_DBS_2x2] = {PM_DBS1_DOWNGRADE, PM_DBS1_DOWNGRADE},
[PM_STA_P2P_GO_SCC_24_1x1] = {PM_NOP, PM_DBS1},
[PM_STA_P2P_GO_SCC_24_2x2] = {PM_NOP, PM_DBS1_DOWNGRADE},
[PM_STA_P2P_GO_MCC_24_1x1] = {PM_NOP, PM_DBS1},
[PM_STA_P2P_GO_MCC_24_2x2] = {PM_NOP, PM_DBS1_DOWNGRADE},
[PM_STA_P2P_GO_SCC_5_1x1] = {PM_DBS1, PM_NOP},
[PM_STA_P2P_GO_SCC_5_2x2] = {PM_DBS1, PM_NOP},
[PM_STA_P2P_GO_MCC_5_1x1] = {PM_DBS1, PM_NOP},
[PM_STA_P2P_GO_MCC_5_2x2] = {PM_DBS1, PM_NOP},
[PM_STA_P2P_GO_MCC_24_5_1x1] = {PM_DBS1_DOWNGRADE, PM_DBS1_DOWNGRADE},
[PM_STA_P2P_GO_MCC_24_5_2x2] = {PM_DBS1_DOWNGRADE, PM_DBS1_DOWNGRADE},
[PM_STA_P2P_GO_DBS_1x1] = {PM_DBS1_DOWNGRADE, PM_DBS1_DOWNGRADE},
[PM_STA_P2P_GO_DBS_2x2] = {PM_DBS1_DOWNGRADE, PM_DBS1_DOWNGRADE},
[PM_STA_P2P_CLI_SCC_24_1x1] = {PM_NOP, PM_DBS1},
[PM_STA_P2P_CLI_SCC_24_2x2] = {PM_NOP, PM_DBS1},
[PM_STA_P2P_CLI_MCC_24_1x1] = {PM_NOP, PM_DBS1},
[PM_STA_P2P_CLI_MCC_24_2x2] = {PM_NOP, PM_DBS1},
[PM_STA_P2P_CLI_SCC_5_1x1] = {PM_DBS1, PM_NOP},
[PM_STA_P2P_CLI_SCC_5_2x2] = {PM_DBS1, PM_NOP},
[PM_STA_P2P_CLI_MCC_5_1x1] = {PM_DBS1, PM_NOP},
[PM_STA_P2P_CLI_MCC_5_2x2] = {PM_DBS1, PM_NOP},
[PM_STA_P2P_CLI_MCC_24_5_1x1] = {PM_DBS1, PM_DBS1},
[PM_STA_P2P_CLI_MCC_24_5_2x2] = {PM_DBS1, PM_DBS1},
[PM_STA_P2P_CLI_DBS_1x1] = {PM_DBS1, PM_DBS1},
[PM_STA_P2P_CLI_DBS_2x2] = {PM_DBS1, PM_DBS1},
[PM_P2P_GO_P2P_CLI_SCC_24_1x1] = {PM_NOP, PM_DBS1},
[PM_P2P_GO_P2P_CLI_SCC_24_2x2] = {PM_NOP, PM_DBS1_DOWNGRADE},
[PM_P2P_GO_P2P_CLI_MCC_24_1x1] = {PM_NOP, PM_DBS1},
[PM_P2P_GO_P2P_CLI_MCC_24_2x2] = {PM_NOP, PM_DBS1_DOWNGRADE},
[PM_P2P_GO_P2P_CLI_SCC_5_1x1] = {PM_DBS1, PM_NOP},
[PM_P2P_GO_P2P_CLI_SCC_5_2x2] = {PM_DBS1, PM_NOP},
[PM_P2P_GO_P2P_CLI_MCC_5_1x1] = {PM_DBS1, PM_NOP},
[PM_P2P_GO_P2P_CLI_MCC_5_2x2] = {PM_DBS1, PM_NOP},
[PM_P2P_GO_P2P_CLI_MCC_24_5_1x1] = {PM_DBS1_DOWNGRADE,
PM_DBS1_DOWNGRADE},
[PM_P2P_GO_P2P_CLI_MCC_24_5_2x2] = {PM_DBS1_DOWNGRADE,
PM_DBS1_DOWNGRADE},
[PM_P2P_GO_P2P_CLI_DBS_1x1] = {PM_DBS1_DOWNGRADE, PM_DBS1_DOWNGRADE},
[PM_P2P_GO_P2P_CLI_DBS_2x2] = {PM_DBS1_DOWNGRADE, PM_DBS1_DOWNGRADE},
[PM_P2P_GO_SAP_SCC_24_1x1] = {PM_NOP, PM_DBS1},
[PM_P2P_GO_SAP_SCC_24_2x2] = {PM_NOP, PM_DBS1_DOWNGRADE},
[PM_P2P_GO_SAP_MCC_24_1x1] = {PM_NOP, PM_DBS1},
[PM_P2P_GO_SAP_MCC_24_2x2] = {PM_NOP, PM_DBS1_DOWNGRADE},
[PM_P2P_GO_SAP_SCC_5_1x1] = {PM_DBS1, PM_NOP},
[PM_P2P_GO_SAP_SCC_5_2x2] = {PM_DBS1, PM_NOP},
[PM_P2P_GO_SAP_MCC_5_1x1] = {PM_DBS1, PM_NOP},
[PM_P2P_GO_SAP_MCC_5_2x2] = {PM_DBS1, PM_NOP},
[PM_P2P_GO_SAP_MCC_24_5_1x1] = {PM_DBS1_DOWNGRADE, PM_DBS1_DOWNGRADE},
[PM_P2P_GO_SAP_MCC_24_5_2x2] = {PM_DBS1_DOWNGRADE, PM_DBS1_DOWNGRADE},
[PM_P2P_GO_SAP_DBS_1x1] = {PM_DBS1_DOWNGRADE, PM_DBS1_DOWNGRADE},
[PM_P2P_GO_SAP_DBS_2x2] = {PM_DBS1_DOWNGRADE, PM_DBS1_DOWNGRADE},
[PM_P2P_CLI_SAP_SCC_24_1x1] = {PM_NOP, PM_DBS1},
[PM_P2P_CLI_SAP_SCC_24_2x2] = {PM_NOP, PM_DBS1_DOWNGRADE},
[PM_P2P_CLI_SAP_MCC_24_1x1] = {PM_NOP, PM_DBS1},
[PM_P2P_CLI_SAP_MCC_24_2x2] = {PM_NOP, PM_DBS1_DOWNGRADE},
[PM_P2P_CLI_SAP_SCC_5_1x1] = {PM_DBS1, PM_NOP},
[PM_P2P_CLI_SAP_SCC_5_2x2] = {PM_DBS1, PM_NOP},
[PM_P2P_CLI_SAP_MCC_5_1x1] = {PM_DBS1, PM_NOP},
[PM_P2P_CLI_SAP_MCC_5_2x2] = {PM_DBS1, PM_NOP},
[PM_P2P_CLI_SAP_MCC_24_5_1x1] = {PM_DBS1_DOWNGRADE, PM_DBS1_DOWNGRADE},
[PM_P2P_CLI_SAP_MCC_24_5_2x2] = {PM_DBS1_DOWNGRADE, PM_DBS1_DOWNGRADE},
[PM_P2P_CLI_SAP_DBS_1x1] = {PM_DBS1_DOWNGRADE, PM_DBS1_DOWNGRADE},
[PM_P2P_CLI_SAP_DBS_2x2] = {PM_DBS1_DOWNGRADE, PM_DBS1_DOWNGRADE},
[PM_SAP_SAP_SCC_24_1x1] = {PM_NOP, PM_DBS1},
[PM_SAP_SAP_SCC_24_2x2] = {PM_NOP, PM_DBS1_DOWNGRADE},
[PM_SAP_SAP_MCC_24_1x1] = {PM_NOP, PM_DBS1},
[PM_SAP_SAP_MCC_24_2x2] = {PM_NOP, PM_DBS1_DOWNGRADE},
[PM_SAP_SAP_SCC_5_1x1] = {PM_DBS1, PM_NOP},
[PM_SAP_SAP_SCC_5_2x2] = {PM_DBS1, PM_NOP},
[PM_SAP_SAP_MCC_5_1x1] = {PM_DBS1, PM_NOP},
[PM_SAP_SAP_MCC_5_2x2] = {PM_DBS1, PM_NOP},
[PM_SAP_SAP_MCC_24_5_1x1] = {PM_DBS1_DOWNGRADE, PM_DBS1_DOWNGRADE},
[PM_SAP_SAP_MCC_24_5_2x2] = {PM_DBS1_DOWNGRADE, PM_DBS1_DOWNGRADE},
[PM_SAP_SAP_DBS_1x1] = {PM_DBS1_DOWNGRADE, PM_DBS1_DOWNGRADE},
[PM_SAP_SAP_DBS_2x2] = {PM_DBS1_DOWNGRADE, PM_DBS1_DOWNGRADE},
};
#endif

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,245 +0,0 @@
/*
* Copyright (c) 2018-2021 The Linux Foundation. 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 "wlan_policy_mgr_ucfg.h"
#include "wlan_policy_mgr_i.h"
#include "cfg_ucfg_api.h"
#include "wlan_policy_mgr_api.h"
static QDF_STATUS policy_mgr_init_cfg(struct wlan_objmgr_psoc *psoc)
{
struct policy_mgr_psoc_priv_obj *pm_ctx;
struct policy_mgr_cfg *cfg;
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
policy_mgr_err("pm_ctx is NULL");
return QDF_STATUS_E_FAILURE;
}
cfg = &pm_ctx->cfg;
cfg->mcc_to_scc_switch = cfg_get(psoc, CFG_MCC_TO_SCC_SWITCH);
cfg->sys_pref = cfg_get(psoc, CFG_CONC_SYS_PREF);
cfg->max_conc_cxns = cfg_get(psoc, CFG_MAX_CONC_CXNS);
cfg->conc_rule1 = cfg_get(psoc, CFG_ENABLE_CONC_RULE1);
cfg->conc_rule2 = cfg_get(psoc, CFG_ENABLE_CONC_RULE2);
cfg->pcl_band_priority = cfg_get(psoc, CFG_PCL_BAND_PRIORITY);
cfg->dbs_selection_plcy = cfg_get(psoc, CFG_DBS_SELECTION_PLCY);
cfg->vdev_priority_list = cfg_get(psoc, CFG_VDEV_CUSTOM_PRIORITY_LIST);
cfg->chnl_select_plcy = cfg_get(psoc, CFG_CHNL_SELECT_LOGIC_CONC);
cfg->enable_mcc_adaptive_sch =
cfg_get(psoc, CFG_ENABLE_MCC_ADAPTIVE_SCH_ENABLED_NAME);
cfg->enable_sta_cxn_5g_band =
cfg_get(psoc, CFG_ENABLE_STA_CONNECTION_IN_5GHZ);
cfg->allow_mcc_go_diff_bi =
cfg_get(psoc, CFG_ALLOW_MCC_GO_DIFF_BI);
cfg->dual_mac_feature =
cfg_get(psoc, CFG_DUAL_MAC_FEATURE_DISABLE);
cfg->sbs_enable =
cfg_get(psoc, CFG_ENABLE_SBS);
cfg->is_force_1x1_enable =
cfg_get(psoc, CFG_FORCE_1X1_FEATURE);
cfg->sta_sap_scc_on_dfs_chnl =
cfg_get(psoc, CFG_STA_SAP_SCC_ON_DFS_CHAN);
/*
* Force set sta_sap_scc_on_dfs_chnl on Non-DBS HW so that standalone
* SAP is not allowed on DFS channel on non-DBS HW, Also, force SCC in
* case of STA+SAP
*/
if (cfg->sta_sap_scc_on_dfs_chnl == 2 &&
!cfg_get(psoc, CFG_ENABLE_DFS_MASTER_CAPABILITY))
cfg->sta_sap_scc_on_dfs_chnl = 0;
cfg->nan_sap_scc_on_lte_coex_chnl =
cfg_get(psoc, CFG_NAN_SAP_SCC_ON_LTE_COEX_CHAN);
cfg->sta_sap_scc_on_lte_coex_chnl =
cfg_get(psoc, CFG_STA_SAP_SCC_ON_LTE_COEX_CHAN);
cfg->sap_mandatory_chnl_enable =
cfg_get(psoc, CFG_ENABLE_SAP_MANDATORY_CHAN_LIST);
cfg->mark_indoor_chnl_disable =
cfg_get(psoc, CFG_MARK_INDOOR_AS_DISABLE_FEATURE);
cfg->go_force_scc = cfg_get(psoc, CFG_P2P_GO_ENABLE_FORCE_SCC);
return QDF_STATUS_SUCCESS;
}
static void policy_mgr_deinit_cfg(struct wlan_objmgr_psoc *psoc)
{
struct policy_mgr_psoc_priv_obj *pm_ctx;
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
policy_mgr_err("pm_ctx is NULL");
return;
}
qdf_mem_zero(&pm_ctx->cfg, sizeof(pm_ctx->cfg));
}
QDF_STATUS ucfg_policy_mgr_psoc_open(struct wlan_objmgr_psoc *psoc)
{
QDF_STATUS status;
status = policy_mgr_init_cfg(psoc);
if (QDF_IS_STATUS_ERROR(status)) {
policy_mgr_err("pm_ctx is NULL");
return status;
}
status = policy_mgr_psoc_open(psoc);
if (QDF_IS_STATUS_ERROR(status)) {
policy_mgr_err("psoc open fail");
policy_mgr_psoc_close(psoc);
return status;
}
return QDF_STATUS_SUCCESS;
}
void ucfg_policy_mgr_psoc_close(struct wlan_objmgr_psoc *psoc)
{
policy_mgr_psoc_close(psoc);
policy_mgr_deinit_cfg(psoc);
}
QDF_STATUS ucfg_policy_mgr_get_mcc_scc_switch(struct wlan_objmgr_psoc *psoc,
uint8_t *mcc_scc_switch)
{
return policy_mgr_get_mcc_scc_switch(psoc, mcc_scc_switch);
}
QDF_STATUS ucfg_policy_mgr_get_sys_pref(struct wlan_objmgr_psoc *psoc,
uint8_t *sys_pref)
{
return policy_mgr_get_sys_pref(psoc, sys_pref);
}
QDF_STATUS ucfg_policy_mgr_set_sys_pref(struct wlan_objmgr_psoc *psoc,
uint8_t sys_pref)
{
return policy_mgr_set_sys_pref(psoc, sys_pref);
}
QDF_STATUS ucfg_policy_mgr_get_conc_rule1(struct wlan_objmgr_psoc *psoc,
uint8_t *conc_rule1)
{
return policy_mgr_get_conc_rule1(psoc, conc_rule1);
}
QDF_STATUS ucfg_policy_mgr_get_conc_rule2(struct wlan_objmgr_psoc *psoc,
uint8_t *conc_rule2)
{
return policy_mgr_get_conc_rule2(psoc, conc_rule2);
}
QDF_STATUS ucfg_policy_mgr_get_chnl_select_plcy(struct wlan_objmgr_psoc *psoc,
uint32_t *chnl_select_plcy)
{
return policy_mgr_get_chnl_select_plcy(psoc, chnl_select_plcy);
}
QDF_STATUS ucfg_policy_mgr_set_dynamic_mcc_adaptive_sch(
struct wlan_objmgr_psoc *psoc,
bool dynamic_mcc_adaptive_sch)
{
return policy_mgr_set_dynamic_mcc_adaptive_sch(
psoc, dynamic_mcc_adaptive_sch);
}
QDF_STATUS ucfg_policy_mgr_get_dynamic_mcc_adaptive_sch(
struct wlan_objmgr_psoc *psoc,
bool *dynamic_mcc_adaptive_sch)
{
return policy_mgr_get_dynamic_mcc_adaptive_sch(
psoc, dynamic_mcc_adaptive_sch);
}
QDF_STATUS ucfg_policy_mgr_get_mcc_adaptive_sch(struct wlan_objmgr_psoc *psoc,
bool *mcc_adaptive_sch)
{
return policy_mgr_get_mcc_adaptive_sch(psoc, mcc_adaptive_sch);
}
QDF_STATUS ucfg_policy_mgr_get_sta_cxn_5g_band(struct wlan_objmgr_psoc *psoc,
uint8_t *enable_sta_cxn_5g_band)
{
return policy_mgr_get_sta_cxn_5g_band(psoc, enable_sta_cxn_5g_band);
}
QDF_STATUS
ucfg_policy_mgr_get_allow_mcc_go_diff_bi(struct wlan_objmgr_psoc *psoc,
uint8_t *allow_mcc_go_diff_bi)
{
return policy_mgr_get_allow_mcc_go_diff_bi(psoc, allow_mcc_go_diff_bi);
}
QDF_STATUS ucfg_policy_mgr_get_dual_mac_feature(struct wlan_objmgr_psoc *psoc,
uint8_t *dual_mac_feature)
{
return policy_mgr_get_dual_mac_feature(psoc, dual_mac_feature);
}
QDF_STATUS ucfg_policy_mgr_get_force_1x1(struct wlan_objmgr_psoc *psoc,
uint8_t *force_1x1)
{
return policy_mgr_get_force_1x1(psoc, force_1x1);
}
QDF_STATUS
ucfg_policy_mgr_get_sta_sap_scc_on_dfs_chnl(struct wlan_objmgr_psoc *psoc,
uint8_t *sta_sap_scc_on_dfs_chnl)
{
return policy_mgr_get_sta_sap_scc_on_dfs_chnl(psoc,
sta_sap_scc_on_dfs_chnl);
}
bool
ucfg_policy_mgr_get_dfs_master_dynamic_enabled(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id)
{
return policy_mgr_get_dfs_master_dynamic_enabled(psoc, vdev_id);
}
QDF_STATUS
ucfg_policy_mgr_get_sta_sap_scc_lte_coex_chnl(struct wlan_objmgr_psoc *psoc,
uint8_t *sta_sap_scc_lte_coex)
{
return policy_mgr_get_sta_sap_scc_lte_coex_chnl(psoc,
sta_sap_scc_lte_coex);
}
QDF_STATUS
ucfg_policy_mgr_init_chan_avoidance(struct wlan_objmgr_psoc *psoc,
qdf_freq_t *chan_freq_list,
uint16_t chan_cnt)
{
return policy_mgr_init_chan_avoidance(psoc, chan_freq_list, chan_cnt);
}
QDF_STATUS ucfg_policy_mgr_get_sap_mandt_chnl(struct wlan_objmgr_psoc *psoc,
uint8_t *sap_mandt_chnl)
{
return policy_mgr_get_sap_mandt_chnl(psoc, sap_mandt_chnl);
}
QDF_STATUS
ucfg_policy_mgr_get_indoor_chnl_marking(struct wlan_objmgr_psoc *psoc,
uint8_t *indoor_chnl_marking)
{
return policy_mgr_get_indoor_chnl_marking(psoc, indoor_chnl_marking);
}

View File

@@ -1,160 +0,0 @@
/*
* Copyright (c) 2020, The Linux Foundation. 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.
*/
/*
* DOC: contains declarations for coex core functions
*/
#ifndef _WLAN_COEX_MAIN_API_H_
#define _WLAN_COEX_MAIN_API_H_
#ifdef FEATURE_COEX
#include "wlan_coex_ucfg_api.h"
#include "wmi_unified_param.h"
#include "wlan_objmgr_psoc_obj.h"
#include "wlan_objmgr_vdev_obj.h"
#define coex_err(params...) \
QDF_TRACE_ERROR(QDF_MODULE_ID_COEX, params)
#define coex_info(params...) \
QDF_TRACE_INFO(QDF_MODULE_ID_COEX, params)
#define coex_debug(params...) \
QDF_TRACE_DEBUG(QDF_MODULE_ID_COEX, params)
/**
* struct coex_psoc_obj - coex object definition
* @btc_chain_mode: BT Coex chain mode.
* @coex_config_updated: callback functions for each config type, which will
* be called when config is updated.
*/
struct coex_psoc_obj {
uint8_t btc_chain_mode;
update_coex_cb coex_config_updated[COEX_CONFIG_TYPE_MAX];
};
/**
* wlan_psoc_get_coex_obj() - private API to get coex object from psoc
* @psoc: psoc object
*
* Return: coex object
*/
#define wlan_psoc_get_coex_obj(psoc) \
wlan_psoc_get_coex_obj_fl(psoc, __func__, __LINE__)
static inline struct coex_psoc_obj *
wlan_psoc_get_coex_obj_fl(struct wlan_objmgr_psoc *psoc,
const char *func, uint32_t line)
{
struct coex_psoc_obj *psoc_obj;
psoc_obj = (struct coex_psoc_obj *)
wlan_objmgr_psoc_get_comp_private_obj(psoc,
WLAN_UMAC_COMP_COEX);
if (!psoc_obj) {
coex_err("%s:%u, Failed to get coex psoc object", func, line);
return NULL;
}
return psoc_obj;
}
/**
* wlan_coex_psoc_init() - API to initialize coex component
* @psoc: soc context
*
* Return: QDF_STATUS
*/
QDF_STATUS
wlan_coex_psoc_init(struct wlan_objmgr_psoc *psoc);
/**
* wlan_coex_psoc_deinit() - API to deinitialize coex component
* @psoc: soc context
*
* Return: QDF_STATUS
*/
QDF_STATUS
wlan_coex_psoc_deinit(struct wlan_objmgr_psoc *psoc);
/**
* wlan_coex_config_send() - private API to send coex config
* @vdev: pointer to vdev object
* @param: parameters of coex config
*
* Return: status of operation
*/
QDF_STATUS wlan_coex_config_send(struct wlan_objmgr_vdev *vdev,
struct coex_config_params *param);
/**
* wlan_coex_config_updated() - private API to notify that coex config
* is updated.
* @vdev: pointer to vdev object
* @type: type of coex config
*
* Return: status of operation
*/
QDF_STATUS
wlan_coex_config_updated(struct wlan_objmgr_vdev *vdev, uint8_t type);
/**
* wlan_coex_psoc_created_notification() - PSOC obj create callback
* @psoc: PSOC object
* @arg_list: Variable argument list
*
* This callback is registered with object manager during initialization to
* get notified when the object is created.
*
* Return: Success or Failure
*/
QDF_STATUS wlan_coex_psoc_created_notification(struct wlan_objmgr_psoc *psoc,
void *arg_list);
/**
* wlan_coex_psoc_destroyed_notification() - PSOC obj delete callback
* @psoc: PSOC object
* @arg_list: Variable argument list
*
* This callback is registered with object manager during initialization to
* get notified when the object is deleted.
*
* Return: Success or Failure
*/
QDF_STATUS wlan_coex_psoc_destroyed_notification(struct wlan_objmgr_psoc *psoc,
void *arg_list);
/**
* wlan_coex_psoc_set_btc_chain_mode() - private API to set BT coex chain mode
* for psoc
* @psoc: pointer to psoc object
* @val: BT coex chain mode
*
* Return : status of operation
*/
QDF_STATUS
wlan_coex_psoc_set_btc_chain_mode(struct wlan_objmgr_psoc *psoc, uint8_t val);
/**
* wlan_coex_psoc_get_btc_chain_mode() - private API to get BT coex chain mode
* from psoc
* @psoc: pointer to psoc object
* @val: pointer to BT coex chain mode
*
* Return : status of operation
*/
QDF_STATUS
wlan_coex_psoc_get_btc_chain_mode(struct wlan_objmgr_psoc *psoc, uint8_t *val);
#endif
#endif

View File

@@ -1,160 +0,0 @@
/*
* Copyright (c) 2020, The Linux Foundation. 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.
*/
/*
* DOC: contains definitions for coex core functions
*/
#include <wlan_coex_ucfg_api.h>
#include <wlan_coex_tgt_api.h>
#include <wlan_coex_main.h>
QDF_STATUS wlan_coex_psoc_created_notification(struct wlan_objmgr_psoc *psoc,
void *arg_list)
{
struct coex_psoc_obj *psoc_obj;
QDF_STATUS status;
psoc_obj = qdf_mem_malloc(sizeof(*psoc_obj));
if (!psoc_obj)
return QDF_STATUS_E_NOMEM;
psoc_obj->btc_chain_mode = WLAN_COEX_BTC_CHAIN_MODE_UNSETTLED;
/* Attach scan private date to psoc */
status = wlan_objmgr_psoc_component_obj_attach(psoc,
WLAN_UMAC_COMP_COEX,
psoc_obj,
QDF_STATUS_SUCCESS);
if (QDF_IS_STATUS_ERROR(status)) {
coex_err("Failed to attach psoc coex component");
qdf_mem_free(psoc_obj);
} else {
coex_debug("Coex object attach to psoc successful");
}
return status;
}
QDF_STATUS wlan_coex_psoc_destroyed_notification(struct wlan_objmgr_psoc *psoc,
void *arg_list)
{
void *psoc_obj;
QDF_STATUS status;
psoc_obj = wlan_psoc_get_coex_obj(psoc);
if (!psoc_obj)
return QDF_STATUS_E_FAILURE;
status = wlan_objmgr_psoc_component_obj_detach(psoc,
WLAN_UMAC_COMP_COEX,
psoc_obj);
if (QDF_IS_STATUS_ERROR(status))
coex_err("Failed to detach psoc coex component");
qdf_mem_free(psoc_obj);
return status;
}
QDF_STATUS
wlan_coex_psoc_init(struct wlan_objmgr_psoc *psoc)
{
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_coex_psoc_deinit(struct wlan_objmgr_psoc *psoc)
{
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_coex_config_send(struct wlan_objmgr_vdev *vdev,
struct coex_config_params *param)
{
QDF_STATUS status;
status = tgt_send_coex_config(vdev, param);
if (QDF_IS_STATUS_ERROR(status))
coex_err("failed to send coex config");
return status;
}
QDF_STATUS
wlan_coex_config_updated(struct wlan_objmgr_vdev *vdev, uint8_t type)
{
struct wlan_objmgr_psoc *psoc;
struct coex_psoc_obj *coex_obj;
QDF_STATUS status = QDF_STATUS_SUCCESS;
if (!vdev) {
coex_err("NULL vdev");
return QDF_STATUS_E_INVAL;
}
if (type >= COEX_CONFIG_TYPE_MAX) {
coex_err("config type out of range: %d", type);
return QDF_STATUS_E_INVAL;
}
psoc = wlan_vdev_get_psoc(vdev);
if (!psoc) {
coex_err("NULL psoc");
return QDF_STATUS_E_INVAL;
}
coex_obj = wlan_psoc_get_coex_obj(psoc);
if (!coex_obj)
return QDF_STATUS_E_INVAL;
if (coex_obj->coex_config_updated[type])
status = coex_obj->coex_config_updated[type](vdev);
return status;
}
QDF_STATUS
wlan_coex_psoc_set_btc_chain_mode(struct wlan_objmgr_psoc *psoc, uint8_t val)
{
struct coex_psoc_obj *coex_obj;
coex_obj = wlan_psoc_get_coex_obj(psoc);
if (!coex_obj)
return QDF_STATUS_E_INVAL;
coex_obj->btc_chain_mode = val;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_coex_psoc_get_btc_chain_mode(struct wlan_objmgr_psoc *psoc, uint8_t *val)
{
struct coex_psoc_obj *coex_obj;
if (!val) {
coex_err("invalid param for getting btc chain mode");
return QDF_STATUS_E_INVAL;
}
coex_obj = wlan_psoc_get_coex_obj(psoc);
if (!coex_obj)
return QDF_STATUS_E_INVAL;
*val = coex_obj->btc_chain_mode;
return QDF_STATUS_SUCCESS;
}

View File

@@ -1,38 +0,0 @@
/*
* Copyright (c) 2020, The Linux Foundation. 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.
*/
/*
* DOC: contains coex south bound interface definitions
*/
#ifndef _WLAN_COEX_TGT_API_H_
#define _WLAN_COEX_TGT_API_H_
#ifdef FEATURE_COEX
struct coex_config_params;
/**
* tgt_send_coex_config() - invoke target_if send coex config
* @vdev: vdev object
* @param: coex config parameters
*
* Return: QDF_STATUS
*/
QDF_STATUS
tgt_send_coex_config(struct wlan_objmgr_vdev *vdev,
struct coex_config_params *param);
#endif
#endif

View File

@@ -1,120 +0,0 @@
/*
* Copyright (c) 2020, The Linux Foundation. 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.
*/
/*
* DOC: contains coex north bound interface declarations
*/
#ifndef _WLAN_COEX_UCFG_API_H_
#define _WLAN_COEX_UCFG_API_H_
#include "qdf_status.h"
#include <wlan_objmgr_vdev_obj.h>
#include <wlan_objmgr_psoc_obj.h>
#include "qca_vendor.h"
#define WLAN_COEX_BTC_CHAIN_MODE_SHARED QCA_BTC_CHAIN_SHARED
#define WLAN_COEX_BTC_CHAIN_MODE_SEPARATED QCA_BTC_CHAIN_SEPARATED
#define WLAN_COEX_BTC_CHAIN_MODE_UNSETTLED 0xFF
/**
* enum coex_config_type - coex config type definitions
* @COEX_CONFIG_BTC_CHAIN_MODE: config BT coex chain mode
* @COEX_CONFIG_TYPE_MAX: max value
*/
enum coex_config_type {
COEX_CONFIG_BTC_CHAIN_MODE,
/* keep last */
COEX_CONFIG_TYPE_MAX,
};
/**
* typedef update_coex_cb() - cb to inform coex config
* @vdev: vdev pointer
*
* Return: void
*/
typedef QDF_STATUS (*update_coex_cb)(struct wlan_objmgr_vdev *vdev);
#ifdef FEATURE_COEX
/**
* ucfg_coex_register_cfg_updated_handler() - API to register coex config
* updated handler.
* @psoc: pointer to psoc object
* @type: type of coex config
* @handler: handler to be registered
*
* Return: status of operation
*/
QDF_STATUS
ucfg_coex_register_cfg_updated_handler(struct wlan_objmgr_psoc *psoc,
enum coex_config_type type,
update_coex_cb handler);
/**
* ucfg_coex_psoc_set_btc_chain_mode() - API to set BT coex chain mode for psoc
* @psoc: pointer to psoc object
* @val: BT coex chain mode
*
* Return : status of operation
*/
QDF_STATUS
ucfg_coex_psoc_set_btc_chain_mode(struct wlan_objmgr_psoc *psoc, uint8_t val);
/**
* ucfg_coex_psoc_get_btc_chain_mode() - API to get BT coex chain mode from psoc
* @psoc: pointer to psoc object
* @val: pointer to BT coex chain mode
*
* Return : status of operation
*/
QDF_STATUS
ucfg_coex_psoc_get_btc_chain_mode(struct wlan_objmgr_psoc *psoc, uint8_t *val);
/**
* ucfg_coex_send_btc_chain_mode() - API to send BT coex config to target if
* @vdev: pointer to vdev object
* @mode: BT coex chain mode
*
* Return: status of operation
*/
QDF_STATUS
ucfg_coex_send_btc_chain_mode(struct wlan_objmgr_vdev *vdev, uint8_t mode);
#else
static inline QDF_STATUS
ucfg_coex_register_cfg_updated_handler(struct wlan_objmgr_psoc *psoc,
enum coex_config_type type,
update_coex_cb handler)
{
return QDF_STATUS_SUCCESS;
}
static inline QDF_STATUS
ucfg_coex_psoc_get_btc_chain_mode(struct wlan_objmgr_psoc *psoc, uint8_t *val)
{
if (val)
*val = WLAN_COEX_BTC_CHAIN_MODE_UNSETTLED;
return QDF_STATUS_SUCCESS;
}
static inline QDF_STATUS
ucfg_coex_send_btc_chain_mode(struct wlan_objmgr_vdev *vdev, uint8_t mode)
{
return QDF_STATUS_SUCCESS;
}
#endif
#endif

View File

@@ -1,63 +0,0 @@
/*
* Copyright (c) 2020, The Linux Foundation. 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.
*/
/**
* DOC: wlan_coex_utils_api.h
*
* This header file provides declaration of public APIs exposed to other UMAC
* components.
*/
#ifndef _WLAN_COEX_UTILS_API_H_
#define _WLAN_COEX_UTILS_API_H_
#include <wlan_objmgr_psoc_obj.h>
/*
* wlan_coex_init() - Coex module initialization API
*
* Return: QDF_STATUS
*/
QDF_STATUS wlan_coex_init(void);
/*
* wlan_coex_deinit() - Coex module deinitialization API
*
* Return: QDF_STATUS
*/
QDF_STATUS wlan_coex_deinit(void);
/**
* wlan_coex_psoc_open() - Open coex component
* @psoc: soc context
*
* This function gets called when dispatcher opening.
*
* Return: QDF_STATUS_SUCCESS - in case of success
*/
QDF_STATUS
wlan_coex_psoc_open(struct wlan_objmgr_psoc *psoc);
/**
* wlan_coex_psoc_close() - Close coex component
* @psoc: soc context
*
* This function gets called when dispatcher closing.
*
* Return: QDF_STATUS_SUCCESS - in case of success
*/
QDF_STATUS
wlan_coex_psoc_close(struct wlan_objmgr_psoc *psoc);
#endif

View File

@@ -1,84 +0,0 @@
/*
* Copyright (c) 2020, The Linux Foundation. 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.
*/
/*
* DOC: contains coex south bound interface definitions
*/
#include <wlan_coex_main.h>
#include <wlan_coex_tgt_api.h>
#include <wlan_lmac_if_def.h>
#include "wlan_objmgr_pdev_obj.h"
static inline struct wlan_lmac_if_coex_tx_ops *
wlan_psoc_get_coex_txops(struct wlan_objmgr_psoc *psoc)
{
struct wlan_lmac_if_tx_ops *tx_ops;
tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
if (!tx_ops) {
coex_err("tx_ops is NULL");
return NULL;
}
return &tx_ops->coex_ops;
}
static inline struct wlan_lmac_if_coex_tx_ops *
wlan_vdev_get_coex_txops(struct wlan_objmgr_vdev *vdev)
{
struct wlan_objmgr_psoc *psoc;
psoc = wlan_vdev_get_psoc(vdev);
if (!psoc) {
coex_err("NULL psoc");
return NULL;
}
return wlan_psoc_get_coex_txops(psoc);
}
QDF_STATUS
tgt_send_coex_config(struct wlan_objmgr_vdev *vdev,
struct coex_config_params *param)
{
struct wlan_lmac_if_coex_tx_ops *coex_ops;
struct wlan_objmgr_psoc *psoc;
struct wlan_objmgr_pdev *pdev;
if (!vdev) {
coex_err("NULL vdev");
return QDF_STATUS_E_NULL_VALUE;
}
psoc = wlan_vdev_get_psoc(vdev);
if (!psoc) {
coex_err("NULL psoc");
return QDF_STATUS_E_NULL_VALUE;
}
pdev = wlan_vdev_get_pdev(vdev);
if (!pdev) {
coex_err("NULL pdev");
return QDF_STATUS_E_NULL_VALUE;
}
coex_ops = wlan_psoc_get_coex_txops(psoc);
if (coex_ops && coex_ops->coex_config_send)
return coex_ops->coex_config_send(pdev, param);
return QDF_STATUS_SUCCESS;
}

View File

@@ -1,74 +0,0 @@
/*
* Copyright (c) 2020, The Linux Foundation. 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.
*/
/*
* DOC: contains coex north bound interface definitions
*/
#include <wlan_coex_main.h>
#include <wlan_coex_ucfg_api.h>
#include "wmi_unified.h"
QDF_STATUS
ucfg_coex_register_cfg_updated_handler(struct wlan_objmgr_psoc *psoc,
enum coex_config_type type,
update_coex_cb handler)
{
struct coex_psoc_obj *coex_obj;
if (type >= COEX_CONFIG_TYPE_MAX) {
coex_err("invalid coex type: %d", type);
return QDF_STATUS_E_INVAL;
}
coex_obj = wlan_psoc_get_coex_obj(psoc);
if (!coex_obj)
return QDF_STATUS_E_INVAL;
coex_obj->coex_config_updated[type] = handler;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
ucfg_coex_psoc_set_btc_chain_mode(struct wlan_objmgr_psoc *psoc, uint8_t val)
{
return wlan_coex_psoc_set_btc_chain_mode(psoc, val);
}
QDF_STATUS
ucfg_coex_psoc_get_btc_chain_mode(struct wlan_objmgr_psoc *psoc, uint8_t *val)
{
return wlan_coex_psoc_get_btc_chain_mode(psoc, val);
}
QDF_STATUS
ucfg_coex_send_btc_chain_mode(struct wlan_objmgr_vdev *vdev, uint8_t mode)
{
struct coex_config_params param = {0};
if (mode != WLAN_COEX_BTC_CHAIN_MODE_SHARED &&
mode != WLAN_COEX_BTC_CHAIN_MODE_SEPARATED)
return QDF_STATUS_E_INVAL;
param.vdev_id = wlan_vdev_get_id(vdev);
param.config_type = WMI_COEX_CONFIG_BTCOEX_SEPARATE_CHAIN_MODE;
param.config_arg1 = mode;
coex_debug("send btc chain mode %d for vdev %d", mode, param.vdev_id);
return wlan_coex_config_send(vdev, &param);
}

View File

@@ -1,135 +0,0 @@
/*
* Copyright (c) 2020, The Linux Foundation. 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.
*/
/**
* DOC: wlan_coex_utils_api.c
*
* This file provides definitions of public APIs exposed to other UMAC
* components.
*/
#include <wlan_coex_main.h>
#include <wlan_objmgr_global_obj.h>
#include <wlan_coex_utils_api.h>
#include "cfg_ucfg_api.h"
QDF_STATUS wlan_coex_init(void)
{
QDF_STATUS status;
status = wlan_objmgr_register_psoc_create_handler(
WLAN_UMAC_COMP_COEX,
wlan_coex_psoc_created_notification, NULL);
if (QDF_IS_STATUS_ERROR(status)) {
coex_err("Failed to register psoc create handler");
goto fail_create_psoc;
}
status = wlan_objmgr_register_psoc_destroy_handler(
WLAN_UMAC_COMP_COEX,
wlan_coex_psoc_destroyed_notification, NULL);
if (QDF_IS_STATUS_ERROR(status)) {
coex_err("Failed to create psoc delete handler");
goto fail_psoc_destroy;
}
coex_debug("coex psoc create and delete handler registered");
return status;
fail_psoc_destroy:
wlan_objmgr_unregister_psoc_create_handler(
WLAN_UMAC_COMP_COEX,
wlan_coex_psoc_created_notification, NULL);
fail_create_psoc:
return status;
}
QDF_STATUS wlan_coex_deinit(void)
{
QDF_STATUS status;
status = wlan_objmgr_unregister_psoc_destroy_handler(
WLAN_UMAC_COMP_COEX,
wlan_coex_psoc_destroyed_notification, NULL);
if (status != QDF_STATUS_SUCCESS)
coex_err("Failed to unregister psoc delete handler");
status = wlan_objmgr_unregister_psoc_create_handler(
WLAN_UMAC_COMP_COEX,
wlan_coex_psoc_created_notification, NULL);
if (status != QDF_STATUS_SUCCESS)
coex_err("Failed to unregister psoc create handler");
return status;
}
#ifdef FEATURE_BTC_CHAIN_MODE
/**
* wlan_coex_set_btc_chain_mode_with_ini() - set BTC init chain mode
* with ini
* @psoc: pointer to psoc object
*
* This function is used to set BTC init chain mode with ini
*
* Return: None
*/
static void
wlan_coex_set_btc_chain_mode_with_ini(struct wlan_objmgr_psoc *psoc)
{
uint8_t btc_chain_mode;
QDF_STATUS status;
status = wlan_coex_psoc_get_btc_chain_mode(psoc, &btc_chain_mode);
if (QDF_IS_STATUS_ERROR(status)) {
coex_err("error for getting btc chain mode");
return;
}
if (btc_chain_mode == WLAN_COEX_BTC_CHAIN_MODE_UNSETTLED) {
btc_chain_mode = cfg_get(psoc, CFG_SET_INIT_CHAIN_MODE_FOR_BTC);
if (btc_chain_mode != WLAN_COEX_BTC_CHAIN_MODE_SHARED &&
btc_chain_mode != WLAN_COEX_BTC_CHAIN_MODE_SEPARATED &&
btc_chain_mode != WLAN_COEX_BTC_CHAIN_MODE_UNSETTLED) {
coex_err("invalid ini config %d for btc chain mode",
btc_chain_mode);
return;
}
status = wlan_coex_psoc_set_btc_chain_mode(psoc,
btc_chain_mode);
if (QDF_IS_STATUS_ERROR(status))
coex_err("error for setting btc init chain mode from ini");
}
}
#else
static void
wlan_coex_set_btc_chain_mode_with_ini(struct wlan_objmgr_psoc *psoc)
{
}
#endif
QDF_STATUS
wlan_coex_psoc_open(struct wlan_objmgr_psoc *psoc)
{
wlan_coex_set_btc_chain_mode_with_ini(psoc);
return wlan_coex_psoc_init(psoc);
}
QDF_STATUS
wlan_coex_psoc_close(struct wlan_objmgr_psoc *psoc)
{
return wlan_coex_psoc_deinit(psoc);
}

View File

@@ -1,63 +0,0 @@
/*
* Copyright (c) 2019 The Linux Foundation. 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.
*/
/**
* DOC: wlan_ext_cp_stats_types.h
*
* This header file is included by the converged control path statistics
* component to map legacy statistic structures to the external
* (ext)typedefs used by the converged code. This mechanism allows the
* legacy structs to be included as part of the global objmgr objects.
*/
#ifndef __WLAN_EXT_CP_STATS_TYPE_H__
#define __WLAN_EXT_CP_STATS_TYPE_H__
/**
* typedef psoc_ext_cp_stats_t - Definition of psoc cp stats pointer
* Define obj_stats from external umac/cp_stats component point to this type
*/
typedef struct psoc_mc_cp_stats psoc_ext_cp_stats_t;
/**
* typedef pdev_ext_cp_stats_t - Definition of pdev cp stats pointer
* Define pdev_stats from external umac/cp_stats component point to this type
*/
typedef struct pdev_mc_cp_stats pdev_ext_cp_stats_t;
/**
* typedef vdev_ext_cp_stats_t - Definition of vdev cp stats pointer
* Define vdev_stats from external umac/cp_stats component point to this type
*/
typedef struct vdev_mc_cp_stats vdev_ext_cp_stats_t;
/**
* typedef peer_ext_cp_stats_t - Definition of peer cp stats pointer
* Define peer_stats from external umac/cp_stats component point to this type
*/
typedef struct peer_mc_cp_stats peer_ext_cp_stats_t;
/**
* typedef peer_ext_adv_cp_stats_t - Definition of peer adv cp stats pointer
* Define peer_adv_stats from external umac/cp_stats component point to this
* type
*/
typedef struct peer_adv_mc_cp_stats peer_ext_adv_cp_stats_t;
#endif /* __WLAN_EXT_CP_STATS_TYPE_H__ */

View File

@@ -1,726 +0,0 @@
/*
* Copyright (c) 2012-2021 The Linux Foundation. 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.
*/
/**
* DOC: wlan_cp_stats_mc_defs.h
*
* This file provide definition for structure/enums/defines related to control
* path stats componenet
*/
#ifndef __WLAN_CP_STATS_MC_DEFS_H__
#define __WLAN_CP_STATS_MC_DEFS_H__
#include "wlan_cmn.h"
#include "qdf_event.h"
/* For WMI_MAX_CHAINS */
#include "wmi_unified.h"
#ifdef QCA_SUPPORT_MC_CP_STATS
#include "wlan_cp_stats_public_structs.h"
#endif
#ifdef WLAN_SUPPORT_TWT
#include <wmi_unified_twt_param.h>
/* Max TWT sessions per peer (supported by fw) */
#define TWT_PEER_MAX_SESSIONS 1
#endif /* WLAN_SUPPORT_TWT */
#define MAX_NUM_CHAINS 2
#define MAX_MIB_STATS 1
#define IS_MSB_SET(__num) ((__num) & BIT(31))
#define IS_LSB_SET(__num) ((__num) & BIT(0))
#define VDEV_ALL 0xFF
/**
* enum stats_req_type - enum indicating bit position of various stats type in
* request map
* @TYPE_CONNECTION_TX_POWER: tx power was requested
* @TYPE_STATION_STATS: station stats was requested
* @TYPE_PEER_STATS: peer stats was requested
* @TYPE_MIB_STATS: MIB stats was requested
* @TYPE_PEER_STATS_INFO_EXT: peer stats info ext was requested
* @TYPE_CONGESTION_STATS: congestion stats was requested
* @TYPE_BIG_DATA_STATS: big data stats was requested
*/
enum stats_req_type {
TYPE_CONNECTION_TX_POWER = 0,
TYPE_STATION_STATS,
TYPE_PEER_STATS,
TYPE_MIB_STATS,
TYPE_PEER_STATS_INFO_EXT,
TYPE_CONGESTION_STATS,
TYPE_BIG_DATA_STATS,
TYPE_MAX,
};
/**
* enum tx_rate_info - tx rate flags
* @TX_RATE_LEGACY: Legacy rates
* @TX_RATE_HT20: HT20 rates
* @TX_RATE_HT40: HT40 rates
* @TX_RATE_SGI: Rate with Short guard interval
* @TX_RATE_LGI: Rate with Long guard interval
* @TX_RATE_VHT20: VHT 20 rates
* @TX_RATE_VHT40: VHT 40 rates
* @TX_RATE_VHT80: VHT 80 rates
* @TX_RATE_HE20: HE 20 rates
* @TX_RATE_HE40: HE 40 rates
* @TX_RATE_HE80: HE 80 rates
* @TX_RATE_HE160: HE 160 rates
* @TX_RATE_VHT160: VHT 160 rates
*/
enum tx_rate_info {
TX_RATE_LEGACY = 0x1,
TX_RATE_HT20 = 0x2,
TX_RATE_HT40 = 0x4,
TX_RATE_SGI = 0x8,
TX_RATE_LGI = 0x10,
TX_RATE_VHT20 = 0x20,
TX_RATE_VHT40 = 0x40,
TX_RATE_VHT80 = 0x80,
TX_RATE_HE20 = 0x100,
TX_RATE_HE40 = 0x200,
TX_RATE_HE80 = 0x400,
TX_RATE_HE160 = 0x800,
TX_RATE_VHT160 = 0x1000,
};
/**
* enum - txrate_gi
* @txrate_gi_0_8_US: guard interval 0.8 us
* @txrate_gi_0_4_US: guard interval 0.4 us for legacy
* @txrate_gi_1_6_US: guard interval 1.6 us
* @txrate_gi_3_2_US: guard interval 3.2 us
*/
enum txrate_gi {
TXRATE_GI_0_8_US = 0,
TXRATE_GI_0_4_US,
TXRATE_GI_1_6_US,
TXRATE_GI_3_2_US,
};
/**
* struct wake_lock_stats - wake lock stats structure
* @ucast_wake_up_count: Unicast wakeup count
* @bcast_wake_up_count: Broadcast wakeup count
* @ipv4_mcast_wake_up_count: ipv4 multicast wakeup count
* @ipv6_mcast_wake_up_count: ipv6 multicast wakeup count
* @ipv6_mcast_ra_stats: ipv6 multicast ra stats
* @ipv6_mcast_ns_stats: ipv6 multicast ns stats
* @ipv6_mcast_na_stats: ipv6 multicast na stats
* @icmpv4_count: ipv4 icmp packet count
* @icmpv6_count: ipv6 icmp packet count
* @rssi_breach_wake_up_count: rssi breach wakeup count
* @low_rssi_wake_up_count: low rssi wakeup count
* @gscan_wake_up_count: gscan wakeup count
* @pno_complete_wake_up_count: pno complete wakeup count
* @pno_match_wake_up_count: pno match wakeup count
* @oem_response_wake_up_count: oem response wakeup count
* @uc_drop_wake_up_count: local data uc drop wakeup count
* @fatal_event_wake_up_count: fatal event wakeup count
* @pwr_save_fail_detected: pwr save fail detected wakeup count
* @scan_11d 11d scan wakeup count
* @mgmt_assoc: association request management frame
* @mgmt_disassoc: disassociation management frame
* @mgmt_assoc_resp: association response management frame
* @mgmt_reassoc: reassociate request management frame
* @mgmt_reassoc_resp: reassociate response management frame
* @mgmt_auth: authentication managament frame
* @mgmt_deauth: deauthentication management frame
* @mgmt_action: action managament frame
*/
struct wake_lock_stats {
uint32_t ucast_wake_up_count;
uint32_t bcast_wake_up_count;
uint32_t ipv4_mcast_wake_up_count;
uint32_t ipv6_mcast_wake_up_count;
uint32_t ipv6_mcast_ra_stats;
uint32_t ipv6_mcast_ns_stats;
uint32_t ipv6_mcast_na_stats;
uint32_t icmpv4_count;
uint32_t icmpv6_count;
uint32_t rssi_breach_wake_up_count;
uint32_t low_rssi_wake_up_count;
uint32_t gscan_wake_up_count;
uint32_t pno_complete_wake_up_count;
uint32_t pno_match_wake_up_count;
uint32_t oem_response_wake_up_count;
uint32_t uc_drop_wake_up_count;
uint32_t fatal_event_wake_up_count;
uint32_t pwr_save_fail_detected;
uint32_t scan_11d;
uint32_t mgmt_assoc;
uint32_t mgmt_disassoc;
uint32_t mgmt_assoc_resp;
uint32_t mgmt_reassoc;
uint32_t mgmt_reassoc_resp;
uint32_t mgmt_auth;
uint32_t mgmt_deauth;
uint32_t mgmt_action;
};
struct stats_event;
/**
* struct big_data_stats_event - big data stats event param
* @vdev_id: vdev id
* @tsf_out_of_sync: tsf out of sync
* @ani_level: ani level
* @last_data_tx_pwr: tx pwr last data frm
* @target_power_dsss: tx power dsss
* @target_power_ofdm: target power ofdm
* @last_tx_data_rix: rx lateset data frame
* @last_tx_data_rate_kbps: tx latest data frame
*/
struct big_data_stats_event {
uint32_t vdev_id;
uint32_t tsf_out_of_sync;
int32_t ani_level;
uint32_t last_data_tx_pwr;
uint32_t target_power_dsss;
uint32_t target_power_ofdm;
uint32_t last_tx_data_rix;
uint32_t last_tx_data_rate_kbps;
};
/**
* struct medium_assess_data - medium assess data from firmware
* @part1_valid: the flag for part1 data
* @cycle_count: accumulative cycle count (total time)
* @rx_clear_count: accumulative rx clear count (busy time)
* @tx_frame_count: accumulative tx frame count (total time)
*/
struct medium_assess_data {
/* part1 data */
uint8_t part1_valid;
uint32_t cycle_count;
uint32_t rx_clear_count;
uint32_t tx_frame_count;
};
/**
* struct request_info: details of each request
* @cookie: identifier for os_if request
* @u: unified data type for callback to process tx power/peer rssi/
* station stats/mib stats/peer stats request when response comes and
* congestion notification callback.
* @vdev_id: vdev_id of request
* @pdev_id: pdev_id of request
* @peer_mac_addr: peer mac address
*/
struct request_info {
void *cookie;
union {
void (*get_tx_power_cb)(int tx_power, void *cookie);
void (*get_peer_rssi_cb)(struct stats_event *ev, void *cookie);
void (*get_station_stats_cb)(struct stats_event *ev,
void *cookie);
void (*get_mib_stats_cb)(struct stats_event *ev,
void *cookie);
void (*get_peer_stats_cb)(struct stats_event *ev,
void *cookie);
void (*congestion_notif_cb)(uint8_t vdev_id,
struct medium_assess_data *data);
#ifdef WLAN_FEATURE_BIG_DATA_STATS
void (*get_big_data_stats_cb)(struct big_data_stats_event *ev,
void *cookie);
#endif
} u;
uint32_t vdev_id;
uint32_t pdev_id;
uint8_t peer_mac_addr[QDF_MAC_ADDR_SIZE];
};
/**
* struct pending_stats_requests: details of pending requests
* @type_map: map indicating type of outstanding requests
* @req: array of info for outstanding request of each type
*/
struct pending_stats_requests {
uint32_t type_map;
struct request_info req[TYPE_MAX];
};
/**
* struct cca_stats - cca stats
* @congestion: the congestion percentage = (busy_time/total_time)*100
* for the interval from when the vdev was started to the current time
* (or the time at which the vdev was stopped).
*/
struct cca_stats {
uint32_t congestion;
};
/**
* struct psoc_mc_cp_stats: psoc specific stats
* @is_cp_stats_suspended: is cp stats suspended or not
* @pending: details of pending requests
* @wow_unspecified_wake_up_count: number of non-wow related wake ups
* @wow_stats: wake_lock stats for vdev
* @big_data_fw_support_enable: big data feature supported by fw or not
*/
struct psoc_mc_cp_stats {
bool is_cp_stats_suspended;
struct pending_stats_requests pending;
uint32_t wow_unspecified_wake_up_count;
struct wake_lock_stats wow_stats;
#ifdef WLAN_FEATURE_BIG_DATA_STATS
bool big_data_fw_support_enable;
#endif
};
/**
* struct pdev_mc_cp_stats: pdev specific stats
* @max_pwr: max tx power for pdev
* @pdev_id: pdev id
* @rx_clear_count: accumulative rx clear count (busy time) of pdev
* @cycle_count: accumulative cycle count (total time) of pdev
* @tx_frame_count: accumulative tx frame count (total time) of pdev
*/
struct pdev_mc_cp_stats {
int32_t max_pwr;
uint32_t pdev_id;
uint32_t rx_clear_count;
uint32_t cycle_count;
uint32_t tx_frame_count;
};
/**
* struct summary_stats - summary stats
* @snr: snr of vdev
* @rssi: rssi of vdev
* @retry_cnt: retry count
* @multiple_retry_cnt: multiple_retry_cnt
* @tx_frm_cnt: num of tx frames
* @rx_frm_cnt: num of rx frames
* @frm_dup_cnt: duplicate frame count
* @fail_cnt: fail count
* @rts_fail_cnt: rts fail count
* @ack_fail_cnt: ack fail count
* @rts_succ_cnt: rts success count
* @rx_discard_cnt: rx frames discarded
* @rx_error_cnt: rx frames with error
*/
struct summary_stats {
uint32_t snr;
int8_t rssi;
uint32_t retry_cnt[4];
uint32_t multiple_retry_cnt[4];
uint32_t tx_frm_cnt[4];
uint32_t rx_frm_cnt;
uint32_t frm_dup_cnt;
uint32_t fail_cnt[4];
uint32_t rts_fail_cnt;
uint32_t ack_fail_cnt;
uint32_t rts_succ_cnt;
uint32_t rx_discard_cnt;
uint32_t rx_error_cnt;
};
/**
* struct pmf_bcn_protect_stats - pmf bcn protect stats param
* @pmf_bcn_stats_valid: bcn protect stats received from fw are valid or not
* @igtk_mic_fail_cnt: MIC failure count of management packets using IGTK
* @igtk_replay_cnt: Replay detection count of management packets using IGTK
* @bcn_mic_fail_cnt: MIC failure count of beacon packets using BIGTK
* @bcn_replay_cnt: Replay detection count of beacon packets using BIGTK
*/
struct pmf_bcn_protect_stats {
bool pmf_bcn_stats_valid;
uint32_t igtk_mic_fail_cnt;
uint32_t igtk_replay_cnt;
uint32_t bcn_mic_fail_cnt;
uint32_t bcn_replay_cnt;
};
/**
* struct vdev_mc_cp_stats - vdev specific stats
* @cca: cca stats
* @tx_rate_flags: tx rate flags (enum tx_rate_info)
* @chain_rssi: chain rssi
* @vdev_summary_stats: vdev's summary stats
* @pmf_bcn_stats: pmf beacon protect stats
*/
struct vdev_mc_cp_stats {
struct cca_stats cca;
uint32_t tx_rate_flags;
int8_t chain_rssi[MAX_NUM_CHAINS];
struct summary_stats vdev_summary_stats;
struct pmf_bcn_protect_stats pmf_bcn_stats;
};
/**
* struct peer_extd_stats - Peer extension statistics
* @peer_macaddr: peer MAC address
* @rx_duration: lower 32 bits of rx duration in microseconds
* @peer_tx_bytes: Total TX bytes (including dot11 header) sent to peer
* @peer_rx_bytes: Total RX bytes (including dot11 header) received from peer
* @last_tx_rate_code: last TX ratecode
* @last_tx_power: TX power used by peer - units are 0.5 dBm
* @rx_mc_bc_cnt: Total number of received multicast & broadcast data frames
* corresponding to this peer, 1 in the MSB of rx_mc_bc_cnt represents a
* valid data
*/
struct peer_extd_stats {
uint8_t peer_macaddr[QDF_MAC_ADDR_SIZE];
uint32_t rx_duration;
uint32_t peer_tx_bytes;
uint32_t peer_rx_bytes;
uint32_t last_tx_rate_code;
int32_t last_tx_power;
uint32_t rx_mc_bc_cnt;
};
/**
* struct peer_mc_cp_stats - peer specific stats
* @tx_rate: tx rate
* @rx_rate: rx rate
* @peer_rssi: rssi
* @peer_macaddr: mac address
* @extd_stats: Pointer to peer extended stats
* @adv_stats: Pointer to peer adv (extd2) stats
* @twt_param: Pointer to peer twt session parameters
*/
struct peer_mc_cp_stats {
uint32_t tx_rate;
uint32_t rx_rate;
int8_t peer_rssi;
uint8_t peer_macaddr[QDF_MAC_ADDR_SIZE];
struct peer_extd_stats *extd_stats;
struct peer_adv_mc_cp_stats *adv_stats;
#ifdef WLAN_SUPPORT_TWT
struct wmi_host_twt_session_stats_info twt_param[TWT_PEER_MAX_SESSIONS];
#endif
};
/**
* struct peer_adv_mc_cp_stats - peer specific adv stats
* @peer_macaddr: mac address
* @fcs_count: fcs count
* @rx_bytes: rx bytes
* @rx_count: rx count
*/
struct peer_adv_mc_cp_stats {
uint8_t peer_macaddr[QDF_MAC_ADDR_SIZE];
uint32_t fcs_count;
uint32_t rx_count;
uint64_t rx_bytes;
};
#ifdef WLAN_FEATURE_MIB_STATS
/**
* struct dot11_counters - mib group containing attributes that are MAC counters
* @tx_frags: successfully transmitted fragments
* @group_tx_frames: transmitted group addressed frames
* @failed_cnt: MSDUs not transmitted successfully
* @rx_frags: fragments successfully received
* @group_rx_frames: group addressed frames received
* @fcs_error_cnt: FCS errors detected
* @tx_frames: frames successfully transmitted
*/
struct dot11_counters {
uint32_t tx_frags;
uint32_t group_tx_frames;
uint32_t failed_cnt;
uint32_t rx_frags;
uint32_t group_rx_frames;
uint32_t fcs_error_cnt;
uint32_t tx_frames;
};
/**
* struct dot11_mac_statistics - mib stats information on the operation of MAC
* @retry_cnt: retries done by mac for successful transmition
* @multi_retry_cnt: multiple retries done before successful transmition
* @frame_dup_cnt: duplicate no of frames
* @rts_success_cnt: number of CTS received (in response to RTS)
* @rts_fail_cnt: number of CTS not received (in response to RTS)
* @tx_ack_fail_cnt: number of ACK not received
*/
struct dot11_mac_statistics {
uint32_t retry_cnt;
uint32_t multi_retry_cnt;
uint32_t frame_dup_cnt;
uint32_t rts_success_cnt;
uint32_t rts_fail_cnt;
uint32_t tx_ack_fail_cnt;
};
/**
* dot11_qos_counters - qos mac counters
* @qos_tx_frag_cnt: transmitted QoS fragments
* @qos_failed_cnt: failed Qos fragments
* @qos_retry_cnt: Qos frames transmitted after retransmissions
* @qos_multi_retry_cnt: Qos frames transmitted after more than
* one retransmissions
* @qos_frame_dup_cnt: duplicate frames
* @qos_rts_success_cnt: number of CTS received (in response to RTS)
* @qos_rts_fail_cnt: number of CTS not received (in response to RTS)
* @tx_qos_ack_fail_cnt_up: number of ACK not received
* (in response to Qos frame)
* @qos_rx_frag_cnt: number of received MPDU of type Data
* @qos_tx_frame_cnt: number of transmitted MPDU of type Data
* @qos_discarded_frame_cnt: total Discarded MSDUs
* @qos_mpdu_rx_cnt: total received MPDU
* @qos_retries_rx_cnt: received MPDU with retry bit equal to 1
*/
struct dot11_qos_counters {
uint32_t qos_tx_frag_cnt;
uint32_t qos_failed_cnt;
uint32_t qos_retry_cnt;
uint32_t qos_multi_retry_cnt;
uint32_t qos_frame_dup_cnt;
uint32_t qos_rts_success_cnt;
uint32_t qos_rts_fail_cnt;
uint32_t tx_qos_ack_fail_cnt_up;
uint32_t qos_rx_frag_cnt;
uint32_t qos_tx_frame_cnt;
uint32_t qos_discarded_frame_cnt;
uint32_t qos_mpdu_rx_cnt;
uint32_t qos_retries_rx_cnt;
};
/**
* dot11_rsna_stats - mib rsn stats
* @rm_ccmp_replays: received robust management CCMP MPDUs discarded
* by the replay mechanism
* @tkip_icv_err: TKIP ICV errors encountered
* @tkip_replays: TKIP replay errors detected
* @ccmp_decrypt_err: MPDUs discarded by the CCMP decryption algorithm
* @ccmp_replays: received CCMP MPDUs discarded by the replay mechanism
* @cmac_icv_err: MPDUs discarded by the CMAC integrity check algorithm
* @cmac_replays: MPDUs discarded by the CMAC replay errors
*/
struct dot11_rsna_stats {
uint32_t rm_ccmp_replays;
uint32_t tkip_icv_err;
uint32_t tkip_replays;
uint32_t ccmp_decrypt_err;
uint32_t ccmp_replays;
uint32_t cmac_icv_err;
uint32_t cmac_replays;
};
/**
* dot11_counters_group3 - dot11 group3 stats
* @tx_ampdu_cnt: transmitted AMPDUs
* @tx_mpdus_in_ampdu_cnt: number of MPDUs in the A-MPDU in transmitted AMPDUs
* @tx_octets_in_ampdu_cnt: octets in the transmitted A-MPDUs
* @ampdu_rx_cnt: received A-MPDU
* @mpdu_in_rx_ampdu_cnt: MPDUs received in the A-MPDU
* @rx_octets_in_ampdu_cnt: octets in the received A-MPDU
* @rx_ampdu_deli_crc_err_cnt: number of MPDUs delimiter with CRC error
*/
struct dot11_counters_group3 {
uint32_t tx_ampdu_cnt;
uint32_t tx_mpdus_in_ampdu_cnt;
uint64_t tx_octets_in_ampdu_cnt;
uint32_t ampdu_rx_cnt;
uint32_t mpdu_in_rx_ampdu_cnt;
uint64_t rx_octets_in_ampdu_cnt;
uint32_t rx_ampdu_deli_crc_err_cnt;
};
/**
* mib_stats_metrics - mib stats counters
* @mib_counters: dot11Counters group
* @mib_mac_statistics: dot11MACStatistics group
* @mib_qos_counters: dot11QoSCounters group
* @mib_rsna_stats: dot11RSNAStats group
* @mib_counters_group3: dot11CountersGroup3 group
*/
struct mib_stats_metrics {
struct dot11_counters mib_counters;
struct dot11_mac_statistics mib_mac_statistics;
struct dot11_qos_counters mib_qos_counters;
struct dot11_rsna_stats mib_rsna_stats;
struct dot11_counters_group3 mib_counters_group3;
};
#endif
/**
* struct congestion_stats_event: congestion stats event param
* @vdev_id: vdev_id of the event
* @congestion: the congestion percentage
*/
struct congestion_stats_event {
uint8_t vdev_id;
uint32_t congestion;
};
/**
* struct summary_stats_event - summary_stats event param
* @vdev_id: vdev_id of the event
* @stats: summary stats
*/
struct summary_stats_event {
uint8_t vdev_id;
struct summary_stats stats;
};
/**
* struct chain_rssi_event - chain_rssi event param
* @vdev_id: vdev_id of the event
* @chain_rssi: chain_rssi
*/
struct chain_rssi_event {
uint8_t vdev_id;
int8_t chain_rssi[MAX_NUM_CHAINS];
};
/**
* struct peer_stats_info_ext_event - peer extended stats info
* @peer_macaddr: MAC address
* @tx_packets: packets transmitted to this station
* @tx_bytes: bytes transmitted to this station
* @rx_packets: packets received from this station
* @rx_bytes: bytes received from this station
* @tx_retries: cumulative retry counts
* @tx_failed: the number of failed frames
* @tx_succeed: the number of succeed frames
* @rssi: the signal strength
* @tx_rate: last used tx bitrate (kbps)
* @tx_rate_code: last tx rate code (last_tx_rate_code of wmi_peer_stats_info)
* @rx_rate: last used rx bitrate (kbps)
* @rx_rate_code: last rx rate code (last_rx_rate_code of wmi_peer_stats_info)
* @peer_rssi_per_chain: the average value of RSSI (dbm) per chain
*/
struct peer_stats_info_ext_event {
struct qdf_mac_addr peer_macaddr;
uint32_t tx_packets;
uint64_t tx_bytes;
uint32_t rx_packets;
uint64_t rx_bytes;
uint32_t tx_retries;
uint32_t tx_failed;
uint32_t tx_succeed;
int32_t rssi;
uint32_t tx_rate;
uint32_t tx_rate_code;
uint32_t rx_rate;
uint32_t rx_rate_code;
int32_t peer_rssi_per_chain[WMI_MAX_CHAINS];
};
/**
* struct stats_event - parameters populated by stats event
* @num_pdev_stats: num pdev stats
* @pdev_stats: if populated array indicating pdev stats (index = pdev_id)
* @num_peer_stats: num peer stats
* @peer_stats: if populated array indicating peer stats
* @peer_adv_stats: if populated, indicates peer adv (extd2) stats
* @num_peer_adv_stats: number of peer adv (extd2) stats
* @num_peer_extd_stats: Num peer extended stats
* @peer_extended_stats: Peer extended stats
* @cca_stats: if populated indicates congestion stats
* @num_summary_stats: number of summary stats
* @vdev_summary_stats: if populated indicates array of summary stats per vdev
* @num_mib_stats: number of mib stats
* @mib_stats: if populated indicates array of mib stats per vdev
* @num_chain_rssi_stats: number of chain rssi stats
* @vdev_chain_rssi: if populated indicates array of chain rssi per vdev
* @tx_rate: tx rate (kbps)
* @tx_rate_flags: tx rate flags, (enum tx_rate_info)
* @last_event: The LSB indicates if the event is the last event or not and the
* MSB indicates if this feature is supported by FW or not.
* @num_peer_stats_info_ext: number of peer extended stats info
* @peer_stats_info_ext: peer extended stats info
* @pmf_bcn_protect_stats: pmf bcn protect stats
*/
struct stats_event {
uint32_t num_pdev_stats;
struct pdev_mc_cp_stats *pdev_stats;
uint32_t num_peer_stats;
struct peer_mc_cp_stats *peer_stats;
uint32_t num_peer_adv_stats;
struct peer_adv_mc_cp_stats *peer_adv_stats;
uint32_t num_peer_extd_stats;
struct peer_extd_stats *peer_extended_stats;
struct congestion_stats_event *cca_stats;
uint32_t num_summary_stats;
struct summary_stats_event *vdev_summary_stats;
#ifdef WLAN_FEATURE_MIB_STATS
uint32_t num_mib_stats;
struct mib_stats_metrics *mib_stats;
#endif
uint32_t num_chain_rssi_stats;
struct chain_rssi_event *vdev_chain_rssi;
uint32_t tx_rate;
uint32_t rx_rate;
enum tx_rate_info tx_rate_flags;
uint32_t last_event;
uint32_t num_peer_stats_info_ext;
struct peer_stats_info_ext_event *peer_stats_info_ext;
struct pmf_bcn_protect_stats bcn_protect_stats;
};
/**
* struct peer_stats_request_params - peer stats request parameter
* @request_type: request type, one peer or all peers of the vdev
* @vdev_id: vdev id
* @peer_mac_addr: peer mac address, omitted if request type is all peers
* @reset_after_request: whether reset stats after request
*/
struct peer_stats_request_params {
uint32_t request_type;
uint32_t vdev_id;
uint8_t peer_mac_addr[QDF_MAC_ADDR_SIZE];
uint32_t reset_after_request;
};
/**
* struct wmi_host_peer_stats_info - WMI peer stats info
* @peer_macaddr: peer mac address
* @tx_bytes: tx_bytes
* @tx_packets: tx packets
* @rx_bytes: rx_bytes
* @rx_packets: rx packets
* @tx_retries: tx retries of MPDU
* @tx_failed: tx failed MPDU
* @last_tx_rate_code: rate code of the last tx
* @last_rx_rate_code: rate code of the last rx
* @last_tx_bitrate_kbps: bitrate in bps of the last tx
* @last_rx_bitrate_kbps: bitrate in bps of the last rx
* @peer_rssi: peer rssi
* @tx_succeed: tx succeed MPDU
* @peer_rssi_per_chain: peer rssi per chain
*/
typedef struct {
struct qdf_mac_addr peer_macaddr;
uint64_t tx_bytes;
uint32_t tx_packets;
uint64_t rx_bytes;
uint32_t rx_packets;
uint32_t tx_retries;
uint32_t tx_failed;
uint32_t last_tx_rate_code;
uint32_t last_rx_rate_code;
uint32_t last_tx_bitrate_kbps;
uint32_t last_rx_bitrate_kbps;
int32_t peer_rssi;
uint32_t tx_succeed;
int32_t peer_rssi_per_chain[WMI_MAX_CHAINS];
} wmi_host_peer_stats_info;
#endif /* __WLAN_CP_STATS_MC_DEFS_H__ */

View File

@@ -1,127 +0,0 @@
/*
* Copyright (c) 2018, 2021 The Linux Foundation. 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.
*/
/**
* DOC: wlan_cp_stats_mc_tgt_api.h
*
* This header file provide with API declarations to interface with Southbound
*/
#ifndef __WLAN_CP_STATS_MC_TGT_API_H__
#define __WLAN_CP_STATS_MC_TGT_API_H__
#ifdef QCA_SUPPORT_CP_STATS
#include "wlan_cp_stats_mc_defs.h"
//TODO - Check if this is true for hamilton
#ifdef QCA_WIFI_QCA6490
#define TGT_MAC_ID_24G 2
#define TGT_MAC_ID_5G 1
#else
#define TGT_MAC_ID_24G 0
#define TGT_MAC_ID_5G 0
#endif
/**
* target_if_mc_cp_get_mac_id(): API to get mac id
* @vdev_mlme: vdev mlme pointer
*
* Return: mac id
*/
uint8_t target_if_mc_cp_get_mac_id(struct vdev_mlme_obj *vdev_mlme);
/**
* tgt_mc_cp_stats_process_stats_event(): API to process stats event
* @psoc: pointer to psoc object
* @event: event parameters
*
* Return: QDF_STATUS_SUCCESS on Success, other QDF_STATUS error codes on
* failure
*/
QDF_STATUS
tgt_mc_cp_stats_process_stats_event(struct wlan_objmgr_psoc *psoc,
struct stats_event *ev);
#ifdef WLAN_SUPPORT_INFRA_CTRL_PATH_STATS
/**
* tgt_mc_cp_stats_process_infra_stats_event(): API to process event from
* cp stats infrastrucure
* @psoc: pointer to psoc object
* @infra_event: infra cp stats event parameters
*
* Return: status of operation
*/
QDF_STATUS tgt_mc_cp_stats_process_infra_stats_event(
struct wlan_objmgr_psoc *psoc,
struct infra_cp_stats_event *infra_event);
#endif
#ifdef WLAN_FEATURE_BIG_DATA_STATS
/**
* tgt_mc_cp_stats_process_big_data_stats_event(): API to process big data
* stats event
* @psoc: pointer to psoc object
* @event: big data stats event parameters
*
* Return: status of operation
*/
QDF_STATUS
tgt_mc_cp_stats_process_big_data_stats_event(
struct wlan_objmgr_psoc *psoc,
struct big_data_stats_event *event);
/**
* tgt_send_cp_big_data_stats_req(): API to send big data stats request
* to lmac
* @psoc: pointer to psoc object
* @req: pointer to request info
*
* Return: status of operation
*/
QDF_STATUS tgt_send_cp_big_data_stats_req(struct wlan_objmgr_psoc *psoc,
struct request_info *req);
#endif
/**
* tgt_send_mc_cp_stats_req(): API to send stats request to lmac
* @psoc: pointer to psoc object
* @req: pointer to stats request
*
* Return: status of operation
*/
QDF_STATUS tgt_send_mc_cp_stats_req(struct wlan_objmgr_psoc *psoc,
enum stats_req_type type,
struct request_info *req);
/**
* tgt_mc_cp_stats_inc_wake_lock_stats() : API to increment wake lock stats
* given the wake reason code
* @psoc: pointer to psoc object
* @reason: wake reason
* @stats: vdev wow stats to update
* @unspecified_wake_count: unspecified wake count to update
*
* Return : status of operation
*/
QDF_STATUS tgt_mc_cp_stats_inc_wake_lock_stats(struct wlan_objmgr_psoc *psoc,
uint32_t reason, struct wake_lock_stats *stats,
uint32_t *unspecified_wake_count);
#endif /* QCA_SUPPORT_CP_STATS */
#endif /* __WLAN_CP_STATS_MC_TGT_API_H__ */

View File

@@ -1,434 +0,0 @@
/*
* Copyright (c) 2018-2021 The Linux Foundation. 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.
*/
/**
* DOC: wlan_cp_stats_mc_ucfg_api.h
*
* This header file maintain API declaration required for northbound interaction
*/
#ifndef __WLAN_CP_STATS_MC_UCFG_API_H__
#define __WLAN_CP_STATS_MC_UCFG_API_H__
#ifdef QCA_SUPPORT_CP_STATS
#include <wlan_objmgr_psoc_obj.h>
#include <wlan_objmgr_vdev_obj.h>
#include <wlan_cp_stats_mc_defs.h>
#ifdef WLAN_SUPPORT_TWT
#include <wlan_objmgr_peer_obj.h>
#include "../../core/src/wlan_cp_stats_defs.h"
#include <qdf_event.h>
/* Max TWT sessions supported */
#define TWT_PSOC_MAX_SESSIONS TWT_PEER_MAX_SESSIONS
/* Valid dialog_id 0 to (0xFF - 1) */
#define TWT_MAX_DIALOG_ID (0xFF - 1)
/* dialog_id used to get all peer's twt session parameters */
#define TWT_GET_ALL_PEER_PARAMS_DIALOG_ID (0xFF)
/**
* ucfg_twt_get_peer_session_params() - Retrieves peer twt session parameters
* corresponding to a peer by using mac_addr and dialog id
* If dialog_id is TWT_GET_ALL_PEER_PARAMS_DIALOG_ID retrieves twt session
* parameters of all peers with valid twt session
* @psoc_obj: psoc object
* @params: array pointer to store peer twt session parameters, should contain
* mac_addr and dialog id of a peer for which twt session stats to be retrieved
*
* Return: total number of valid twt session
*/
int
ucfg_twt_get_peer_session_params(struct wlan_objmgr_psoc *psoc_obj,
struct wmi_host_twt_session_stats_info *param);
#endif /* WLAN_SUPPORT_TWT */
struct psoc_cp_stats;
struct vdev_cp_stats;
/**
* ucfg_mc_cp_stats_get_psoc_wake_lock_stats() : API to get wake lock stats from
* psoc
* @psoc: pointer to psoc object
* @stats: stats object to populate
*
* Return : status of operation
*/
QDF_STATUS ucfg_mc_cp_stats_get_psoc_wake_lock_stats(
struct wlan_objmgr_psoc *psoc,
struct wake_lock_stats *stats);
/**
* ucfg_mc_cp_stats_get_vdev_wake_lock_stats() : API to get wake lock stats from
* vdev
* @vdev: pointer to vdev object
* @stats: stats object to populate
*
* Return : status of operation
*/
QDF_STATUS ucfg_mc_cp_stats_get_vdev_wake_lock_stats(
struct wlan_objmgr_vdev *vdev,
struct wake_lock_stats *stats);
/**
* ucfg_mc_cp_stats_inc_wake_lock_stats_by_protocol() : API to increment wake
* lock stats given the protocol of the packet that was received.
* @psoc: pointer to psoc object
* @vdev_id: vdev_id for which the packet was received
* @protocol: protocol of the packet that was received
*
* Return : status of operation
*/
QDF_STATUS ucfg_mc_cp_stats_inc_wake_lock_stats_by_protocol(
struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
enum qdf_proto_subtype protocol);
/**
* ucfg_mc_cp_stats_inc_wake_lock_stats_by_protocol() : API to increment wake
* lock stats given destnation of packet that was received.
* @psoc: pointer to psoc object
* @dest_mac: destinamtion mac address of packet that was received
*
* Return : status of operation
*/
QDF_STATUS ucfg_mc_cp_stats_inc_wake_lock_stats_by_dst_addr(
struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id, uint8_t *dest_mac);
/**
* ucfg_mc_cp_stats_inc_wake_lock_stats() : API to increment wake lock stats
* given wake reason.
* @psoc: pointer to psoc object
* @vdev_id: vdev_id on with WOW was received
* @reason: reason of WOW
*
* Return : status of operation
*/
QDF_STATUS ucfg_mc_cp_stats_inc_wake_lock_stats(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
uint32_t reason);
/**
* ucfg_mc_cp_stats_write_wow_stats() - Writes WOW stats to buffer
* @psoc: pointer to psoc object
* @buffer: The char buffer to write to
* @max_len: The maximum number of chars to write
* @ret: number of bytes written
*
* Return: status of operation
*/
QDF_STATUS ucfg_mc_cp_stats_write_wow_stats(
struct wlan_objmgr_psoc *psoc,
char *buffer, uint16_t max_len, int *ret);
/**
* ucfg_mc_cp_stats_send_tx_power_request() - API to send tx_power request to
* lmac
* @vdev: pointer to vdev object
* @type: request type
*
* Return: status of operation
*/
QDF_STATUS ucfg_mc_cp_stats_send_stats_request(struct wlan_objmgr_vdev *vdev,
enum stats_req_type type,
struct request_info *info);
/**
* wlan_cfg80211_mc_twt_clear_infra_cp_stats() - send request to reset
* control path statistics
* @vdev: pointer to vdev object
* @dialog_id: dialod id of the twt session
* @twt_peer_mac: mac address of the peer
*
* Return: 0 for success or error code for failure
*/
int
wlan_cfg80211_mc_twt_clear_infra_cp_stats(
struct wlan_objmgr_vdev *vdev,
uint32_t dialog_id,
uint8_t twt_peer_mac[QDF_MAC_ADDR_SIZE]);
/**
* wlan_cfg80211_mc_twt_get_infra_cp_stats() - send twt get statistic request
* @vdev: pointer to vdev object
* @dialog_id: TWT session dialog id
* @twt_peer_mac: mac address of the peer
* @errno: error code
*
* Return: pointer to infra cp stats event for success or NULL for failure
*/
struct infra_cp_stats_event *
wlan_cfg80211_mc_twt_get_infra_cp_stats(struct wlan_objmgr_vdev *vdev,
uint32_t dialog_id,
uint8_t twt_peer_mac[QDF_MAC_ADDR_SIZE],
int *errno);
/**
* ucfg_mc_cp_stats_get_tx_power() - API to fetch tx_power
* @vdev: pointer to vdev object
* @dbm: pointer to tx power in dbm
*
* Return: status of operation
*/
QDF_STATUS ucfg_mc_cp_stats_get_tx_power(struct wlan_objmgr_vdev *vdev,
int *dbm);
/**
* ucfg_mc_cp_stats_is_req_pending() - API to tell if given request is pending
* @psoc: pointer to psoc object
* @type: request type to check
*
* Return: true of request is pending, false otherwise
*/
bool ucfg_mc_cp_stats_is_req_pending(struct wlan_objmgr_psoc *psoc,
enum stats_req_type type);
/**
* ucfg_mc_cp_stats_set_pending_req() - API to set pending request
* @psoc: pointer to psoc object
* @type: request to update
* @req: value to update
*
* Return: status of operation
*/
QDF_STATUS ucfg_mc_cp_stats_set_pending_req(struct wlan_objmgr_psoc *psoc,
enum stats_req_type type,
struct request_info *req);
/**
* ucfg_mc_cp_stats_reset_pending_req() - API to reset pending request
* @psoc: pointer to psoc object
* @type: request to update
* @last_req: last request
* @pending: pending request present
*
* The function is an atomic operation of "reset" and "get" last request.
*
* Return: status of operation
*/
QDF_STATUS ucfg_mc_cp_stats_reset_pending_req(struct wlan_objmgr_psoc *psoc,
enum stats_req_type type,
struct request_info *last_req,
bool *pending);
/**
* ucfg_mc_cp_stats_get_pending_req() - API to get pending request
* @psoc: pointer to psoc object
* @type: request to update
* @info: buffer to populate
*
* Return: status of operation
*/
QDF_STATUS ucfg_mc_cp_stats_get_pending_req(struct wlan_objmgr_psoc *psoc,
enum stats_req_type type,
struct request_info *info);
/**
* ucfg_mc_infra_cp_stats_free_stats_resources() - API to free buffers within
* infra cp stats_event structure
* @ev: structure whose buffer are to freed
*
* Return: none
*/
void
ucfg_mc_infra_cp_stats_free_stats_resources(struct infra_cp_stats_event *ev);
/**
* ucfg_mc_cp_stats_free_stats_resources() - API to free buffers within stats_event
* structure
* @ev: structure whose buffer are to freed
*
* Return: none
*/
void ucfg_mc_cp_stats_free_stats_resources(struct stats_event *ev);
/**
* ucfg_mc_cp_stats_cca_stats_get() - API to fetch cca stats
* @vdev: pointer to vdev object
* @cca_stats: pointer to cca info
*
* Return: status of operation
*/
QDF_STATUS ucfg_mc_cp_stats_cca_stats_get(struct wlan_objmgr_vdev *vdev,
struct cca_stats *cca_stats);
/**
* ucfg_mc_cp_stats_set_rate_flags() - API to set rate flags
* @vdev: pointer to vdev object
* @flags: value to set (enum tx_rate_info)
*
* Return: status of operation
*/
QDF_STATUS ucfg_mc_cp_stats_set_rate_flags(struct wlan_objmgr_vdev *vdev,
enum tx_rate_info flags);
/**
* ucfg_mc_cp_stats_register_lost_link_info_cb() - API to register lost link
* info callback
* @psoc: pointer to psoc object
* @lost_link_cp_stats_info_cb: Lost link info callback to be registered
*
*/
void ucfg_mc_cp_stats_register_lost_link_info_cb(
struct wlan_objmgr_psoc *psoc,
void (*lost_link_cp_stats_info_cb)(void *stats_ev));
#ifdef WLAN_POWER_MANAGEMENT_OFFLOAD
/**
* ucfg_mc_cp_stats_register_pmo_handler() - API to register pmo handler
*
* Return: none
*/
void ucfg_mc_cp_stats_register_pmo_handler(void);
#else
void static inline ucfg_mc_cp_stats_register_pmo_handler(void) { };
#endif /* WLAN_POWER_MANAGEMENT_OFFLOAD */
#ifdef WLAN_FEATURE_BIG_DATA_STATS
/**
* ucfg_send_big_data_stats_request() - API to send big data stats
* request
* @vdev: pointer to vdev object
* @type: request type
* @info: request info
*
* Return: status of operation
*/
QDF_STATUS ucfg_send_big_data_stats_request(struct wlan_objmgr_vdev *vdev,
enum stats_req_type type,
struct request_info *info);
/**
* ucfg_mc_cp_set_big_data_fw_support() - set big data fw support
* @psoc: PSOC object
*
* API to set fw supports big data feature or not
*
* Return: void
*/
void
ucfg_mc_cp_set_big_data_fw_support(struct wlan_objmgr_psoc *psoc,
bool enable);
/**
* ucfg_mc_cp_get_big_data_fw_support() - get big data fw support
* @psoc: PSOC object
*
* API to get fw supports big data feature or not
*
* Return: void
*/
void
ucfg_mc_cp_get_big_data_fw_support(struct wlan_objmgr_psoc *psoc,
bool *enable);
#else
static inline
QDF_STATUS ucfg_send_big_data_stats_request(struct wlan_objmgr_vdev *vdev,
enum stats_req_type type,
struct request_info *info)
{
return QDF_STATUS_SUCCESS;
}
static inline void
ucfg_mc_cp_set_big_data_fw_support(struct wlan_objmgr_psoc *psoc,
bool enable)
{}
static inline void
ucfg_mc_cp_get_big_data_fw_support(struct wlan_objmgr_psoc *psoc,
bool *enable)
{}
#endif
#else
void static inline ucfg_mc_cp_stats_register_pmo_handler(void) { };
static inline QDF_STATUS ucfg_mc_cp_stats_send_stats_request(
struct wlan_objmgr_vdev *vdev,
enum stats_req_type type,
struct request_info *info)
{
return QDF_STATUS_SUCCESS;
}
static inline QDF_STATUS ucfg_mc_cp_stats_set_rate_flags(
struct wlan_objmgr_vdev *vdev,
enum tx_rate_info flags)
{
return QDF_STATUS_SUCCESS;
}
static inline QDF_STATUS ucfg_mc_cp_stats_get_psoc_wake_lock_stats(
struct wlan_objmgr_psoc *psoc,
struct wake_lock_stats *stats)
{
return QDF_STATUS_SUCCESS;
}
static inline QDF_STATUS ucfg_mc_cp_stats_inc_wake_lock_stats_by_protocol(
struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
enum qdf_proto_subtype protocol)
{
return QDF_STATUS_SUCCESS;
}
static inline QDF_STATUS ucfg_mc_cp_stats_inc_wake_lock_stats(
struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
uint32_t reason)
{
return QDF_STATUS_SUCCESS;
}
static inline QDF_STATUS ucfg_mc_cp_stats_inc_wake_lock_stats_by_dst_addr(
struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id, uint8_t *dest_mac)
{
return QDF_STATUS_SUCCESS;
}
static inline QDF_STATUS ucfg_mc_cp_stats_get_vdev_wake_lock_stats(
struct wlan_objmgr_vdev *vdev,
struct wake_lock_stats *stats)
{
return QDF_STATUS_SUCCESS;
}
static inline
QDF_STATUS ucfg_send_big_data_stats_request(struct wlan_objmgr_vdev *vdev,
enum stats_req_type type,
struct request_info *info)
{
return QDF_STATUS_SUCCESS;
}
static inline void
ucfg_mc_cp_set_big_data_fw_support(struct wlan_objmgr_psoc *psoc,
bool enable)
{}
static inline void
ucfg_mc_cp_big_data_fw_support(struct wlan_objmgr_psoc *psoc,
bool *enable)
{}
#endif /* QCA_SUPPORT_CP_STATS */
#endif /* __WLAN_CP_STATS_MC_UCFG_API_H__ */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,97 +0,0 @@
/*
* Copyright (c) 2018 The Linux Foundation. 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.
*/
/**
* DOC: declare various api which shall be used by
* DISA user configuration and target interface
*/
#ifndef _WLAN_DISA_MAIN_H_
#define _WLAN_DISA_MAIN_H_
#include "wlan_disa_public_struct.h"
#include "wlan_disa_obj_mgmt_public_struct.h"
#include "wlan_disa_priv.h"
#include "wlan_disa_objmgr.h"
#define disa_fatal(params...) \
QDF_TRACE_FATAL(QDF_MODULE_ID_DISA, params)
#define disa_err(params...) \
QDF_TRACE_ERROR(QDF_MODULE_ID_DISA, params)
#define disa_warn(params...) \
QDF_TRACE_ERROR(QDF_MODULE_ID_DISA, params)
#define disa_info(params...) \
QDF_TRACE_INFO(QDF_MODULE_ID_DISA, params)
#define disa_debug(params...) \
QDF_TRACE_DEBUG(QDF_MODULE_ID_DISA, params)
#define disa_nofl_fatal(params...) \
QDF_TRACE_FATAL_NO_FL(QDF_MODULE_ID_DISA, params)
#define disa_nofl_err(params...) \
QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_DISA, params)
#define disa_nofl_warn(params...) \
QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_DISA, params)
#define disa_nofl_info(params...) \
QDF_TRACE_INFO_NO_FL(QDF_MODULE_ID_DISA, params)
#define disa_nofl_debug(params...) \
QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_DISA, params)
#define DISA_ENTER() \
QDF_TRACE_ENTER(QDF_MODULE_ID_DISA, "enter")
#define DISA_EXIT() \
QDF_TRACE_EXIT(QDF_MODULE_ID_DISA, "exit")
/**
* disa_allocate_ctx() - Api to allocate disa ctx
*
* Helper function to allocate disa ctx
*
* Return: Success or failure.
*/
QDF_STATUS disa_allocate_ctx(void);
/**
* disa_free_ctx() - to free disa context
*
* Helper function to free disa context
*
* Return: None.
*/
void disa_free_ctx(void);
/**
* disa_get_context() - to get disa context
*
* Helper function to get disa context
*
* Return: disa context.
*/
struct wlan_disa_ctx *disa_get_context(void);
/**
* disa_core_encrypt_decrypt_req() - Form encrypt/decrypt request
* @psoc: objmgr psoc object
* @req: DISA encrypt/decrypt request parameters
*
* Return: QDF status success or failure
*/
QDF_STATUS disa_core_encrypt_decrypt_req(struct wlan_objmgr_psoc *psoc,
struct disa_encrypt_decrypt_req_params *req,
encrypt_decrypt_resp_callback cb,
void *cookie);
#endif /* end of _WLAN_DISA_MAIN_H_ */

View File

@@ -1,192 +0,0 @@
/*
* Copyright (c) 2018 The Linux Foundation. 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.
*/
/**
* DOC: This file contains various object manager related wrappers and helpers
*/
#ifndef _WLAN_DISA_OBJMGR_H
#define _WLAN_DISA_OBJMGR_H
#include "wlan_objmgr_vdev_obj.h"
#include "wlan_objmgr_psoc_obj.h"
#include "wlan_disa_obj_mgmt_public_struct.h"
/* Get/Put Ref */
/**
* disa_psoc_get_ref() - DISA wrapper to increment ref count, if allowed
* @psoc: PSOC object
*
* DISA wrapper to increment ref count after checking valid object state
*
* Return: SUCCESS/FAILURE
*/
static inline QDF_STATUS disa_psoc_get_ref(struct wlan_objmgr_psoc *psoc)
{
return wlan_objmgr_psoc_try_get_ref(psoc, WLAN_DISA_ID);
}
/**
* disa_psoc_put_ref() - DISA wrapper to decrement ref count
* @psoc: PSOC object
*
* DISA wrapper to decrement ref count of psoc
*
* Return: SUCCESS/FAILURE
*/
static inline void disa_psoc_put_ref(struct wlan_objmgr_psoc *psoc)
{
return wlan_objmgr_psoc_release_ref(psoc, WLAN_DISA_ID);
}
/* Private Data */
/**
* disa_psoc_get_priv_nolock(): DISA wrapper to retrieve component object
* @psoc: Psoc pointer
*
* DISA wrapper used to get the component private object pointer
*
* Return: Component private object
*/
static inline void *disa_psoc_get_priv_nolock(struct wlan_objmgr_psoc *psoc)
{
return wlan_objmgr_psoc_get_comp_private_obj(psoc, WLAN_UMAC_COMP_DISA);
}
/* Ids */
static inline uint8_t
disa_vdev_get_id(struct wlan_objmgr_vdev *vdev)
{
uint8_t vdev_id;
vdev_id = wlan_vdev_get_id(vdev);
QDF_BUG(vdev_id < WLAN_UMAC_PSOC_MAX_VDEVS);
return vdev_id;
}
/* Tree Navigation */
/**
* !PLEASE READ!
*
* The following are objmgr navigation helpers for traversing objmgr object
* trees.
*
* Objmgr ensures parents of an objmgr object cannot be freed while a valid
* reference to one of its children is held. Based on this fact, all of these
* navigation helpers make the following assumptions to ensure safe usage:
*
* 1) The caller must hold a valid reference to the input objmgr object!
* E.g. Use disa_[peer|vdev|pdev|psoc]_get_ref() on the input objmgr
* object before using these APIs
* 2) Given assumption #1, the caller does not need to hold a reference to the
* parents of the input objmgr object
* 3) Given assumption #1, parents of the input objmgr object cannot be null
* 4) Given assumption #1, private contexts of any parent of the input objmgr
* object cannot be null
*
* These characteristics remove the need for most sanity checks when dealing
* with objmgr objects. However, please note that if you ever walk the tree
* from parent to child, references must be acquired all the way down!
*
* Example #1:
*
* psoc = disa_vdev_get_psoc(vdev);
* if (!psoc)
* // this is dead code
*
* Example #2:
*
* psoc_priv = disa_psoc_get_priv(psoc);
* if (!psoc_priv)
* // this is dead code
*
* Example #3:
*
* status = disa_psoc_get_ref(psoc);
*
* ...
*
* psoc = disa_vdev_get_psoc(vdev);
*
* // the next line is redundant, don't do it!
* status = disa_psoc_get_ref(psoc);
*/
/* Tree Navigation: psoc */
static inline struct disa_psoc_priv_obj *
disa_psoc_get_priv(struct wlan_objmgr_psoc *psoc)
{
struct disa_psoc_priv_obj *psoc_priv;
psoc_priv = disa_psoc_get_priv_nolock(psoc);
QDF_BUG(psoc_priv);
return psoc_priv;
}
static inline struct wlan_objmgr_vdev *
disa_psoc_get_vdev(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id)
{
struct wlan_objmgr_vdev *vdev;
QDF_BUG(vdev_id < WLAN_UMAC_PSOC_MAX_VDEVS);
if (vdev_id >= WLAN_UMAC_PSOC_MAX_VDEVS)
return NULL;
wlan_psoc_obj_lock(psoc);
vdev = psoc->soc_objmgr.wlan_vdev_list[vdev_id];
wlan_psoc_obj_unlock(psoc);
return vdev;
}
/* Tree Navigation: pdev */
static inline struct wlan_objmgr_psoc *
disa_pdev_get_psoc(struct wlan_objmgr_pdev *pdev)
{
struct wlan_objmgr_psoc *psoc;
psoc = wlan_pdev_get_psoc(pdev);
QDF_BUG(psoc);
return psoc;
}
/* Tree Navigation: vdev */
static inline struct wlan_objmgr_pdev *
disa_vdev_get_pdev(struct wlan_objmgr_vdev *vdev)
{
struct wlan_objmgr_pdev *pdev;
pdev = wlan_vdev_get_pdev(vdev);
QDF_BUG(pdev);
return pdev;
}
static inline struct wlan_objmgr_psoc *
disa_vdev_get_psoc(struct wlan_objmgr_vdev *vdev)
{
return disa_pdev_get_psoc(disa_vdev_get_pdev(vdev));
}
#endif /* _WLAN_DISA_OBJMGR_H */

View File

@@ -1,59 +0,0 @@
/*
* Copyright (c) 2018 The Linux Foundation. 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.
*/
/**
* DOC: Declare various struct, macros which are used privately in DISA
* component.
*
* Note: This file shall not contain public API's prototype/declarations.
*
*/
#ifndef _WLAN_DISA_PRIV_STRUCT_H_
#define _WLAN_DISA_PRIV_STRUCT_H_
#include <qdf_lock.h>
#include "wlan_disa_public_struct.h"
/**
* struct disa_psoc_priv_obj -psoc specific user configuration required for disa
*
* @disa_rx_ops: rx operations for disa
* @disa_tx_ops: tx operations for disa
* @disa_psoc_lock: spin lock for disa psoc priv ctx
*/
struct disa_psoc_priv_obj {
struct wlan_disa_rx_ops disa_rx_ops;
struct wlan_disa_tx_ops disa_tx_ops;
qdf_spinlock_t lock;
};
/**
* struct wlan_disa_ctx - disa context for single command
*
* @callback: hdd callback for disa encrypt/decrypt resp
* @callback_context: context for the callback
* @lock: spin lock for disa context
*/
struct wlan_disa_ctx {
encrypt_decrypt_resp_callback callback;
void *callback_context;
bool request_active;
qdf_spinlock_t lock;
};
#endif /* end of _WLAN_DISA_PRIV_STRUCT_H_ */

View File

@@ -1,105 +0,0 @@
/*
* Copyright (c) 2018-2020 The Linux Foundation. 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.
*/
/**
* DOC: Implement various api / helper function which shall be used for
* DISA user and target interface.
*/
#include "wlan_disa_main.h"
#include "wlan_disa_obj_mgmt_public_struct.h"
#include "wlan_disa_tgt_api.h"
static struct wlan_disa_ctx *gp_disa_ctx;
QDF_STATUS disa_allocate_ctx(void)
{
/* If it is already created, ignore */
if (gp_disa_ctx) {
disa_debug("already allocated disa_ctx");
return QDF_STATUS_SUCCESS;
}
/* allocate DISA ctx */
gp_disa_ctx = qdf_mem_malloc(sizeof(*gp_disa_ctx));
if (!gp_disa_ctx)
return QDF_STATUS_E_NOMEM;
qdf_spinlock_create(&gp_disa_ctx->lock);
return QDF_STATUS_SUCCESS;
}
void disa_free_ctx(void)
{
if (!gp_disa_ctx) {
disa_err("disa ctx is already freed");
QDF_ASSERT(0);
return;
}
qdf_spinlock_destroy(&gp_disa_ctx->lock);
qdf_mem_free(gp_disa_ctx);
gp_disa_ctx = NULL;
}
struct wlan_disa_ctx *disa_get_context(void)
{
return gp_disa_ctx;
}
QDF_STATUS disa_core_encrypt_decrypt_req(struct wlan_objmgr_psoc *psoc,
struct disa_encrypt_decrypt_req_params *req,
encrypt_decrypt_resp_callback cb,
void *cookie)
{
struct wlan_disa_ctx *disa_ctx;
QDF_STATUS status = QDF_STATUS_SUCCESS;
DISA_ENTER();
disa_ctx = disa_get_context();
if (!disa_ctx) {
disa_err("DISA context is NULL!");
return QDF_STATUS_E_INVAL;
}
qdf_spin_lock_bh(&disa_ctx->lock);
if (!disa_ctx->request_active) {
disa_ctx->callback = cb;
disa_ctx->callback_context = cookie;
disa_ctx->request_active = true;
} else {
status = QDF_STATUS_E_INVAL;
}
qdf_spin_unlock_bh(&disa_ctx->lock);
if (status != QDF_STATUS_SUCCESS) {
disa_err("A request is already active!");
return status;
}
status = disa_psoc_get_ref(psoc);
if (status != QDF_STATUS_SUCCESS) {
disa_err("DISA cannot get the reference out of psoc");
return status;
}
status = tgt_disa_encrypt_decrypt_req(psoc, req);
disa_psoc_put_ref(psoc);
DISA_EXIT();
return status;
}

View File

@@ -1,116 +0,0 @@
/*
* Copyright (c) 2018 The Linux Foundation. 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.
*/
/**
* DOC: declare utility API related to the disa component
* called by other components
*/
#ifndef _WLAN_DISA_OBJ_MGMT_API_H_
#define _WLAN_DISA_OBJ_MGMT_API_H_
#include <qdf_types.h>
struct wlan_objmgr_psoc;
/**
* disa_init() - register disa notification handlers.
*
* This function registers disa related notification handlers.
*
* Return: QDF_STATUS_SUCCESS - in case of success else return error
*/
#ifdef WLAN_FEATURE_DISA
QDF_STATUS disa_init(void);
#else
static inline QDF_STATUS disa_init(void)
{
return QDF_STATUS_SUCCESS;
}
#endif
/**
* disa_deinit() - unregister disa notification handlers.
*
* This function unregisters disa related notification handlers.
*
* Return: QDF_STATUS_SUCCESS - in case of success else return error
*/
#ifdef WLAN_FEATURE_DISA
QDF_STATUS disa_deinit(void);
#else
static inline QDF_STATUS disa_deinit(void)
{
return QDF_STATUS_SUCCESS;
}
#endif
/**
* disa_psoc_enable() - Trigger psoc enable for DISA
* @psoc: objmgr psoc object
*
* Return: QDF status success or failure
*/
#ifdef WLAN_FEATURE_DISA
QDF_STATUS disa_psoc_enable(struct wlan_objmgr_psoc *psoc);
#else
static inline QDF_STATUS disa_psoc_enable(struct wlan_objmgr_psoc *psoc)
{
return QDF_STATUS_SUCCESS;
}
#endif
/**
* disa_psoc_disable() - Trigger psoc disable for DISA
* @psoc: objmgr psoc object
*
* Return: QDF status success or failure
*/
#ifdef WLAN_FEATURE_DISA
QDF_STATUS disa_psoc_disable(struct wlan_objmgr_psoc *psoc);
#else
static inline QDF_STATUS disa_psoc_disable(struct wlan_objmgr_psoc *psoc)
{
return QDF_STATUS_SUCCESS;
}
#endif
/**
* disa_psoc_object_created_notification(): disa psoc create handler
* @psoc: psoc which is going to created by objmgr
* @arg: argument for psoc create handler
*
* Attach psoc private object, register rx/tx ops and event handlers
*
* Return QDF_STATUS status in case of success else return error
*/
QDF_STATUS disa_psoc_object_created_notification(
struct wlan_objmgr_psoc *psoc, void *arg);
/**
* disa_psoc_object_destroyed_notification(): disa psoc destroy handler
* @psoc: objmgr object corresponding to psoc which is going to be destroyed
* @arg: argument for psoc destroy handler
*
* Detach and free psoc private object, unregister event handlers
*
* Return QDF_STATUS status in case of success else return error
*/
QDF_STATUS disa_psoc_object_destroyed_notification(
struct wlan_objmgr_psoc *psoc, void *arg);
#endif /* end of _WLAN_DISA_OBJ_MGMT_API_H_ */

View File

@@ -1,56 +0,0 @@
/*
* Copyright (c) 2018 The Linux Foundation. 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.
*/
/**
* DOC: Declare various struct, macros which are used for object mgmt in disa.
*
* Note: This file shall not contain public API's prototype/declarations.
*
*/
#ifndef _WLAN_DISA_OBJ_MGMT_PUBLIC_STRUCT_H_
#define _WLAN_DISA_OBJ_MGMT_PUBLIC_STRUCT_H_
struct wlan_objmgr_psoc;
struct disa_encrypt_decrypt_req_params;
struct disa_encrypt_decrypt_resp_params;
/**
* struct wlan_disa_tx_ops - structure of tx operation function
* pointers for disa component
* @disa_encrypt_decrypt_req: send encrypt/decrypt request
* @disa_register_ev_handlers: register disa event handlers
* @disa_unregister_ev_handlers: unregister disa event handlers
*/
struct wlan_disa_tx_ops {
QDF_STATUS (*disa_encrypt_decrypt_req)(struct wlan_objmgr_psoc *psoc,
struct disa_encrypt_decrypt_req_params *req);
QDF_STATUS (*disa_register_ev_handlers)(struct wlan_objmgr_psoc *psoc);
QDF_STATUS (*disa_unregister_ev_handlers)
(struct wlan_objmgr_psoc *psoc);
};
/**
* struct wlan_disa_rx_ops - structure of rx operation function
* pointers for disa component
* @encrypt_decrypt_msg_resp: send response of encrypt/decrypt request
*/
struct wlan_disa_rx_ops {
QDF_STATUS (*encrypt_decrypt_msg_resp)(struct wlan_objmgr_psoc *psoc,
struct disa_encrypt_decrypt_resp_params *resp);
};
#endif /* end of _WLAN_DISA_OBJ_MGMT_PUBLIC_STRUCT_H_ */

View File

@@ -1,85 +0,0 @@
/*
* Copyright (c) 2018 The Linux Foundation. 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.
*/
/**
* DOC: Declare various struct, macros which shall be used in the DISA
* component.
*
* Note: This file shall not contain public API's prototype/declarations.
*
*/
#ifndef _WLAN_DISA_PUBLIC_STRUCT_H_
#define _WLAN_DISA_PUBLIC_STRUCT_H_
#include <qdf_types.h>
#define MAC_MAX_KEY_LENGTH 32
#define MAC_PN_LENGTH 8
#define MAX_MAC_HEADER_LEN 32
#define MIN_MAC_HEADER_LEN 24
/**
* struct disa_encrypt_decrypt_req_params - disa encrypt request
* @vdev_id: virtual device id
* @key_flag: This indicates firmware to encrypt/decrypt payload
* see ENCRYPT_DECRYPT_FLAG
* @key_idx: Index used in storing key
* @key_cipher: cipher used for encryption/decryption
* Eg: see WMI_CIPHER_AES_CCM for CCMP
* @key_len: length of key data
* @key_txmic_len: length of Tx MIC
* @key_rxmic_len: length of Rx MIC
* @key_data: Key
* @pn: packet number
* @mac_header: MAC header
* @data_len: length of data
* @data: pointer to payload
*/
struct disa_encrypt_decrypt_req_params {
uint32_t vdev_id;
uint8_t key_flag;
uint32_t key_idx;
uint32_t key_cipher;
uint32_t key_len;
uint32_t key_txmic_len;
uint32_t key_rxmic_len;
uint8_t key_data[MAC_MAX_KEY_LENGTH];
uint8_t pn[MAC_PN_LENGTH];
uint8_t mac_header[MAX_MAC_HEADER_LEN];
uint32_t data_len;
uint8_t *data;
};
/**
* struct disa_encrypt_decrypt_resp_params - disa encrypt response
* @vdev_id: vdev id
* @status: status
* @data_length: data length
* @data: data pointer
*/
struct disa_encrypt_decrypt_resp_params {
uint32_t vdev_id;
int32_t status;
uint32_t data_len;
uint8_t *data;
};
typedef void (*encrypt_decrypt_resp_callback)(void *cookie,
struct disa_encrypt_decrypt_resp_params *resp) ;
#endif /* end of _WLAN_DISA_PUBLIC_STRUCT_H_ */

View File

@@ -1,71 +0,0 @@
/*
* Copyright (c) 2018 The Linux Foundation. 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.
*/
/**
* DOC: Declare public API for disa to interact with target/WMI
*/
#ifndef _WLAN_DISA_TGT_API_H_
#define _WLAN_DISA_TGT_API_H_
#include <qdf_types.h>
struct wlan_objmgr_psoc;
struct disa_encrypt_decrypt_req_params;
struct disa_encrypt_decrypt_resp_params;
#define GET_DISA_TX_OPS_FROM_PSOC(psoc) \
(&disa_psoc_get_priv(psoc)->disa_tx_ops)
/**
* tgt_disa_encrypt_decrypt_req() - send encrypt/decrypt request to target if
* @psoc: objmgr psoc object
* @req: encrypt/decrypt parameters
*
* Return: QDF_STATUS
*/
QDF_STATUS tgt_disa_encrypt_decrypt_req(struct wlan_objmgr_psoc *psoc,
struct disa_encrypt_decrypt_req_params *req);
/**
* tgt_disa_encrypt_decrypt_resp() - receive encrypt/decrypt response
* from target if
* @psoc: objmgr psoc object
* @resp: encrypt/decrypt response containing results
*
* Return: QDF_STATUS
*/
QDF_STATUS tgt_disa_encrypt_decrypt_resp(struct wlan_objmgr_psoc *psoc,
struct disa_encrypt_decrypt_resp_params *resp);
/**
* tgt_disa_register_ev_handlers() - API to register disa event handlers
* @psoc: objmgr psoc object
*
* Return: QDF_STATUS_SUCCESS in case of success else return error
*/
QDF_STATUS tgt_disa_register_ev_handlers(struct wlan_objmgr_psoc *psoc);
/**
* tgt_disa_unregister_ev_handlers() - API to unregister disa event handlers
* @psoc: objmgr psoc object
*
* Return: QDF_STATUS_SUCCESS in case of success else return error
*/
QDF_STATUS tgt_disa_unregister_ev_handlers(struct wlan_objmgr_psoc *psoc);
#endif /* end of _WLAN_DISA_TGT_API_H_ */

View File

@@ -1,46 +0,0 @@
/*
* Copyright (c) 2018 The Linux Foundation. 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.
*/
/**
* DOC: Declare public API related to the disa called by north bound HDD/OSIF
*/
#ifndef _WLAN_DISA_UCFG_API_H_
#define _WLAN_DISA_UCFG_API_H_
#include "wlan_disa_public_struct.h"
struct wlan_objmgr_psoc;
struct disa_encrypt_decrypt_req_params;
/**
* ucfg_disa_encrypt_decrypt_req() - Send encrypt/decrypt request to the DISA
* core
* @psoc: objmgr psoc object
* @req: DISA encrypt/decrypt request parameters
* @cb: Response callback for the encrypt/decrypt request
* @cookie: Cookie to pass to the response callback
*
* Return: QDF status success or failure
*/
QDF_STATUS ucfg_disa_encrypt_decrypt_req(struct wlan_objmgr_psoc *psoc,
struct disa_encrypt_decrypt_req_params *req,
encrypt_decrypt_resp_callback cb,
void *cookie);
#endif /* end of _WLAN_DISA_UCFG_API_H_ */

View File

@@ -1,209 +0,0 @@
/*
* Copyright (c) 2018-2020 The Linux Foundation. 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.
*/
/**
* DOC: define utility API related to the DISA component
* called by other components
*/
#include "wlan_disa_obj_mgmt_api.h"
#include "wlan_disa_main.h"
#include "target_if_disa.h"
#include "wlan_disa_tgt_api.h"
#include "wlan_objmgr_global_obj.h"
/**
* disa_init() - register disa notification handlers.
*
* This function registers disa related notification handlers and
* allocates disa context.
*
* Return: QDF_STATUS_SUCCESS - in case of success else return error
*/
QDF_STATUS disa_init(void)
{
QDF_STATUS status;
DISA_ENTER();
if (disa_allocate_ctx() != QDF_STATUS_SUCCESS) {
disa_err("unable to allocate disa ctx");
status = QDF_STATUS_E_FAULT;
goto out;
}
status = wlan_objmgr_register_psoc_create_handler(
WLAN_UMAC_COMP_DISA,
disa_psoc_object_created_notification,
NULL);
if (status != QDF_STATUS_SUCCESS) {
disa_err("unable to register psoc create handler");
goto err_free_ctx;
}
status = wlan_objmgr_register_psoc_destroy_handler(
WLAN_UMAC_COMP_DISA,
disa_psoc_object_destroyed_notification,
NULL);
if (status != QDF_STATUS_SUCCESS) {
disa_err("unable to register psoc destroy handler");
wlan_objmgr_unregister_psoc_create_handler(
WLAN_UMAC_COMP_DISA,
disa_psoc_object_created_notification,
NULL);
} else {
goto out;
}
err_free_ctx:
disa_free_ctx();
out:
DISA_EXIT();
return status;
}
/**
* disa_deinit() - unregister disa notification handlers.
*
* This function unregisters disa related notification handlers and
* frees disa context.
*
* Return: QDF_STATUS_SUCCESS - in case of success else return error
*/
QDF_STATUS disa_deinit(void)
{
QDF_STATUS status;
DISA_ENTER();
status = wlan_objmgr_unregister_psoc_destroy_handler(
WLAN_UMAC_COMP_DISA,
disa_psoc_object_destroyed_notification,
NULL);
if (status != QDF_STATUS_SUCCESS)
disa_err("unable to unregister psoc create handle");
status = wlan_objmgr_unregister_psoc_create_handler(
WLAN_UMAC_COMP_DISA,
disa_psoc_object_created_notification,
NULL);
if (status != QDF_STATUS_SUCCESS)
disa_err("unable to unregister psoc create handle");
disa_free_ctx();
DISA_EXIT();
return status;
}
/**
* disa_psoc_object_created_notification(): disa psoc create handler
* @psoc: psoc which is going to created by objmgr
* @arg: argument for psoc create handler
*
* Attach psoc private object, register rx/tx ops and event handlers
*
* Return QDF_STATUS status in case of success else return error
*/
QDF_STATUS disa_psoc_object_created_notification(
struct wlan_objmgr_psoc *psoc, void *arg)
{
struct disa_psoc_priv_obj *disa_priv;
QDF_STATUS status;
DISA_ENTER();
disa_priv = qdf_mem_malloc(sizeof(*disa_priv));
if (!disa_priv) {
status = QDF_STATUS_E_NOMEM;
goto out;
}
status = wlan_objmgr_psoc_component_obj_attach(psoc,
WLAN_UMAC_COMP_DISA,
(void *)disa_priv, QDF_STATUS_SUCCESS);
if (status != QDF_STATUS_SUCCESS) {
disa_err("Failed to attach disa_priv with psoc");
qdf_mem_free(disa_priv);
goto out;
}
qdf_spinlock_create(&disa_priv->lock);
target_if_disa_register_tx_ops(&disa_priv->disa_tx_ops);
out:
DISA_EXIT();
return status;
}
/**
* disa_psoc_object_destroyed_notification(): disa psoc destroy handler
* @psoc: objmgr object corresponding to psoc which is going to be destroyed
* @arg: argument for psoc destroy handler
*
* Detach and free psoc private object, unregister event handlers
*
* Return QDF_STATUS status in case of success else return error
*/
QDF_STATUS disa_psoc_object_destroyed_notification(
struct wlan_objmgr_psoc *psoc, void *arg)
{
struct disa_psoc_priv_obj *disa_priv = NULL;
QDF_STATUS status = QDF_STATUS_SUCCESS;
DISA_ENTER();
disa_priv = disa_psoc_get_priv(psoc);
status = wlan_objmgr_psoc_component_obj_detach(psoc,
WLAN_UMAC_COMP_DISA,
(void *)disa_priv);
if (status != QDF_STATUS_SUCCESS)
disa_err("Failed to detach disa_priv with psoc");
qdf_spinlock_destroy(&disa_priv->lock);
qdf_mem_free(disa_priv);
DISA_EXIT();
return status;
}
/**
* disa_psoc_enable() - Trigger psoc enable for DISA
* @psoc: objmgr psoc object
*
* Return: QDF status success or failure
*/
QDF_STATUS disa_psoc_enable(struct wlan_objmgr_psoc *psoc)
{
return tgt_disa_register_ev_handlers(psoc);
}
/**
* disa_psoc_disable() - Trigger psoc disable for DISA
* @psoc: objmgr psoc object
*
* Return: QDF status success or failure
*/
QDF_STATUS disa_psoc_disable(struct wlan_objmgr_psoc *psoc)
{
return tgt_disa_unregister_ev_handlers(psoc);
}

View File

@@ -1,133 +0,0 @@
/*
* Copyright (c) 2018 The Linux Foundation. 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.
*/
/**
* DOC: Implements public API for disa to interact with target/WMI
*/
#include "wlan_disa_tgt_api.h"
#include "wlan_disa_main.h"
#include "wlan_disa_public_struct.h"
/**
* tgt_disa_encrypt_decrypt_req() - send encrypt/decrypt request to target if
* @psoc: objmgr psoc object
* @req: encrypt/decrypt parameters
*
* Return: QDF_STATUS
*/
QDF_STATUS tgt_disa_encrypt_decrypt_req(struct wlan_objmgr_psoc *psoc,
struct disa_encrypt_decrypt_req_params *req)
{
struct wlan_disa_tx_ops *disa_tx_ops;
QDF_STATUS status = QDF_STATUS_E_FAILURE;
DISA_ENTER();
disa_tx_ops = GET_DISA_TX_OPS_FROM_PSOC(psoc);
QDF_ASSERT(disa_tx_ops->disa_encrypt_decrypt_req);
if (disa_tx_ops->disa_encrypt_decrypt_req)
status = disa_tx_ops->disa_encrypt_decrypt_req(psoc, req);
DISA_EXIT();
return status;
}
/**
* tgt_disa_encrypt_decrypt_resp() - receive encrypt/decrypt response
* from target if
* @psoc: objmgr psoc object
* @resp: encrypt/decrypt response containing results
*
* Return: QDF_STATUS
*/
QDF_STATUS tgt_disa_encrypt_decrypt_resp(struct wlan_objmgr_psoc *psoc,
struct disa_encrypt_decrypt_resp_params *resp)
{
struct wlan_disa_ctx *disa_ctx;
encrypt_decrypt_resp_callback cb;
void *cookie;
DISA_ENTER();
if (!resp) {
disa_err("encrypt/decrypt resp is null");
return QDF_STATUS_E_NULL_VALUE;
}
disa_ctx = disa_get_context();
if (!disa_ctx) {
disa_err("DISA context is NULL!");
return QDF_STATUS_E_INVAL;
}
qdf_spin_lock_bh(&disa_ctx->lock);
cb = disa_ctx->callback;
disa_ctx->callback = NULL;
cookie = disa_ctx->callback_context;
disa_ctx->callback_context = NULL;
disa_ctx->request_active = false;
qdf_spin_unlock_bh(&disa_ctx->lock);
if (cb)
cb(cookie, resp);
DISA_EXIT();
return QDF_STATUS_SUCCESS;
}
/**
* tgt_disa_register_ev_handlers() - API to register disa event handlers
* @psoc: objmgr psoc object
*
* Return: QDF_STATUS_SUCCESS in case of success else return error
*/
QDF_STATUS tgt_disa_register_ev_handlers(struct wlan_objmgr_psoc *psoc)
{
struct wlan_disa_tx_ops *disa_tx_ops;
disa_tx_ops = GET_DISA_TX_OPS_FROM_PSOC(psoc);
QDF_ASSERT(disa_tx_ops->disa_register_ev_handlers);
if (disa_tx_ops->disa_register_ev_handlers)
return disa_tx_ops->disa_register_ev_handlers(psoc);
return QDF_STATUS_SUCCESS;
}
/**
* tgt_disa_unregister_ev_handlers() - API to unregister disa event handlers
* @psoc: objmgr psoc object
*
* Return: QDF_STATUS_SUCCESS in case of success else return error
*/
QDF_STATUS tgt_disa_unregister_ev_handlers(struct wlan_objmgr_psoc *psoc)
{
struct wlan_disa_tx_ops *disa_tx_ops;
disa_tx_ops = GET_DISA_TX_OPS_FROM_PSOC(psoc);
QDF_ASSERT(disa_tx_ops->disa_unregister_ev_handlers);
if (disa_tx_ops->disa_unregister_ev_handlers)
return disa_tx_ops->disa_unregister_ev_handlers(psoc);
return QDF_STATUS_SUCCESS;
}

View File

@@ -1,41 +0,0 @@
/*
* Copyright (c) 2018 The Linux Foundation. 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.
*/
/**
* DOC: public API related to the disa called by north bound HDD/OSIF
*/
#include "wlan_disa_ucfg_api.h"
#include "wlan_disa_main.h"
/**
* ucfg_disa_encrypt_decrypt_req() - Send encrypt/decrypt request to the DISA
* core
* @psoc: objmgr psoc object
* @req: DISA encrypt/decrypt request parameters
*
* Return: QDF status success or failure
*/
QDF_STATUS ucfg_disa_encrypt_decrypt_req(struct wlan_objmgr_psoc *psoc,
struct disa_encrypt_decrypt_req_params *req,
encrypt_decrypt_resp_callback cb,
void *cookie)
{
return disa_core_encrypt_decrypt_req(psoc, req, cb, cookie);
}

View File

@@ -1,55 +0,0 @@
/*
* Copyright (c) 2018-2019 The Linux Foundation. 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.
*/
/**
* DOC: Driver Synchronization Core (DSC) APIs for use by the driver
* orchestration layer.
*
* This infrastructure accomplishes two high level goals:
* 1) Replace ad-hoc locking/flags (hdd_init_deinit_lock,
* iface_change_lock, con_mode_flag, etc., etc., etc.)
* 2) Make cds_ssr_protect() and driver state checking atomic
*
* These two goals are commplished in DSC via two corollary concepts:
* 1) Transitions (as in driver state machine transitions)
* These are mutually exclusive, and replace ad-hoc locking
* 2) Operations (as in operations the driver is currently servicing)
* These execute concurrently with other operations, and replace
* cds_ssr_protect(). Any active transition causes new operations to be
* rejected, in the same way as cds_ssr_protect/hdd_validate_context would.
*
* Transitions and operations are split into 3 distinct levels: driver, psoc,
* and vdev. These levels are arranged into a tree, with a single driver at
* the root, zero or more psocs per driver, and zero or more vdevs per psoc.
*
* High level transitions block transitions and operations at the same level,
* down-tree, and up-tree. So a driver transition effectively prevents any new
* activity in the system, while a vdev transition prevents transtitions and
* operations on the same vdev, its parent psoc, and the driver. This also means
* that sibling nodes can transition at the same time, e.g. one vdev going up at
* the same time another is going down.
*/
#ifndef __WLAN_DSC_H
#define __WLAN_DSC_H
#include "wlan_dsc_driver.h"
#include "wlan_dsc_psoc.h"
#include "wlan_dsc_vdev.h"
#endif /* __WLAN_DSC_H */

View File

@@ -1,142 +0,0 @@
/*
* Copyright (c) 2018 The Linux Foundation. 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.
*/
/**
* DOC: Driver Synchronization Core (DSC) driver-level APIs
*/
#ifndef __WLAN_DSC_DRIVER_H
#define __WLAN_DSC_DRIVER_H
#include "qdf_status.h"
/**
* struct dsc_driver - opaque dsc driver context
*/
struct dsc_driver;
/**
* dsc_driver_create() - create a dsc driver context
* @out_driver: opaque double pointer to assign the new context to
*
* Return: QDF_STATUS
*/
QDF_STATUS dsc_driver_create(struct dsc_driver **out_driver);
/**
* dsc_driver_destroy() - destroy a dsc driver context
* @out_driver: opaque double pointer to context to destroy and NULL
*
* Note, this:
* - aborts all queued transitions on @driver
* - asserts @driver has no attached psoc's
* - asserts @driver has no operations in flight
*
* Return: None
*/
void dsc_driver_destroy(struct dsc_driver **out_driver);
/**
* dsc_driver_trans_start() - start a transition on @driver
* @driver: the driver to start a transition on
* @desc: a unique description of the transition to start
*
* This API immediately aborts if a transition on @driver is already in flight
*
* Call dsc_driver_trans_stop() to complete the transition.
*
* Return:
* QDF_STATUS_SUCCESS - transition started succcessfully
* QDF_STATUS_E_INVAL - invalid request (causes debug panic)
* QDF_STATUS_E_AGAIN - transition cannot currently be started
* QDF_STATUS_E_ALREADY - transition with @desc already in flight
*/
QDF_STATUS dsc_driver_trans_start(struct dsc_driver *driver, const char *desc);
/**
* dsc_driver_trans_start_wait() - start a transition on @driver, blocking if a
* transition is already in flight
* @driver: the driver to start a transition on
* @desc: a unique description of the transition to start
*
* Call dsc_driver_trans_stop() to complete the transition.
*
* Return:
* QDF_STATUS_SUCCESS - transition started succcessfully
* QDF_STATUS_E_INVAL - invalid request (causes debug panic)
* QDF_STATUS_E_AGAIN - transition cannot currently be started
* QDF_STATUS_E_ALREADY - transition with @desc already queued or in flight
*/
QDF_STATUS
dsc_driver_trans_start_wait(struct dsc_driver *driver, const char *desc);
/**
* dsc_driver_trans_stop() - complete current transition in flight on @driver
* @driver: the driver to complete the transition on
*
* Note: this asserts a transition is currently in flight on @driver
*
* Return: None
*/
void dsc_driver_trans_stop(struct dsc_driver *driver);
/**
* dsc_driver_assert_trans_protected() - assert @driver is protected by a
* transition
* @driver: the driver to check
*
* Return: None
*/
void dsc_driver_assert_trans_protected(struct dsc_driver *driver);
/**
* dsc_driver_op_start() - start an operation on @driver
* @driver: the driver to start an operation on
*
* Return:
* QDF_STATUS_SUCCESS - operation started succcessfully
* QDF_STATUS_E_INVAL - invalid request (causes debug panic)
* QDF_STATUS_E_AGAIN - operation cannot currently be started
* QDF_STATUS_E_NOMEM - out of memory
*/
#define dsc_driver_op_start(driver) _dsc_driver_op_start(driver, __func__)
QDF_STATUS _dsc_driver_op_start(struct dsc_driver *driver, const char *func);
/**
* dsc_driver_op_stop() - complete operation with matching @func on @driver
* @driver: the driver to stop an operation on
*
* Note: this asserts @func was previously started
*
* Return: None
*/
#define dsc_driver_op_stop(driver) _dsc_driver_op_stop(driver, __func__)
void _dsc_driver_op_stop(struct dsc_driver *driver, const char *func);
/**
* dsc_driver_wait_for_ops() - blocks until all operations on @driver have
* stopped
* @driver: the driver to wait for operations on
*
* Note: this asserts that @driver cannot currently transition
*
* Return: None
*/
void dsc_driver_wait_for_ops(struct dsc_driver *driver);
#endif /* __WLAN_DSC_DRIVER_H */

View File

@@ -1,148 +0,0 @@
/*
* Copyright (c) 2018-2019 The Linux Foundation. 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.
*/
/**
* DOC: Driver Synchronization Core (DSC) psoc-level APIs
*/
#ifndef __WLAN_DSC_PSOC_H
#define __WLAN_DSC_PSOC_H
#include "qdf_status.h"
#include "wlan_dsc_driver.h"
/**
* struct dsc_psoc - opaque dsc psoc context
*/
struct dsc_psoc;
/**
* dsc_psoc_create() - create a dsc psoc context
* @driver: parent dsc driver context
* @out_psoc: opaque double pointer to assign the new context to
*
* Note: this attaches @out_psoc to @driver
*
* Return: QDF_STATUS
*/
QDF_STATUS
dsc_psoc_create(struct dsc_driver *driver, struct dsc_psoc **out_psoc);
/**
* dsc_psoc_destroy() - destroy a dsc psoc context
* @out_psoc: opaque double pointer to context to destroy and NULL
*
* Note, this:
* - detaches @out_psoc from its parent driver context
* - aborts all queued transitions on @psoc
* - asserts @psoc has no attached vdev's
* - asserts @psoc has no operations in flight
*
* Return: None
*/
void dsc_psoc_destroy(struct dsc_psoc **out_psoc);
/**
* dsc_psoc_trans_start() - start a transition on @psoc
* @psoc: the psoc to start a transition on
* @desc: a unique description of the transition to start
*
* This API immediately aborts if a transition on @psoc is already in flight
*
* Call dsc_psoc_trans_stop() to complete the transition.
*
* Return:
* QDF_STATUS_SUCCESS - transition started succcessfully
* QDF_STATUS_E_INVAL - invalid request (causes debug panic)
* QDF_STATUS_E_AGAIN - transition cannot currently be started
* QDF_STATUS_E_ALREADY - transition with @desc already in flight
*/
QDF_STATUS dsc_psoc_trans_start(struct dsc_psoc *psoc, const char *desc);
/**
* dsc_psoc_trans_start_wait() - start a transition on @psoc, blocking if a
* transition is already in flight
* @psoc: the psoc to start a transition on
* @desc: a unique description of the transition to start
*
* Call dsc_psoc_trans_stop() to complete the transition.
*
* Return:
* QDF_STATUS_SUCCESS - transition started succcessfully
* QDF_STATUS_E_INVAL - invalid request (causes debug panic)
* QDF_STATUS_E_AGAIN - transition cannot currently be started
* QDF_STATUS_E_ALREADY - transition with @desc already queued or in flight
* QDF_STATUS_E_ABORTED - transition was aborted
*/
QDF_STATUS dsc_psoc_trans_start_wait(struct dsc_psoc *psoc, const char *desc);
/**
* dsc_psoc_trans_stop() - complete current transition in flight on @psoc
* @psoc: the psoc to complete the transition on
*
* Note: this asserts a transition is currently in flight on @psoc
*
* Return: None
*/
void dsc_psoc_trans_stop(struct dsc_psoc *psoc);
/**
* dsc_psoc_assert_trans_protected() - assert @psoc is protected by a transition
* @psoc: the psoc to check
*
* The protecting transition may be in flight on @psoc or its parent.
*
* Return: None
*/
void dsc_psoc_assert_trans_protected(struct dsc_psoc *psoc);
/**
* dsc_psoc_op_start() - start an operation on @psoc
* @psoc: the psoc to start an operation on
*
* Return:
* QDF_STATUS_SUCCESS - operation started succcessfully
* QDF_STATUS_E_INVAL - invalid request (causes debug panic)
* QDF_STATUS_E_AGAIN - operation cannot currently be started
* QDF_STATUS_E_NOMEM - out of memory
*/
#define dsc_psoc_op_start(psoc) _dsc_psoc_op_start(psoc, __func__)
QDF_STATUS _dsc_psoc_op_start(struct dsc_psoc *psoc, const char *func);
/**
* dsc_psoc_op_stop() - complete operation with matching @func on @psoc
* @psoc: the psoc to stop an operation on
*
* Note: this asserts @func was previously started
*
* Return: None
*/
#define dsc_psoc_op_stop(psoc) _dsc_psoc_op_stop(psoc, __func__)
void _dsc_psoc_op_stop(struct dsc_psoc *psoc, const char *func);
/**
* dsc_psoc_wait_for_ops() - blocks until all operations on @psoc have stopped
* @psoc: the psoc to wait for operations on
*
* Note: this asserts that @psoc cannot currently transition
*
* Return: None
*/
void dsc_psoc_wait_for_ops(struct dsc_psoc *psoc);
#endif /* __WLAN_DSC_PSOC_H */

View File

@@ -1,169 +0,0 @@
/*
* Copyright (c) 2018-2019, 2021 The Linux Foundation. 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.
*/
/**
* DOC: Driver Synchronization Core (DSC) vdev-level APIs
*/
#ifndef __WLAN_DSC_VDEV_H
#define __WLAN_DSC_VDEV_H
#include "qdf_status.h"
#include "wlan_dsc_psoc.h"
/**
* struct dsc_vdev - opaque dsc vdev context
*/
struct dsc_vdev;
/**
* dsc_vdev_create() - create a dsc vdev context
* @psoc: parent dsc psoc context
* @out_vdev: opaque double pointer to assign the new context to
*
* Note: this attaches @out_vdev to @psoc
*
* Return: QDF_STATUS
*/
QDF_STATUS dsc_vdev_create(struct dsc_psoc *psoc, struct dsc_vdev **out_vdev);
/**
* dsc_vdev_destroy() - destroy a dsc vdev context
* @out_vdev: opaque double pointer to context to destroy and NULL
*
* Note, this:
* - detaches @out_vdev from its parent psoc context
* - aborts all queued transitions on @vdev
* - asserts @vdev has no operations in flight
*
* Return: None
*/
void dsc_vdev_destroy(struct dsc_vdev **out_vdev);
/**
* dsc_vdev_trans_start() - start a transition on @vdev
* @vdev: the vdev to start a transition on
* @desc: a unique description of the transition to start
*
* This API immediately aborts if a transition on @vdev is already in flight
*
* Call dsc_vdev_trans_stop() to complete the transition.
*
* Return:
* QDF_STATUS_SUCCESS - transition started succcessfully
* QDF_STATUS_E_INVAL - invalid request (causes debug panic)
* QDF_STATUS_E_AGAIN - transition cannot currently be started
* QDF_STATUS_E_ALREADY - transition with @desc already in flight
*/
QDF_STATUS dsc_vdev_trans_start(struct dsc_vdev *vdev, const char *desc);
/**
* dsc_vdev_trans_start_wait() - start a transition on @vdev, blocking if a
* transition is already in flight
* @vdev: the vdev to start a transition on
* @desc: a unique description of the transition to start
*
* Call dsc_vdev_trans_stop() to complete the transition.
*
* Return:
* QDF_STATUS_SUCCESS - transition started succcessfully
* QDF_STATUS_E_INVAL - invalid request (causes debug panic)
* QDF_STATUS_E_AGAIN - transition cannot currently be started
* QDF_STATUS_E_ALREADY - transition with @desc already queued or in flight
* QDF_STATUS_E_ABORTED - transition was aborted
*/
QDF_STATUS dsc_vdev_trans_start_wait(struct dsc_vdev *vdev, const char *desc);
/**
* dsc_vdev_trans_stop() - complete current transition in flight on @vdev
* @vdev: the vdev to complete the transition on
*
* Note: this asserts a transition is currently in flight on @vdev
*
* Return: None
*/
void dsc_vdev_trans_stop(struct dsc_vdev *vdev);
/**
* dsc_vdev_assert_trans_protected() - assert @vdev is protected by a transition
* @vdev: the vdev to check
*
* The protecting transition may be in flight on @vdev or its ancestors.
*
* Return: None
*/
void dsc_vdev_assert_trans_protected(struct dsc_vdev *vdev);
/**
* dsc_vdev_op_start() - start an operation on @vdev
* @vdev: the vdev to start an operation on
*
* Return:
* QDF_STATUS_SUCCESS - operation started succcessfully
* QDF_STATUS_E_INVAL - invalid request (causes debug panic)
* QDF_STATUS_E_AGAIN - operation cannot currently be started
* QDF_STATUS_E_NOMEM - out of memory
*/
#define dsc_vdev_op_start(vdev) _dsc_vdev_op_start(vdev, __func__)
QDF_STATUS _dsc_vdev_op_start(struct dsc_vdev *vdev, const char *func);
/**
* dsc_vdev_op_stop() - complete operation with matching @func on @vdev
* @vdev: the vdev to stop an operation on
*
* Note: this asserts @func was previously started
*
* Return: None
*/
#define dsc_vdev_op_stop(vdev) _dsc_vdev_op_stop(vdev, __func__)
void _dsc_vdev_op_stop(struct dsc_vdev *vdev, const char *func);
/**
* dsc_vdev_wait_for_ops() - blocks until all operations on @vdev have stopped
* @vdev: the vdev to wait for operations on
*
* Note: this asserts that @vdev cannot currently transition
*
* Return: None
*/
void dsc_vdev_wait_for_ops(struct dsc_vdev *vdev);
/**
* dsc_vdev_get_cached_cmd() - Get north bound cmd cached during SSR
* @vdev: Pointer to the dsc vdev
*
* This api will be invoked after completion of SSR re-initialization to get
* the last north bound command received during SSR
*
* Return: North bound command ID
*/
uint8_t dsc_vdev_get_cached_cmd(struct dsc_vdev *vdev);
/**
* dsc_vdev_cache_command() - Cache north bound command during SSR
* @vdev: Pointer to the dsc vdev corresponding to the network interface
* @cmd_id: North bound command ID
*
* This api will be invoked when a north bound command is received during SSR
* and it should be handled after SSR re-initialization.
*
* Return: None
*/
void dsc_vdev_cache_command(struct dsc_vdev *vdev, uint8_t cmd_id);
#endif /* __WLAN_DSC_VDEV_H */

View File

@@ -1,420 +0,0 @@
/*
* Copyright (c) 2018-2019 The Linux Foundation. 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 "qdf_list.h"
#include "qdf_mem.h"
#include "qdf_status.h"
#include "qdf_str.h"
#include "qdf_threads.h"
#include "qdf_timer.h"
#include "__wlan_dsc.h"
#include "cds_api.h"
#ifdef WLAN_DSC_DEBUG
static void __dsc_dbg_op_timeout(void *opaque_op)
{
struct dsc_op *op = opaque_op;
qdf_print_thread_trace(op->thread);
QDF_DEBUG_PANIC("Operation '%s' exceeded %ums",
op->func, DSC_OP_TIMEOUT_MS);
}
/**
* __dsc_dbg_ops_init() - initialize debug ops data structures
* @ops: the ops container to initialize
*
* Return: None
*/
static inline void __dsc_dbg_ops_init(struct dsc_ops *ops)
{
qdf_list_create(&ops->list, 0);
}
/**
* __dsc_dbg_ops_deinit() - de-initialize debug ops data structures
* @ops: the ops container to de-initialize
*
* Return: None
*/
static inline void __dsc_dbg_ops_deinit(struct dsc_ops *ops)
{
qdf_list_destroy(&ops->list);
}
/**
* __dsc_dbg_ops_insert() - insert @func into the debug information in @ops
* @ops: the ops container to insert into
* @func: the debug information to insert
*
* Return: QDF_STATUS
*/
static QDF_STATUS __dsc_dbg_ops_insert(struct dsc_ops *ops, const char *func)
{
QDF_STATUS status;
struct dsc_op *op;
op = qdf_mem_malloc(sizeof(*op));
if (!op)
return QDF_STATUS_E_NOMEM;
op->thread = qdf_get_current_task();
status = qdf_timer_init(NULL, &op->timeout_timer, __dsc_dbg_op_timeout,
op, QDF_TIMER_TYPE_SW);
if (QDF_IS_STATUS_ERROR(status))
goto free_op;
op->func = func;
qdf_timer_start(&op->timeout_timer, DSC_OP_TIMEOUT_MS);
qdf_list_insert_back(&ops->list, &op->node);
return QDF_STATUS_SUCCESS;
free_op:
qdf_mem_free(op);
return status;
}
/**
* __dsc_dbg_ops_remove() - remove @func from the debug information in @ops
* @ops: the ops container to remove from
* @func: the debug information to remove
*
* Return: None
*/
static void __dsc_dbg_ops_remove(struct dsc_ops *ops, const char *func)
{
struct dsc_op *op;
/* Global pending op depth is usually <=3. Use linear search for now */
qdf_list_for_each(&ops->list, op, node) {
if (!qdf_str_eq(op->func, func))
continue;
/* this is safe because we cease iteration */
qdf_list_remove_node(&ops->list, &op->node);
qdf_timer_stop(&op->timeout_timer);
qdf_timer_free(&op->timeout_timer);
qdf_mem_free(op);
return;
}
QDF_DEBUG_PANIC("Driver op '%s' is not pending", func);
}
#else
static inline void __dsc_dbg_ops_init(struct dsc_ops *ops) { }
static inline void __dsc_dbg_ops_deinit(struct dsc_ops *ops) { }
static inline QDF_STATUS
__dsc_dbg_ops_insert(struct dsc_ops *ops, const char *func)
{
return QDF_STATUS_SUCCESS;
}
static inline void
__dsc_dbg_ops_remove(struct dsc_ops *ops, const char *func) { }
#endif /* WLAN_DSC_DEBUG */
void __dsc_ops_init(struct dsc_ops *ops)
{
ops->count = 0;
qdf_event_create(&ops->event);
__dsc_dbg_ops_init(ops);
}
void __dsc_ops_deinit(struct dsc_ops *ops)
{
/* assert no ops in flight */
dsc_assert(!ops->count);
__dsc_dbg_ops_deinit(ops);
qdf_event_destroy(&ops->event);
}
QDF_STATUS __dsc_ops_insert(struct dsc_ops *ops, const char *func)
{
QDF_STATUS status;
status = __dsc_dbg_ops_insert(ops, func);
if (QDF_IS_STATUS_ERROR(status))
return status;
ops->count++;
return QDF_STATUS_SUCCESS;
}
bool __dsc_ops_remove(struct dsc_ops *ops, const char *func)
{
dsc_assert(ops->count);
ops->count--;
__dsc_dbg_ops_remove(ops, func);
return ops->count == 0;
}
#ifdef WLAN_DSC_DEBUG
static void __dsc_dbg_trans_timeout(void *opaque_trans)
{
struct dsc_trans *trans = opaque_trans;
qdf_print_thread_trace(trans->thread);
if (cds_is_fw_down())
dsc_err("fw is down avoid panic");
else
QDF_DEBUG_PANIC("Transition '%s' exceeded %ums",
trans->active_desc, DSC_TRANS_TIMEOUT_MS);
}
/**
* __dsc_dbg_trans_timeout_start() - start a timeout timer for @trans
* @trans: the active transition to start a timeout timer for
*
* Return: QDF_STATUS
*/
static QDF_STATUS __dsc_dbg_trans_timeout_start(struct dsc_trans *trans)
{
QDF_STATUS status;
trans->thread = qdf_get_current_task();
status = qdf_timer_init(NULL, &trans->timeout_timer,
__dsc_dbg_trans_timeout, trans,
QDF_TIMER_TYPE_SW);
if (QDF_IS_STATUS_ERROR(status))
return status;
qdf_timer_start(&trans->timeout_timer, DSC_TRANS_TIMEOUT_MS);
return QDF_STATUS_SUCCESS;
}
/**
* __dsc_dbg_trans_timeout_stop() - stop the timeout timer for @trans
* @trans: the active transition to stop the timeout timer for
*
* Return: None
*/
static void __dsc_dbg_trans_timeout_stop(struct dsc_trans *trans)
{
qdf_timer_stop(&trans->timeout_timer);
qdf_timer_free(&trans->timeout_timer);
}
static void __dsc_dbg_tran_wait_timeout(void *opaque_tran)
{
struct dsc_tran *tran = opaque_tran;
qdf_print_thread_trace(tran->thread);
QDF_DEBUG_PANIC("Transition '%s' waited more than %ums",
tran->desc, DSC_TRANS_WAIT_TIMEOUT_MS);
}
/**
* __dsc_dbg_tran_wait_timeout_start() - start a timeout timer for @tran
* @tran: the pending transition to start a timeout timer for
*
* Return: QDF_STATUS
*/
static QDF_STATUS __dsc_dbg_tran_wait_timeout_start(struct dsc_tran *tran)
{
QDF_STATUS status;
tran->thread = qdf_get_current_task();
status = qdf_timer_init(NULL, &tran->timeout_timer,
__dsc_dbg_tran_wait_timeout, tran,
QDF_TIMER_TYPE_SW);
if (QDF_IS_STATUS_ERROR(status))
return status;
qdf_timer_start(&tran->timeout_timer, DSC_TRANS_WAIT_TIMEOUT_MS);
return QDF_STATUS_SUCCESS;
}
/**
* __dsc_dbg_tran_wait_timeout_stop() - stop the timeout timer for @tran
* @tran: the pending transition to stop the timeout timer for
*
* Return: None
*/
static void __dsc_dbg_tran_wait_timeout_stop(struct dsc_tran *tran)
{
qdf_timer_stop(&tran->timeout_timer);
qdf_timer_free(&tran->timeout_timer);
}
#else
static inline QDF_STATUS __dsc_dbg_trans_timeout_start(struct dsc_trans *trans)
{
return QDF_STATUS_SUCCESS;
}
static inline void __dsc_dbg_trans_timeout_stop(struct dsc_trans *trans) { }
static inline QDF_STATUS
__dsc_dbg_tran_wait_timeout_start(struct dsc_tran *tran)
{
return QDF_STATUS_SUCCESS;
}
static inline void __dsc_dbg_tran_wait_timeout_stop(struct dsc_tran *tran) { }
#endif /* WLAN_DSC_DEBUG */
void __dsc_trans_init(struct dsc_trans *trans)
{
trans->active_desc = NULL;
qdf_list_create(&trans->queue, 0);
}
void __dsc_trans_deinit(struct dsc_trans *trans)
{
qdf_list_destroy(&trans->queue);
trans->active_desc = NULL;
}
QDF_STATUS __dsc_trans_start(struct dsc_trans *trans, const char *desc)
{
QDF_STATUS status;
status = __dsc_dbg_trans_timeout_start(trans);
if (QDF_IS_STATUS_ERROR(status))
return status;
dsc_assert(!trans->active_desc);
trans->active_desc = desc;
return QDF_STATUS_SUCCESS;
}
void __dsc_trans_stop(struct dsc_trans *trans)
{
dsc_assert(trans->active_desc);
trans->active_desc = NULL;
__dsc_dbg_trans_timeout_stop(trans);
}
QDF_STATUS __dsc_trans_queue(struct dsc_trans *trans, struct dsc_tran *tran,
const char *desc)
{
QDF_STATUS status;
tran->abort = false;
tran->desc = desc;
qdf_event_create(&tran->event);
status = __dsc_dbg_tran_wait_timeout_start(tran);
if (QDF_IS_STATUS_ERROR(status))
goto event_destroy;
qdf_list_insert_back(&trans->queue, &tran->node);
return QDF_STATUS_SUCCESS;
event_destroy:
qdf_event_destroy(&tran->event);
return status;
}
/**
* __dsc_trans_dequeue() - dequeue the next queued transition from @trans
* @trans: the transactions container to dequeue from
*
* Return: the dequeued transition, or NULL if @trans is empty
*/
static struct dsc_tran *__dsc_trans_dequeue(struct dsc_trans *trans)
{
QDF_STATUS status;
qdf_list_node_t *node;
struct dsc_tran *tran;
status = qdf_list_remove_front(&trans->queue, &node);
if (QDF_IS_STATUS_ERROR(status))
return NULL;
tran = qdf_container_of(node, struct dsc_tran, node);
__dsc_dbg_tran_wait_timeout_stop(tran);
return tran;
}
bool __dsc_trans_abort(struct dsc_trans *trans)
{
struct dsc_tran *tran;
tran = __dsc_trans_dequeue(trans);
if (!tran)
return false;
tran->abort = true;
qdf_event_set(&tran->event);
return true;
}
bool __dsc_trans_trigger(struct dsc_trans *trans)
{
struct dsc_tran *tran;
tran = __dsc_trans_dequeue(trans);
if (!tran)
return false;
__dsc_trans_start(trans, tran->desc);
qdf_event_set(&tran->event);
return true;
}
bool __dsc_trans_active(struct dsc_trans *trans)
{
return !!trans->active_desc;
}
bool __dsc_trans_queued(struct dsc_trans *trans)
{
return !qdf_list_empty(&trans->queue);
}
bool __dsc_trans_active_or_queued(struct dsc_trans *trans)
{
return __dsc_trans_active(trans) || __dsc_trans_queued(trans);
}
QDF_STATUS __dsc_tran_wait(struct dsc_tran *tran)
{
QDF_STATUS status;
status = qdf_wait_single_event(&tran->event, 0);
qdf_event_destroy(&tran->event);
if (QDF_IS_STATUS_ERROR(status))
return status;
if (tran->abort)
return QDF_STATUS_E_ABORTED;
return QDF_STATUS_SUCCESS;
}

View File

@@ -1,352 +0,0 @@
/*
* Copyright (c) 2018-2019, 2021 The Linux Foundation. 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.
*/
/**
* DOC: Driver State Management (DSC) APIs for *internal* use
*/
#ifndef ____WLAN_DSC_H
#define ____WLAN_DSC_H
#include "qdf_event.h"
#include "qdf_list.h"
#include "qdf_threads.h"
#include "qdf_timer.h"
#include "qdf_trace.h"
#include "qdf_types.h"
#include "wlan_dsc.h"
#define dsc_err(params...) QDF_TRACE_ERROR(QDF_MODULE_ID_QDF, params)
#define dsc_info(params...) QDF_TRACE_INFO(QDF_MODULE_ID_QDF, params)
#ifdef WLAN_DSC_DEBUG
#define dsc_debug(params...) QDF_TRACE_DEBUG(QDF_MODULE_ID_QDF, params)
#else
#define dsc_debug(params...) /* no-op */
#endif
#define dsc_nofl_err(params...) \
QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_QDF, params)
#define dsc_nofl_info(params...) \
QDF_TRACE_INFO_NO_FL(QDF_MODULE_ID_QDF, params)
#define dsc_nofl_debug(params...) \
QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_QDF, params)
#define dsc_enter_exit dsc_debug
#define dsc_enter() dsc_enter_exit("enter")
#define dsc_enter_str(str) dsc_enter_exit("enter(\"%s\")", str)
#define dsc_exit() dsc_enter_exit("exit")
#define dsc_exit_status(status) dsc_enter_exit("exit(status:%u)", status)
static inline bool __dsc_assert(const bool cond, const char *cond_str,
const char *func, const uint32_t line)
{
if (cond)
return true;
QDF_DEBUG_PANIC_FL(func, line, "Failed assertion '%s'!", cond_str);
return false;
}
#define dsc_assert(cond) __dsc_assert(cond, #cond, __func__, __LINE__)
#define dsc_assert_success(status) dsc_assert(QDF_IS_STATUS_SUCCESS(status))
#ifdef WLAN_DSC_DEBUG
#define DSC_OP_TIMEOUT_MS (1 * 60 * 1000) /* 1 minute */
#define DSC_TRANS_TIMEOUT_MS (1 * 60 * 1000) /* 1 minute */
#define DSC_TRANS_WAIT_TIMEOUT_MS (2 * 60 * 1000) /* 2 minutes */
/**
* struct dsc_op - list node for operation tracking information
* @node: list node
* @timeout_timer: a timer used to detect operation timeouts
* @thread: the thread which started the operation
* @func: name of the function the operation was started from
*/
struct dsc_op {
qdf_list_node_t node;
qdf_timer_t timeout_timer;
qdf_thread_t *thread;
const char *func;
};
#endif /* WLAN_DSC_DEBUG */
/**
* struct dsc_ops - operations in flight tracking container
* @list: list for tracking debug information
* @count: count of current operations in flight
* @event: event used to wait in *_wait_for_ops() APIs
*/
struct dsc_ops {
#ifdef WLAN_DSC_DEBUG
qdf_list_t list;
#endif
uint32_t count;
qdf_event_t event;
};
/**
* struct dsc_tran - representation of a pending transition
* @abort: used to indicate if the transition stopped waiting due to an abort
* @desc: unique description of the transition
* @node: list node
* @event: event used to wait in *_start_trans_wait() APIs
* @timeout_timer: a timer used to detect transition wait timeouts
* @thread: the thread which started the transition wait
*/
struct dsc_tran {
bool abort;
const char *desc;
qdf_list_node_t node;
qdf_event_t event;
#ifdef WLAN_DSC_DEBUG
qdf_timer_t timeout_timer;
qdf_thread_t *thread;
#endif
};
/**
* struct dsc_trans - transition information container
* @active_desc: unique description of the current transition in progress
* @queue: queue of pending transitions
* @timeout_timer: a timer used to detect transition timeouts
* @thread: the thread which started the transition
*/
struct dsc_trans {
const char *active_desc;
qdf_list_t queue;
#ifdef WLAN_DSC_DEBUG
qdf_timer_t timeout_timer;
qdf_thread_t *thread;
#endif
};
/**
* struct dsc_driver - concrete dsc driver context
* @lock: lock under which all dsc APIs execute
* @psocs: list of children psoc contexts
* @trans: transition tracking container for this node
* @ops: operations in flight tracking container for this node
*/
struct dsc_driver {
struct qdf_spinlock lock;
qdf_list_t psocs;
struct dsc_trans trans;
struct dsc_ops ops;
};
/**
* struct dsc_psoc - concrete dsc psoc context
* @node: list node for membership in @driver->psocs
* @driver: parent driver context
* @vdevs: list of children vdevs contexts
* @trans: transition tracking container for this node
* @ops: operations in flight tracking container for this node
*/
struct dsc_psoc {
qdf_list_node_t node;
struct dsc_driver *driver;
qdf_list_t vdevs;
struct dsc_trans trans;
struct dsc_ops ops;
};
/**
* struct dsc_vdev - concrete dsc vdev context
* @node: list node for membership in @psoc->vdevs
* @psoc: parent psoc context
* @trans: transition tracking container for this node
* @ops: operations in flight tracking container for this node
* @nb_cmd_during_ssr: north bound command id
*/
struct dsc_vdev {
qdf_list_node_t node;
struct dsc_psoc *psoc;
struct dsc_trans trans;
struct dsc_ops ops;
uint8_t nb_cmd_during_ssr;
};
#define dsc_for_each_driver_psoc(driver_ptr, psoc_cursor) \
qdf_list_for_each(&(driver_ptr)->psocs, psoc_cursor, node)
#define dsc_for_each_psoc_vdev(psoc_ptr, vdev_cursor) \
qdf_list_for_each(&(psoc_ptr)->vdevs, vdev_cursor, node)
/**
* __dsc_lock() - grab the dsc driver lock
* @driver: the driver to lock
*
* Return: None
*/
void __dsc_lock(struct dsc_driver *driver);
/**
* __dsc_unlock() - release the dsc driver lock
* @driver: the driver to unlock
*
* Return: None
*/
void __dsc_unlock(struct dsc_driver *driver);
/**
* __dsc_ops_init() - initialize @ops
* @ops: the ops container to initialize
*
* Return: None
*/
void __dsc_ops_init(struct dsc_ops *ops);
/**
* __dsc_ops_deinit() - de-initialize @ops
* @ops: the ops container to de-initialize
*
* Return: None
*/
void __dsc_ops_deinit(struct dsc_ops *ops);
/**
* __dsc_ops_insert() - insert @func into the trakcing information in @ops
* @ops: the ops container to insert into
* @func: the debug information to insert
*
* Return: QDF_STATUS
*/
QDF_STATUS __dsc_ops_insert(struct dsc_ops *ops, const char *func);
/**
* __dsc_ops_remove() - remove @func from the tracking information in @ops
* @ops: the ops container to remove from
* @func: the debug information to remove
*
* Return: None
*/
bool __dsc_ops_remove(struct dsc_ops *ops, const char *func);
/**
* __dsc_trans_init() - initialize @trans
* @trans: the trans container to initialize
*
* Return: None
*/
void __dsc_trans_init(struct dsc_trans *trans);
/**
* __dsc_trans_deinit() - de-initialize @trans
* @trans: the trans container to de-initialize
*
* Return: None
*/
void __dsc_trans_deinit(struct dsc_trans *trans);
/**
* __dsc_trans_start() - set the active transition on @trans
* @trans: the transition container used to track the new active transition
* @desc: unique description of the transition being started
*
* Return: QDF_STATUS
*/
QDF_STATUS __dsc_trans_start(struct dsc_trans *trans, const char *desc);
/**
* __dsc_trans_stop() - unset the active transition on @trans
* @trans: the transition container currently tracking the active transition
*
* Return: None
*/
void __dsc_trans_stop(struct dsc_trans *trans);
/**
* __dsc_trans_queue() - queue @tran at the back of @trans
* @trans: the transitions container to enqueue to
* @tran: the transition to enqueue
* @desc: unique description of the transition being queued
*
* Return: QDF_STATUS
*/
QDF_STATUS __dsc_trans_queue(struct dsc_trans *trans, struct dsc_tran *tran,
const char *desc);
/**
* __dsc_tran_wait() - block until @tran completes
* @tran: the transition to wait on
*
* Return: QDF_STATUS
*/
QDF_STATUS __dsc_tran_wait(struct dsc_tran *tran);
/**
* __dsc_trans_abort() - abort the next queued transition from @trans
* @trans: the transitions container to abort from
*
* Return: true if a transition was aborted, false if @trans is empty
*/
bool __dsc_trans_abort(struct dsc_trans *trans);
/**
* __dsc_trans_trigger() - trigger the next queued trans in @trans
* @trans: the transitions container to trigger from
*
* Return: true if a transition was triggered
*/
bool __dsc_trans_trigger(struct dsc_trans *trans);
/**
* __dsc_trans_active() - check if a transition is active in @trans
* @trans: the transitions container to check
*
* Return: true if @trans has an active transition
*/
bool __dsc_trans_active(struct dsc_trans *trans);
/**
* __dsc_trans_queued() - check if a transition is queued in @trans
* @trans: the transitions container to check
*
* Return: true if @trans has a queued transition
*/
bool __dsc_trans_queued(struct dsc_trans *trans);
/**
* __dsc_trans_active_or_queued() - check if a transition is active or queued
* in @trans
* @trans: the transitions container to check
*
* Return: true if @trans has an active or queued transition
*/
bool __dsc_trans_active_or_queued(struct dsc_trans *trans);
/**
* __dsc_driver_trans_trigger_checked() - trigger any next pending driver
* transition, only after passing the "can trans" check
*
* Return: true if the trigger was "handled." This indicates down-tree nodes
* should _not_ attempt to trigger a new transition.
*/
bool __dsc_driver_trans_trigger_checked(struct dsc_driver *driver);
/**
* __dsc_psoc_trans_trigger_checked() - trigger any next pending psoc
* transition, only after passing the "can trans" check
*
* Return: true if the trigger was "handled." This indicates down-tree nodes
* should _not_ attempt to trigger a new transition.
*/
bool __dsc_psoc_trans_trigger_checked(struct dsc_psoc *psoc);
#endif /* ____WLAN_DSC_H */

View File

@@ -1,371 +0,0 @@
/*
* Copyright (c) 2018-2020 The Linux Foundation. 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 "qdf_list.h"
#include "qdf_mem.h"
#include "qdf_status.h"
#include "qdf_types.h"
#include "__wlan_dsc.h"
#include "wlan_dsc.h"
void __dsc_lock(struct dsc_driver *driver)
{
dsc_assert(driver);
qdf_spin_lock_bh(&driver->lock);
}
void __dsc_unlock(struct dsc_driver *driver)
{
dsc_assert(driver);
qdf_spin_unlock_bh(&driver->lock);
}
static QDF_STATUS __dsc_driver_create(struct dsc_driver **out_driver)
{
struct dsc_driver *driver;
if (!dsc_assert(out_driver))
return QDF_STATUS_E_INVAL;
*out_driver = NULL;
driver = qdf_mem_malloc(sizeof(*driver));
if (!driver)
return QDF_STATUS_E_NOMEM;
qdf_spinlock_create(&driver->lock);
qdf_list_create(&driver->psocs, 0);
__dsc_trans_init(&driver->trans);
__dsc_ops_init(&driver->ops);
*out_driver = driver;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS dsc_driver_create(struct dsc_driver **out_driver)
{
QDF_STATUS status;
status = __dsc_driver_create(out_driver);
return status;
}
static void __dsc_driver_destroy(struct dsc_driver **out_driver)
{
struct dsc_driver *driver;
if (!dsc_assert(out_driver))
return;
driver = *out_driver;
if (!dsc_assert(driver))
return;
*out_driver = NULL;
/* assert no children */
dsc_assert(qdf_list_empty(&driver->psocs));
/* flush pending transitions */
while (__dsc_trans_abort(&driver->trans))
;
/* de-init */
__dsc_ops_deinit(&driver->ops);
__dsc_trans_deinit(&driver->trans);
qdf_list_destroy(&driver->psocs);
qdf_spinlock_destroy(&driver->lock);
qdf_mem_free(driver);
}
void dsc_driver_destroy(struct dsc_driver **out_driver)
{
__dsc_driver_destroy(out_driver);
}
static bool __dsc_driver_trans_active_down_tree(struct dsc_driver *driver)
{
struct dsc_psoc *psoc;
struct dsc_vdev *vdev;
dsc_for_each_driver_psoc(driver, psoc) {
if (__dsc_trans_active(&psoc->trans))
return true;
dsc_for_each_psoc_vdev(psoc, vdev) {
if (__dsc_trans_active(&vdev->trans))
return true;
}
}
return false;
}
#define __dsc_driver_can_op(driver) __dsc_driver_can_trans(driver)
static bool __dsc_driver_can_trans(struct dsc_driver *driver)
{
return !__dsc_trans_active_or_queued(&driver->trans) &&
!__dsc_driver_trans_active_down_tree(driver);
}
static bool __dsc_driver_can_trigger(struct dsc_driver *driver)
{
return !__dsc_trans_active(&driver->trans) &&
!__dsc_driver_trans_active_down_tree(driver);
}
static QDF_STATUS
__dsc_driver_trans_start_nolock(struct dsc_driver *driver, const char *desc)
{
if (!__dsc_driver_can_trans(driver))
return QDF_STATUS_E_AGAIN;
return __dsc_trans_start(&driver->trans, desc);
}
static QDF_STATUS
__dsc_driver_trans_start(struct dsc_driver *driver, const char *desc)
{
QDF_STATUS status;
if (!dsc_assert(driver))
return QDF_STATUS_E_INVAL;
if (!dsc_assert(desc))
return QDF_STATUS_E_INVAL;
__dsc_lock(driver);
status = __dsc_driver_trans_start_nolock(driver, desc);
__dsc_unlock(driver);
return status;
}
QDF_STATUS dsc_driver_trans_start(struct dsc_driver *driver, const char *desc)
{
QDF_STATUS status;
dsc_enter_str(desc);
status = __dsc_driver_trans_start(driver, desc);
if (QDF_IS_STATUS_ERROR(status))
dsc_exit_status(status);
return status;
}
static QDF_STATUS
__dsc_driver_trans_start_wait(struct dsc_driver *driver, const char *desc)
{
QDF_STATUS status;
struct dsc_tran tran = { 0 };
if (!dsc_assert(driver))
return QDF_STATUS_E_INVAL;
if (!dsc_assert(desc))
return QDF_STATUS_E_INVAL;
__dsc_lock(driver);
/* try to start without waiting */
status = __dsc_driver_trans_start_nolock(driver, desc);
if (QDF_IS_STATUS_SUCCESS(status))
goto unlock;
status = __dsc_trans_queue(&driver->trans, &tran, desc);
if (QDF_IS_STATUS_ERROR(status))
goto unlock;
__dsc_unlock(driver);
return __dsc_tran_wait(&tran);
unlock:
__dsc_unlock(driver);
return status;
}
QDF_STATUS
dsc_driver_trans_start_wait(struct dsc_driver *driver, const char *desc)
{
QDF_STATUS status;
dsc_enter_str(desc);
status = __dsc_driver_trans_start_wait(driver, desc);
if (QDF_IS_STATUS_ERROR(status))
dsc_exit_status(status);
return status;
}
bool __dsc_driver_trans_trigger_checked(struct dsc_driver *driver)
{
if (!__dsc_trans_queued(&driver->trans))
return false;
/* handled, but don't trigger; we need to wait for more children */
if (!__dsc_driver_can_trigger(driver))
return true;
return __dsc_trans_trigger(&driver->trans);
}
static void __dsc_driver_trigger_trans(struct dsc_driver *driver)
{
struct dsc_psoc *psoc;
struct dsc_vdev *vdev;
if (__dsc_trans_trigger(&driver->trans))
return;
dsc_for_each_driver_psoc(driver, psoc) {
if (__dsc_trans_trigger(&psoc->trans))
continue;
dsc_for_each_psoc_vdev(psoc, vdev)
__dsc_trans_trigger(&vdev->trans);
}
}
static void __dsc_driver_trans_stop(struct dsc_driver *driver)
{
if (!dsc_assert(driver))
return;
__dsc_lock(driver);
__dsc_trans_stop(&driver->trans);
__dsc_driver_trigger_trans(driver);
__dsc_unlock(driver);
}
void dsc_driver_trans_stop(struct dsc_driver *driver)
{
__dsc_driver_trans_stop(driver);
}
static void __dsc_driver_assert_trans_protected(struct dsc_driver *driver)
{
if (!dsc_assert(driver))
return;
__dsc_lock(driver);
dsc_assert(__dsc_trans_active(&driver->trans));
__dsc_unlock(driver);
}
void dsc_driver_assert_trans_protected(struct dsc_driver *driver)
{
__dsc_driver_assert_trans_protected(driver);
}
static QDF_STATUS
__dsc_driver_op_start(struct dsc_driver *driver, const char *func)
{
QDF_STATUS status;
if (!dsc_assert(driver))
return QDF_STATUS_E_INVAL;
if (!dsc_assert(func))
return QDF_STATUS_E_INVAL;
__dsc_lock(driver);
if (!__dsc_driver_can_op(driver)) {
status = QDF_STATUS_E_AGAIN;
goto unlock;
}
status = __dsc_ops_insert(&driver->ops, func);
unlock:
__dsc_unlock(driver);
return status;
}
QDF_STATUS _dsc_driver_op_start(struct dsc_driver *driver, const char *func)
{
QDF_STATUS status;
dsc_enter_str(func);
status = __dsc_driver_op_start(driver, func);
if (QDF_IS_STATUS_ERROR(status))
dsc_exit_status(status);
return status;
}
static void __dsc_driver_op_stop(struct dsc_driver *driver, const char *func)
{
if (!dsc_assert(driver))
return;
if (!dsc_assert(func))
return;
__dsc_lock(driver);
if (__dsc_ops_remove(&driver->ops, func))
qdf_event_set(&driver->ops.event);
__dsc_unlock(driver);
}
void _dsc_driver_op_stop(struct dsc_driver *driver, const char *func)
{
__dsc_driver_op_stop(driver, func);
}
static void __dsc_driver_wait_for_ops(struct dsc_driver *driver)
{
struct dsc_psoc *psoc;
bool wait;
if (!dsc_assert(driver))
return;
__dsc_lock(driver);
/* flushing without preventing new ops is almost certainly a bug */
dsc_assert(!__dsc_driver_can_op(driver));
wait = driver->ops.count > 0;
if (wait)
qdf_event_reset(&driver->ops.event);
__dsc_unlock(driver);
if (wait)
qdf_wait_single_event(&driver->ops.event, 0);
/* wait for down-tree ops to complete as well */
dsc_for_each_driver_psoc(driver, psoc)
dsc_psoc_wait_for_ops(psoc);
}
void dsc_driver_wait_for_ops(struct dsc_driver *driver)
{
__dsc_driver_wait_for_ops(driver);
}

View File

@@ -1,389 +0,0 @@
/*
* Copyright (c) 2018-2020 The Linux Foundation. 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 "qdf_list.h"
#include "qdf_status.h"
#include "qdf_talloc.h"
#include "qdf_types.h"
#include "__wlan_dsc.h"
#include "wlan_dsc.h"
#define __dsc_driver_lock(psoc) __dsc_lock((psoc)->driver)
#define __dsc_driver_unlock(psoc) __dsc_unlock((psoc)->driver)
static QDF_STATUS
__dsc_psoc_create(struct dsc_driver *driver, struct dsc_psoc **out_psoc)
{
struct dsc_psoc *psoc;
if (!dsc_assert(driver))
return QDF_STATUS_E_INVAL;
if (!dsc_assert(out_psoc))
return QDF_STATUS_E_INVAL;
*out_psoc = NULL;
psoc = qdf_talloc_type(driver, psoc);
if (!psoc)
return QDF_STATUS_E_NOMEM;
/* init */
psoc->driver = driver;
qdf_list_create(&psoc->vdevs, 0);
__dsc_trans_init(&psoc->trans);
__dsc_ops_init(&psoc->ops);
/* attach */
__dsc_driver_lock(psoc);
qdf_list_insert_back(&driver->psocs, &psoc->node);
__dsc_driver_unlock(psoc);
*out_psoc = psoc;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
dsc_psoc_create(struct dsc_driver *driver, struct dsc_psoc **out_psoc)
{
QDF_STATUS status;
status = __dsc_psoc_create(driver, out_psoc);
return status;
}
static void __dsc_psoc_destroy(struct dsc_psoc **out_psoc)
{
struct dsc_psoc *psoc;
if (!dsc_assert(out_psoc))
return;
psoc = *out_psoc;
if (!dsc_assert(psoc))
return;
*out_psoc = NULL;
/* assert no children */
dsc_assert(qdf_list_empty(&psoc->vdevs));
/* flush pending transitions */
while (__dsc_trans_abort(&psoc->trans))
;
/* detach */
__dsc_driver_lock(psoc);
qdf_list_remove_node(&psoc->driver->psocs, &psoc->node);
__dsc_driver_unlock(psoc);
/* de-init */
__dsc_ops_deinit(&psoc->ops);
__dsc_trans_deinit(&psoc->trans);
qdf_list_destroy(&psoc->vdevs);
psoc->driver = NULL;
qdf_tfree(psoc);
}
void dsc_psoc_destroy(struct dsc_psoc **out_psoc)
{
__dsc_psoc_destroy(out_psoc);
}
static bool __dsc_psoc_trans_active_down_tree(struct dsc_psoc *psoc)
{
struct dsc_vdev *vdev;
dsc_for_each_psoc_vdev(psoc, vdev) {
if (__dsc_trans_active(&vdev->trans))
return true;
}
return false;
}
#define __dsc_psoc_can_op(psoc) __dsc_psoc_can_trans(psoc)
/*
* __dsc_psoc_can_trans() - Returns if the psoc transition can occur or not
* @psoc: The DSC psoc
*
* This function checks if the psoc transition can occur or not by checking if
* any other down the tree/up the tree transition/operation is taking place.
*
* If there are any driver transition taking place, then the psoc trans/ops
* should be rejected and not queued in the DSC queue. Return QDF_STATUS_E_INVAL
* in this case.
*
* If there any psoc or vdev trans/ops is taking place, then the psoc trans/ops
* should be rejected and queued in the DSC queue so that it may be resumed
* after the current trans/ops is completed. Return QDF_STATUS_E_AGAIN in this
* case.
*
* Return: QDF_STATUS_SUCCESS if transition is allowed, error code if not.
*/
static QDF_STATUS __dsc_psoc_can_trans(struct dsc_psoc *psoc)
{
if (__dsc_trans_active_or_queued(&psoc->driver->trans))
return QDF_STATUS_E_INVAL;
if (__dsc_trans_active_or_queued(&psoc->trans) ||
__dsc_psoc_trans_active_down_tree(psoc))
return QDF_STATUS_E_AGAIN;
return QDF_STATUS_SUCCESS;
}
static bool __dsc_psoc_can_trigger(struct dsc_psoc *psoc)
{
return !__dsc_trans_active_or_queued(&psoc->driver->trans) &&
!__dsc_trans_active(&psoc->trans) &&
!__dsc_psoc_trans_active_down_tree(psoc);
}
static QDF_STATUS
__dsc_psoc_trans_start_nolock(struct dsc_psoc *psoc, const char *desc)
{
QDF_STATUS status;
status = __dsc_psoc_can_trans(psoc);
if (QDF_IS_STATUS_ERROR(status))
return status;
return __dsc_trans_start(&psoc->trans, desc);
}
static QDF_STATUS
__dsc_psoc_trans_start(struct dsc_psoc *psoc, const char *desc)
{
QDF_STATUS status;
if (!dsc_assert(psoc))
return QDF_STATUS_E_INVAL;
if (!dsc_assert(desc))
return QDF_STATUS_E_INVAL;
__dsc_driver_lock(psoc);
status = __dsc_psoc_trans_start_nolock(psoc, desc);
__dsc_driver_unlock(psoc);
return status;
}
QDF_STATUS dsc_psoc_trans_start(struct dsc_psoc *psoc, const char *desc)
{
QDF_STATUS status;
dsc_enter_str(desc);
status = __dsc_psoc_trans_start(psoc, desc);
if (QDF_IS_STATUS_ERROR(status))
dsc_exit_status(status);
return status;
}
static QDF_STATUS
__dsc_psoc_trans_start_wait(struct dsc_psoc *psoc, const char *desc)
{
QDF_STATUS status;
struct dsc_tran tran = { 0 };
if (!dsc_assert(psoc))
return QDF_STATUS_E_INVAL;
if (!dsc_assert(desc))
return QDF_STATUS_E_INVAL;
__dsc_driver_lock(psoc);
/* try to start without waiting */
status = __dsc_psoc_trans_start_nolock(psoc, desc);
if (QDF_IS_STATUS_SUCCESS(status) || status == QDF_STATUS_E_INVAL)
goto unlock;
status = __dsc_trans_queue(&psoc->trans, &tran, desc);
if (QDF_IS_STATUS_ERROR(status))
goto unlock;
__dsc_driver_unlock(psoc);
return __dsc_tran_wait(&tran);
unlock:
__dsc_driver_unlock(psoc);
return status;
}
QDF_STATUS dsc_psoc_trans_start_wait(struct dsc_psoc *psoc, const char *desc)
{
QDF_STATUS status;
dsc_enter_str(desc);
status = __dsc_psoc_trans_start_wait(psoc, desc);
if (QDF_IS_STATUS_ERROR(status))
dsc_exit_status(status);
return status;
}
static void __dsc_psoc_trigger_trans(struct dsc_psoc *psoc)
{
struct dsc_vdev *vdev;
if (__dsc_driver_trans_trigger_checked(psoc->driver))
return;
if (__dsc_trans_trigger(&psoc->trans))
return;
dsc_for_each_psoc_vdev(psoc, vdev)
__dsc_trans_trigger(&vdev->trans);
}
static void __dsc_psoc_trans_stop(struct dsc_psoc *psoc)
{
if (!dsc_assert(psoc))
return;
__dsc_driver_lock(psoc);
__dsc_trans_stop(&psoc->trans);
__dsc_psoc_trigger_trans(psoc);
__dsc_driver_unlock(psoc);
}
void dsc_psoc_trans_stop(struct dsc_psoc *psoc)
{
__dsc_psoc_trans_stop(psoc);
}
static void __dsc_psoc_assert_trans_protected(struct dsc_psoc *psoc)
{
if (!dsc_assert(psoc))
return;
__dsc_driver_lock(psoc);
dsc_assert(__dsc_trans_active(&psoc->trans) ||
__dsc_trans_active(&psoc->driver->trans));
__dsc_driver_unlock(psoc);
}
void dsc_psoc_assert_trans_protected(struct dsc_psoc *psoc)
{
__dsc_psoc_assert_trans_protected(psoc);
}
bool __dsc_psoc_trans_trigger_checked(struct dsc_psoc *psoc)
{
if (qdf_list_empty(&psoc->trans.queue))
return false;
/* handled, but don't trigger; we need to wait for more children */
if (!__dsc_psoc_can_trigger(psoc))
return true;
return __dsc_trans_trigger(&psoc->trans);
}
static QDF_STATUS __dsc_psoc_op_start(struct dsc_psoc *psoc, const char *func)
{
QDF_STATUS status;
if (!dsc_assert(psoc))
return QDF_STATUS_E_INVAL;
if (!dsc_assert(func))
return QDF_STATUS_E_INVAL;
__dsc_driver_lock(psoc);
status = __dsc_psoc_can_op(psoc);
if (QDF_IS_STATUS_ERROR(status))
goto unlock;
status = __dsc_ops_insert(&psoc->ops, func);
unlock:
__dsc_driver_unlock(psoc);
return status;
}
QDF_STATUS _dsc_psoc_op_start(struct dsc_psoc *psoc, const char *func)
{
QDF_STATUS status;
status = __dsc_psoc_op_start(psoc, func);
return status;
}
static void __dsc_psoc_op_stop(struct dsc_psoc *psoc, const char *func)
{
if (!dsc_assert(psoc))
return;
if (!dsc_assert(func))
return;
__dsc_driver_lock(psoc);
if (__dsc_ops_remove(&psoc->ops, func))
qdf_event_set(&psoc->ops.event);
__dsc_driver_unlock(psoc);
}
void _dsc_psoc_op_stop(struct dsc_psoc *psoc, const char *func)
{
__dsc_psoc_op_stop(psoc, func);
}
static void __dsc_psoc_wait_for_ops(struct dsc_psoc *psoc)
{
struct dsc_vdev *vdev;
bool wait;
if (!dsc_assert(psoc))
return;
__dsc_driver_lock(psoc);
wait = psoc->ops.count > 0;
if (wait)
qdf_event_reset(&psoc->ops.event);
__dsc_driver_unlock(psoc);
if (wait)
qdf_wait_single_event(&psoc->ops.event, 0);
/* wait for down-tree ops to complete as well */
dsc_for_each_psoc_vdev(psoc, vdev)
dsc_vdev_wait_for_ops(vdev);
}
void dsc_psoc_wait_for_ops(struct dsc_psoc *psoc)
{
__dsc_psoc_wait_for_ops(psoc);
}

View File

@@ -1,388 +0,0 @@
/*
* Copyright (c) 2018-2021 The Linux Foundation. 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 "qdf_list.h"
#include "qdf_status.h"
#include "qdf_talloc.h"
#include "qdf_types.h"
#include "__wlan_dsc.h"
#include "wlan_dsc.h"
#include "qdf_platform.h"
#define __dsc_driver_lock(vdev) __dsc_lock((vdev)->psoc->driver)
#define __dsc_driver_unlock(vdev) __dsc_unlock((vdev)->psoc->driver)
static QDF_STATUS
__dsc_vdev_create(struct dsc_psoc *psoc, struct dsc_vdev **out_vdev)
{
struct dsc_vdev *vdev;
if (!dsc_assert(psoc))
return QDF_STATUS_E_INVAL;
if (!dsc_assert(out_vdev))
return QDF_STATUS_E_INVAL;
*out_vdev = NULL;
vdev = qdf_talloc_type(psoc, vdev);
if (!vdev)
return QDF_STATUS_E_NOMEM;
/* init */
vdev->psoc = psoc;
__dsc_trans_init(&vdev->trans);
__dsc_ops_init(&vdev->ops);
/* attach */
__dsc_driver_lock(vdev);
qdf_list_insert_back(&psoc->vdevs, &vdev->node);
__dsc_driver_unlock(vdev);
*out_vdev = vdev;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS dsc_vdev_create(struct dsc_psoc *psoc, struct dsc_vdev **out_vdev)
{
QDF_STATUS status;
status = __dsc_vdev_create(psoc, out_vdev);
return status;
}
static void __dsc_vdev_destroy(struct dsc_vdev **out_vdev)
{
struct dsc_vdev *vdev;
if (!dsc_assert(out_vdev))
return;
vdev = *out_vdev;
if (!dsc_assert(vdev))
return;
*out_vdev = NULL;
/* flush pending transitions */
while (__dsc_trans_abort(&vdev->trans))
;
/* detach */
__dsc_driver_lock(vdev);
qdf_list_remove_node(&vdev->psoc->vdevs, &vdev->node);
__dsc_driver_unlock(vdev);
/* de-init */
__dsc_ops_deinit(&vdev->ops);
__dsc_trans_deinit(&vdev->trans);
vdev->psoc = NULL;
qdf_tfree(vdev);
}
void dsc_vdev_destroy(struct dsc_vdev **out_vdev)
{
__dsc_vdev_destroy(out_vdev);
}
#define __dsc_vdev_can_op(vdev) __dsc_vdev_can_trans(vdev)
/*
* __dsc_vdev_can_trans() - Returns if the vdev transition can occur or not
* @vdev: The DSC vdev
*
* This function checks if the vdev transition can occur or not by checking if
* any other down the tree/up the tree transition/operation is taking place.
*
* If there are any driver transition taking place, then the vdev trans/ops
* should be rejected and not queued in the DSC queue. Return QDF_STATUS_E_INVAL
* in this case.
*
* If there are any psoc transition taking place because of SSR, then vdev
* trans/op should be rejected and queued in the DSC queue so that it may be
* resumed after the current trans/op is completed. return QDF_STATUS_E_AGAIN
* in this case.
*
* If there is a psoc transition taking place becasue of psoc idle shutdown,
* then the vdev trans/ops should be rejected and queued in the DSC queue so
* that it may be resumed after the current trans/ops is completed. Return
* QDF_STATUS_E_AGAIN in this case.
*
* If there are any vdev trans/ops taking place, then the vdev trans/ops
* should be rejected and queued in the DSC queue so that it may be resumed
* after the current trans/ops is completed. Return QDF_STATUS_E_AGAIN in this
* case.
*
* Return: QDF_STATUS_SUCCESS if transition is allowed, error code if not.
*/
static QDF_STATUS __dsc_vdev_can_trans(struct dsc_vdev *vdev)
{
if (__dsc_trans_active_or_queued(&vdev->psoc->driver->trans))
return QDF_STATUS_E_INVAL;
if (qdf_is_recovering())
return QDF_STATUS_E_INVAL;
if (__dsc_trans_active_or_queued(&vdev->psoc->trans)) {
/* psoc idle shutdown(wifi off) needs to be added in DSC queue
* to avoid wifi on failure while previous psoc idle shutdown
* is in progress and wifi is turned on. And Wifi On also needs
* to be added to the queue so that it waits for SSR to
* complete.
*/
if (qdf_is_driver_unloading())
return QDF_STATUS_E_INVAL;
else
return QDF_STATUS_E_AGAIN;
}
if (__dsc_trans_active_or_queued(&vdev->trans))
return QDF_STATUS_E_AGAIN;
return QDF_STATUS_SUCCESS;
}
static QDF_STATUS
__dsc_vdev_trans_start_nolock(struct dsc_vdev *vdev, const char *desc)
{
QDF_STATUS status = QDF_STATUS_SUCCESS;
status = __dsc_vdev_can_trans(vdev);
if (QDF_IS_STATUS_ERROR(status))
return status;
return __dsc_trans_start(&vdev->trans, desc);
}
static QDF_STATUS
__dsc_vdev_trans_start(struct dsc_vdev *vdev, const char *desc)
{
QDF_STATUS status;
if (!dsc_assert(vdev))
return QDF_STATUS_E_INVAL;
if (!dsc_assert(desc))
return QDF_STATUS_E_INVAL;
__dsc_driver_lock(vdev);
status = __dsc_vdev_trans_start_nolock(vdev, desc);
__dsc_driver_unlock(vdev);
return status;
}
QDF_STATUS dsc_vdev_trans_start(struct dsc_vdev *vdev, const char *desc)
{
QDF_STATUS status;
dsc_enter_str(desc);
status = __dsc_vdev_trans_start(vdev, desc);
if (QDF_IS_STATUS_ERROR(status))
dsc_exit_status(status);
return status;
}
static QDF_STATUS
__dsc_vdev_trans_start_wait(struct dsc_vdev *vdev, const char *desc)
{
QDF_STATUS status;
struct dsc_tran tran = { 0 };
if (!dsc_assert(vdev))
return QDF_STATUS_E_INVAL;
if (!dsc_assert(desc))
return QDF_STATUS_E_INVAL;
__dsc_driver_lock(vdev);
/* try to start without waiting */
status = __dsc_vdev_trans_start_nolock(vdev, desc);
if (QDF_IS_STATUS_SUCCESS(status) || status == QDF_STATUS_E_INVAL)
goto unlock;
status = __dsc_trans_queue(&vdev->trans, &tran, desc);
if (QDF_IS_STATUS_ERROR(status))
goto unlock;
__dsc_driver_unlock(vdev);
return __dsc_tran_wait(&tran);
unlock:
__dsc_driver_unlock(vdev);
return status;
}
QDF_STATUS dsc_vdev_trans_start_wait(struct dsc_vdev *vdev, const char *desc)
{
QDF_STATUS status;
dsc_enter_str(desc);
status = __dsc_vdev_trans_start_wait(vdev, desc);
if (QDF_IS_STATUS_ERROR(status))
dsc_exit_status(status);
return status;
}
static void __dsc_vdev_trigger_trans(struct dsc_vdev *vdev)
{
if (__dsc_driver_trans_trigger_checked(vdev->psoc->driver))
return;
if (__dsc_psoc_trans_trigger_checked(vdev->psoc))
return;
__dsc_trans_trigger(&vdev->trans);
}
static void __dsc_vdev_trans_stop(struct dsc_vdev *vdev)
{
if (!dsc_assert(vdev))
return;
__dsc_driver_lock(vdev);
__dsc_trans_stop(&vdev->trans);
__dsc_vdev_trigger_trans(vdev);
__dsc_driver_unlock(vdev);
}
void dsc_vdev_trans_stop(struct dsc_vdev *vdev)
{
__dsc_vdev_trans_stop(vdev);
}
static void __dsc_vdev_assert_trans_protected(struct dsc_vdev *vdev)
{
if (!dsc_assert(vdev))
return;
__dsc_driver_lock(vdev);
dsc_assert(__dsc_trans_active(&vdev->trans) ||
__dsc_trans_active(&vdev->psoc->trans) ||
__dsc_trans_active(&vdev->psoc->driver->trans));
__dsc_driver_unlock(vdev);
}
void dsc_vdev_assert_trans_protected(struct dsc_vdev *vdev)
{
__dsc_vdev_assert_trans_protected(vdev);
}
static QDF_STATUS __dsc_vdev_op_start(struct dsc_vdev *vdev, const char *func)
{
QDF_STATUS status;
if (!dsc_assert(vdev))
return QDF_STATUS_E_INVAL;
if (!dsc_assert(func))
return QDF_STATUS_E_INVAL;
__dsc_driver_lock(vdev);
status = __dsc_vdev_can_op(vdev);
if (QDF_IS_STATUS_ERROR(status))
goto unlock;
status = __dsc_ops_insert(&vdev->ops, func);
unlock:
__dsc_driver_unlock(vdev);
return status;
}
QDF_STATUS _dsc_vdev_op_start(struct dsc_vdev *vdev, const char *func)
{
QDF_STATUS status;
/* do not log from here because it can flood log message because vdev
* op protect is per vdev operation
*/
status = __dsc_vdev_op_start(vdev, func);
return status;
}
static void __dsc_vdev_op_stop(struct dsc_vdev *vdev, const char *func)
{
if (!dsc_assert(vdev))
return;
if (!dsc_assert(func))
return;
__dsc_driver_lock(vdev);
if (__dsc_ops_remove(&vdev->ops, func))
qdf_event_set(&vdev->ops.event);
__dsc_driver_unlock(vdev);
}
void _dsc_vdev_op_stop(struct dsc_vdev *vdev, const char *func)
{
/* do not log from here because it can flood log message because vdev
* op protect is per vdev operation
*/
__dsc_vdev_op_stop(vdev, func);
}
static void __dsc_vdev_wait_for_ops(struct dsc_vdev *vdev)
{
bool wait;
if (!dsc_assert(vdev))
return;
__dsc_driver_lock(vdev);
wait = vdev->ops.count > 0;
if (wait)
qdf_event_reset(&vdev->ops.event);
__dsc_driver_unlock(vdev);
if (wait)
qdf_wait_single_event(&vdev->ops.event, 0);
}
void dsc_vdev_wait_for_ops(struct dsc_vdev *vdev)
{
__dsc_vdev_wait_for_ops(vdev);
}
uint8_t dsc_vdev_get_cached_cmd(struct dsc_vdev *vdev)
{
return vdev->nb_cmd_during_ssr;
}
void dsc_vdev_cache_command(struct dsc_vdev *vdev, uint8_t cmd_id)
{
vdev->nb_cmd_during_ssr = cmd_id;
}

View File

@@ -1,628 +0,0 @@
/*
* Copyright (c) 2018-2020 The Linux Foundation. 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 "__wlan_dsc.h"
#include "qdf_event.h"
#include "qdf_threads.h"
#include "qdf_trace.h"
#include "qdf_types.h"
#include "wlan_dsc.h"
#include "wlan_dsc_test.h"
#include "cds_api.h"
#define dsc_driver_trans_start(driver) dsc_driver_trans_start(driver, __func__)
#define dsc_psoc_trans_start(psoc) dsc_psoc_trans_start(psoc, __func__)
#define dsc_vdev_trans_start(vdev) dsc_vdev_trans_start(vdev, __func__)
#define dsc_driver_trans_start_wait(driver) \
dsc_driver_trans_start_wait(driver, "")
#define dsc_psoc_trans_start_wait(psoc) \
dsc_psoc_trans_start_wait(psoc, __func__)
#define dsc_vdev_trans_start_wait(vdev) \
dsc_vdev_trans_start_wait(vdev, __func__)
static struct dsc_psoc *nth_psoc(struct dsc_driver *driver, int n)
{
struct dsc_psoc *psoc;
QDF_BUG(n > 0);
if (n <= 0)
return NULL;
dsc_for_each_driver_psoc(driver, psoc) {
n--;
if (n)
continue;
return psoc;
}
QDF_DEBUG_PANIC("Failed to find nth psoc: %d", n);
return NULL;
}
static struct dsc_vdev *nth_vdev(struct dsc_psoc *psoc, int n)
{
struct dsc_vdev *vdev;
QDF_BUG(n > 0);
if (n <= 0)
return NULL;
dsc_for_each_psoc_vdev(psoc, vdev) {
n--;
if (n)
continue;
return vdev;
}
QDF_DEBUG_PANIC("Failed to find nth vdev: %d", n);
return NULL;
}
static void __dsc_tree_destroy(struct dsc_driver *driver)
{
struct dsc_psoc *psoc;
struct dsc_psoc *next_psoc;
QDF_BUG(driver);
qdf_list_for_each_del(&driver->psocs, psoc, next_psoc, node) {
struct dsc_vdev *vdev;
struct dsc_vdev *next_vdev;
qdf_list_for_each_del(&psoc->vdevs, vdev, next_vdev, node)
dsc_vdev_destroy(&vdev);
dsc_psoc_destroy(&psoc);
}
dsc_driver_destroy(&driver);
}
static QDF_STATUS __dsc_tree_create(struct dsc_driver **out_driver,
uint8_t psocs_per_driver,
uint8_t vdevs_per_psoc)
{
QDF_STATUS status;
struct dsc_driver *driver;
int i, j;
status = dsc_driver_create(&driver);
if (QDF_IS_STATUS_ERROR(status)) {
dsc_err("Failed to create driver; status:%u", status);
return status;
}
for (i = 0; i < psocs_per_driver; i++) {
struct dsc_psoc *psoc;
status = dsc_psoc_create(driver, &psoc);
if (QDF_IS_STATUS_ERROR(status)) {
dsc_err("Failed to create psoc; status:%u", status);
goto free_tree;
}
for (j = 0; j < vdevs_per_psoc; j++) {
struct dsc_vdev *vdev;
status = dsc_vdev_create(psoc, &vdev);
if (QDF_IS_STATUS_ERROR(status)) {
dsc_err("Failed to create vdev; status:%u",
status);
goto free_tree;
}
}
}
*out_driver = driver;
return QDF_STATUS_SUCCESS;
free_tree:
__dsc_tree_destroy(driver);
return status;
}
static uint32_t dsc_test_create_destroy(void)
{
uint32_t errors = 0;
QDF_STATUS status;
struct dsc_driver *driver;
dsc_enter();
status = __dsc_tree_create(&driver, 2, 2);
if (QDF_IS_STATUS_ERROR(status)) {
errors++;
goto exit;
}
__dsc_tree_destroy(driver);
exit:
dsc_exit();
return errors;
}
#define action_expect(obj, action, status, errors) \
do { \
void *__obj = obj; \
QDF_STATUS __expected = status; \
QDF_STATUS __result; \
\
__result = dsc_##obj##_##action##_start(__obj); \
if (__result != __expected) { \
dsc_err("FAIL: " #obj " " #action \
"; expected " #status " (%u), found %u", \
__expected, __result); \
(errors)++; \
} \
if (QDF_IS_STATUS_SUCCESS(__result) && QDF_IS_STATUS_ERROR(__expected))\
dsc_##obj##_##action##_stop(__obj); \
} while (false)
static uint32_t dsc_test_driver_trans_blocks(void)
{
uint32_t errors = 0;
QDF_STATUS status;
struct dsc_driver *driver;
struct dsc_psoc *psoc;
struct dsc_vdev *vdev;
dsc_enter();
/* setup */
status = __dsc_tree_create(&driver, 2, 2);
if (QDF_IS_STATUS_ERROR(status)) {
errors++;
goto exit;
}
/* test */
/* a driver in transition should cause ... */
action_expect(driver, trans, QDF_STATUS_SUCCESS, errors);
/* ... the same driver trans/ops to fail */
action_expect(driver, trans, QDF_STATUS_E_AGAIN, errors);
action_expect(driver, op, QDF_STATUS_E_AGAIN, errors);
/* ... children psoc trans/ops to fail */
dsc_for_each_driver_psoc(driver, psoc) {
action_expect(psoc, trans, QDF_STATUS_E_INVAL, errors);
action_expect(psoc, op, QDF_STATUS_E_INVAL, errors);
/* ... grandchildren vdev trans/ops to fail */
dsc_for_each_psoc_vdev(psoc, vdev) {
action_expect(vdev, trans, QDF_STATUS_E_INVAL, errors);
action_expect(vdev, op, QDF_STATUS_E_INVAL, errors);
}
}
/* teardown */
dsc_driver_trans_stop(driver);
__dsc_tree_destroy(driver);
exit:
dsc_exit();
return errors;
}
static uint32_t dsc_test_psoc_trans_blocks(void)
{
uint32_t errors = 0;
QDF_STATUS status;
struct dsc_driver *driver;
struct dsc_psoc *psoc;
struct dsc_vdev *vdev;
dsc_enter();
/* setup */
status = __dsc_tree_create(&driver, 2, 2);
if (QDF_IS_STATUS_ERROR(status)) {
errors++;
goto exit;
}
/* test */
/* a psoc in transition should cause ... */
psoc = nth_psoc(driver, 1);
action_expect(psoc, trans, QDF_STATUS_SUCCESS, errors);
/* ... driver trans/ops to fail */
action_expect(driver, trans, QDF_STATUS_E_AGAIN, errors);
action_expect(driver, op, QDF_STATUS_E_AGAIN, errors);
/* ... the same psoc trans/ops to fail */
action_expect(psoc, trans, QDF_STATUS_E_AGAIN, errors);
action_expect(psoc, op, QDF_STATUS_E_AGAIN, errors);
/* ... children vdev trans/ops to fail */
dsc_for_each_psoc_vdev(psoc, vdev) {
action_expect(vdev, trans, QDF_STATUS_E_AGAIN, errors);
action_expect(vdev, op, QDF_STATUS_E_AGAIN, errors);
}
/* ... while driver unload in progress vdev op and trans should be
* rejected with EINVAL
*/
cds_set_unload_in_progress(true);
dsc_for_each_psoc_vdev(psoc, vdev) {
action_expect(vdev, trans, QDF_STATUS_E_INVAL, errors);
action_expect(vdev, op, QDF_STATUS_E_INVAL, errors);
}
cds_set_unload_in_progress(false);
/* ... while SSR recovery in progress vdev op and trans should be
* rejected with EINVAL
*/
cds_set_recovery_in_progress(true);
dsc_for_each_psoc_vdev(psoc, vdev) {
action_expect(vdev, trans, QDF_STATUS_E_INVAL, errors);
action_expect(vdev, op, QDF_STATUS_E_INVAL, errors);
}
cds_set_recovery_in_progress(false);
/* a sibling psoc in transition should succeed and cause ... */
psoc = nth_psoc(driver, 2);
action_expect(psoc, trans, QDF_STATUS_SUCCESS, errors);
/* ... driver trans/ops to fail */
action_expect(driver, trans, QDF_STATUS_E_AGAIN, errors);
action_expect(driver, op, QDF_STATUS_E_AGAIN, errors);
/* ... the same psoc trans/ops to fail */
action_expect(psoc, trans, QDF_STATUS_E_AGAIN, errors);
action_expect(psoc, op, QDF_STATUS_E_AGAIN, errors);
/* ... children vdev trans/ops to fail */
dsc_for_each_psoc_vdev(psoc, vdev) {
action_expect(vdev, trans, QDF_STATUS_E_AGAIN, errors);
action_expect(vdev, op, QDF_STATUS_E_AGAIN, errors);
}
/* teardown */
dsc_for_each_driver_psoc(driver, psoc)
dsc_psoc_trans_stop(psoc);
__dsc_tree_destroy(driver);
exit:
dsc_exit();
return errors;
}
static uint32_t dsc_test_vdev_trans_blocks(void)
{
uint32_t errors = 0;
QDF_STATUS status;
struct dsc_driver *driver;
struct dsc_psoc *psoc;
struct dsc_vdev *vdev;
dsc_enter();
/* setup */
status = __dsc_tree_create(&driver, 2, 2);
if (QDF_IS_STATUS_ERROR(status)) {
errors++;
goto exit;
}
/* test */
/* a vdev in transition should cause ... */
dsc_for_each_driver_psoc(driver, psoc) {
dsc_for_each_psoc_vdev(psoc, vdev)
action_expect(vdev, trans, QDF_STATUS_SUCCESS, errors);
}
/* ... driver trans/ops to fail */
action_expect(driver, trans, QDF_STATUS_E_AGAIN, errors);
action_expect(driver, op, QDF_STATUS_E_AGAIN, errors);
/* ... psoc trans/ops to fail */
dsc_for_each_driver_psoc(driver, psoc) {
action_expect(psoc, trans, QDF_STATUS_E_AGAIN, errors);
action_expect(psoc, op, QDF_STATUS_E_AGAIN, errors);
/* ... the same vdev trans/ops to fail */
dsc_for_each_psoc_vdev(psoc, vdev) {
action_expect(vdev, trans, QDF_STATUS_E_AGAIN, errors);
action_expect(vdev, op, QDF_STATUS_E_AGAIN, errors);
}
}
/* teardown */
dsc_for_each_driver_psoc(driver, psoc) {
dsc_for_each_psoc_vdev(psoc, vdev)
dsc_vdev_trans_stop(vdev);
}
__dsc_tree_destroy(driver);
exit:
dsc_exit();
return errors;
}
#define THREAD_TIMEOUT 1000 /* ms */
#define dsc_event_wait(event) qdf_wait_single_event(event, THREAD_TIMEOUT)
#define step_assert(field, expected) \
do { \
uint32_t _step = ++(field); \
uint32_t _expected = (expected); \
\
if (_step != _expected) \
QDF_DEBUG_PANIC("Step count is %u; Expected %u", \
_step, _expected); \
} while (false)
#define trans_waiting(ctx) (!qdf_list_empty(&(ctx)->trans.queue))
struct thread_ctx {
struct dsc_driver *driver;
qdf_event_t start_vdev_trans;
qdf_event_t start_vdev_wait;
uint32_t step;
};
static QDF_STATUS dsc_thread_ops(void *context)
{
struct thread_ctx *ctx = context;
struct dsc_driver *driver = ctx->driver;
struct dsc_psoc *psoc = nth_psoc(driver, 1);
struct dsc_vdev *vdev = nth_vdev(psoc, 1);
dsc_enter();
/* thread 1 is doing some operations ... */
step_assert(ctx->step, 1);
dsc_assert_success(dsc_driver_op_start(driver));
dsc_assert_success(dsc_psoc_op_start(psoc));
dsc_assert_success(dsc_vdev_op_start(vdev));
step_assert(ctx->step, 2);
/* ... at which point, thread 2 starts to transition the vdevs */
qdf_event_set(&ctx->start_vdev_trans);
/* meanwhile, thread 3,4,5 queue up to transition vdev/psoc/driver */
while (!trans_waiting(driver))
schedule();
/* at this point, each thread is:
* 1) doing operations
* 2) transitioning vdevs 1/2, waiting for ops to finish
* 3) waiting to transition vdev 1
* 4) waiting to transition psoc
* 5) waitint to transition driver
*/
step_assert(ctx->step, 8);
dsc_driver_op_stop(driver);
schedule();
dsc_psoc_op_stop(psoc);
schedule();
dsc_vdev_op_stop(vdev);
/* all operations complete; thread2 is now unblocked */
dsc_exit();
return QDF_STATUS_SUCCESS;
}
static QDF_STATUS dsc_thread_vdev_trans(void *context)
{
struct thread_ctx *ctx = context;
struct dsc_driver *driver = ctx->driver;
struct dsc_psoc *psoc = nth_psoc(driver, 1);
struct dsc_vdev *vdev;
dsc_enter();
/* wait for thread 1 to start operations */
dsc_assert_success(dsc_event_wait(&ctx->start_vdev_trans));
/* start transitions on all vdevs */
step_assert(ctx->step, 3);
dsc_for_each_psoc_vdev(psoc, vdev)
dsc_assert_success(dsc_vdev_trans_start(vdev));
step_assert(ctx->step, 4);
/* meanwhile, thread 3,4,5 queue up to transition vdev/psoc/driver */
qdf_event_set(&ctx->start_vdev_wait);
/* wait for thread 1 to complete pending vdev ops */
dsc_for_each_psoc_vdev(psoc, vdev)
dsc_vdev_wait_for_ops(vdev);
/* actual vdev transition work would happen here */
/* stop transition on vdev 1 */
step_assert(ctx->step, 9);
dsc_vdev_trans_stop(nth_vdev(psoc, 1));
/* psoc trans should not start until both vdev trans are complete */
schedule();
step_assert(ctx->step, 10);
dsc_vdev_trans_stop(nth_vdev(psoc, 2));
dsc_exit();
return QDF_STATUS_SUCCESS;
}
static QDF_STATUS dsc_thread_vdev_wait(void *context)
{
struct thread_ctx *ctx = context;
struct dsc_vdev *vdev = nth_vdev(nth_psoc(ctx->driver, 1), 1);
dsc_enter();
dsc_assert_success(dsc_event_wait(&ctx->start_vdev_wait));
step_assert(ctx->step, 5);
/* vdev trans queues first ... */
dsc_assert_success(dsc_vdev_trans_start_wait(vdev));
/* ... but de-queues third */
step_assert(ctx->step, 15);
dsc_vdev_wait_for_ops(vdev);
step_assert(ctx->step, 16);
dsc_vdev_trans_stop(vdev);
dsc_exit();
return QDF_STATUS_SUCCESS;
}
static QDF_STATUS dsc_thread_psoc_wait(void *context)
{
struct thread_ctx *ctx = context;
struct dsc_psoc *psoc = nth_psoc(ctx->driver, 1);
struct dsc_vdev *vdev = nth_vdev(psoc, 1);
dsc_enter();
while (!trans_waiting(vdev))
schedule();
step_assert(ctx->step, 6);
/* psoc trans queues second ... */
dsc_assert_success(dsc_psoc_trans_start_wait(psoc));
/* ... and de-queues second */
step_assert(ctx->step, 13);
dsc_psoc_wait_for_ops(psoc);
step_assert(ctx->step, 14);
dsc_psoc_trans_stop(psoc);
dsc_exit();
return QDF_STATUS_SUCCESS;
}
static QDF_STATUS dsc_thread_driver_wait(void *context)
{
struct thread_ctx *ctx = context;
struct dsc_driver *driver = ctx->driver;
struct dsc_psoc *psoc = nth_psoc(driver, 1);
dsc_enter();
while (!trans_waiting(psoc))
schedule();
step_assert(ctx->step, 7);
/* driver trans queues third ... */
dsc_assert_success(dsc_driver_trans_start_wait(driver));
/* ... but de-queues first */
step_assert(ctx->step, 11);
dsc_driver_wait_for_ops(driver);
step_assert(ctx->step, 12);
dsc_driver_trans_stop(driver);
dsc_exit();
return QDF_STATUS_SUCCESS;
}
static uint32_t dsc_test_trans_wait(void)
{
uint32_t errors = 0;
QDF_STATUS status;
qdf_thread_t *ops_thread;
qdf_thread_t *vdev_trans_thread;
qdf_thread_t *vdev_wait_thread;
qdf_thread_t *psoc_wait_thread;
qdf_thread_t *driver_wait_thread;
struct thread_ctx ctx = { 0 };
dsc_enter();
status = __dsc_tree_create(&ctx.driver, 1, 2);
if (QDF_IS_STATUS_ERROR(status)) {
errors++;
goto exit;
}
dsc_assert_success(qdf_event_create(&ctx.start_vdev_trans));
dsc_assert_success(qdf_event_create(&ctx.start_vdev_wait));
dsc_debug("starting threads");
ops_thread = qdf_thread_run(dsc_thread_ops, &ctx);
vdev_trans_thread = qdf_thread_run(dsc_thread_vdev_trans, &ctx);
vdev_wait_thread = qdf_thread_run(dsc_thread_vdev_wait, &ctx);
psoc_wait_thread = qdf_thread_run(dsc_thread_psoc_wait, &ctx);
driver_wait_thread = qdf_thread_run(dsc_thread_driver_wait, &ctx);
qdf_thread_join(ops_thread);
qdf_thread_join(vdev_trans_thread);
qdf_thread_join(vdev_wait_thread);
qdf_thread_join(psoc_wait_thread);
qdf_thread_join(driver_wait_thread);
dsc_debug("threads joined");
qdf_event_destroy(&ctx.start_vdev_wait);
qdf_event_destroy(&ctx.start_vdev_trans);
__dsc_tree_destroy(ctx.driver);
exit:
dsc_exit();
return errors;
}
uint32_t dsc_unit_test(void)
{
uint32_t errors = 0;
errors += dsc_test_create_destroy();
errors += dsc_test_driver_trans_blocks();
errors += dsc_test_psoc_trans_blocks();
errors += dsc_test_vdev_trans_blocks();
errors += dsc_test_trans_wait();
return errors;
}

View File

@@ -1,37 +0,0 @@
/*
* Copyright (c) 2018 The Linux Foundation. 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 __WLAN_DSC_TEST
#define __WLAN_DSC_TEST
#ifdef WLAN_DSC_TEST
/**
* dsc_unit_test() - run the dsc unit test suite
*
* Return: number of failed test cases
*/
uint32_t dsc_unit_test(void);
#else
static inline uint32_t dsc_unit_test(void)
{
return 0;
}
#endif /* WLAN_DSC_TEST */
#endif /* __WLAN_DSC_TEST */

View File

@@ -1,182 +0,0 @@
/*
* Copyright (c) 2020, The Linux Foundation. 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.
*/
/**
* DOC: Declare private API which shall be used internally only
* in ftm_time_sync component. This file shall include prototypes of
* various notification handlers and logging functions.
*
* Note: This API should be never accessed out of ftm_time_sync component.
*/
#ifndef _FTM_TIME_SYNC_MAIN_H_
#define _FTM_TIME_SYNC_MAIN_H_
#include <qdf_types.h>
#include <qdf_delayed_work.h>
#include "ftm_time_sync_priv.h"
#include "ftm_time_sync_objmgr.h"
#define ftm_time_sync_log(level, args...) \
QDF_TRACE(QDF_MODULE_ID_FTM_TIME_SYNC, level, ## args)
#define ftm_time_sync_logfl(level, format, args...) \
ftm_time_sync_log(level, FL(format), ## args)
#define ftm_time_sync_fatal(format, args...) \
ftm_time_sync_logfl(QDF_TRACE_LEVEL_FATAL, format, ## args)
#define ftm_time_sync_err(format, args...) \
ftm_time_sync_logfl(QDF_TRACE_LEVEL_ERROR, format, ## args)
#define ftm_time_sync_warn(format, args...) \
ftm_time_sync_logfl(QDF_TRACE_LEVEL_WARN, format, ## args)
#define ftm_time_sync_info(format, args...) \
ftm_time_sync_logfl(QDF_TRACE_LEVEL_INFO, format, ## args)
#define ftm_time_sync_debug(format, args...) \
ftm_time_sync_logfl(QDF_TRACE_LEVEL_DEBUG, format, ## args)
#define FTM_TIME_SYNC_ENTER() ftm_time_sync_debug("enter")
#define FTM_TIME_SYNC_EXIT() ftm_time_sync_debug("exit")
/**
* ftm_time_sync_vdev_create_notification() - Handler for vdev create notify.
* @vdev: vdev which is going to be created by objmgr
* @arg: argument for notification handler
*
* Allocate and attach vdev private object.
*
* Return: QDF_STATUS
*/
QDF_STATUS ftm_time_sync_vdev_create_notification(struct wlan_objmgr_vdev *vdev,
void *arg);
/**
* ftm_time_sync_vdev_destroy_notification() - Handler for vdev destroy notify.
* @vdev: vdev which is going to be destroyed by objmgr
* @arg: argument for notification handler.
*
* Deallocate and detach vdev private object.
*
* Return: QDF_STATUS
*/
QDF_STATUS
ftm_time_sync_vdev_destroy_notification(struct wlan_objmgr_vdev *vdev,
void *arg);
/**
* ftm_time_sync_psoc_create_notification() - Handler for psoc create notify.
* @psoc: psoc which is going to be created by objmgr
* @arg: argument for notification handler.
*
* Allocate and attach psoc private object.
*
* Return: QDF_STATUS
*/
QDF_STATUS
ftm_time_sync_psoc_create_notification(struct wlan_objmgr_psoc *psoc,
void *arg);
/**
* ftm_time_sync_psoc_destroy_notification() - Handler for psoc destroy notify.
* @psoc: psoc which is going to be destroyed by objmgr
* @arg: argument for notification handler.
*
* Deallocate and detach psoc private object.
*
* Return: QDF_STATUS
*/
QDF_STATUS
ftm_time_sync_psoc_destroy_notification(struct wlan_objmgr_psoc *psoc,
void *arg);
/**
* ftm_time_sync_is_enable() - Function to advertise feature is enabled or not
* @psoc: psoc context
*
* This function advertises whether the feature is enabled or not.
*
* Return: true if enable, false if disable
*/
bool ftm_time_sync_is_enable(struct wlan_objmgr_psoc *psoc);
/**
* ftm_time_sync_set_enable() - Handler to enable the feature
* @psoc: psoc context
* @value: value to be set
*
* This function is used to enable the ftm time sync feature.
* The feature is enabled iff both ini and wmi service is advertised by
* firmware.
*
* Return: None
*/
void ftm_time_sync_set_enable(struct wlan_objmgr_psoc *psoc, bool value);
/**
* ftm_time_sync_get_mode() - API to get the ftm time sync mode
* @psoc: psoc context
*
* Return: enum ftm_time_sync_mode
*/
enum ftm_time_sync_mode ftm_time_sync_get_mode(struct wlan_objmgr_psoc *psoc);
/**
* ftm_time_sync_get_role() - API to get the ftm time sync role
* @psoc: psoc context
*
* Return: enum ftm_time_sync_role
*/
enum ftm_time_sync_role ftm_time_sync_get_role(struct wlan_objmgr_psoc *psoc);
/**
* ftm_time_sync_send_trigger() - Handler for sending trigger cmd to FW
* @vdev: vdev for which FTM time_sync trigger cmd to be send
*
* This function sends the ftm trigger cmd to target.
*
* Return: QDF_STATUS
*/
QDF_STATUS ftm_time_sync_send_trigger(struct wlan_objmgr_vdev *vdev);
/**
* ftm_time_sync_stop() - Handler for stopping the FTM time sync
* @vdev: vdev for which FTM time_sync feature to be stopped
*
* This function stops the ftm time sync functionality.
*
* Return: QDF_STATUS
*/
QDF_STATUS ftm_time_sync_stop(struct wlan_objmgr_vdev *vdev);
/**
* ftm_time_sync_show() - Handler to print the offset derived
* @vdev: vdev for which offset is to be shown
* @buf: buffer in which the values to be printed
*
* Return: the number of bytes written in buf
*/
ssize_t ftm_time_sync_show(struct wlan_objmgr_vdev *vdev, char *buf);
/**
* ftm_time_sync_update_bssid() - Update the bssid info
* @vdev: vdev context
* @bssid: bssid of connected AP
*
* Return: None
*/
void ftm_time_sync_update_bssid(struct wlan_objmgr_vdev *vdev,
struct qdf_mac_addr bssid);
#endif /* end of _FTM_TIME_SYNC_MAIN_H_ */

View File

@@ -1,126 +0,0 @@
/*
* Copyright (c) 2020, The Linux Foundation. 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.
*/
/**
* DOC: This file contains various object manager related wrappers and helpers
*/
#ifndef _FTM_TIME_SYNC_OBJMGR_H
#define _FTM_TIME_SYNC_OBJMGR_H
#include "wlan_cmn.h"
#include "wlan_objmgr_cmn.h"
#include "wlan_objmgr_vdev_obj.h"
#include "wlan_objmgr_global_obj.h"
/**
* ftm_time_sync_vdev_get_ref() - Wrapper to increment ftm_time_sync ref count
* @vdev: vdev object
*
* Wrapper for ftm_time_sync to increment ref count after checking valid
* object state.
*
* Return: SUCCESS/FAILURE
*/
static inline
QDF_STATUS ftm_time_sync_vdev_get_ref(struct wlan_objmgr_vdev *vdev)
{
return wlan_objmgr_vdev_try_get_ref(vdev, FTM_TIME_SYNC_ID);
}
/**
* ftm_time_sync_vdev_put_ref() - Wrapper to decrement ftm_time_sync ref count
* @vdev: vdev object
*
* Wrapper for ftm_time_sync to decrement ref count of vdev.
*
* Return: SUCCESS/FAILURE
*/
static inline
void ftm_time_sync_vdev_put_ref(struct wlan_objmgr_vdev *vdev)
{
return wlan_objmgr_vdev_release_ref(vdev, FTM_TIME_SYNC_ID);
}
/**
* ftm_time_sync_vdev_get_priv() - Wrapper to retrieve vdev priv obj
* @vdev: vdev pointer
*
* Wrapper for ftm_time_sync to get vdev private object pointer.
*
* Return: Private object of vdev
*/
static inline struct ftm_time_sync_vdev_priv *
ftm_time_sync_vdev_get_priv(struct wlan_objmgr_vdev *vdev)
{
struct ftm_time_sync_vdev_priv *vdev_priv;
vdev_priv = wlan_objmgr_vdev_get_comp_private_obj(
vdev, WLAN_UMAC_COMP_FTM_TIME_SYNC);
QDF_BUG(vdev_priv);
return vdev_priv;
}
/**
* ftm_time_sync_psoc_get_ref() - Wrapper to increment ftm_time sync ref count
* @psoc: psoc object
*
* Wrapper for ftm time sync to increment ref count after checking valid
* object state.
*
* Return: QDF_STATUS
*/
static inline
QDF_STATUS ftm_time_sync_psoc_get_ref(struct wlan_objmgr_psoc *psoc)
{
return wlan_objmgr_psoc_try_get_ref(psoc, FTM_TIME_SYNC_ID);
}
/**
* ftm_time_sync_psoc_put_ref() - Wrapper to decrement ftm time sync ref count
* @psoc: psoc object
*
* Wrapper for ftm time sync to decrement ref count of psoc.
*
* Return: None
*/
static inline
void ftm_time_sync_psoc_put_ref(struct wlan_objmgr_psoc *psoc)
{
wlan_objmgr_psoc_release_ref(psoc, FTM_TIME_SYNC_ID);
}
/**
* ftm_time_sync_psoc_get_priv() - Wrapper to retrieve psoc priv obj
* @psoc: psoc pointer
*
* Wrapper for ftm time sync to get psoc private object pointer.
*
* Return: ftm time sync psoc private object
*/
static inline struct ftm_time_sync_psoc_priv *
ftm_time_sync_psoc_get_priv(struct wlan_objmgr_psoc *psoc)
{
struct ftm_time_sync_psoc_priv *psoc_priv;
psoc_priv = wlan_objmgr_psoc_get_comp_private_obj(
psoc, WLAN_UMAC_COMP_FTM_TIME_SYNC);
QDF_BUG(psoc_priv);
return psoc_priv;
}
#endif /* _FTM_TIME_SYNC_OBJMGR_H */

View File

@@ -1,108 +0,0 @@
/*
* Copyright (c) 2020, The Linux Foundation. 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.
*/
/**
* DOC: Declare private API which shall be used internally only
* in ftm_time_sync component. This file shall include prototypes of
* ftm_time_sync parsing and send logic.
*
* Note: This API should be never accessed out of ftm_time_sync component.
*/
#ifndef _FTM_TIME_SYNC_PRIV_STRUCT_H_
#define _FTM_TIME_SYNC_PRIV_STRUCT_H_
#include <qdf_list.h>
#include <qdf_types.h>
#include "ftm_time_sync_objmgr.h"
#include "wlan_ftm_time_sync_public_struct.h"
#define WLAN_FTM_TIME_SYNC_PAIR_MAX 32
/**
* struct wlan_time_sync_pair - wlan time sync pair
* @qtime_master: master qtime
* @qtime_slave: slave qtime
*/
struct wlan_time_sync_pair {
uint64_t qtime_master;
uint64_t qtime_slave;
};
/**
* struct ftm_time_sync_vdev_priv - Private object to be stored in vdev
* @qtime_ref: qtime ref
* @mac_ref: mac time ref
* @time_pair: array of master/slave qtime pair
*/
struct ftm_time_sync_priv {
uint64_t qtime_ref;
uint64_t mac_ref;
struct wlan_time_sync_pair time_pair[WLAN_FTM_TIME_SYNC_PAIR_MAX];
};
/**
* struct ftm_time_sync_cfg - Cfg ini param for FTM time sync
* @enable: FTM time_sync feature enable/disable
* @mode: Aggregated/burst mode applicable iff enable = 1
* @role: Slave/Master Role applicable iff enable = 1
*/
struct ftm_time_sync_cfg {
bool enable;
enum ftm_time_sync_mode mode;
enum ftm_time_sync_role role;
};
/**
* struct ftm_time_sync_psoc_priv - Private object to be stored in psoc
* @psoc: pointer to psoc object
* @cfg_param: INI config param for ftm time sync
*/
struct ftm_time_sync_psoc_priv {
struct wlan_objmgr_psoc *psoc;
struct ftm_time_sync_cfg cfg_param;
};
/**
* struct ftm_time_sync_vdev_priv - Private object to be stored in vdev
* @vdev: pointer to vdev object
* @ftm_ts_priv: time sync private struct
* @rx_ops: rx operations for ftm time sync
* @tx_ops: tx operations for ftm time sync
* @ftm_time_sync_mutex: mutex to access ftm time sync priv members
* @ftm_time_sync_work: work to capture audio qtime and send it to FW
* @time_sync_interval: interval between two qtime capture
* @num_qtime_pair: number of qmaster and qslave pair derived
* @num_reads: number of times the qtime to be captured
* @valid: send qtime to FW only if this is true
* @bssid: bssid of connected AP
*/
struct ftm_time_sync_vdev_priv {
struct wlan_objmgr_vdev *vdev;
struct ftm_time_sync_priv ftm_ts_priv;
struct wlan_ftm_time_sync_rx_ops rx_ops;
struct wlan_ftm_time_sync_tx_ops tx_ops;
qdf_mutex_t ftm_time_sync_mutex;
struct qdf_delayed_work ftm_time_sync_work;
uint32_t time_sync_interval;
int num_qtime_pair;
int num_reads;
bool valid;
struct qdf_mac_addr bssid;
};
#endif /* End of _FTM_TIME_SYNC_PRIV_STRUCT_H_ */

View File

@@ -1,425 +0,0 @@
/*
* Copyright (c) 2020, The Linux Foundation. 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.
*/
/**
* DOC: Implement various notification handlers which are accessed
* internally in ftm_time_sync component only.
*/
#include "ftm_time_sync_main.h"
#include "target_if_ftm_time_sync.h"
#include "wlan_objmgr_vdev_obj.h"
#include "cfg_ftm_time_sync.h"
#include "cfg_ucfg_api.h"
#include <pld_common.h>
void ftm_time_sync_set_enable(struct wlan_objmgr_psoc *psoc, bool value)
{
struct ftm_time_sync_psoc_priv *psoc_priv;
if (!psoc) {
ftm_time_sync_err("psoc is NULL");
return;
}
psoc_priv = ftm_time_sync_psoc_get_priv(psoc);
if (!psoc_priv) {
ftm_time_sync_err("psoc priv is NULL");
return;
}
psoc_priv->cfg_param.enable &= value;
}
bool ftm_time_sync_is_enable(struct wlan_objmgr_psoc *psoc)
{
struct ftm_time_sync_psoc_priv *psoc_priv;
if (!psoc) {
ftm_time_sync_err("psoc is NULL");
return false;
}
psoc_priv = ftm_time_sync_psoc_get_priv(psoc);
if (!psoc_priv) {
ftm_time_sync_err("psoc priv is NULL");
return false;
}
return psoc_priv->cfg_param.enable;
}
enum ftm_time_sync_mode ftm_time_sync_get_mode(struct wlan_objmgr_psoc *psoc)
{
struct ftm_time_sync_psoc_priv *psoc_priv;
if (!psoc) {
ftm_time_sync_err("psoc is NULL");
return FTM_TIMESYNC_AGGREGATED_MODE;
}
psoc_priv = ftm_time_sync_psoc_get_priv(psoc);
if (!psoc_priv) {
ftm_time_sync_err("psoc priv is NULL");
return FTM_TIMESYNC_AGGREGATED_MODE;
}
return psoc_priv->cfg_param.mode;
}
enum ftm_time_sync_role ftm_time_sync_get_role(struct wlan_objmgr_psoc *psoc)
{
struct ftm_time_sync_psoc_priv *psoc_priv;
if (!psoc) {
ftm_time_sync_err("psoc is NULL");
return FTM_TIMESYNC_SLAVE_ROLE;
}
psoc_priv = ftm_time_sync_psoc_get_priv(psoc);
if (!psoc_priv) {
ftm_time_sync_err("psoc priv is NULL");
return FTM_TIMESYNC_SLAVE_ROLE;
}
return psoc_priv->cfg_param.role;
}
static void ftm_time_sync_work_handler(void *arg)
{
struct ftm_time_sync_vdev_priv *vdev_priv = arg;
struct wlan_objmgr_psoc *psoc;
qdf_device_t qdf_dev;
QDF_STATUS status;
uint8_t vdev_id;
uint64_t lpass_ts;
if (!vdev_priv) {
ftm_time_sync_err("ftm vdev priv is Null");
return;
}
psoc = wlan_vdev_get_psoc(vdev_priv->vdev);
if (!psoc) {
ftm_time_sync_err("Failed to get psoc");
return;
}
vdev_id = wlan_vdev_get_id(vdev_priv->vdev);
qdf_dev = wlan_psoc_get_qdf_dev(psoc);
pld_get_audio_wlan_timestamp(qdf_dev->dev, PLD_TRIGGER_NEGATIVE_EDGE,
&lpass_ts);
qdf_mutex_acquire(&vdev_priv->ftm_time_sync_mutex);
if (vdev_priv->num_reads) {
vdev_priv->num_reads--;
qdf_mutex_release(&vdev_priv->ftm_time_sync_mutex);
qdf_delayed_work_start(&vdev_priv->ftm_time_sync_work,
vdev_priv->time_sync_interval);
} else {
qdf_mutex_release(&vdev_priv->ftm_time_sync_mutex);
}
if (vdev_priv->valid) {
status = vdev_priv->tx_ops.ftm_time_sync_send_qtime(
psoc, vdev_id, lpass_ts);
if (status != QDF_STATUS_SUCCESS)
ftm_time_sync_err("send_ftm_time_sync_qtime failed %d",
status);
vdev_priv->valid = false;
} else {
vdev_priv->valid = true;
}
}
QDF_STATUS
ftm_time_sync_vdev_create_notification(struct wlan_objmgr_vdev *vdev, void *arg)
{
struct ftm_time_sync_vdev_priv *vdev_priv;
struct wlan_objmgr_psoc *psoc;
QDF_STATUS status;
psoc = wlan_vdev_get_psoc(vdev);
if (!psoc) {
ftm_time_sync_err("Failed to get psoc");
return QDF_STATUS_E_INVAL;
}
if (!ftm_time_sync_is_enable(psoc))
return QDF_STATUS_SUCCESS;
vdev_priv = qdf_mem_malloc(sizeof(*vdev_priv));
if (!vdev_priv) {
status = QDF_STATUS_E_NOMEM;
goto exit;
}
status = wlan_objmgr_vdev_component_obj_attach(
vdev, WLAN_UMAC_COMP_FTM_TIME_SYNC,
(void *)vdev_priv, QDF_STATUS_SUCCESS);
if (QDF_IS_STATUS_ERROR(status)) {
ftm_time_sync_err("Failed to attach priv with vdev");
goto free_vdev_priv;
}
vdev_priv->vdev = vdev;
status = qdf_delayed_work_create(&vdev_priv->ftm_time_sync_work,
ftm_time_sync_work_handler, vdev_priv);
if (QDF_IS_STATUS_ERROR(status)) {
ftm_time_sync_err("Failed to create ftm time sync work\n");
goto free_vdev_priv;
}
qdf_mutex_create(&vdev_priv->ftm_time_sync_mutex);
target_if_ftm_time_sync_register_tx_ops(&vdev_priv->tx_ops);
target_if_ftm_time_sync_register_rx_ops(&vdev_priv->rx_ops);
vdev_priv->rx_ops.ftm_time_sync_register_start_stop(psoc);
vdev_priv->rx_ops.ftm_time_sync_regiser_master_slave_offset(psoc);
vdev_priv->valid = true;
goto exit;
free_vdev_priv:
qdf_mem_free(vdev_priv);
status = QDF_STATUS_E_INVAL;
exit:
return status;
}
static QDF_STATUS
ftm_time_sync_deregister_wmi_events(struct wlan_objmgr_vdev *vdev)
{
struct wlan_objmgr_psoc *psoc;
QDF_STATUS status;
psoc = wlan_vdev_get_psoc(vdev);
if (!psoc) {
ftm_time_sync_err("Failed to get psoc");
return QDF_STATUS_E_INVAL;
}
status = target_if_ftm_time_sync_unregister_ev_handlers(psoc);
return status;
}
QDF_STATUS
ftm_time_sync_vdev_destroy_notification(struct wlan_objmgr_vdev *vdev,
void *arg)
{
struct ftm_time_sync_vdev_priv *vdev_priv = NULL;
struct wlan_objmgr_psoc *psoc;
QDF_STATUS status = QDF_STATUS_E_FAILURE;
psoc = wlan_vdev_get_psoc(vdev);
if (!psoc) {
ftm_time_sync_err("Failed to get psoc");
return QDF_STATUS_E_INVAL;
}
if (!ftm_time_sync_is_enable(psoc))
return QDF_STATUS_SUCCESS;
vdev_priv = ftm_time_sync_vdev_get_priv(vdev);
if (!vdev_priv) {
ftm_time_sync_err("vdev priv is NULL");
goto exit;
}
qdf_mutex_destroy(&vdev_priv->ftm_time_sync_mutex);
qdf_delayed_work_destroy(&vdev_priv->ftm_time_sync_work);
ftm_time_sync_deregister_wmi_events(vdev);
status = wlan_objmgr_vdev_component_obj_detach(
vdev, WLAN_UMAC_COMP_FTM_TIME_SYNC,
(void *)vdev_priv);
if (QDF_IS_STATUS_ERROR(status))
ftm_time_sync_err("Failed to detach priv with vdev");
qdf_mem_free(vdev_priv);
vdev_priv = NULL;
exit:
return status;
}
static void
ftm_time_sync_cfg_init(struct ftm_time_sync_psoc_priv *psoc_priv)
{
psoc_priv->cfg_param.enable = cfg_get(psoc_priv->psoc,
CFG_ENABLE_TIME_SYNC_FTM);
psoc_priv->cfg_param.role = cfg_get(psoc_priv->psoc,
CFG_TIME_SYNC_FTM_ROLE);
psoc_priv->cfg_param.mode = cfg_get(psoc_priv->psoc,
CFG_TIME_SYNC_FTM_MODE);
}
QDF_STATUS
ftm_time_sync_psoc_create_notification(struct wlan_objmgr_psoc *psoc, void *arg)
{
struct ftm_time_sync_psoc_priv *psoc_priv;
QDF_STATUS status;
psoc_priv = qdf_mem_malloc(sizeof(*psoc_priv));
if (!psoc_priv)
return QDF_STATUS_E_NOMEM;
status = wlan_objmgr_psoc_component_obj_attach(
psoc, WLAN_UMAC_COMP_FTM_TIME_SYNC,
psoc_priv, QDF_STATUS_SUCCESS);
if (QDF_IS_STATUS_ERROR(status)) {
ftm_time_sync_err("Failed to attach psoc component obj");
goto free_psoc_priv;
}
psoc_priv->psoc = psoc;
ftm_time_sync_cfg_init(psoc_priv);
return status;
free_psoc_priv:
qdf_mem_free(psoc_priv);
return status;
}
QDF_STATUS
ftm_time_sync_psoc_destroy_notification(struct wlan_objmgr_psoc *psoc,
void *arg)
{
struct ftm_time_sync_psoc_priv *psoc_priv;
QDF_STATUS status;
psoc_priv = ftm_time_sync_psoc_get_priv(psoc);
if (!psoc_priv) {
ftm_time_sync_err("psoc priv is NULL");
return QDF_STATUS_E_FAILURE;
}
status = wlan_objmgr_psoc_component_obj_detach(
psoc, WLAN_UMAC_COMP_FTM_TIME_SYNC,
psoc_priv);
if (QDF_IS_STATUS_ERROR(status)) {
ftm_time_sync_err("Failed to detach psoc component obj");
return status;
}
qdf_mem_free(psoc_priv);
return status;
}
QDF_STATUS ftm_time_sync_send_trigger(struct wlan_objmgr_vdev *vdev)
{
struct ftm_time_sync_vdev_priv *vdev_priv;
struct wlan_objmgr_psoc *psoc;
enum ftm_time_sync_mode mode;
uint8_t vdev_id;
QDF_STATUS status;
psoc = wlan_vdev_get_psoc(vdev);
if (!psoc) {
ftm_time_sync_err("Failed to get psoc");
return QDF_STATUS_E_INVAL;
}
vdev_priv = ftm_time_sync_vdev_get_priv(vdev);
if (!vdev_priv) {
ftm_time_sync_err("Failed to get ftm time sync vdev_priv");
return QDF_STATUS_E_INVAL;
}
vdev_id = wlan_vdev_get_id(vdev_priv->vdev);
mode = ftm_time_sync_get_mode(psoc);
status = vdev_priv->tx_ops.ftm_time_sync_send_trigger(psoc,
vdev_id, mode);
if (QDF_IS_STATUS_ERROR(status))
ftm_time_sync_err("send_ftm_time_sync_trigger failed %d",
status);
return QDF_STATUS_SUCCESS;
}
QDF_STATUS ftm_time_sync_stop(struct wlan_objmgr_vdev *vdev)
{
struct ftm_time_sync_vdev_priv *vdev_priv;
int iter;
vdev_priv = ftm_time_sync_vdev_get_priv(vdev);
if (!vdev_priv) {
ftm_time_sync_err("Failed to get ftm time sync vdev_priv");
return QDF_STATUS_E_INVAL;
}
qdf_delayed_work_stop_sync(&vdev_priv->ftm_time_sync_work);
for (iter = 0; iter < vdev_priv->num_qtime_pair; iter++) {
vdev_priv->ftm_ts_priv.time_pair[iter].qtime_master = 0;
vdev_priv->ftm_ts_priv.time_pair[iter].qtime_slave = 0;
}
vdev_priv->num_qtime_pair = 0;
return QDF_STATUS_SUCCESS;
}
ssize_t ftm_time_sync_show(struct wlan_objmgr_vdev *vdev, char *buf)
{
struct ftm_time_sync_vdev_priv *vdev_priv;
uint64_t q_master, q_slave;
ssize_t size = 0;
int iter;
vdev_priv = ftm_time_sync_vdev_get_priv(vdev);
if (!vdev_priv) {
ftm_time_sync_debug("Failed to get ftm time sync vdev_priv");
return 0;
}
size = qdf_scnprintf(buf, PAGE_SIZE, "%s %pM\n", "BSSID",
vdev_priv->bssid.bytes);
for (iter = 0; iter < vdev_priv->num_qtime_pair; iter++) {
q_master = vdev_priv->ftm_ts_priv.time_pair[iter].qtime_master;
q_slave = vdev_priv->ftm_ts_priv.time_pair[iter].qtime_slave;
size += qdf_scnprintf(buf + size, PAGE_SIZE - size,
"%s %llu %s %llu %s %lld\n",
"Qtime_master", q_master, "Qtime_slave",
q_slave, "Offset", q_slave > q_master ?
q_slave - q_master : q_master - q_slave);
}
return size;
}
void ftm_time_sync_update_bssid(struct wlan_objmgr_vdev *vdev,
struct qdf_mac_addr bssid)
{
struct ftm_time_sync_vdev_priv *vdev_priv;
vdev_priv = ftm_time_sync_vdev_get_priv(vdev);
if (!vdev_priv) {
ftm_time_sync_debug("Failed to get ftm time sync vdev_priv");
return;
}
vdev_priv->bssid = bssid;
}

View File

@@ -1,96 +0,0 @@
/*
* Copyright (c) 2020, The Linux Foundation. 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.
*/
#if !defined(__FTM_TIME_SYNC_CFG_H__)
#define __FTM_TIME_SYNC_CFG_H__
/**
*
* DOC: ftm_time_sync_cfg.h
*
* FTM TIME SYNC feature INI configuration parameter definitions
*/
#ifdef FEATURE_WLAN_TIME_SYNC_FTM
#include "cfg_define.h"
#include "cfg_converged.h"
#include "qdf_types.h"
/*
* <ini>
* enable_time_sync_ftm - Time Sync FTM feature support
* @Min: 0
* @Max: 1
* @Default: 0
*
* When set to 1 Time Sync FTM feature will be enabled.
*
* Supported Feature: Time Sync FTM
*
* Usage: External
*
* </ini>
*/
#define CFG_ENABLE_TIME_SYNC_FTM CFG_INI_BOOL("enable_time_sync_ftm", \
0, \
"Enable Time Sync FTM Support")
/*
* <ini>
* time_sync_ftm_mode- Time Sync FTM feature Mode configuration
* @Min: 0 - Aggregated Mode
* @Max: 1 - Burst Mode
* @Default: 0
*
* This ini is applicable only if enable_time_sync_ftm is set to 1.
*
* Supported Feature: Time Sync FTM
*
* Usage: External
*
* </ini>
*/
#define CFG_TIME_SYNC_FTM_MODE CFG_INI_BOOL("time_sync_ftm_mode", \
0, \
"Configure Time Sync FTM Mode")
/*
* <ini>
* time_sync_ftm_role- Time Sync FTM feature Role configuration
* @Min: 0 - Slave Role
* @Max: 1 - Master Role
* @Default: 0
*
* This ini is applicable only if enable_time_sync_ftm is set to 1.
*
* Supported Feature: Time Sync FTM
*
* Usage: External
*
* </ini>
*/
#define CFG_TIME_SYNC_FTM_ROLE CFG_INI_BOOL("time_sync_ftm_role", \
0, \
"Configure Time Sync FTM Role")
#define CFG_TIME_SYNC_FTM_ALL \
CFG(CFG_ENABLE_TIME_SYNC_FTM) \
CFG(CFG_TIME_SYNC_FTM_MODE) \
CFG(CFG_TIME_SYNC_FTM_ROLE)
#else
#define CFG_TIME_SYNC_FTM_ALL
#endif /* FEATURE_WLAN_TIME_SYNC_FTM */
#endif /* __FTM_TIME_SYNC_CFG_H__ */

View File

@@ -1,155 +0,0 @@
/*
* Copyright (c) 2020, The Linux Foundation. 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.
*/
/**
* DOC: Declare public API related to the ftm time_sync called by north bound
* HDD/OSIF/LIM
*/
#ifndef _FTM_TIME_SYNC_UCFG_API_H_
#define _FTM_TIME_SYNC_UCFG_API_H_
#include <qdf_status.h>
#include <qdf_types.h>
#include "ftm_time_sync_objmgr.h"
#include "wlan_ftm_time_sync_public_struct.h"
#ifdef FEATURE_WLAN_TIME_SYNC_FTM
/**
* ucfg_ftm_time_sync_init() - FTM time sync component initialization.
*
* This function initializes the ftm time sync component and registers
* the handlers which are invoked on vdev creation.
*
* Return: For successful registration - QDF_STATUS_SUCCESS,
* else QDF_STATUS error codes.
*/
QDF_STATUS ucfg_ftm_time_sync_init(void);
/**
* ucfg_ftm_time_sync_deinit() - FTM time sync component deinit.
*
* This function deinits ftm time sync component.
*
* Return: None
*/
void ucfg_ftm_time_sync_deinit(void);
/**
* ucfg_is_ftm_time_sync_enable() - FTM time sync feature enable/disable
* @psoc: psoc context
*
* This function advertises whether the ftm time sync feature is enabled or not
*
* Return: true if enable else false
*/
bool ucfg_is_ftm_time_sync_enable(struct wlan_objmgr_psoc *psoc);
/**
* ucfg_ftm_time_sync_set_enable() - FTM time sync feature set enable/disable
* @psoc: psoc context
* @value: value to be set
*
* This function enables/disables the feature.
*
* Return: None
*/
void ucfg_ftm_time_sync_set_enable(struct wlan_objmgr_psoc *psoc, bool value);
/**
* ucfg_ftm_time_sync_update_sta_connect_state() - Handler for STA state change
* @vdev: STA vdev
* @state: connected/disconnected state
* @bssid: bssid of connected AP
*
* This function triggers the FTM time sync feature in case of connection and
* stops the ftm sync feature in case of disconnection.
*
* Return: None
*/
void
ucfg_ftm_time_sync_update_sta_connect_state(struct wlan_objmgr_vdev *vdev,
enum ftm_time_sync_sta_state state,
struct qdf_mac_addr bssid);
/**
* ucfg_ftm_time_sync_update_bss_state() - Handler to notify bss start/stop
* @vdev: SAP vdev
* @ap_state: BSS start/stop state
*
* This function triggers the FTM time sync feature in case of bss start and
* stops the ftm sync feature in case of bss stop.
*
* Return: None.
*/
void ucfg_ftm_time_sync_update_bss_state(struct wlan_objmgr_vdev *vdev,
enum ftm_time_sync_bss_state ap_state);
/**
* ucfg_ftm_time_sync_show() - Show the ftm time sync offset values derived
* @vdev: vdev context
* @buf: buffer in which the values to be written
*
* This function prints the offset values derived after ftm time sync
* between the qtime of STA(slave) and connected SAP(master).
*
* Return: number of bytes written in buffer
*/
ssize_t ucfg_ftm_time_sync_show(struct wlan_objmgr_vdev *vdev, char *buf);
#else
static inline
QDF_STATUS ucfg_ftm_time_sync_init(void)
{
return QDF_STATUS_SUCCESS;
}
static inline
void ucfg_ftm_time_sync_deinit(void)
{
}
static inline
bool ucfg_is_ftm_time_sync_enable(struct wlan_objmgr_psoc *psoc)
{
return false;
}
static inline
void ucfg_ftm_time_sync_set_enable(struct wlan_objmgr_psoc *psoc, bool value)
{
}
static inline void
ucfg_ftm_time_sync_update_sta_connect_state(struct wlan_objmgr_vdev *vdev,
enum ftm_time_sync_sta_state state)
{
}
static inline void
ucfg_ftm_time_sync_update_bss_state(struct wlan_objmgr_vdev *vdev,
enum ftm_time_sync_bss_state ap_state)
{
}
static inline
ssize_t ucfg_ftm_time_sync_show(struct wlan_objmgr_vdev *vdev, char *buf)
{
return 0;
}
#endif /* FEATURE_WLAN_TIME_SYNC_FTM */
#endif /* _FTM_TIME_SYNC_UCFG_API_H_ */

View File

@@ -1,99 +0,0 @@
/*
* Copyright (c) 2020, The Linux Foundation. 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.
*/
/**
* DOC: Declare various struct, macros which are used for obj mgmt in ftm time
* sync.
*
* Note: This file shall not contain public API's prototype/declarations.
*
*/
#ifndef _WLAN_TIME_SYNC_FTM_PUBLIC_STRUCT_H_
#define _WLAN_TIME_SYNC_FTM_PUBLIC_STRUCT_H_
struct wlan_objmgr_psoc;
/**
* enum ftm_time_sync_mode - ftm time sync modes
* @FTM_TIMESYNC_AGGREGATED_MODE: Ftm time sync aggregated mode
* Only one aggregated offset is provided
* @FTM_TIMESYNC_BURST_MODE: Ftm time sync burst mode, offset for each FTM
* frame is provided
*/
enum ftm_time_sync_mode {
FTM_TIMESYNC_AGGREGATED_MODE,
FTM_TIMESYNC_BURST_MODE,
};
/**
* enum ftm_time_sync_role - ftm time sync role
* @FTM_TIMESYNC_SLAVE_ROLE: Slave/STA role
* @FTM_TIMESYNC_MASTER_ROLE: Master/SAP role
*/
enum ftm_time_sync_role {
FTM_TIMESYNC_SLAVE_ROLE,
FTM_TIMESYNC_MASTER_ROLE,
};
/**
* enum ftm_time_sync_sta_state - ftm time sync sta states
* @FTM_TIME_SYNC_STA_CONNECTED: STA connected to AP
* @FTM_TIME_SYNC_STA_DISCONNECTED: STA disconnected
*/
enum ftm_time_sync_sta_state {
FTM_TIME_SYNC_STA_CONNECTED,
FTM_TIME_SYNC_STA_DISCONNECTED,
};
/**
* enum ftm_time_sync_bss_state - ftm time sync bss states
* @FTM_TIME_SYNC_BSS_STARTED: BSS started
* @FTM_TIME_SYNC_BSS_STOPPED: BSS stopped
*/
enum ftm_time_sync_bss_state {
FTM_TIME_SYNC_BSS_STARTED,
FTM_TIME_SYNC_BSS_STOPPED,
};
/**
* struct wlan_ftm_time_sync_tx_ops - structure of tx operation function
* pointers for ftm time_sync component
* @ftm_time_sync_send_qtime: send qtime wmi cmd to FW
* @ftm_time_sync_send_trigger: send ftm time sync trigger cmd
*
*/
struct wlan_ftm_time_sync_tx_ops {
QDF_STATUS (*ftm_time_sync_send_qtime)(struct wlan_objmgr_psoc *psoc,
uint32_t vdev_id,
uint64_t lpass_ts);
QDF_STATUS (*ftm_time_sync_send_trigger)(struct wlan_objmgr_psoc *psoc,
uint32_t vdev_id, bool mode);
};
/**
* struct wlan_ftm_time_sync_rx_ops - structure of rx operation function
* pointers for ftm time_sync component
* @ftm_time_sync_register_start_stop: register ftm time_sync start stop event
* @ftm_time_sync_regiser_master_slave_offset: register master slave qtime
* offset event
*/
struct wlan_ftm_time_sync_rx_ops {
QDF_STATUS (*ftm_time_sync_register_start_stop)
(struct wlan_objmgr_psoc *psoc);
QDF_STATUS (*ftm_time_sync_regiser_master_slave_offset)
(struct wlan_objmgr_psoc *psoc);
};
#endif /*_WLAN_TIME_SYNC_FTM_PUBLIC_STRUCT_H_ */

View File

@@ -1,52 +0,0 @@
/*
* Copyright (c) 2020, The Linux Foundation. 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.
*/
/**
* DOC: Declares public API for ftm time sync to interact with target/WMI
*/
#ifndef _WLAN_FTM_TIME_SYNC_TGT_API_H_
#define _WLAN_FTM_TIME_SYNC_TGT_API_H_
#include <qdf_types.h>
struct wlan_objmgr_psoc;
struct ftm_time_sync_start_stop_params;
struct ftm_time_sync_offset;
/**
* tgt_ftm_ts_start_stop_evt() - receive start/stop ftm event
* from target if
* @psoc: objmgr psoc object
* @param: start/stop parameters
*
* Return: QDF_STATUS
*/
QDF_STATUS
tgt_ftm_ts_start_stop_evt(struct wlan_objmgr_psoc *psoc,
struct ftm_time_sync_start_stop_params *param);
/**
* tgt_ftm_ts_offset_evt() - receive offset ftm event from target if
* @psoc: objmgr psoc object
* @param: offset parameters
*
* Return: QDF_STATUS
*/
QDF_STATUS tgt_ftm_ts_offset_evt(struct wlan_objmgr_psoc *psoc,
struct ftm_time_sync_offset *param);
#endif /*_WLAN_FTM_TIME_SYNC_TGT_API_H_ */

View File

@@ -1,176 +0,0 @@
/*
* Copyright (c) 2020, The Linux Foundation. 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.
*/
/**
* DOC: Public API implementation of ftm time_sync called by north bound iface.
*/
#include "ftm_time_sync_ucfg_api.h"
#include "ftm_time_sync_main.h"
#include <qdf_str.h>
QDF_STATUS ucfg_ftm_time_sync_init(void)
{
QDF_STATUS status;
status = wlan_objmgr_register_psoc_create_handler(
WLAN_UMAC_COMP_FTM_TIME_SYNC,
ftm_time_sync_psoc_create_notification,
NULL);
if (QDF_IS_STATUS_ERROR(status)) {
ftm_time_sync_err("Failed to register psoc create handler");
return status;
}
status = wlan_objmgr_register_psoc_destroy_handler(
WLAN_UMAC_COMP_FTM_TIME_SYNC,
ftm_time_sync_psoc_destroy_notification,
NULL);
if (QDF_IS_STATUS_ERROR(status)) {
ftm_time_sync_err("Failed to register psoc delete handler");
goto fail_destroy_psoc;
}
status = wlan_objmgr_register_vdev_create_handler(
WLAN_UMAC_COMP_FTM_TIME_SYNC,
ftm_time_sync_vdev_create_notification, NULL);
if (QDF_IS_STATUS_ERROR(status)) {
ftm_time_sync_err("Failed to register vdev create handler");
goto fail_create_vdev;
}
status = wlan_objmgr_register_vdev_destroy_handler(
WLAN_UMAC_COMP_FTM_TIME_SYNC,
ftm_time_sync_vdev_destroy_notification, NULL);
if (QDF_IS_STATUS_ERROR(status)) {
ftm_time_sync_err("Failed to register vdev destroy handler");
goto fail_destroy_vdev;
}
return status;
fail_destroy_vdev:
wlan_objmgr_unregister_vdev_create_handler(
WLAN_UMAC_COMP_FTM_TIME_SYNC,
ftm_time_sync_vdev_create_notification, NULL);
fail_create_vdev:
wlan_objmgr_unregister_psoc_destroy_handler(
WLAN_UMAC_COMP_FTM_TIME_SYNC,
ftm_time_sync_psoc_destroy_notification, NULL);
fail_destroy_psoc:
wlan_objmgr_unregister_psoc_create_handler(
WLAN_UMAC_COMP_FTM_TIME_SYNC,
ftm_time_sync_psoc_create_notification, NULL);
return status;
}
void ucfg_ftm_time_sync_deinit(void)
{
QDF_STATUS status;
status = wlan_objmgr_unregister_vdev_destroy_handler(
WLAN_UMAC_COMP_FTM_TIME_SYNC,
ftm_time_sync_vdev_destroy_notification,
NULL);
if (QDF_IS_STATUS_ERROR(status))
ftm_time_sync_err("Failed to unregister vdev delete handler");
status = wlan_objmgr_unregister_vdev_create_handler(
WLAN_UMAC_COMP_FTM_TIME_SYNC,
ftm_time_sync_vdev_create_notification, NULL);
if (!QDF_IS_STATUS_ERROR(status))
ftm_time_sync_err("Failed to unregister vdev create handler");
status = wlan_objmgr_unregister_psoc_destroy_handler(
WLAN_UMAC_COMP_FTM_TIME_SYNC,
ftm_time_sync_psoc_destroy_notification,
NULL);
if (QDF_IS_STATUS_ERROR(status))
ftm_time_sync_err("Failed to unregister psoc destroy handler");
status = wlan_objmgr_unregister_psoc_create_handler(
WLAN_UMAC_COMP_FTM_TIME_SYNC,
ftm_time_sync_psoc_create_notification,
NULL);
if (QDF_IS_STATUS_ERROR(status))
ftm_time_sync_err("Failed to unregister psoc create handler");
}
bool ucfg_is_ftm_time_sync_enable(struct wlan_objmgr_psoc *psoc)
{
return ftm_time_sync_is_enable(psoc);
}
void ucfg_ftm_time_sync_set_enable(struct wlan_objmgr_psoc *psoc, bool enable)
{
return ftm_time_sync_set_enable(psoc, enable);
}
void ucfg_ftm_time_sync_update_sta_connect_state(
struct wlan_objmgr_vdev *vdev,
enum ftm_time_sync_sta_state sta_state,
struct qdf_mac_addr bssid)
{
struct wlan_objmgr_psoc *psoc;
enum ftm_time_sync_role role;
psoc = wlan_vdev_get_psoc(vdev);
if (!psoc) {
ftm_time_sync_err("Failed to get psoc");
return;
}
role = ftm_time_sync_get_role(psoc);
if (role == FTM_TIMESYNC_SLAVE_ROLE) {
if (sta_state == FTM_TIME_SYNC_STA_CONNECTED)
ftm_time_sync_send_trigger(vdev);
else
ftm_time_sync_stop(vdev);
ftm_time_sync_update_bssid(vdev, bssid);
}
}
void ucfg_ftm_time_sync_update_bss_state(struct wlan_objmgr_vdev *vdev,
enum ftm_time_sync_bss_state ap_state)
{
struct wlan_objmgr_psoc *psoc;
enum ftm_time_sync_role role;
psoc = wlan_vdev_get_psoc(vdev);
if (!psoc) {
ftm_time_sync_err("Failed to get psoc");
return;
}
if (!ftm_time_sync_is_enable(psoc))
return;
role = ftm_time_sync_get_role(psoc);
if (role == FTM_TIMESYNC_MASTER_ROLE) {
if (ap_state == FTM_TIME_SYNC_BSS_STARTED)
ftm_time_sync_send_trigger(vdev);
else
ftm_time_sync_stop(vdev);
}
}
ssize_t ucfg_ftm_time_sync_show(struct wlan_objmgr_vdev *vdev, char *buf)
{
return ftm_time_sync_show(vdev, buf);
}

View File

@@ -1,103 +0,0 @@
/*
*Copyright (c) 2020, The Linux Foundation. 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.
*/
/**
* DOC: Implements public API for ftm time sync to interact with target/WMI
*/
#include "wlan_ftm_time_sync_tgt_api.h"
#include "ftm_time_sync_main.h"
#include "wlan_ftm_time_sync_public_struct.h"
#include <wmi_unified_api.h>
QDF_STATUS
tgt_ftm_ts_start_stop_evt(struct wlan_objmgr_psoc *psoc,
struct ftm_time_sync_start_stop_params *param)
{
struct wlan_objmgr_vdev *vdev;
struct ftm_time_sync_vdev_priv *vdev_priv;
uint8_t vdev_id;
vdev_id = param->vdev_id;
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
FTM_TIME_SYNC_ID);
if (!vdev) {
ftm_time_sync_err("failed to get vdev");
return QDF_STATUS_E_FAILURE;
}
vdev_priv = ftm_time_sync_vdev_get_priv(vdev);
qdf_mutex_acquire(&vdev_priv->ftm_time_sync_mutex);
vdev_priv->time_sync_interval = param->timer_interval;
vdev_priv->num_reads = param->num_reads * 2;
if (vdev_priv->num_reads && vdev_priv->time_sync_interval) {
vdev_priv->num_reads--;
qdf_mutex_release(&vdev_priv->ftm_time_sync_mutex);
qdf_delayed_work_start(&vdev_priv->ftm_time_sync_work,
param->timer_interval);
} else if (vdev_priv->time_sync_interval == 0) {
qdf_mutex_release(&vdev_priv->ftm_time_sync_mutex);
vdev_priv->ftm_ts_priv.qtime_ref = param->qtime;
vdev_priv->ftm_ts_priv.mac_ref = param->mac_time;
qdf_delayed_work_stop_sync(&vdev_priv->ftm_time_sync_work);
} else {
qdf_mutex_release(&vdev_priv->ftm_time_sync_mutex);
}
ftm_time_sync_vdev_put_ref(vdev);
return QDF_STATUS_SUCCESS;
}
QDF_STATUS tgt_ftm_ts_offset_evt(struct wlan_objmgr_psoc *psoc,
struct ftm_time_sync_offset *param)
{
struct ftm_time_sync_vdev_priv *vdev_priv;
struct wlan_objmgr_vdev *vdev;
uint8_t vdev_id;
int iter;
vdev_id = param->vdev_id;
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
FTM_TIME_SYNC_ID);
if (!vdev) {
ftm_time_sync_err("failed to get vdev");
return QDF_STATUS_E_FAILURE;
}
vdev_priv = ftm_time_sync_vdev_get_priv(vdev);
vdev_priv->num_qtime_pair = param->num_qtime <
FTM_TIME_SYNC_QTIME_PAIR_MAX ? param->num_qtime :
FTM_TIME_SYNC_QTIME_PAIR_MAX;
for (iter = 0; iter < vdev_priv->num_qtime_pair; iter++) {
vdev_priv->ftm_ts_priv.time_pair[iter].qtime_master =
param->pairs[iter].qtime_master;
vdev_priv->ftm_ts_priv.time_pair[iter].qtime_slave =
param->pairs[iter].qtime_slave;
}
ftm_time_sync_vdev_put_ref(vdev);
return QDF_STATUS_SUCCESS;
}

View File

@@ -1,461 +0,0 @@
/*
* Copyright (c) 2012 - 2021 The Linux Foundation. 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.
*/
/**
* DOC: declare utility API related to the fw_offload component
* called by other components
*/
#ifndef _WLAN_FW_OFFLOAD_MAIN_H_
#define _WLAN_FW_OFFLOAD_MAIN_H_
#include <wlan_objmgr_psoc_obj.h>
#include <wlan_objmgr_global_obj.h>
#include <wlan_cmn.h>
#include <scheduler_api.h>
#include "cfg_ucfg_api.h"
#include "wlan_fwol_public_structs.h"
#define fwol_alert(params...) QDF_TRACE_FATAL(QDF_MODULE_ID_FWOL, params)
#define fwol_err(params...) QDF_TRACE_ERROR(QDF_MODULE_ID_FWOL, params)
#define fwol_warn(params...) QDF_TRACE_WARN(QDF_MODULE_ID_FWOL, params)
#define fwol_info(params...) QDF_TRACE_INFO(QDF_MODULE_ID_FWOL, params)
#define fwol_debug(params...) QDF_TRACE_DEBUG(QDF_MODULE_ID_FWOL, params)
#define fwol_nofl_alert(params...) \
QDF_TRACE_FATAL_NO_FL(QDF_MODULE_ID_FWOL, params)
#define fwol_nofl_err(params...) \
QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_FWOL, params)
#define fwol_nofl_warn(params...) \
QDF_TRACE_WARN_NO_FL(QDF_MODULE_ID_FWOL, params)
#define fwol_nofl_info(params...) \
QDF_TRACE_INFO_NO_FL(QDF_MODULE_ID_FWOL, params)
#define fwol_nofl_debug(params...) \
QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_FWOL, params)
/**
* enum wlan_fwol_southbound_event - fw offload south bound event type
* @WLAN_FWOL_EVT_GET_ELNA_BYPASS_RESPONSE: get eLNA bypass response
* @WLAN_FWOL_EVT_GET_THERMAL_STATS_RESPONSE: get Thermal Stats response
*/
enum wlan_fwol_southbound_event {
WLAN_FWOL_EVT_INVALID = 0,
WLAN_FWOL_EVT_GET_ELNA_BYPASS_RESPONSE,
WLAN_FWOL_EVT_GET_THERMAL_STATS_RESPONSE,
WLAN_FWOL_EVT_LAST,
WLAN_FWOL_EVT_MAX = WLAN_FWOL_EVT_LAST - 1
};
/**
* struct wlan_fwol_coex_config - BTC config items
* @btc_mode: Config BTC mode
* @antenna_isolation: Antenna isolation
* @max_tx_power_for_btc: Max wlan tx power in co-ex scenario
* @wlan_low_rssi_threshold: Wlan low rssi threshold for BTC mode switching
* @bt_low_rssi_threshold: BT low rssi threshold for BTC mode switching
* @bt_interference_low_ll: Lower limit of low level BT interference
* @bt_interference_low_ul: Upper limit of low level BT interference
* @bt_interference_medium_ll: Lower limit of medium level BT interference
* @bt_interference_medium_ul: Upper limit of medium level BT interference
* @bt_interference_high_ll: Lower limit of high level BT interference
* @bt_interference_high_ul: Upper limit of high level BT interference
* @btc_mpta_helper_enable: Enable/Disable tri-radio MPTA helper
* @bt_sco_allow_wlan_2g_scan: Enable/Disble wlan 2g scan when
* BT SCO connection is on
* @btc_three_way_coex_config_legacy_enable: Enable/Disable tri-radio coex
* config legacy feature
* @ble_scan_coex_policy: BLE Scan policy, true - better BLE scan result, false
* better wlan throughput
*/
struct wlan_fwol_coex_config {
uint8_t btc_mode;
uint8_t antenna_isolation;
uint8_t max_tx_power_for_btc;
int16_t wlan_low_rssi_threshold;
int16_t bt_low_rssi_threshold;
int16_t bt_interference_low_ll;
int16_t bt_interference_low_ul;
int16_t bt_interference_medium_ll;
int16_t bt_interference_medium_ul;
int16_t bt_interference_high_ll;
int16_t bt_interference_high_ul;
#ifdef FEATURE_MPTA_HELPER
bool btc_mpta_helper_enable;
#endif
bool bt_sco_allow_wlan_2g_scan;
#ifdef FEATURE_COEX_CONFIG
bool btc_three_way_coex_config_legacy_enable;
#endif
bool ble_scan_coex_policy;
};
#define FWOL_THERMAL_LEVEL_MAX 4
#define FWOL_THERMAL_THROTTLE_LEVEL_MAX 6
/*
* struct wlan_fwol_thermal_temp - Thermal temperature config items
* @thermal_temp_min_level: Array of temperature minimum levels
* @thermal_temp_max_level: Array of temperature maximum levels
* @thermal_mitigation_enable: Control for Thermal mitigation feature
* @throttle_period: Thermal throttle period value
* @throttle_dutycycle_level: Array of throttle duty cycle levels
* @thermal_sampling_time: sampling time for thermal mitigation in ms
* @mon_id: Monitor client id either the wpps or apps
* @priority_apps: Priority of the apps mitigation to consider by fw
* @priority_wpps: Priority of the wpps mitigation to consider by fw
* @thermal_action: thermal action as defined enum thermal_mgmt_action_code
* @therm_stats_offset: thermal temp offset as set in gThermalStatsTempOffset
*/
struct wlan_fwol_thermal_temp {
bool thermal_mitigation_enable;
uint32_t throttle_period;
uint16_t thermal_temp_min_level[FWOL_THERMAL_LEVEL_MAX];
uint16_t thermal_temp_max_level[FWOL_THERMAL_LEVEL_MAX];
uint32_t throttle_dutycycle_level[FWOL_THERMAL_THROTTLE_LEVEL_MAX];
uint16_t thermal_sampling_time;
uint8_t mon_id;
uint8_t priority_apps;
uint8_t priority_wpps;
enum thermal_mgmt_action_code thermal_action;
#ifdef THERMAL_STATS_SUPPORT
uint8_t therm_stats_offset;
#endif
};
/**
* struct wlan_fwol_ie_whitelist - Probe request IE whitelist config items
* @ie_whitelist: IE whitelist flag
* @ie_bitmap_0: IE bitmap 0
* @ie_bitmap_1: IE bitmap 1
* @ie_bitmap_2: IE bitmap 2
* @ie_bitmap_3: IE bitmap 3
* @ie_bitmap_4: IE bitmap 4
* @ie_bitmap_5: IE bitmap 5
* @ie_bitmap_6: IE bitmap 6
* @ie_bitmap_7: IE bitmap 7
* @no_of_probe_req_ouis: Total number of ouis present in probe req
* @probe_req_voui: Stores oui values after parsing probe req ouis
*/
struct wlan_fwol_ie_whitelist {
bool ie_whitelist;
uint32_t ie_bitmap_0;
uint32_t ie_bitmap_1;
uint32_t ie_bitmap_2;
uint32_t ie_bitmap_3;
uint32_t ie_bitmap_4;
uint32_t ie_bitmap_5;
uint32_t ie_bitmap_6;
uint32_t ie_bitmap_7;
uint32_t no_of_probe_req_ouis;
uint32_t probe_req_voui[MAX_PROBE_REQ_OUIS];
};
/**
* struct wlan_fwol_neighbor_report_cfg - Neighbor report config params
* @enable_bitmask: Neighbor report offload bitmask control
* @params_bitmask: Param validity bitmask
* @time_offset: Neighbor report frame time offset
* @low_rssi_offset: Low RSSI offset
* @bmiss_count_trigger: Beacon miss trigger count
* @per_threshold_offset: PER Threshold offset
* @cache_timeout: Cache timeout
* @max_req_cap: Max request per peer
*/
struct wlan_fwol_neighbor_report_cfg {
uint32_t enable_bitmask;
uint32_t params_bitmask;
uint32_t time_offset;
uint32_t low_rssi_offset;
uint32_t bmiss_count_trigger;
uint32_t per_threshold_offset;
uint32_t cache_timeout;
uint32_t max_req_cap;
};
/**
* struct wlan_fwol_cfg - fwol config items
* @coex_config: coex config items
* @thermal_temp_cfg: Thermal temperature related config items
* @ie_whitelist_cfg: IE Whitelist related config items
* @neighbor_report_cfg: 11K neighbor report config
* @ani_enabled: ANI enable/disable
* @enable_rts_sifsbursting: Enable RTS SIFS Bursting
* @enable_sifs_burst: Enable SIFS burst
* @max_mpdus_inampdu: Max number of MPDUS
* @enable_phy_reg_retention: Enable PHY reg retention
* @upper_brssi_thresh: Upper BRSSI threshold
* @lower_brssi_thresh: Lower BRSSI threshold
* @enable_dtim_1chrx: Enable/disable DTIM 1 CHRX
* @alternative_chainmask_enabled: Alternate chainmask
* @smart_chainmask_enabled: Enable/disable chainmask
* @get_rts_profile: Set the RTS profile
* @enable_fw_log_level: Set the FW log level
* @enable_fw_log_type: Set the FW log type
* @enable_fw_module_log_level: enable fw module log level
* @enable_fw_module_log_level_num: enable fw module log level num
* @enable_fw_mod_wow_log_level: enable fw wow module log level
* @enable_fw_mod_wow_log_level_num: enable fw wow module log level num
* @sap_xlna_bypass: bypass SAP xLNA
* @is_rate_limit_enabled: Enable/disable RA rate limited
* @tsf_gpio_pin: TSF GPIO Pin config
* @tsf_irq_host_gpio_pin: TSF GPIO Pin config
* @tsf_sync_host_gpio_pin: TSF Sync GPIO Pin config
* @tsf_ptp_options: TSF Plus feature options config
* @tsf_sync_enable: TSF sync feature enable/disable
* @sae_enable: SAE feature enable config
* @gcmp_enable: GCMP feature enable config
* @enable_tx_sch_delay: Enable TX SCH delay value config
* @enable_secondary_rate: Enable secondary retry rate config
* @enable_dhcp_server_offload: DHCP Offload is enabled or not
* @dhcp_max_num_clients: Max number of DHCP client supported
* @dwelltime_params: adaptive dwell time parameters
* @enable_ilp: ILP HW block configuration
* @sap_sho: SAP SHO HW offload configuration
* @disable_hw_assist: Flag to configure HW assist feature in FW
*/
struct wlan_fwol_cfg {
/* Add CFG and INI items here */
struct wlan_fwol_coex_config coex_config;
struct wlan_fwol_thermal_temp thermal_temp_cfg;
struct wlan_fwol_ie_whitelist ie_whitelist_cfg;
struct wlan_fwol_neighbor_report_cfg neighbor_report_cfg;
bool ani_enabled;
bool enable_rts_sifsbursting;
uint8_t enable_sifs_burst;
uint8_t max_mpdus_inampdu;
uint8_t enable_phy_reg_retention;
uint16_t upper_brssi_thresh;
uint16_t lower_brssi_thresh;
bool enable_dtim_1chrx;
bool alternative_chainmask_enabled;
bool smart_chainmask_enabled;
uint16_t get_rts_profile;
uint16_t enable_fw_log_level;
uint16_t enable_fw_log_type;
uint8_t enable_fw_module_log_level[FW_MODULE_LOG_LEVEL_STRING_LENGTH];
uint8_t enable_fw_module_log_level_num;
uint8_t enable_fw_mod_wow_log_level[FW_MODULE_LOG_LEVEL_STRING_LENGTH];
uint8_t enable_fw_mod_wow_log_level_num;
bool sap_xlna_bypass;
#ifdef FEATURE_WLAN_RA_FILTERING
bool is_rate_limit_enabled;
#endif
#ifdef WLAN_FEATURE_TSF
uint32_t tsf_gpio_pin;
#ifdef WLAN_FEATURE_TSF_PLUS
uint32_t tsf_ptp_options;
bool tsf_sync_enable;
#ifdef WLAN_FEATURE_TSF_PLUS_EXT_GPIO_IRQ
uint32_t tsf_irq_host_gpio_pin;
#endif
#ifdef WLAN_FEATURE_TSF_PLUS_EXT_GPIO_SYNC
uint32_t tsf_sync_host_gpio_pin;
#endif
#endif
#endif
#ifdef WLAN_FEATURE_SAE
bool sae_enable;
#endif
bool gcmp_enable;
uint8_t enable_tx_sch_delay;
uint32_t enable_secondary_rate;
#ifdef DHCP_SERVER_OFFLOAD
bool enable_dhcp_server_offload;
uint32_t dhcp_max_num_clients;
#endif
struct adaptive_dwelltime_params dwelltime_params;
uint32_t enable_ilp;
uint32_t sap_sho;
bool disable_hw_assist;
};
/**
* struct wlan_fwol_thermal_throttle_info - FW offload thermal throttle info
* @level: thermal throttle level
* @pdev_id: pdev id
*/
struct wlan_fwol_thermal_throttle_info {
enum thermal_throttle_level level;
uint32_t pdev_id;
};
/**
* struct wlan_fwol_capability_info - FW offload capability component
* @fw_thermal_stats_cap: Thermal Stats Fw capability
**/
struct wlan_fwol_capability_info {
#ifdef THERMAL_STATS_SUPPORT
bool fw_thermal_stats_cap;
#endif
};
/**
* struct wlan_fwol_psoc_obj - FW offload psoc priv object
* @cfg: cfg items
* @cbs: callback functions
* @tx_ops: tx operations for target interface
* @rx_ops: rx operations for target interface
* @thermal_throttle: cached target thermal stats information
* @thermal_cbs: thermal notification callbacks to hdd layer
* @capability_info: fwol capability info
*/
struct wlan_fwol_psoc_obj {
struct wlan_fwol_cfg cfg;
struct wlan_fwol_callbacks cbs;
struct wlan_fwol_tx_ops tx_ops;
struct wlan_fwol_rx_ops rx_ops;
#ifdef FW_THERMAL_THROTTLE_SUPPORT
struct wlan_fwol_thermal_throttle_info thermal_throttle;
struct fwol_thermal_callbacks thermal_cbs;
#endif
struct wlan_fwol_capability_info capability_info;
};
/**
* struct wlan_fwol_rx_event - event from south bound
* @psoc: psoc handle
* @event_id: event ID
* @get_elna_bypass_response: get eLNA bypass response
* @get_thermal_stats_response: get thermal stats response
*/
struct wlan_fwol_rx_event {
struct wlan_objmgr_psoc *psoc;
enum wlan_fwol_southbound_event event_id;
union {
#ifdef WLAN_FEATURE_ELNA
struct get_elna_bypass_response get_elna_bypass_response;
#endif
#ifdef THERMAL_STATS_SUPPORT
struct thermal_throttle_info get_thermal_stats_response;
#endif
};
};
/**
* wlan_psoc_get_fwol_obj() - private API to get fwol object from psoc
* @psoc: psoc object
*
* Return: fwol object
*/
struct wlan_fwol_psoc_obj *fwol_get_psoc_obj(struct wlan_objmgr_psoc *psoc);
/*
* fwol_cfg_on_psoc_enable() - Populate FWOL structure from CFG and INI
* @psoc: pointer to the psoc object
*
* Populate the FWOL CFG structure from CFG and INI values using CFG APIs
*
* Return: QDF_STATUS
*/
QDF_STATUS fwol_cfg_on_psoc_enable(struct wlan_objmgr_psoc *psoc);
/*
* fwol_cfg_on_psoc_disable() - Clear the CFG structure on psoc disable
* @psoc: pointer to the psoc object
*
* Clear the FWOL CFG structure on psoc disable
*
* Return: QDF_STATUS
*/
QDF_STATUS fwol_cfg_on_psoc_disable(struct wlan_objmgr_psoc *psoc);
/**
* fwol_process_event() - API to process event from south bound
* @msg: south bound message
*
* Return: QDF_STATUS_SUCCESS on success
*/
QDF_STATUS fwol_process_event(struct scheduler_msg *msg);
/*
* fwol_release_rx_event() - Release fw offload RX event
* @event: fw offload RX event
*
* Return: none
*/
void fwol_release_rx_event(struct wlan_fwol_rx_event *event);
/*
* fwol_init_neighbor_report_cfg() - Populate default neighbor report CFG values
* @psoc: pointer to the psoc object
* @fwol_neighbor_report_cfg: Pointer to Neighbor report config data structure
*
* Return: QDF_STATUS
*/
QDF_STATUS fwol_init_neighbor_report_cfg(struct wlan_objmgr_psoc *psoc,
struct wlan_fwol_neighbor_report_cfg
*fwol_neighbor_report_cfg);
/**
* wlan_fwol_init_adapt_dwelltime_in_cfg - initialize adaptive dwell time params
* @psoc: Pointer to struct wlan_objmgr_psoc context
* @dwelltime_params: Pointer to dwell time params
*
* This function parses initialize the adaptive dwell params from ini.
*
* Return: QDF_STATUS
*/
QDF_STATUS
fwol_init_adapt_dwelltime_in_cfg(
struct wlan_objmgr_psoc *psoc,
struct adaptive_dwelltime_params *dwelltime_params);
/**
* fwol_set_adaptive_dwelltime_config - API to set adaptive dwell params config
*
* @adaptive_dwelltime_params: adaptive_dwelltime_params structure
*
* Return: QDF Status
*/
QDF_STATUS
fwol_set_adaptive_dwelltime_config(
struct adaptive_dwelltime_params *dwelltime_params);
/**
* fwol_set_ilp_config() - API to set ILP HW block config
* @pdev: pointer to the pdev object
* @enable_ilp: ILP HW block configuration with various options
*
* Return: QDF_STATUS
*/
QDF_STATUS fwol_set_ilp_config(struct wlan_objmgr_pdev *pdev,
uint32_t enable_ilp);
/**
* fwol_set_sap_sho() - API to set SAP SHO config
* @psoc: pointer to the psoc object
* @vdev_id: vdev id
* @sap_sho: enable/disable config for SAP SHO
* SHO- SoftAP hardware offload When enabled the beacon/probe resp
* will be offloaded to HW.
*
* Return: QDF_STATUS
*/
QDF_STATUS fwol_set_sap_sho(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
uint32_t sap_sho);
/**
* fwol_configure_hw_assist() - API to configure HW assist feature in FW
* @pdev: pointer to the pdev object
* @disable_he_assist: Flag to enable/disable HW assist feature
*
* Return: QDF_STATUS
*/
QDF_STATUS fwol_configure_hw_assist(struct wlan_objmgr_pdev *pdev,
bool disable_hw_assist);
#endif

View File

@@ -1,843 +0,0 @@
/*
* Copyright (c) 2018-2021 The Linux Foundation. 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.
*/
/**
* DOC: define internal APIs related to the fwol component
*/
#include "wlan_fw_offload_main.h"
#include "cds_api.h"
#include "wma.h"
#include "wlan_fwol_tgt_api.h"
struct wlan_fwol_psoc_obj *fwol_get_psoc_obj(struct wlan_objmgr_psoc *psoc)
{
return wlan_objmgr_psoc_get_comp_private_obj(psoc,
WLAN_UMAC_COMP_FWOL);
}
/**
* fwol_mpta_helper_config_get: Populate btc_mpta_helper_enable from cfg
* @psoc: The global psoc handler
* @coex_config: The cfg structure
*
* Return: none
*/
#ifdef FEATURE_MPTA_HELPER
static void
fwol_mpta_helper_config_get(struct wlan_objmgr_psoc *psoc,
struct wlan_fwol_coex_config *coex_config)
{
coex_config->btc_mpta_helper_enable =
cfg_get(psoc, CFG_COEX_MPTA_HELPER);
}
#else
static void
fwol_mpta_helper_config_get(struct wlan_objmgr_psoc *psoc,
struct wlan_fwol_coex_config *coex_config)
{
}
#endif
/**
* fwol_three_way_coex_config_legacy_config_get: Populate
* btc_three_way_coex_config_legacy_enable from cfg
* @psoc: The global psoc handler
* @coex_config: The cfg structure
*
* Return: none
*/
#ifdef FEATURE_COEX_CONFIG
static void
fwol_three_way_coex_config_legacy_config_get(
struct wlan_objmgr_psoc *psoc,
struct wlan_fwol_coex_config *coex_config)
{
coex_config->btc_three_way_coex_config_legacy_enable =
cfg_get(psoc, CFG_THREE_WAY_COEX_CONFIG_LEGACY);
}
#else
static void
fwol_three_way_coex_config_legacy_config_get(
struct wlan_objmgr_psoc *psoc,
struct wlan_fwol_coex_config *coex_config)
{
}
#endif
static void
fwol_init_coex_config_in_cfg(struct wlan_objmgr_psoc *psoc,
struct wlan_fwol_coex_config *coex_config)
{
coex_config->btc_mode = cfg_get(psoc, CFG_BTC_MODE);
coex_config->antenna_isolation = cfg_get(psoc, CFG_ANTENNA_ISOLATION);
coex_config->max_tx_power_for_btc =
cfg_get(psoc, CFG_MAX_TX_POWER_FOR_BTC);
coex_config->wlan_low_rssi_threshold =
cfg_get(psoc, CFG_WLAN_LOW_RSSI_THRESHOLD);
coex_config->bt_low_rssi_threshold =
cfg_get(psoc, CFG_BT_LOW_RSSI_THRESHOLD);
coex_config->bt_interference_low_ll =
cfg_get(psoc, CFG_BT_INTERFERENCE_LOW_LL);
coex_config->bt_interference_low_ul =
cfg_get(psoc, CFG_BT_INTERFERENCE_LOW_UL);
coex_config->bt_interference_medium_ll =
cfg_get(psoc, CFG_BT_INTERFERENCE_MEDIUM_LL);
coex_config->bt_interference_medium_ul =
cfg_get(psoc, CFG_BT_INTERFERENCE_MEDIUM_UL);
coex_config->bt_interference_high_ll =
cfg_get(psoc, CFG_BT_INTERFERENCE_HIGH_LL);
coex_config->bt_interference_high_ul =
cfg_get(psoc, CFG_BT_INTERFERENCE_HIGH_UL);
fwol_mpta_helper_config_get(psoc, coex_config);
coex_config->bt_sco_allow_wlan_2g_scan =
cfg_get(psoc, CFG_BT_SCO_ALLOW_WLAN_2G_SCAN);
fwol_three_way_coex_config_legacy_config_get(psoc, coex_config);
coex_config->ble_scan_coex_policy = cfg_get(psoc,
CFG_BLE_SCAN_COEX_POLICY);
}
#ifdef THERMAL_STATS_SUPPORT
static void
fwol_init_thermal_stats_in_cfg(struct wlan_objmgr_psoc *psoc,
struct wlan_fwol_thermal_temp *thermal_temp)
{
thermal_temp->therm_stats_offset =
cfg_get(psoc, CFG_THERMAL_STATS_TEMP_OFFSET);
}
#else
static void
fwol_init_thermal_stats_in_cfg(struct wlan_objmgr_psoc *psoc,
struct wlan_fwol_thermal_temp *thermal_temp)
{
}
#endif
static void
fwol_init_thermal_temp_in_cfg(struct wlan_objmgr_psoc *psoc,
struct wlan_fwol_thermal_temp *thermal_temp)
{
thermal_temp->thermal_temp_min_level[0] =
cfg_get(psoc, CFG_THERMAL_TEMP_MIN_LEVEL0);
thermal_temp->thermal_temp_max_level[0] =
cfg_get(psoc, CFG_THERMAL_TEMP_MAX_LEVEL0);
thermal_temp->thermal_temp_min_level[1] =
cfg_get(psoc, CFG_THERMAL_TEMP_MIN_LEVEL1);
thermal_temp->thermal_temp_max_level[1] =
cfg_get(psoc, CFG_THERMAL_TEMP_MAX_LEVEL1);
thermal_temp->thermal_temp_min_level[2] =
cfg_get(psoc, CFG_THERMAL_TEMP_MIN_LEVEL2);
thermal_temp->thermal_temp_max_level[2] =
cfg_get(psoc, CFG_THERMAL_TEMP_MAX_LEVEL2);
thermal_temp->thermal_temp_min_level[3] =
cfg_get(psoc, CFG_THERMAL_TEMP_MIN_LEVEL3);
thermal_temp->thermal_temp_max_level[3] =
cfg_get(psoc, CFG_THERMAL_TEMP_MAX_LEVEL3);
thermal_temp->thermal_mitigation_enable =
cfg_get(psoc, CFG_THERMAL_MITIGATION_ENABLE);
thermal_temp->throttle_period = cfg_get(psoc, CFG_THROTTLE_PERIOD);
thermal_temp->thermal_sampling_time =
cfg_get(psoc, CFG_THERMAL_SAMPLING_TIME);
thermal_temp->throttle_dutycycle_level[0] =
cfg_get(psoc, CFG_THROTTLE_DUTY_CYCLE_LEVEL0);
thermal_temp->throttle_dutycycle_level[1] =
cfg_get(psoc, CFG_THROTTLE_DUTY_CYCLE_LEVEL1);
thermal_temp->throttle_dutycycle_level[2] =
cfg_get(psoc, CFG_THROTTLE_DUTY_CYCLE_LEVEL2);
thermal_temp->throttle_dutycycle_level[3] =
cfg_get(psoc, CFG_THROTTLE_DUTY_CYCLE_LEVEL3);
thermal_temp->throttle_dutycycle_level[4] =
cfg_get(psoc, CFG_THROTTLE_DUTY_CYCLE_LEVEL4);
thermal_temp->throttle_dutycycle_level[5] =
cfg_get(psoc, CFG_THROTTLE_DUTY_CYCLE_LEVEL5);
thermal_temp->priority_apps =
cfg_get(psoc, CFG_THERMAL_APPS_PRIORITY);
thermal_temp->priority_wpps =
cfg_get(psoc, CFG_THERMAL_WPPS_PRIOITY);
thermal_temp->thermal_action =
cfg_get(psoc, CFG_THERMAL_MGMT_ACTION);
fwol_init_thermal_stats_in_cfg(psoc, thermal_temp);
}
/**
* fwol_set_neighbor_report_offload_params: set neighbor report parameters
* for rso user config
* @psoc: The global psoc handler
* @fwol_neighbor_report_cfg: neighbor report config params
*
* Return: none
*/
static void
fwol_set_neighbor_report_offload_params(
struct wlan_objmgr_psoc *psoc,
struct wlan_fwol_neighbor_report_cfg *fwol_neighbor_report_cfg)
{
struct cm_roam_neighbor_report_offload_params *neighbor_report_offload;
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj) {
fwol_err("Failed to get MLME Obj");
return;
}
neighbor_report_offload = &mlme_obj->cfg.lfr.rso_user_config
.neighbor_report_offload;
neighbor_report_offload->offload_11k_enable_bitmask =
fwol_neighbor_report_cfg->enable_bitmask;
neighbor_report_offload->params_bitmask =
fwol_neighbor_report_cfg->params_bitmask;
neighbor_report_offload->time_offset =
fwol_neighbor_report_cfg->time_offset;
neighbor_report_offload->low_rssi_offset =
fwol_neighbor_report_cfg->low_rssi_offset;
neighbor_report_offload->bmiss_count_trigger =
fwol_neighbor_report_cfg->bmiss_count_trigger;
neighbor_report_offload->per_threshold_offset =
fwol_neighbor_report_cfg->per_threshold_offset;
neighbor_report_offload->neighbor_report_cache_timeout =
fwol_neighbor_report_cfg->cache_timeout;
neighbor_report_offload->max_neighbor_report_req_cap =
fwol_neighbor_report_cfg->max_req_cap;
}
QDF_STATUS fwol_init_neighbor_report_cfg(struct wlan_objmgr_psoc *psoc,
struct wlan_fwol_neighbor_report_cfg
*fwol_neighbor_report_cfg)
{
if (!fwol_neighbor_report_cfg) {
fwol_err("Neighbor report config pointer null");
return QDF_STATUS_E_FAILURE;
}
fwol_neighbor_report_cfg->enable_bitmask =
cfg_get(psoc, CFG_OFFLOAD_11K_ENABLE_BITMASK);
fwol_neighbor_report_cfg->params_bitmask =
cfg_get(psoc, CFG_OFFLOAD_NEIGHBOR_REPORT_PARAMS_BITMASK);
fwol_neighbor_report_cfg->time_offset =
cfg_get(psoc, CFG_OFFLOAD_NEIGHBOR_REPORT_TIME_OFFSET);
fwol_neighbor_report_cfg->low_rssi_offset =
cfg_get(psoc, CFG_OFFLOAD_NEIGHBOR_REPORT_LOW_RSSI_OFFSET);
fwol_neighbor_report_cfg->bmiss_count_trigger =
cfg_get(psoc, CFG_OFFLOAD_NEIGHBOR_REPORT_BMISS_COUNT_TRIGGER);
fwol_neighbor_report_cfg->per_threshold_offset =
cfg_get(psoc, CFG_OFFLOAD_NEIGHBOR_REPORT_PER_THRESHOLD_OFFSET);
fwol_neighbor_report_cfg->cache_timeout =
cfg_get(psoc, CFG_OFFLOAD_NEIGHBOR_REPORT_CACHE_TIMEOUT);
fwol_neighbor_report_cfg->max_req_cap =
cfg_get(psoc, CFG_OFFLOAD_NEIGHBOR_REPORT_MAX_REQ_CAP);
fwol_set_neighbor_report_offload_params(psoc, fwol_neighbor_report_cfg);
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
fwol_init_adapt_dwelltime_in_cfg(
struct wlan_objmgr_psoc *psoc,
struct adaptive_dwelltime_params *dwelltime_params)
{
if (!dwelltime_params) {
fwol_err("dwelltime params config pointer null");
return QDF_STATUS_E_FAILURE;
}
dwelltime_params->is_enabled =
cfg_get(psoc, CFG_ADAPTIVE_DWELL_MODE_ENABLED);
dwelltime_params->dwelltime_mode =
cfg_get(psoc, CFG_GLOBAL_ADAPTIVE_DWELL_MODE);
dwelltime_params->lpf_weight =
cfg_get(psoc, CFG_ADAPT_DWELL_LPF_WEIGHT);
dwelltime_params->passive_mon_intval =
cfg_get(psoc, CFG_ADAPT_DWELL_PASMON_INTVAL);
dwelltime_params->wifi_act_threshold =
cfg_get(psoc, CFG_ADAPT_DWELL_WIFI_THRESH);
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
fwol_set_adaptive_dwelltime_config(
struct adaptive_dwelltime_params *dwelltime_params)
{
tp_wma_handle wma_handle;
QDF_STATUS status;
wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
if (!wma_handle)
return QDF_STATUS_E_FAILURE;
status = wma_send_adapt_dwelltime_params(wma_handle,
dwelltime_params);
return status;
}
/**
* fwol_parse_probe_req_ouis - form ouis from ini gProbeReqOUIs
* @psoc: Pointer to struct wlan_objmgr_psoc context
* @whitelist: Pointer to struct wlan_fwol_ie_whitelist
*
* This function parses the ini string gProbeReqOUIs which needs be to in the
* following format:
* "<8 characters of [0-9] or [A-F]>space<8 characters from [0-9] etc.,"
* example: "AABBCCDD 1122EEFF"
* and the logic counts the number of OUIS and allocates the memory
* for every valid OUI and is stored in struct hdd_context
*
* Return: None
*/
static void fwol_parse_probe_req_ouis(struct wlan_objmgr_psoc *psoc,
struct wlan_fwol_ie_whitelist *whitelist)
{
uint8_t probe_req_ouis[MAX_PRB_REQ_VENDOR_OUI_INI_LEN] = {0};
uint32_t *voui = whitelist->probe_req_voui;
char *str;
uint8_t *token;
uint32_t oui_indx = 0;
int ret;
uint32_t hex_value;
qdf_str_lcopy(probe_req_ouis, cfg_get(psoc, CFG_PROBE_REQ_OUI),
MAX_PRB_REQ_VENDOR_OUI_INI_LEN);
str = probe_req_ouis;
whitelist->no_of_probe_req_ouis = 0;
if (!qdf_str_len(str)) {
fwol_debug("NO OUIs to parse");
return;
}
token = strsep(&str, " ");
while (token) {
if (qdf_str_len(token) != 8)
goto next_token;
ret = qdf_kstrtouint(token, 16, &hex_value);
if (ret)
goto next_token;
voui[oui_indx++] = cpu_to_be32(hex_value);
if (oui_indx >= MAX_PROBE_REQ_OUIS)
break;
next_token:
token = strsep(&str, " ");
}
if (!oui_indx) {
whitelist->ie_whitelist = false;
return;
}
whitelist->no_of_probe_req_ouis = oui_indx;
}
/**
* fwol_validate_ie_bitmaps() - Validate all IE whitelist bitmap param values
* @psoc: Pointer to struct wlan_objmgr_psoc
* @whitelist: Pointer to struct wlan_fwol_ie_whitelist
*
* Return: True if all bitmap values are valid, else false
*/
static bool fwol_validate_ie_bitmaps(struct wlan_objmgr_psoc *psoc,
struct wlan_fwol_ie_whitelist *whitelist)
{
if (!(whitelist->ie_bitmap_0 || whitelist->ie_bitmap_1 ||
whitelist->ie_bitmap_2 || whitelist->ie_bitmap_3 ||
whitelist->ie_bitmap_4 || whitelist->ie_bitmap_5 ||
whitelist->ie_bitmap_6 || whitelist->ie_bitmap_7))
return false;
/*
* check whether vendor oui IE is set and OUIs are present, each OUI
* is entered in the form of string of 8 characters from ini, therefore,
* for atleast one OUI, minimum length is 8 and hence this string length
* is checked for minimum of 8
*/
if ((whitelist->ie_bitmap_6 & VENDOR_SPECIFIC_IE_BITMAP) &&
(qdf_str_len(cfg_get(psoc, CFG_PROBE_REQ_OUI)) < 8))
return false;
/* check whether vendor oui IE is not set but OUIs are present */
if (!(whitelist->ie_bitmap_6 & VENDOR_SPECIFIC_IE_BITMAP) &&
(qdf_str_len(cfg_get(psoc, CFG_PROBE_REQ_OUI)) > 0))
return false;
return true;
}
static void
fwol_init_ie_whiltelist_in_cfg(struct wlan_objmgr_psoc *psoc,
struct wlan_fwol_ie_whitelist *whitelist)
{
whitelist->ie_whitelist = cfg_get(psoc, CFG_PROBE_REQ_IE_WHITELIST);
whitelist->ie_bitmap_0 = cfg_get(psoc, CFG_PROBE_REQ_IE_BIT_MAP0);
whitelist->ie_bitmap_1 = cfg_get(psoc, CFG_PROBE_REQ_IE_BIT_MAP1);
whitelist->ie_bitmap_2 = cfg_get(psoc, CFG_PROBE_REQ_IE_BIT_MAP2);
whitelist->ie_bitmap_3 = cfg_get(psoc, CFG_PROBE_REQ_IE_BIT_MAP3);
whitelist->ie_bitmap_4 = cfg_get(psoc, CFG_PROBE_REQ_IE_BIT_MAP4);
whitelist->ie_bitmap_5 = cfg_get(psoc, CFG_PROBE_REQ_IE_BIT_MAP5);
whitelist->ie_bitmap_6 = cfg_get(psoc, CFG_PROBE_REQ_IE_BIT_MAP6);
whitelist->ie_bitmap_7 = cfg_get(psoc, CFG_PROBE_REQ_IE_BIT_MAP7);
if (!fwol_validate_ie_bitmaps(psoc, whitelist))
whitelist->ie_whitelist = false;
fwol_parse_probe_req_ouis(psoc, whitelist);
}
/**
* ucfg_fwol_fetch_dhcp_server_settings: Populate the enable_dhcp_server_offload
* and dhcp_max_num_clients from cfg
* @psoc: The global psoc handler
* @fwol_cfg: The cfg structure
*
* Return: none
*/
#ifdef DHCP_SERVER_OFFLOAD
static void ucfg_fwol_fetch_dhcp_server_settings(struct wlan_objmgr_psoc *psoc,
struct wlan_fwol_cfg *fwol_cfg)
{
fwol_cfg->enable_dhcp_server_offload =
cfg_get(psoc, CFG_DHCP_SERVER_OFFLOAD_SUPPORT);
fwol_cfg->dhcp_max_num_clients =
cfg_get(psoc, CFG_DHCP_SERVER_OFFLOAD_NUM_CLIENT);
}
#else
static void ucfg_fwol_fetch_dhcp_server_settings(struct wlan_objmgr_psoc *psoc,
struct wlan_fwol_cfg *fwol_cfg)
{
}
#endif
/**
* ucfg_fwol_fetch_tsf_gpio_pin: Populate the tsf_gpio_pin from cfg
* @psoc: The global psoc handler
* @fwol_cfg: The cfg structure
*
* Return: none
*/
#ifdef WLAN_FEATURE_TSF
static void ucfg_fwol_fetch_tsf_gpio_pin(struct wlan_objmgr_psoc *psoc,
struct wlan_fwol_cfg *fwol_cfg)
{
fwol_cfg->tsf_gpio_pin = cfg_get(psoc, CFG_SET_TSF_GPIO_PIN);
}
#else
static void ucfg_fwol_fetch_tsf_gpio_pin(struct wlan_objmgr_psoc *psoc,
struct wlan_fwol_cfg *fwol_cfg)
{
}
#endif
/**
* ucfg_fwol_init_tsf_ptp_options: Populate the tsf_ptp_options from cfg
* @psoc: The global psoc handler
* @fwol_cfg: The cfg structure
*
* Return: none
*/
#if defined(WLAN_FEATURE_TSF) && defined(WLAN_FEATURE_TSF_PLUS)
static void ucfg_fwol_init_tsf_ptp_options(struct wlan_objmgr_psoc *psoc,
struct wlan_fwol_cfg *fwol_cfg)
{
fwol_cfg->tsf_ptp_options = cfg_get(psoc, CFG_SET_TSF_PTP_OPT);
fwol_cfg->tsf_sync_enable = cfg_get(psoc, CFG_TSF_SYNC_ENABLE);
}
#else
static void ucfg_fwol_init_tsf_ptp_options(struct wlan_objmgr_psoc *psoc,
struct wlan_fwol_cfg *fwol_cfg)
{
}
#endif
#ifdef WLAN_FEATURE_TSF_PLUS_EXT_GPIO_IRQ
/**
* ucfg_fwol_fetch_tsf_irq_host_gpio_pin: Populate the
* tsf_irq_host_gpio_pin from cfg
* @psoc: The global psoc handler
* @fwol_cfg: The cfg structure
*
* This function is used to populate the cfg value of host platform
* gpio pin configured to receive tsf interrupt from fw.
*
* Return: none
*/
static void
ucfg_fwol_fetch_tsf_irq_host_gpio_pin(struct wlan_objmgr_psoc *psoc,
struct wlan_fwol_cfg *fwol_cfg)
{
fwol_cfg->tsf_irq_host_gpio_pin =
cfg_get(psoc, CFG_SET_TSF_IRQ_HOST_GPIO_PIN);
}
#else
static void
ucfg_fwol_fetch_tsf_irq_host_gpio_pin(struct wlan_objmgr_psoc *psoc,
struct wlan_fwol_cfg *fwol_cfg)
{
}
#endif
#ifdef WLAN_FEATURE_TSF_PLUS_EXT_GPIO_SYNC
/**
* ucfg_fwol_fetch_tsf_sync_host_gpio_pin: Populate the
* tsf_sync_host_gpio_pin from cfg
* @psoc: The global psoc handler
* @fwol_cfg: The cfg structure
*
* This function is used to populate the cfg value of host platform
* gpio pin configured to drive tsf sync interrupt pin on wlan chip.
*
* Return: none
*/
static void
ucfg_fwol_fetch_tsf_sync_host_gpio_pin(struct wlan_objmgr_psoc *psoc,
struct wlan_fwol_cfg *fwol_cfg)
{
fwol_cfg->tsf_sync_host_gpio_pin =
cfg_get(psoc, CFG_SET_TSF_SYNC_HOST_GPIO_PIN);
}
#else
static void
ucfg_fwol_fetch_tsf_sync_host_gpio_pin(struct wlan_objmgr_psoc *psoc,
struct wlan_fwol_cfg *fwol_cfg)
{
}
#endif
/**
* ucfg_fwol_init_sae_cfg: Populate the sae control config from cfg
* @psoc: The global psoc handler
* @fwol_cfg: The cfg structure
*
* Return: none
*/
#ifdef WLAN_FEATURE_SAE
static void ucfg_fwol_init_sae_cfg(struct wlan_objmgr_psoc *psoc,
struct wlan_fwol_cfg *fwol_cfg)
{
fwol_cfg->sae_enable = cfg_get(psoc, CFG_IS_SAE_ENABLED);
}
#else
static void ucfg_fwol_init_sae_cfg(struct wlan_objmgr_psoc *psoc,
struct wlan_fwol_cfg *fwol_cfg)
{
}
#endif
/**
* ucfg_fwol_fetch_ra_filter: Populate the RA filter enabled or not from cfg
* @psoc: The global psoc handler
* @fwol_cfg: The cfg structure
*
* Return: none
*/
#ifdef FEATURE_WLAN_RA_FILTERING
static void ucfg_fwol_fetch_ra_filter(struct wlan_objmgr_psoc *psoc,
struct wlan_fwol_cfg *fwol_cfg)
{
fwol_cfg->is_rate_limit_enabled = cfg_get(psoc, CFG_RA_FILTER_ENABLE);
}
#else
static void ucfg_fwol_fetch_ra_filter(struct wlan_objmgr_psoc *psoc,
struct wlan_fwol_cfg *fwol_cfg)
{
}
#endif
#ifdef FW_THERMAL_THROTTLE_SUPPORT
static void fwol_thermal_init(struct wlan_fwol_psoc_obj *fwol_obj)
{
fwol_obj->thermal_throttle.level = THERMAL_FULLPERF;
fwol_obj->thermal_throttle.pdev_id = WLAN_INVALID_PDEV_ID;
}
#else
static void fwol_thermal_init(struct wlan_fwol_psoc_obj *fwol_obj)
{
}
#endif
QDF_STATUS fwol_cfg_on_psoc_enable(struct wlan_objmgr_psoc *psoc)
{
QDF_STATUS status = QDF_STATUS_SUCCESS;
struct wlan_fwol_psoc_obj *fwol_obj;
struct wlan_fwol_cfg *fwol_cfg;
qdf_size_t enable_fw_module_log_level_num;
qdf_size_t enable_fw_wow_mod_log_level_num;
fwol_obj = fwol_get_psoc_obj(psoc);
if (!fwol_obj) {
fwol_err("Failed to get FWOL Obj");
return QDF_STATUS_E_FAILURE;
}
fwol_cfg = &fwol_obj->cfg;
fwol_init_coex_config_in_cfg(psoc, &fwol_cfg->coex_config);
fwol_init_thermal_temp_in_cfg(psoc, &fwol_cfg->thermal_temp_cfg);
fwol_init_ie_whiltelist_in_cfg(psoc, &fwol_cfg->ie_whitelist_cfg);
fwol_init_neighbor_report_cfg(psoc, &fwol_cfg->neighbor_report_cfg);
fwol_cfg->ani_enabled = cfg_get(psoc, CFG_ENABLE_ANI);
fwol_cfg->enable_rts_sifsbursting =
cfg_get(psoc, CFG_SET_RTS_FOR_SIFS_BURSTING);
fwol_cfg->enable_sifs_burst = cfg_get(psoc, CFG_SET_SIFS_BURST);
fwol_cfg->max_mpdus_inampdu = cfg_get(psoc, CFG_MAX_MPDUS_IN_AMPDU);
fwol_cfg->enable_phy_reg_retention = cfg_get(psoc, CFG_ENABLE_PHY_REG);
fwol_cfg->upper_brssi_thresh = cfg_get(psoc, CFG_UPPER_BRSSI_THRESH);
fwol_cfg->lower_brssi_thresh = cfg_get(psoc, CFG_LOWER_BRSSI_THRESH);
fwol_cfg->enable_dtim_1chrx = cfg_get(psoc, CFG_DTIM_1CHRX_ENABLE);
fwol_cfg->alternative_chainmask_enabled =
cfg_get(psoc, CFG_ENABLE_COEX_ALT_CHAINMASK);
fwol_cfg->smart_chainmask_enabled =
cfg_get(psoc, CFG_ENABLE_SMART_CHAINMASK);
fwol_cfg->get_rts_profile = cfg_get(psoc, CFG_ENABLE_FW_RTS_PROFILE);
fwol_cfg->enable_fw_log_level =
cfg_get(psoc, CFG_ENABLE_FW_DEBUG_LOG_LEVEL);
fwol_cfg->enable_fw_log_type = cfg_get(psoc, CFG_ENABLE_FW_LOG_TYPE);
qdf_uint8_array_parse(cfg_get(psoc, CFG_ENABLE_FW_MODULE_LOG_LEVEL),
fwol_cfg->enable_fw_module_log_level,
FW_MODULE_LOG_LEVEL_STRING_LENGTH,
&enable_fw_module_log_level_num);
fwol_cfg->enable_fw_module_log_level_num =
(uint8_t)enable_fw_module_log_level_num;
qdf_uint8_array_parse(cfg_get(psoc, CFG_ENABLE_FW_WOW_MODULE_LOG_LEVEL),
fwol_cfg->enable_fw_mod_wow_log_level,
FW_MODULE_LOG_LEVEL_STRING_LENGTH,
&enable_fw_wow_mod_log_level_num);
fwol_cfg->enable_fw_mod_wow_log_level_num =
(uint8_t)enable_fw_wow_mod_log_level_num;
ucfg_fwol_init_tsf_ptp_options(psoc, fwol_cfg);
ucfg_fwol_init_sae_cfg(psoc, fwol_cfg);
fwol_cfg->gcmp_enable = cfg_get(psoc, CFG_ENABLE_GCMP);
fwol_cfg->enable_tx_sch_delay = cfg_get(psoc, CFG_TX_SCH_DELAY);
fwol_cfg->enable_secondary_rate = cfg_get(psoc,
CFG_ENABLE_SECONDARY_RATE);
fwol_init_adapt_dwelltime_in_cfg(psoc, &fwol_cfg->dwelltime_params);
ucfg_fwol_fetch_ra_filter(psoc, fwol_cfg);
ucfg_fwol_fetch_tsf_gpio_pin(psoc, fwol_cfg);
ucfg_fwol_fetch_tsf_irq_host_gpio_pin(psoc, fwol_cfg);
ucfg_fwol_fetch_tsf_sync_host_gpio_pin(psoc, fwol_cfg);
ucfg_fwol_fetch_dhcp_server_settings(psoc, fwol_cfg);
fwol_cfg->sap_xlna_bypass = cfg_get(psoc, CFG_SET_SAP_XLNA_BYPASS);
fwol_cfg->enable_ilp = cfg_get(psoc, CFG_SET_ENABLE_ILP);
fwol_cfg->sap_sho = cfg_get(psoc, CFG_SAP_SHO_CONFIG);
fwol_cfg->disable_hw_assist = cfg_get(psoc, CFG_DISABLE_HW_ASSIST);
fwol_thermal_init(fwol_obj);
return status;
}
QDF_STATUS fwol_cfg_on_psoc_disable(struct wlan_objmgr_psoc *psoc)
{
/* Clear the CFG structure */
return QDF_STATUS_SUCCESS;
}
#ifdef WLAN_FEATURE_ELNA
/**
* fwol_process_get_elna_bypass_resp() - Process get eLNA bypass response
* @event: response event
*
* Return: QDF_STATUS_SUCCESS on success
*/
static QDF_STATUS
fwol_process_get_elna_bypass_resp(struct wlan_fwol_rx_event *event)
{
QDF_STATUS status = QDF_STATUS_SUCCESS;
struct wlan_objmgr_psoc *psoc;
struct wlan_fwol_psoc_obj *fwol_obj;
struct wlan_fwol_callbacks *cbs;
struct get_elna_bypass_response *resp;
if (!event) {
fwol_err("Event buffer is NULL");
return QDF_STATUS_E_FAILURE;
}
psoc = event->psoc;
if (!psoc) {
fwol_err("psoc is NULL");
return QDF_STATUS_E_INVAL;
}
fwol_obj = fwol_get_psoc_obj(psoc);
if (!fwol_obj) {
fwol_err("Failed to get FWOL Obj");
return QDF_STATUS_E_INVAL;
}
cbs = &fwol_obj->cbs;
if (cbs->get_elna_bypass_callback) {
resp = &event->get_elna_bypass_response;
cbs->get_elna_bypass_callback(cbs->get_elna_bypass_context,
resp);
} else {
fwol_err("NULL pointer for callback");
status = QDF_STATUS_E_IO;
}
return status;
}
#else
static QDF_STATUS
fwol_process_get_elna_bypass_resp(struct wlan_fwol_rx_event *event)
{
return QDF_STATUS_SUCCESS;
}
#endif /* WLAN_FEATURE_ELNA */
#ifdef THERMAL_STATS_SUPPORT
/**
* fwol_process_get_thermal_stats_resp() - Process get thermal stats response
* @event: response event
*
* Return: QDF_STATUS_SUCCESS on success
*/
static QDF_STATUS
fwol_process_get_thermal_stats_resp(struct wlan_fwol_rx_event *event)
{
QDF_STATUS status = QDF_STATUS_SUCCESS;
struct wlan_objmgr_psoc *psoc;
struct wlan_fwol_psoc_obj *fwol_obj;
struct wlan_fwol_callbacks *cbs;
struct thermal_throttle_info *resp;
if (!event) {
fwol_err("Event buffer is NULL");
return QDF_STATUS_E_FAILURE;
}
psoc = event->psoc;
if (!psoc) {
fwol_err("psoc is NULL");
return QDF_STATUS_E_INVAL;
}
fwol_obj = fwol_get_psoc_obj(psoc);
if (!fwol_obj) {
fwol_err("Failed to get FWOL Obj");
return QDF_STATUS_E_INVAL;
}
cbs = &fwol_obj->cbs;
if (cbs && cbs->get_thermal_stats_callback) {
resp = &event->get_thermal_stats_response;
cbs->get_thermal_stats_callback(cbs->get_thermal_stats_context,
resp);
} else {
fwol_err("NULL pointer for callback");
status = QDF_STATUS_E_IO;
}
return status;
}
#else
static QDF_STATUS
fwol_process_get_thermal_stats_resp(struct wlan_fwol_rx_event *event)
{
return QDF_STATUS_E_NOSUPPORT;
}
#endif /* THERMAL_STATS_SUPPORT */
QDF_STATUS fwol_process_event(struct scheduler_msg *msg)
{
QDF_STATUS status;
struct wlan_fwol_rx_event *event;
fwol_debug("msg type %d", msg->type);
if (!(msg->bodyptr)) {
fwol_err("Invalid message body");
return QDF_STATUS_E_INVAL;
}
event = msg->bodyptr;
msg->bodyptr = NULL;
switch (msg->type) {
case WLAN_FWOL_EVT_GET_ELNA_BYPASS_RESPONSE:
status = fwol_process_get_elna_bypass_resp(event);
break;
case WLAN_FWOL_EVT_GET_THERMAL_STATS_RESPONSE:
status = fwol_process_get_thermal_stats_resp(event);
break;
default:
status = QDF_STATUS_E_INVAL;
break;
}
fwol_release_rx_event(event);
return status;
}
void fwol_release_rx_event(struct wlan_fwol_rx_event *event)
{
if (!event) {
fwol_err("event is NULL");
return;
}
if (event->psoc)
wlan_objmgr_psoc_release_ref(event->psoc, WLAN_FWOL_SB_ID);
qdf_mem_free(event);
}
QDF_STATUS fwol_set_ilp_config(struct wlan_objmgr_pdev *pdev,
uint32_t enable_ilp)
{
QDF_STATUS status;
struct pdev_params pdev_param;
pdev_param.param_id = WMI_PDEV_PARAM_PCIE_HW_ILP;
pdev_param.param_value = enable_ilp;
status = tgt_fwol_pdev_param_send(pdev, pdev_param);
if (QDF_IS_STATUS_ERROR(status))
fwol_err("WMI_PDEV_PARAM_PCIE_HW_ILP failed %d", status);
return status;
}
QDF_STATUS fwol_set_sap_sho(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
uint32_t sap_sho)
{
QDF_STATUS status;
struct vdev_set_params vdev_param;
vdev_param.vdev_id = vdev_id;
vdev_param.param_id = WMI_VDEV_PARAM_SHO_CONFIG;
vdev_param.param_value = sap_sho;
status = tgt_fwol_vdev_param_send(psoc, vdev_param);
if (QDF_IS_STATUS_ERROR(status))
fwol_err("WMI_VDEV_PARAM_SHO_CONFIG failed %d", status);
return status;
}
QDF_STATUS fwol_configure_hw_assist(struct wlan_objmgr_pdev *pdev,
bool disable_hw_assist)
{
QDF_STATUS status;
struct pdev_params pdev_param;
pdev_param.param_id = WMI_PDEV_PARAM_DISABLE_HW_ASSIST;
pdev_param.param_value = disable_hw_assist;
status = tgt_fwol_pdev_param_send(pdev, pdev_param);
if (QDF_IS_STATUS_ERROR(status))
fwol_err("WMI_PDEV_PARAM_DISABLE_HW_ASSIST failed %d", status);
return status;
}

View File

@@ -1,160 +0,0 @@
/*
* Copyright (c) 2012-2019 The Linux Foundation. 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.
*/
/**
* DOC: This file contains adaptive dwell components.
*/
#ifndef __CFG_ADAPTIVE_DWELLTIME_H
#define __CFG_ADAPTIVE_DWELLTIME_H
/*
* <ini>
* adaptive_dwell_mode_enabled - enable/disable the adaptive dwell config.
* @Min: 0
* @Max: 1
* @Default: 1
*
*
* This ini will globally disable/enable the adaptive dwell config.
* Following parameters will set different values of attributes for dwell
* time optimization thus reducing total scan time.
* Acceptable values for this:
* 0: Config is disabled
* 1: Config is enabled
*
* Related: None.
*
* Supported Feature: Scan
*
* Usage: External
*
* </ini>
*/
#define CFG_ADAPTIVE_DWELL_MODE_ENABLED CFG_INI_BOOL(\
"adaptive_dwell_mode_enabled",\
1, \
"enable the adaptive dwell config")
/*
* <ini>
* global_adapt_dwelltime_mode - set default adaptive mode.
* @Min: 0
* @Max: 4
* @Default: 0
*
* This ini will set default adaptive mode, will be used if any of the
* scan dwell mode is set to default.
* For uses : see enum scan_dwelltime_adaptive_mode
*
* Related: None.
*
* Supported Feature: Scan
*
* Usage: External
*
* </ini>
*/
#define CFG_GLOBAL_ADAPTIVE_DWELL_MODE CFG_INI_UINT(\
"global_adapt_dwelltime_mode",\
0, 4, 0,\
CFG_VALUE_OR_DEFAULT, \
"set default adaptive mode")
/*
* <ini>
* adapt_dwell_lpf_weight - weight to caclulate avg low pass filter.
* @Min: 0
* @Max: 100
* @Default: 80
*
* This ini is used to set the weight to calculate
* the average low pass filter for channel congestion.
* Acceptable values for this: 0-100 (In %)
*
* Related: None.
*
* Supported Feature: Scan
*
* Usage: External
*
* </ini>
*/
#define CFG_ADAPT_DWELL_LPF_WEIGHT CFG_INI_UINT(\
"adapt_dwell_lpf_weight",\
0, 100, 80,\
CFG_VALUE_OR_DEFAULT, \
"weight to calc avg low pass filter")
/*
* <ini>
* adapt_dwell_passive_mon_intval - Interval to monitor passive scan in msec.
* @Min: 0
* @Max: 25
* @Default: 10
*
* This ini is used to set interval to monitor wifi
* activity in passive scan in milliseconds.
*
* Related: None.
*
* Supported Feature: Scan
*
* Usage: External
*
* </ini>
*/
#define CFG_ADAPT_DWELL_PASMON_INTVAL CFG_INI_UINT(\
"adapt_dwell_passive_mon_intval",\
0, 25, 10,\
CFG_VALUE_OR_DEFAULT, \
"interval to monitor passive scan")
/*
* <ini>
* adapt_dwell_wifi_act_threshold - % of wifi activity used in passive scan
* @Min: 0
* @Max: 100
* @Default: 10
*
* This ini is used to set % of wifi activity used in passive scan
* Acceptable values for this: 0-100 (in %)
*
* Related: None.
*
* Supported Feature: Scan
*
* Usage: External
*
* </ini>
*/
#define CFG_ADAPT_DWELL_WIFI_THRESH CFG_INI_UINT(\
"adapt_dwell_wifi_act_threshold",\
0, 100, 10,\
CFG_VALUE_OR_DEFAULT, \
"percent of wifi activity in pas scan")
#define CFG_ADAPTIVE_DWELLTIME_ALL \
CFG(CFG_ADAPTIVE_DWELL_MODE_ENABLED) \
CFG(CFG_GLOBAL_ADAPTIVE_DWELL_MODE) \
CFG(CFG_ADAPT_DWELL_LPF_WEIGHT) \
CFG(CFG_ADAPT_DWELL_PASMON_INTVAL) \
CFG(CFG_ADAPT_DWELL_WIFI_THRESH)
#endif

View File

@@ -1,391 +0,0 @@
/*
* Copyright (c) 2012 - 2021 The Linux Foundation. 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.
*/
/**
* DOC: This file contains centralized definitions of converged configuration.
*/
#ifndef __CFG_COEX_H
#define __CFG_COEX_H
/*
* <ini>
* gSetBTCMode - Config BTC mode
* @Min: 0
* @Max: 2
* @Default: 0
*
* 0 - TDD
* 1 - FDD
* 2 - Hybrid
*
* Usage: External
*
* </ini>
*/
#define CFG_BTC_MODE CFG_INI_UINT( \
"gSetBTCMode", \
0, \
2, \
0, \
CFG_VALUE_OR_DEFAULT, \
"BTC mode")
/*
* <ini>
* gSetAntennaIsolation - Set Antenna Isolation
* @Min: 0
* @Max: 255
* @Default: 25
*
* Usage: External
*
* </ini>
*/
#define CFG_ANTENNA_ISOLATION CFG_INI_UINT( \
"gSetAntennaIsolation", \
0, \
255, \
25, \
CFG_VALUE_OR_DEFAULT, \
"Antenna Isolation")
/*
* <ini>
* gSetMaxTxPowerForBTC - Set Max WLAN Tx power in COEX scenario
* @Min: 0
* @Max: 100
* @Default: 100
*
* Usage: External
*
* </ini>
*/
#define CFG_MAX_TX_POWER_FOR_BTC CFG_INI_UINT( \
"gSetMaxTxPowerForBTC", \
0, \
100, \
100, \
CFG_VALUE_OR_DEFAULT, \
"Max Tx Power for BTC")
/*
* <ini>
* gSetWlanLowRssiThreshold - Set WLAN low RSSI threshold for BTC mode switching
* @Min: -100
* @Max: 0
* @Default: -80
*
* Usage: External
*
* </ini>
*/
#define CFG_WLAN_LOW_RSSI_THRESHOLD CFG_INI_INT( \
"gSetWlanLowRssiThreshold", \
-100, \
0, \
-80, \
CFG_VALUE_OR_DEFAULT, \
"WLAN Low RSSI Threshold")
/*
* <ini>
* gSetBtLowRssiThreshold - Set BT low RSSI threshold for BTC mode switching
* @Min: -100
* @Max: 0
* @Default: -80
*
* Usage: External
*
* </ini>
*/
#define CFG_BT_LOW_RSSI_THRESHOLD CFG_INI_INT( \
"gSetBtLowRssiThreshold", \
-100, \
0, \
-80, \
CFG_VALUE_OR_DEFAULT, \
"BT Low RSSI Threshold")
/*
* <ini>
* gSetBtInterferenceLowLL - Set lower limit of low level BT interference
* @Min: -100
* @Max: 100
* @Default: -25
*
* Usage: External
*
* </ini>
*/
#define CFG_BT_INTERFERENCE_LOW_LL CFG_INI_INT( \
"gSetBtInterferenceLowLL", \
-100, \
100, \
-25, \
CFG_VALUE_OR_DEFAULT, \
"BT Interference Low LL")
/*
* <ini>
* gSetBtInterferenceLowUL - Set upper limit of low level BT interference
* @Min: -100
* @Max: 100
* @Default: -21
*
* Usage: External
*
* </ini>
*/
#define CFG_BT_INTERFERENCE_LOW_UL CFG_INI_INT( \
"gSetBtInterferenceLowUL", \
-100, \
100, \
-21, \
CFG_VALUE_OR_DEFAULT, \
"BT Interference Low UL")
/*
* <ini>
* gSetBtInterferenceMediumLL - Set lower limit of medium level BT interference
* @Min: -100
* @Max: 100
* @Default: -20
*
* Usage: External
*
* </ini>
*/
#define CFG_BT_INTERFERENCE_MEDIUM_LL CFG_INI_INT( \
"gSetBtInterferenceMediumLL", \
-100, \
100, \
-20, \
CFG_VALUE_OR_DEFAULT, \
"BT Interference Medium LL")
/*
* <ini>
* gSetBtInterferenceMediumUL - Set upper limit of medium level BT interference
* @Min: -100
* @Max: 100
* @Default: -16
*
* Usage: External
*
* </ini>
*/
#define CFG_BT_INTERFERENCE_MEDIUM_UL CFG_INI_INT( \
"gSetBtInterferenceMediumUL", \
-100, \
100, \
-16, \
CFG_VALUE_OR_DEFAULT, \
"BT Interference Medium UL")
/*
* <ini>
* gSetBtInterferenceHighLL - Set lower limit of high level BT interference
* @Min: -100
* @Max: 100
* @Default: -15
*
* Usage: External
*
* </ini>
*/
#define CFG_BT_INTERFERENCE_HIGH_LL CFG_INI_INT( \
"gSetBtInterferenceHighLL", \
-100, \
100, \
-15, \
CFG_VALUE_OR_DEFAULT, \
"BT Interference High LL")
/*
* <ini>
* gSetBtInterferenceHighUL - Set upper limit of high level BT interference
* @Min: -100
* @Max: 100
* @Default: -11
*
* Usage: External
*
* </ini>
*/
#define CFG_BT_INTERFERENCE_HIGH_UL CFG_INI_INT( \
"gSetBtInterferenceHighUL", \
-100, \
100, \
-11, \
CFG_VALUE_OR_DEFAULT, \
"BT Interference High UL")
#ifdef FEATURE_MPTA_HELPER
/*
* <ini>
* gMPTAHelperEnable - Enable MPTA Helper
* @Min: 0
* @Max: 1
* @Default: 0
*
* This ini is used to enable or disable coex MPTA Helper.
*
* Usage: External
*
* </ini>
*/
#define CFG_COEX_MPTA_HELPER CFG_INI_BOOL( \
"gMPTAHelperEnable", \
0, \
"Enable/Disable MPTA Helper")
#define COEX_MPTA_HELPER_CFG CFG(CFG_COEX_MPTA_HELPER)
#else
#define COEX_MPTA_HELPER_CFG
#endif
/*
* <ini>
* gBtScoAllowWlan2GScan - Allow wlan 2g scan when BT SCO connection is on
* @Min: 0
* @Max: 1
* @Default: 1
*
* 0 - Disable
* 1 - Enable
*
* This ini is used to enable or disable wlan 2g scan
* when BT SCO connection is on.
*
* Usage: External
*
* </ini>
*/
#define CFG_BT_SCO_ALLOW_WLAN_2G_SCAN CFG_INI_BOOL( \
"gBtScoAllowWlan2GScan", \
1, \
"Bt Sco Allow Wlan 2G Scan")
/*
* <ini>
* ble_scan_coex_policy - Ini to configure coex policy
* @Min: 0
* @Max: 1
* @Default: 0
*
* 0 - Better BLE Advertiser reception performance
* 1 - Better WLAN performance
*
* This ini is used to control the performance of ble scan case,0 to place
* more emphasis on BLE Scan results , 1 to place more emphasis on WLAN
* performance
*
* Usage: External
*
* </ini>
*/
#define CFG_BLE_SCAN_COEX_POLICY CFG_INI_BOOL( \
"ble_scan_coex_policy", \
0, \
"BLE scan Coex policy")
#ifdef FEATURE_COEX_CONFIG
/*
* <ini>
* gThreeWayCoexConfigLegacyEnable - Enable coex config legacy feature
* @Min: 0
* @Max: 1
* @Default: 0
*
* This ini is used to enable or disable three way coex config legacy feature.
* This feature is designed only for non-mobile solution.
* When the feature is disabled, Firmware use the default configuration to
* set the coex priority of three antenna(WLAN, BT, ZIGBEE).
* when enable this feature, customer can use the vendor command to set antenna
* coex priority dynamically.
*
* Supported Feature: three way coex config
*
* Usage: External
*
* </ini>
*/
#define CFG_THREE_WAY_COEX_CONFIG_LEGACY CFG_INI_BOOL( \
"gThreeWayCoexConfigLegacyEnable", \
0, \
"Enable/Disable COEX Config Legacy")
#define THREE_WAY_COEX_CONFIG_LEGACY_CFG CFG(CFG_THREE_WAY_COEX_CONFIG_LEGACY)
#else
#define THREE_WAY_COEX_CONFIG_LEGACY_CFG
#endif
#ifdef FEATURE_BTC_CHAIN_MODE
/*
* <ini>
* gSetInitChainModeForBTC - Used to set init chain mode for BTC
* @Min: 0
* @Max: 0xFF
* @Default: 0xFF
*
* This ini is used to set init chain mode for BTC, default value
* should be set to the same as macro WLAN_COEX_BTC_CHAIN_MODE_UNSETTLED(0xFF),
* only below values can be set:
* 0 - init WLAN 2.4G to support 2x2.
* It means chains of BT and WLAN 2.4G are shared, or BT is OFF.
* 1 - init WLAN 2.4G as 1x1, chains of BT and WLAN 2.4G are separated.
* 0xFF - no need to send init chain mode for BTC to firmware.
*
* Supported Feature: init chain mode for BTC
*
* Usage: External
*
* </ini>
*/
#define CFG_SET_INIT_CHAIN_MODE_FOR_BTC CFG_INI_UINT( \
"gSetInitChainModeForBTC", \
0, \
0xFF, \
0xFF, \
CFG_VALUE_OR_DEFAULT, \
"Init Chain Mode For BTC")
#define SET_INIT_CHAIN_MODE_FOR_BTC_CFG CFG(CFG_SET_INIT_CHAIN_MODE_FOR_BTC)
#else
#define SET_INIT_CHAIN_MODE_FOR_BTC_CFG
#endif
#define CFG_COEX_ALL \
CFG(CFG_BTC_MODE) \
CFG(CFG_ANTENNA_ISOLATION) \
CFG(CFG_MAX_TX_POWER_FOR_BTC) \
CFG(CFG_WLAN_LOW_RSSI_THRESHOLD) \
CFG(CFG_BT_LOW_RSSI_THRESHOLD) \
CFG(CFG_BT_INTERFERENCE_LOW_LL) \
CFG(CFG_BT_INTERFERENCE_LOW_UL) \
CFG(CFG_BT_INTERFERENCE_MEDIUM_LL) \
CFG(CFG_BT_INTERFERENCE_MEDIUM_UL) \
CFG(CFG_BT_INTERFERENCE_HIGH_LL) \
CFG(CFG_BT_INTERFERENCE_HIGH_UL) \
COEX_MPTA_HELPER_CFG \
CFG(CFG_BT_SCO_ALLOW_WLAN_2G_SCAN) \
THREE_WAY_COEX_CONFIG_LEGACY_CFG \
SET_INIT_CHAIN_MODE_FOR_BTC_CFG \
CFG(CFG_BLE_SCAN_COEX_POLICY)
#endif

View File

@@ -1,45 +0,0 @@
/*
* Copyright (c) 2012 - 2019 The Linux Foundation. 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 __CFG_FWOL_H
#define __CFG_FWOL_H
#include "cfg_define.h"
#include "cfg_converged.h"
#include "qdf_types.h"
#include "cfg_coex.h"
#include "cfg_thermal_temp.h"
#include "cfg_ie_whitelist.h"
#include "cfg_fwol_generic.h"
#include "cfg_neighbor_roam.h"
#include "cfg_adaptive_dwelltime.h"
#ifdef WLAN_FW_OFFLOAD
#define CFG_FWOL_ALL \
CFG_ADAPTIVE_DWELLTIME_ALL \
CFG_11K_ALL \
CFG_COEX_ALL \
CFG_FWOL_GENERIC_ALL \
CFG_IE_WHITELIST \
CFG_THERMAL_TEMP_ALL
#else
#define CFG_FWOL_ALL
#endif
#endif /* __CFG_FWOL_H */

View File

@@ -1,902 +0,0 @@
/*
* Copyright (c) 2012-2021 The Linux Foundation. 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.
*/
/**
* DOC: This file contains centralized definitions of converged configuration.
*/
#ifndef __CFG_FWOL_GENERIC_H
#define __CFG_FWOL_GENERIC_H
/*
*
* <ini>
* gEnableANI - Enable Adaptive Noise Immunity
* @Min: 0
* @Max: 1
* @Default: 1
*
* This ini is used to enable or disable Adaptive Noise Immunity.
*
* Related: None
*
* Supported Feature: ANI
*
* Usage: External
*
* </ini>
*/
#define CFG_ENABLE_ANI CFG_INI_BOOL( \
"gEnableANI", \
1, \
"Enable/Disable Adaptive Noise Immunity")
/*
* <ini>
* gSetRTSForSIFSBursting - set rts for sifs bursting
* @Min: 0
* @Max: 1
* @Default: 0
*
* This ini set rts for sifs bursting
*
* Usage: External
*
* </ini>
*/
#define CFG_SET_RTS_FOR_SIFS_BURSTING CFG_INI_BOOL( \
"gSetRTSForSIFSBursting", \
0, \
"Set rts for sifs bursting")
/*
* <ini>
* sifs_burst_mask - Set sifs burst mask
* @Min: 0
* @Max: 3
* @Default: 1
*
* This ini is used to set 11n and legacy(non 11n/wmm)
* sifs burst. Especially under running multi stream
* traffic test case, it can be useful to let the low
* priority AC, or legacy mode device, or the specified
* AC to aggressively contend air medium, then have a
* obvious improvement of throughput. Bit0 is the switch
* of sifs burst, it must be set if want to enable sifs
* burst, Bit1 is for legacy mode.
* Supported configuration:
* 0: disabled
* 1: enabled, but disabled for legacy mode
* 3: all enabled
*
* Usage: External
*
* </ini>
*/
#define CFG_SET_SIFS_BURST CFG_INI_UINT( \
"sifs_burst_mask", \
0, \
3, \
1, \
CFG_VALUE_OR_DEFAULT, \
"Set SIFS burst mask")
/*
* <ini>
* gMaxMPDUsInAMPDU - max mpdus in ampdu
* @Min: 0
* @Max: 64
* @Default: 0
*
* This ini configure max mpdus in ampdu
*
* Usage: External
*
* </ini>
*/
#define CFG_MAX_MPDUS_IN_AMPDU CFG_INI_INT( \
"gMaxMPDUsInAMPDU", \
0, \
64, \
0, \
CFG_VALUE_OR_DEFAULT, \
"This ini configure max mpdus in ampdu")
/*
* <ini>
* gEnableFastPwrTransition - Configuration for fast power transition
* @Min: 0
* @Max: 2
* @Default: 0
*
* This ini supported values:
* 0x0: Phy register retention disabled (Higher timeline, Good for power)
* 0x1: Phy register retention statically enabled
* 0x2: Phy register retention enabled/disabled dynamically
*
* Usage: Internal
*
* </ini>
*/
#define CFG_ENABLE_PHY_REG CFG_INI_UINT( \
"gEnableFastPwrTransition", \
0x0, \
0x2, \
0x0, \
CFG_VALUE_OR_DEFAULT, \
"Configuration for fast power transition")
/*
* <ini>
* gUpperBrssiThresh - Sets Upper threshold for beacon RSSI
* @Min: 36
* @Max: 66
* @Default: 46
*
* This ini sets Upper beacon threshold for beacon RSSI in FW
* Used to reduced RX chainmask in FW, once this threshold is
* reached FW will switch to 1X1 (Single chain).
*
* Supported Feature: STA
*
* Usage: External
*
* </ini>
*/
#define CFG_UPPER_BRSSI_THRESH CFG_INI_UINT( \
"gUpperBrssiThresh", \
36, \
66, \
46, \
CFG_VALUE_OR_DEFAULT, \
"Sets Upper threshold for beacon RSSI")
/*
* <ini>
* gLowerBrssiThresh - Sets Lower threshold for beacon RSSI
* @Min: 6
* @Max: 36
* @Default: 26
*
* This ini sets Lower beacon threshold for beacon RSSI in FW
* Used to increase RX chainmask in FW, once this threshold is
* reached FW will switch to 2X2 chain.
*
* Supported Feature: STA
*
* Usage: External
*
* </ini>
*/
#define CFG_LOWER_BRSSI_THRESH CFG_INI_UINT( \
"gLowerBrssiThresh", \
6, \
36, \
26, \
CFG_VALUE_OR_DEFAULT, \
"Sets Lower threshold for beacon RSSI")
/*
* <ini>
* gDtim1ChRxEnable - Enable/Disable DTIM 1Chrx feature
* @Min: 0
* @Max: 1
* @Default: 1
*
* This ini Enables or Disables DTIM 1CHRX feature in FW
* If this flag is set FW enables shutting off one chain
* while going to power save.
*
* Supported Feature: STA
*
* Usage: External
*
* </ini>
*/
#define CFG_DTIM_1CHRX_ENABLE CFG_INI_BOOL( \
"gDtim1ChRxEnable", \
1, \
"Enable/Disable DTIM 1Chrx feature")
/*
* <ini>
* gEnableAlternativeChainmask - Enable Co-Ex Alternative Chainmask
* @Min: 0
* @Max: 1
* @Default: 0
*
* This ini is used to enable/disable the Co-ex Alternative Chainmask
* feature via the WMI_PDEV_PARAM_ALTERNATIVE_CHAINMASK_SCHEME
* firmware parameter.
*
* Related: None
*
* Supported Feature: STA
*
* Usage: Internal/External
*
* </ini>
*/
#define CFG_ENABLE_COEX_ALT_CHAINMASK CFG_INI_BOOL( \
"gEnableAlternativeChainmask", \
0, \
"Enable Co-Ex Alternative Chainmask")
/*
* <ini>
* gEnableSmartChainmask - Enable Smart Chainmask
* @Min: 0
* @Max: 1
* @Default: 0
*
* This ini is used to enable/disable the Smart Chainmask feature via
* the WMI_PDEV_PARAM_SMART_CHAINMASK_SCHEME firmware parameter.
*
* Related: None
*
* Supported Feature: STA
*
* Usage: Internal/External
*
* </ini>
*/
#define CFG_ENABLE_SMART_CHAINMASK CFG_INI_BOOL( \
"gEnableSmartChainmask", \
0, \
"Enable/disable the Smart Chainmask feature")
/*
* <ini>
* gEnableRTSProfiles - It will use configuring different RTS profiles
* @Min: 0
* @Max: 66
* @Default: 33
*
* This ini used for configuring different RTS profiles
* to firmware.
* Following are the valid values for the rts profile:
* RTSCTS_DISABLED 0
* NOT_ALLOWED 1
* NOT_ALLOWED 2
* RTSCTS_DISABLED 16
* RTSCTS_ENABLED_4_SECOND_RATESERIES 17
* CTS2SELF_ENABLED_4_SECOND_RATESERIES 18
* RTSCTS_DISABLED 32
* RTSCTS_ENABLED_4_SWRETRIES 33
* CTS2SELF_ENABLED_4_SWRETRIES 34
* NOT_ALLOWED 48
* NOT_ALLOWED 49
* NOT_ALLOWED 50
* RTSCTS_DISABLED 64
* RTSCTS_ENABLED_4_ALL_RATESERIES 65
* CTS2SELF_ENABLED_4_ALL_RATESERIES 66
*
* Related: None
*
* Supported Feature: STA
*
* Usage: Internal/External
*
* </ini>
*/
#define CFG_ENABLE_FW_RTS_PROFILE CFG_INI_INT( \
"gEnableRTSProfiles", \
0, \
66, \
33, \
CFG_VALUE_OR_DEFAULT, \
"It is used to configure different RTS profiles")
/* <ini>
* gFwDebugLogLevel - Firmware debug log level
* @Min: 0
* @Max: 255
* @Default: 3
*
* This option controls the level of firmware debug log. Default value is
* DBGLOG_WARN, which is to enable error and warning logs.
*
* Related: None
*
* Supported Features: Debugging
*
* Usage: Internal
*
* </ini>
*/
#define CFG_ENABLE_FW_DEBUG_LOG_LEVEL CFG_INI_INT( \
"gFwDebugLogLevel", \
0, \
255, \
3, \
CFG_VALUE_OR_DEFAULT, \
"enable error and warning logs by default")
/* <ini>
* gFwDebugLogType - Firmware debug log type
* @Min: 0
* @Max: 255
* @Default: 3
*
* This option controls how driver is to give the firmware logs to net link
* when cnss_diag service is started.
*
* Related: None
*
* Supported Features: Debugging
*
* Usage: Internal
*
* </ini>
*/
#define CFG_ENABLE_FW_LOG_TYPE CFG_INI_INT( \
"gFwDebugLogType", \
0, \
255, \
3, \
CFG_VALUE_OR_DEFAULT, \
"Default value to be given to the net link cnss_diag service")
/*
* <ini>
* gFwDebugModuleLoglevel - modulized firmware debug log level
* @Min: N/A
* @Max: N/A
* @Default: N/A
*
* This ini is used to set modulized firmware debug log level.
* FW module log level input string format looks like below:
* gFwDebugModuleLoglevel="<FW Module ID>,<Log Level>,..."
* For example:
* gFwDebugModuleLoglevel="1,0,2,1,3,2,4,3,5,4,6,5,7,6"
* The above input string means:
* For FW module ID 1 enable log level 0
* For FW module ID 2 enable log level 1
* For FW module ID 3 enable log level 2
* For FW module ID 4 enable log level 3
* For FW module ID 5 enable log level 4
* For FW module ID 6 enable log level 5
* For FW module ID 7 enable log level 6
* For valid values of log levels check enum DBGLOG_LOG_LVL and
* for valid values of module ids check enum WLAN_MODULE_ID.
*
* Related: None
*
* Supported Feature: Debugging
*
* Usage: Internal/External
*
* </ini>
*/
#define FW_MODULE_LOG_LEVEL_STRING_LENGTH (512)
#define CFG_ENABLE_FW_MODULE_LOG_LEVEL CFG_INI_STRING( \
"gFwDebugModuleLoglevel", \
0, \
FW_MODULE_LOG_LEVEL_STRING_LENGTH, \
"1,1,2,1,3,1,4,1,5,1,8,1,9,1,13,1,14,1,17,1,18,1,19,1,22,1,26,1,28,1," \
"29,1,31,1,36,1,38,1,46,1,47,1,50,1,52,1,53,1,56,1,60,1,61,1", \
"Set modulized firmware debug log level")
/*
* <ini>
* gFwDebugWowModuleLoglevel - modulized firmware wow debug log level
* @Min: N/A
* @Max: N/A
* @Default: N/A
*
* This ini is used to set modulized firmware wow debug log level.
* FW module log level input string format looks like below:
* gFwDebugWowModuleLoglevel="<FW Module ID>,<Log Level>,..."
* For example:
* gFwDebugWowModuleLoglevel="1,0,2,1,3,2,4,3,5,4,6,5,7,6"
* The above input string means:
* For FW module ID 1 enable log level 0
* For FW module ID 2 enable log level 1
* For FW module ID 3 enable log level 2
* For FW module ID 4 enable log level 3
* For FW module ID 5 enable log level 4
* For FW module ID 6 enable log level 5
* For FW module ID 7 enable log level 6
* For valid values of log levels check enum DBGLOG_LOG_LVL and
* for valid values of module ids check enum WLAN_MODULE_ID.
*
* Related: None
*
* Supported Feature: Debugging
*
* Usage: External
*
* </ini>
*/
#define CFG_ENABLE_FW_WOW_MODULE_LOG_LEVEL CFG_INI_STRING( \
"gFwDebugWowModuleLoglevel", \
0, \
FW_MODULE_LOG_LEVEL_STRING_LENGTH, \
"1,3,5,3,18,1,19,3,31,1,36,1,57,3", \
"Set modulized firmware wow debug log level")
#ifdef FEATURE_WLAN_RA_FILTERING
/* <ini>
* gRAFilterEnable
* @Min: 0
* @Max: 1
* @Default: 1
*
* Related: None
*
* Usage: Internal
*
* </ini>
*/
#define CFG_RA_FILTER_ENABLE CFG_INI_BOOL( \
"gRAFilterEnable", \
1, \
"Enable RA Filter")
#else
#define CFG_RA_FILTER_ENABLE
#endif
/* <ini>
* gtsf_gpio_pin
* @Min: 0
* @Max: 254
* @Default: 255
*
* GPIO pin to toggle when capture tsf
*
* Related: None
*
* Usage: Internal
*
* </ini>
*/
#define CFG_SET_TSF_GPIO_PIN CFG_INI_INT( \
"gtsf_gpio_pin", \
0, \
255, \
255, \
CFG_VALUE_OR_DEFAULT, \
"GPIO pin to toggle when capture tsf")
#ifdef WLAN_FEATURE_TSF_PLUS_EXT_GPIO_IRQ
/* <ini>
* gtsf_irq_host_gpio_pin
* @Min: 0
* @Max: 254
* @Default: 255
*
* TSF irq GPIO pin of host platform
*
* Related: None
*
* Usage: Internal
*
* </ini>
*/
#define CFG_SET_TSF_IRQ_HOST_GPIO_PIN CFG_INI_INT( \
"gtsf_irq_host_gpio_pin", \
0, \
255, \
255, \
CFG_VALUE_OR_DEFAULT, \
"TSF irq GPIO pin of host platform")
#define __CFG_SET_TSF_IRQ_HOST_GPIO_PIN CFG(CFG_SET_TSF_IRQ_HOST_GPIO_PIN)
#else
#define __CFG_SET_TSF_IRQ_HOST_GPIO_PIN
#endif
#ifdef WLAN_FEATURE_TSF_PLUS_EXT_GPIO_SYNC
/*
* <ini>
* gtsf_sync_host_gpio_pin
* @Min: 0
* @Max: 254
* @Default: 255
*
* TSF sync GPIO pin of host platform
*
* The driver will use this gpio on host platform
* to drive the TSF sync pin on wlan chip.
* Toggling this gpio will generate a strobe to fw
* for latching TSF.
*
* Related: None
*
* Usage: External
*
* </ini>
*/
#define CFG_SET_TSF_SYNC_HOST_GPIO_PIN CFG_INI_UINT( \
"gtsf_sync_host_gpio_pin", \
0, \
254, \
255, \
CFG_VALUE_OR_DEFAULT, \
"TSF sync GPIO pin of host platform")
#define __CFG_SET_TSF_SYNC_HOST_GPIO_PIN CFG(CFG_SET_TSF_SYNC_HOST_GPIO_PIN)
#else
#define __CFG_SET_TSF_SYNC_HOST_GPIO_PIN
#endif
#if defined(WLAN_FEATURE_TSF) && defined(WLAN_FEATURE_TSF_PLUS)
/* <ini>
* g_enable_tsf_sync: Enable TSF sync feature
* @Min: 0
* @Max: 1
* @Default: 0
*
* Enable/disable periodic sync of TSF with firmware.
*
* Related: None
*
* Usage: External
*
* </ini>
*/
#define CFG_TSF_SYNC_ENABLE CFG_INI_BOOL( \
"g_enable_tsf_sync", \
0, \
"Enable TSF sync feature")
/* <ini>
* gtsf_ptp_options: TSF Plus feature options
* @Min: 0
* @Max: 0xff
* @Default: 0xf
*
* CFG_SET_TSF_PTP_OPT_RX (0x1)
* CFG_SET_TSF_PTP_OPT_TX (0x2)
* CFG_SET_TSF_PTP_OPT_RAW (0x4)
* CFG_SET_TSF_DBG_FS (0x8)
* CFG_SET_TSF_PTP_OPT_TSF64_TX (0x10)
*
* Related: None
*
* Usage: Internal
*
* </ini>
*/
#define CFG_SET_TSF_PTP_OPT_RX (0x1)
#define CFG_SET_TSF_PTP_OPT_TX (0x2)
#define CFG_SET_TSF_PTP_OPT_RAW (0x4)
#define CFG_SET_TSF_DBG_FS (0x8)
#define CFG_SET_TSF_PTP_OPT_TSF64_TX (0x10)
#define CFG_SET_TSF_PTP_OPT CFG_INI_UINT( \
"gtsf_ptp_options", \
0, \
0xff, \
0xf, \
CFG_VALUE_OR_DEFAULT, \
"TSF Plus feature options")
#define __CFG_SET_TSF_PTP_OPT \
CFG(CFG_SET_TSF_PTP_OPT) \
CFG(CFG_TSF_SYNC_ENABLE)
#else
#define __CFG_SET_TSF_PTP_OPT
#endif
#ifdef DHCP_SERVER_OFFLOAD
/* <ini>
* gDHCPServerOffloadEnable
* @Min: 0
* @Max: 1
* @Default: 0
*
* DHCP Server offload support
*
* Related: None
*
* Usage: Internal
*
* </ini>
*/
#define CFG_DHCP_SERVER_OFFLOAD_SUPPORT CFG_INI_BOOL( \
"gDHCPServerOffloadEnable", \
0, \
"DHCP Server offload support")
/* <ini>
* gDHCPMaxNumClients
* @Min: 1
* @Max: 8
* @Default: 8
*
* Number of DHCP server offload clients
*
* Related: None
*
* Usage: Internal
*
* </ini>
*/
#define CFG_DHCP_SERVER_OFFLOAD_NUM_CLIENT CFG_INI_INT( \
"gDHCPMaxNumClients", \
1, \
8, \
8, \
CFG_VALUE_OR_DEFAULT, \
"Number of DHCP server offload clients")
#define CFG_FWOL_DHCP \
CFG(CFG_DHCP_SERVER_OFFLOAD_SUPPORT) \
CFG(CFG_DHCP_SERVER_OFFLOAD_NUM_CLIENT)
#else
#define CFG_FWOL_DHCP
#endif
#ifdef WLAN_FEATURE_SAE
/*
* <ini>
* sae_enabled - Enable/Disable SAE support in driver
* @Min: 0
* @Max: 1
* @Default: 1
*
* This ini is used to enable/disable SAE support in driver
* Driver will update config to supplicant based on this config.
*
* Related: None
*
* Supported Feature: SAE
* Usage: External
*
* </ini>
*/
#define CFG_IS_SAE_ENABLED CFG_INI_BOOL( \
"sae_enabled", \
1, \
"SAE feature control")
#define __CFG_IS_SAE_ENABLED CFG(CFG_IS_SAE_ENABLED)
#else
#define __CFG_IS_SAE_ENABLED
#endif
/*
* <ini>
* gcmp_enabled - ini to enable/disable GCMP
* @Min: 0
* @Max: 1
* @Default: 1
*
* Currently Firmware update the sequence number for each TID with 2^3
* because of security issues. But with this PN mechanism, throughput drop
* is observed. With this ini FW takes the decision to trade off between
* security and throughput
*
* Supported Feature: STA/SAP/P2P
*
* Usage: External
*
* </ini>
*/
#define CFG_ENABLE_GCMP CFG_INI_BOOL( \
"gcmp_enabled", \
1, \
"GCMP Feature control param")
/*
* <ini>
* gTxSchDelay - Enable/Disable Tx sch delay
* @Min: 0
* @Max: 5
* @Default: 0
*
* Usage: Internal/External
*
* </ini>
*/
#define CFG_TX_SCH_DELAY CFG_INI_UINT( \
"gTxSchDelay", \
0, \
5, \
0, \
CFG_VALUE_OR_DEFAULT, \
"Enable/Disable Tx sch delay")
/*
* <ini>
* gEnableSecondaryRate - Enable/Disable Secondary Retry Rate feature subset
*
* @Min: 0x0
* @Max: 0x3F
* @Default: 0x17
*
* It is a 32 bit value such that the various bits represent as below -
* Bit-0 : is Enable/Disable Control for "PPDU Secondary Retry Support"
* Bit-1 : is Enable/Disable Control for "RTS Black/White-listing Support"
* Bit-2 : is Enable/Disable Control for "Higher MCS retry restriction
* on XRETRY failures"
* Bit 3-5 : is "Xretry threshold" to use
* Bit 3~31 : reserved for future use.
*
* Usage: External
*
* </ini>
*/
#define CFG_ENABLE_SECONDARY_RATE CFG_INI_UINT( \
"gEnableSecondaryRate", \
0, \
0x3f, \
0x17, \
CFG_VALUE_OR_DEFAULT, \
"Secondary Retry Rate feature subset control")
/*
* <ini>
* sap_xlna_bypass - Enable/Disable xLNA bypass
* @Min: 0
* @Max: 1
* @Default: 0
*
* This ini is used to enable/disable SAP xLNA bypass in the FW
*
* Related: None
*
* Supported Feature: SAP
*
* Usage: Internal
*
* </ini>
*/
#define CFG_SET_SAP_XLNA_BYPASS CFG_INI_BOOL( \
"xlna_bypass", \
0, \
"SAP xLNA bypass control")
/*
* <ini>
* g_enable_ilp - ILP HW Block Configuration
* @Min: 0
* @Max: 3
* @Default: 2
*
* This ini is used to configure ILP HW block with various options
* 0: disable
* 1: perf settings
* 2: max power saving
* 3: balanced settings
*
* Related: none
*
* Supported Feature: STA/SAP
*
* Usage: Internal
*
* <ini>
*/
#define CFG_SET_ENABLE_ILP CFG_INI_UINT( \
"g_enable_ilp", \
0, \
3, \
1, \
CFG_VALUE_OR_DEFAULT, \
"ILP configuration")
/*
*
* <ini>
* sap_sho_config - Bitmap to Enable/Disable SAP HW offload
* @Min: 0
* @Max: 3
* @Default: 0
*
* This INI is used to configure sap hw offload.
*
* bit-0: enable/disable SHO
* bit-1: enable for Sta connected state as well.
* bit-2 to bit-31: Reserved
*
* Related: None
*
* Supported Feature: SAP
* Usage: External
*
* </ini>
*/
#define CFG_SAP_SHO_CONFIG CFG_INI_UINT(\
"sap_sho_config", \
0, \
3, \
1, \
CFG_VALUE_OR_DEFAULT, \
"enable SHO config")
/*
* <ini>
* g_disable_hw_assist - Flag to disable HW assist feature
* @Default: 0
*
* This ini is used to enable/disable the HW assist feature in FW
*
* Related: none
*
* Supported Feature: STA/SAP
*
* Usage: External
*
* <ini>
*/
#define CFG_DISABLE_HW_ASSIST CFG_INI_BOOL( \
"g_disable_hw_assist", \
0, \
"Disable HW assist feature in FW")
/*
* <ini>
* g_enable_pci_gen - To enable pci gen switch
* @Default: 0
*
* Related: None
*
* Supported Feature: PCI
*
* Usage: External
*
* </ini>
*/
#define CFG_ENABLE_PCI_GEN CFG_INI_BOOL( \
"g_enable_pci_gen", \
0, \
"enable pci gen")
#define CFG_FWOL_GENERIC_ALL \
CFG_FWOL_DHCP \
CFG(CFG_ENABLE_ANI) \
CFG(CFG_SET_RTS_FOR_SIFS_BURSTING) \
CFG(CFG_SET_SIFS_BURST) \
CFG(CFG_MAX_MPDUS_IN_AMPDU) \
CFG(CFG_ENABLE_PHY_REG) \
CFG(CFG_UPPER_BRSSI_THRESH) \
CFG(CFG_LOWER_BRSSI_THRESH) \
CFG(CFG_DTIM_1CHRX_ENABLE) \
CFG(CFG_ENABLE_COEX_ALT_CHAINMASK) \
CFG(CFG_ENABLE_SMART_CHAINMASK) \
CFG(CFG_ENABLE_FW_RTS_PROFILE) \
CFG(CFG_ENABLE_FW_DEBUG_LOG_LEVEL) \
CFG(CFG_ENABLE_FW_LOG_TYPE) \
CFG(CFG_ENABLE_FW_MODULE_LOG_LEVEL) \
CFG(CFG_RA_FILTER_ENABLE) \
CFG(CFG_SET_TSF_GPIO_PIN) \
__CFG_SET_TSF_IRQ_HOST_GPIO_PIN \
__CFG_SET_TSF_SYNC_HOST_GPIO_PIN \
__CFG_SET_TSF_PTP_OPT \
__CFG_IS_SAE_ENABLED \
CFG(CFG_ENABLE_GCMP) \
CFG(CFG_TX_SCH_DELAY) \
CFG(CFG_ENABLE_SECONDARY_RATE) \
CFG(CFG_SET_SAP_XLNA_BYPASS) \
CFG(CFG_SET_ENABLE_ILP) \
CFG(CFG_ENABLE_FW_WOW_MODULE_LOG_LEVEL) \
CFG(CFG_SAP_SHO_CONFIG) \
CFG(CFG_DISABLE_HW_ASSIST) \
CFG(CFG_ENABLE_PCI_GEN)
#endif

View File

@@ -1,321 +0,0 @@
/*
* Copyright (c) 2012-2018 The Linux Foundation. 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.
*/
/**
* DOC: This file contains centralized definitions of converged configuration.
*/
#ifndef __CFG_IE_WHITELIST_H
#define __CFG_IE_WHITELIST_H
/*
* <ini>
* g_enable_probereq_whitelist_ies - Enable IE white listing
* @Min: 0
* @Max: 1
* @Default: 0
*
* This ini is used to enable/disable probe request IE white listing feature.
* Values 0 and 1 are used to disable and enable respectively, by default this
* feature is disabled.
*
* Related: None
*
* Supported Feature: Probe request IE whitelisting
*
* Usage: Internal/External
*
* </ini>
*/
#define CFG_PROBE_REQ_IE_WHITELIST CFG_INI_BOOL( \
"g_enable_probereq_whitelist_ies", \
0, \
"Enable IE whitelisting")
/*
* For IE white listing in Probe Req, following ini parameters from
* g_probe_req_ie_bitmap_0 to g_probe_req_ie_bitmap_7 are used. User needs to
* input this values in hexa decimal format, when bit is set in bitmap,
* corresponding IE needs to be included in probe request.
*
* Example:
* ========
* If IE 221 needs to be in the probe request, set the corresponding bit
* as follows:
* a= IE/32 = 221/32 = 6 = g_probe_req_ie_bitmap_6
* b = IE modulo 32 = 29,
* means set the bth bit in g_probe_req_ie_bitmap_a,
* therefore set 29th bit in g_probe_req_ie_bitmap_6,
* as a result, g_probe_req_ie_bitmap_6=20000000
*
* Note: For IE 221, its mandatory to set the gProbeReqOUIs.
*/
/*
* <ini>
* g_probe_req_ie_bitmap_0 - Used to set the bitmap of IEs from 0 to 31
* @Min: 0x00000000
* @Max: 0xFFFFFFFF
* @Default: 0x00000000
*
* This ini is used to include the IEs from 0 to 31 in probe request,
* when corresponding bit is set.
*
* Related: Need to enable g_enable_probereq_whitelist_ies.
*
* Supported Feature: Probe request ie whitelisting
*
* Usage: Internal/External
*
* </ini>
*/
#define CFG_PROBE_REQ_IE_BIT_MAP0 CFG_INI_UINT( \
"g_probe_req_ie_bitmap_0", \
0x00000000, \
0xFFFFFFFF, \
0x00000000, \
CFG_VALUE_OR_DEFAULT, \
"IE Bitmap 0")
/*
* <ini>
* g_probe_req_ie_bitmap_1 - Used to set the bitmap of IEs from 32 to 63
* @Min: 0x00000000
* @Max: 0xFFFFFFFF
* @Default: 0x00000000
*
* This ini is used to include the IEs from 32 to 63 in probe request,
* when corresponding bit is set.
*
* Related: Need to enable g_enable_probereq_whitelist_ies.
*
* Supported Feature: Probe request ie whitelisting
*
* Usage: Internal/External
*
* </ini>
*/
#define CFG_PROBE_REQ_IE_BIT_MAP1 CFG_INI_UINT( \
"g_probe_req_ie_bitmap_1", \
0x00000000, \
0xFFFFFFFF, \
0x00000000, \
CFG_VALUE_OR_DEFAULT, \
"IE Bitmap 1")
/*
* <ini>
* g_probe_req_ie_bitmap_2 - Used to set the bitmap of IEs from 64 to 95
* @Min: 0x00000000
* @Max: 0xFFFFFFFF
* @Default: 0x00000000
*
* This ini is used to include the IEs from 64 to 95 in probe request,
* when corresponding bit is set.
*
* Related: Need to enable g_enable_probereq_whitelist_ies.
*
* Supported Feature: Probe request ie whitelisting
*
* Usage: Internal/External
*
* </ini>
*/
#define CFG_PROBE_REQ_IE_BIT_MAP2 CFG_INI_UINT( \
"g_probe_req_ie_bitmap_2", \
0x00000000, \
0xFFFFFFFF, \
0x00000000, \
CFG_VALUE_OR_DEFAULT, \
"IE Bitmap 2")
/*
* <ini>
* g_probe_req_ie_bitmap_3 - Used to set the bitmap of IEs from 96 to 127
* @Min: 0x00000000
* @Max: 0xFFFFFFFF
* @Default: 0x00000000
*
* This ini is used to include the IEs from 96 to 127 in probe request,
* when corresponding bit is set.
*
* Related: Need to enable g_enable_probereq_whitelist_ies.
*
* Supported Feature: Probe request ie whitelisting
*
* Usage: Internal/External
*
* </ini>
*/
#define CFG_PROBE_REQ_IE_BIT_MAP3 CFG_INI_UINT( \
"g_probe_req_ie_bitmap_3", \
0x00000000, \
0xFFFFFFFF, \
0x00000000, \
CFG_VALUE_OR_DEFAULT, \
"IE Bitmap 3")
/*
* <ini>
* g_probe_req_ie_bitmap_4 - Used to set the bitmap of IEs from 128 to 159
* @Min: 0x00000000
* @Max: 0xFFFFFFFF
* @Default: 0x00000000
*
* This ini is used to include the IEs from 128 to 159 in probe request,
* when corresponding bit is set.
*
* Related: Need to enable g_enable_probereq_whitelist_ies.
*
* Supported Feature: Probe request ie whitelisting
*
* Usage: Internal/External
*
* </ini>
*/
#define CFG_PROBE_REQ_IE_BIT_MAP4 CFG_INI_UINT( \
"g_probe_req_ie_bitmap_4", \
0x00000000, \
0xFFFFFFFF, \
0x00000000, \
CFG_VALUE_OR_DEFAULT, \
"IE Bitmap 4")
/*
* <ini>
* g_probe_req_ie_bitmap_5 - Used to set the bitmap of IEs from 160 to 191
* @Min: 0x00000000
* @Max: 0xFFFFFFFF
* @Default: 0x00000000
*
* This ini is used to include the IEs from 160 to 191 in probe request,
* when corresponding bit is set.
*
* Related: Need to enable g_enable_probereq_whitelist_ies.
*
* Supported Feature: Probe request ie whitelisting
*
* Usage: Internal/External
*
* </ini>
*/
#define CFG_PROBE_REQ_IE_BIT_MAP5 CFG_INI_UINT( \
"g_probe_req_ie_bitmap_5", \
0x00000000, \
0xFFFFFFFF, \
0x00000000, \
CFG_VALUE_OR_DEFAULT, \
"IE Bitmap 5")
/*
* <ini>
* g_probe_req_ie_bitmap_6 - Used to set the bitmap of IEs from 192 to 223
* @Min: 0x00000000
* @Max: 0xFFFFFFFF
* @Default: 0x00000000
*
* This ini is used to include the IEs from 192 to 223 in probe request,
* when corresponding bit is set.
*
* Related: Need to enable g_enable_probereq_whitelist_ies.
*
* Supported Feature: Probe request ie whitelisting
*
* Usage: Internal/External
*
* </ini>
*/
#define CFG_PROBE_REQ_IE_BIT_MAP6 CFG_INI_UINT( \
"g_probe_req_ie_bitmap_6", \
0x00000000, \
0xFFFFFFFF, \
0x00000000, \
CFG_VALUE_OR_DEFAULT, \
"IE Bitmap 6")
/*
* <ini>
* g_probe_req_ie_bitmap_7 - Used to set the bitmap of IEs from 224 to 255
* @Min: 0x00000000
* @Max: 0xFFFFFFFF
* @Default: 0x00000000
*
* This ini is used to include the IEs from 224 to 255 in probe request,
* when corresponding bit is set.
*
* Related: Need to enable g_enable_probereq_whitelist_ies.
*
* Supported Feature: Probe request ie whitelisting
*
* Usage: Internal/External
*
* </ini>
*/
#define CFG_PROBE_REQ_IE_BIT_MAP7 CFG_INI_UINT( \
"g_probe_req_ie_bitmap_7", \
0x00000000, \
0xFFFFFFFF, \
0x00000000, \
CFG_VALUE_OR_DEFAULT, \
"IE Bitmap 7")
#define MAX_PRB_REQ_VENDOR_OUI_INI_LEN 160
#define VENDOR_SPECIFIC_IE_BITMAP 0x20000000
/*
* For vendor specific IE, Probe Req OUI types and sub types which are
* to be white listed are specified in gProbeReqOUIs in the following
* example format - gProbeReqOUIs=AABBCCDD EEFF1122
*/
/*
* <ini>
* gProbeReqOUIs - Used to specify vendor specific OUIs
* @Default: Empty string
*
* This ini is used to include the specified OUIs in vendor specific IE
* of probe request.
*
* Related: Need to enable g_enable_probereq_whitelist_ies and
* vendor specific IE should be set in g_probe_req_ie_bitmap_6.
*
* Supported Feature: Probe request ie whitelisting
*
* Usage: Internal/External
*
* </ini>
*/
#define CFG_PROBE_REQ_OUI CFG_INI_STRING( \
"gProbeReqOUIs", \
0, \
MAX_PRB_REQ_VENDOR_OUI_INI_LEN, \
"", \
"Probe Req OUIs")
#define CFG_IE_WHITELIST \
CFG(CFG_PROBE_REQ_IE_WHITELIST) \
CFG(CFG_PROBE_REQ_IE_BIT_MAP0) \
CFG(CFG_PROBE_REQ_IE_BIT_MAP1) \
CFG(CFG_PROBE_REQ_IE_BIT_MAP2) \
CFG(CFG_PROBE_REQ_IE_BIT_MAP3) \
CFG(CFG_PROBE_REQ_IE_BIT_MAP4) \
CFG(CFG_PROBE_REQ_IE_BIT_MAP5) \
CFG(CFG_PROBE_REQ_IE_BIT_MAP6) \
CFG(CFG_PROBE_REQ_IE_BIT_MAP7) \
CFG(CFG_PROBE_REQ_OUI)
#endif

View File

@@ -1,225 +0,0 @@
/*
* Copyright (c) 2012 - 2018 The Linux Foundation. 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.
*/
/**
* DOC: This file contains centralized definitions of converged configuration.
*/
#ifndef __CFG_NR_H
#define __CFG_NR_H
/*
* <ini>
* 11k_offload_enable_bitmask - 11K offload bitmask feature control
* @Min: 0
* @Max: 1
* @Default: 1
*
* Disabled when 0 and enabled when 1
* Usage: External
*
* </ini>
*/
#define CFG_OFFLOAD_11K_ENABLE_BITMASK CFG_INI_BOOL( \
"11k_offload_enable_bitmask", \
1, \
"11K offload bitmask feature control")
/*
* <ini>
* nr_offload_params_bitmask - bitmask to specify which of the
* neighbor report offload params are valid in the ini
* frame
* @Min: 0
* @Max: 63
* @Default: 63
*
* This ini specifies which of the neighbor report offload params are valid
* and should be considered by the FW. The bitmask is as follows
* B0: nr_offload_time_offset
* B1: nr_offload_low_rssi_offset
* B2: nr_offload_bmiss_count_trigger
* B3: nr_offload_per_threshold_offset
* B4: nr_offload_cache_timeout
* B5: nr_offload_max_req_cap
* B6-B7: Reserved
*
* Related : 11k_offload_enable_bitmask
*
* Usage: External
*
* </ini>
*/
#define CFG_OFFLOAD_NEIGHBOR_REPORT_PARAMS_BITMASK CFG_INI_UINT( \
"nr_offload_params_bitmask", \
0, \
63, \
63, \
CFG_VALUE_OR_DEFAULT, \
"Neighbor report offload params validity bitmask")
#define OFFLOAD_11K_BITMASK_NEIGHBOR_REPORT_REQUEST 0x1
/*
* <ini>
* nr_offload_time_offset - time interval in seconds after the
* neighbor report offload command to send the first neighbor report request
* frame
* @Min: 0
* @Max: 3600
* @Default: 30
*
* Related : nr_offload_params_bitmask
*
* Usage: External
*
* </ini>
*/
#define CFG_OFFLOAD_NEIGHBOR_REPORT_TIME_OFFSET CFG_INI_UINT( \
"nr_offload_time_offset", \
0, \
3600, \
30, \
CFG_VALUE_OR_DEFAULT, \
"Neighbor report time offset")
/*
* <ini>
* nr_offload_low_rssi_offset - offset from the roam RSSI threshold
* to trigger the neighbor report request frame (in dBm)
* @Min: 4
* @Max: 10
* @Default: 4
*
* Related : nr_offload_params_bitmask
*
* Usage: External
*
* </ini>
*/
#define CFG_OFFLOAD_NEIGHBOR_REPORT_LOW_RSSI_OFFSET CFG_INI_UINT( \
"nr_offload_low_rssi_offset", \
4, \
10, \
4, \
CFG_VALUE_OR_DEFAULT, \
"Neighbor report low RSSI offset")
/*
* <ini>
* nr_offload_bmiss_count_trigger - Number of beacon miss events to
* trigger a neighbor report request frame
* @Min: 1
* @Max: 5
* @Default: 1
*
* Related : nr_offload_params_bitmask
*
* Usage: External
*
* </ini>
*/
#define CFG_OFFLOAD_NEIGHBOR_REPORT_BMISS_COUNT_TRIGGER CFG_INI_UINT( \
"nr_offload_bmiss_count_trigger", \
1, \
5, \
1, \
CFG_VALUE_OR_DEFAULT, \
"Beacon miss count trigger for neighbor report req frame")
/*
* <ini>
* nr_offload_per_threshold_offset - offset from PER threshold to
* trigger a neighbor report request frame (in %)
* @Min: 5
* @Max: 20
* @Default: 5
*
* This ini is used to set the neighbor report offload parameter:
*
* Related : nr_offload_params_bitmask
*
* Usage: External
*
* </ini>
*/
#define CFG_OFFLOAD_NEIGHBOR_REPORT_PER_THRESHOLD_OFFSET CFG_INI_UINT( \
"nr_offload_per_threshold_offset", \
5, \
20, \
5, \
CFG_VALUE_OR_DEFAULT, \
"PER threshold offset to trigger neighbor report req frame")
/*
* <ini>
* nr_offload_cache_timeout - time in seconds after which the
* neighbor report cache is marked as timed out and any of the triggers would
* cause a neighbor report request frame to be sent.
* @Min: 5
* @Max: 86400
* @Default: 1200
*
* Related : nr_offload_params_bitmask
*
* Usage: External
*
* </ini>
*/
#define CFG_OFFLOAD_NEIGHBOR_REPORT_CACHE_TIMEOUT CFG_INI_UINT( \
"nr_offload_cache_timeout", \
5, \
86400, \
1200, \
CFG_VALUE_OR_DEFAULT, \
"Neighbor report cache timeout to trigger report req frame")
/*
* <ini>
* nr_offload_max_req_cap - Max number of neighbor
* report requests that can be sent to a connected peer in the current session.
* This counter is reset once a successful roam happens or at cache timeout
* @Min: 3
* @Max: 300
* @Default: 3
*
* Related : nr_offload_params_bitmask
*
* Usage: External
*
* </ini>
*/
#define CFG_OFFLOAD_NEIGHBOR_REPORT_MAX_REQ_CAP CFG_INI_UINT( \
"nr_offload_max_req_cap", \
3, \
300, \
3, \
CFG_VALUE_OR_DEFAULT, \
"Max neighbor report request to be sent to connected peer")
#define CFG_11K_ALL \
CFG(CFG_OFFLOAD_11K_ENABLE_BITMASK) \
CFG(CFG_OFFLOAD_NEIGHBOR_REPORT_PARAMS_BITMASK) \
CFG(CFG_OFFLOAD_NEIGHBOR_REPORT_TIME_OFFSET) \
CFG(CFG_OFFLOAD_NEIGHBOR_REPORT_LOW_RSSI_OFFSET) \
CFG(CFG_OFFLOAD_NEIGHBOR_REPORT_BMISS_COUNT_TRIGGER) \
CFG(CFG_OFFLOAD_NEIGHBOR_REPORT_PER_THRESHOLD_OFFSET) \
CFG(CFG_OFFLOAD_NEIGHBOR_REPORT_CACHE_TIMEOUT) \
CFG(CFG_OFFLOAD_NEIGHBOR_REPORT_MAX_REQ_CAP)
#endif

Some files were not shown because too many files have changed in this diff Show More