qcacmn: Add API to get and clear pdev obss stats

Add API to send request to Fw to get and clear pdev obss stats.

Change-Id: I2697cc111eba0310d0a65e9911673670ff476c7f
CRs-Fixed: 3295540
Tento commit je obsažen v:
Amit Mehta
2022-09-07 02:36:17 -07:00
odevzdal Madan Koyyalamudi
rodič 8cafea036b
revize 95857b39a8
7 změnil soubory, kde provedl 295 přidání a 0 odebrání

Zobrazit soubor

@@ -1061,4 +1061,56 @@ static inline QDF_STATUS cdp_get_peer_extd_rate_link_stats(
return soc->ops->host_stats_ops->txrx_get_peer_extd_rate_link_stats(
soc, mac_addr);
}
/*
* cdp_get_pdev_obss_pd_stats(): function to get pdev obss stats
* @soc: soc handle
* @pdev_id: pdev id
* @stats: pointer to pdev obss stats
*
* return: status
*/
static inline QDF_STATUS cdp_get_pdev_obss_pd_stats(
ol_txrx_soc_handle soc,
uint8_t pdev_id,
struct cdp_pdev_obss_pd_stats_tlv *stats)
{
if (!soc || !soc->ops) {
dp_cdp_debug("Invalid Instance");
QDF_BUG(0);
return QDF_STATUS_E_FAILURE;
}
if (!soc->ops->host_stats_ops ||
!soc->ops->host_stats_ops->get_pdev_obss_stats)
return QDF_STATUS_E_FAILURE;
return soc->ops->host_stats_ops->get_pdev_obss_stats(
soc, pdev_id, stats);
}
/**
* cdp_clear_pdev_obss_pd_stats(): function to clear pdev obss stats
* @soc: soc handle
* @pdev_id: pdev id
*
* return: status
*/
static inline QDF_STATUS cdp_clear_pdev_obss_pd_stats(
ol_txrx_soc_handle soc,
uint8_t pdev_id)
{
if (!soc || !soc->ops) {
dp_cdp_debug("Invalid Instance");
QDF_BUG(0);
return QDF_STATUS_E_FAILURE;
}
if (!soc->ops->host_stats_ops ||
!soc->ops->host_stats_ops->clear_pdev_obss_pd_stats)
return QDF_STATUS_E_FAILURE;
return soc->ops->host_stats_ops->clear_pdev_obss_pd_stats(
soc, pdev_id);
}
#endif /* _CDP_TXRX_HOST_STATS_H_ */

Zobrazit soubor

@@ -1213,6 +1213,11 @@ struct cdp_host_stats_ops {
QDF_STATUS
(*txrx_get_peer_extd_rate_link_stats)
(struct cdp_soc_t *soc, uint8_t *mac_addr);
QDF_STATUS
(*get_pdev_obss_stats)(struct cdp_soc_t *soc, uint8_t pdev_id,
struct cdp_pdev_obss_pd_stats_tlv *buf);
QDF_STATUS (*clear_pdev_obss_pd_stats)(struct cdp_soc_t *soc,
uint8_t pdev_id);
};
struct cdp_wds_ops {

Zobrazit soubor

@@ -2245,6 +2245,116 @@ struct cdp_htt_tx_pdev_stats_cmn_tlv {
uint32_t tx_active_dur_us_high;
};
#define DP_NUM_AC_WMM 4
struct cdp_pdev_obss_pd_stats_tlv {
struct cdp_htt_tlv_hdr tlv_hdr;
uint32_t num_obss_tx_ppdu_success;
uint32_t num_obss_tx_ppdu_failure;
/** num_sr_tx_transmissions:
* Counter of TX done by aborting other BSS RX with spatial reuse
* (for cases where rx RSSI from other BSS is below the packet-detection
* threshold for doing spatial reuse)
*/
uint32_t num_sr_tx_transmissions;
/**
* Count the number of times the RSSI from an other-BSS signal
* is below the spatial reuse power threshold, thus providing an
* opportunity for spatial reuse since OBSS interference will be
* inconsequential.
*/
uint32_t num_spatial_reuse_opportunities;
/**
* Count of number of times OBSS frames were aborted and non-SRG
* opportunities were created. Non-SRG opportunities are created when
* incoming OBSS RSSI is lesser than the global configured non-SRG RSSI
* threshold and non-SRG OBSS color / non-SRG OBSS BSSID registers
* allow non-SRG TX.
*/
uint32_t num_non_srg_opportunities;
/**
* Count of number of times TX PPDU were transmitted using non-SRG
* opportunities created. Incoming OBSS frame RSSI is compared with per
* PPDU non-SRG RSSI threshold configured in each PPDU. If incoming OBSS
* RSSI < non-SRG RSSI threshold configured in each PPDU, then non-SRG
* tranmission happens.
*/
uint32_t num_non_srg_ppdu_tried;
/**
* Count of number of times non-SRG based TX transmissions were
* successful
*/
uint32_t num_non_srg_ppdu_success;
/**
* Count of number of times OBSS frames were aborted and SRG
* opportunities were created. Srg opportunities are created when
* incoming OBSS RSSI is less than the global configured SRG RSSI
* threshold and SRC OBSS color / SRG OBSS BSSID / SRG partial bssid /
* SRG BSS color bitmap registers allow SRG TX.
*/
uint32_t num_srg_opportunities;
/**
* Count of number of times TX PPDU were transmitted using SRG
* opportunities created.
* Incoming OBSS frame RSSI is compared with per PPDU SRG RSSI
* threshold configured in each PPDU.
* If incoming OBSS RSSI < SRG RSSI threshold configured in each PPDU,
* then SRG tranmission happens.
*/
uint32_t num_srg_ppdu_tried;
/**
* Count of number of times SRG based TX transmissions were successful
*/
uint32_t num_srg_ppdu_success;
/**
* Count of number of times PSR opportunities were created by aborting
* OBSS UL OFDMA HE-TB PPDU frame. HE-TB ppdu frames are aborted if the
* spatial reuse info in the OBSS trigger common field is set to allow
* PSR based spatial reuse.
*/
uint32_t num_psr_opportunities;
/**
* Count of number of times TX PPDU were transmitted using PSR
* opportunities created.
*/
uint32_t num_psr_ppdu_tried;
/**
* Count of number of times PSR based TX transmissions were successful.
*/
uint32_t num_psr_ppdu_success;
/**
* Count of number of times TX PPDU per access category were transmitted
* using non-SRG opportunities created.
*/
uint32_t num_non_srg_ppdu_tried_per_ac[DP_NUM_AC_WMM];
/**
* Count of number of times non-SRG based TX transmissions per access
* category were successful
*/
uint32_t num_non_srg_ppdu_success_per_ac[DP_NUM_AC_WMM];
/**
* Count of number of times TX PPDU per access category were transmitted
* using SRG opportunities created.
*/
uint32_t num_srg_ppdu_tried_per_ac[DP_NUM_AC_WMM];
/**
* Count of number of times SRG based TX transmissions per access
* category were successful
*/
uint32_t num_srg_ppdu_success_per_ac[DP_NUM_AC_WMM];
/**
* Count of number of times ppdu was flushed due to ongoing OBSS
* frame duration value lesser than minimum required frame duration.
*/
uint32_t num_obss_min_duration_check_flush_cnt;
/**
* Count of number of times ppdu was flushed due to ppdu duration
* exceeding aborted OBSS frame duration
*/
uint32_t num_sr_ppdu_abort_flush_cnt;
};
struct cdp_htt_tx_pdev_stats_urrn_tlv_v {
struct cdp_htt_tlv_hdr tlv_hdr;
uint32_t urrn_stats[1]; /* HTT_TX_PDEV_MAX_URRN_STATS */
@@ -2376,6 +2486,7 @@ struct cdp_htt_tx_pdev_stats {
struct cdp_htt_tx_pdev_stats_sifs_tlv_v sifs_tlv;
struct cdp_htt_tx_pdev_stats_flush_tlv_v flush_tlv;
struct cdp_htt_tx_pdev_stats_phy_err_tlv_v phy_err_tlv;
struct cdp_pdev_obss_pd_stats_tlv obss_pd_stats_tlv;
};
struct cdp_htt_rx_soc_stats_t {

Zobrazit soubor

@@ -1863,6 +1863,26 @@ dp_htt_stats_sysfs_set_event(struct dp_soc *dp_soc, uint32_t *msg_word)
}
#endif /* WLAN_SYSFS_DP_STATS */
/* dp_htt_set_pdev_obss_stats() - Function to set pdev obss stats.
* @pdev: dp pdev handle
* @tag_type: HTT TLV tag type
* @tag_buf: TLV buffer pointer
*
* Return: None
*/
static inline void
dp_htt_set_pdev_obss_stats(struct dp_pdev *pdev, uint32_t tag_type,
uint32_t *tag_buf)
{
if (tag_type != HTT_STATS_PDEV_OBSS_PD_TAG) {
dp_err("Tag mismatch");
return;
}
qdf_mem_copy(&pdev->stats.htt_tx_pdev_stats.obss_pd_stats_tlv,
tag_buf, sizeof(struct cdp_pdev_obss_pd_stats_tlv));
qdf_event_set(&pdev->fw_obss_stats_event);
}
/**
* dp_process_htt_stat_msg(): Process the list of buffers of HTT EXT stats
* @htt_stats: htt stats info
@@ -1992,6 +2012,11 @@ static inline void dp_process_htt_stat_msg(struct htt_stats_context *htt_stats,
tlv_type,
tlv_start);
if (cookie_msb & DBG_STATS_COOKIE_HTT_OBSS)
dp_htt_set_pdev_obss_stats(pdev,
tlv_type,
tlv_start);
msg_remain_len -= tlv_remain_len;
msg_word = (uint32_t *)

Zobrazit soubor

@@ -71,6 +71,9 @@ struct htt_dbgfs_cfg {
/*Reserve for HTT Stats debugfs support: 5th bit */
#define DBG_SYSFS_STATS_COOKIE BIT(5)
/* Reserve for HTT Stats OBSS PD support: 6th bit */
#define DBG_STATS_COOKIE_HTT_OBSS BIT(6)
/**
* Bitmap of HTT PPDU TLV types for Default mode
*/

Zobrazit soubor

@@ -5927,6 +5927,7 @@ static void dp_pdev_deinit(struct cdp_pdev *txrx_pdev, int force)
dp_pdev_bkp_stats_detach(pdev);
qdf_event_destroy(&pdev->fw_peer_stats_event);
qdf_event_destroy(&pdev->fw_stats_event);
qdf_event_destroy(&pdev->fw_obss_stats_event);
if (pdev->sojourn_buf)
qdf_nbuf_free(pdev->sojourn_buf);
@@ -11460,6 +11461,95 @@ dp_txrx_stats_publish(struct cdp_soc_t *soc, uint8_t pdev_id,
return TXRX_STATS_LEVEL;
}
/*
* dp_get_obss_stats(): Get Pdev OBSS stats from Fw
* @soc: DP soc handle
* @pdev_id: id of DP_PDEV handle
* @buf: to hold pdev obss stats
*
* Return: status
*/
static QDF_STATUS
dp_get_obss_stats(struct cdp_soc_t *soc, uint8_t pdev_id,
struct cdp_pdev_obss_pd_stats_tlv *buf)
{
struct cdp_txrx_stats_req req = {0};
QDF_STATUS status;
struct dp_pdev *pdev =
dp_get_pdev_from_soc_pdev_id_wifi3((struct dp_soc *)soc,
pdev_id);
if (!pdev)
return QDF_STATUS_E_INVAL;
if (pdev->pending_fw_obss_stats_response)
return QDF_STATUS_E_AGAIN;
pdev->pending_fw_obss_stats_response = true;
req.stats = (enum cdp_stats)HTT_DBG_EXT_STATS_PDEV_OBSS_PD_STATS;
req.cookie_val = DBG_STATS_COOKIE_HTT_OBSS;
qdf_event_reset(&pdev->fw_obss_stats_event);
status = dp_h2t_ext_stats_msg_send(pdev, req.stats, req.param0,
req.param1, req.param2, req.param3,
0, req.cookie_val, 0);
if (QDF_IS_STATUS_ERROR(status)) {
pdev->pending_fw_obss_stats_response = false;
return status;
}
status =
qdf_wait_single_event(&pdev->fw_obss_stats_event,
DP_MAX_SLEEP_TIME);
if (status != QDF_STATUS_SUCCESS) {
if (status == QDF_STATUS_E_TIMEOUT)
qdf_debug("TIMEOUT_OCCURS");
pdev->pending_fw_obss_stats_response = false;
return QDF_STATUS_E_TIMEOUT;
}
qdf_mem_copy(buf, &pdev->stats.htt_tx_pdev_stats.obss_pd_stats_tlv,
sizeof(struct cdp_pdev_obss_pd_stats_tlv));
pdev->pending_fw_obss_stats_response = false;
return status;
}
/*
* dp_clear_pdev_obss_pd_stats(): Clear pdev obss stats
* @soc: DP soc handle
* @pdev_id: id of DP_PDEV handle
*
* Return: status
*/
static QDF_STATUS
dp_clear_pdev_obss_pd_stats(struct cdp_soc_t *soc, uint8_t pdev_id)
{
struct cdp_txrx_stats_req req = {0};
struct dp_pdev *pdev =
dp_get_pdev_from_soc_pdev_id_wifi3((struct dp_soc *)soc,
pdev_id);
uint32_t cookie_val = DBG_STATS_COOKIE_DEFAULT;
if (!pdev)
return QDF_STATUS_E_INVAL;
/*
* For HTT_DBG_EXT_STATS_RESET command, FW need to config
* from param0 to param3 according to below rule:
*
* PARAM:
* - config_param0 : start_offset (stats type)
* - config_param1 : stats bmask from start offset
* - config_param2 : stats bmask from start offset + 32
* - config_param3 : stats bmask from start offset + 64
*/
req.stats = (enum cdp_stats)HTT_DBG_EXT_STATS_RESET;
req.param0 = HTT_DBG_EXT_STATS_PDEV_OBSS_PD_STATS;
req.param1 = 0x00000001;
return dp_h2t_ext_stats_msg_send(pdev, req.stats, req.param0,
req.param1, req.param2, req.param3, 0,
cookie_val, 0);
}
/**
* dp_set_pdev_dscp_tid_map_wifi3(): update dscp tid map in pdev
* @soc: soc handle
@@ -13880,6 +13970,8 @@ static struct cdp_host_stats_ops dp_ops_host_stats = {
#endif
.txrx_get_peer_extd_rate_link_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,
/* TODO */
};
@@ -16942,6 +17034,7 @@ static QDF_STATUS dp_pdev_init(struct cdp_soc_t *txrx_soc,
qdf_event_create(&pdev->fw_peer_stats_event);
qdf_event_create(&pdev->fw_stats_event);
qdf_event_create(&pdev->fw_obss_stats_event);
pdev->num_tx_allowed = wlan_cfg_get_num_tx_desc(soc->wlan_cfg_ctx);

Zobrazit soubor

@@ -3058,6 +3058,12 @@ struct dp_pdev {
/* qdf_event for fw_stats */
qdf_event_t fw_stats_event;
/* qdf_event for fw__obss_stats */
qdf_event_t fw_obss_stats_event;
/* To check if request is already sent for obss stats */
bool pending_fw_obss_stats_response;
/* User configured max number of tx buffers */
uint32_t num_tx_allowed;