qcacmn: update peer reuse logic and add peer state lock

With new design, peer is deleted from hash table in
cdp_peer_delete. Hash table search in dp_peer_can_reuse
API at cdp_peer_create will always fail

Update the peer reuse logic to search from inactive list.

Insert peer to inactive list from cdp_peer_delete() and
in peer reuse case search in inactive list to get
peer.

Also add a new lock to protect peer state transition

Change-Id: I2e672fc4a9346c95d67716d437538dd0f96b2207
这个提交包含在:
Chaithanya Garrepalli
2020-09-08 21:02:01 +05:30
提交者 snandini
父节点 f7771e45d8
当前提交 3ac6dedea7
修改 4 个文件,包含 91 行新增68 行删除

查看文件

@@ -890,7 +890,7 @@ QDF_STATUS dp_peer_add_ast(struct dp_soc *soc,
qdf_spin_lock_bh(&soc->ast_lock);
if (peer->peer_state != DP_PEER_STATE_ACTIVE) {
if (!dp_peer_state_cmp(peer, DP_PEER_STATE_ACTIVE)) {
if ((type != CDP_TXRX_AST_TYPE_STATIC) &&
(type != CDP_TXRX_AST_TYPE_SELF)) {
qdf_spin_unlock_bh(&soc->ast_lock);
@@ -1319,7 +1319,7 @@ int dp_peer_update_ast(struct dp_soc *soc, struct dp_peer *peer,
* 3) We did not get the HTT map for create event
*/
if (ast_entry->delete_in_progress ||
(peer->peer_state != DP_PEER_STATE_ACTIVE) ||
!dp_peer_state_cmp(peer, DP_PEER_STATE_ACTIVE) ||
!ast_entry->is_mapped)
return ret;
@@ -1983,7 +1983,7 @@ static inline struct dp_peer *dp_peer_find_add_id(struct dp_soc *soc,
* if peer is in logical delete CP triggered delete before map
* is received ignore this event
*/
if (peer->peer_state == DP_PEER_STATE_LOGICAL_DELETE) {
if (dp_peer_state_cmp(peer, DP_PEER_STATE_LOGICAL_DELETE)) {
dp_peer_unref_delete(peer, DP_MOD_ID_CONFIG);
dp_alert("Peer %pK["QDF_MAC_ADDR_FMT"] logical delete state vid %d",
peer, QDF_MAC_ADDR_REF(peer_mac_addr),
@@ -2171,14 +2171,8 @@ dp_rx_peer_unmap_handler(struct dp_soc *soc, uint16_t peer_id,
}
vdev = peer->vdev;
/* cleanup the peer data */
dp_peer_cleanup(vdev, peer);
DP_UPDATE_STATS(vdev, peer);
qdf_spin_lock_bh(&soc->inactive_peer_list_lock);
TAILQ_INSERT_TAIL(&soc->inactive_peer_list, peer, inactive_list_elem);
qdf_spin_unlock_bh(&soc->inactive_peer_list_lock);
dp_peer_update_state(soc, peer, DP_PEER_STATE_INACTIVE);
dp_peer_unref_delete(peer, DP_MOD_ID_HTT);
/*