qcacmn: remove bss and self peer back pointers from dp_vdev

Remove self and BSS peer back pointers and added APIs to
get self and BSS peer from VDEV

These new APIs will iterate through peer list and return
the appropriate peer by taking a reference

Caller has to take care of releasing the reference

Change-Id: I550ff83d665f3ad0a185bea1a1e6270c5474ff07
这个提交包含在:
Chaithanya Garrepalli
2020-08-06 10:36:40 +05:30
提交者 snandini
父节点 1010dcfa74
当前提交 82eb94c989
修改 5 个文件,包含 90 行新增90 行删除

查看文件

@@ -5197,6 +5197,7 @@ static QDF_STATUS dp_vdev_detach_wifi3(struct cdp_soc_t *cdp_soc,
struct dp_pdev *pdev;
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_get_vdev_from_soc_vdev_id_wifi3(soc, vdev_id);
if (!vdev)
@@ -5204,14 +5205,11 @@ static QDF_STATUS dp_vdev_detach_wifi3(struct cdp_soc_t *cdp_soc,
pdev = vdev->pdev;
if (wlan_op_mode_sta == vdev->opmode) {
if (vdev->vap_self_peer)
dp_peer_delete_wifi3((struct cdp_soc_t *)soc,
vdev->vdev_id,
vdev->vap_self_peer->mac_addr.raw,
0);
else
dp_err("vdev self peer is NULL");
vap_self_peer = dp_sta_vdev_self_peer_ref_n_get(soc, vdev);
if (vap_self_peer) {
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);
}
/*
@@ -5563,13 +5561,12 @@ dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
(wlan_op_mode_sta != vdev->opmode)) {
dp_info("vdev bss_peer!!");
peer->bss_peer = 1;
vdev->vap_bss_peer = peer;
}
if (wlan_op_mode_sta == vdev->opmode &&
qdf_mem_cmp(peer->mac_addr.raw, vdev->mac_addr.raw,
QDF_MAC_ADDR_SIZE) == 0) {
vdev->vap_self_peer = peer;
peer->sta_self_peer = 1;
}
for (i = 0; i < DP_MAX_TIDS; i++)
@@ -6146,35 +6143,6 @@ dp_peer_authorize(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
return status;
}
/*
* dp_vdev_reset_peer() - Update peer related member in vdev
as peer is going to free
* @vdev: datapath vdev handle
* @peer: dataptah peer handle
*
* Return: None
*/
static void dp_vdev_reset_peer(struct dp_vdev *vdev,
struct dp_peer *peer)
{
struct dp_peer *bss_peer = NULL;
if (!vdev) {
dp_err("vdev is NULL");
} else {
if (vdev->vap_bss_peer == peer) {
vdev->vap_bss_peer = NULL;
qdf_mem_zero(vdev->vap_bss_peer_mac_addr,
QDF_MAC_ADDR_SIZE);
}
if (vdev && vdev->vap_bss_peer) {
bss_peer = vdev->vap_bss_peer;
DP_UPDATE_STATS(vdev, peer);
}
}
}
/*
* dp_peer_release_mem() - free dp peer handle memory
* @soc: dataptah soc handle
@@ -6345,8 +6313,8 @@ void dp_peer_unref_delete(struct dp_peer *peer)
/* cleanup the peer data */
dp_peer_cleanup(vdev, peer, false);
/* reset this peer related info in vdev */
dp_vdev_reset_peer(vdev, peer);
if (!peer->bss_peer)
DP_UPDATE_STATS(vdev, peer);
/* save vdev related member in case vdev freed */
vdev_opmode = vdev->opmode;
qdf_mem_copy(vdev_mac_addr, vdev->mac_addr.raw,
@@ -10460,39 +10428,6 @@ dp_txrx_post_data_stall_event(struct cdp_soc_t *soc_hdl,
}
#endif /* WLAN_SUPPORT_DATA_STALL */
#ifdef DP_PEER_EXTENDED_API
/**
* dp_peer_get_ref_find_by_addr - get peer with addr by ref count inc
* @dev: physical device instance
* @peer_mac_addr: peer mac address
* @debug_id: to track enum peer access
*
* Return: peer instance pointer
*/
static void *
dp_peer_get_ref_find_by_addr(struct cdp_pdev *dev, uint8_t *peer_mac_addr,
enum peer_debug_id_type debug_id)
{
struct dp_pdev *pdev = (struct dp_pdev *)dev;
struct dp_peer *peer;
peer = dp_peer_find_hash_find(pdev->soc, peer_mac_addr, 0, DP_VDEV_ALL);
if (!peer)
return NULL;
if (peer->delete_in_progress) {
dp_err("Peer deletion in progress");
dp_peer_unref_delete(peer);
return NULL;
}
dp_info_rl("peer %pK mac: %pM", peer, peer->mac_addr.raw);
return peer;
}
#endif /* DP_PEER_EXTENDED_API */
#ifdef WLAN_FEATURE_STATS_EXT
/* rx hw stats event wait timeout in ms */
#define DP_REO_STATUS_STATS_TIMEOUT 1500
@@ -10594,8 +10529,7 @@ dp_request_rx_hw_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id)
return QDF_STATUS_E_INVAL;
}
peer = dp_peer_get_ref_find_by_addr((struct cdp_pdev *)vdev->pdev,
vdev->vap_bss_peer_mac_addr, 0);
peer = dp_vdev_bss_peer_ref_n_get(soc, vdev);
if (!peer) {
dp_err("Peer is NULL");