summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNaveen Rawat <naveenrawat@codeaurora.org>2017-09-05 14:56:12 -0700
committersnandini <snandini@codeaurora.org>2017-09-12 05:03:27 -0700
commit1564a5ec643fa659638381fba92d88eb5588c7a0 (patch)
tree26289220dcfc57117c492ace55042c8279b6bc33
parentff4e701e9adcd0435b51052bd06a5161f1d65050 (diff)
qcacld-3.0: Do not start unmap timer if send cmd to FW fails
Do not start unmap timer if peer delete couldn't be sent to firmware. Change-Id: Ie746bde046b76d8e136ebb4fd0b60088bf516d42 CRs-Fixed: 2104849
-rw-r--r--core/dp/txrx/ol_txrx.c36
-rw-r--r--core/wma/src/wma_dev_if.c19
2 files changed, 37 insertions, 18 deletions
diff --git a/core/dp/txrx/ol_txrx.c b/core/dp/txrx/ol_txrx.c
index 3f78e8bfb716..5c83b5223af7 100644
--- a/core/dp/txrx/ol_txrx.c
+++ b/core/dp/txrx/ol_txrx.c
@@ -3392,6 +3392,9 @@ void peer_unmap_timer_handler(void *data)
/**
* ol_txrx_peer_detach() - Delete a peer's data object.
* @peer - the object to detach
+ * @bool - Status whether PEER_DELETE is sent to fw
+ * if value is false then we should not start peer unmap
+ * timer.
*
* When the host's control SW disassociates a peer, it calls
* this function to detach and delete the peer. The reference
@@ -3400,7 +3403,7 @@ void peer_unmap_timer_handler(void *data)
*
* Return: None
*/
-void ol_txrx_peer_detach(ol_txrx_peer_handle peer)
+void ol_txrx_peer_detach(ol_txrx_peer_handle peer, bool start_peer_unmap_timer)
{
struct ol_txrx_vdev_t *vdev = peer->vdev;
@@ -3440,17 +3443,24 @@ void ol_txrx_peer_detach(ol_txrx_peer_handle peer)
*/
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_mem_copy(&peer->vdev->last_peer_mac_addr,
- &peer->mac_addr,
- sizeof(union ol_txrx_align_mac_addr_t));
- qdf_timer_start(&peer->peer_unmap_timer,
- OL_TXRX_PEER_UNMAP_TIMEOUT);
- ol_txrx_info_high("%s: started peer_unmap_timer for peer %p",
- __func__, peer);
+ if (start_peer_unmap_timer) {
+ /*
+ * Create a timer to track unmap events when the sta peer gets
+ * deleted.
+ */
+ if (vdev->opmode == wlan_op_mode_sta) {
+ qdf_mem_copy(&peer->vdev->last_peer_mac_addr,
+ &peer->mac_addr,
+ sizeof(union ol_txrx_align_mac_addr_t));
+ qdf_timer_start(&peer->peer_unmap_timer,
+ OL_TXRX_PEER_UNMAP_TIMEOUT);
+ ol_txrx_info_high(
+ "%s: started peer_unmap_timer for peer %p",
+ __func__, peer);
+ }
+ } else {
+ WMA_LOGE("%s Peer unmap timer not started because PEER_DELETE not sent to firmware",
+ __func__);
}
/*
@@ -3482,7 +3492,7 @@ void ol_txrx_peer_detach_force_delete(ol_txrx_peer_handle peer)
/* Clear the peer_id_to_obj map entries */
ol_txrx_peer_remove_obj_map_entries(pdev, peer);
- ol_txrx_peer_detach(peer);
+ ol_txrx_peer_detach(peer, true);
}
ol_txrx_peer_handle
diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c
index d0123b41888a..28d57e0c4abf 100644
--- a/core/wma/src/wma_dev_if.c
+++ b/core/wma/src/wma_dev_if.c
@@ -1220,6 +1220,8 @@ void wma_remove_peer(tp_wma_handle wma, uint8_t *bssid,
uint8_t *peer_addr = bssid;
struct peer_flush_params param = {0};
uint8_t *peer_mac_addr;
+ QDF_STATUS qdf_status;
+ bool start_peer_unmap_timer = true;
peer_mac_addr = ol_txrx_peer_get_peer_mac_addr(peer);
if (peer_mac_addr == NULL) {
@@ -1255,8 +1257,15 @@ void wma_remove_peer(tp_wma_handle wma, uint8_t *bssid,
DEBUG_INVALID_PEER_ID, peer_addr, peer,
0,
qdf_atomic_read(&peer->ref_cnt));
- wmi_unified_peer_delete_send(wma->wmi_handle, peer_addr,
- vdev_id);
+
+ qdf_status = wmi_unified_peer_delete_send(wma->wmi_handle, peer_addr,
+ vdev_id);
+
+ if (qdf_status) {
+ WMA_LOGE("%s Peer delete could not be sent to firmware %d",
+ __func__, qdf_status);
+ start_peer_unmap_timer = false;
+ }
peer_detach:
WMA_LOGD("%s: Remove peer %p with peer_addr %pM vdevid %d peer_count %d",
@@ -1267,7 +1276,7 @@ peer_detach:
if (roam_synch_in_progress)
ol_txrx_peer_detach_force_delete(peer);
else
- ol_txrx_peer_detach(peer);
+ ol_txrx_peer_detach(peer, start_peer_unmap_timer);
}
wma->interfaces[vdev_id].peer_count--;
@@ -1366,7 +1375,7 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, ol_txrx_pdev_handle pdev,
if (wmi_unified_peer_create_send(wma->wmi_handle,
&param) != QDF_STATUS_SUCCESS) {
WMA_LOGE("%s : Unable to create peer in Target", __func__);
- ol_txrx_peer_detach(peer);
+ ol_txrx_peer_detach(peer, false);
goto err;
}
WMA_LOGD("%s: Created peer %p ref_cnt %d with peer_addr %pM vdev_id %d, peer_count - %d",
@@ -4965,7 +4974,7 @@ void wma_delete_bss_ho_fail(tp_wma_handle wma, tpDeleteBssParams params)
}
if (peer)
- ol_txrx_peer_detach(peer);
+ ol_txrx_peer_detach(peer, true);
iface->peer_count--;
WMA_LOGD("%s: Removed peer %p with peer_addr %pM vdevid %d peer_count %d",
__func__, peer, params->bssid, params->smesessionId,