|
@@ -2458,7 +2458,6 @@ ol_txrx_peer_attach(struct cdp_vdev *pvdev, uint8_t *peer_mac_addr)
|
|
|
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);
|
|
@@ -3148,6 +3147,11 @@ int ol_txrx_peer_unref_delete(ol_txrx_peer_handle peer)
|
|
|
vdev->wait_on_peer_id = OL_TXRX_INVALID_LOCAL_PEER_ID;
|
|
|
}
|
|
|
|
|
|
+ if (vdev->opmode == wlan_op_mode_sta) {
|
|
|
+ qdf_mc_timer_stop(&peer->peer_unmap_timer);
|
|
|
+ qdf_mc_timer_destroy(&peer->peer_unmap_timer);
|
|
|
+ }
|
|
|
+
|
|
|
/* check whether the parent vdev has no peers left */
|
|
|
if (TAILQ_EMPTY(&vdev->peer_list)) {
|
|
|
/*
|
|
@@ -3285,6 +3289,27 @@ static QDF_STATUS ol_txrx_clear_peer(struct cdp_pdev *ppdev, uint8_t sta_id)
|
|
|
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * peer_unmap_timer() - peer unmap timer function
|
|
|
+ * @data: peer object pointer
|
|
|
+ *
|
|
|
+ * Return: none
|
|
|
+ */
|
|
|
+void peer_unmap_timer_handler(void *data)
|
|
|
+{
|
|
|
+ ol_txrx_peer_handle peer = (ol_txrx_peer_handle)data;
|
|
|
+
|
|
|
+ ol_txrx_err("all unmap events not received for peer %p, ref_cnt %d",
|
|
|
+ peer, qdf_atomic_read(&peer->ref_cnt));
|
|
|
+ ol_txrx_err("peer %p (%02x:%02x:%02x:%02x:%02x:%02x)",
|
|
|
+ peer,
|
|
|
+ peer->mac_addr.raw[0], peer->mac_addr.raw[1],
|
|
|
+ peer->mac_addr.raw[2], peer->mac_addr.raw[3],
|
|
|
+ peer->mac_addr.raw[4], peer->mac_addr.raw[5]);
|
|
|
+ QDF_BUG(0);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* ol_txrx_peer_detach() - Delete a peer's data object.
|
|
|
* @peer - the object to detach
|
|
@@ -3337,6 +3362,17 @@ static void ol_txrx_peer_detach(void *ppeer)
|
|
|
*/
|
|
|
qdf_atomic_set(&peer->delete_in_progress, 1);
|
|
|
|
|
|
+ /*
|
|
|
+ * Create a timer to track unmap events when the sta peer gets deleted.
|
|
|
+ */
|
|
|
+ if (vdev->opmode == wlan_op_mode_sta) {
|
|
|
+ qdf_mc_timer_init(&peer->peer_unmap_timer, QDF_TIMER_TYPE_SW,
|
|
|
+ peer_unmap_timer_handler, peer);
|
|
|
+ qdf_mc_timer_start(&peer->peer_unmap_timer,
|
|
|
+ OL_TXRX_PEER_UNMAP_TIMEOUT);
|
|
|
+ ol_txrx_info("started peer_unmap_timer for peer %p", peer);
|
|
|
+ }
|
|
|
+
|
|
|
/*
|
|
|
* Remove the reference added during peer_attach.
|
|
|
* The peer will still be left allocated until the
|