diff --git a/dp/wifi3.0/dp_htt.c b/dp/wifi3.0/dp_htt.c index cfa359e3c4..0ea0ccb6dd 100644 --- a/dp/wifi3.0/dp_htt.c +++ b/dp/wifi3.0/dp_htt.c @@ -2414,12 +2414,13 @@ static void dp_process_ppdu_stats_user_common_tlv( /* returning earlier causes other feilds unpopulated */ if (peer_id == DP_SCAN_PEER_ID) { - vdev = dp_vdev_get_ref_by_id(pdev->soc, ppdu_desc->vdev_id); + vdev = dp_vdev_get_ref_by_id(pdev->soc, ppdu_desc->vdev_id, + DP_MOD_ID_TX_PPDU_STATS); if (!vdev) return; qdf_mem_copy(ppdu_user_desc->mac_addr, vdev->mac_addr.raw, QDF_MAC_ADDR_SIZE); - dp_vdev_unref_delete(pdev->soc, vdev); + dp_vdev_unref_delete(pdev->soc, vdev, DP_MOD_ID_TX_PPDU_STATS); } else { peer = dp_peer_get_ref_by_id(pdev->soc, peer_id, DP_MOD_ID_TX_PPDU_STATS); @@ -2432,12 +2433,14 @@ static void dp_process_ppdu_stats_user_common_tlv( * peer's peer_id but it was removed */ vdev = dp_vdev_get_ref_by_id(pdev->soc, - ppdu_desc->vdev_id); + ppdu_desc->vdev_id, + DP_MOD_ID_TX_PPDU_STATS); if (!vdev) return; qdf_mem_copy(ppdu_user_desc->mac_addr, vdev->mac_addr.raw, QDF_MAC_ADDR_SIZE); - dp_vdev_unref_delete(pdev->soc, vdev); + dp_vdev_unref_delete(pdev->soc, vdev, + DP_MOD_ID_TX_PPDU_STATS); return; } qdf_mem_copy(ppdu_user_desc->mac_addr, @@ -2477,10 +2480,12 @@ static void dp_process_ppdu_stats_user_rate_tlv(struct dp_pdev *pdev, ppdu_user_desc = &ppdu_desc->user[curr_user_index]; ppdu_user_desc->tlv_bitmap |= (1 << tlv_type); if (peer_id == DP_SCAN_PEER_ID) { - vdev = dp_vdev_get_ref_by_id(pdev->soc, ppdu_desc->vdev_id); + vdev = dp_vdev_get_ref_by_id(pdev->soc, ppdu_desc->vdev_id, + DP_MOD_ID_TX_PPDU_STATS); if (!vdev) return; - dp_vdev_unref_delete(pdev->soc, vdev); + dp_vdev_unref_delete(pdev->soc, vdev, + DP_MOD_ID_TX_PPDU_STATS); } ppdu_user_desc->peer_id = peer_id; diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index c23601c5c5..9fd9a732f0 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -956,7 +956,8 @@ void dp_peer_find_id_to_obj_add(struct dp_soc *soc, uint16_t peer_id); void dp_peer_find_id_to_obj_remove(struct dp_soc *soc, uint16_t peer_id); -void dp_vdev_unref_delete(struct dp_soc *soc, struct dp_vdev *vdev); +void dp_vdev_unref_delete(struct dp_soc *soc, struct dp_vdev *vdev, + enum dp_mod_id mod_id); /* * dp_peer_ppdu_delayed_ba_init() Initialize ppdu in peer * @peer: Datapath peer @@ -981,7 +982,7 @@ extern struct dp_peer *dp_peer_find_hash_find(struct dp_soc *soc, uint8_t *peer_mac_addr, int mac_addr_is_aligned, uint8_t vdev_id, - enum dp_peer_mod_id id); + enum dp_mod_id id); #ifdef DP_PEER_EXTENDED_API /** @@ -2132,16 +2133,20 @@ void dp_rx_fst_detach(struct dp_soc *soc, struct dp_pdev *pdev) * * @soc : core DP soc context * @vdev : DP vdev + * @mod_id : module id * * Return: QDF_STATUS_SUCCESS if reference held successfully * else QDF_STATUS_E_INVAL */ static inline -QDF_STATUS dp_vdev_get_ref(struct dp_soc *soc, struct dp_vdev *vdev) +QDF_STATUS dp_vdev_get_ref(struct dp_soc *soc, struct dp_vdev *vdev, + enum dp_mod_id mod_id) { if (!qdf_atomic_inc_not_zero(&vdev->ref_cnt)) return QDF_STATUS_E_INVAL; + qdf_atomic_inc(&vdev->mod_refs[mod_id]); + return QDF_STATUS_SUCCESS; } @@ -2149,11 +2154,13 @@ QDF_STATUS dp_vdev_get_ref(struct dp_soc *soc, struct dp_vdev *vdev) * dp_vdev_get_ref_by_id() - Returns vdev object given the vdev id * @soc: core DP soc context * @vdev_id: vdev id from vdev object can be retrieved + * @mod_id: module id which is requesting the reference * * Return: struct dp_vdev*: Pointer to DP vdev object */ static inline struct dp_vdev * -dp_vdev_get_ref_by_id(struct dp_soc *soc, uint8_t vdev_id) +dp_vdev_get_ref_by_id(struct dp_soc *soc, uint8_t vdev_id, + enum dp_mod_id mod_id) { struct dp_vdev *vdev = NULL; if (qdf_unlikely(vdev_id >= MAX_VDEV_CNT)) @@ -2162,7 +2169,7 @@ dp_vdev_get_ref_by_id(struct dp_soc *soc, uint8_t vdev_id) qdf_spin_lock_bh(&soc->vdev_map_lock); vdev = soc->vdev_id_map[vdev_id]; - if (!vdev || dp_vdev_get_ref(soc, vdev) != QDF_STATUS_SUCCESS) { + if (!vdev || dp_vdev_get_ref(soc, vdev, mod_id) != QDF_STATUS_SUCCESS) { qdf_spin_unlock_bh(&soc->vdev_map_lock); return NULL; } diff --git a/dp/wifi3.0/dp_ipa.c b/dp/wifi3.0/dp_ipa.c index b09ca243ca..b9fd9fcebf 100644 --- a/dp/wifi3.0/dp_ipa.c +++ b/dp/wifi3.0/dp_ipa.c @@ -1786,7 +1786,8 @@ bool dp_ipa_rx_intrabss_fwd(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, qdf_nbuf_t nbuf, bool *fwd_success) { 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); + struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, + DP_MOD_ID_IPA); struct dp_pdev *pdev; struct dp_peer *da_peer; struct dp_peer *sa_peer; @@ -1862,7 +1863,7 @@ bool dp_ipa_rx_intrabss_fwd(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, status = true; out: - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_IPA); return status; } diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 6eef8d2d73..e0f06879fe 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -735,7 +735,8 @@ static QDF_STATUS dp_wds_reset_ast_wifi3(struct cdp_soc_t *soc_hdl, struct dp_ast_entry *ast_entry = NULL; struct dp_peer *peer; struct dp_pdev *pdev; - struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id); + struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, + DP_MOD_ID_CDP); if (!vdev) return QDF_STATUS_E_FAILURE; @@ -747,7 +748,7 @@ static QDF_STATUS dp_wds_reset_ast_wifi3(struct cdp_soc_t *soc_hdl, 0, vdev->vdev_id, DP_MOD_ID_CDP); if (!peer) { - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return QDF_STATUS_E_FAILURE; } @@ -768,7 +769,7 @@ static QDF_STATUS dp_wds_reset_ast_wifi3(struct cdp_soc_t *soc_hdl, qdf_spin_unlock_bh(&soc->ast_lock); } - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return QDF_STATUS_SUCCESS; } @@ -4340,6 +4341,46 @@ static void dp_soc_reset_txrx_ring_map(struct dp_soc *soc) soc->tx_ring_map[i] = 0; } +/* + * dp_soc_print_inactive_objects() - prints inactive peer and vdev list + * @soc: DP SOC handle + * + */ +static void dp_soc_print_inactive_objects(struct dp_soc *soc) +{ + struct dp_peer *peer = NULL; + struct dp_peer *tmp_peer = NULL; + struct dp_vdev *vdev = NULL; + struct dp_vdev *tmp_vdev = NULL; + int i = 0; + uint32_t count; + + if (TAILQ_EMPTY(&soc->inactive_peer_list) && + TAILQ_EMPTY(&soc->inactive_vdev_list)) + return; + + TAILQ_FOREACH_SAFE(peer, &soc->inactive_peer_list, + inactive_list_elem, tmp_peer) { + for (i = 0; i < DP_MOD_ID_MAX; i++) { + count = qdf_atomic_read(&peer->mod_refs[i]); + if (count) + DP_PRINT_STATS("peer %pK Module id %u ==> %u", + peer, i, count); + } + } + + TAILQ_FOREACH_SAFE(vdev, &soc->inactive_vdev_list, + inactive_list_elem, tmp_vdev) { + for (i = 0; i < DP_MOD_ID_MAX; i++) { + count = qdf_atomic_read(&vdev->mod_refs[i]); + if (count) + DP_PRINT_STATS("vdev %pK Module id %u ==> %u", + vdev, i, count); + } + } + QDF_BUG(0); +} + /** * dp_soc_deinit() - Deinitialize txrx SOC * @txrx_soc: Opaque DP SOC handle @@ -4388,8 +4429,10 @@ static void dp_soc_deinit(void *txrx_soc) dp_soc_srng_deinit(soc); dp_hw_link_desc_ring_deinit(soc); - QDF_ASSERT(TAILQ_EMPTY(&soc->inactive_peer_list)); + + dp_soc_print_inactive_objects(soc); qdf_spinlock_destroy(&soc->inactive_peer_list_lock); + qdf_spinlock_destroy(&soc->inactive_vdev_list_lock); htt_soc_htc_dealloc(soc->htt_handle); @@ -4952,7 +4995,7 @@ static void dp_vdev_id_map_tbl_add(struct dp_soc *soc, qdf_spin_lock_bh(&soc->vdev_map_lock); - if (dp_vdev_get_ref(soc, vdev) != + if (dp_vdev_get_ref(soc, vdev, DP_MOD_ID_CONFIG) != QDF_STATUS_SUCCESS) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO, "unable to get vdev reference at MAP vdev %pK vdev_id %u", @@ -4983,7 +5026,7 @@ static void dp_vdev_id_map_tbl_remove(struct dp_soc *soc, QDF_ASSERT(soc->vdev_id_map[vdev->vdev_id] == vdev); soc->vdev_id_map[vdev->vdev_id] = NULL; - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CONFIG); qdf_spin_unlock_bh(&soc->vdev_map_lock); } @@ -5000,7 +5043,7 @@ static void dp_vdev_pdev_list_add(struct dp_soc *soc, struct dp_vdev *vdev) { qdf_spin_lock_bh(&pdev->vdev_list_lock); - if (dp_vdev_get_ref(soc, vdev) != + if (dp_vdev_get_ref(soc, vdev, DP_MOD_ID_CONFIG) != QDF_STATUS_SUCCESS) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO, "unable to get vdev reference at MAP vdev %pK", @@ -5038,7 +5081,7 @@ static void dp_vdev_pdev_list_remove(struct dp_soc *soc, if (found) { TAILQ_REMOVE(&pdev->vdev_list, vdev, vdev_list_elem); - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CONFIG); } else { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, "vdev:%pK not found in pdev:%pK vdevlist:%pK", @@ -5070,6 +5113,7 @@ static QDF_STATUS dp_vdev_attach_wifi3(struct cdp_soc_t *cdp_soc, dp_get_pdev_from_soc_pdev_id_wifi3((struct dp_soc *)soc, pdev_id); struct dp_vdev *vdev = qdf_mem_malloc(sizeof(*vdev)); + int i = 0; if (!pdev) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, @@ -5106,8 +5150,12 @@ static QDF_STATUS dp_vdev_attach_wifi3(struct cdp_soc_t *cdp_soc, vdev->sec_type = cdp_sec_type_none; vdev->multipass_en = false; qdf_atomic_init(&vdev->ref_cnt); + for (i = 0; i < DP_MOD_ID_MAX; i++) + qdf_atomic_init(&vdev->mod_refs[i]); + /* Take one reference for create*/ qdf_atomic_inc(&vdev->ref_cnt); + qdf_atomic_inc(&vdev->mod_refs[DP_MOD_ID_CONFIG]); vdev->num_peers = 0; #ifdef notyet vdev->filters_num = 0; @@ -5190,8 +5238,8 @@ static QDF_STATUS dp_vdev_register_wifi3(struct cdp_soc_t *soc_hdl, struct ol_txrx_ops *txrx_ops) { 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); + struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, + DP_MOD_ID_CDP); if (!vdev) return QDF_STATUS_E_FAILURE; @@ -5230,7 +5278,7 @@ static QDF_STATUS dp_vdev_register_wifi3(struct cdp_soc_t *soc_hdl, QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_LOW, "DP Vdev Register success"); - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return QDF_STATUS_SUCCESS; } @@ -5318,7 +5366,8 @@ static QDF_STATUS dp_vdev_detach_wifi3(struct cdp_soc_t *cdp_soc, struct dp_neighbour_peer *peer = NULL; struct dp_neighbour_peer *temp_peer = NULL; struct dp_peer *vap_self_peer = NULL; - struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id); + struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, + DP_MOD_ID_CDP); if (!vdev) return QDF_STATUS_E_FAILURE; @@ -5326,7 +5375,7 @@ static QDF_STATUS dp_vdev_detach_wifi3(struct cdp_soc_t *cdp_soc, pdev = vdev->pdev; vap_self_peer = dp_sta_vdev_self_peer_ref_n_get(soc, vdev, - DP_MOD_ID_PEER_CONFIG); + DP_MOD_ID_CONFIG); if (vap_self_peer) { qdf_spin_lock_bh(&soc->ast_lock); if (vap_self_peer->self_ast_entry) { @@ -5337,7 +5386,7 @@ static QDF_STATUS dp_vdev_detach_wifi3(struct cdp_soc_t *cdp_soc, dp_peer_delete_wifi3((struct cdp_soc_t *)soc, vdev->vdev_id, vap_self_peer->mac_addr.raw, 0); - dp_peer_unref_delete(vap_self_peer, DP_MOD_ID_PEER_CONFIG); + dp_peer_unref_delete(vap_self_peer, DP_MOD_ID_CONFIG); } /* @@ -5388,11 +5437,16 @@ static QDF_STATUS dp_vdev_detach_wifi3(struct cdp_soc_t *cdp_soc, if (vdev->opmode != wlan_op_mode_monitor) dp_vdev_pdev_list_remove(soc, pdev, vdev); - /* release reference taken at dp_vdev_create */ - dp_vdev_unref_delete(soc, vdev); - /* release reference taken above for find */ - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); + + qdf_spin_lock_bh(&soc->inactive_vdev_list_lock); + TAILQ_INSERT_TAIL(&soc->inactive_vdev_list, vdev, inactive_list_elem); + qdf_spin_unlock_bh(&soc->inactive_vdev_list_lock); + + /* release reference taken at dp_vdev_create */ + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CONFIG); + return QDF_STATUS_SUCCESS; } @@ -5428,14 +5482,14 @@ static inline struct dp_peer *dp_peer_can_reuse(struct dp_vdev *vdev, peer = dp_peer_find_hash_find(vdev->pdev->soc, peer_mac_addr, 0, vdev->vdev_id, - DP_MOD_ID_PEER_CONFIG); + DP_MOD_ID_CONFIG); if (!peer) return NULL; if (peer->bss_peer) return peer; - dp_peer_unref_delete(peer, DP_MOD_ID_PEER_CONFIG); + dp_peer_unref_delete(peer, DP_MOD_ID_CONFIG); return NULL; } #else @@ -5446,14 +5500,14 @@ static inline struct dp_peer *dp_peer_can_reuse(struct dp_vdev *vdev, peer = dp_peer_find_hash_find(vdev->pdev->soc, peer_mac_addr, 0, vdev->vdev_id, - DP_MOD_ID_PEER_CONFIG); + DP_MOD_ID_CONFIG); if (!peer) return NULL; if (peer->bss_peer && (peer->vdev->vdev_id == vdev->vdev_id)) return peer; - dp_peer_unref_delete(peer, DP_MOD_ID_PEER_CONFIG); + dp_peer_unref_delete(peer, DP_MOD_ID_CONFIG); return NULL; } #endif @@ -5515,7 +5569,7 @@ dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, if (!peer_mac_addr) return QDF_STATUS_E_FAILURE; - vdev = dp_vdev_get_ref_by_id(soc, vdev_id); + vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_CDP); if (!vdev) return QDF_STATUS_E_FAILURE; @@ -5567,7 +5621,7 @@ dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, dp_peer_update_state(soc, peer, DP_PEER_STATE_INIT); - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return QDF_STATUS_SUCCESS; } else { /* @@ -5591,7 +5645,7 @@ dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, soc->ctrl_psoc, WLAN_MD_DP_PEER, "dp_peer"); if (!peer) { - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return QDF_STATUS_E_FAILURE; /* failure */ } @@ -5602,7 +5656,7 @@ dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, /* store provided params */ peer->vdev = vdev; /* get the vdev reference for new peer */ - dp_vdev_get_ref(soc, vdev); + dp_vdev_get_ref(soc, vdev, DP_MOD_ID_CHILD); if ((vdev->opmode == wlan_op_mode_sta) && !qdf_mem_cmp(peer_mac_addr, &vdev->mac_addr.raw[0], @@ -5630,7 +5684,7 @@ dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, /* keep one reference for attach */ qdf_atomic_inc(&peer->ref_cnt); - qdf_atomic_inc(&peer->mod_refs[DP_MOD_ID_PEER_CONFIG]); + qdf_atomic_inc(&peer->mod_refs[DP_MOD_ID_CONFIG]); dp_peer_vdev_list_add(soc, vdev, peer); @@ -5707,7 +5761,7 @@ dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, dp_peer_update_state(soc, peer, DP_PEER_STATE_INIT); - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return QDF_STATUS_SUCCESS; } @@ -6080,7 +6134,8 @@ static int dp_update_filter_neighbour_peers(struct cdp_soc_t *soc_hdl, struct dp_soc *soc = (struct dp_soc *)soc_hdl; struct dp_pdev *pdev; struct dp_neighbour_peer *peer = NULL; - struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id); + struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, + DP_MOD_ID_CDP); if (!vdev || !macaddr) goto fail0; @@ -6160,12 +6215,12 @@ static int dp_update_filter_neighbour_peers(struct cdp_soc_t *soc_hdl, qdf_spin_unlock_bh(&pdev->neighbour_peer_mutex); } - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return 1; fail0: if (vdev) - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return 0; } #endif /* ATH_SUPPORT_NAC_RSSI || ATH_SUPPORT_NAC */ @@ -6302,14 +6357,20 @@ dp_peer_authorize(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, * dp_vdev_unref_delete() - check and process vdev delete * @soc : DP specific soc pointer * @vdev: DP specific vdev pointer + * @mod_id: module id * */ -void dp_vdev_unref_delete(struct dp_soc *soc, struct dp_vdev *vdev) +void dp_vdev_unref_delete(struct dp_soc *soc, struct dp_vdev *vdev, + enum dp_mod_id mod_id) { ol_txrx_vdev_delete_cb vdev_delete_cb = NULL; void *vdev_delete_context = NULL; uint8_t vdev_id = vdev->vdev_id; struct dp_pdev *pdev = vdev->pdev; + struct dp_vdev *tmp_vdev = NULL; + uint8_t found = 0; + + QDF_ASSERT(qdf_atomic_dec_return(&vdev->mod_refs[mod_id]) >= 0); /* Return if this is not the last reference*/ if (!qdf_atomic_dec_and_test(&vdev->ref_cnt)) @@ -6342,6 +6403,21 @@ void dp_vdev_unref_delete(struct dp_soc *soc, struct dp_vdev *vdev) free_vdev: qdf_spinlock_destroy(&vdev->peer_list_lock); + + qdf_spin_lock_bh(&soc->inactive_vdev_list_lock); + TAILQ_FOREACH(tmp_vdev, &soc->inactive_vdev_list, + inactive_list_elem) { + if (tmp_vdev == vdev) { + found = 1; + break; + } + } + if (found) + TAILQ_REMOVE(&soc->inactive_vdev_list, vdev, + inactive_list_elem); + /* delete this peer from the list */ + qdf_spin_unlock_bh(&soc->inactive_vdev_list_lock); + dp_info("deleting vdev object %pK (%pM)", vdev, vdev->mac_addr.raw); wlan_minidump_remove(vdev); @@ -6358,7 +6434,7 @@ free_vdev: * @mod_id: ID of module releasing reference * */ -void dp_peer_unref_delete(struct dp_peer *peer, enum dp_peer_mod_id mod_id) +void dp_peer_unref_delete(struct dp_peer *peer, enum dp_mod_id mod_id) { struct dp_vdev *vdev = peer->vdev; struct dp_pdev *pdev = vdev->pdev; @@ -6436,7 +6512,7 @@ void dp_peer_unref_delete(struct dp_peer *peer, enum dp_peer_mod_id mod_id) /* * Decrement ref count taken at peer create */ - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CHILD); } } @@ -6513,7 +6589,7 @@ static QDF_STATUS dp_peer_delete_wifi3(struct cdp_soc_t *soc_hdl, * PEER_UNMAP message arrives to remove the other * reference, added by the PEER_MAP message. */ - dp_peer_unref_delete(peer, DP_MOD_ID_PEER_CONFIG); + dp_peer_unref_delete(peer, DP_MOD_ID_CONFIG); /* * Remove the reference taken above */ @@ -6534,14 +6610,15 @@ static uint8 *dp_get_vdev_mac_addr_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id) { 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); + struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, + DP_MOD_ID_CDP); uint8_t *mac = NULL; if (!vdev) return NULL; mac = vdev->mac_addr.raw; - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return mac; } @@ -6559,13 +6636,14 @@ static int dp_vdev_set_wds(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, { struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); struct dp_vdev *vdev = - dp_vdev_get_ref_by_id((struct dp_soc *)soc, vdev_id); + dp_vdev_get_ref_by_id((struct dp_soc *)soc, vdev_id, + DP_MOD_ID_CDP); if (!vdev) return QDF_STATUS_E_FAILURE; vdev->wds_enabled = val; - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return QDF_STATUS_SUCCESS; } @@ -6592,7 +6670,8 @@ static uint8_t dp_get_mon_vdev_from_pdev_wifi3(struct cdp_soc_t *soc_hdl, static int dp_get_opmode(struct cdp_soc_t *soc_hdl, uint8_t vdev_id) { 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); + struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, + DP_MOD_ID_CDP); int opmode; if (!vdev) { @@ -6600,7 +6679,7 @@ static int dp_get_opmode(struct cdp_soc_t *soc_hdl, uint8_t vdev_id) return -EINVAL; } opmode = vdev->opmode; - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return opmode; } @@ -6621,14 +6700,15 @@ void dp_get_os_rx_handles_from_vdev_wifi3(struct cdp_soc_t *soc_hdl, ol_osif_vdev_handle *osif_vdev_p) { 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); + struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, + DP_MOD_ID_CDP); if (!vdev) return; *stack_fn_p = vdev->osif_rx_stack; *osif_vdev_p = vdev->osif_vdev; - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); } /** @@ -6643,14 +6723,15 @@ static struct cdp_cfg *dp_get_ctrl_pdev_from_vdev_wifi3( uint8_t vdev_id) { 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); + struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, + DP_MOD_ID_CDP); struct dp_pdev *pdev; if (!vdev) return NULL; pdev = vdev->pdev; - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return pdev ? (struct cdp_cfg *)pdev->wlan_cfg_ctx : NULL; } @@ -6809,8 +6890,8 @@ static QDF_STATUS dp_vdev_set_monitor_mode(struct cdp_soc_t *soc_hdl, struct dp_pdev *pdev; uint32_t num_entries; struct dp_srng *mon_buf_ring; - struct dp_vdev *vdev = - dp_vdev_get_ref_by_id(soc, vdev_id); + struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, + DP_MOD_ID_CDP); QDF_STATUS status = QDF_STATUS_SUCCESS; if (!vdev) @@ -6878,7 +6959,7 @@ static QDF_STATUS dp_vdev_set_monitor_mode(struct cdp_soc_t *soc_hdl, } fail: - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return status; } @@ -7062,13 +7143,13 @@ static void dp_enable_vdev_peer_protocol_count(struct cdp_soc_t *soc_hdl, struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); struct dp_vdev *vdev; - vdev = dp_vdev_get_ref_by_id(soc, vdev_id); + vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_CDP); if (!vdev) return; dp_info("enable %d vdev_id %d", enable, vdev_id); vdev->peer_protocol_count_track = enable; - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); } static void dp_enable_vdev_peer_protocol_drop_mask(struct cdp_soc_t *soc_hdl, @@ -7078,13 +7159,13 @@ static void dp_enable_vdev_peer_protocol_drop_mask(struct cdp_soc_t *soc_hdl, struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); struct dp_vdev *vdev; - vdev = dp_vdev_get_ref_by_id(soc, vdev_id); + vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_CDP); if (!vdev) return; dp_info("drop_mask %d vdev_id %d", drop_mask, vdev_id); vdev->peer_protocol_count_dropmask = drop_mask; - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); } static int dp_is_vdev_peer_protocol_count_enabled(struct cdp_soc_t *soc_hdl, @@ -7094,7 +7175,7 @@ static int dp_is_vdev_peer_protocol_count_enabled(struct cdp_soc_t *soc_hdl, struct dp_vdev *vdev; int peer_protocol_count_track; - vdev = dp_vdev_get_ref_by_id(soc, vdev_id); + vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_CDP); if (!vdev) return 0; @@ -7103,7 +7184,7 @@ static int dp_is_vdev_peer_protocol_count_enabled(struct cdp_soc_t *soc_hdl, peer_protocol_count_track = vdev->peer_protocol_count_track; - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return peer_protocol_count_track; } @@ -7114,7 +7195,7 @@ static int dp_get_vdev_peer_protocol_drop_mask(struct cdp_soc_t *soc_hdl, struct dp_vdev *vdev; int peer_protocol_count_dropmask; - vdev = dp_vdev_get_ref_by_id(soc, vdev_id); + vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_CDP); if (!vdev) return 0; @@ -7123,7 +7204,7 @@ static int dp_get_vdev_peer_protocol_drop_mask(struct cdp_soc_t *soc_hdl, peer_protocol_count_dropmask = vdev->peer_protocol_count_dropmask; - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return peer_protocol_count_dropmask; } @@ -7354,12 +7435,12 @@ static QDF_STATUS dp_get_device_stats(struct cdp_soc_t *soc_hdl, uint8_t id, switch (type) { case UPDATE_VDEV_STATS: - vdev = dp_vdev_get_ref_by_id(soc, id); + vdev = dp_vdev_get_ref_by_id(soc, id, DP_MOD_ID_CDP); if (vdev) { status = dp_vdev_getstats((struct cdp_vdev *)vdev, stats); - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); } return status; case UPDATE_PDEV_STATS: @@ -8340,22 +8421,18 @@ dp_calculate_delay_stats(struct cdp_soc_t *cdp_soc, uint8_t vdev_id, qdf_nbuf_t nbuf) { struct dp_soc *soc = cdp_soc_t_to_dp_soc(cdp_soc); - struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id); + struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, + DP_MOD_ID_CDP); if (!vdev) return QDF_STATUS_SUCCESS; - if (vdev->pdev->delay_stats_flag) { + if (vdev->pdev->delay_stats_flag) dp_rx_compute_delay(vdev, nbuf); - } else { - /* - * Update the per peer delay stats - */ + else dp_rx_update_peer_delay_stats(soc, nbuf); - } - - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return QDF_STATUS_SUCCESS; } @@ -8373,7 +8450,8 @@ static QDF_STATUS dp_get_vdev_param(struct cdp_soc_t *cdp_soc, uint8_t vdev_id, cdp_config_param_type *val) { struct dp_soc *soc = cdp_soc_t_to_dp_soc(cdp_soc); - struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id); + struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, + DP_MOD_ID_CDP); if (!vdev) return QDF_STATUS_E_FAILURE; @@ -8392,11 +8470,11 @@ static QDF_STATUS dp_get_vdev_param(struct cdp_soc_t *cdp_soc, uint8_t vdev_id, QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, "param value %d is wrong\n", param); - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return QDF_STATUS_E_FAILURE; } - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return QDF_STATUS_SUCCESS; } @@ -8415,7 +8493,7 @@ dp_set_vdev_param(struct cdp_soc_t *cdp_soc, uint8_t vdev_id, { struct dp_soc *dsoc = (struct dp_soc *)cdp_soc; struct dp_vdev *vdev = - dp_vdev_get_ref_by_id(dsoc, vdev_id); + dp_vdev_get_ref_by_id(dsoc, vdev_id, DP_MOD_ID_CDP); uint32_t var = 0; if (!vdev) @@ -8505,7 +8583,7 @@ dp_set_vdev_param(struct cdp_soc_t *cdp_soc, uint8_t vdev_id, } dp_tx_vdev_update_search_flags((struct dp_vdev *)vdev); - dp_vdev_unref_delete(dsoc, vdev); + dp_vdev_unref_delete(dsoc, vdev, DP_MOD_ID_CDP); return QDF_STATUS_SUCCESS; } @@ -8652,15 +8730,16 @@ dp_peer_update_pkt_capture_params(ol_txrx_soc_handle soc, * * Return: QDF_STATUS */ -static QDF_STATUS dp_set_vdev_dscp_tid_map_wifi3(ol_txrx_soc_handle soc, +static QDF_STATUS dp_set_vdev_dscp_tid_map_wifi3(ol_txrx_soc_handle cdp_soc, uint8_t vdev_id, uint8_t map_id) { - struct dp_vdev *vdev = - dp_vdev_get_ref_by_id((struct dp_soc *)soc, vdev_id); + struct dp_soc *soc = cdp_soc_t_to_dp_soc(cdp_soc); + struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, + DP_MOD_ID_CDP); if (vdev) { vdev->dscp_tid_map_id = map_id; - dp_vdev_unref_delete((struct dp_soc *)soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return QDF_STATUS_SUCCESS; } @@ -8757,7 +8836,8 @@ static QDF_STATUS dp_txrx_update_vdev_host_stats(struct cdp_soc_t *soc_hdl, uint16_t stats_id) { 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); + struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, + DP_MOD_ID_CDP); if (!vdev) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, @@ -8776,7 +8856,7 @@ static QDF_STATUS dp_txrx_update_vdev_host_stats(struct cdp_soc_t *soc_hdl, break; } - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return QDF_STATUS_SUCCESS; } @@ -8927,7 +9007,8 @@ static int dp_txrx_get_vdev_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, { struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); struct cdp_vdev_stats *vdev_stats; - struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id); + struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, + DP_MOD_ID_CDP); if (!vdev) return 1; @@ -8940,7 +9021,7 @@ static int dp_txrx_get_vdev_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, qdf_mem_copy(vdev_stats, &vdev->stats, sizeof(vdev->stats)); } - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return 0; } @@ -9112,7 +9193,8 @@ QDF_STATUS dp_txrx_stats_request(struct cdp_soc_t *soc_handle, int fw_stats; enum cdp_stats stats; int num_stats; - struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id); + struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, + DP_MOD_ID_CDP); QDF_STATUS status = QDF_STATUS_E_INVAL; if (!vdev || !req) { @@ -9169,7 +9251,7 @@ QDF_STATUS dp_txrx_stats_request(struct cdp_soc_t *soc_handle, "Wrong Input for TxRx Stats"); fail0: if (vdev) - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return status; } @@ -9393,7 +9475,8 @@ dp_txrx_data_tx_cb_set(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, ol_txrx_data_tx_cb callback, void *ctxt) { 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); + struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, + DP_MOD_ID_CDP); if (!vdev) return; @@ -9401,7 +9484,7 @@ dp_txrx_data_tx_cb_set(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, vdev->tx_non_std_data_callback.func = callback; vdev->tx_non_std_data_callback.ctxt = ctxt; - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); } /** @@ -9451,16 +9534,19 @@ dp_pdev_set_dp_txrx_handle(struct cdp_soc_t *soc, uint8_t pdev_id, * * Return: opaque pointer to dp txrx handle */ -static void *dp_vdev_get_dp_ext_handle(ol_txrx_soc_handle soc, uint8_t vdev_id) +static void *dp_vdev_get_dp_ext_handle(ol_txrx_soc_handle soc_hdl, + uint8_t vdev_id) { - struct dp_vdev *vdev = - dp_vdev_get_ref_by_id((struct dp_soc *)soc, vdev_id); + 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_CDP); void *dp_ext_handle; if (!vdev) return NULL; dp_ext_handle = vdev->vdev_dp_ext_handle; + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return dp_ext_handle; } @@ -9477,7 +9563,8 @@ dp_vdev_set_dp_ext_handle(ol_txrx_soc_handle soc_hdl, uint8_t vdev_id, uint16_t size) { 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); + struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, + DP_MOD_ID_CDP); void *dp_ext_handle; if (!vdev) @@ -9486,13 +9573,13 @@ dp_vdev_set_dp_ext_handle(ol_txrx_soc_handle soc_hdl, uint8_t vdev_id, dp_ext_handle = qdf_mem_malloc(size); if (!dp_ext_handle) { - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return QDF_STATUS_E_FAILURE; } vdev->vdev_dp_ext_handle = dp_ext_handle; - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return QDF_STATUS_SUCCESS; } @@ -9698,7 +9785,8 @@ static QDF_STATUS dp_vdev_get_neighbour_rssi(struct cdp_soc_t *soc_hdl, uint8_t *rssi) { 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); + struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, + DP_MOD_ID_CDP); struct dp_pdev *pdev; struct dp_neighbour_peer *peer = NULL; QDF_STATUS status = QDF_STATUS_E_FAILURE; @@ -9719,7 +9807,7 @@ static QDF_STATUS dp_vdev_get_neighbour_rssi(struct cdp_soc_t *soc_hdl, } } qdf_spin_unlock_bh(&pdev->neighbour_peer_mutex); - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return status; } @@ -9731,8 +9819,8 @@ dp_config_for_nac_rssi(struct cdp_soc_t *cdp_soc, uint8_t chan_num) { struct dp_soc *soc = (struct dp_soc *)cdp_soc; - struct dp_vdev *vdev = - dp_vdev_get_ref_by_id(soc, vdev_id); + struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, + DP_MOD_ID_CDP); struct dp_pdev *pdev; if (!vdev) @@ -9759,7 +9847,7 @@ dp_config_for_nac_rssi(struct cdp_soc_t *cdp_soc, (soc->ctrl_psoc, pdev->pdev_id, vdev->vdev_id, cmd, bssid, client_macaddr); - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return QDF_STATUS_SUCCESS; } #endif @@ -10195,14 +10283,15 @@ static QDF_STATUS dp_set_vdev_pcp_tid_map_wifi3(struct cdp_soc_t *soc_hdl, uint8_t pcp, uint8_t tid) { 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); + struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, + DP_MOD_ID_CDP); if (!vdev) return QDF_STATUS_E_FAILURE; vdev->pcp_tid_map[pcp] = tid; - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return QDF_STATUS_SUCCESS; } @@ -10536,8 +10625,8 @@ static uint32_t dp_tx_get_success_ack_stats(struct cdp_soc_t *soc_hdl, struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); struct cdp_vdev_stats *vdev_stats = NULL; uint32_t tx_success; - struct dp_vdev *vdev = - (struct dp_vdev *)dp_vdev_get_ref_by_id(soc, vdev_id); + struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, + DP_MOD_ID_CDP); if (!vdev) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, @@ -10549,7 +10638,7 @@ static uint32_t dp_tx_get_success_ack_stats(struct cdp_soc_t *soc_hdl, if (!vdev_stats) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, "DP alloc failure - unable to get alloc vdev stats"); - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return 0; } @@ -10558,7 +10647,7 @@ static uint32_t dp_tx_get_success_ack_stats(struct cdp_soc_t *soc_hdl, tx_success = vdev_stats->tx.tx_success.num; qdf_mem_free(vdev_stats); - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return tx_success; } @@ -10751,7 +10840,8 @@ static QDF_STATUS dp_request_rx_hw_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id) { struct dp_soc *soc = (struct dp_soc *)soc_hdl; - struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id); + struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, + DP_MOD_ID_CDP); struct dp_peer *peer = NULL; QDF_STATUS status; struct dp_req_rx_hw_stats_t *rx_hw_stats; @@ -10825,7 +10915,7 @@ out: if (peer) dp_peer_unref_delete(peer, DP_MOD_ID_CDP); if (vdev) - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return status; } @@ -11413,6 +11503,8 @@ void *dp_soc_init(struct dp_soc *soc, HTC_HANDLE htc_handle, TAILQ_INIT(&soc->inactive_peer_list); qdf_spinlock_create(&soc->inactive_peer_list_lock); + TAILQ_INIT(&soc->inactive_vdev_list); + qdf_spinlock_create(&soc->inactive_vdev_list_lock); qdf_spinlock_create(&soc->htt_stats.lock); /* initialize work queue for stats processing */ qdf_create_work(0, &soc->htt_stats.work, htt_t2h_stats_handler, soc); @@ -12069,7 +12161,7 @@ uint16_t dp_get_peer_mac_list(ol_txrx_soc_handle soc, uint8_t vdev_id, { struct dp_soc *dp_soc = (struct dp_soc *)soc; struct dp_vdev *vdev = - dp_vdev_get_ref_by_id(dp_soc, vdev_id); + dp_vdev_get_ref_by_id(dp_soc, vdev_id, DP_MOD_ID_CDP); struct dp_peer *peer; uint16_t new_mac_cnt = 0; @@ -12086,7 +12178,7 @@ uint16_t dp_get_peer_mac_list(ol_txrx_soc_handle soc, uint8_t vdev_id, } } qdf_spin_unlock_bh(&vdev->peer_list_lock); - dp_vdev_unref_delete(dp_soc, vdev); + dp_vdev_unref_delete(dp_soc, vdev, DP_MOD_ID_CDP); return new_mac_cnt; } diff --git a/dp/wifi3.0/dp_peer.c b/dp/wifi3.0/dp_peer.c index c0af3f4eff..be33fc0053 100644 --- a/dp/wifi3.0/dp_peer.c +++ b/dp/wifi3.0/dp_peer.c @@ -244,7 +244,7 @@ void dp_peer_find_hash_add(struct dp_soc *soc, struct dp_peer *peer) index = dp_peer_find_hash_index(soc, &peer->mac_addr); qdf_spin_lock_bh(&soc->peer_hash_lock); - if (dp_peer_get_ref(soc, peer, DP_MOD_ID_PEER_CONFIG) != + if (dp_peer_get_ref(soc, peer, DP_MOD_ID_CONFIG) != QDF_STATUS_SUCCESS) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO, "unable to get peer reference at MAP mac %pM", @@ -277,7 +277,7 @@ void dp_peer_vdev_list_add(struct dp_soc *soc, struct dp_vdev *vdev, struct dp_peer *peer) { qdf_spin_lock_bh(&vdev->peer_list_lock); - if (dp_peer_get_ref(soc, peer, DP_MOD_ID_PEER_CONFIG) != + if (dp_peer_get_ref(soc, peer, DP_MOD_ID_CONFIG) != QDF_STATUS_SUCCESS) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO, "unable to get peer reference at MAP mac %pM", @@ -321,7 +321,7 @@ void dp_peer_vdev_list_remove(struct dp_soc *soc, struct dp_vdev *vdev, if (found) { TAILQ_REMOVE(&peer->vdev->peer_list, peer, peer_list_elem); - dp_peer_unref_delete(peer, DP_MOD_ID_PEER_CONFIG); + dp_peer_unref_delete(peer, DP_MOD_ID_CONFIG); vdev->num_peers--; } else { /*Ignoring the remove operation as peer not found*/ @@ -348,7 +348,7 @@ void dp_peer_find_id_to_obj_add(struct dp_soc *soc, qdf_spin_lock_bh(&soc->peer_map_lock); - if (dp_peer_get_ref(soc, peer, DP_MOD_ID_PEER_CONFIG) != + if (dp_peer_get_ref(soc, peer, DP_MOD_ID_CONFIG) != QDF_STATUS_SUCCESS) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO, "unable to get peer reference at MAP mac %pM peer_id %u", @@ -385,7 +385,7 @@ void dp_peer_find_id_to_obj_remove(struct dp_soc *soc, qdf_spin_lock_bh(&soc->peer_map_lock); peer = soc->peer_id_to_obj_map[peer_id]; soc->peer_id_to_obj_map[peer_id] = NULL; - dp_peer_unref_delete(peer, DP_MOD_ID_PEER_CONFIG); + dp_peer_unref_delete(peer, DP_MOD_ID_CONFIG); qdf_spin_unlock_bh(&soc->peer_map_lock); } @@ -1659,7 +1659,7 @@ static int dp_peer_ast_free_entry_by_mac(struct dp_soc *soc, */ struct dp_peer *dp_peer_find_hash_find(struct dp_soc *soc, uint8_t *peer_mac_addr, int mac_addr_is_aligned, uint8_t vdev_id, - enum dp_peer_mod_id mod_id) + enum dp_mod_id mod_id) { union dp_align_mac_addr local_mac_addr_aligned, *mac_addr; unsigned index; @@ -1719,7 +1719,7 @@ void dp_peer_find_hash_remove(struct dp_soc *soc, struct dp_peer *peer) QDF_ASSERT(found); TAILQ_REMOVE(&soc->peer_hash.bins[index], peer, hash_list_elem); - dp_peer_unref_delete(peer, DP_MOD_ID_PEER_CONFIG); + dp_peer_unref_delete(peer, DP_MOD_ID_CONFIG); qdf_spin_unlock_bh(&soc->peer_hash_lock); } @@ -1758,9 +1758,9 @@ void dp_peer_find_hash_erase(struct dp_soc *soc) /* incr to one */ qdf_atomic_inc(&peer->ref_cnt); qdf_atomic_inc(&peer->mod_refs - [DP_MOD_ID_PEER_CONFIG]); + [DP_MOD_ID_CONFIG]); dp_peer_unref_delete(peer, - DP_MOD_ID_PEER_CONFIG); + DP_MOD_ID_CONFIG); } } } @@ -1930,7 +1930,7 @@ static inline struct dp_peer *dp_peer_find_add_id(struct dp_soc *soc, QDF_ASSERT(peer_id <= soc->max_peers); /* check if there's already a peer object with this MAC address */ peer = dp_peer_find_hash_find(soc, peer_mac_addr, - 0 /* is aligned */, vdev_id, DP_MOD_ID_PEER_CONFIG); + 0 /* is aligned */, vdev_id, DP_MOD_ID_CONFIG); QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, "%s: peer %pK ID %d vid %d mac %pM", __func__, peer, peer_id, vdev_id, peer_mac_addr); @@ -1948,7 +1948,7 @@ static inline struct dp_peer *dp_peer_find_add_id(struct dp_soc *soc, * is received ignore this event */ if (peer->peer_state == DP_PEER_STATE_LOGICAL_DELETE) { - dp_peer_unref_delete(peer, DP_MOD_ID_PEER_CONFIG); + dp_peer_unref_delete(peer, DP_MOD_ID_CONFIG); dp_alert("Peer %pK[%pM] logical delete state vid %d", peer, peer_mac_addr, vdev_id); return NULL; @@ -2147,7 +2147,7 @@ dp_rx_peer_unmap_handler(struct dp_soc *soc, uint16_t peer_id, * Remove a reference to the peer. * If there are no more references, delete the peer object. */ - dp_peer_unref_delete(peer, DP_MOD_ID_PEER_CONFIG); + dp_peer_unref_delete(peer, DP_MOD_ID_CONFIG); } void @@ -4264,7 +4264,7 @@ dp_set_michael_key(struct cdp_soc_t *soc, */ struct dp_peer *dp_vdev_bss_peer_ref_n_get(struct dp_soc *soc, struct dp_vdev *vdev, - enum dp_peer_mod_id mod_id) + enum dp_mod_id mod_id) { struct dp_peer *peer = NULL; @@ -4298,7 +4298,7 @@ struct dp_peer *dp_vdev_bss_peer_ref_n_get(struct dp_soc *soc, */ struct dp_peer *dp_sta_vdev_self_peer_ref_n_get(struct dp_soc *soc, struct dp_vdev *vdev, - enum dp_peer_mod_id mod_id) + enum dp_mod_id mod_id) { struct dp_peer *peer; diff --git a/dp/wifi3.0/dp_peer.h b/dp/wifi3.0/dp_peer.h index 8446517241..68b401d567 100644 --- a/dp/wifi3.0/dp_peer.h +++ b/dp/wifi3.0/dp_peer.h @@ -28,7 +28,7 @@ typedef void dp_peer_iter_func(struct dp_soc *soc, struct dp_peer *peer, void *arg); -void dp_peer_unref_delete(struct dp_peer *peer, enum dp_peer_mod_id id); +void dp_peer_unref_delete(struct dp_peer *peer, enum dp_mod_id id); /** * dp_peer_get_ref() - Returns peer object given the peer id @@ -43,7 +43,7 @@ void dp_peer_unref_delete(struct dp_peer *peer, enum dp_peer_mod_id id); static inline QDF_STATUS dp_peer_get_ref(struct dp_soc *soc, struct dp_peer *peer, - enum dp_peer_mod_id mod_id) + enum dp_mod_id mod_id) { if (!qdf_atomic_inc_not_zero(&peer->ref_cnt)) return QDF_STATUS_E_INVAL; @@ -66,7 +66,7 @@ QDF_STATUS dp_peer_get_ref(struct dp_soc *soc, static inline struct dp_peer * __dp_peer_get_ref_by_id(struct dp_soc *soc, uint16_t peer_id, - enum dp_peer_mod_id mod_id) + enum dp_mod_id mod_id) { struct dp_peer *peer; @@ -97,7 +97,7 @@ __dp_peer_get_ref_by_id(struct dp_soc *soc, static inline struct dp_peer *dp_peer_get_ref_by_id(struct dp_soc *soc, uint16_t peer_id, - enum dp_peer_mod_id mod_id) + enum dp_mod_id mod_id) { struct dp_peer *peer; @@ -153,7 +153,7 @@ dp_clear_peer_internal(struct dp_soc *soc, struct dp_peer *peer) */ static inline void dp_vdev_iterate_peer(struct dp_vdev *vdev, dp_peer_iter_func *func, void *arg, - enum dp_peer_mod_id mod_id) + enum dp_mod_id mod_id) { struct dp_peer *peer; struct dp_peer *tmp_peer; @@ -189,7 +189,7 @@ dp_vdev_iterate_peer(struct dp_vdev *vdev, dp_peer_iter_func *func, void *arg, */ static inline void dp_pdev_iterate_peer(struct dp_pdev *pdev, dp_peer_iter_func *func, void *arg, - enum dp_peer_mod_id mod_id) + enum dp_mod_id mod_id) { struct dp_vdev *vdev; @@ -214,7 +214,7 @@ dp_pdev_iterate_peer(struct dp_pdev *pdev, dp_peer_iter_func *func, void *arg, */ static inline void dp_soc_iterate_peer(struct dp_soc *soc, dp_peer_iter_func *func, void *arg, - enum dp_peer_mod_id mod_id) + enum dp_mod_id mod_id) { struct dp_pdev *pdev; int i; @@ -248,7 +248,7 @@ static inline void dp_vdev_iterate_peer_lock_safe(struct dp_vdev *vdev, dp_peer_iter_func *func, void *arg, - enum dp_peer_mod_id mod_id) + enum dp_mod_id mod_id) { struct dp_peer *peer; struct dp_peer *tmp_peer; @@ -315,7 +315,7 @@ static inline void dp_pdev_iterate_peer_lock_safe(struct dp_pdev *pdev, dp_peer_iter_func *func, void *arg, - enum dp_peer_mod_id mod_id) + enum dp_mod_id mod_id) { struct dp_peer *peer; struct dp_peer *tmp_peer; @@ -396,7 +396,7 @@ static inline void dp_soc_iterate_peer_lock_safe(struct dp_soc *soc, dp_peer_iter_func *func, void *arg, - enum dp_peer_mod_id mod_id) + enum dp_mod_id mod_id) { struct dp_pdev *pdev; int i; @@ -748,8 +748,8 @@ static inline void dp_peer_ext_stats_ctx_dealloc(struct dp_soc *soc, struct dp_peer *dp_vdev_bss_peer_ref_n_get(struct dp_soc *soc, struct dp_vdev *vdev, - enum dp_peer_mod_id mod_id); + enum dp_mod_id mod_id); struct dp_peer *dp_sta_vdev_self_peer_ref_n_get(struct dp_soc *soc, struct dp_vdev *vdev, - enum dp_peer_mod_id mod_id); + enum dp_mod_id mod_id); #endif /* _DP_PEER_H_ */ diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index c1b62f0df5..ae789fc0e0 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -1876,7 +1876,7 @@ void dp_rx_deliver_to_stack_no_peer(struct dp_soc *soc, qdf_nbuf_t nbuf) goto deliver_fail; vdev_id = QDF_NBUF_CB_RX_VDEV_ID(nbuf); - vdev = dp_vdev_get_ref_by_id(soc, vdev_id); + vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_RX); if (!vdev || vdev->delete.pending || !vdev->osif_rx) goto deliver_fail; @@ -1902,7 +1902,7 @@ void dp_rx_deliver_to_stack_no_peer(struct dp_soc *soc, qdf_nbuf_t nbuf) vdev->osif_rx(vdev->osif_vdev, nbuf)) goto deliver_fail; DP_STATS_INC(soc, rx.err.pkt_delivered_no_peer, 1); - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_RX); return; } @@ -1911,7 +1911,7 @@ deliver_fail: QDF_NBUF_CB_RX_PKT_LEN(nbuf)); qdf_nbuf_free(nbuf); if (vdev) - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_RX); } #else static inline diff --git a/dp/wifi3.0/dp_stats.c b/dp/wifi3.0/dp_stats.c index 1cd885233e..f18723a684 100644 --- a/dp/wifi3.0/dp_stats.c +++ b/dp/wifi3.0/dp_stats.c @@ -4347,7 +4347,7 @@ void dp_peer_stats_update_protocol_cnt(struct cdp_soc_t *soc_hdl, struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); struct dp_vdev *vdev; - vdev = dp_vdev_get_ref_by_id(soc, vdev_id); + vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_GENERIC_STATS); if (!vdev) return; @@ -4355,7 +4355,7 @@ void dp_peer_stats_update_protocol_cnt(struct cdp_soc_t *soc_hdl, dp_vdev_peer_stats_update_protocol_cnt(vdev, nbuf, NULL, is_egress, is_rx); - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS); } #endif diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index 5c261018cd..2759959677 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -2179,7 +2179,8 @@ dp_tx_send_exception(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); qdf_ether_header_t *eh = NULL; struct dp_tx_msdu_info_s msdu_info; - struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id); + struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, + DP_MOD_ID_TX_EXCEPTION); if (qdf_unlikely(!vdev)) goto fail; @@ -2270,12 +2271,12 @@ dp_tx_send_exception(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, nbuf = dp_tx_send_msdu_single(vdev, nbuf, &msdu_info, tx_exc_metadata->peer_id, tx_exc_metadata); - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_TX_EXCEPTION); return nbuf; fail: if (vdev) - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_TX_EXCEPTION); dp_verbose_debug("pkt send failed"); return nbuf; } @@ -2310,7 +2311,7 @@ qdf_nbuf_t dp_tx_send_mesh(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, return nbuf; } - vdev = dp_vdev_get_ref_by_id(soc, vdev_id); + vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_MESH); if (!vdev) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, "vdev is NULL for vdev_id %d", vdev_id); @@ -2334,7 +2335,7 @@ qdf_nbuf_t dp_tx_send_mesh(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, if (!nbuf_clone) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, "qdf_nbuf_clone failed"); - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_MESH); return nbuf; } qdf_nbuf_set_tx_ftype(nbuf_clone, CB_FTYPE_MESH_TX_INFO); @@ -2358,7 +2359,7 @@ qdf_nbuf_t dp_tx_send_mesh(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, DP_STATS_INC(vdev, tx_i.mesh.exception_fw, 1); } - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_MESH); return nbuf; } @@ -4139,7 +4140,8 @@ qdf_nbuf_t dp_tx_non_std(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, enum ol_tx_spec tx_spec, qdf_nbuf_t msdu_list) { 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); + struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, + DP_MOD_ID_TDLS); if (!vdev) { dp_err("vdev handle for id %d is NULL", vdev_id); @@ -4148,7 +4150,7 @@ qdf_nbuf_t dp_tx_non_std(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, if (tx_spec & OL_TX_SPEC_NO_FREE) vdev->is_tdls_frame = true; - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_TDLS); return dp_tx_send(soc_hdl, vdev_id, msdu_list); } diff --git a/dp/wifi3.0/dp_tx_desc.h b/dp/wifi3.0/dp_tx_desc.h index 3539a98f1e..1dc5efab22 100644 --- a/dp/wifi3.0/dp_tx_desc.h +++ b/dp/wifi3.0/dp_tx_desc.h @@ -526,7 +526,8 @@ static inline bool dp_tx_desc_thresh_reached(struct cdp_soc_t *soc_hdl, uint8_t vdev_id) { 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); + struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, + DP_MOD_ID_CDP); struct dp_tx_desc_pool_s *pool; bool status; @@ -535,7 +536,7 @@ dp_tx_desc_thresh_reached(struct cdp_soc_t *soc_hdl, uint8_t vdev_id) pool = vdev->pool; status = dp_tx_is_threshold_reached(pool, pool->avail_desc); - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return status; } diff --git a/dp/wifi3.0/dp_tx_flow_control.c b/dp/wifi3.0/dp_tx_flow_control.c index 66c608d9d5..d14422294c 100644 --- a/dp/wifi3.0/dp_tx_flow_control.c +++ b/dp/wifi3.0/dp_tx_flow_control.c @@ -342,10 +342,12 @@ int dp_tx_delete_flow_pool(struct dp_soc *soc, struct dp_tx_desc_pool_s *pool, pool->status = FLOW_POOL_INVALID; qdf_spin_unlock_bh(&pool->flow_pool_lock); /* Reset TX desc associated to this Vdev as NULL */ - vdev = dp_vdev_get_ref_by_id(soc, pool->flow_pool_id); + vdev = dp_vdev_get_ref_by_id(soc, pool->flow_pool_id, + DP_MOD_ID_MISC); if (vdev) { dp_tx_desc_flush(vdev->pdev, vdev, false); - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, + DP_MOD_ID_MISC); } dp_err("avail desc less than pool size"); return -EAGAIN; @@ -372,7 +374,7 @@ static void dp_tx_flow_pool_vdev_map(struct dp_pdev *pdev, struct dp_vdev *vdev; struct dp_soc *soc = pdev->soc; - vdev = dp_vdev_get_ref_by_id(soc, vdev_id); + vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_CDP); if (!vdev) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, "%s: invalid vdev_id %d", @@ -385,7 +387,7 @@ static void dp_tx_flow_pool_vdev_map(struct dp_pdev *pdev, pool->pool_owner_ctx = soc; pool->flow_pool_id = vdev_id; qdf_spin_unlock_bh(&pool->flow_pool_lock); - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); } /** @@ -402,7 +404,7 @@ static void dp_tx_flow_pool_vdev_unmap(struct dp_pdev *pdev, struct dp_vdev *vdev; struct dp_soc *soc = pdev->soc; - vdev = dp_vdev_get_ref_by_id(soc, vdev_id); + vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_CDP); if (!vdev) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, "%s: invalid vdev_id %d", @@ -411,7 +413,7 @@ static void dp_tx_flow_pool_vdev_unmap(struct dp_pdev *pdev, } vdev->pool = NULL; - dp_vdev_unref_delete(soc, vdev); + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); } /** diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index e5752b2f85..9b7cb77ae9 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -169,11 +169,12 @@ enum dp_peer_state { }; /** - * enum for modules ids of peer reference + * enum for modules ids of */ -enum dp_peer_mod_id { +enum dp_mod_id { DP_MOD_ID_TX_COMP, DP_MOD_ID_RX, + DP_MOD_ID_HTT_COMP, DP_MOD_ID_RX_ERR, DP_MOD_ID_TX_PPDU_STATS, DP_MOD_ID_RX_PPDU_STATS, @@ -182,10 +183,16 @@ enum dp_peer_mod_id { DP_MOD_ID_TX_MULTIPASS, DP_MOD_ID_TX_CAPTURE, DP_MOD_ID_NSS_OFFLOAD, - DP_MOD_ID_PEER_CONFIG, + DP_MOD_ID_CONFIG, DP_MOD_ID_HTT, DP_MOD_ID_IPA, DP_MOD_ID_AST, + DP_MOD_ID_MCAST2UCAST, + DP_MOD_ID_CHILD, + DP_MOD_ID_MESH, + DP_MOD_ID_TX_EXCEPTION, + DP_MOD_ID_TDLS, + DP_MOD_ID_MISC, DP_MOD_ID_MAX, }; @@ -1508,6 +1515,8 @@ struct dp_soc { struct dp_last_op_info last_op_info; TAILQ_HEAD(, dp_peer) inactive_peer_list; qdf_spinlock_t inactive_peer_list_lock; + TAILQ_HEAD(, dp_vdev) inactive_vdev_list; + qdf_spinlock_t inactive_vdev_list_lock; /* lock to protect vdev_id_map table*/ qdf_spinlock_t vdev_map_lock; }; @@ -2303,6 +2312,9 @@ struct dp_vdev { #endif /* callback to collect connectivity stats */ ol_txrx_stats_rx_fp stats_cb; + uint32_t num_peers; + /* entry to inactive_list*/ + TAILQ_ENTRY(dp_vdev) inactive_list_elem; #ifdef WLAN_SUPPORT_RX_FISA /** @@ -2316,7 +2328,7 @@ struct dp_vdev { * peer is created for VDEV */ qdf_atomic_t ref_cnt; - uint32_t num_peers; + qdf_atomic_t mod_refs[DP_MOD_ID_MAX]; };