--- a/drivers/net/wireless/ath/ath11k/peer.c +++ b/drivers/net/wireless/ath/ath11k/peer.c @@ -213,6 +213,7 @@ int ath11k_peer_create(struct ath11k *ar { struct ath11k_peer *peer; int ret; + struct ath11k *peer_ar; lockdep_assert_held(&ar->conf_mutex); @@ -222,6 +223,27 @@ int ath11k_peer_create(struct ath11k *ar return -ENOBUFS; } + spin_lock_bh(&ar->ab->base_lock); + + peer = ath11k_peer_find_by_addr(ar->ab, param->peer_addr); + if(peer) { + ath11k_warn(ar->ab, + "peer already created for %pM on vdev %i and trying to create on vdev %i\n", + param->peer_addr, peer->vdev_id, param->vdev_id); + + peer_ar = ath11k_mac_get_ar_by_vdev_id(ar->ab, peer->vdev_id); + if(peer_ar == ar){ + ath11k_warn(ar->ab, + "ignoring the peer %pM creation on same pdev %i \n", + param->peer_addr, ar->pdev->pdev_id); + + spin_unlock_bh(&ar->ab->base_lock); + return -EINVAL; + } + } + + spin_unlock_bh(&ar->ab->base_lock); + ret = ath11k_wmi_send_peer_create_cmd(ar, param); if (ret) { ath11k_warn(ar->ab,