qcacmn: vdev stats Support for MLO Hybrid Mode
Add vdev stats support for DP MLO Unified and Hybrid Mode. Add new CDP API for getting vdev stats for NON_MLD interface. Add support to get vdev stats for specific vdev which is a part of MLO. Change-Id: I72c8b25958649d473e1b65cee21810cd86951187 CRs-Fixed: 3455607
Dieser Commit ist enthalten in:

committet von
Madan Koyyalamudi

Ursprung
fa5b39c322
Commit
ef68ac521f
@@ -1240,4 +1240,32 @@ static inline QDF_STATUS cdp_clear_pdev_obss_pd_stats(
|
||||
return soc->ops->host_stats_ops->clear_pdev_obss_pd_stats(
|
||||
soc, pdev_id, req);
|
||||
}
|
||||
|
||||
/*
|
||||
* cdp_host_get_interface_stats - Get vdev stats for ath interface
|
||||
* @soc: soc handle
|
||||
* @vdev_id: vdev_id
|
||||
* @buf: buffer to hold vdev_stats
|
||||
*
|
||||
* return: QDF_STATUS
|
||||
*/
|
||||
static inline QDF_STATUS
|
||||
cdp_host_get_interface_stats(ol_txrx_soc_handle soc,
|
||||
uint8_t vdev_id,
|
||||
struct cdp_vdev_stats *buf)
|
||||
{
|
||||
if (!soc || !soc->ops) {
|
||||
QDF_BUG(0);
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
if (!soc->ops->host_stats_ops ||
|
||||
!soc->ops->host_stats_ops->txrx_get_interface_stats)
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
|
||||
return soc->ops->host_stats_ops->txrx_get_interface_stats(soc,
|
||||
vdev_id,
|
||||
buf,
|
||||
true);
|
||||
}
|
||||
#endif /* _CDP_TXRX_HOST_STATS_H_ */
|
||||
|
@@ -190,12 +190,14 @@ static inline void cdp_mlo_update_delta_tqm(ol_txrx_soc_handle soc,
|
||||
* @soc: soc handle
|
||||
* @vdev_id: vdev_id of one of the vdev's of the MLD group
|
||||
* @buf: buffer to hold vdev_stats
|
||||
* @link_vdev_only: flag to indicate if stats are required for specific vdev
|
||||
*
|
||||
* return: QDF_STATUS
|
||||
*/
|
||||
static inline QDF_STATUS
|
||||
cdp_mlo_get_mld_vdev_stats(ol_txrx_soc_handle soc,
|
||||
uint8_t vdev_id, struct cdp_vdev_stats *buf)
|
||||
uint8_t vdev_id, struct cdp_vdev_stats *buf,
|
||||
bool link_vdev_only)
|
||||
{
|
||||
if (!soc || !soc->ops) {
|
||||
QDF_BUG(0);
|
||||
@@ -205,6 +207,9 @@ cdp_mlo_get_mld_vdev_stats(ol_txrx_soc_handle soc,
|
||||
if (!soc->ops->mlo_ops || !soc->ops->mlo_ops->mlo_get_mld_vdev_stats)
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
|
||||
return soc->ops->mlo_ops->mlo_get_mld_vdev_stats(soc, vdev_id, buf);
|
||||
return soc->ops->mlo_ops->mlo_get_mld_vdev_stats(soc,
|
||||
vdev_id,
|
||||
buf,
|
||||
link_vdev_only);
|
||||
}
|
||||
#endif /*_CDP_TXRX_MLO_H_*/
|
||||
|
@@ -180,7 +180,8 @@ struct cdp_mlo_ops {
|
||||
void (*mlo_update_mlo_ts_offset)(struct cdp_soc_t *soc_hdl,
|
||||
uint64_t offset);
|
||||
QDF_STATUS (*mlo_get_mld_vdev_stats)(struct cdp_soc_t *soc,
|
||||
uint8_t vdev_id, void *buf);
|
||||
uint8_t vdev_id, void *buf,
|
||||
bool link_vdev_only);
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -1167,6 +1168,7 @@ struct cdp_mon_ops {
|
||||
* @txrx_get_peer_extd_rate_link_stats:
|
||||
* @get_pdev_obss_stats:
|
||||
* @clear_pdev_obss_pd_stats:
|
||||
* @txrx_get_interface_stats:
|
||||
*/
|
||||
struct cdp_host_stats_ops {
|
||||
int (*txrx_host_stats_get)(struct cdp_soc_t *soc, uint8_t vdev_id,
|
||||
@@ -1253,7 +1255,7 @@ struct cdp_host_stats_ops {
|
||||
QDF_STATUS
|
||||
(*txrx_reset_peer_stats)(struct cdp_soc_t *soc,
|
||||
uint8_t vdev_id, uint8_t *peer_mac);
|
||||
int
|
||||
QDF_STATUS
|
||||
(*txrx_get_vdev_stats)(struct cdp_soc_t *soc, uint8_t vdev_id,
|
||||
void *buf, bool is_aggregate);
|
||||
int
|
||||
@@ -1366,6 +1368,10 @@ struct cdp_host_stats_ops {
|
||||
QDF_STATUS (*clear_pdev_obss_pd_stats)(struct cdp_soc_t *soc,
|
||||
uint8_t pdev_id,
|
||||
struct cdp_txrx_stats_req *req);
|
||||
QDF_STATUS (*txrx_get_interface_stats)(struct cdp_soc_t *soc,
|
||||
uint8_t vdev_id,
|
||||
void *buf,
|
||||
bool is_aggregate);
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -2379,6 +2379,17 @@ static void dp_txrx_set_mlo_mcast_primary_vdev_param_be(
|
||||
WDI_NO_VAL, params.pdev_id);
|
||||
}
|
||||
}
|
||||
|
||||
static
|
||||
void dp_get_vdev_stats_for_unmap_peer_be(struct dp_vdev *vdev,
|
||||
struct dp_peer *peer,
|
||||
struct cdp_vdev_stats **vdev_stats)
|
||||
{
|
||||
struct dp_vdev_be *be_vdev = dp_get_be_vdev_from_dp_vdev(vdev);
|
||||
|
||||
if (!IS_DP_LEGACY_PEER(peer))
|
||||
*vdev_stats = &be_vdev->mlo_stats;
|
||||
}
|
||||
#else
|
||||
static void dp_txrx_set_mlo_mcast_primary_vdev_param_be(
|
||||
struct dp_vdev *vdev,
|
||||
@@ -2470,6 +2481,13 @@ QDF_STATUS dp_txrx_get_vdev_mcast_param_be(struct dp_soc *soc,
|
||||
{
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static
|
||||
void dp_get_vdev_stats_for_unmap_peer_be(struct dp_vdev *vdev,
|
||||
struct dp_peer *peer,
|
||||
struct cdp_vdev_stats **vdev_stats)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef DP_TX_IMPLICIT_RBM_MAPPING
|
||||
@@ -2902,6 +2920,8 @@ void dp_initialize_arch_ops_be(struct dp_arch_ops *arch_ops)
|
||||
arch_ops->reo_remap_config = dp_reo_remap_config_be;
|
||||
arch_ops->txrx_get_vdev_mcast_param = dp_txrx_get_vdev_mcast_param_be;
|
||||
arch_ops->txrx_srng_init = dp_srng_init_be;
|
||||
arch_ops->dp_get_vdev_stats_for_unmap_peer =
|
||||
dp_get_vdev_stats_for_unmap_peer_be;
|
||||
#if defined(DP_POWER_SAVE) || defined(FEATURE_RUNTIME_PM)
|
||||
arch_ops->dp_update_ring_hptp = dp_update_ring_hptp;
|
||||
#endif
|
||||
|
@@ -399,6 +399,7 @@ struct dp_pdev_be {
|
||||
* @bank_id: bank_id to be used for TX
|
||||
* @vdev_id_check_en: flag if HW vdev_id check is enabled for vdev
|
||||
* @partner_vdev_list: partner list used for Intra-BSS
|
||||
* @mlo_stats: structure to hold stats for mlo unmapped peers
|
||||
* @seq_num: DP MLO seq number
|
||||
* @mcast_primary: MLO Mcast primary vdev
|
||||
*/
|
||||
@@ -408,6 +409,7 @@ struct dp_vdev_be {
|
||||
uint8_t vdev_id_check_en;
|
||||
#ifdef WLAN_MLO_MULTI_CHIP
|
||||
uint8_t partner_vdev_list[WLAN_MAX_MLO_CHIPS][WLAN_MAX_MLO_LINKS_PER_SOC];
|
||||
struct cdp_vdev_stats mlo_stats;
|
||||
#ifdef WLAN_FEATURE_11BE_MLO
|
||||
#ifdef WLAN_MCAST_MLO
|
||||
uint16_t seq_num;
|
||||
|
@@ -544,27 +544,178 @@ static void dp_mlo_update_mlo_ts_offset(struct cdp_soc_t *soc_hdl,
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MLO_SINGLE_DEV
|
||||
static void dp_mlo_aggregate_mld_vdev_stats(struct dp_vdev_be *be_vdev,
|
||||
struct dp_vdev *ptnr_vdev,
|
||||
void *arg)
|
||||
/**
|
||||
* dp_aggregate_vdev_ingress_stats() - aggregate vdev ingress stats
|
||||
* @tgt_vdev_stats: target vdev buffer
|
||||
* @src_vdev_stats: source vdev buffer
|
||||
*
|
||||
* return: void
|
||||
*/
|
||||
static inline
|
||||
void dp_aggregate_vdev_ingress_stats(
|
||||
struct cdp_vdev_stats *tgt_vdev_stats,
|
||||
struct cdp_vdev_stats *src_vdev_stats)
|
||||
{
|
||||
struct cdp_vdev_stats *tgt_vdev_stats = (struct cdp_vdev_stats *)arg;
|
||||
struct cdp_vdev_stats *src_vdev_stats = &ptnr_vdev->stats;
|
||||
|
||||
/* Aggregate vdev ingress stats */
|
||||
DP_UPDATE_INGRESS_STATS(tgt_vdev_stats, src_vdev_stats);
|
||||
}
|
||||
|
||||
/**
|
||||
* dp_aggregate_vdev_stats_for_unmapped_peers() - aggregate unmap peer stats
|
||||
* @tgt_vdev_stats: target vdev buffer
|
||||
* @src_vdev_stats: source vdev buffer
|
||||
*
|
||||
* return: void
|
||||
*/
|
||||
static inline
|
||||
void dp_aggregate_vdev_stats_for_unmapped_peers(
|
||||
struct cdp_vdev_stats *tgt_vdev_stats,
|
||||
struct cdp_vdev_stats *src_vdev_stats)
|
||||
{
|
||||
/* Aggregate unmapped peers stats */
|
||||
DP_UPDATE_PER_PKT_STATS(tgt_vdev_stats, src_vdev_stats);
|
||||
DP_UPDATE_EXTD_STATS(tgt_vdev_stats, src_vdev_stats);
|
||||
DP_UPDATE_VDEV_STATS_FOR_UNMAPPED_PEERS(tgt_vdev_stats, src_vdev_stats);
|
||||
}
|
||||
|
||||
/* Aggregate associated peers stats */
|
||||
dp_vdev_iterate_peer(ptnr_vdev, dp_update_vdev_stats, tgt_vdev_stats,
|
||||
/**
|
||||
* dp_aggregate_all_vdev_stats() - aggregate vdev ingress and unmap peer stats
|
||||
* @tgt_vdev_stats: target vdev buffer
|
||||
* @src_vdev_stats: source vdev buffer
|
||||
*
|
||||
* return: void
|
||||
*/
|
||||
static inline
|
||||
void dp_aggregate_all_vdev_stats(
|
||||
struct cdp_vdev_stats *tgt_vdev_stats,
|
||||
struct cdp_vdev_stats *src_vdev_stats)
|
||||
{
|
||||
dp_aggregate_vdev_ingress_stats(tgt_vdev_stats, src_vdev_stats);
|
||||
dp_aggregate_vdev_stats_for_unmapped_peers(tgt_vdev_stats,
|
||||
src_vdev_stats);
|
||||
}
|
||||
|
||||
/**
|
||||
* dp_aggregate_interface_stats_based_on_peer_type() - aggregate stats at
|
||||
* VDEV level based on peer type connected to vdev
|
||||
* @vdev: DP VDEV handle
|
||||
* @vdev_stats: target vdev stats pointer
|
||||
* @peer_type: type of peer - MLO Link or Legacy peer
|
||||
*
|
||||
* return: void
|
||||
*/
|
||||
static
|
||||
void dp_aggregate_interface_stats_based_on_peer_type(
|
||||
struct dp_vdev *vdev,
|
||||
struct cdp_vdev_stats *vdev_stats,
|
||||
enum dp_peer_type peer_type)
|
||||
{
|
||||
struct cdp_vdev_stats *tgt_vdev_stats = NULL;
|
||||
struct dp_vdev_be *be_vdev = NULL;
|
||||
|
||||
if (!vdev || !vdev->pdev)
|
||||
return;
|
||||
|
||||
tgt_vdev_stats = vdev_stats;
|
||||
be_vdev = dp_get_be_vdev_from_dp_vdev(vdev);
|
||||
if (!be_vdev)
|
||||
return;
|
||||
|
||||
if (peer_type == DP_PEER_TYPE_LEGACY) {
|
||||
dp_aggregate_all_vdev_stats(tgt_vdev_stats,
|
||||
&vdev->stats);
|
||||
} else {
|
||||
dp_aggregate_vdev_ingress_stats(tgt_vdev_stats,
|
||||
&vdev->stats);
|
||||
dp_aggregate_vdev_stats_for_unmapped_peers(
|
||||
tgt_vdev_stats,
|
||||
&be_vdev->mlo_stats);
|
||||
}
|
||||
|
||||
/* Aggregate associated peer stats */
|
||||
dp_vdev_iterate_specific_peer_type(vdev,
|
||||
dp_update_vdev_stats,
|
||||
vdev_stats,
|
||||
DP_MOD_ID_GENERIC_STATS,
|
||||
peer_type);
|
||||
}
|
||||
|
||||
/**
|
||||
* dp_aggregate_interface_stats() - aggregate stats at VDEV level
|
||||
* @vdev: DP VDEV handle
|
||||
* @vdev_stats: target vdev stats pointer
|
||||
*
|
||||
* return: void
|
||||
*/
|
||||
static
|
||||
void dp_aggregate_interface_stats(struct dp_vdev *vdev,
|
||||
struct cdp_vdev_stats *vdev_stats)
|
||||
{
|
||||
struct dp_vdev_be *be_vdev = NULL;
|
||||
|
||||
if (!vdev || !vdev->pdev)
|
||||
return;
|
||||
|
||||
be_vdev = dp_get_be_vdev_from_dp_vdev(vdev);
|
||||
if (!be_vdev)
|
||||
return;
|
||||
|
||||
dp_aggregate_all_vdev_stats(vdev_stats, &be_vdev->mlo_stats);
|
||||
dp_aggregate_all_vdev_stats(vdev_stats, &vdev->stats);
|
||||
|
||||
dp_vdev_iterate_peer(vdev, dp_update_vdev_stats, vdev_stats,
|
||||
DP_MOD_ID_GENERIC_STATS);
|
||||
|
||||
dp_update_vdev_rate_stats(vdev_stats, &vdev->stats);
|
||||
|
||||
#if defined(FEATURE_PERPKT_INFO) && WDI_EVENT_ENABLE
|
||||
dp_wdi_event_handler(WDI_EVENT_UPDATE_DP_STATS, vdev->pdev->soc,
|
||||
vdev_stats, vdev->vdev_id,
|
||||
UPDATE_VDEV_STATS, vdev->pdev->pdev_id);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* dp_mlo_aggr_ptnr_iface_stats() - aggregate mlo partner vdev stats
|
||||
* @be_vdev: vdev handle
|
||||
* @ptnr_vdev: partner vdev handle
|
||||
* @arg: target buffer for aggregation
|
||||
*
|
||||
* return: void
|
||||
*/
|
||||
static
|
||||
void dp_mlo_aggr_ptnr_iface_stats(struct dp_vdev_be *be_vdev,
|
||||
struct dp_vdev *ptnr_vdev,
|
||||
void *arg)
|
||||
{
|
||||
struct cdp_vdev_stats *tgt_vdev_stats = (struct cdp_vdev_stats *)arg;
|
||||
|
||||
dp_aggregate_interface_stats(ptnr_vdev, tgt_vdev_stats);
|
||||
}
|
||||
|
||||
/**
|
||||
* dp_mlo_aggr_ptnr_iface_stats_mlo_links() - aggregate mlo partner vdev stats
|
||||
* based on peer type
|
||||
* @be_vdev: vdev handle
|
||||
* @ptnr_vdev: partner vdev handle
|
||||
* @arg: target buffer for aggregation
|
||||
*
|
||||
* return: void
|
||||
*/
|
||||
static
|
||||
void dp_mlo_aggr_ptnr_iface_stats_mlo_links(
|
||||
struct dp_vdev_be *be_vdev,
|
||||
struct dp_vdev *ptnr_vdev,
|
||||
void *arg)
|
||||
{
|
||||
struct cdp_vdev_stats *tgt_vdev_stats = (struct cdp_vdev_stats *)arg;
|
||||
|
||||
dp_aggregate_interface_stats_based_on_peer_type(ptnr_vdev,
|
||||
tgt_vdev_stats,
|
||||
DP_PEER_TYPE_MLO_LINK);
|
||||
}
|
||||
|
||||
static QDF_STATUS dp_mlo_get_mld_vdev_stats(struct cdp_soc_t *soc_hdl,
|
||||
uint8_t vdev_id, void *buf)
|
||||
uint8_t vdev_id, void *buf,
|
||||
bool link_vdev_only)
|
||||
{
|
||||
struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
|
||||
struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
|
||||
@@ -584,12 +735,56 @@ static QDF_STATUS dp_mlo_get_mld_vdev_stats(struct cdp_soc_t *soc_hdl,
|
||||
|
||||
vdev_stats = (struct cdp_vdev_stats *)buf;
|
||||
|
||||
dp_aggregate_vdev_stats(vdev, buf);
|
||||
if (DP_MLD_MODE_HYBRID_NONBOND == soc->mld_mode_ap &&
|
||||
vdev->opmode == wlan_op_mode_ap) {
|
||||
dp_aggregate_interface_stats_based_on_peer_type(
|
||||
vdev, buf,
|
||||
DP_PEER_TYPE_MLO_LINK);
|
||||
if (link_vdev_only)
|
||||
goto complete;
|
||||
|
||||
/* Aggregate stats from partner vdevs */
|
||||
dp_mlo_iter_ptnr_vdev(be_soc, vdev_be,
|
||||
dp_mlo_aggregate_mld_vdev_stats, buf,
|
||||
DP_MOD_ID_GENERIC_STATS);
|
||||
/* Aggregate stats from partner vdevs */
|
||||
dp_mlo_iter_ptnr_vdev(be_soc, vdev_be,
|
||||
dp_mlo_aggr_ptnr_iface_stats_mlo_links,
|
||||
buf,
|
||||
DP_MOD_ID_GENERIC_STATS);
|
||||
} else {
|
||||
dp_aggregate_interface_stats(vdev, buf);
|
||||
|
||||
if (link_vdev_only)
|
||||
goto complete;
|
||||
|
||||
/* Aggregate stats from partner vdevs */
|
||||
dp_mlo_iter_ptnr_vdev(be_soc, vdev_be,
|
||||
dp_mlo_aggr_ptnr_iface_stats, buf,
|
||||
DP_MOD_ID_GENERIC_STATS);
|
||||
}
|
||||
|
||||
complete:
|
||||
dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS);
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
QDF_STATUS
|
||||
dp_txrx_get_interface_stats(struct cdp_soc_t *soc_hdl,
|
||||
uint8_t vdev_id,
|
||||
void *buf,
|
||||
bool is_aggregate)
|
||||
{
|
||||
struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
|
||||
struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
|
||||
DP_MOD_ID_GENERIC_STATS);
|
||||
if (!vdev)
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
|
||||
if (DP_MLD_MODE_HYBRID_NONBOND == soc->mld_mode_ap &&
|
||||
vdev->opmode == wlan_op_mode_ap) {
|
||||
dp_aggregate_interface_stats_based_on_peer_type(
|
||||
vdev, buf,
|
||||
DP_PEER_TYPE_LEGACY);
|
||||
} else {
|
||||
dp_aggregate_interface_stats(vdev, buf);
|
||||
}
|
||||
|
||||
dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS);
|
||||
|
||||
|
@@ -1891,6 +1891,15 @@ void dp_update_vdev_stats_on_peer_unmap(struct dp_vdev *vdev,
|
||||
#define DP_UPDATE_11BE_STATS(_tgtobj, _srcobj)
|
||||
#endif
|
||||
|
||||
#define DP_UPDATE_BASIC_STATS(_tgtobj, _srcobj) \
|
||||
do { \
|
||||
_tgtobj->tx.comp_pkt.num += _srcobj->tx.comp_pkt.num; \
|
||||
_tgtobj->tx.comp_pkt.bytes += _srcobj->tx.comp_pkt.bytes; \
|
||||
_tgtobj->tx.tx_failed += _srcobj->tx.tx_failed; \
|
||||
_tgtobj->rx.to_stack.num += _srcobj->rx.to_stack.num; \
|
||||
_tgtobj->rx.to_stack.bytes += _srcobj->rx.to_stack.bytes; \
|
||||
} while (0)
|
||||
|
||||
#define DP_UPDATE_PER_PKT_STATS(_tgtobj, _srcobj) \
|
||||
do { \
|
||||
uint8_t i; \
|
||||
@@ -2176,6 +2185,13 @@ void dp_update_vdev_stats_on_peer_unmap(struct dp_vdev *vdev,
|
||||
DP_UPDATE_11BE_STATS(_tgtobj, _srcobj); \
|
||||
} while (0)
|
||||
|
||||
#define DP_UPDATE_VDEV_STATS_FOR_UNMAPPED_PEERS(_tgtobj, _srcobj) \
|
||||
do { \
|
||||
DP_UPDATE_BASIC_STATS(_tgtobj, _srcobj); \
|
||||
DP_UPDATE_PER_PKT_STATS(_tgtobj, _srcobj); \
|
||||
DP_UPDATE_EXTD_STATS(_tgtobj, _srcobj); \
|
||||
} while (0)
|
||||
|
||||
#define DP_UPDATE_INGRESS_STATS(_tgtobj, _srcobj) \
|
||||
do { \
|
||||
uint8_t i = 0; \
|
||||
@@ -2832,6 +2848,22 @@ uint32_t dp_reo_status_ring_handler(struct dp_intr *int_ctx,
|
||||
void dp_aggregate_vdev_stats(struct dp_vdev *vdev,
|
||||
struct cdp_vdev_stats *vdev_stats);
|
||||
|
||||
/**
|
||||
* dp_txrx_get_interface_stats() - get vdev stats for ath interface
|
||||
* @soc_hdl: CDP SoC handle
|
||||
* @vdev_id: vdev Id
|
||||
* @buf: buffer for vdev stats
|
||||
* @is_aggregate: for aggregation
|
||||
*
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
|
||||
QDF_STATUS
|
||||
dp_txrx_get_interface_stats(struct cdp_soc_t *soc_hdl,
|
||||
uint8_t vdev_id,
|
||||
void *buf,
|
||||
bool is_aggregate);
|
||||
|
||||
/**
|
||||
* dp_rx_bar_stats_cb() - BAR received stats callback
|
||||
* @soc: SOC handle
|
||||
|
@@ -5737,7 +5737,6 @@ bool dp_check_pdev_exists(struct dp_soc *soc, struct dp_pdev *data)
|
||||
void dp_aggregate_vdev_stats(struct dp_vdev *vdev,
|
||||
struct cdp_vdev_stats *vdev_stats)
|
||||
{
|
||||
|
||||
if (!vdev || !vdev->pdev)
|
||||
return;
|
||||
|
||||
@@ -5752,8 +5751,8 @@ void dp_aggregate_vdev_stats(struct dp_vdev *vdev,
|
||||
|
||||
#if defined(FEATURE_PERPKT_INFO) && WDI_EVENT_ENABLE
|
||||
dp_wdi_event_handler(WDI_EVENT_UPDATE_DP_STATS, vdev->pdev->soc,
|
||||
vdev_stats, vdev->vdev_id,
|
||||
UPDATE_VDEV_STATS, vdev->pdev->pdev_id);
|
||||
vdev_stats, vdev->vdev_id,
|
||||
UPDATE_VDEV_STATS, vdev->pdev->pdev_id);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -8190,10 +8189,11 @@ dp_txrx_reset_peer_stats(struct cdp_soc_t *soc, uint8_t vdev_id,
|
||||
* @buf: buffer for vdev stats
|
||||
* @is_aggregate: are aggregate stats being collected
|
||||
*
|
||||
* Return: int
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
static int dp_txrx_get_vdev_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
|
||||
void *buf, bool is_aggregate)
|
||||
static QDF_STATUS
|
||||
dp_txrx_get_vdev_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
|
||||
void *buf, bool is_aggregate)
|
||||
{
|
||||
struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
|
||||
struct cdp_vdev_stats *vdev_stats;
|
||||
@@ -8201,7 +8201,7 @@ static int dp_txrx_get_vdev_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
|
||||
DP_MOD_ID_CDP);
|
||||
|
||||
if (!vdev)
|
||||
return 1;
|
||||
return QDF_STATUS_E_RESOURCES;
|
||||
|
||||
vdev_stats = (struct cdp_vdev_stats *)buf;
|
||||
|
||||
@@ -8212,7 +8212,7 @@ static int dp_txrx_get_vdev_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
|
||||
}
|
||||
|
||||
dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
|
||||
return 0;
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -10908,6 +10908,11 @@ static struct cdp_host_stats_ops dp_ops_host_stats = {
|
||||
dp_get_peer_extd_rate_link_stats,
|
||||
.get_pdev_obss_stats = dp_get_obss_stats,
|
||||
.clear_pdev_obss_pd_stats = dp_clear_pdev_obss_pd_stats,
|
||||
#ifdef CONFIG_MLO_SINGLE_DEV
|
||||
.txrx_get_interface_stats = dp_txrx_get_interface_stats,
|
||||
#else
|
||||
.txrx_get_interface_stats = dp_txrx_get_vdev_stats,
|
||||
#endif
|
||||
/* TODO */
|
||||
};
|
||||
|
||||
|
@@ -2330,6 +2330,51 @@ dp_peer_update_state(struct dp_soc *soc,
|
||||
QDF_MAC_ADDR_REF(peer->mac_addr.raw));
|
||||
}
|
||||
|
||||
/**
|
||||
* dp_vdev_iterate_specific_peer_type() - API to iterate through vdev peer
|
||||
* list based on type of peer (Legacy or MLD peer)
|
||||
*
|
||||
* @vdev: DP vdev context
|
||||
* @func: function to be called for each peer
|
||||
* @arg: argument need to be passed to func
|
||||
* @mod_id: module_id
|
||||
* @peer_type: type of peer - MLO Link Peer or Legacy Peer
|
||||
*
|
||||
* Return: void
|
||||
*/
|
||||
static inline void
|
||||
dp_vdev_iterate_specific_peer_type(struct dp_vdev *vdev,
|
||||
dp_peer_iter_func *func,
|
||||
void *arg, enum dp_mod_id mod_id,
|
||||
enum dp_peer_type peer_type)
|
||||
{
|
||||
struct dp_peer *peer;
|
||||
struct dp_peer *tmp_peer;
|
||||
struct dp_soc *soc = NULL;
|
||||
|
||||
if (!vdev || !vdev->pdev || !vdev->pdev->soc)
|
||||
return;
|
||||
|
||||
soc = vdev->pdev->soc;
|
||||
|
||||
qdf_spin_lock_bh(&vdev->peer_list_lock);
|
||||
TAILQ_FOREACH_SAFE(peer, &vdev->peer_list,
|
||||
peer_list_elem,
|
||||
tmp_peer) {
|
||||
if (dp_peer_get_ref(soc, peer, mod_id) ==
|
||||
QDF_STATUS_SUCCESS) {
|
||||
if ((peer_type == DP_PEER_TYPE_LEGACY &&
|
||||
(IS_DP_LEGACY_PEER(peer))) ||
|
||||
(peer_type == DP_PEER_TYPE_MLO_LINK &&
|
||||
(IS_MLO_DP_LINK_PEER(peer)))) {
|
||||
(*func)(soc, peer, arg);
|
||||
}
|
||||
dp_peer_unref_delete(peer, mod_id);
|
||||
}
|
||||
}
|
||||
qdf_spin_unlock_bh(&vdev->peer_list_lock);
|
||||
}
|
||||
|
||||
#ifdef REO_SHARED_QREF_TABLE_EN
|
||||
void dp_peer_rx_reo_shared_qaddr_delete(struct dp_soc *soc,
|
||||
struct dp_peer *peer);
|
||||
|
@@ -8661,6 +8661,11 @@ void dp_update_vdev_stats_on_peer_unmap(struct dp_vdev *vdev,
|
||||
uint8_t link_id = 0;
|
||||
struct dp_pdev *pdev = vdev->pdev;
|
||||
|
||||
if (soc && soc->arch_ops.dp_get_vdev_stats_for_unmap_peer)
|
||||
soc->arch_ops.dp_get_vdev_stats_for_unmap_peer(vdev,
|
||||
peer,
|
||||
&vdev_stats);
|
||||
|
||||
txrx_peer = dp_get_txrx_peer(peer);
|
||||
if (!txrx_peer)
|
||||
goto link_stats;
|
||||
|
@@ -328,6 +328,18 @@ enum dp_mod_id {
|
||||
DP_MOD_ID_MAX,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum dp_peer_type - DP peer type
|
||||
* @DP_PEER_TYPE_LEGACY:
|
||||
* @DP_PEER_TYPE_MLO_LINK:
|
||||
* @DP_PEER_TYPE_MLO:
|
||||
*/
|
||||
enum dp_peer_type {
|
||||
DP_PEER_TYPE_LEGACY,
|
||||
DP_PEER_TYPE_MLO_LINK,
|
||||
DP_PEER_TYPE_MLO,
|
||||
};
|
||||
|
||||
#define DP_PDEV_ITERATE_VDEV_LIST(_pdev, _vdev) \
|
||||
TAILQ_FOREACH((_vdev), &(_pdev)->vdev_list, vdev_list_elem)
|
||||
|
||||
@@ -2247,6 +2259,7 @@ enum dp_context_type {
|
||||
* @dp_tx_desc_pool_alloc: Allocate arch specific TX descriptor pool
|
||||
* @dp_tx_desc_pool_free: Free arch specific TX descriptor pool
|
||||
* @txrx_srng_init: Init txrx srng
|
||||
* @dp_get_vdev_stats_for_unmap_peer: Get vdev stats pointer for unmap peer
|
||||
* @ppeds_handle_attached:
|
||||
* @txrx_soc_ppeds_interrupt_stop:
|
||||
* @txrx_soc_ppeds_interrupt_start:
|
||||
@@ -2493,6 +2506,11 @@ struct dp_arch_ops {
|
||||
|
||||
QDF_STATUS (*txrx_srng_init)(struct dp_soc *soc, struct dp_srng *srng,
|
||||
int ring_type, int ring_num, int mac_id);
|
||||
|
||||
void (*dp_get_vdev_stats_for_unmap_peer)(
|
||||
struct dp_vdev *vdev,
|
||||
struct dp_peer *peer,
|
||||
struct cdp_vdev_stats **vdev_stats);
|
||||
#ifdef WLAN_SUPPORT_PPEDS
|
||||
void (*txrx_soc_ppeds_interrupt_stop)(struct dp_soc *soc);
|
||||
void (*txrx_soc_ppeds_interrupt_start)(struct dp_soc *soc);
|
||||
|
@@ -635,6 +635,13 @@ static uint8_t dp_get_hw_link_id_li(struct dp_pdev *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void dp_get_vdev_stats_for_unmap_peer_li(
|
||||
struct dp_vdev *vdev,
|
||||
struct dp_peer *peer,
|
||||
struct cdp_vdev_stats **vdev_stats)
|
||||
{
|
||||
}
|
||||
|
||||
void dp_initialize_arch_ops_li(struct dp_arch_ops *arch_ops)
|
||||
{
|
||||
#ifndef QCA_HOST_MODE_WIFI_DISABLED
|
||||
@@ -710,6 +717,8 @@ void dp_initialize_arch_ops_li(struct dp_arch_ops *arch_ops)
|
||||
arch_ops->txrx_get_vdev_mcast_param = dp_txrx_get_vdev_mcast_param_li;
|
||||
arch_ops->get_hw_link_id = dp_get_hw_link_id_li;
|
||||
arch_ops->txrx_srng_init = dp_srng_init_li;
|
||||
arch_ops->dp_get_vdev_stats_for_unmap_peer =
|
||||
dp_get_vdev_stats_for_unmap_peer_li;
|
||||
#if defined(DP_POWER_SAVE) || defined(FEATURE_RUNTIME_PM)
|
||||
arch_ops->dp_update_ring_hptp = dp_update_ring_hptp;
|
||||
#endif
|
||||
|
In neuem Issue referenzieren
Einen Benutzer sperren