diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index fef10292f2..e83f7801c9 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -1502,4 +1502,22 @@ void dp_rx_fst_detach(struct dp_soc *soc, struct dp_pdev *pdev) { } #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 51d76e33b7..dcb62cbc86 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -4757,6 +4757,8 @@ static struct cdp_vdev *dp_vdev_attach_wifi3(struct cdp_pdev *txrx_pdev, 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 @@ static void dp_vdev_detach_wifi3(struct cdp_vdev *vdev_handle, 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 @@ static void dp_delete_pending_vdev(struct dp_pdev *pdev, struct dp_vdev *vdev, 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 QDF_STATUS dp_runtime_resume(struct cdp_pdev *opaque_pdev) 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 @@ dp_soc_attach(struct cdp_ctrl_objmgr_psoc *ctrl_psoc, HTC_HANDLE htc_handle, 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 b3ad006fc2..d67576d6d1 100644 --- a/dp/wifi3.0/dp_peer.h +++ b/dp/wifi3.0/dp_peer.h @@ -148,41 +148,6 @@ void dp_peer_free_hmwds_cb(struct cdp_ctrl_objmgr_psoc *ctrl_psoc, void dp_peer_ast_hash_remove(struct dp_soc *soc, 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 diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 312abc2046..7120cfd120 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 @@ struct dp_soc { 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];