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
This commit is contained in:
Chaithanya Garrepalli
2020-09-08 21:02:01 +05:30
zatwierdzone przez snandini
rodzic f7771e45d8
commit 3ac6dedea7
4 zmienionych plików z 91 dodań i 68 usunięć

Wyświetl plik

@@ -434,6 +434,28 @@ dp_soc_iterate_peer_lock_safe(struct dp_soc *soc,
} while (0)
#endif
/**
* dp_peer_state_cmp() - compare dp peer state
*
* @peer : DP peer
* @state : state
*
* Return: true if state matches with peer state
* false if it does not match
*/
static inline bool
dp_peer_state_cmp(struct dp_peer *peer,
enum dp_peer_state state)
{
bool is_status_equal = false;
qdf_spin_lock_bh(&peer->peer_state_lock);
is_status_equal = (peer->peer_state == state);
qdf_spin_unlock_bh(&peer->peer_state_lock);
return is_status_equal;
}
/**
* dp_peer_update_state() - update dp peer state
*
@@ -448,7 +470,10 @@ dp_peer_update_state(struct dp_soc *soc,
struct dp_peer *peer,
enum dp_peer_state state)
{
uint8_t peer_state = peer->peer_state;
uint8_t peer_state;
qdf_spin_lock_bh(&peer->peer_state_lock);
peer_state = peer->peer_state;
switch (state) {
case DP_PEER_STATE_INIT:
@@ -488,12 +513,14 @@ dp_peer_update_state(struct dp_soc *soc,
default:
dp_alert("Invalid peer state %u for peer "QDF_MAC_ADDR_FMT,
state, QDF_MAC_ADDR_REF(peer->mac_addr.raw));
qdf_spin_unlock_bh(&peer->peer_state_lock);
return;
}
dp_info("Updating peer state from %u to %u mac "QDF_MAC_ADDR_FMT"\n",
peer_state, state,
QDF_MAC_ADDR_REF(peer->mac_addr.raw));
peer->peer_state = state;
qdf_spin_unlock_bh(&peer->peer_state_lock);
}
void dp_print_ast_stats(struct dp_soc *soc);