Further fixes for backports 3.19-rc1.
We had previously applied
http://lists.infradead.org/pipermail/ath10k/2014-April/001709.html
to our tree. This change was not accepted upstream, and at this
point it nno longer works with the current upstream tree. The
merge with 3.19-rc1 removed part of this patch, this CL removes
the rest of it.
Change-Id: Ibf7fca09efa40e785a1f589d337b526571c8fcd6
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index 58ab03e..14bcf31 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -447,44 +447,26 @@
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);
- goto out;
+ return ret;
}
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);
- goto out;
+ return ret;
}
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 2f774c6..00fd4b4 100644
--- a/drivers/net/wireless/ath/ath10k/txrx.c
+++ b/drivers/net/wireless/ath/ath10k/txrx.c
@@ -178,16 +178,20 @@
spin_lock_bh(&ar->data_lock);
peer = ath10k_peer_find(ar, ev->vdev_id, ev->addr);
if (!peer) {
- ath10k_warn(ar, "failed to map peer %pM on vdev %i: no such entry\n",
- ev->addr, ev->vdev_id);
- goto exit;
+ 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_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);
}
@@ -211,8 +215,11 @@
clear_bit(ev->peer_id, peer->peer_ids);
- if (bitmap_empty(peer->peer_ids, ATH10K_MAX_NUM_PEER_IDS))
+ if (bitmap_empty(peer->peer_ids, ATH10K_MAX_NUM_PEER_IDS)) {
+ list_del(&peer->list);
+ kfree(peer);
wake_up(&ar->peer_mapping_wq);
+ }
exit:
spin_unlock_bh(&ar->data_lock);