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
This commit is contained in:
Chaithanya Garrepalli
2020-08-03 13:49:38 +05:30
committed by Gerrit - the friendly Code Review server
parent fe5cbcd4ab
commit 81a724a970
3 changed files with 77 additions and 66 deletions

View File

@@ -2576,8 +2576,6 @@ static inline
QDF_STATUS dp_send_dummy_mpdu_info_to_stack(struct dp_pdev *pdev, QDF_STATUS dp_send_dummy_mpdu_info_to_stack(struct dp_pdev *pdev,
void *desc, uint8_t usr_idx) 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 *ppdu_desc = desc;
struct cdp_tx_completion_ppdu_user *user = &ppdu_desc->user[usr_idx]; struct cdp_tx_completion_ppdu_user *user = &ppdu_desc->user[usr_idx];
struct ieee80211_ctlframe_addr2 *wh_min; 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, qdf_nbuf_set_pktlen(tx_capture_info.mpdu_nbuf,
sizeof(struct ieee80211_frame_min_one)); sizeof(struct ieee80211_frame_min_one));
else { else {
struct dp_peer *peer;
struct dp_vdev *vdev = NULL;
peer = dp_peer_get_ref_by_id(pdev->soc, user->peer_id, peer = dp_peer_get_ref_by_id(pdev->soc, user->peer_id,
DP_MOD_ID_TX_CAPTURE); DP_MOD_ID_TX_CAPTURE);
if (peer) { if (peer) {
vdev = peer->vdev; 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); dp_peer_unref_delete(peer, DP_MOD_ID_TX_CAPTURE);
} else { } else {
vdev = vdev =
dp_get_vdev_from_soc_vdev_id_wifi3(pdev->soc, dp_vdev_get_ref_by_id(pdev->soc, ppdu_desc->vdev_id);
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)); 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 static
void dp_send_dummy_rts_cts_frame(struct dp_pdev *pdev, void dp_send_dummy_rts_cts_frame(struct dp_pdev *pdev,
struct cdp_tx_completion_ppdu *cur_ppdu_desc, struct cdp_tx_completion_ppdu *cur_ppdu_desc,
uint8_t usr_idx) uint8_t usr_id)
{ {
struct cdp_tx_completion_ppdu *ppdu_desc; struct cdp_tx_completion_ppdu *ppdu_desc;
struct dp_pdev_tx_capture *ptr_tx_cap; 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->channel = cur_ppdu_desc->channel;
ppdu_desc->num_mpdu = 1; ppdu_desc->num_mpdu = 1;
ppdu_desc->num_msdu = 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->bar_num_users = 0;
ppdu_desc->num_users = 1; 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 = ppdu_desc->ppdu_end_timestamp =
cur_ppdu_desc->ppdu_end_timestamp; cur_ppdu_desc->ppdu_end_timestamp;
ppdu_desc->tx_duration = cur_ppdu_desc->tx_duration; ppdu_desc->tx_duration = cur_ppdu_desc->tx_duration;
ppdu_desc->user[usr_idx].peer_id = ppdu_desc->user[usr_id].peer_id =
cur_ppdu_desc->user[usr_idx].peer_id; cur_ppdu_desc->user[usr_id].peer_id;
ppdu_desc->frame_ctrl = (IEEE80211_FC0_SUBTYPE_RTS | ppdu_desc->frame_ctrl = (IEEE80211_FC0_SUBTYPE_RTS |
IEEE80211_FC0_TYPE_CTL); IEEE80211_FC0_TYPE_CTL);
qdf_mem_copy(&ppdu_desc->user[usr_idx].mac_addr, qdf_mem_copy(&ppdu_desc->user[usr_id].mac_addr,
&cur_ppdu_desc->user[usr_idx].mac_addr, &cur_ppdu_desc->user[usr_id].mac_addr,
QDF_MAC_ADDR_SIZE); 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) || if ((rts_send && cur_ppdu_desc->rts_success) ||
cur_ppdu_desc->mprot_type == SEND_WIFICTS2SELF_E) { cur_ppdu_desc->mprot_type == SEND_WIFICTS2SELF_E) {
uint16_t peer_id; 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 */ /* send dummy CTS frame */
ppdu_desc->htt_frame_type = HTT_STATS_FTYPE_SGEN_CTS; ppdu_desc->htt_frame_type = HTT_STATS_FTYPE_SGEN_CTS;
ppdu_desc->frame_type = CDP_PPDU_FTYPE_CTRL; 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; cur_ppdu_desc->ppdu_end_timestamp;
ppdu_desc->tx_duration = cur_ppdu_desc->tx_duration - ppdu_desc->tx_duration = cur_ppdu_desc->tx_duration -
(RTS_INTERVAL + SIFS_INTERVAL); (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, peer = dp_peer_get_ref_by_id(pdev->soc, peer_id,
DP_MOD_ID_TX_CAPTURE); DP_MOD_ID_TX_CAPTURE);
if (peer) { if (peer) {
vdev = peer->vdev; 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); dp_peer_unref_delete(peer, DP_MOD_ID_TX_CAPTURE);
} else { } else {
uint8_t vdev_id; uint8_t vdev_id;
vdev_id = ppdu_desc->vdev_id; vdev_id = ppdu_desc->vdev_id;
vdev = dp_get_vdev_from_soc_vdev_id_wifi3(pdev->soc, vdev = dp_vdev_get_ref_by_id(pdev->soc, vdev_id);
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);
} }
} }

View File

@@ -253,11 +253,12 @@ static void dp_tx_me_mem_free(struct dp_pdev *pdev,
* return: no of converted packets * return: no of converted packets
*/ */
uint16_t 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, qdf_nbuf_t nbuf,
uint8_t newmac[][QDF_MAC_ADDR_SIZE], uint8_t newmac[][QDF_MAC_ADDR_SIZE],
uint8_t new_mac_cnt) uint8_t new_mac_cnt)
{ {
struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
struct dp_pdev *pdev; struct dp_pdev *pdev;
qdf_ether_header_t *eh; qdf_ether_header_t *eh;
uint8_t *data; 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; qdf_dma_addr_t paddr_mcbuf = 0;
uint8_t empty_entry_mac[QDF_MAC_ADDR_SIZE] = {0}; uint8_t empty_entry_mac[QDF_MAC_ADDR_SIZE] = {0};
QDF_STATUS status; QDF_STATUS status;
struct dp_vdev *vdev = struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
dp_get_vdev_from_soc_vdev_id_wifi3((struct dp_soc *)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) if (!vdev)
return 1; goto free_return;
pdev = vdev->pdev; pdev = vdev->pdev;
if (!pdev) if (!pdev)
return 1; goto free_return;
qdf_mem_zero(&msdu_info, sizeof(msdu_info)); 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) { if (!seg_info_head) {
goto free_return; goto unmap_free_return;
} }
msdu_info.u.sg_info.curr_seg = seg_info_head; 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_unmap(pdev->soc->osdev, nbuf, QDF_DMA_TO_DEVICE);
qdf_nbuf_free(nbuf); qdf_nbuf_free(nbuf);
dp_vdev_unref_delete(soc, vdev);
return new_mac_cnt; return new_mac_cnt;
fail_map: fail_map:
@@ -459,8 +445,11 @@ fail_buf_alloc:
fail_seg_alloc: fail_seg_alloc:
dp_tx_me_mem_free(pdev, seg_info_head); 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); 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); qdf_nbuf_free(nbuf);
return 1; return 1;
} }

View File

@@ -228,12 +228,12 @@ void dp_tx_mec_handler(struct dp_vdev *vdev, uint8_t *status)
*/ */
#ifdef WDS_VENDOR_EXTENSION #ifdef WDS_VENDOR_EXTENSION
QDF_STATUS 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_peer *peer;
struct dp_vdev *vdev = struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
dp_get_vdev_from_soc_vdev_id_wifi3((struct dp_soc *)soc,
vdev_id);
if (!vdev) { if (!vdev) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
FL("vdev is NULL for vdev_id %d"), vdev_id); 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_peer_unref_delete(peer, DP_MOD_ID_AST);
} }
dp_vdev_unref_delete(soc, vdev);
return QDF_STATUS_SUCCESS; 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_soc *soc = (struct dp_soc *)cdp_soc;
struct dp_vdev *vdev = struct dp_vdev *vdev =
dp_get_vdev_from_soc_vdev_id_wifi3((struct dp_soc *)soc, dp_vdev_get_ref_by_id((struct dp_soc *)soc, vdev_id);
vdev_id);
if (!vdev || !vdev->multipass_en) if (vdev && vdev->multipass_en) {
return; dp_peer_multipass_list_add(soc, peer_mac, vdev_id, vlan_id);
dp_vdev_unref_delete(soc, vdev);
dp_peer_multipass_list_add(soc, peer_mac, vdev_id, vlan_id); }
} }
/** /**
@@ -712,15 +712,17 @@ void dp_peer_set_vlan_id(struct cdp_soc_t *cdp_soc,
* *
* return: set success/failure * return: set success/failure
*/ */
QDF_STATUS dp_set_vlan_groupkey(struct cdp_soc_t *soc, uint8_t vdev_id, QDF_STATUS dp_set_vlan_groupkey(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
uint16_t vlan_id, uint16_t group_key) uint16_t vlan_id, uint16_t group_key)
{ {
struct dp_vdev *vdev = struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
dp_get_vdev_from_soc_vdev_id_wifi3((struct dp_soc *)soc, struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
vdev_id); QDF_STATUS status;
if (!vdev || !vdev->multipass_en) if (!vdev || !vdev->multipass_en) {
return QDF_STATUS_E_INVAL; status = QDF_STATUS_E_INVAL;
goto fail;
}
if (!vdev->iv_vlan_map) { if (!vdev->iv_vlan_map) {
uint16_t vlan_map_size = (sizeof(uint16_t))*DP_MAX_VLAN_IDS; 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) { if (!vdev->iv_vlan_map) {
QDF_TRACE_ERROR(QDF_MODULE_ID_DP, "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); qdf_mem_zero(vdev->iv_vlan_map, vlan_map_size);
} }
if (vlan_id >= DP_MAX_VLAN_IDS) if (vlan_id >= DP_MAX_VLAN_IDS) {
return QDF_STATUS_E_INVAL; status = QDF_STATUS_E_INVAL;
goto fail;
}
vdev->iv_vlan_map[vlan_id] = group_key; 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;
} }
/** /**