From 81a724a97008ecea40ab096cadc5c16b9dc15c91 Mon Sep 17 00:00:00 2001 From: Chaithanya Garrepalli Date: Mon, 3 Aug 2020 13:49:38 +0530 Subject: [PATCH] qca-wifi: call dp_vdev_get_ref_by_id API to get vdev object Use dp_vdev_get_ref_by_id() to get vdev object from vdev id array also call dp_vdev_unref_delete() API to release reference held by dp_vdev_get_ref_by_id Change-Id: Icd8fac503d46dc0a010c6911116d9243effee777 --- dp/wifi3.0/dp_tx_capture.c | 59 +++++++++++++++++++++++--------------- dp/wifi3.0/dp_txrx_me.c | 33 +++++++-------------- dp/wifi3.0/dp_txrx_wds.c | 51 ++++++++++++++++++-------------- 3 files changed, 77 insertions(+), 66 deletions(-) diff --git a/dp/wifi3.0/dp_tx_capture.c b/dp/wifi3.0/dp_tx_capture.c index ce3cb29cba..bb8d6154cb 100644 --- a/dp/wifi3.0/dp_tx_capture.c +++ b/dp/wifi3.0/dp_tx_capture.c @@ -2576,8 +2576,6 @@ static inline QDF_STATUS dp_send_dummy_mpdu_info_to_stack(struct dp_pdev *pdev, void *desc, uint8_t usr_idx) { - struct dp_peer *peer; - struct dp_vdev *vdev = NULL; struct cdp_tx_completion_ppdu *ppdu_desc = desc; struct cdp_tx_completion_ppdu_user *user = &ppdu_desc->user[usr_idx]; struct ieee80211_ctlframe_addr2 *wh_min; @@ -2663,20 +2661,29 @@ QDF_STATUS dp_send_dummy_mpdu_info_to_stack(struct dp_pdev *pdev, qdf_nbuf_set_pktlen(tx_capture_info.mpdu_nbuf, sizeof(struct ieee80211_frame_min_one)); else { + struct dp_peer *peer; + struct dp_vdev *vdev = NULL; + peer = dp_peer_get_ref_by_id(pdev->soc, user->peer_id, DP_MOD_ID_TX_CAPTURE); if (peer) { vdev = peer->vdev; + + if (vdev) + qdf_mem_copy(wh_min->i_addr2, + vdev->mac_addr.raw, + QDF_MAC_ADDR_SIZE); dp_peer_unref_delete(peer, DP_MOD_ID_TX_CAPTURE); } else { vdev = - dp_get_vdev_from_soc_vdev_id_wifi3(pdev->soc, - ppdu_desc->vdev_id); + dp_vdev_get_ref_by_id(pdev->soc, ppdu_desc->vdev_id); + if (vdev) { + qdf_mem_copy(wh_min->i_addr2, + vdev->mac_addr.raw, + QDF_MAC_ADDR_SIZE); + dp_vdev_unref_delete(pdev->soc, vdev); + } } - if (vdev) - qdf_mem_copy(wh_min->i_addr2, - vdev->mac_addr.raw, - QDF_MAC_ADDR_SIZE); qdf_nbuf_set_pktlen(tx_capture_info.mpdu_nbuf, sizeof(*wh_min)); } @@ -2710,7 +2717,7 @@ QDF_STATUS dp_send_dummy_mpdu_info_to_stack(struct dp_pdev *pdev, static void dp_send_dummy_rts_cts_frame(struct dp_pdev *pdev, struct cdp_tx_completion_ppdu *cur_ppdu_desc, - uint8_t usr_idx) + uint8_t usr_id) { struct cdp_tx_completion_ppdu *ppdu_desc; struct dp_pdev_tx_capture *ptr_tx_cap; @@ -2725,7 +2732,7 @@ void dp_send_dummy_rts_cts_frame(struct dp_pdev *pdev, ppdu_desc->channel = cur_ppdu_desc->channel; ppdu_desc->num_mpdu = 1; ppdu_desc->num_msdu = 1; - ppdu_desc->user[usr_idx].ppdu_type = HTT_PPDU_STATS_PPDU_TYPE_SU; + ppdu_desc->user[usr_id].ppdu_type = HTT_PPDU_STATS_PPDU_TYPE_SU; ppdu_desc->bar_num_users = 0; ppdu_desc->num_users = 1; @@ -2744,22 +2751,22 @@ void dp_send_dummy_rts_cts_frame(struct dp_pdev *pdev, ppdu_desc->ppdu_end_timestamp = cur_ppdu_desc->ppdu_end_timestamp; ppdu_desc->tx_duration = cur_ppdu_desc->tx_duration; - ppdu_desc->user[usr_idx].peer_id = - cur_ppdu_desc->user[usr_idx].peer_id; + ppdu_desc->user[usr_id].peer_id = + cur_ppdu_desc->user[usr_id].peer_id; ppdu_desc->frame_ctrl = (IEEE80211_FC0_SUBTYPE_RTS | IEEE80211_FC0_TYPE_CTL); - qdf_mem_copy(&ppdu_desc->user[usr_idx].mac_addr, - &cur_ppdu_desc->user[usr_idx].mac_addr, + qdf_mem_copy(&ppdu_desc->user[usr_id].mac_addr, + &cur_ppdu_desc->user[usr_id].mac_addr, QDF_MAC_ADDR_SIZE); - dp_send_dummy_mpdu_info_to_stack(pdev, ppdu_desc, usr_idx); + dp_send_dummy_mpdu_info_to_stack(pdev, ppdu_desc, usr_id); } if ((rts_send && cur_ppdu_desc->rts_success) || cur_ppdu_desc->mprot_type == SEND_WIFICTS2SELF_E) { uint16_t peer_id; - peer_id = cur_ppdu_desc->user[usr_idx].peer_id; + peer_id = cur_ppdu_desc->user[usr_id].peer_id; /* send dummy CTS frame */ ppdu_desc->htt_frame_type = HTT_STATS_FTYPE_SGEN_CTS; ppdu_desc->frame_type = CDP_PPDU_FTYPE_CTRL; @@ -2771,25 +2778,31 @@ void dp_send_dummy_rts_cts_frame(struct dp_pdev *pdev, cur_ppdu_desc->ppdu_end_timestamp; ppdu_desc->tx_duration = cur_ppdu_desc->tx_duration - (RTS_INTERVAL + SIFS_INTERVAL); - ppdu_desc->user[usr_idx].peer_id = peer_id; + ppdu_desc->user[usr_id].peer_id = peer_id; peer = dp_peer_get_ref_by_id(pdev->soc, peer_id, DP_MOD_ID_TX_CAPTURE); if (peer) { vdev = peer->vdev; + if (vdev) + qdf_mem_copy(&ppdu_desc->user[usr_id].mac_addr, + vdev->mac_addr.raw, + QDF_MAC_ADDR_SIZE); dp_peer_unref_delete(peer, DP_MOD_ID_TX_CAPTURE); } else { uint8_t vdev_id; vdev_id = ppdu_desc->vdev_id; - vdev = dp_get_vdev_from_soc_vdev_id_wifi3(pdev->soc, - vdev_id); + vdev = dp_vdev_get_ref_by_id(pdev->soc, vdev_id); + if (vdev) { + qdf_mem_copy(&ppdu_desc->user[usr_id].mac_addr, + vdev->mac_addr.raw, + QDF_MAC_ADDR_SIZE); + dp_vdev_unref_delete(pdev->soc, vdev); + } } - if (vdev) - qdf_mem_copy(&ppdu_desc->user[usr_idx].mac_addr, - vdev->mac_addr.raw, QDF_MAC_ADDR_SIZE); - dp_send_dummy_mpdu_info_to_stack(pdev, ppdu_desc, usr_idx); + dp_send_dummy_mpdu_info_to_stack(pdev, ppdu_desc, usr_id); } } diff --git a/dp/wifi3.0/dp_txrx_me.c b/dp/wifi3.0/dp_txrx_me.c index b6d8b1de6b..9eac78f329 100644 --- a/dp/wifi3.0/dp_txrx_me.c +++ b/dp/wifi3.0/dp_txrx_me.c @@ -253,11 +253,12 @@ static void dp_tx_me_mem_free(struct dp_pdev *pdev, * return: no of converted packets */ uint16_t -dp_tx_me_send_convert_ucast(struct cdp_soc_t *soc, uint8_t vdev_id, +dp_tx_me_send_convert_ucast(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, qdf_nbuf_t nbuf, uint8_t newmac[][QDF_MAC_ADDR_SIZE], uint8_t new_mac_cnt) { + struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); struct dp_pdev *pdev; qdf_ether_header_t *eh; uint8_t *data; @@ -280,31 +281,15 @@ dp_tx_me_send_convert_ucast(struct cdp_soc_t *soc, uint8_t vdev_id, qdf_dma_addr_t paddr_mcbuf = 0; uint8_t empty_entry_mac[QDF_MAC_ADDR_SIZE] = {0}; QDF_STATUS status; - struct dp_vdev *vdev = - dp_get_vdev_from_soc_vdev_id_wifi3((struct dp_soc *)soc, - vdev_id); + struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id); - if (!vdev) { - qdf_nbuf_free(nbuf); - return 1; - } - - pdev = vdev->pdev; - - if (!pdev) { - qdf_nbuf_free(nbuf); - return 1; - } - - vdev = dp_get_vdev_from_soc_vdev_id_wifi3((struct dp_soc *)soc, - vdev_id); if (!vdev) - return 1; + goto free_return; pdev = vdev->pdev; if (!pdev) - return 1; + goto free_return; qdf_mem_zero(&msdu_info, sizeof(msdu_info)); @@ -421,7 +406,7 @@ dp_tx_me_send_convert_ucast(struct cdp_soc_t *soc, uint8_t vdev_id, } if (!seg_info_head) { - goto free_return; + goto unmap_free_return; } msdu_info.u.sg_info.curr_seg = seg_info_head; @@ -445,6 +430,7 @@ dp_tx_me_send_convert_ucast(struct cdp_soc_t *soc, uint8_t vdev_id, qdf_nbuf_unmap(pdev->soc->osdev, nbuf, QDF_DMA_TO_DEVICE); qdf_nbuf_free(nbuf); + dp_vdev_unref_delete(soc, vdev); return new_mac_cnt; fail_map: @@ -459,8 +445,11 @@ fail_buf_alloc: fail_seg_alloc: dp_tx_me_mem_free(pdev, seg_info_head); -free_return: +unmap_free_return: qdf_nbuf_unmap(pdev->soc->osdev, nbuf, QDF_DMA_TO_DEVICE); +free_return: + if (vdev) + dp_vdev_unref_delete(soc, vdev); qdf_nbuf_free(nbuf); return 1; } diff --git a/dp/wifi3.0/dp_txrx_wds.c b/dp/wifi3.0/dp_txrx_wds.c index 1f25910136..1e4d292cb4 100644 --- a/dp/wifi3.0/dp_txrx_wds.c +++ b/dp/wifi3.0/dp_txrx_wds.c @@ -228,12 +228,12 @@ void dp_tx_mec_handler(struct dp_vdev *vdev, uint8_t *status) */ #ifdef WDS_VENDOR_EXTENSION QDF_STATUS -dp_txrx_set_wds_rx_policy(struct cdp_soc_t *soc, uint8_t vdev_id, u_int32_t val) +dp_txrx_set_wds_rx_policy(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, + u_int32_t val) { + struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); struct dp_peer *peer; - struct dp_vdev *vdev = - dp_get_vdev_from_soc_vdev_id_wifi3((struct dp_soc *)soc, - vdev_id); + struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id); if (!vdev) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, FL("vdev is NULL for vdev_id %d"), vdev_id); @@ -251,6 +251,7 @@ dp_txrx_set_wds_rx_policy(struct cdp_soc_t *soc, uint8_t vdev_id, u_int32_t val) dp_peer_unref_delete(peer, DP_MOD_ID_AST); } + dp_vdev_unref_delete(soc, vdev); return QDF_STATUS_SUCCESS; } @@ -694,13 +695,12 @@ void dp_peer_set_vlan_id(struct cdp_soc_t *cdp_soc, { struct dp_soc *soc = (struct dp_soc *)cdp_soc; struct dp_vdev *vdev = - dp_get_vdev_from_soc_vdev_id_wifi3((struct dp_soc *)soc, - vdev_id); + dp_vdev_get_ref_by_id((struct dp_soc *)soc, vdev_id); - if (!vdev || !vdev->multipass_en) - return; - - dp_peer_multipass_list_add(soc, peer_mac, vdev_id, vlan_id); + if (vdev && vdev->multipass_en) { + dp_peer_multipass_list_add(soc, peer_mac, vdev_id, vlan_id); + dp_vdev_unref_delete(soc, vdev); + } } /** @@ -712,15 +712,17 @@ void dp_peer_set_vlan_id(struct cdp_soc_t *cdp_soc, * * return: set success/failure */ -QDF_STATUS dp_set_vlan_groupkey(struct cdp_soc_t *soc, uint8_t vdev_id, - uint16_t vlan_id, uint16_t group_key) +QDF_STATUS dp_set_vlan_groupkey(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, + uint16_t vlan_id, uint16_t group_key) { - struct dp_vdev *vdev = - dp_get_vdev_from_soc_vdev_id_wifi3((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); + QDF_STATUS status; - if (!vdev || !vdev->multipass_en) - return QDF_STATUS_E_INVAL; + if (!vdev || !vdev->multipass_en) { + status = QDF_STATUS_E_INVAL; + goto fail; + } if (!vdev->iv_vlan_map) { uint16_t vlan_map_size = (sizeof(uint16_t))*DP_MAX_VLAN_IDS; @@ -728,7 +730,8 @@ QDF_STATUS dp_set_vlan_groupkey(struct cdp_soc_t *soc, uint8_t vdev_id, if (!vdev->iv_vlan_map) { QDF_TRACE_ERROR(QDF_MODULE_ID_DP, "iv_vlan_map"); - return QDF_STATUS_E_NOMEM; + status = QDF_STATUS_E_NOMEM; + goto fail; } /* @@ -738,11 +741,17 @@ QDF_STATUS dp_set_vlan_groupkey(struct cdp_soc_t *soc, uint8_t vdev_id, qdf_mem_zero(vdev->iv_vlan_map, vlan_map_size); } - if (vlan_id >= DP_MAX_VLAN_IDS) - return QDF_STATUS_E_INVAL; + if (vlan_id >= DP_MAX_VLAN_IDS) { + status = QDF_STATUS_E_INVAL; + goto fail; + } vdev->iv_vlan_map[vlan_id] = group_key; - return QDF_STATUS_SUCCESS; + status = QDF_STATUS_SUCCESS; +fail: + if (vdev) + dp_vdev_unref_delete(soc, vdev); + return status; } /**