qcacmn: Add credit tracking for HL Data Path

Add credit tracking for HL Data Path in DPTRACE.

Change-Id: I6e2971209940c16a13a8ca7f1f0a3d7c1a26e305
CRs-Fixed: 2574057
This commit is contained in:
Nirav Shah
2019-11-05 08:38:47 +05:30
committed by nshrivas
parent 4b48131ce2
commit 8f44a7e494
3 changed files with 214 additions and 11 deletions

View File

@@ -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

View File

@@ -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)
{
}

View File

@@ -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;