qcacmn: Add Support for request control path stats

Add support in cp stats component for the control path
stats infrastructure provided by firmware via
WMI_REQUEST_CTRL_PATH_STATS_CMDID and
WMI_CTRL_PATH_STATS_EVENTID. Also add support for TWT
type operations over this infrastructure.

Change-Id: I154babff396ac39c11c7548ad91cc4dc0d0c52af
CRs-Fixed: 2847603
Dieser Commit ist enthalten in:
Rajasekaran Kalidoss
2021-01-16 05:54:36 +05:30
committet von snandini
Ursprung a20bb6caa3
Commit b60109631e
7 geänderte Dateien mit 323 neuen und 10 gelöschten Zeilen

Datei anzeigen

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
* 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
@@ -36,10 +36,16 @@
#include "wlan_cp_stats_cmn_defs.h"
#include <wlan_cp_stats_utils_api.h>
#include <wlan_cp_stats_ext_type.h>
#include <wlan_cp_stats_public_structs.h>
/* noise floor */
#define CP_STATS_TGT_NOISE_FLOOR_DBM (-96)
#ifdef WLAN_SUPPORT_INFRA_CTRL_PATH_STATS
typedef void (*get_infra_cp_stats_cb)(struct infra_cp_stats_event *ev,
void *cookie);
#endif
/**
* struct psoc_cp_stats - defines cp stats at psoc object
* @psoc_obj: pointer to psoc
@@ -57,6 +63,11 @@ struct psoc_cp_stats {
struct psoc_cmn_cp_stats *cmn_stats;
psoc_ext_cp_stats_t *obj_stats;
void (*legacy_stats_cb)(void *stats);
#ifdef WLAN_SUPPORT_INFRA_CTRL_PATH_STATS
void (*get_infra_cp_stats)(struct infra_cp_stats_event *ev,
void *cookie);
void *infra_cp_stats_req_context;
#endif
};
/**

Datei anzeigen

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2018-2020 The Linux Foundation. All rights reserved.
* 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
@@ -29,6 +29,7 @@
#include "wlan_cp_stats_ol_api.h"
#include <wlan_cp_stats_ucfg_api.h>
#include "wlan_cp_stats_utils_api.h"
#include <target_if_cp_stats.h>
QDF_STATUS
wlan_cp_stats_psoc_obj_create_handler(struct wlan_objmgr_psoc *psoc, void *arg)
@@ -400,3 +401,66 @@ wlan_cp_stats_peer_obj_destroy_handler(struct wlan_objmgr_peer *peer, void *arg)
cp_stats_debug("peer cp stats object dettached");
return QDF_STATUS_SUCCESS;
}
#ifdef WLAN_SUPPORT_INFRA_CTRL_PATH_STATS
QDF_STATUS
wlan_cp_stats_infra_cp_register_resp_cb(struct wlan_objmgr_psoc *psoc,
struct infra_cp_stats_cmd_info *req)
{
struct psoc_cp_stats *psoc_cp_stats_priv;
psoc_cp_stats_priv = wlan_cp_stats_get_psoc_stats_obj(psoc);
if (!psoc_cp_stats_priv) {
cp_stats_err("psoc cp stats object is null");
return QDF_STATUS_E_NULL_VALUE;
}
wlan_cp_stats_psoc_obj_lock(psoc_cp_stats_priv);
psoc_cp_stats_priv->get_infra_cp_stats = req->infra_cp_stats_resp_cb;
psoc_cp_stats_priv->infra_cp_stats_req_context = req->request_cookie;
wlan_cp_stats_psoc_obj_unlock(psoc_cp_stats_priv);
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_cp_stats_infra_cp_get_context(struct wlan_objmgr_psoc *psoc,
get_infra_cp_stats_cb *resp_cb,
void **context)
{
struct psoc_cp_stats *psoc_cp_stats_priv;
psoc_cp_stats_priv = wlan_cp_stats_get_psoc_stats_obj(psoc);
if (!psoc_cp_stats_priv) {
cp_stats_err("psoc cp stats object is null");
return QDF_STATUS_E_NULL_VALUE;
}
wlan_cp_stats_psoc_obj_lock(psoc_cp_stats_priv);
*resp_cb = psoc_cp_stats_priv->get_infra_cp_stats;
*context = psoc_cp_stats_priv->infra_cp_stats_req_context;
wlan_cp_stats_psoc_obj_unlock(psoc_cp_stats_priv);
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_cp_stats_send_infra_cp_req(struct wlan_objmgr_psoc *psoc,
struct infra_cp_stats_cmd_info *req)
{
struct wlan_lmac_if_cp_stats_tx_ops *tx_ops;
tx_ops = target_if_cp_stats_get_tx_ops(psoc);
if (!tx_ops) {
cp_stats_err("could not get tx_ops");
return QDF_STATUS_E_NULL_VALUE;
}
if (!tx_ops->send_req_infra_cp_stats) {
cp_stats_err("could not get send_req_infra_twt_stats");
return QDF_STATUS_E_NULL_VALUE;
}
return tx_ops->send_req_infra_cp_stats(psoc, req);
}
#endif /* WLAN_SUPPORT_INFRA_CTRL_PATH_STATS */

Datei anzeigen

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2018, 2020 The Linux Foundation. All rights reserved.
* 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
@@ -124,6 +124,47 @@ QDF_STATUS wlan_cp_stats_peer_obj_create_handler(
QDF_STATUS wlan_cp_stats_peer_obj_destroy_handler(
struct wlan_objmgr_peer *peer, void *data);
#ifdef WLAN_SUPPORT_INFRA_CTRL_PATH_STATS
/**
* wlan_cp_stats_infra_cp_register_resp_cb() - Register the response callback
* and cookie in the psoc mc_stats object
* @psoc: pointer to psoc object
* @req: pointer to request parameter structure
*
* Return: QDF_STATUS_SUCCESS on Success, other QDF_STATUS error codes on
* failure
*/
QDF_STATUS
wlan_cp_stats_infra_cp_register_resp_cb(struct wlan_objmgr_psoc *psoc,
struct infra_cp_stats_cmd_info *req);
/**
* wlan_cp_stats_infra_cp_get_context() - get the context and callback
* for sending response
* @psoc: pointer to psoc object
* @resp_cb: pointer to store the response callback
* @context: pointer to store context
*
* Return: QDF_STATUS_SUCCESS on Success, other QDF_STATUS error codes on
* failure
*/
QDF_STATUS
wlan_cp_stats_infra_cp_get_context(struct wlan_objmgr_psoc *psoc,
get_infra_cp_stats_cb *resp_cb,
void **context);
/**
* wlan_cp_stats_send_infra_cp_req() - API to send infra cp stats request to
* lmac
* @psoc: pointer to psoc object
* @req: pointer to infra cp stats request
*
* Return: QDF_STATUS_SUCCESS on Success, other QDF_STATUS error codes on
* failure
*/
QDF_STATUS
wlan_cp_stats_send_infra_cp_req(struct wlan_objmgr_psoc *psoc,
struct infra_cp_stats_cmd_info *req);
#endif /* WLAN_SUPPORT_INFRA_CTRL_PATH_STATS */
#endif /* QCA_SUPPORT_CP_STATS */
#endif /* __WLAN_CP_STATS_OBJ_MGR_HANDLER_H__ */

Datei anzeigen

@@ -0,0 +1,144 @@
/*
* 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: contains cp_stats structure definitions
*/
#ifndef _WLAN_CP_STATS_PUBLIC_STRUCTS_H_
#define _WLAN_CP_STATS_PUBLIC_STRUCTS_H_
#define CTRL_PATH_STATS_MAX_MAC_ADDR 1
#define CTRL_PATH_STATS_MAX_PDEV_ID 1
#define CTRL_PATH_STATS_MAX_VDEV_ID 1
#define INFRA_CP_STATS_MAX_REQ_TWT_DIALOG_ID 1
/*
* Maximum of 1 TWT session can be supported per vdev.
* This can be extended later to support more sessions.
* if there is a request to retrieve stats for all existing
* TWT sessions then response path can have multiple session
* stats.
*/
#define INFRA_CP_STATS_MAX_RESP_TWT_DIALOG_ID 1
#ifdef WLAN_SUPPORT_TWT
/**
* struct twt_infra_cp_stats_event - TWT statistics event structure
* @vdev_id: virtual interface id
* @peer_mac_addr: peer mac address corresponding to a TWT session
* @dialog_id: Represents dialog_id of the TWT session
* @num_sp_cycles: Number of TWT service period elapsed so far
* @avg_sp_dur_us: Average of actual wake duration observed so far
* @min_sp_dur_us: Minimum value of wake duration observed across
* @max_sp_dur_us: Maximum value of wake duration observed
* @tx_mpdu_per_sp: Average number of MPDU's transmitted successfully
* @rx_mpdu_per_sp: Average number of MPDU's received successfully
* @tx_bytes_per_sp: Average number of bytes transmitted successfully
* @rx_bytes_per_sp: Average number of bytes received successfully
*/
struct twt_infra_cp_stats_event {
uint8_t vdev_id;
struct qdf_mac_addr peer_macaddr;
uint32_t dialog_id;
uint32_t status;
uint32_t num_sp_cycles;
uint32_t avg_sp_dur_us;
uint32_t min_sp_dur_us;
uint32_t max_sp_dur_us;
uint32_t tx_mpdu_per_sp;
uint32_t rx_mpdu_per_sp;
uint32_t tx_bytes_per_sp;
uint32_t rx_bytes_per_sp;
};
#endif /* WLAN_SUPPORT_TWT */
/**
* struct infra_cp_stats_event - Event structure to store stats
* @action: action for which this response was recevied
* (get/reset/start/stop)
* @request_id: request cookie sent to Firmware in the command
* @status: status of the infra_cp_stats command processing
* @num_twt_infra_cp_stats: number of twt_infra_cp_stats buffers
* available
* @twt_infra_cp_stats: pointer to TWT session statistics structures
*
* This structure is used to store the statistics information
* extracted from firmware event(wmi_pdev_cp_fwstats_eventid)
*/
struct infra_cp_stats_event {
uint32_t action;
uint32_t request_id;
uint32_t status;
#ifdef WLAN_SUPPORT_TWT
uint32_t num_twt_infra_cp_stats;
struct twt_infra_cp_stats_event *twt_infra_cp_stats;
#endif
/* Extend with other required infra_cp_stats structs */
};
enum infra_cp_stats_action {
ACTION_REQ_CTRL_PATH_STAT_GET = 0,
ACTION_REQ_CTRL_PATH_STAT_RESET,
ACTION_REQ_CTRL_PATH_STAT_START,
ACTION_REQ_CTRL_PATH_STAT_STOP,
};
enum infra_cp_stats_id {
TYPE_REQ_CTRL_PATH_PDEV_TX_STAT = 0,
TYPE_REQ_CTRL_PATH_VDEV_EXTD_STAT,
TYPE_REQ_CTRL_PATH_MEM_STAT,
TYPE_REQ_CTRL_PATH_TWT_STAT,
};
/**
* struct infra_cp_stats_cmd_info - details of infra cp stats request
* @stats_id: ID of the statistics type requested
* @action: action to be performed (get/reset/start/stop)
* @request_cookie: osif request cookie
* @request_id: request id cookie to FW
* @num_pdev_ids: number of pdev ids in the request
* @pdev_id: array of pdev_ids
* @num_vdev_ids: number of vdev ids in the request
* @vdev_id: array of vdev_ids
* @num_mac_addr_list: number of mac addresses in the request
* @peer_mac_addr: array of mac addresses
* @dialog_id: This is a TWT specific field. only one dialog_id
* can be specified for TWT stats. 0 to 254 are
* valid dialog_id's representing a single TWT session.
* 255 represents all twt sessions
* @infra_cp_stats_resp_cb: callback function to handle the response
*/
struct infra_cp_stats_cmd_info {
enum infra_cp_stats_id stats_id;
enum infra_cp_stats_action action;
void *request_cookie;
uint32_t request_id;
uint32_t num_pdev_ids;
uint32_t pdev_id[CTRL_PATH_STATS_MAX_PDEV_ID];
uint32_t num_vdev_ids;
uint32_t vdev_id[CTRL_PATH_STATS_MAX_VDEV_ID];
uint32_t num_mac_addr_list;
uint8_t peer_mac_addr[CTRL_PATH_STATS_MAX_MAC_ADDR][QDF_MAC_ADDR_SIZE];
#ifdef WLAN_SUPPORT_TWT
uint32_t dialog_id;
#endif
void (*infra_cp_stats_resp_cb)(struct infra_cp_stats_event *ev,
void *cookie);
};
#endif

Datei anzeigen

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2018 The Linux Foundation. All rights reserved.
* 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
@@ -30,5 +30,29 @@
#include "../../core/src/wlan_cp_stats_defs.h"
#include "../../core/src/wlan_cp_stats_cmn_api_i.h"
/**
* @ucfg_infra_cp_stats_register_resp_cb() - Register the response callback
* and cookie in the psoc mc_stats object
* @psoc: pointer to psoc object
* @req: pointer to request parameter structure
*
* Return: QDF_STATUS_SUCCESS on Success, other QDF_STATUS error codes on
* failure
*/
QDF_STATUS
ucfg_infra_cp_stats_register_resp_cb(struct wlan_objmgr_psoc *psoc,
struct infra_cp_stats_cmd_info *req);
/**
* @ucfg_send_infra_cp_stats_request() - send a infra cp stats command
* @vdev: pointer to vdev object
* @req: pointer to request parameter structure
*
* Return: QDF_STATUS_SUCCESS on Success, other QDF_STATUS error codes
* on failure
*/
QDF_STATUS
ucfg_send_infra_cp_stats_request(struct wlan_objmgr_vdev *vdev,
struct infra_cp_stats_cmd_info *req);
#endif /* QCA_SUPPORT_CP_STATS */
#endif /* __WLAN_CP_STATS_UCFG_API_H__ */

Datei anzeigen

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2018 The Linux Foundation. All rights reserved.
* 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
@@ -17,12 +17,27 @@
*/
/**
* DOC: wlan_cp_stats_ucfg_api.h
* DOC: wlan_cp_stats_ucfg_api.c
*
* This file provide API definitions required for northbound interaction
*/
#ifndef __WLAN_CP_STATS_UCFG_API_H__
#define __WLAN_CP_STATS_UCFG_API_H__
#include <wlan_cp_stats_utils_api.h>
#include <wlan_cp_stats_ucfg_api.h>
#include "../../core/src/wlan_cp_stats_obj_mgr_handler.h"
#endif /* __WLAN_CP_STATS_UCFG_API_H__ */
#ifdef WLAN_SUPPORT_INFRA_CTRL_PATH_STATS
QDF_STATUS
ucfg_infra_cp_stats_register_resp_cb(struct wlan_objmgr_psoc *psoc,
struct infra_cp_stats_cmd_info *req)
{
return wlan_cp_stats_infra_cp_register_resp_cb(psoc, req);
}
QDF_STATUS
ucfg_send_infra_cp_stats_request(struct wlan_objmgr_vdev *vdev,
struct infra_cp_stats_cmd_info *req)
{
return wlan_cp_stats_send_infra_cp_req(wlan_vdev_get_psoc(vdev), req);
}
#endif /* WLAN_SUPPORT_INFRA_CTRL_PATH_STATS */

Datei anzeigen

@@ -87,6 +87,7 @@ struct dbr_module_config;
#endif
#ifdef QCA_SUPPORT_CP_STATS
#include <wlan_cp_stats_public_structs.h>
/**
* typedef cp_stats_event - Definition of cp stats event
@@ -124,6 +125,8 @@ typedef struct wake_lock_stats stats_wake_lock;
* to FW
* @set_pdev_stats_update_period: function pointer to set pdev stats update
* period to FW
* @send_req_infra_cp_stats: function pointer to send infra cp stats request
* command to FW
*/
struct wlan_lmac_if_cp_stats_tx_ops {
QDF_STATUS (*cp_stats_attach)(struct wlan_objmgr_psoc *psoc);
@@ -141,17 +144,28 @@ struct wlan_lmac_if_cp_stats_tx_ops {
QDF_STATUS (*set_pdev_stats_update_period)(
struct wlan_objmgr_psoc *psoc,
uint8_t pdev_id, uint32_t val);
#ifdef WLAN_SUPPORT_INFRA_CTRL_PATH_STATS
QDF_STATUS (*send_req_infra_cp_stats)(
struct wlan_objmgr_psoc *psoc,
struct infra_cp_stats_cmd_info *req);
#endif
};
/**
* struct wlan_lmac_if_cp_stats_rx_ops - defines southbound rx callbacks for
* control plane statistics component
* @cp_stats_rx_event_handler: function pointer to rx FW events
* @process_stats_event: function pointer to process stats event
*/
struct wlan_lmac_if_cp_stats_rx_ops {
QDF_STATUS (*cp_stats_rx_event_handler)(struct wlan_objmgr_vdev *vdev);
QDF_STATUS (*process_stats_event)(struct wlan_objmgr_psoc *psoc,
cp_stats_event *ev);
struct stats_event *ev);
#ifdef WLAN_SUPPORT_INFRA_CTRL_PATH_STATS
QDF_STATUS
(*process_infra_stats_event)(struct wlan_objmgr_psoc *psoc,
struct infra_cp_stats_event *infra_event);
#endif /* WLAN_SUPPORT_INFRA_CTRL_PATH_STATS */
};
#endif