summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDeepak Dhamdhere <ddhamdhe@codeaurora.org>2016-11-20 23:48:24 -0800
committerqcabuildsw <qcabuildsw@localhost>2016-12-05 15:21:28 -0800
commitcfb16e6bb6223ace10d03cf8437f5bdc77c5fb23 (patch)
tree1e02dd8c3154c170768151cfe88bdb5f283eb1a0
parent714959bb390a8a1ecb87f87db3522e839ca6516d (diff)
qcacld-3.0: Better handling of first peer map event
Use a flag fw_create_pending flag to compensate for the extra peer reference count only once for the first peer map event. It will avoid duplicate compensation of ref count and untimely peer delete. CRs-Fixed: 1092503 Change-Id: I8b32290ad1bc4a834a3edb68e25b212eee2951c1
-rw-r--r--core/dp/txrx/ol_txrx.c11
-rw-r--r--core/dp/txrx/ol_txrx_peer_find.c32
-rw-r--r--core/dp/txrx/ol_txrx_types.h1
3 files changed, 24 insertions, 20 deletions
diff --git a/core/dp/txrx/ol_txrx.c b/core/dp/txrx/ol_txrx.c
index 057f93decba6..eb66eab1dd14 100644
--- a/core/dp/txrx/ol_txrx.c
+++ b/core/dp/txrx/ol_txrx.c
@@ -2178,9 +2178,18 @@ ol_txrx_peer_attach(ol_txrx_vdev_handle vdev, uint8_t *peer_mac_addr)
/* keep one reference for attach */
qdf_atomic_inc(&peer->ref_cnt);
- /* keep one reference for ol_rx_peer_map_handler */
+ /*
+ * Set a flag to indicate peer create is pending in firmware and
+ * increment ref_cnt so that peer will not get deleted while
+ * peer create command is pending in firmware.
+ * First peer_map event from firmware signifies successful
+ * peer creation and it will be decremented in peer_map handling.
+ */
+ qdf_atomic_init(&peer->fw_create_pending);
+ qdf_atomic_set(&peer->fw_create_pending, 1);
qdf_atomic_inc(&peer->ref_cnt);
+
peer->valid = 1;
ol_txrx_peer_find_hash_add(pdev, peer);
diff --git a/core/dp/txrx/ol_txrx_peer_find.c b/core/dp/txrx/ol_txrx_peer_find.c
index e39b18f1393c..9b1263751a8a 100644
--- a/core/dp/txrx/ol_txrx_peer_find.c
+++ b/core/dp/txrx/ol_txrx_peer_find.c
@@ -329,6 +329,10 @@ static void ol_txrx_peer_find_map_detach(struct ol_txrx_pdev_t *pdev)
* its array of peer_id's and update the peer_id_to_obj map entry
* for that peer_id. Increment corresponding reference counts.
*
+ * Riva/Pronto has one peer id for each peer.
+ * Peregrine/Rome has two peer id for each peer.
+ * iHelium has upto three peer id for each peer.
+ *
* Return: None
*/
static inline void ol_txrx_peer_find_add_id(struct ol_txrx_pdev_t *pdev,
@@ -336,9 +340,7 @@ static inline void ol_txrx_peer_find_add_id(struct ol_txrx_pdev_t *pdev,
{
struct ol_txrx_peer_t *peer;
int status;
- int del_peer_ref = 0;
int i;
- bool found = false;
/* check if there's already a peer object with this MAC address */
peer =
@@ -370,15 +372,6 @@ static inline void ol_txrx_peer_find_add_id(struct ol_txrx_pdev_t *pdev,
qdf_atomic_inc
(&pdev->peer_id_to_obj_map[peer_id].peer_id_ref_cnt);
- /* Check if entire peer_id array is empty */
- for (i = 0; i < MAX_NUM_PEER_ID_PER_PEER; i++) {
- if (peer->peer_ids[i] != HTT_INVALID_PEER) {
- found = true;
- break;
- }
- }
- if (!found)
- del_peer_ref = 1;
status = 1;
/* find a place in peer_id array and insert peer_id */
@@ -390,15 +383,16 @@ static inline void ol_txrx_peer_find_add_id(struct ol_txrx_pdev_t *pdev,
}
}
- /*
- * remove the reference added in ol_txrx_peer_find_hash_find.
- * the reference for the first peer id is already added in
- * ol_txrx_peer_attach.
- * Riva/Pronto has one peer id for each peer.
- * Peregrine/Rome has two peer id for each peer.
- */
- if (del_peer_ref)
+ if (qdf_atomic_read(&peer->fw_create_pending) == 1) {
+ /*
+ * First peer map event signifies successful peer
+ * creation in firmware. Decrement the ref count
+ * which was incremented when peer create command
+ * was sent to firmware.
+ */
+ qdf_atomic_set(&peer->fw_create_pending, 0);
ol_txrx_peer_unref_delete(peer);
+ }
qdf_spin_unlock(&pdev->peer_map_unmap_lock);
diff --git a/core/dp/txrx/ol_txrx_types.h b/core/dp/txrx/ol_txrx_types.h
index 5af0dc7672e6..b02c7a2ad2c4 100644
--- a/core/dp/txrx/ol_txrx_types.h
+++ b/core/dp/txrx/ol_txrx_types.h
@@ -1224,6 +1224,7 @@ struct ol_txrx_peer_t {
qdf_time_t last_assoc_rcvd;
qdf_time_t last_disassoc_rcvd;
qdf_time_t last_deauth_rcvd;
+ qdf_atomic_t fw_create_pending;
};
enum ol_rx_err_type {