Browse Source

qcacld-3.0: Add peer debug log entries in WMA and ol_txrx

Add wlan_objmgr_peer_debug_log() calls in WMA, ol_txrx for
tracking of peer create/delete/map/unmap events and related roaming
events. These calls, added in lnx.1.1 driver in different change lists,
are consolidated in this change.

Add wlan_roam_debug_dump_table() call to the functions that perform
recovery after detecting peer deletion error.

CRs-Fixed: 2130256
Change-Id: Ia3bb6a01b2f62889fe542a02ca42ffab5a8a76aa
Deepak Dhamdhere 7 năm trước cách đây
mục cha
commit
f918d42bca

+ 15 - 0
core/dp/txrx/ol_txrx.c

@@ -90,6 +90,7 @@
 
 #include <htt_internal.h>
 #include <ol_txrx_ipa.h>
+#include "wlan_roam_debug.h"
 
 #ifdef QCA_SUPPORT_TXRX_LOCAL_PEER_ID
 ol_txrx_peer_handle
@@ -2599,6 +2600,8 @@ ol_txrx_peer_attach(struct cdp_vdev *pvdev, uint8_t *peer_mac_addr)
 		if (QDF_STATUS_SUCCESS != rc) {
 			ol_txrx_err("error waiting for peer_id(%d) deletion, status %d\n",
 				    vdev->wait_on_peer_id, (int) rc);
+			/* Added for debugging only */
+			wlan_roam_debug_dump_table();
 			cds_trigger_recovery(PEER_DEL_TIMEOUT);
 			vdev->wait_on_peer_id = OL_TXRX_INVALID_LOCAL_PEER_ID;
 
@@ -3280,6 +3283,11 @@ int ol_txrx_peer_unref_delete(ol_txrx_peer_handle peer,
 		return -EINVAL;
 	}
 
+	wlan_roam_debug_log(vdev->vdev_id, DEBUG_PEER_UNREF_DELETE,
+			    DEBUG_INVALID_PEER_ID, &peer->mac_addr.raw,
+			    peer, 0,
+			    qdf_atomic_read(&peer->ref_cnt));
+
 
 	/*
 	 * Hold the lock all the way from checking if the peer ref count
@@ -3323,6 +3331,11 @@ int ol_txrx_peer_unref_delete(ol_txrx_peer_handle peer,
 			   fname, line, peer, peer->mac_addr.raw,
 			   qdf_atomic_read(&peer->ref_cnt));
 
+		wlan_roam_debug_log(vdev->vdev_id,
+				    DEBUG_DELETING_PEER_OBJ,
+				    DEBUG_INVALID_PEER_ID,
+				    &peer->mac_addr.raw, peer, 0,
+				    qdf_atomic_read(&peer->ref_cnt));
 		peer_id = peer->local_id;
 		/* remove the reference to the peer from the hash table */
 		ol_txrx_peer_find_hash_remove(pdev, peer);
@@ -3498,6 +3511,8 @@ static QDF_STATUS ol_txrx_clear_peer(struct cdp_pdev *ppdev, uint8_t sta_id)
 void peer_unmap_timer_work_function(void *param)
 {
 	WMA_LOGE("Enter: %s", __func__);
+	/* Added for debugging only */
+	wlan_roam_debug_dump_table();
 	cds_trigger_recovery(QDF_PEER_UNMAP_TIMEDOUT);
 }
 

+ 26 - 0
core/dp/txrx/ol_txrx_peer_find.c

@@ -43,6 +43,7 @@
 #include <ol_txrx.h>            /* ol_txrx_peer_unref_delete */
 #include <ol_txrx_peer_find.h>  /* ol_txrx_peer_find_attach, etc. */
 #include <ol_tx_queue.h>
+#include "wlan_roam_debug.h"
 
 /*=== misc. / utility function definitions ==================================*/
 
@@ -394,6 +395,11 @@ static inline void ol_txrx_peer_find_add_id(struct ol_txrx_pdev_t *pdev,
 		ol_txrx_err(
 			  "%s: peer not found or peer ID is %d invalid",
 			  __func__, peer_id);
+		wlan_roam_debug_log(DEBUG_INVALID_VDEV_ID,
+				    DEBUG_PEER_MAP_EVENT,
+				    peer_id, peer_mac_addr,
+				    peer, 0, 0);
+
 		return;
 	}
 
@@ -433,6 +439,12 @@ static inline void ol_txrx_peer_find_add_id(struct ol_txrx_pdev_t *pdev,
 	QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
 	   "%s: peer %pK ID %d peer_id[%d] peer_id_ref_cnt %d peer->ref_cnt %d",
 	   __func__, peer, peer_id, i, peer_id_ref_cnt, peer_ref_cnt);
+	wlan_roam_debug_log(DEBUG_INVALID_VDEV_ID,
+			    DEBUG_PEER_MAP_EVENT,
+			    peer_id, &peer->mac_addr.raw, peer,
+			    peer_id_ref_cnt,
+			    peer_ref_cnt);
+
 
 	if (status) {
 		/* TBDXXX: assert for now */
@@ -565,6 +577,9 @@ void ol_rx_peer_unmap_handler(ol_txrx_pdev_handle pdev, uint16_t peer_id)
 	if (peer_id == HTT_INVALID_PEER) {
 		ol_txrx_err(
 		   "%s: invalid peer ID %d\n", __func__, peer_id);
+		wlan_roam_debug_log(DEBUG_INVALID_VDEV_ID,
+				    DEBUG_PEER_UNMAP_EVENT,
+				    peer_id, NULL, NULL, 0, 0x100);
 		return;
 	}
 
@@ -578,6 +593,9 @@ void ol_rx_peer_unmap_handler(ol_txrx_pdev_handle pdev, uint16_t peer_id)
 		ref_cnt = qdf_atomic_read(&pdev->peer_id_to_obj_map[peer_id].
 							del_peer_id_ref_cnt);
 		qdf_spin_unlock_bh(&pdev->peer_map_unmap_lock);
+		wlan_roam_debug_log(DEBUG_INVALID_VDEV_ID,
+				    DEBUG_PEER_UNMAP_EVENT,
+				    peer_id, NULL, NULL, ref_cnt, 0x101);
 		ol_txrx_dbg(
 			   "%s: peer already deleted, peer_id %d del_peer_id_ref_cnt %d",
 			   __func__, peer_id, ref_cnt);
@@ -595,6 +613,9 @@ void ol_rx_peer_unmap_handler(ol_txrx_pdev_handle pdev, uint16_t peer_id)
 		ol_txrx_info(
 			   "%s: peer not found for peer_id %d",
 			   __func__, peer_id);
+		wlan_roam_debug_log(DEBUG_INVALID_VDEV_ID,
+				    DEBUG_PEER_UNMAP_EVENT,
+				    peer_id, NULL, NULL, 0, 0x102);
 		return;
 	}
 
@@ -614,6 +635,11 @@ void ol_rx_peer_unmap_handler(ol_txrx_pdev_handle pdev, uint16_t peer_id)
 
 	qdf_spin_unlock_bh(&pdev->peer_map_unmap_lock);
 
+	wlan_roam_debug_log(DEBUG_INVALID_VDEV_ID,
+			    DEBUG_PEER_UNMAP_EVENT,
+			    peer_id, &peer->mac_addr.raw, peer, ref_cnt,
+			    qdf_atomic_read(&peer->ref_cnt));
+
 	/*
 	 * Remove a reference to the peer.
 	 * If there are no more references, delete the peer object.

+ 1 - 0
core/hdd/src/wlan_hdd_main.c

@@ -264,6 +264,7 @@ static const struct category_info cinfo[MAX_SUPPORTED_CATEGORY] = {
 	[QDF_MODULE_ID_SERIALIZATION] = {QDF_TRACE_LEVEL_ALL},
 	[QDF_MODULE_ID_DFS] = {QDF_TRACE_LEVEL_ALL},
 	[QDF_MODULE_ID_OBJ_MGR] = {QDF_TRACE_LEVEL_ALL},
+	[QDF_MODULE_ID_ROAM_DEBUG] = {QDF_TRACE_LEVEL_ALL},
 };
 
 int limit_off_chan_tbl[HDD_MAX_AC][HDD_MAX_OFF_CHAN_ENTRIES] = {

+ 9 - 0
core/wma/src/wma_dev_if.c

@@ -78,6 +78,7 @@
 #include "wlan_reg_services_api.h"
 
 #include "wma_he.h"
+#include "wlan_roam_debug.h"
 
 /**
  * wma_find_vdev_by_addr() - find vdev_id from mac address
@@ -1279,6 +1280,10 @@ void wma_remove_peer(tp_wma_handle wma, uint8_t *bssid,
 		peer_addr = peer_mac_addr;
 	}
 
+	/* peer->ref_cnt is not visible in WMA */
+	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);
 
@@ -1410,6 +1415,8 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, struct cdp_pdev *pdev,
 		  __func__, peer, peer_addr, vdev_id,
 		  wma->interfaces[vdev_id].peer_count);
 
+	wlan_roam_debug_log(vdev_id, DEBUG_PEER_CREATE_SEND,
+			    DEBUG_INVALID_PEER_ID, peer_addr, peer, 0, 0);
 	cdp_peer_setup(soc, vdev, peer);
 
 	WMA_LOGD("%s: Initialized peer with peer_addr %pM vdev_id %d",
@@ -2671,6 +2678,8 @@ int wma_peer_delete_handler(void *handle, uint8_t *cmd_param_info,
 	WMI_MAC_ADDR_TO_CHAR_ARRAY(&event->peer_macaddr, macaddr);
 	WMA_LOGD(FL("Peer Delete Response, vdev %d Peer %pM"),
 			event->vdev_id, macaddr);
+	wlan_roam_debug_log(event->vdev_id, DEBUG_PEER_DELETE_RESP,
+			    DEBUG_INVALID_PEER_ID, macaddr, NULL, 0, 0);
 	req_msg = wma_find_remove_req_msgtype(wma, event->vdev_id,
 					WMA_DELETE_STA_REQ);
 	if (!req_msg) {

+ 39 - 13
core/wma/src/wma_features.c

@@ -72,6 +72,7 @@
 #include "wlan_pmo_ucfg_api.h"
 #include <target_if_scan.h>
 #include "wlan_reg_services_api.h"
+#include "wlan_roam_debug.h"
 
 #ifndef ARRAY_LENGTH
 #define ARRAY_LENGTH(a)         (sizeof(a) / sizeof((a)[0]))
@@ -1823,36 +1824,56 @@ static int wma_extscan_get_eventid_from_tlvtag(uint32_t tag)
  */
 static int wow_get_wmi_eventid(int32_t reason, uint32_t tag)
 {
+	int event_id;
+
 	switch (reason) {
 	case WOW_REASON_AP_ASSOC_LOST:
-		return WMI_ROAM_EVENTID;
+		event_id = WMI_ROAM_EVENTID;
+		break;
 	case WOW_REASON_NLO_SCAN_COMPLETE:
-		return WMI_NLO_SCAN_COMPLETE_EVENTID;
+		event_id = WMI_NLO_SCAN_COMPLETE_EVENTID;
+		break;
 	case WOW_REASON_CSA_EVENT:
-		return WMI_CSA_HANDLING_EVENTID;
+		event_id = WMI_CSA_HANDLING_EVENTID;
+		break;
 	case WOW_REASON_LOW_RSSI:
-		return WMI_ROAM_EVENTID;
+		event_id = WMI_ROAM_EVENTID;
+		break;
 	case WOW_REASON_CLIENT_KICKOUT_EVENT:
-		return WMI_PEER_STA_KICKOUT_EVENTID;
+		event_id = WMI_PEER_STA_KICKOUT_EVENTID;
+		break;
 	case WOW_REASON_EXTSCAN:
-		return wma_extscan_get_eventid_from_tlvtag(tag);
+		event_id = wma_extscan_get_eventid_from_tlvtag(tag);
+		break;
 	case WOW_REASON_RSSI_BREACH_EVENT:
-		return WMI_RSSI_BREACH_EVENTID;
+		event_id = WMI_RSSI_BREACH_EVENTID;
+		break;
 	case WOW_REASON_NAN_EVENT:
-		return WMI_NAN_EVENTID;
+		event_id = WMI_NAN_EVENTID;
+		break;
 	case WOW_REASON_NAN_DATA:
-		return wma_ndp_get_eventid_from_tlvtag(tag);
+		event_id = wma_ndp_get_eventid_from_tlvtag(tag);
+		break;
 	case WOW_REASON_TDLS_CONN_TRACKER_EVENT:
-		return WOW_TDLS_CONN_TRACKER_EVENT;
+		event_id = WOW_TDLS_CONN_TRACKER_EVENT;
+		break;
 	case WOW_REASON_ROAM_HO:
-		return WMI_ROAM_EVENTID;
+		event_id = WMI_ROAM_EVENTID;
+		break;
 	case WOW_REASON_11D_SCAN:
-		return WMI_11D_NEW_COUNTRY_EVENTID;
+		event_id = WMI_11D_NEW_COUNTRY_EVENTID;
+		break;
 	default:
 		WMA_LOGD(FL("No Event Id for WOW reason %s(%d)"),
 			 wma_wow_wake_reason_str(reason), reason);
-		return 0;
+		event_id = 0;
+		break;
 	}
+	wlan_roam_debug_log(WMA_INVALID_VDEV_ID, DEBUG_WOW_REASON,
+			    DEBUG_INVALID_PEER_ID, NULL, NULL,
+			    reason, event_id);
+
+	return event_id;
 }
 
 /**
@@ -2664,6 +2685,11 @@ static int wma_wake_event_piggybacked(
 	 */
 	case WOW_REASON_LOW_RSSI:
 	case WOW_REASON_ROAM_HO:
+		wlan_roam_debug_log(event_param->fixed_param->vdev_id,
+				    DEBUG_WOW_ROAM_EVENT,
+				    DEBUG_INVALID_PEER_ID,
+				    NULL, NULL, wake_reason,
+				    pb_event_len);
 		if (pb_event_len > 0) {
 			errno = wma_roam_event_callback(wma, pb_event,
 							pb_event_len);

+ 17 - 0
core/wma/src/wma_scan_roam.c

@@ -68,6 +68,7 @@
 #include "wma_internal.h"
 #include "wlan_tgt_def_config.h"
 #include "wlan_reg_services_api.h"
+#include "wlan_roam_debug.h"
 
 /* This is temporary, should be removed */
 #include "ol_htt_api.h"
@@ -2276,6 +2277,10 @@ void wma_process_roam_synch_fail(WMA_HANDLE handle,
 			__func__);
 		return;
 	}
+	wlan_roam_debug_log(synch_fail->session_id,
+			    DEBUG_ROAM_SYNCH_FAIL,
+			    DEBUG_INVALID_PEER_ID, NULL, NULL, 0, 0);
+
 	/* Hand Off Failure could happen as an exception, when a roam synch
 	 * indication is posted to Host, but a roam synch complete is not
 	 * posted to the firmware.So, clear the roam synch in progress
@@ -2533,6 +2538,10 @@ int wma_roam_synch_event_handler(void *handle, uint8_t *event,
 		goto cleanup_label;
 	}
 
+	wlan_roam_debug_log(synch_event->vdev_id, DEBUG_ROAM_SYNCH_IND,
+			    DEBUG_INVALID_PEER_ID, NULL, NULL,
+			    synch_event->bssid.mac_addr31to0,
+			    synch_event->bssid.mac_addr47to32);
 	DPTRACE(qdf_dp_trace_record_event(QDF_DP_TRACE_EVENT_RECORD,
 		synch_event->vdev_id, QDF_TRACE_DEFAULT_PDEV_ID,
 		QDF_PROTO_TYPE_EVENT, QDF_ROAM_SYNCH));
@@ -2986,6 +2995,9 @@ void wma_process_roam_synch_complete(WMA_HANDLE handle, uint8_t vdev_id)
 		QDF_PROTO_TYPE_EVENT, QDF_ROAM_COMPLETE));
 
 	WMA_LOGI("LFR3: Posting WMA_ROAM_OFFLOAD_SYNCH_CNF");
+	wlan_roam_debug_log(vdev_id, DEBUG_ROAM_SYNCH_CNF,
+			    DEBUG_INVALID_PEER_ID, NULL, NULL, 0, 0);
+
 }
 #endif /* WLAN_FEATURE_ROAM_OFFLOAD */
 
@@ -5623,6 +5635,11 @@ int wma_roam_event_callback(WMA_HANDLE handle, uint8_t *event_buf,
 		WMA_LOGE("Invalid vdev id from firmware");
 		return -EINVAL;
 	}
+	wlan_roam_debug_log(wmi_event->vdev_id, DEBUG_ROAM_EVENT,
+			    DEBUG_INVALID_PEER_ID, NULL, NULL,
+			    wmi_event->reason,
+			    (wmi_event->reason == WMI_ROAM_REASON_INVALID) ?
+				wmi_event->notif : wmi_event->rssi);
 
 	DPTRACE(qdf_dp_trace_record_event(QDF_DP_TRACE_EVENT_RECORD,
 		wmi_event->vdev_id, QDF_TRACE_DEFAULT_PDEV_ID,