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>
このコミットが含まれているのは:
Linux Build Service Account
2021-11-22 11:37:30 +05:30
コミット 7735770d6d
378個のファイルの変更0行の追加200796行の削除

ファイルの表示

@@ -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_ */

ファイルの表示

@@ -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 */

ファイルの表示

@@ -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_ */

ファイルの表示

@@ -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;
}

ファイルの表示

@@ -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;
}

ファイルの表示

@@ -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_ */

ファイルの表示

@@ -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_ */

ファイルの表示

@@ -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_ */

ファイルの表示

@@ -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;
}

ファイルの表示

@@ -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;
}

ファイルの表示

@@ -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

ファイルの表示

@@ -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

ファイル差分が大きすぎるため省略します 差分を読み込み

ファイルの表示

@@ -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;
}

ファイルの表示

@@ -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

ファイルの表示

@@ -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

ファイルの表示

@@ -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

ファイルの表示

@@ -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_ */

ファイルの表示

@@ -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 */

ファイルの表示

@@ -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

ファイルの表示

@@ -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);
}

ファイルの表示

@@ -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

ファイルの表示

@@ -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

ファイルの表示

@@ -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;
}

ファイルの表示

@@ -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

ファイルの表示

@@ -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;
}

ファイルの表示

@@ -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_ */

ファイルの表示

@@ -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;
}

ファイル差分が大きすぎるため省略します 差分を読み込み

ファイルの表示

@@ -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

ファイルの表示

@@ -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

ファイル差分が大きすぎるため省略します 差分を読み込み

ファイル差分が大きすぎるため省略します 差分を読み込み

ファイルの表示

@@ -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

ファイルの表示

@@ -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;
}

ファイル差分が大きすぎるため省略します 差分を読み込み

ファイルの表示

@@ -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

ファイルの表示

@@ -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

ファイルの表示

@@ -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);
}

ファイルの表示

@@ -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

ファイルの表示

@@ -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;
}

ファイルの表示

@@ -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

ファイルの表示

@@ -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

ファイルの表示

@@ -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

ファイルの表示

@@ -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;
}

ファイルの表示

@@ -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);
}

ファイルの表示

@@ -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);
}

ファイルの表示

@@ -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__ */

ファイルの表示

@@ -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__ */

ファイルの表示

@@ -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__ */

ファイルの表示

@@ -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__ */

ファイル差分が大きすぎるため省略します 差分を読み込み

ファイル差分が大きすぎるため省略します 差分を読み込み

ファイルの表示

@@ -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_ */

ファイルの表示

@@ -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 */

ファイルの表示

@@ -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_ */

ファイルの表示

@@ -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;
}

ファイルの表示

@@ -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_ */

ファイルの表示

@@ -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_ */

ファイルの表示

@@ -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_ */

ファイルの表示

@@ -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_ */

ファイルの表示

@@ -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_ */

ファイルの表示

@@ -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);
}

ファイルの表示

@@ -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;
}

ファイルの表示

@@ -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);
}

ファイルの表示

@@ -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 */

ファイルの表示

@@ -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 */

ファイルの表示

@@ -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 */

ファイルの表示

@@ -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 */

ファイルの表示

@@ -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;
}

ファイルの表示

@@ -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 */

ファイルの表示

@@ -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);
}

ファイルの表示

@@ -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);
}

ファイルの表示

@@ -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;
}

ファイルの表示

@@ -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;
}

ファイルの表示

@@ -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 */

ファイルの表示

@@ -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_ */

ファイルの表示

@@ -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 */

ファイルの表示

@@ -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_ */

ファイルの表示

@@ -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;
}

ファイルの表示

@@ -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__ */

ファイルの表示

@@ -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_ */

ファイルの表示

@@ -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_ */

ファイルの表示

@@ -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_ */

ファイルの表示

@@ -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);
}

ファイルの表示

@@ -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;
}

ファイルの表示

@@ -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

ファイルの表示

@@ -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;
}

ファイルの表示

@@ -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

ファイルの表示

@@ -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

ファイルの表示

@@ -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 */

ファイルの表示

@@ -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

ファイルの表示

@@ -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

ファイルの表示

@@ -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

変更されたファイルが多すぎるため、一部のファイルは表示されません さらに表示