diff --git a/qdf/inc/qdf_trace.h b/qdf/inc/qdf_trace.h index 1998a1faa5..2e7fbe7d4a 100644 --- a/qdf/inc/qdf_trace.h +++ b/qdf/inc/qdf_trace.h @@ -163,10 +163,11 @@ typedef struct s_qdf_trace_data { #define QDF_DP_TRACE_RECORD_SIZE 40 #define INVALID_QDF_DP_TRACE_ADDR 0xffffffff -#define QDF_DP_TRACE_VERBOSITY_HIGH 3 -#define QDF_DP_TRACE_VERBOSITY_MEDIUM 2 -#define QDF_DP_TRACE_VERBOSITY_LOW 1 -#define QDF_DP_TRACE_VERBOSITY_BASE 0 +#define QDF_DP_TRACE_VERBOSITY_HIGH 4 +#define QDF_DP_TRACE_VERBOSITY_MEDIUM 3 +#define QDF_DP_TRACE_VERBOSITY_LOW 2 +#define QDF_DP_TRACE_VERBOSITY_ULTRA_LOW 1 +#define QDF_DP_TRACE_VERBOSITY_BASE 0 /** * enum QDF_DP_TRACE_ID - Generic ID to identify various events in data path @@ -176,28 +177,29 @@ typedef struct s_qdf_trace_data { * @QDF_DP_TRACE_DHCP_PACKET_RECORD - record DHCP packet * @QDF_DP_TRACE_ARP_PACKET_RECORD - record ARP packet * @QDF_DP_TRACE_MGMT_PACKET_RECORD - record MGMT pacekt - * QDF_DP_TRACE_EVENT_RECORD - record events + * @QDF_DP_TRACE_EVENT_RECORD - record events * @QDF_DP_TRACE_BASE_VERBOSITY - below this are part of base verbosity * @QDF_DP_TRACE_ICMP_PACKET_RECORD - record ICMP packet * @QDF_DP_TRACE_ICMPv6_PACKET_RECORD - record ICMPv6 packet - * @QDF_DP_TRACE_HDD_TX_PACKET_RECORD - record 32 bytes of tx pkt at HDD - * @QDF_DP_TRACE_HDD_RX_PACKET_RECORD - record 32 bytes of rx pkt at HDD - * @QDF_DP_TRACE_TX_PACKET_RECORD - record 32 bytes of tx pkt at any layer - * @QDF_DP_TRACE_RX_PACKET_RECORD - record 32 bytes of rx pkt at any layer * @QDF_DP_TRACE_HDD_TX_TIMEOUT - HDD tx timeout * @QDF_DP_TRACE_HDD_SOFTAP_TX_TIMEOUT- SOFTAP HDD tx timeout + * @QDF_DP_TRACE_ULTRA_LOW_VERBOSITY - Below this is not logged for >4PPS + * @QDF_DP_TRACE_TX_PACKET_RECORD - record 32 bytes of tx pkt at any layer + * @QDF_DP_TRACE_RX_PACKET_RECORD - record 32 bytes of rx pkt at any layer + * @QDF_DP_TRACE_HDD_TX_PACKET_RECORD - record 32 bytes of tx pkt at HDD + * @QDF_DP_TRACE_HDD_RX_PACKET_RECORD - record 32 bytes of rx pkt at HDD * @QDF_DP_TRACE_FREE_PACKET_PTR_RECORD - tx completion ptr record * @QDF_DP_TRACE_LOW_VERBOSITY - below this are part of low verbosity * @QDF_DP_TRACE_HDD_TX_PACKET_PTR_RECORD - HDD layer ptr record * @QDF_DP_TRACE_LI_DP_TX_PACKET_PTR_RECORD - Lithium DP layer ptr record + * @QDF_DP_TRACE_RX_HDD_PACKET_PTR_RECORD - HDD RX record * @QDF_DP_TRACE_CE_PACKET_PTR_RECORD - CE layer ptr record * @QDF_DP_TRACE_CE_FAST_PACKET_PTR_RECORD- CE fastpath ptr record * @QDF_DP_TRACE_CE_FAST_PACKET_ERR_RECORD- CE fastpath error record * @QDF_DP_TRACE_RX_HTT_PACKET_PTR_RECORD - HTT RX record * @QDF_DP_TRACE_RX_OFFLOAD_HTT_PACKET_PTR_RECORD- HTT RX offload record - * @QDF_DP_TRACE_RX_HDD_PACKET_PTR_RECORD - HDD RX record * @QDF_DP_TRACE_RX_LI_DP_PACKET_PTR_RECORD - Lithium DP RX record - * @QDF_DP_TRACE_MED_VERBOSITY - below this are part of med verbosity + * @QDF_DP_TRACE_MED_VERBOSITY - below this are part of med verbosity * @QDF_DP_TRACE_TXRX_QUEUE_PACKET_PTR_RECORD -tx queue ptr record * @QDF_DP_TRACE_TXRX_PACKET_PTR_RECORD - txrx packet ptr record * @QDF_DP_TRACE_TXRX_FAST_PACKET_PTR_RECORD - txrx fast path record @@ -222,12 +224,13 @@ enum QDF_DP_TRACE_ID { QDF_DP_TRACE_BASE_VERBOSITY, QDF_DP_TRACE_ICMP_PACKET_RECORD, QDF_DP_TRACE_ICMPv6_PACKET_RECORD, - QDF_DP_TRACE_HDD_TX_PACKET_RECORD, - QDF_DP_TRACE_HDD_RX_PACKET_RECORD, - QDF_DP_TRACE_TX_PACKET_RECORD, - QDF_DP_TRACE_RX_PACKET_RECORD, QDF_DP_TRACE_HDD_TX_TIMEOUT, QDF_DP_TRACE_HDD_SOFTAP_TX_TIMEOUT, + QDF_DP_TRACE_ULTRA_LOW_VERBOSITY, + QDF_DP_TRACE_TX_PACKET_RECORD, + QDF_DP_TRACE_RX_PACKET_RECORD, + QDF_DP_TRACE_HDD_TX_PACKET_RECORD, + QDF_DP_TRACE_HDD_RX_PACKET_RECORD, QDF_DP_TRACE_FREE_PACKET_PTR_RECORD, QDF_DP_TRACE_LOW_VERBOSITY, QDF_DP_TRACE_HDD_TX_PACKET_PTR_RECORD, @@ -353,6 +356,7 @@ struct qdf_dp_trace_record_s { * @proto_bitmap: defines which protocol to be traced * @no_of_record: defines every nth packet to be traced * @verbosity : defines verbosity level + * @ini_conf_verbosity: Configured verbosity from INI * @enable: enable/disable DP trace * @count: current packet number * @live_mode_config: configuration as received during initialization @@ -361,6 +365,7 @@ struct qdf_dp_trace_record_s { * @force_live_mode: flag to enable live mode all the time for all packets. * This can be set/unset from userspace and overrides other * live mode flags. + * @dynamic_verbosity_modify: Dynamic user configured verbosity overrides all * @print_pkt_cnt: count of number of packets printed in live mode * @high_tput_thresh: thresh beyond which live mode is turned off * @thresh_time_limit: max time, in terms of BW timer intervals to wait, @@ -394,12 +399,14 @@ struct s_qdf_dp_trace_data { uint8_t proto_bitmap; uint8_t no_of_record; uint8_t verbosity; + uint8_t ini_conf_verbosity; bool enable; bool live_mode_config; bool live_mode; uint32_t curr_pos; uint32_t saved_tail; bool force_live_mode; + bool dynamic_verbosity_modify; uint8_t print_pkt_cnt; uint8_t high_tput_thresh; uint16_t thresh_time_limit; @@ -645,6 +652,14 @@ void qdf_dp_trace_ptr(qdf_nbuf_t nbuf, enum QDF_DP_TRACE_ID code, uint16_t msdu_id, uint16_t status); void qdf_dp_trace_throttle_live_mode(bool high_bw_request); +/** + * qdf_dp_trace_tput_policy() - Change verbosity based on the TPUT + * @is_data_traffic: Is traffic more than low TPUT threashould + * + * Return: None + */ +void qdf_dp_trace_apply_tput_policy(bool is_data_traffic); + /** * qdf_dp_trace_data_pkt() - trace data packet * @nbuf: nbuf which needs to be traced diff --git a/qdf/linux/src/qdf_trace.c b/qdf/linux/src/qdf_trace.c index 2d9435a150..5ab117304d 100644 --- a/qdf/linux/src/qdf_trace.c +++ b/qdf/linux/src/qdf_trace.c @@ -776,6 +776,7 @@ void qdf_dp_trace_init(bool live_mode_config, uint8_t thresh, g_qdf_dp_trace_data.thresh_time_limit = time_limit; g_qdf_dp_trace_data.proto_bitmap = proto_bitmap; g_qdf_dp_trace_data.verbosity = verbosity; + g_qdf_dp_trace_data.ini_conf_verbosity = verbosity; for (i = 0; i < ARRAY_SIZE(qdf_dp_trace_cb_table); i++) qdf_dp_trace_cb_table[i] = qdf_dp_display_record; @@ -820,6 +821,7 @@ void qdf_dp_trace_set_value(uint8_t proto_bitmap, uint8_t no_of_record, g_qdf_dp_trace_data.proto_bitmap = proto_bitmap; g_qdf_dp_trace_data.no_of_record = no_of_record; g_qdf_dp_trace_data.verbosity = verbosity; + g_qdf_dp_trace_data.dynamic_verbosity_modify = true; } qdf_export_symbol(qdf_dp_trace_set_value); @@ -909,6 +911,11 @@ static bool qdf_dp_trace_enable_track(enum QDF_DP_TRACE_ID code) if (code <= QDF_DP_TRACE_LOW_VERBOSITY) return true; return false; + case QDF_DP_TRACE_VERBOSITY_ULTRA_LOW: + if (code <= QDF_DP_TRACE_ULTRA_LOW_VERBOSITY) + return true; + return false; + case QDF_DP_TRACE_VERBOSITY_BASE: if (code <= QDF_DP_TRACE_BASE_VERBOSITY) return true; @@ -1339,6 +1346,20 @@ static void qdf_dp_add_record(enum QDF_DP_TRACE_ID code, uint8_t pdev_id, spin_lock_bh(&l_dp_trace_lock); + if (print || g_qdf_dp_trace_data.force_live_mode) { + print_this_record = true; + } else if (g_qdf_dp_trace_data.live_mode == 1) { + print_this_record = true; + g_qdf_dp_trace_data.print_pkt_cnt++; + if (g_qdf_dp_trace_data.print_pkt_cnt > + g_qdf_dp_trace_data.high_tput_thresh) { + g_qdf_dp_trace_data.live_mode = 0; + g_qdf_dp_trace_data.verbosity = + QDF_DP_TRACE_ULTRA_LOW_VERBOSITY; + info |= QDF_DP_TRACE_RECORD_INFO_THROTTLED; + } + } + g_qdf_dp_trace_data.num++; if (g_qdf_dp_trace_data.num > MAX_QDF_DP_TRACE_RECORDS) @@ -1380,17 +1401,6 @@ static void qdf_dp_add_record(enum QDF_DP_TRACE_ID code, uint8_t pdev_id, return; } - if (print || g_qdf_dp_trace_data.force_live_mode) { - print_this_record = true; - } else if (g_qdf_dp_trace_data.live_mode == 1) { - print_this_record = true; - g_qdf_dp_trace_data.print_pkt_cnt++; - if (g_qdf_dp_trace_data.print_pkt_cnt > - g_qdf_dp_trace_data.high_tput_thresh) { - g_qdf_dp_trace_data.live_mode = 0; - info |= QDF_DP_TRACE_RECORD_INFO_THROTTLED; - } - } spin_unlock_bh(&l_dp_trace_lock); info |= QDF_DP_TRACE_RECORD_INFO_LIVE; @@ -2536,11 +2546,28 @@ void qdf_dp_trace_throttle_live_mode(bool high_bw_request) g_qdf_dp_trace_data.live_mode = 1; g_qdf_dp_trace_data.print_pkt_cnt = 0; + g_qdf_dp_trace_data.verbosity = + g_qdf_dp_trace_data.ini_conf_verbosity; spin_unlock_bh(&l_dp_trace_lock); } - } qdf_export_symbol(qdf_dp_trace_throttle_live_mode); + +void qdf_dp_trace_apply_tput_policy(bool is_data_traffic) +{ + if (g_qdf_dp_trace_data.dynamic_verbosity_modify) + return; + + if (is_data_traffic) { + g_qdf_dp_trace_data.verbosity = + QDF_DP_TRACE_ULTRA_LOW_VERBOSITY; + qdf_dp_trace_throttle_live_mode(true); + } else { + g_qdf_dp_trace_data.verbosity = + g_qdf_dp_trace_data.ini_conf_verbosity; + qdf_dp_trace_throttle_live_mode(false); + } +} #endif struct qdf_print_ctrl print_ctrl_obj[MAX_PRINT_CONFIG_SUPPORTED];