summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSrinivas Girigowda <sgirigow@codeaurora.org>2016-08-10 22:19:14 -0700
committerAnjaneedevi Kapparapu <akappa@codeaurora.org>2016-08-23 12:37:16 +0530
commit3dbb68b6ee2c5b9f01336a317cc4801e56e104eb (patch)
tree89277eb0cb37e574c2ffc03e04dc21d953bb4389
parentbe9f91314156b6cf1deead40995a0495c12a643a (diff)
qcacld-2.0: Optimize packet trace dumping
Do not hold the spinlock for packet trace dumping and dump the trace only for connection related errors. Change-Id: Ia33137fc924f8a860cf9ae281b8167fe3832c5b4 CRs-Fixed: 1053314
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg80211.c7
-rw-r--r--CORE/HDD/src/wlan_hdd_p2p.c4
-rw-r--r--CORE/HDD/src/wlan_hdd_tx_rx.c2
-rw-r--r--CORE/MAC/inc/aniGlobal.h13
-rw-r--r--CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c4
-rw-r--r--CORE/MAC/src/pe/lim/limUtils.c2
-rw-r--r--CORE/SERVICES/WMA/wma.c2
-rw-r--r--CORE/SME/src/csr/csrApiRoam.c2
-rw-r--r--CORE/SME/src/sme_common/sme_Api.c4
-rw-r--r--CORE/VOSS/inc/vos_api.h2
-rw-r--r--CORE/VOSS/src/vos_api.c15
-rw-r--r--CORE/VOSS/src/vos_packet.c126
-rw-r--r--CORE/VOSS/src/vos_sched.c2
13 files changed, 102 insertions, 83 deletions
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index ce80b3180221..6c69482d0884 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -9339,7 +9339,7 @@ static int __wlan_hdd_cfg80211_wifi_logger_get_ring_data(struct wiphy *wiphy,
ret = vos_flush_logs(WLAN_LOG_TYPE_NON_FATAL,
WLAN_LOG_INDICATOR_FRAMEWORK,
WLAN_LOG_REASON_CODE_UNUSED,
- true);
+ DUMP_VOS_TRACE | DUMP_PACKET_TRACE);
if (VOS_STATUS_SUCCESS != ret) {
hddLog(LOGE, FL("Failed to trigger bug report"));
return -EINVAL;
@@ -17359,9 +17359,10 @@ static eHalStatus hdd_cfg80211_scan_done_callback(tHalHandle halHandle,
vos_flush_logs(WLAN_LOG_TYPE_NON_FATAL,
WLAN_LOG_INDICATOR_HOST_DRIVER,
WLAN_LOG_REASON_NO_SCAN_RESULTS,
- true);
+ DUMP_VOS_TRACE);
pHddCtx->last_scan_bug_report_timestamp = current_timestamp;
}
+ pHddCtx->last_scan_bug_report_timestamp = current_timestamp;
}
}
}
@@ -22549,7 +22550,7 @@ static int __wlan_hdd_cfg80211_tdls_mgmt(struct wiphy *wiphy,
vos_flush_logs(WLAN_LOG_TYPE_FATAL,
WLAN_LOG_INDICATOR_HOST_DRIVER,
WLAN_LOG_REASON_HDD_TIME_OUT,
- true);
+ DUMP_VOS_TRACE);
pAdapter->mgmtTxCompletionStatus = FALSE;
wlan_hdd_tdls_check_bmps(pAdapter);
return -EINVAL;
diff --git a/CORE/HDD/src/wlan_hdd_p2p.c b/CORE/HDD/src/wlan_hdd_p2p.c
index 9895497383ba..52e2f03c967a 100644
--- a/CORE/HDD/src/wlan_hdd_p2p.c
+++ b/CORE/HDD/src/wlan_hdd_p2p.c
@@ -342,7 +342,7 @@ void wlan_hdd_cancel_existing_remain_on_channel(hdd_adapter_t *pAdapter)
vos_flush_logs(WLAN_LOG_TYPE_FATAL,
WLAN_LOG_INDICATOR_HOST_DRIVER,
WLAN_LOG_REASON_HDD_TIME_OUT,
- true);
+ DUMP_VOS_TRACE);
}
INIT_COMPLETION(pAdapter->cancel_rem_on_chan_var);
@@ -1273,7 +1273,7 @@ int __wlan_hdd_cfg80211_cancel_remain_on_channel( struct wiphy *wiphy,
vos_flush_logs(WLAN_LOG_TYPE_FATAL,
WLAN_LOG_INDICATOR_HOST_DRIVER,
WLAN_LOG_REASON_HDD_TIME_OUT,
- true);
+ DUMP_VOS_TRACE);
}
INIT_COMPLETION(pAdapter->cancel_rem_on_chan_var);
/* Issue abort remain on chan request to sme.
diff --git a/CORE/HDD/src/wlan_hdd_tx_rx.c b/CORE/HDD/src/wlan_hdd_tx_rx.c
index 24574c8b0f57..8998c3de68bc 100644
--- a/CORE/HDD/src/wlan_hdd_tx_rx.c
+++ b/CORE/HDD/src/wlan_hdd_tx_rx.c
@@ -810,7 +810,7 @@ void wlan_display_tx_timeout_stats(hdd_adapter_t *adapter)
vos_flush_logs(WLAN_LOG_TYPE_FATAL,
WLAN_LOG_INDICATOR_HOST_DRIVER,
WLAN_LOG_REASON_HDD_TIME_OUT,
- true);
+ DUMP_VOS_TRACE);
}
}
diff --git a/CORE/MAC/inc/aniGlobal.h b/CORE/MAC/inc/aniGlobal.h
index ebeaa6c62656..20c66aac5408 100644
--- a/CORE/MAC/inc/aniGlobal.h
+++ b/CORE/MAC/inc/aniGlobal.h
@@ -196,6 +196,19 @@ enum log_event_indicator {
};
/**
+ * enum log_dump_trace_mask - Mask to indicate what traces to log
+ * @DUMP_NO_TRACE: Do not dump any logs
+ * @DUMP_VOS_TRACE: Dump vos trace logs
+ * @DUMP_PACKET_TRACE: Dump packet trace
+ *
+ */
+enum log_dump_trace_mask {
+ DUMP_NO_TRACE = 0x0,
+ DUMP_VOS_TRACE = 0x1,
+ DUMP_PACKET_TRACE = 0x2
+};
+
+/**
* enum log_event_host_reason_code - Reason code for bug report
* @WLAN_LOG_REASON_CODE_UNUSED: Unused
* @WLAN_LOG_REASON_ROAM_FAIL: Driver initiated roam has failed
diff --git a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
index 1197d319f1b4..8e9abca3c75a 100644
--- a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
+++ b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
@@ -1921,7 +1921,7 @@ __limProcessSmeJoinReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
vos_flush_logs(WLAN_LOG_TYPE_FATAL,
WLAN_LOG_INDICATOR_HOST_DRIVER,
WLAN_LOG_REASON_STALE_SESSION_FOUND,
- true);
+ DUMP_VOS_TRACE);
retCode = eSIR_SME_REFUSED;
goto end;
}
@@ -2474,7 +2474,7 @@ __limProcessSmeReassocReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
vos_flush_logs(WLAN_LOG_TYPE_FATAL,
WLAN_LOG_INDICATOR_HOST_DRIVER,
WLAN_LOG_REASON_STALE_SESSION_FOUND,
- true);
+ DUMP_VOS_TRACE);
retCode = eSIR_SME_REFUSED;
goto end;
}
diff --git a/CORE/MAC/src/pe/lim/limUtils.c b/CORE/MAC/src/pe/lim/limUtils.c
index f4569d25a3ea..cac705450caa 100644
--- a/CORE/MAC/src/pe/lim/limUtils.c
+++ b/CORE/MAC/src/pe/lim/limUtils.c
@@ -1036,7 +1036,7 @@ tANI_U8 limWriteDeferredMsgQ(tpAniSirGlobal pMac, tpSirMsgQ limMsg)
vos_flush_logs(WLAN_LOG_TYPE_NON_FATAL,
WLAN_LOG_INDICATOR_HOST_DRIVER,
WLAN_LOG_REASON_QUEUE_FULL,
- true);
+ DUMP_VOS_TRACE);
}
else
{
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index c3edf99220ab..4055836994bc 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -34577,7 +34577,7 @@ VOS_STATUS WDA_TxPacket(void *wma_context, void *tx_frame, u_int16_t frmLen,
vos_flush_logs(WLAN_LOG_TYPE_FATAL,
WLAN_LOG_INDICATOR_HOST_DRIVER,
WLAN_LOG_REASON_MGMT_FRAME_TIMEOUT,
- true);
+ DUMP_VOS_TRACE);
wmi_crash_inject(wma_handle->wmi_handle,
RECOVERY_SIM_ASSERT, 0);
}
diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c
index 416028973f57..01043d3bb57a 100644
--- a/CORE/SME/src/csr/csrApiRoam.c
+++ b/CORE/SME/src/csr/csrApiRoam.c
@@ -8846,7 +8846,7 @@ static void csrRoamRoamingStateReassocRspProcessor( tpAniSirGlobal pMac, tpSirSm
vos_flush_logs(WLAN_LOG_TYPE_FATAL,
WLAN_LOG_INDICATOR_HOST_DRIVER,
WLAN_LOG_REASON_ROAM_FAIL,
- true);
+ DUMP_VOS_TRACE | DUMP_PACKET_TRACE);
#if defined(WLAN_FEATURE_VOWIFI_11R) || defined(FEATURE_WLAN_ESE) || \
defined(FEATURE_WLAN_LFR)
if ((eSIR_SME_FT_REASSOC_TIMEOUT_FAILURE == pSmeJoinRsp->statusCode) ||
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index 775e57ddd4a9..94a0943d824c 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -505,7 +505,7 @@ tSmeCmd *smeGetCommandBuffer( tpAniSirGlobal pMac )
vos_flush_logs(WLAN_LOG_TYPE_FATAL,
WLAN_LOG_INDICATOR_HOST_DRIVER,
WLAN_LOG_REASON_SME_OUT_OF_CMD_BUF,
- false);
+ DUMP_NO_TRACE);
} else {
/* Trigger SSR */
vos_wlanRestart();
@@ -14071,7 +14071,7 @@ void activeListCmdTimeoutHandle(void *userData)
vos_flush_logs(WLAN_LOG_TYPE_FATAL,
WLAN_LOG_INDICATOR_HOST_DRIVER,
WLAN_LOG_REASON_SME_COMMAND_STUCK,
- false);
+ DUMP_NO_TRACE);
} else {
vosTraceDumpAll(mac_ctx, 0, 0, 500, 0);
}
diff --git a/CORE/VOSS/inc/vos_api.h b/CORE/VOSS/inc/vos_api.h
index 191b3cee5f48..77e146c4f210 100644
--- a/CORE/VOSS/inc/vos_api.h
+++ b/CORE/VOSS/inc/vos_api.h
@@ -368,7 +368,7 @@ void vos_deinit_log_completion(void);
VOS_STATUS vos_flush_logs(uint32_t is_fatal,
uint32_t indicator,
uint32_t reason_code,
- bool dump_vos_trace);
+ uint32_t dump_vos_trace);
void vos_wlan_flush_host_logs_for_fatal(void);
void vos_logging_set_fw_flush_complete(void);
void vos_probe_threads(void);
diff --git a/CORE/VOSS/src/vos_api.c b/CORE/VOSS/src/vos_api.c
index aab204afe7f2..ae5cb31d6688 100644
--- a/CORE/VOSS/src/vos_api.c
+++ b/CORE/VOSS/src/vos_api.c
@@ -1941,7 +1941,7 @@ VOS_STATUS vos_mq_post_message_by_priority(VOS_MQ_ID msgQueueId,
vos_flush_logs(WLAN_LOG_TYPE_FATAL,
WLAN_LOG_INDICATOR_HOST_ONLY,
WLAN_LOG_REASON_VOS_MSG_UNDER_RUN,
- true);
+ DUMP_VOS_TRACE);
}
if (VOS_WRAPPER_MAX_FAIL_COUNT == debug_count) {
vos_wlanRestart();
@@ -2891,6 +2891,8 @@ void vos_wlan_flush_host_logs_for_fatal(void)
* @indicator: Source which trigerred the bug report
* @reason_code: Reason for triggering bug report
* @dump_vos_trace: If vos trace are needed in logs.
+ * @pkt_trace: flag to indicate when to report packet trace
+ * dump this info when connection related error occurs
*
* This function sets the log related params and send the WMI command to the
* FW to flush its logs. On receiving the flush completion event from the FW
@@ -2901,7 +2903,7 @@ void vos_wlan_flush_host_logs_for_fatal(void)
VOS_STATUS vos_flush_logs(uint32_t is_fatal,
uint32_t indicator,
uint32_t reason_code,
- bool dump_vos_trace)
+ uint32_t dump_trace)
{
uint32_t ret;
VOS_STATUS status;
@@ -2942,14 +2944,15 @@ VOS_STATUS vos_flush_logs(uint32_t is_fatal,
}
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "%s: Triggering bug report: type:%d, indicator=%d reason_code=%d",
- __func__, is_fatal, indicator, reason_code);
+ "%s: Triggering bug report: type:%d, indicator=%d reason_code=%d dump_trace=0x%x",
+ __func__, is_fatal, indicator, reason_code, dump_trace);
- if (dump_vos_trace)
+ if (dump_trace | DUMP_VOS_TRACE)
vosTraceDumpAll(vos_context->pMACContext, 0, 0, 500, 0);
#ifdef QCA_PKT_PROTO_TRACE
- vos_pkt_trace_buf_dump();
+ if (dump_trace | DUMP_PACKET_TRACE)
+ vos_pkt_trace_buf_dump();
#endif
if (WLAN_LOG_INDICATOR_HOST_ONLY == indicator) {
vos_wlan_flush_host_logs_for_fatal();
diff --git a/CORE/VOSS/src/vos_packet.c b/CORE/VOSS/src/vos_packet.c
index daeec8f5014c..1795ecbfb8e1 100644
--- a/CORE/VOSS/src/vos_packet.c
+++ b/CORE/VOSS/src/vos_packet.c
@@ -314,91 +314,93 @@ void vos_pkt_trace_buf_update
VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO,
"%s %d, %s", __func__, __LINE__, event_string);
- spin_lock_bh(&trace_buffer_lock);
if (!trace_buffer) {
VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO,
"trace_buffer is already free");
- spin_unlock_bh(&trace_buffer_lock);
return;
}
+ spin_lock_bh(&trace_buffer_lock);
slot = trace_buffer_order % VOS_PKT_TRAC_MAX_TRACE_BUF;
trace_buffer[slot].order = trace_buffer_order;
+ trace_buffer_order++;
+ spin_unlock_bh(&trace_buffer_lock);
do_gettimeofday(&tv);
trace_buffer[slot].event_sec_time = tv.tv_sec;
trace_buffer[slot].event_msec_time = tv.tv_usec;
strncpy(trace_buffer[slot].event_string, event_string,
(sizeof(trace_buffer[slot].event_string) < strlen(event_string)?
sizeof(trace_buffer[slot].event_string) : strlen(event_string)));
- trace_buffer_order++;
- spin_unlock_bh(&trace_buffer_lock);
return;
}
/**
- * vos_pkt_trace_buf_dump - Dump stored information into kernel log
+ * vos_pkt_trace_buf_dump_1() - Helper function to dump pkt trace
+ * @slot: index
+ *
+ * Return: none
*/
-void vos_pkt_trace_buf_dump
-(
- void
-)
+void vos_pkt_trace_buf_dump_1(int slot)
{
- v_U32_t slot, idx;
- struct rtc_time tm;
- unsigned long local_time;
-
- spin_lock_bh(&trace_buffer_lock);
- if (!trace_buffer) {
- VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO,
- "trace_buffer is already free");
- spin_unlock_bh(&trace_buffer_lock);
- return;
- }
- VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_INFO,
- "PACKET TRACE DUMP START Current Timestamp %u",
- (unsigned int)vos_timer_get_system_time());
- VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_INFO,
- "ORDER : RTC TIME : EVT");
-
- if (VOS_PKT_TRAC_MAX_TRACE_BUF > trace_buffer_order)
- {
- for (slot = 0 ; slot < trace_buffer_order; slot++)
- {
- local_time = (u32)(trace_buffer[slot].event_sec_time -
- (sys_tz.tz_minuteswest * 60));
- rtc_time_to_tm(local_time, &tm);
- VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_INFO,
- "%5d : [%02d:%02d:%02d.%06lu] : %s",
- trace_buffer[slot].order,
- tm.tm_hour, tm.tm_min, tm.tm_sec,
- trace_buffer[slot].event_sec_time,
- trace_buffer[slot].event_string);
- }
- }
- else
- {
- for (idx = 0 ; idx < VOS_PKT_TRAC_MAX_TRACE_BUF; idx++)
- {
- slot = (trace_buffer_order + idx) % VOS_PKT_TRAC_MAX_TRACE_BUF;
- local_time = (u32)(trace_buffer[slot].event_sec_time -
- (sys_tz.tz_minuteswest * 60));
- rtc_time_to_tm(local_time, &tm);
- VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_INFO,
- "%5d : [%02d:%02d:%02d.%06lu] : %s",
- trace_buffer[slot].order,
- tm.tm_hour, tm.tm_min, tm.tm_sec,
- trace_buffer[slot].event_sec_time,
- trace_buffer[slot].event_string);
- }
- }
-
- VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_INFO,
- "PACKET TRACE DUMP END");
- spin_unlock_bh(&trace_buffer_lock);
+ struct rtc_time tm;
+ unsigned long local_time;
+
+ local_time = (u32)(trace_buffer[slot].event_sec_time -
+ (sys_tz.tz_minuteswest * 60));
+ rtc_time_to_tm(local_time, &tm);
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "%5d : [%02d:%02d:%02d.%06lu] : %s",
+ trace_buffer[slot].order,
+ tm.tm_hour, tm.tm_min, tm.tm_sec,
+ trace_buffer[slot].event_sec_time,
+ trace_buffer[slot].event_string);
+}
- return;
+/**
+ * vos_pkt_trace_buf_dump - Dump stored information into kernel log
+ */
+void vos_pkt_trace_buf_dump(void)
+{
+ uint32_t i, latest_idx = trace_buffer_order;
+ int slot;
+
+ if (!trace_buffer || !latest_idx) {
+ VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_INFO,
+ "trace_buffer is already free trace_buffer_order: %d",
+ trace_buffer_order);
+ return;
+ }
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "PACKET TRACE DUMP START Current Timestamp %u",
+ (unsigned int)vos_timer_get_system_time());
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "ORDER : RTC TIME : EVT");
+
+ if (VOS_PKT_TRAC_MAX_TRACE_BUF > latest_idx) {
+ /*
+ * Scenario: Number of trace records less than MAX,
+ * Circular buffer not overwritten.
+ */
+ for (slot = latest_idx - 1; slot >= 0; slot--)
+ vos_pkt_trace_buf_dump_1(slot);
+ } else {
+ /*
+ * Scenario: Number of trace records exceeded MAX,
+ * Circular buffer is overwritten.
+ */
+ for (i = 0; i < VOS_PKT_TRAC_MAX_TRACE_BUF; i++) {
+ slot = ((latest_idx - i - 1) %
+ VOS_PKT_TRAC_MAX_TRACE_BUF);
+ vos_pkt_trace_buf_dump_1(slot);
+ }
+ }
+
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "PACKET TRACE DUMP END");
+
+ return;
}
/**
diff --git a/CORE/VOSS/src/vos_sched.c b/CORE/VOSS/src/vos_sched.c
index aa5607c2d933..9db28ed0fca7 100644
--- a/CORE/VOSS/src/vos_sched.c
+++ b/CORE/VOSS/src/vos_sched.c
@@ -999,7 +999,7 @@ static void vos_wd_detect_thread_stuck(void)
vos_flush_logs(WLAN_LOG_TYPE_FATAL,
WLAN_LOG_INDICATOR_HOST_ONLY,
WLAN_LOG_REASON_THREAD_STUCK,
- true);
+ DUMP_VOS_TRACE);
spin_lock_irqsave(&gpVosWatchdogContext->thread_stuck_lock,
flags);
}