qcacmn: Add logic for allocation and reset of vdev_stats_id

In BE architecture, HW provides basic vdev stats support for upto
48 vdevs. For each vdev, there is vdev_stats_id which represents the
id of this vdev on HW. This vdev_stats_id is assigned by host and
is conveyed to HW at the time of REO TID Queue setup for the peer.

Add logic for allocation and deallocation of vdev_stats_id and
convey this id to HW.

Change-Id: If5611bf54d057ccf71c6444b5c79a26eb28df87e
CRs-Fixed: 3067843
此提交包含在:
Harsh Kumar Bijlani
2021-04-28 18:43:09 +05:30
提交者 Madan Koyyalamudi
父節點 f76548dd04
當前提交 6c7fcf1d61
共有 13 個檔案被更改,包括 152 行新增10 行删除

查看文件

@@ -6052,6 +6052,7 @@ static QDF_STATUS dp_vdev_attach_wifi3(struct cdp_soc_t *cdp_soc,
uint8_t vdev_id = vdev_info->vdev_id;
enum wlan_op_mode op_mode = vdev_info->op_mode;
enum wlan_op_subtype subtype = vdev_info->subtype;
uint8_t vdev_stats_id = vdev_info->vdev_stats_id;
vdev_context_size =
soc->arch_ops.txrx_get_context_size(DP_CONTEXT_TYPE_VDEV);
@@ -6075,6 +6076,7 @@ static QDF_STATUS dp_vdev_attach_wifi3(struct cdp_soc_t *cdp_soc,
vdev->pdev = pdev;
vdev->vdev_id = vdev_id;
vdev->vdev_stats_id = vdev_stats_id;
vdev->opmode = op_mode;
vdev->subtype = subtype;
vdev->osdev = soc->osdev;
@@ -6332,6 +6334,60 @@ static void dp_vdev_flush_peers(struct cdp_vdev *vdev_handle, bool unmap_only)
}
#ifdef QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT
/*
* dp_txrx_alloc_vdev_stats_id()- Allocate vdev_stats_id
* @soc_hdl: Datapath soc handle
* @vdev_stats_id: Address of vdev_stats_id
*
* Return: QDF_STATUS
*/
static QDF_STATUS dp_txrx_alloc_vdev_stats_id(struct cdp_soc_t *soc_hdl,
uint8_t *vdev_stats_id)
{
struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
uint8_t id = 0;
if (!wlan_cfg_get_vdev_stats_hw_offload_config(soc->wlan_cfg_ctx)) {
*vdev_stats_id = DP_INVALID_VDEV_STATS_ID;
return QDF_STATUS_E_FAILURE;
}
while (id < DP_MAX_VDEV_STATS_ID) {
if (!qdf_atomic_test_and_set_bit(id, &soc->vdev_stats_id_map)) {
*vdev_stats_id = id;
return QDF_STATUS_SUCCESS;
}
id++;
}
*vdev_stats_id = DP_INVALID_VDEV_STATS_ID;
return QDF_STATUS_E_FAILURE;
}
/*
* dp_txrx_reset_vdev_stats_id() - Reset vdev_stats_id in dp_soc
* @soc_hdl: Datapath soc handle
* @vdev_stats_id: vdev_stats_id to reset in dp_soc
*
* Return: none
*/
static void dp_txrx_reset_vdev_stats_id(struct cdp_soc_t *soc_hdl,
uint8_t vdev_stats_id)
{
struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
if ((!wlan_cfg_get_vdev_stats_hw_offload_config(soc->wlan_cfg_ctx)) ||
(vdev_stats_id >= DP_MAX_VDEV_STATS_ID))
return;
qdf_atomic_clear_bit(vdev_stats_id, &soc->vdev_stats_id_map);
}
#else
static void dp_txrx_reset_vdev_stats_id(struct cdp_soc_t *soc,
uint8_t vdev_stats_id)
{}
#endif
/*
* dp_vdev_detach_wifi3() - Detach txrx vdev
* @cdp_soc: Datapath soc handle
@@ -6396,6 +6452,8 @@ static QDF_STATUS dp_vdev_detach_wifi3(struct cdp_soc_t *cdp_soc,
dp_monitor_neighbour_peer_list_remove(pdev, vdev, peer);
dp_txrx_reset_vdev_stats_id(cdp_soc, vdev->vdev_stats_id);
dp_tx_vdev_multipass_deinit(vdev);
if (vdev->vdev_dp_ext_handle) {
@@ -11696,6 +11754,10 @@ static struct cdp_host_stats_ops dp_ops_host_stats = {
.txrx_update_vdev_stats = dp_txrx_update_vdev_host_stats,
.txrx_get_peer_delay_stats = dp_txrx_get_peer_delay_stats,
.txrx_get_peer_jitter_stats = dp_txrx_get_peer_jitter_stats,
#ifdef QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT
.txrx_alloc_vdev_stats_id = dp_txrx_alloc_vdev_stats_id,
.txrx_reset_vdev_stats_id = dp_txrx_reset_vdev_stats_id,
#endif
/* TODO */
};
@@ -12852,6 +12914,8 @@ void *dp_soc_init(struct dp_soc *soc, HTC_HANDLE htc_handle,
qdf_heap_mem_stats_read(),
qdf_skb_total_mem_stats_read());
soc->vdev_stats_id_map = 0;
return soc;
fail6:
htt_soc_htc_dealloc(soc->htt_handle);