Revert "Further fixes for backports 3.19-rc1."
This reverts commit 7a037dff4306e34862daf80172978419c0208559
due to an inadvertent non-merge commit for the preceding backports
3.19-rc1.
Change-Id: Ic87ce5bc0c3cd86489f72458f473c8231a1ab2a6
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index 5123a81..351235e 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -447,26 +447,44 @@
static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr)
{
+ struct ath10k_peer *peer;
int ret;
lockdep_assert_held(&ar->conf_mutex);
+ peer = ath10k_peer_find(ar, vdev_id, addr);
+ if (!peer) {
+ ath10k_warn(ar, "failed to lookup peer %pM on vdev %i\n",
+ addr, vdev_id);
+ return -ENOENT;
+ }
+
ret = ath10k_wmi_peer_delete(ar, vdev_id, addr);
if (ret) {
ath10k_warn(ar, "failed to request wmi peer %pM on vdev %i removal: %d\n",
addr, vdev_id, ret);
- return ret;
+ goto out;
}
ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr);
if (ret) {
ath10k_warn(ar, "failed to wait for wmi peer %pM on vdev %i removal: %d\n",
addr, vdev_id, ret);
- return ret;
+ goto out;
}
ar->num_peers--;
+out:
+ spin_lock_bh(&ar->data_lock);
+ list_del(&peer->list);
+ if (!bitmap_empty(peer->peer_ids, ATH10K_MAX_NUM_PEER_IDS))
+ ath10k_warn(ar, "removing peer %pM on vdev %i still being mapped in firmware\n",
+ addr, vdev_id);
+ spin_unlock_bh(&ar->data_lock);
+
+ kfree(peer);
+
return 0;
}
diff --git a/drivers/net/wireless/ath/ath10k/txrx.c b/drivers/net/wireless/ath/ath10k/txrx.c
index 00fd4b4..2f774c6 100644
--- a/drivers/net/wireless/ath/ath10k/txrx.c
+++ b/drivers/net/wireless/ath/ath10k/txrx.c
@@ -178,20 +178,16 @@
spin_lock_bh(&ar->data_lock);
peer = ath10k_peer_find(ar, ev->vdev_id, ev->addr);
if (!peer) {
- peer = kzalloc(sizeof(*peer), GFP_ATOMIC);
- if (!peer)
- goto exit;
-
- peer->vdev_id = ev->vdev_id;
- ether_addr_copy(peer->addr, ev->addr);
- list_add(&peer->list, &ar->peers);
- wake_up(&ar->peer_mapping_wq);
+ ath10k_warn(ar, "failed to map peer %pM on vdev %i: no such entry\n",
+ ev->addr, ev->vdev_id);
+ goto exit;
}
ath10k_dbg(ar, ATH10K_DBG_HTT, "htt peer map vdev %d peer %pM id %d\n",
ev->vdev_id, ev->addr, ev->peer_id);
set_bit(ev->peer_id, peer->peer_ids);
+ wake_up(&ar->peer_mapping_wq);
exit:
spin_unlock_bh(&ar->data_lock);
}
@@ -215,11 +211,8 @@
clear_bit(ev->peer_id, peer->peer_ids);
- if (bitmap_empty(peer->peer_ids, ATH10K_MAX_NUM_PEER_IDS)) {
- list_del(&peer->list);
- kfree(peer);
+ if (bitmap_empty(peer->peer_ids, ATH10K_MAX_NUM_PEER_IDS))
wake_up(&ar->peer_mapping_wq);
- }
exit:
spin_unlock_bh(&ar->data_lock);