diff options
| author | Naveen Rawat <naveenrawat@codeaurora.org> | 2017-09-05 14:56:12 -0700 |
|---|---|---|
| committer | snandini <snandini@codeaurora.org> | 2017-09-12 05:03:27 -0700 |
| commit | 1564a5ec643fa659638381fba92d88eb5588c7a0 (patch) | |
| tree | 26289220dcfc57117c492ace55042c8279b6bc33 | |
| parent | ff4e701e9adcd0435b51052bd06a5161f1d65050 (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.c | 36 | ||||
| -rw-r--r-- | core/wma/src/wma_dev_if.c | 19 |
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, ¶m) != 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, |
