diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index fcdd72eaee..4ccc2ebf41 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -6676,10 +6676,10 @@ static void dp_txrx_path_stats(struct dp_soc *soc) DP_TRACE(FATAL, "hal ring access fail: %u msdus", pdev->soc->stats.rx.err.hal_ring_access_fail); - DP_TRACE(FATAL, "Reo errors"); - for (error_code = 0; error_code < HAL_REO_ERR_MAX; error_code++) { + if (!pdev->soc->stats.rx.err.reo_error[error_code]) + continue; DP_TRACE(FATAL, "Reo error number (%u): %u msdus", error_code, pdev->soc->stats.rx.err.reo_error[error_code]); @@ -6687,6 +6687,8 @@ static void dp_txrx_path_stats(struct dp_soc *soc) for (error_code = 0; error_code < HAL_RXDMA_ERR_MAX; error_code++) { + if (!pdev->soc->stats.rx.err.rxdma_error[error_code]) + continue; DP_TRACE(FATAL, "Rxdma error number (%u): %u msdus", error_code, pdev->soc->stats.rx.err diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 262834842b..cc4249a198 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -1500,6 +1500,14 @@ done: peer_id = DP_PEER_METADATA_PEER_ID_GET(peer_mdata); peer = dp_peer_find_by_id(soc, peer_id); + if (peer) { + QDF_NBUF_CB_DP_TRACE_PRINT(nbuf) = false; + qdf_dp_trace_set_track(nbuf, QDF_RX); + QDF_NBUF_CB_RX_DP_TRACE(nbuf) = 1; + QDF_NBUF_CB_RX_PACKET_TRACK(nbuf) = + QDF_NBUF_RX_PKT_DATA_TRACK; + } + rx_bufs_used++; if (deliver_list_head && peer && (vdev != peer->vdev)) { diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index 1229bb8d64..1429fe0229 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -551,6 +551,34 @@ struct dp_tx_ext_desc_elem_s *dp_tx_prepare_ext_desc(struct dp_vdev *vdev, return msdu_ext_desc; } +/** + * dp_tx_trace_pkt() - Trace TX packet at DP layer + * + * @skb: skb to be traced + * @msdu_id: msdu_id of the packet + * @vdev_id: vdev_id of the packet + * + * Return: None + */ +static void dp_tx_trace_pkt(qdf_nbuf_t skb, uint16_t msdu_id, + uint8_t vdev_id) +{ + QDF_NBUF_CB_TX_PACKET_TRACK(skb) = QDF_NBUF_TX_PKT_DATA_TRACK; + QDF_NBUF_CB_TX_DP_TRACE(skb) = 1; + DPTRACE(qdf_dp_trace_ptr(skb, + QDF_DP_TRACE_LI_DP_TX_PACKET_PTR_RECORD, + QDF_TRACE_DEFAULT_PDEV_ID, + qdf_nbuf_data_addr(skb), + sizeof(qdf_nbuf_data(skb)), + msdu_id, vdev_id)); + + qdf_dp_trace_log_pkt(vdev_id, skb, QDF_TX, QDF_TRACE_DEFAULT_PDEV_ID); + + DPTRACE(qdf_dp_trace_data_pkt(skb, QDF_TRACE_DEFAULT_PDEV_ID, + QDF_DP_TRACE_LI_DP_TX_PACKET_RECORD, + msdu_id, QDF_TX)); +} + /** * dp_tx_desc_prepare_single - Allocate and prepare Tx descriptor * @vdev: DP vdev handle @@ -597,6 +625,8 @@ struct dp_tx_desc_s *dp_tx_prepare_desc_single(struct dp_vdev *vdev, tx_desc->msdu_ext_desc = NULL; tx_desc->pkt_offset = 0; + dp_tx_trace_pkt(nbuf, tx_desc->id, vdev->vdev_id); + /* * For special modes (vdev_type == ocb or mesh), data frames should be * transmitted using varying transmit parameters (tx spec) which include @@ -723,6 +753,8 @@ static struct dp_tx_desc_s *dp_tx_prepare_desc(struct dp_vdev *vdev, tx_desc->tso_desc = msdu_info->u.tso_info.curr_seg; tx_desc->tso_num_desc = msdu_info->u.tso_info.tso_num_seg_list; + dp_tx_trace_pkt(nbuf, tx_desc->id, vdev->vdev_id); + /* Handle scattered frames - TSO/SG/ME */ /* Allocate and prepare an extension descriptor for scattered frames */ msdu_ext_desc = dp_tx_prepare_ext_desc(vdev, msdu_info, desc_pool_id); @@ -2859,6 +2891,15 @@ static void dp_tx_comp_process_desc(struct dp_soc *soc, dp_tx_comp_process_tx_status(desc, length); + DPTRACE(qdf_dp_trace_ptr + (desc->nbuf, + QDF_DP_TRACE_LI_DP_FREE_PACKET_PTR_RECORD, + QDF_TRACE_DEFAULT_PDEV_ID, + qdf_nbuf_data_addr(desc->nbuf), + sizeof(qdf_nbuf_data(desc->nbuf)), + desc->id, ts.status) + ); + /*currently m_copy/tx_capture is not supported for scatter gather packets*/ if (!(desc->msdu_ext_desc) && (dp_get_completion_indication_for_stack(soc, desc->pdev, ts.peer_id, ts.ppdu_id, diff --git a/qdf/inc/qdf_nbuf.h b/qdf/inc/qdf_nbuf.h index f2f74adf7d..4c7c7d875f 100644 --- a/qdf/inc/qdf_nbuf.h +++ b/qdf/inc/qdf_nbuf.h @@ -119,6 +119,7 @@ #define QDF_NBUF_TX_PKT_INVALID 0 #define QDF_NBUF_TX_PKT_DATA_TRACK 1 #define QDF_NBUF_TX_PKT_MGMT_TRACK 2 +#define QDF_NBUF_RX_PKT_DATA_TRACK 3 /* Different Packet states */ #define QDF_NBUF_TX_PKT_HDD 1 diff --git a/qdf/inc/qdf_trace.h b/qdf/inc/qdf_trace.h index 24ba8e3f48..638412a317 100644 --- a/qdf/inc/qdf_trace.h +++ b/qdf/inc/qdf_trace.h @@ -67,7 +67,8 @@ typedef int (qdf_abstract_print)(void *priv, const char *fmt, ...); /* DP Trace Implementation */ #ifdef CONFIG_DP_TRACE #define DPTRACE(p) p -#define DPTRACE_PRINT(args...) QDF_TRACE_DEBUG(QDF_MODULE_ID_QDF, args) +#define DPTRACE_PRINT(args...) \ + QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_DEBUG, args) #else #define DPTRACE(p) #define DPTRACE_PRINT(args...) @@ -188,6 +189,10 @@ typedef struct s_qdf_trace_data { * @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_LI_DP_TX_PACKET_RECORD - record data bytes of tx pkt at LI_DP + * @QDF_DP_TRACE_LI_DP_RX_PACKET_RECORD - record data bytes of rx pkt at LI_DP + * @QDF_DP_TRACE_LI_DP_FREE_PACKET_PTR_RECORD - tx completion ptr record for + * lithium * @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 @@ -207,12 +212,11 @@ typedef struct s_qdf_trace_data { * @QDF_DP_TRACE_HTC_PACKET_PTR_RECORD - htc packet ptr record * @QDF_DP_TRACE_HIF_PACKET_PTR_RECORD - hif packet ptr record * @QDF_DP_TRACE_RX_TXRX_PACKET_PTR_RECORD - txrx packet ptr record - * @QDF_DP_TRACE_LI_DP_TX_PACKET_RECORD - record 32 bytes of tx pkt at LI_DP - * @QDF_DP_TRACE_LI_DP_RX_PACKET_RECORD - record 32 bytes of rx pkt at LI_DP * @QDF_DP_TRACE_LI_DP_NULL_RX_PACKET_RECORD - * - record 32 bytes of rx null_queue pkt at LI_DP + * - record data bytes of rx null_queue pkt at LI_DP * @QDF_DP_TRACE_HIGH_VERBOSITY - below this are part of high verbosity */ + enum QDF_DP_TRACE_ID { QDF_DP_TRACE_INVALID, QDF_DP_TRACE_DROP_PACKET_RECORD, @@ -231,6 +235,9 @@ enum QDF_DP_TRACE_ID { QDF_DP_TRACE_RX_PACKET_RECORD, QDF_DP_TRACE_HDD_TX_PACKET_RECORD, QDF_DP_TRACE_HDD_RX_PACKET_RECORD, + QDF_DP_TRACE_LI_DP_TX_PACKET_RECORD, + QDF_DP_TRACE_LI_DP_RX_PACKET_RECORD, + QDF_DP_TRACE_LI_DP_FREE_PACKET_PTR_RECORD, QDF_DP_TRACE_FREE_PACKET_PTR_RECORD, QDF_DP_TRACE_LOW_VERBOSITY, QDF_DP_TRACE_HDD_TX_PACKET_PTR_RECORD, @@ -250,8 +257,6 @@ enum QDF_DP_TRACE_ID { QDF_DP_TRACE_HTC_PACKET_PTR_RECORD, QDF_DP_TRACE_HIF_PACKET_PTR_RECORD, QDF_DP_TRACE_RX_TXRX_PACKET_PTR_RECORD, - QDF_DP_TRACE_LI_DP_TX_PACKET_RECORD, - QDF_DP_TRACE_LI_DP_RX_PACKET_RECORD, QDF_DP_TRACE_LI_DP_NULL_RX_PACKET_RECORD, QDF_DP_TRACE_HIGH_VERBOSITY, QDF_DP_TRACE_MAX diff --git a/qdf/linux/src/i_qdf_nbuf.h b/qdf/linux/src/i_qdf_nbuf.h index 2f569ce0d7..22ece804bd 100644 --- a/qdf/linux/src/i_qdf_nbuf.h +++ b/qdf/linux/src/i_qdf_nbuf.h @@ -87,87 +87,87 @@ typedef union { * @paddr : physical addressed retrieved by dma_map of nbuf->data * * @rx.dev.priv_cb_w.ext_cb_ptr: extended cb pointer - * @rx.dev.priv_cb_w.fctx : ctx to handle special pkts defined by ftype - * @rx.dev.priv_cb_w.reserved1 : reserved - * @rx.dev.priv_cb_w.reserved2 : reserved + * @rx.dev.priv_cb_w.fctx: ctx to handle special pkts defined by ftype + * @rx.dev.priv_cb_w.reserved1: reserved + * @rx.dev.priv_cb_w.reserved2: reserved * - * @rx.dev.priv_cb_m.tcp_seq_num : TCP sequence number - * @rx.dev.priv_cb_m.tcp_ack_num : TCP ACK number - * @rx.dev.priv_cb_m.lro_ctx : LRO context - * @rx.dev.priv_cb_m.map_index : - * @rx.dev.priv_cb_m.reserved : reserved + * @rx.dev.priv_cb_m.tcp_seq_num: TCP sequence number + * @rx.dev.priv_cb_m.tcp_ack_num: TCP ACK number + * @rx.dev.priv_cb_m.lro_ctx: LRO context + * @rx.dev.priv_cb_m.map_index: + * @rx.dev.priv_cb_m.reserved: reserved * - * @rx.lro_eligible : flag to indicate whether the MSDU is LRO eligible - * @rx.peer_cached_buf_frm : peer cached buffer - * @rx.tcp_proto : L4 protocol is TCP - * @rx.tcp_pure_ack : A TCP ACK packet with no payload - * @rx.ipv6_proto : L3 protocol is IPV6 - * @rx.ip_offset : offset to IP header - * @rx.tcp_offset : offset to TCP header - * @rx_ctx_id : Rx context id + * @rx.lro_eligible: flag to indicate whether the MSDU is LRO eligible + * @rx.peer_cached_buf_frm: peer cached buffer + * @rx.tcp_proto: L4 protocol is TCP + * @rx.tcp_pure_ack: A TCP ACK packet with no payload + * @rx.ipv6_proto: L3 protocol is IPV6 + * @rx.ip_offset: offset to IP header + * @rx.tcp_offset: offset to TCP header + * @rx_ctx_id: Rx context id * - * @rx.tcp_udp_chksum : L4 payload checksum - * @rx.tcp_wim : TCP window size + * @rx.tcp_udp_chksum: L4 payload checksum + * @rx.tcp_wim: TCP window size * - * @rx.flow_id : 32bit flow id + * @rx.flow_id: 32bit flow id * - * @rx.flag_chfrag_start : first MSDU in an AMSDU - * @rx.flag_chfrag_cont : middle or part of MSDU in an AMSDU - * @rx.flag_chfrag_end : last MSDU in an AMSDU - * @rx.rsrvd : reserved + * @rx.flag_chfrag_start: first MSDU in an AMSDU + * @rx.flag_chfrag_cont: middle or part of MSDU in an AMSDU + * @rx.flag_chfrag_end: last MSDU in an AMSDU + * @rx.rsrvd: reserved * - * @rx.trace : combined structure for DP and protocol trace - * @rx.trace.packet_state: {NBUF_TX_PKT_[(HDD)|(TXRX_ENQUEUE)|(TXRX_DEQUEUE)| + * @rx.trace: combined structure for DP and protocol trace + * @rx.trace.packet_stat: {NBUF_TX_PKT_[(HDD)|(TXRX_ENQUEUE)|(TXRX_DEQUEUE)| * + (TXRX)|(HTT)|(HTC)|(HIF)|(CE)|(FREE)] - * @rx.trace.dp_trace : flag (Datapath trace) - * @rx.trace.rsrvd : enable packet logging + * @rx.trace.dp_trace: flag (Datapath trace) + * @rx.trace.packet_track: RX_DATA packet + * @rx.trace.rsrvd: enable packet logging * - * @rx.ftype : mcast2ucast, TSO, SG, MESH - * @rx.reserved : reserved + * @rx.ftype: mcast2ucast, TSO, SG, MESH + * @rx.reserved: reserved * - * @tx.dev.priv_cb_w.fctx : ctx to handle special pkts defined by ftype - * @tx.dev.priv_cb_w.ext_cb_ptr : extended cb pointer + * @tx.dev.priv_cb_w.fctx: ctx to handle special pkts defined by ftype + * @tx.dev.priv_cb_w.ext_cb_ptr: extended cb pointer * - * @tx.dev.priv_cb_w.data_attr : value that is programmed in CE descr, includes + * @tx.dev.priv_cb_w.data_attr: value that is programmed in CE descr, includes * + (1) CE classification enablement bit * + (2) packet type (802.3 or Ethernet type II) * + (3) packet offset (usually length of HTC/HTT descr) - * @tx.dev.priv_cb_m.ipa.owned : packet owned by IPA - * @tx.dev.priv_cb_m.ipa.priv : private data, used by IPA - * @tx.dev.priv_cb_m.desc_id : tx desc id, used to sync between host and fw - * @tx.dev.priv_cb_m.mgmt_desc_id : mgmt descriptor for tx completion cb - * @tx.dev.priv_cb_m.reserved : reserved + * @tx.dev.priv_cb_m.ipa.owned: packet owned by IPA + * @tx.dev.priv_cb_m.ipa.priv: private data, used by IPA + * @tx.dev.priv_cb_m.desc_id: tx desc id, used to sync between host and fw + * @tx.dev.priv_cb_m.mgmt_desc_id: mgmt descriptor for tx completion cb + * @tx.dev.priv_cb_m.reserved: reserved * - * @tx.ftype : mcast2ucast, TSO, SG, MESH - * @tx.vdev_id : vdev (for protocol trace) - * @tx.len : length of efrag pointed by the above pointers + * @tx.ftype: mcast2ucast, TSO, SG, MESH + * @tx.vdev_id: vdev (for protocol trace) + * @tx.len: length of efrag pointed by the above pointers * - * @tx.flags.bits.flag_efrag : flag, efrag payload to be swapped (wordstream) - * @tx.flags.bits.num : number of extra frags ( 0 or 1) - * @tx.flags.bits.nbuf : flag, nbuf payload to be swapped (wordstream) - * @tx.flags.bits.flag_chfrag_start : first MSDU in an AMSDU - * @tx.flags.bits.flag_chfrag_cont : middle or part of MSDU in an AMSDU - * @tx.flags.bits.flag_chfrag_end : last MSDU in an AMSDU - * @tx.flags.bits.flag_ext_header : extended flags - * @tx.flags.bits.reserved : reserved - * @tx.trace : combined structure for DP and protocol trace - * @tx.trace.packet_state: {NBUF_TX_PKT_[(HDD)|(TXRX_ENQUEUE)|(TXRX_DEQUEUE)| + * @tx.flags.bits.flag_efrag: flag, efrag payload to be swapped (wordstream) + * @tx.flags.bits.num: number of extra frags ( 0 or 1) + * @tx.flags.bits.nbuf: flag, nbuf payload to be swapped (wordstream) + * @tx.flags.bits.flag_chfrag_start: first MSDU in an AMSDU + * @tx.flags.bits.flag_chfrag_cont: middle or part of MSDU in an AMSDU + * @tx.flags.bits.flag_chfrag_end: last MSDU in an AMSDU + * @tx.flags.bits.flag_ext_header: extended flags + * @tx.flags.bits.reserved: reserved + * @tx.trace: combined structure for DP and protocol trace + * @tx.trace.packet_stat: {NBUF_TX_PKT_[(HDD)|(TXRX_ENQUEUE)|(TXRX_DEQUEUE)| * + (TXRX)|(HTT)|(HTC)|(HIF)|(CE)|(FREE)] - * @tx.trace.is_packet_priv : - * @tx.trace.packet_track : {NBUF_TX_PKT_[(DATA)|(MGMT)]_TRACK} - * @tx.trace.proto_type : bitmap of NBUF_PKT_TRAC_TYPE[(EAPOL)|(DHCP)| + * @tx.trace.is_packet_priv: + * @tx.trace.packet_track: {NBUF_TX_PKT_[(DATA)|(MGMT)]_TRACK} + * @tx.trace.proto_type: bitmap of NBUF_PKT_TRAC_TYPE[(EAPOL)|(DHCP)| * + (MGMT_ACTION)] - 4 bits - * @tx.trace.dp_trace : flag (Datapath trace) - * @tx.trace.is_bcast : flag (Broadcast packet) - * @tx.trace.is_mcast : flag (Multicast packet) - * @tx.trace.packet_type : flag (Packet type) - * @tx.trace.htt2_frm : flag (high-latency path only) - * @tx.trace.print : enable packet logging + * @tx.trace.dp_trace: flag (Datapath trace) + * @tx.trace.is_bcast: flag (Broadcast packet) + * @tx.trace.is_mcast: flag (Multicast packet) + * @tx.trace.packet_type: flag (Packet type) + * @tx.trace.htt2_frm: flag (high-latency path only) + * @tx.trace.print: enable packet logging * - * @tx.vaddr : virtual address of ~ - * @tx.paddr : physical/DMA address of ~ + * @tx.vaddr: virtual address of ~ + * @tx.paddr: physical/DMA address of ~ */ - struct qdf_nbuf_cb { /* common */ qdf_paddr_t paddr; /* of skb->data */ @@ -208,7 +208,8 @@ struct qdf_nbuf_cb { union { uint8_t packet_state; uint8_t dp_trace:1, - rsrvd:1; + packet_track:4, + rsrvd:3; } trace; uint8_t ftype; uint8_t reserved; @@ -378,6 +379,10 @@ QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size, (((struct qdf_nbuf_cb *) \ ((skb)->cb))->u.tx.trace.packet_track) +#define QDF_NBUF_CB_RX_PACKET_TRACK(skb)\ + (((struct qdf_nbuf_cb *) \ + ((skb)->cb))->u.rx.trace.packet_track) + #define QDF_NBUF_CB_TX_PROTO_TYPE(skb)\ (((struct qdf_nbuf_cb *) \ ((skb)->cb))->u.tx.trace.proto_type) diff --git a/qdf/linux/src/qdf_trace.c b/qdf/linux/src/qdf_trace.c index c0dabaf867..1d2004082a 100644 --- a/qdf/linux/src/qdf_trace.c +++ b/qdf/linux/src/qdf_trace.c @@ -870,11 +870,14 @@ void qdf_dp_trace_init(bool live_mode_config, uint8_t thresh, qdf_dp_trace_cb_table[QDF_DP_TRACE_TX_PACKET_RECORD] = qdf_dp_trace_cb_table[QDF_DP_TRACE_RX_PACKET_RECORD] = qdf_dp_trace_cb_table[QDF_DP_TRACE_DROP_PACKET_RECORD] = + qdf_dp_trace_cb_table[QDF_DP_TRACE_LI_DP_TX_PACKET_RECORD] = + qdf_dp_trace_cb_table[QDF_DP_TRACE_LI_DP_RX_PACKET_RECORD] = qdf_dp_display_data_pkt_record; qdf_dp_trace_cb_table[QDF_DP_TRACE_TXRX_PACKET_PTR_RECORD] = qdf_dp_trace_cb_table[QDF_DP_TRACE_TXRX_FAST_PACKET_PTR_RECORD] = qdf_dp_trace_cb_table[QDF_DP_TRACE_FREE_PACKET_PTR_RECORD] = + qdf_dp_trace_cb_table[QDF_DP_TRACE_LI_DP_FREE_PACKET_PTR_RECORD] = qdf_dp_display_ptr_record; qdf_dp_trace_cb_table[QDF_DP_TRACE_EAPOL_PACKET_RECORD] = qdf_dp_trace_cb_table[QDF_DP_TRACE_DHCP_PACKET_RECORD] = @@ -983,7 +986,7 @@ qdf_export_symbol(qdf_dp_get_no_of_record); /** - * qdf_dp_trace_enable_track() - enable the tracing for netbuf + * qdf_dp_trace_verbosity_check() - check whether verbosity level is enabled * @code: defines the event * * In High verbosity all codes are logged. @@ -993,7 +996,7 @@ qdf_export_symbol(qdf_dp_get_no_of_record); * * Return: true or false depends on whether tracing enabled */ -static bool qdf_dp_trace_enable_track(enum QDF_DP_TRACE_ID code) +static bool qdf_dp_trace_verbosity_check(enum QDF_DP_TRACE_ID code) { switch (g_qdf_dp_trace_data.verbosity) { case QDF_DP_TRACE_VERBOSITY_HIGH: @@ -1010,7 +1013,6 @@ static bool qdf_dp_trace_enable_track(enum QDF_DP_TRACE_ID code) 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; @@ -1019,7 +1021,6 @@ static bool qdf_dp_trace_enable_track(enum QDF_DP_TRACE_ID code) return false; } } -qdf_export_symbol(qdf_dp_trace_enable_track); /** * qdf_dp_get_proto_bitmap() - get dp trace proto bitmap @@ -1136,7 +1137,6 @@ const char *qdf_dp_code_to_string(enum QDF_DP_TRACE_ID code) case QDF_DP_TRACE_HDD_TX_PACKET_RECORD: return "HDD: TX: DATA:"; case QDF_DP_TRACE_LI_DP_TX_PACKET_RECORD: - return "LI_DP: TX: DATA:"; case QDF_DP_TRACE_TX_PACKET_RECORD: return "TX:"; case QDF_DP_TRACE_CE_PACKET_PTR_RECORD: @@ -1145,6 +1145,7 @@ const char *qdf_dp_code_to_string(enum QDF_DP_TRACE_ID code) return "CE: TX: FAST: PTR:"; case QDF_DP_TRACE_CE_FAST_PACKET_ERR_RECORD: return "CE: TX: FAST: ERR:"; + case QDF_DP_TRACE_LI_DP_FREE_PACKET_PTR_RECORD: case QDF_DP_TRACE_FREE_PACKET_PTR_RECORD: return "FREE: TX: PTR:"; case QDF_DP_TRACE_RX_HTT_PACKET_PTR_RECORD: @@ -1157,10 +1158,9 @@ const char *qdf_dp_code_to_string(enum QDF_DP_TRACE_ID code) return "LI_DP: RX: PTR:"; case QDF_DP_TRACE_HDD_RX_PACKET_RECORD: return "HDD: RX: DATA:"; - case QDF_DP_TRACE_LI_DP_RX_PACKET_RECORD: - return "LI_DP: RX: DATA:"; case QDF_DP_TRACE_LI_DP_NULL_RX_PACKET_RECORD: return "LI_DP_NULL: RX: DATA:"; + case QDF_DP_TRACE_LI_DP_RX_PACKET_RECORD: case QDF_DP_TRACE_RX_PACKET_RECORD: return "RX:"; case QDF_DP_TRACE_TXRX_QUEUE_PACKET_PTR_RECORD: @@ -1301,9 +1301,10 @@ static const char *qdf_dp_subtype_to_str(enum qdf_proto_subtype subtype) } /** - * qdf_dp_enable_check() - check if dptrace is enable or not + * qdf_dp_enable_check() - check if dptrace, TX/RX tracing is enabled * @nbuf: nbuf * @code: dptrace code + * @dir: TX or RX direction * * Return: true/false */ @@ -1314,13 +1315,18 @@ static bool qdf_dp_enable_check(qdf_nbuf_t nbuf, enum QDF_DP_TRACE_ID code, if (!g_qdf_dp_trace_data.enable) return false; - if (qdf_dp_trace_enable_track(code) == false) + if (qdf_dp_trace_verbosity_check(code) == false) return false; - if ((nbuf) && ((QDF_NBUF_CB_TX_PACKET_TRACK(nbuf) != - QDF_NBUF_TX_PKT_DATA_TRACK) || - ((dir == QDF_TX) && (QDF_NBUF_CB_TX_DP_TRACE(nbuf) == 0)) || - ((dir == QDF_RX) && (QDF_NBUF_CB_RX_DP_TRACE(nbuf) == 0)))) + if (!nbuf) + return false; + + if ((dir == QDF_TX) && + ((QDF_NBUF_CB_TX_DP_TRACE(nbuf) == 0) || + (QDF_NBUF_CB_TX_PACKET_TRACK(nbuf) != QDF_NBUF_TX_PKT_DATA_TRACK))) + return false; + + if ((dir == QDF_RX) && (QDF_NBUF_CB_RX_DP_TRACE(nbuf) == 0)) return false; return true; @@ -1450,7 +1456,7 @@ static void qdf_dp_add_record(enum QDF_DP_TRACE_ID code, uint8_t pdev_id, 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; + QDF_DP_TRACE_VERBOSITY_ULTRA_LOW; info |= QDF_DP_TRACE_RECORD_INFO_THROTTLED; } } @@ -1524,17 +1530,18 @@ static bool qdf_log_icmpv6_pkt(uint8_t session_id, struct sk_buff *skb, (dir == QDF_RX && qdf_nbuf_is_icmpv6_pkt(skb) == true))) { subtype = qdf_nbuf_get_icmpv6_subtype(skb); - DPTRACE(qdf_dp_trace_proto_pkt( - QDF_DP_TRACE_ICMPv6_PACKET_RECORD, - session_id, (skb->data + QDF_NBUF_SRC_MAC_OFFSET), - (skb->data + QDF_NBUF_DEST_MAC_OFFSET), - QDF_PROTO_TYPE_ICMPv6, subtype, dir, pdev_id, false)); + + QDF_NBUF_CB_DP_TRACE_PRINT(skb) = false; if (dir == QDF_TX) QDF_NBUF_CB_TX_DP_TRACE(skb) = 1; else if (dir == QDF_RX) QDF_NBUF_CB_RX_DP_TRACE(skb) = 1; - QDF_NBUF_CB_DP_TRACE_PRINT(skb) = false; + DPTRACE(qdf_dp_trace_proto_pkt( + QDF_DP_TRACE_ICMPv6_PACKET_RECORD, + session_id, (skb->data + QDF_NBUF_SRC_MAC_OFFSET), + (skb->data + QDF_NBUF_DEST_MAC_OFFSET), + QDF_PROTO_TYPE_ICMPv6, subtype, dir, pdev_id, false)); switch (subtype) { case QDF_PROTO_ICMPV6_REQ: @@ -1580,17 +1587,23 @@ static bool qdf_log_icmp_pkt(uint8_t session_id, struct sk_buff *skb, if ((qdf_dp_get_proto_bitmap() & QDF_NBUF_PKT_TRAC_TYPE_ICMP) && (qdf_nbuf_is_icmp_pkt(skb) == true)) { + QDF_NBUF_CB_DP_TRACE_PRINT(skb) = false; proto_subtype = qdf_nbuf_get_icmp_subtype(skb); - DPTRACE(qdf_dp_trace_proto_pkt(QDF_DP_TRACE_ICMP_PACKET_RECORD, - session_id, (skb->data + QDF_NBUF_SRC_MAC_OFFSET), - (skb->data + QDF_NBUF_DEST_MAC_OFFSET), - QDF_PROTO_TYPE_ICMP, proto_subtype, dir, pdev_id, false)); + if (QDF_TX == dir) QDF_NBUF_CB_TX_DP_TRACE(skb) = 1; else if (QDF_RX == dir) QDF_NBUF_CB_RX_DP_TRACE(skb) = 1; - QDF_NBUF_CB_DP_TRACE_PRINT(skb) = false; + DPTRACE(qdf_dp_trace_proto_pkt(QDF_DP_TRACE_ICMP_PACKET_RECORD, + session_id, + skb->data + + QDF_NBUF_SRC_MAC_OFFSET, + skb->data + + QDF_NBUF_DEST_MAC_OFFSET, + QDF_PROTO_TYPE_ICMP, + proto_subtype, dir, pdev_id, + false)); if (proto_subtype == QDF_PROTO_ICMP_REQ) g_qdf_dp_trace_data.icmp_req++; @@ -1622,15 +1635,21 @@ static bool qdf_log_eapol_pkt(uint8_t session_id, struct sk_buff *skb, (dir == QDF_RX && qdf_nbuf_is_ipv4_eapol_pkt(skb) == true))) { subtype = qdf_nbuf_get_eapol_subtype(skb); - DPTRACE(qdf_dp_trace_proto_pkt(QDF_DP_TRACE_EAPOL_PACKET_RECORD, - session_id, (skb->data + QDF_NBUF_SRC_MAC_OFFSET), - (skb->data + QDF_NBUF_DEST_MAC_OFFSET), - QDF_PROTO_TYPE_EAPOL, subtype, dir, pdev_id, true)); + QDF_NBUF_CB_DP_TRACE_PRINT(skb) = true; if (QDF_TX == dir) QDF_NBUF_CB_TX_DP_TRACE(skb) = 1; else if (QDF_RX == dir) QDF_NBUF_CB_RX_DP_TRACE(skb) = 1; + DPTRACE(qdf_dp_trace_proto_pkt(QDF_DP_TRACE_EAPOL_PACKET_RECORD, + session_id, + skb->data + + QDF_NBUF_SRC_MAC_OFFSET, + skb->data + + QDF_NBUF_DEST_MAC_OFFSET, + QDF_PROTO_TYPE_EAPOL, subtype, + dir, pdev_id, true)); + switch (subtype) { case QDF_PROTO_EAPOL_M1: g_qdf_dp_trace_data.eapol_m1++; @@ -1648,7 +1667,6 @@ static bool qdf_log_eapol_pkt(uint8_t session_id, struct sk_buff *skb, g_qdf_dp_trace_data.eapol_others++; break; } - QDF_NBUF_CB_DP_TRACE_PRINT(skb) = true; return true; } return false; @@ -1674,17 +1692,21 @@ static bool qdf_log_dhcp_pkt(uint8_t session_id, struct sk_buff *skb, (dir == QDF_RX && qdf_nbuf_is_ipv4_dhcp_pkt(skb) == true))) { subtype = qdf_nbuf_get_dhcp_subtype(skb); - DPTRACE(qdf_dp_trace_proto_pkt(QDF_DP_TRACE_DHCP_PACKET_RECORD, - session_id, (skb->data + QDF_NBUF_SRC_MAC_OFFSET), - (skb->data + QDF_NBUF_DEST_MAC_OFFSET), - QDF_PROTO_TYPE_DHCP, subtype, dir, pdev_id, true)); - + QDF_NBUF_CB_DP_TRACE_PRINT(skb) = true; if (QDF_TX == dir) QDF_NBUF_CB_TX_DP_TRACE(skb) = 1; else if (QDF_RX == dir) QDF_NBUF_CB_RX_DP_TRACE(skb) = 1; - QDF_NBUF_CB_DP_TRACE_PRINT(skb) = true; + DPTRACE(qdf_dp_trace_proto_pkt(QDF_DP_TRACE_DHCP_PACKET_RECORD, + session_id, + skb->data + + QDF_NBUF_SRC_MAC_OFFSET, + skb->data + + QDF_NBUF_DEST_MAC_OFFSET, + QDF_PROTO_TYPE_DHCP, subtype, + dir, pdev_id, true)); + switch (subtype) { case QDF_PROTO_DHCP_DISCOVER: g_qdf_dp_trace_data.dhcp_disc++; @@ -1731,16 +1753,21 @@ static bool qdf_log_arp_pkt(uint8_t session_id, struct sk_buff *skb, (dir == QDF_RX && qdf_nbuf_is_ipv4_arp_pkt(skb) == true))) { proto_subtype = qdf_nbuf_get_arp_subtype(skb); - DPTRACE(qdf_dp_trace_proto_pkt(QDF_DP_TRACE_ARP_PACKET_RECORD, - session_id, (skb->data + QDF_NBUF_SRC_MAC_OFFSET), - (skb->data + QDF_NBUF_DEST_MAC_OFFSET), - QDF_PROTO_TYPE_ARP, proto_subtype, dir, pdev_id, true)); + QDF_NBUF_CB_DP_TRACE_PRINT(skb) = true; if (QDF_TX == dir) QDF_NBUF_CB_TX_DP_TRACE(skb) = 1; else if (QDF_RX == dir) QDF_NBUF_CB_RX_DP_TRACE(skb) = 1; - QDF_NBUF_CB_DP_TRACE_PRINT(skb) = true; + DPTRACE(qdf_dp_trace_proto_pkt(QDF_DP_TRACE_ARP_PACKET_RECORD, + session_id, + skb->data + + QDF_NBUF_SRC_MAC_OFFSET, + skb->data + + QDF_NBUF_DEST_MAC_OFFSET, + QDF_PROTO_TYPE_ARP, + proto_subtype, dir, pdev_id, + true)); if (QDF_PROTO_ARP_REQ == proto_subtype) g_qdf_dp_trace_data.arp_req++; @@ -1886,13 +1913,14 @@ void qdf_dp_display_proto_pkt(struct qdf_dp_trace_record_s *record, loc = qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str), index, info, record); DPTRACE_PRINT("%s [%d] [%s] SA: " - QDF_MAC_ADDR_STR " %s DA: " - QDF_MAC_ADDR_STR, - prepend_str, - buf->vdev_id, - qdf_dp_subtype_to_str(buf->subtype), - QDF_MAC_ADDR_ARRAY(buf->sa.bytes), - qdf_dp_dir_to_str(buf->dir), QDF_MAC_ADDR_ARRAY(buf->da.bytes)); + QDF_MAC_ADDR_STR " %s DA: " + QDF_MAC_ADDR_STR, + prepend_str, + buf->vdev_id, + qdf_dp_subtype_to_str(buf->subtype), + QDF_MAC_ADDR_ARRAY(buf->sa.bytes), + qdf_dp_dir_to_str(buf->dir), + QDF_MAC_ADDR_ARRAY(buf->da.bytes)); } qdf_export_symbol(qdf_dp_display_proto_pkt); @@ -1928,6 +1956,11 @@ void qdf_dp_display_ptr_record(struct qdf_dp_trace_record_s *record, char prepend_str[QDF_DP_TRACE_PREPEND_STR_SIZE]; struct qdf_dp_trace_ptr_buf *buf = (struct qdf_dp_trace_ptr_buf *)record->data; + bool is_free_pkt_ptr_record; + + if ((record->code == QDF_DP_TRACE_FREE_PACKET_PTR_RECORD) || + (record->code == QDF_DP_TRACE_LI_DP_FREE_PACKET_PTR_RECORD)) + is_free_pkt_ptr_record = true; qdf_mem_set(prepend_str, 0, sizeof(prepend_str)); loc = qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str), @@ -1937,9 +1970,7 @@ void qdf_dp_display_ptr_record(struct qdf_dp_trace_record_s *record, scnprintf(&prepend_str[loc], sizeof(prepend_str) - loc, "[msdu id %d %s %d]", buf->msdu_id, - (record->code == - QDF_DP_TRACE_FREE_PACKET_PTR_RECORD) ? - "status" : "vdev_id", + is_free_pkt_ptr_record ? "status" : "vdev_id", buf->status); if (info & QDF_DP_TRACE_RECORD_INFO_LIVE) { @@ -2027,8 +2058,6 @@ void qdf_dp_display_record(struct qdf_dp_trace_record_s *record, case QDF_DP_TRACE_CE_FAST_PACKET_ERR_RECORD: DPTRACE_PRINT(" %s: CE Fast Packet Error", prepend_str); break; - case QDF_DP_TRACE_LI_DP_TX_PACKET_RECORD: - case QDF_DP_TRACE_LI_DP_RX_PACKET_RECORD: case QDF_DP_TRACE_LI_DP_NULL_RX_PACKET_RECORD: default: dump_dp_hex_trace(prepend_str, record->data, record->size); @@ -2136,7 +2165,9 @@ qdf_export_symbol(qdf_dp_trace_clear_buffer); void qdf_dp_trace_dump_stats(void) { - DPTRACE_PRINT("STATS |DPT: icmp(%u %u) arp(%u %u) icmpv6(%u %u %u %u %u %u) dhcp(%u %u %u %u %u %u) eapol(%u %u %u %u %u)", + DPTRACE_PRINT("STATS |DPT: tx %u rx %u icmp(%u %u) arp(%u %u) icmpv6(%u %u %u %u %u %u) dhcp(%u %u %u %u %u %u) eapol(%u %u %u %u %u)", + g_qdf_dp_trace_data.tx_count, + g_qdf_dp_trace_data.rx_count, g_qdf_dp_trace_data.icmp_req, g_qdf_dp_trace_data.icmp_resp, g_qdf_dp_trace_data.arp_req, @@ -2493,6 +2524,9 @@ QDF_STATUS qdf_dpt_dump_stats_debugfs(qdf_debugfs_file_t file, case QDF_DP_TRACE_HDD_RX_PACKET_RECORD: case QDF_DP_TRACE_TX_PACKET_RECORD: case QDF_DP_TRACE_RX_PACKET_RECORD: + case QDF_DP_TRACE_LI_DP_TX_PACKET_RECORD: + case QDF_DP_TRACE_LI_DP_RX_PACKET_RECORD: + default: qdf_dpt_display_record_debugfs(file, &p_record, i); break; @@ -2646,8 +2680,6 @@ 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); } } @@ -2655,18 +2687,20 @@ 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) + if (g_qdf_dp_trace_data.dynamic_verbosity_modify) { + goto check_live_mode; return; + } if (is_data_traffic) { g_qdf_dp_trace_data.verbosity = - QDF_DP_TRACE_ULTRA_LOW_VERBOSITY; - qdf_dp_trace_throttle_live_mode(true); + QDF_DP_TRACE_VERBOSITY_ULTRA_LOW; } else { g_qdf_dp_trace_data.verbosity = g_qdf_dp_trace_data.ini_conf_verbosity; - qdf_dp_trace_throttle_live_mode(false); } +check_live_mode: + qdf_dp_trace_throttle_live_mode(is_data_traffic); } #endif