diff --git a/qdf/inc/qdf_nbuf.h b/qdf/inc/qdf_nbuf.h index 6661bcc781..39f67b0fae 100644 --- a/qdf/inc/qdf_nbuf.h +++ b/qdf/inc/qdf_nbuf.h @@ -38,6 +38,7 @@ #define QDF_NBUF_PKT_TRAC_TYPE_ARP 0x10 #define QDF_NBUF_PKT_TRAC_TYPE_ICMP 0x20 #define QDF_NBUF_PKT_TRAC_TYPE_ICMPv6 0x40 +#define QDF_HL_CREDIT_TRACKING 0x80 #define QDF_NBUF_PKT_TRAC_MAX_STRING 12 #define QDF_NBUF_PKT_TRAC_PROTO_STRING 4 diff --git a/qdf/inc/qdf_trace.h b/qdf/inc/qdf_trace.h index 4dc1d60753..f2adc2c5c5 100644 --- a/qdf/inc/qdf_trace.h +++ b/qdf/inc/qdf_trace.h @@ -195,6 +195,7 @@ typedef struct s_qdf_trace_data { * @QDF_DP_TRACE_ICMPv6_PACKET_RECORD - record ICMPv6 packet * @QDF_DP_TRACE_HDD_TX_TIMEOUT - HDD tx timeout * @QDF_DP_TRACE_HDD_SOFTAP_TX_TIMEOUT- SOFTAP HDD tx timeout + * @QDF_DP_TRACE_TX_CREDIT_RECORD - credit update record * @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 @@ -241,6 +242,7 @@ enum QDF_DP_TRACE_ID { QDF_DP_TRACE_ICMPv6_PACKET_RECORD, QDF_DP_TRACE_HDD_TX_TIMEOUT, QDF_DP_TRACE_HDD_SOFTAP_TX_TIMEOUT, + QDF_DP_TRACE_TX_CREDIT_RECORD, QDF_DP_TRACE_ULTRA_LOW_VERBOSITY, QDF_DP_TRACE_TX_PACKET_RECORD, QDF_DP_TRACE_RX_PACKET_RECORD, @@ -285,6 +287,36 @@ enum qdf_proto_dir { QDF_NA }; +/** + * QDF_CREDIT_UPDATE_SOURCE - source of credit record + * @QDF_TX_SCHED: Tx scheduler + * @QDF_TX_COMP: TX completion + * @QDF_TX_CREDIT_UPDATE: credit update indication + * @QDF_HTT_ATTACH: HTT attach + * @QDF_TX_HTT_MSG: HTT TX message + */ +enum QDF_CREDIT_UPDATE_SOURCE { + QDF_TX_SCHED, + QDF_TX_COMP, + QDF_TX_CREDIT_UPDATE, + QDF_HTT_ATTACH, + QDF_TX_HTT_MSG +}; + +/** + * QDF_CREDIT_OPERATION - operation on credit + * @QDF_CREDIT_INC: credit increment + * @QDF_CREDIT_DEC: credit decrement + * @QDF_CREDIT_ABS: Abosolute credit + * @QDF_OP_NA: Not applicable + */ +enum QDF_CREDIT_OPERATION { + QDF_CREDIT_INC, + QDF_CREDIT_DEC, + QDF_CREDIT_ABS, + QDF_OP_NA +}; + /** * struct qdf_dp_trace_ptr_buf - pointer record buffer * @cookie: cookie value @@ -327,6 +359,24 @@ struct qdf_dp_trace_mgmt_buf { uint8_t subtype; }; +/** + * struct qdf_dp_trace_credit_record - tx credit record + * @source: credit record source + * @operation: credit operation + * @delta: delta of credit + * @total_credits: total credit + * @g0_credit: group 0 credit + * @g1_credit: group 1 credit + */ +struct qdf_dp_trace_credit_record { + enum QDF_CREDIT_UPDATE_SOURCE source; + enum QDF_CREDIT_OPERATION operation; + int delta; + int total_credits; + int g0_credit; + int g1_credit; +}; + /** * struct qdf_dp_trace_event_buf - event buffer * @vdev_id : vdev id @@ -414,7 +464,7 @@ struct s_qdf_dp_trace_data { uint32_t head; uint32_t tail; uint32_t num; - uint8_t proto_bitmap; + uint32_t proto_bitmap; uint8_t no_of_record; uint16_t num_records_to_dump; uint16_t dump_counter; @@ -608,11 +658,11 @@ bool qdf_dp_trace_log_pkt(uint8_t vdev_id, struct sk_buff *skb, void qdf_dp_trace_init(bool live_mode_config, uint8_t thresh, uint16_t time_limit, uint8_t verbosity, - uint8_t proto_bitmap); + uint32_t proto_bitmap); void qdf_dp_trace_deinit(void); void qdf_dp_trace_spin_lock_init(void); -void qdf_dp_trace_set_value(uint8_t proto_bitmap, uint8_t no_of_records, - uint8_t verbosity); +void qdf_dp_trace_set_value(uint32_t proto_bitmap, uint8_t no_of_records, + uint8_t verbosity); void qdf_dp_trace_set_track(qdf_nbuf_t nbuf, enum qdf_proto_dir dir); void qdf_dp_trace(qdf_nbuf_t nbuf, enum QDF_DP_TRACE_ID code, uint8_t pdev_id, uint8_t *data, uint8_t size, enum qdf_proto_dir dir); @@ -737,7 +787,7 @@ void qdf_dp_trace_data_pkt(qdf_nbuf_t nbuf, uint8_t pdev_id, enum QDF_DP_TRACE_ID code, uint16_t msdu_id, enum qdf_proto_dir dir); -uint8_t qdf_dp_get_proto_bitmap(void); +uint32_t qdf_dp_get_proto_bitmap(void); uint8_t qdf_dp_get_verbosity(void); uint8_t qdf_dp_get_no_of_record(void); @@ -778,6 +828,20 @@ void qdf_dp_trace_mgmt_pkt(enum QDF_DP_TRACE_ID code, uint8_t vdev_id, uint8_t pdev_id, enum qdf_proto_type type, enum qdf_proto_subtype subtype); +/** + * qdf_dp_trace_credit_record() - record credit update + * @source: source of record + * @operation: credit operation + * @delta: credit delta + * @total_credits: total credit + * @g0_credit: group 0 credit + * @g1_credit: group 1 credit + */ +void qdf_dp_trace_credit_record(enum QDF_CREDIT_UPDATE_SOURCE source, + enum QDF_CREDIT_OPERATION operation, + int delta, int total_credits, + int g0_credit, int g1_credit); + /** * qdf_dp_display_mgmt_pkt() - display proto packet * @record: dptrace record @@ -790,6 +854,17 @@ void qdf_dp_trace_mgmt_pkt(enum QDF_DP_TRACE_ID code, uint8_t vdev_id, void qdf_dp_display_mgmt_pkt(struct qdf_dp_trace_record_s *record, uint16_t index, uint8_t pdev_id, uint8_t info); +/** + * qdf_dp_display_credit_record() - display credit record + * @record: dptrace record + * @index: index + * @pdev_id: pdev id + * @info: metadeta info + */ +void qdf_dp_display_credit_record(struct qdf_dp_trace_record_s *record, + uint16_t index, uint8_t pdev_id, + uint8_t info); + /** * qdf_dp_display_event_record() - display event records * @record: dptrace record @@ -815,7 +890,7 @@ bool qdf_dp_trace_log_pkt(uint8_t vdev_id, struct sk_buff *skb, static inline void qdf_dp_trace_init(bool live_mode_config, uint8_t thresh, uint16_t time_limit, uint8_t verbosity, - uint8_t proto_bitmap) + uint32_t proto_bitmap) { } @@ -829,8 +904,8 @@ void qdf_dp_trace_set_track(qdf_nbuf_t nbuf, enum qdf_proto_dir dir) { } static inline -void qdf_dp_trace_set_value(uint8_t proto_bitmap, uint8_t no_of_records, - uint8_t verbosity) +void qdf_dp_trace_set_value(uint32_t proto_bitmap, uint8_t no_of_records, + uint8_t verbosity) { } diff --git a/qdf/linux/src/qdf_trace.c b/qdf/linux/src/qdf_trace.c index e0a060a4fe..332976d923 100644 --- a/qdf/linux/src/qdf_trace.c +++ b/qdf/linux/src/qdf_trace.c @@ -692,7 +692,7 @@ static void qdf_dp_unused(struct qdf_dp_trace_record_s *record, */ void qdf_dp_trace_init(bool live_mode_config, uint8_t thresh, uint16_t time_limit, uint8_t verbosity, - uint8_t proto_bitmap) + uint32_t proto_bitmap) { uint8_t i; @@ -739,6 +739,8 @@ void qdf_dp_trace_init(bool live_mode_config, uint8_t thresh, qdf_dp_display_proto_pkt; qdf_dp_trace_cb_table[QDF_DP_TRACE_MGMT_PACKET_RECORD] = qdf_dp_display_mgmt_pkt; + qdf_dp_trace_cb_table[QDF_DP_TRACE_TX_CREDIT_RECORD] = + qdf_dp_display_credit_record; qdf_dp_trace_cb_table[QDF_DP_TRACE_EVENT_RECORD] = qdf_dp_display_event_record; @@ -765,7 +767,7 @@ void qdf_dp_trace_deinit(void) * * Return: None */ -void qdf_dp_trace_set_value(uint8_t proto_bitmap, uint8_t no_of_record, +void qdf_dp_trace_set_value(uint32_t proto_bitmap, uint8_t no_of_record, uint8_t verbosity) { g_qdf_dp_trace_data.proto_bitmap = proto_bitmap; @@ -879,7 +881,7 @@ static bool qdf_dp_trace_verbosity_check(enum QDF_DP_TRACE_ID code) * * Return: proto bitmap */ -uint8_t qdf_dp_get_proto_bitmap(void) +uint32_t qdf_dp_get_proto_bitmap(void) { if (g_qdf_dp_trace_data.enable) return g_qdf_dp_trace_data.proto_bitmap; @@ -980,6 +982,8 @@ const char *qdf_dp_code_to_string(enum QDF_DP_TRACE_ID code) return "ICMPv6:"; case QDF_DP_TRACE_MGMT_PACKET_RECORD: return "MGMT:"; + case QDF_DP_TRACE_TX_CREDIT_RECORD: + return "CREDIT:"; case QDF_DP_TRACE_EVENT_RECORD: return "EVENT:"; case QDF_DP_TRACE_HDD_TX_PACKET_PTR_RECORD: @@ -1056,6 +1060,39 @@ static const char *qdf_dp_dir_to_str(enum qdf_proto_dir dir) } } +static const char *qdf_dp_credit_source_to_str( + enum QDF_CREDIT_UPDATE_SOURCE source) +{ + switch (source) { + case QDF_TX_SCHED: + return "TX SCHED"; + case QDF_TX_COMP: + return "TX COMP"; + case QDF_TX_CREDIT_UPDATE: + return "CREDIT UP"; + case QDF_TX_HTT_MSG: + return "HTT TX MSG"; + case QDF_HTT_ATTACH: + return "HTT ATTACH"; + default: + return "invalid"; + } +} + +static const char *qdf_dp_operation_to_str(enum QDF_CREDIT_OPERATION op) +{ + switch (op) { + case QDF_CREDIT_INC: + return "+"; + case QDF_CREDIT_DEC: + return "-"; + case QDF_CREDIT_ABS: + return "ABS"; + default: + return "invalid"; + } +} + /** * qdf_dp_type_to_str() - convert packet type to string * @type: type @@ -1696,6 +1733,91 @@ void qdf_dp_trace_mgmt_pkt(enum QDF_DP_TRACE_ID code, uint8_t vdev_id, } qdf_export_symbol(qdf_dp_trace_mgmt_pkt); +static void +qdf_dpt_display_credit_record_debugfs(qdf_debugfs_file_t file, + struct qdf_dp_trace_record_s *record, + uint32_t index) +{ + int loc; + char prepend_str[QDF_DP_TRACE_PREPEND_STR_SIZE]; + struct qdf_dp_trace_credit_record *buf = + (struct qdf_dp_trace_credit_record *)record->data; + + loc = qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str), + index, 0, record); + if (buf->operation == QDF_OP_NA) + qdf_debugfs_printf(file, "%s [%s] [T: %d G0: %d G1: %d]\n", + prepend_str, + qdf_dp_credit_source_to_str(buf->source), + buf->total_credits, buf->g0_credit, + buf->g1_credit); + else + qdf_debugfs_printf(file, + "%s [%s] [T: %d G0: %d G1: %d] [%s %d]\n", + prepend_str, + qdf_dp_credit_source_to_str(buf->source), + buf->total_credits, buf->g0_credit, + buf->g1_credit, + qdf_dp_operation_to_str(buf->operation), + buf->delta); +} + +void qdf_dp_display_credit_record(struct qdf_dp_trace_record_s *record, + uint16_t index, uint8_t pdev_id, uint8_t info) +{ + int loc; + char prepend_str[QDF_DP_TRACE_PREPEND_STR_SIZE]; + struct qdf_dp_trace_credit_record *buf = + (struct qdf_dp_trace_credit_record *)record->data; + + loc = qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str), + index, info, record); + if (buf->operation == QDF_OP_NA) + DPTRACE_PRINT("%s [%s] [T: %d G0: %d G1: %d]", + prepend_str, + qdf_dp_credit_source_to_str(buf->source), + buf->total_credits, buf->g0_credit, + buf->g1_credit); + else + DPTRACE_PRINT("%s [%s] [T: %d G0: %d G1: %d] [%s %d]", + prepend_str, + qdf_dp_credit_source_to_str(buf->source), + buf->total_credits, buf->g0_credit, + buf->g1_credit, + qdf_dp_operation_to_str(buf->operation), + buf->delta); +} + +void qdf_dp_trace_credit_record(enum QDF_CREDIT_UPDATE_SOURCE source, + enum QDF_CREDIT_OPERATION operation, + int delta, int total_credits, + int g0_credit, int g1_credit) +{ + struct qdf_dp_trace_credit_record buf; + int buf_size = sizeof(struct qdf_dp_trace_credit_record); + enum QDF_DP_TRACE_ID code = QDF_DP_TRACE_TX_CREDIT_RECORD; + + if (qdf_dp_enable_check(NULL, code, QDF_NA) == false) + return; + + if (!(qdf_dp_get_proto_bitmap() & QDF_HL_CREDIT_TRACKING)) + return; + + if (buf_size > QDF_DP_TRACE_RECORD_SIZE) + QDF_BUG(0); + + buf.source = source; + buf.operation = operation; + buf.delta = delta; + buf.total_credits = total_credits; + buf.g0_credit = g0_credit; + buf.g1_credit = g1_credit; + + qdf_dp_add_record(code, QDF_TRACE_DEFAULT_PDEV_ID, (uint8_t *)&buf, + buf_size, NULL, 0, false); +} +qdf_export_symbol(qdf_dp_trace_credit_record); + void qdf_dp_display_event_record(struct qdf_dp_trace_record_s *record, uint16_t index, uint8_t pdev_id, uint8_t info) { @@ -2350,6 +2472,11 @@ QDF_STATUS qdf_dpt_dump_stats_debugfs(qdf_debugfs_file_t file, qdf_dpt_display_proto_pkt_debugfs(file, &p_record, i); break; + case QDF_DP_TRACE_TX_CREDIT_RECORD: + qdf_dpt_display_credit_record_debugfs(file, &p_record, + i); + break; + case QDF_DP_TRACE_MGMT_PACKET_RECORD: qdf_dpt_display_mgmt_pkt_debugfs(file, &p_record, i); break;