Browse Source

qcacld-3.0: Fix regression of peer unmap timer

Change Ie746bde046b76d8e136ebb4fd0b60088bf516d42 involved
incorrect logic, that peer detach unmap timer armed unexpected.

CRs-Fixed: 2168349
Change-Id: I49a7babdb5cd6a5bf05c483dbd7d86a8c3d5e690
Lin Bai 7 years ago
parent
commit
973e692918
2 changed files with 13 additions and 13 deletions
  1. 7 9
      core/dp/txrx/ol_txrx.c
  2. 6 4
      core/wma/src/wma_dev_if.c

+ 7 - 9
core/dp/txrx/ol_txrx.c

@@ -3662,18 +3662,16 @@ static void ol_txrx_peer_detach(void *ppeer, uint32_t bitmap)
 	 */
 	qdf_atomic_set(&peer->delete_in_progress, 1);
 
-	if (bitmap & CDP_PEER_DO_NOT_START_UNMAP_TIMER) {
+	if (!(bitmap & (1 << 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) {
+			/*
+			 * Create a timer to track unmap events when the
+			 * sta peer gets deleted.
+			 */
 			qdf_timer_start(&peer->peer_unmap_timer,
 					OL_TXRX_PEER_UNMAP_TIMEOUT);
 			ol_txrx_info_high
@@ -3693,7 +3691,7 @@ static void ol_txrx_peer_detach(void *ppeer, uint32_t bitmap)
 
 /**
  * ol_txrx_peer_detach_force_delete() - Detach and delete a peer's data object
- * @peer - the object to detach
+ * @ppeer - the object to detach
  *
  * Detach a peer and force peer object to be removed. It is called during
  * roaming scenario when the firmware has already deleted a peer.
@@ -3712,7 +3710,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, CDP_PEER_DELETE_NO_SPECIAL);
+	ol_txrx_peer_detach(peer, 1 << CDP_PEER_DELETE_NO_SPECIAL);
 }
 
 /**

+ 6 - 4
core/wma/src/wma_dev_if.c

@@ -1281,7 +1281,7 @@ void wma_remove_peer(tp_wma_handle wma, uint8_t *bssid,
 	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;
+	uint32_t bitmap = 1 << 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",
@@ -1327,7 +1327,8 @@ void wma_remove_peer(tp_wma_handle wma, uint8_t *bssid,
 	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;
+		/* Clear default bit and set to NOT_START_UNMAP */
+		bitmap = 1 << CDP_PEER_DO_NOT_START_UNMAP_TIMER;
 	}
 
 peer_detach:
@@ -1450,7 +1451,8 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, struct cdp_pdev *pdev,
 	if (wmi_unified_peer_create_send(wma->wmi_handle,
 					 &param) != QDF_STATUS_SUCCESS) {
 		WMA_LOGE("%s : Unable to create peer in Target", __func__);
-		cdp_peer_delete(soc, peer, CDP_PEER_DO_NOT_START_UNMAP_TIMER);
+		cdp_peer_delete(soc, peer,
+				1 << CDP_PEER_DO_NOT_START_UNMAP_TIMER);
 		goto err;
 	}
 
@@ -5109,7 +5111,7 @@ void wma_delete_bss_ho_fail(tp_wma_handle wma, tpDeleteBssParams params)
 	}
 
 	if (peer)
-		cdp_peer_delete(soc, peer, CDP_PEER_DELETE_NO_SPECIAL);
+		cdp_peer_delete(soc, peer, 1 << 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,