Quellcode durchsuchen

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
Naveen Rawat vor 7 Jahren
Ursprung
Commit
f4ada15ad4
2 geänderte Dateien mit 34 neuen und 20 gelöschten Zeilen
  1. 22 15
      core/dp/txrx/ol_txrx.c
  2. 12 5
      core/wma/src/wma_dev_if.c

+ 22 - 15
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

+ 12 - 5
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,
 					 &param) != 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,