qcacmn: Add vdev_id to vdev_handle map in dp
Add a vdev_id to vdev_handle map in dp for faster
retrieval of vdev using vdev_id.
Change-Id: Ie19e09dd2e2b3d99317146d1b4cecdb5147a3cdd
diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h
index fef1029..e83f780 100644
--- a/dp/wifi3.0/dp_internal.h
+++ b/dp/wifi3.0/dp_internal.h
@@ -1502,4 +1502,22 @@
{
}
#endif /* WLAN_SUPPORT_RX_FLOW_TAG */
+
+/**
+ * dp_get_vdev_from_soc_vdev_id_wifi3() - Returns vdev object given the vdev id
+ * @soc: core DP soc context
+ * @vdev_id: vdev id from vdev object can be retrieved
+ *
+ * Return: struct dp_vdev*: Pointer to DP vdev object
+ */
+static inline struct dp_vdev *
+dp_get_vdev_from_soc_vdev_id_wifi3(struct dp_soc *soc,
+ uint8_t vdev_id)
+{
+ if (qdf_unlikely(vdev_id >= MAX_VDEV_CNT))
+ return NULL;
+
+ return soc->vdev_id_map[vdev_id];
+}
+
#endif /* #ifndef _DP_INTERNAL_H_ */
diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c
index 51d76e3..dcb62cb 100644
--- a/dp/wifi3.0/dp_main.c
+++ b/dp/wifi3.0/dp_main.c
@@ -4757,6 +4757,8 @@
qdf_timer_mod(&soc->int_timer, DP_INTR_POLL_TIMER_MS);
}
+ soc->vdev_id_map[vdev_id] = vdev;
+
if (wlan_op_mode_monitor == vdev->opmode) {
pdev->monitor_vdev = vdev;
return (struct cdp_vdev *)vdev;
@@ -4982,6 +4984,8 @@
pdev = vdev->pdev;
soc = pdev->soc;
+ soc->vdev_id_map[vdev->vdev_id] = NULL;
+
if (wlan_op_mode_monitor == vdev->opmode)
goto free_vdev;
@@ -5854,6 +5858,8 @@
FLOW_TYPE_VDEV, vdev_id);
dp_tx_vdev_detach(vdev);
+ pdev->soc->vdev_id_map[vdev_id] = NULL;
+
qdf_spin_lock_bh(&pdev->vdev_list_lock);
TAILQ_REMOVE(&pdev->vdev_list, vdev, vdev_list_elem);
qdf_spin_unlock_bh(&pdev->vdev_list_lock);
@@ -9383,10 +9389,10 @@
static uint32_t dp_tx_get_success_ack_stats(struct cdp_pdev *pdev,
uint8_t vdev_id)
{
- struct dp_vdev *vdev =
- (struct dp_vdev *)dp_get_vdev_from_vdev_id_wifi3(pdev,
- vdev_id);
struct dp_soc *soc = ((struct dp_pdev *)pdev)->soc;
+ struct dp_vdev *vdev =
+ (struct dp_vdev *)dp_get_vdev_from_soc_vdev_id_wifi3(soc,
+ vdev_id);
struct cdp_vdev_stats *vdev_stats = NULL;
uint32_t tx_success;
@@ -9728,6 +9734,7 @@
soc->num_hw_dscp_tid_map = HAL_MAX_HW_DSCP_TID_MAPS;
wlan_set_srng_cfg(&soc->wlan_srng_cfg);
+ qdf_mem_zero(&soc->vdev_id_map, sizeof(soc->vdev_id_map));
soc->wlan_cfg_ctx = wlan_cfg_soc_attach(soc->ctrl_psoc);
if (!soc->wlan_cfg_ctx) {
diff --git a/dp/wifi3.0/dp_peer.h b/dp/wifi3.0/dp_peer.h
index b3ad006..d67576d 100644
--- a/dp/wifi3.0/dp_peer.h
+++ b/dp/wifi3.0/dp_peer.h
@@ -149,41 +149,6 @@
struct dp_ast_entry *ase);
/*
- * dp_get_vdev_from_soc_vdev_id_wifi3() -
- * Returns vdev object given the vdev id
- * vdev id is unique across pdev's
- *
- * @soc : core DP soc context
- * @vdev_id : vdev id from vdev object can be retrieved
- *
- * Return: struct dp_vdev*: Pointer to DP vdev object
- */
-static inline struct dp_vdev *
-dp_get_vdev_from_soc_vdev_id_wifi3(struct dp_soc *soc,
- uint8_t vdev_id)
-{
- struct dp_pdev *pdev = NULL;
- struct dp_vdev *vdev = NULL;
- int i;
-
- for (i = 0; i < MAX_PDEV_CNT && soc->pdev_list[i]; i++) {
- pdev = soc->pdev_list[i];
- qdf_spin_lock_bh(&pdev->vdev_list_lock);
- TAILQ_FOREACH(vdev, &pdev->vdev_list, vdev_list_elem) {
- if (vdev->vdev_id == vdev_id) {
- qdf_spin_unlock_bh(&pdev->vdev_list_lock);
- return vdev;
- }
- }
- qdf_spin_unlock_bh(&pdev->vdev_list_lock);
- }
- dp_err("Failed to find vdev for vdev_id %d", vdev_id);
-
- return NULL;
-
-}
-
-/*
* dp_peer_find_by_id_exist - check if peer exists for given id
* @soc: core DP soc context
* @peer_id: peer id from peer object can be retrieved
diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h
index 312abc2..7120cfd 100644
--- a/dp/wifi3.0/dp_types.h
+++ b/dp/wifi3.0/dp_types.h
@@ -78,6 +78,13 @@
#define MAX_PDEV_CNT 3
#endif
+/* Max no. of VDEV per PSOC */
+#ifdef WLAN_PSOC_MAX_VDEVS
+#define MAX_VDEV_CNT WLAN_PSOC_MAX_VDEVS
+#else
+#define MAX_VDEV_CNT 51
+#endif
+
#define MAX_LINK_DESC_BANKS 8
#define MAX_TXDESC_POOLS 4
#define MAX_RXDESC_POOLS 4
@@ -982,6 +989,9 @@
uint32_t wbm_idle_scatter_buf_size;
+ /* VDEVs on this SOC */
+ struct dp_vdev *vdev_id_map[MAX_VDEV_CNT];
+
/* Tx H/W queues lock */
qdf_spinlock_t tx_queue_lock[MAX_TX_HW_QUEUES];