From f4ada15ad490dd4b00cafaf4484f25a9bf7a0806 Mon Sep 17 00:00:00 2001 From: Naveen Rawat Date: Tue, 5 Sep 2017 14:56:12 -0700 Subject: [PATCH] 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 --- core/dp/txrx/ol_txrx.c | 37 ++++++++++++++++++++++--------------- core/wma/src/wma_dev_if.c | 17 ++++++++++++----- 2 files changed, 34 insertions(+), 20 deletions(-) diff --git a/core/dp/txrx/ol_txrx.c b/core/dp/txrx/ol_txrx.c index ea6bee2cf98f..76157a653903 100644 --- a/core/dp/txrx/ol_txrx.c +++ b/core/dp/txrx/ol_txrx.c @@ -3548,6 +3548,7 @@ void peer_unmap_timer_handler(void *data) /** * ol_txrx_peer_detach() - Delete a peer's data object. * @peer - the object to detach + * @bitmap - bitmap indicating special handling of request. * * When the host's control SW disassociates a peer, it calls * this function to detach and delete the peer. The reference @@ -3556,7 +3557,7 @@ void peer_unmap_timer_handler(void *data) * * Return: None */ -static void ol_txrx_peer_detach(void *ppeer) +static void ol_txrx_peer_detach(void *ppeer, uint32_t bitmap) { ol_txrx_peer_handle peer = ppeer; struct ol_txrx_vdev_t *vdev = peer->vdev; @@ -3597,20 +3598,26 @@ static void ol_txrx_peer_detach(void *ppeer) */ qdf_atomic_set(&peer->delete_in_progress, 1); - 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)); - } + if (bitmap & CDP_PEER_DO_NOT_START_UNMAP_TIMER) { + 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)); + } - /* - * Create a timer to track unmap events when the sta peer gets deleted. - */ - if (vdev->opmode == wlan_op_mode_sta) { - qdf_timer_start(&peer->peer_unmap_timer, - OL_TXRX_PEER_UNMAP_TIMEOUT); - ol_txrx_info_high("%s: started peer_unmap_timer for peer %pK", - __func__, peer); + /* + * Create a timer to track unmap events when the sta peer gets + * deleted. + */ + if (vdev->opmode == wlan_op_mode_sta) { + qdf_timer_start(&peer->peer_unmap_timer, + OL_TXRX_PEER_UNMAP_TIMEOUT); + ol_txrx_info_high("%s: started peer_unmap_timer for peer %pK", + __func__, peer); + } + } else { + ol_txrx_err("%s unmap timer not started as PEER_DELETE not sent to FW", + __func__); } /* @@ -3643,7 +3650,7 @@ static void ol_txrx_peer_detach_force_delete(void *ppeer) /* 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, CDP_PEER_DELETE_NO_SPECIAL); } ol_txrx_peer_handle diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c index 45e695465039..6f3621be7e7f 100644 --- a/core/wma/src/wma_dev_if.c +++ b/core/wma/src/wma_dev_if.c @@ -1244,6 +1244,8 @@ void wma_remove_peer(tp_wma_handle wma, uint8_t *bssid, struct peer_flush_params param = {0}; uint8_t *peer_mac_addr; void *soc = cds_get_context(QDF_MODULE_ID_SOC); + QDF_STATUS qdf_status; + uint32_t bitmap = CDP_PEER_DELETE_NO_SPECIAL; if (!wma->interfaces[vdev_id].peer_count) { WMA_LOGE("%s: Can't remove peer with peer_addr %pM vdevid %d peer_count %d", @@ -1284,8 +1286,13 @@ void wma_remove_peer(tp_wma_handle wma, uint8_t *bssid, wlan_roam_debug_log(vdev_id, DEBUG_PEER_DELETE_SEND, DEBUG_INVALID_PEER_ID, peer_addr, peer, 0, 0); - 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_IS_STATUS_ERROR(qdf_status)) { + WMA_LOGE("%s Peer delete could not be sent to firmware %d", + __func__, qdf_status); + bitmap = CDP_PEER_DO_NOT_START_UNMAP_TIMER; + } peer_detach: WMA_LOGE("%s: Remove peer %pK with peer_addr %pM vdevid %d peer_count %d", @@ -1296,7 +1303,7 @@ peer_detach: if (roam_synch_in_progress) cdp_peer_detach_force_delete(soc, peer); else - cdp_peer_delete(soc, peer); + cdp_peer_delete(soc, peer, bitmap); } wma->interfaces[vdev_id].peer_count--; @@ -1407,7 +1414,7 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, struct cdp_pdev *pdev, if (wmi_unified_peer_create_send(wma->wmi_handle, ¶m) != QDF_STATUS_SUCCESS) { WMA_LOGE("%s : Unable to create peer in Target", __func__); - cdp_peer_delete(soc, peer); + cdp_peer_delete(soc, peer, CDP_PEER_DO_NOT_START_UNMAP_TIMER); goto err; } @@ -5016,7 +5023,7 @@ void wma_delete_bss_ho_fail(tp_wma_handle wma, tpDeleteBssParams params) } if (peer) - cdp_peer_delete(soc, peer); + cdp_peer_delete(soc, peer, CDP_PEER_DELETE_NO_SPECIAL); iface->peer_count--; WMA_LOGI("%s: Removed peer %pK with peer_addr %pM vdevid %d peer_count %d", __func__, peer, params->bssid, params->smesessionId,