qcacmn: Add dump stats feature for Lithium

Add support for dump statistics in Lithium.
Statistics include:
	1. Tx path packet flow
	2. Tx Histogram stats per interrupt
	3. Rx path packet flow
	4. Rx Histogram stats per interrupt

Change-Id: I7f399b717a9fb29a3d6ab672b669c6e323f61e27
CRs-Fixed: 2023386
This commit is contained in:
Venkata Sharath Chandra Manchala
2017-03-06 14:35:00 -08:00
committed by Sandeep Puligilla
parent 5adc058835
commit a405eb741b
10 changed files with 356 additions and 28 deletions

View File

@@ -474,4 +474,17 @@ int cdp_txrx_stats(ol_txrx_soc_handle soc, struct cdp_vdev *vdev,
return 0;
}
/**
* cdp_display_stats(): function to map to dump stats
* @soc: soc handle
* @value: statistics option
*/
static inline QDF_STATUS
cdp_display_stats(ol_txrx_soc_handle soc, uint16_t value)
{
if (soc->ops->cmn_drv_ops->display_stats)
return soc->ops->cmn_drv_ops->display_stats(soc, value);
return 0;
}
#endif /* _CDP_TXRX_CMN_H_ */

View File

@@ -51,6 +51,22 @@
#define SUPPORTED_BW 4
#define SUPPORTED_RECEPTION_TYPES 4
/* Options for Dump Statistics */
#define CDP_HDD_STATS 0
#define CDP_TXRX_PATH_STATS 1
#define CDP_TXRX_HIST_STATS 2
#define CDP_TXRX_TSO_STATS 3
#define CDP_HDD_NETIF_OPER_HISTORY 4
#define CDP_DUMP_TX_FLOW_POOL_INFO 5
#define CDP_TXRX_DESC_STATS 6
#define CDP_HIF_STATS 7
#define CDP_LRO_STATS 8
#define CDP_NAPI_STATS 9
#define CDP_SCHEDULER_STATS 21
#define CDP_TX_QUEUE_STATS 22
#define CDP_BUNDLE_STATS 23
#define CDP_CREDIT_STATS 24
/* WME stream classes */
#define WME_AC_BE 0 /* best effort */
#define WME_AC_BK 1 /* background */
@@ -701,6 +717,31 @@ struct cdp_peer_stats {
struct cdp_rx_stats rx;
};
/* Tx completions per interrupt */
struct cdp_hist_tx_comp {
uint32_t pkts_1;
uint32_t pkts_2_20;
uint32_t pkts_21_40;
uint32_t pkts_41_60;
uint32_t pkts_61_80;
uint32_t pkts_81_100;
uint32_t pkts_101_200;
uint32_t pkts_201_plus;
};
/* Rx ring descriptors reaped per interrupt */
struct cdp_hist_rx_ind {
uint32_t pkts_1;
uint32_t pkts_2_20;
uint32_t pkts_21_40;
uint32_t pkts_41_60;
uint32_t pkts_61_80;
uint32_t pkts_81_100;
uint32_t pkts_101_200;
uint32_t pkts_201_plus;
};
struct cdp_pdev_stats {
/* packets dropped on rx */
struct {
@@ -724,5 +765,9 @@ struct cdp_pdev_stats {
struct cdp_tx_stats tx;
/* CDP Rx Stats */
struct cdp_rx_stats rx;
/* Number of Tx completions per interrupt */
struct cdp_hist_tx_comp tx_comp_histogram;
/* Number of Rx ring descriptors reaped per interrupt */
struct cdp_hist_rx_ind rx_ind_histogram;
};
#endif

View File

@@ -29,22 +29,6 @@
#define OL_TXQ_PAUSE_REASON_VDEV_STOP (1 << 3)
#define OL_TXQ_PAUSE_REASON_THERMAL_MITIGATION (1 << 4)
/* command options for dumpStats*/
#define WLAN_HDD_STATS 0
#define WLAN_TXRX_STATS 1
#define WLAN_TXRX_HIST_STATS 2
#define WLAN_TXRX_TSO_STATS 3
#define WLAN_HDD_NETIF_OPER_HISTORY 4
#define WLAN_DUMP_TX_FLOW_POOL_INFO 5
#define WLAN_TXRX_DESC_STATS 6
#define WLAN_HIF_STATS 7
#define WLAN_LRO_STATS 8
#define WLAN_NAPI_STATS 9
#define WLAN_SCHEDULER_STATS 21
#define WLAN_TX_QUEUE_STATS 22
#define WLAN_BUNDLE_STATS 23
#define WLAN_CREDIT_STATS 24
#define OL_TXRX_INVALID_NUM_PEERS (-1)
#define OL_TXRX_MAC_ADDR_LEN 6

View File

@@ -199,6 +199,8 @@ struct cdp_cmn_ops {
A_STATUS(*txrx_stats)(struct cdp_vdev *vdev,
struct ol_txrx_stats_req *req, enum cdp_stats stats);
QDF_STATUS (*display_stats)(void *psoc, uint16_t value);
};
struct cdp_ctrl_ops {
@@ -849,12 +851,10 @@ struct cdp_throttle_ops {
/**
* struct cdp_ocb_ops - mcl ocb ops
* @display_stats:
* @clear_stats:
* @stats:
*/
struct cdp_mob_stats_ops {
QDF_STATUS (*display_stats)(uint16_t bitmap);
void (*clear_stats)(uint16_t bitmap);
int (*stats)(uint8_t vdev_id, char *buffer, unsigned buf_len);
};

View File

@@ -33,14 +33,6 @@
#define _CDP_TXRX_STATS_H_
#include <cdp_txrx_ops.h>
static inline QDF_STATUS
cdp_display_stats(ol_txrx_soc_handle soc, uint16_t bitmap)
{
if (soc->ops->mob_stats_ops->display_stats)
return soc->ops->mob_stats_ops->display_stats(bitmap);
return QDF_STATUS_SUCCESS;
}
static inline void
cdp_clear_stats(ol_txrx_soc_handle soc, uint16_t bitmap)
{

View File

@@ -108,6 +108,96 @@ while (0)
DP_STATS_AGGR(_handle_a, _handle_b, _field.num); \
DP_STATS_AGGR(_handle_a, _handle_b, _field.bytes);\
}
#define DP_HIST_INIT() \
uint32_t num_of_packets[MAX_PDEV_CNT] = {0};
#define DP_HIST_PACKET_COUNT_INC(_pdev_id) \
{ \
++num_of_packets[_pdev_id]; \
}
#define DP_TX_HISTOGRAM_UPDATE(_pdev, _p_cntrs) \
do { \
if (_p_cntrs == 1) { \
DP_STATS_INC(_pdev, \
tx_comp_histogram.pkts_1, 1); \
} else if (_p_cntrs > 1 && _p_cntrs <= 20) { \
DP_STATS_INC(_pdev, \
tx_comp_histogram.pkts_2_20, 1); \
} else if (_p_cntrs > 20 && _p_cntrs <= 40) { \
DP_STATS_INC(_pdev, \
tx_comp_histogram.pkts_21_40, 1); \
} else if (_p_cntrs > 40 && _p_cntrs <= 60) { \
DP_STATS_INC(_pdev, \
tx_comp_histogram.pkts_41_60, 1); \
} else if (_p_cntrs > 60 && _p_cntrs <= 80) { \
DP_STATS_INC(_pdev, \
tx_comp_histogram.pkts_61_80, 1); \
} else if (_p_cntrs > 80 && _p_cntrs <= 100) { \
DP_STATS_INC(_pdev, \
tx_comp_histogram.pkts_81_100, 1); \
} else if (_p_cntrs > 100 && _p_cntrs <= 200) { \
DP_STATS_INC(_pdev, \
tx_comp_histogram.pkts_101_200, 1); \
} else if (_p_cntrs > 200) { \
DP_STATS_INC(_pdev, \
tx_comp_histogram.pkts_201_plus, 1); \
} \
} while (0)
#define DP_RX_HISTOGRAM_UPDATE(_pdev, _p_cntrs) \
do { \
if (_p_cntrs == 1) { \
DP_STATS_INC(_pdev, \
rx_ind_histogram.pkts_1, 1); \
} else if (_p_cntrs > 1 && _p_cntrs <= 20) { \
DP_STATS_INC(_pdev, \
rx_ind_histogram.pkts_2_20, 1); \
} else if (_p_cntrs > 20 && _p_cntrs <= 40) { \
DP_STATS_INC(_pdev, \
rx_ind_histogram.pkts_21_40, 1); \
} else if (_p_cntrs > 40 && _p_cntrs <= 60) { \
DP_STATS_INC(_pdev, \
rx_ind_histogram.pkts_41_60, 1); \
} else if (_p_cntrs > 60 && _p_cntrs <= 80) { \
DP_STATS_INC(_pdev, \
rx_ind_histogram.pkts_61_80, 1); \
} else if (_p_cntrs > 80 && _p_cntrs <= 100) { \
DP_STATS_INC(_pdev, \
rx_ind_histogram.pkts_81_100, 1); \
} else if (_p_cntrs > 100 && _p_cntrs <= 200) { \
DP_STATS_INC(_pdev, \
rx_ind_histogram.pkts_101_200, 1); \
} else if (_p_cntrs > 200) { \
DP_STATS_INC(_pdev, \
rx_ind_histogram.pkts_201_plus, 1); \
} \
} while (0)
#define DP_TX_HIST_STATS_PER_PDEV() \
do { \
uint8_t hist_stats = 0; \
for (hist_stats = 0; hist_stats < soc->pdev_count; \
hist_stats++) { \
DP_TX_HISTOGRAM_UPDATE(soc->pdev_list[hist_stats], \
num_of_packets[hist_stats]); \
} \
} while (0)
#define DP_RX_HIST_STATS_PER_PDEV() \
do { \
uint8_t hist_stats = 0; \
for (hist_stats = 0; hist_stats < soc->pdev_count; \
hist_stats++) { \
DP_RX_HISTOGRAM_UPDATE(soc->pdev_list[hist_stats], \
num_of_packets[hist_stats]); \
} \
} while (0)
#else
#define DP_STATS_INC(_handle, _field, _delta)
#define DP_STATS_INCC(_handle, _field, _delta, _cond)
@@ -117,6 +207,12 @@ while (0)
#define DP_STATS_INCC_PKT(_handle, _field, _count, _bytes)
#define DP_STATS_AGGR(_handle_a, _handle_b, _field)
#define DP_STATS_AGGR_PKT(_handle_a, _handle_b, _field)
#define DP_HIST_INIT()
#define DP_HIST_PACKET_COUNT_INC(_pdev_id)
#define DP_TX_HISTOGRAM_UPDATE(_pdev, _p_cntrs)
#define DP_RX_HISTOGRAM_UPDATE(_pdev, _p_cntrs)
#define DP_RX_HIST_STATS_PER_PDEV()
#define DP_TX_HIST_STATS_PER_PDEV()
#endif

View File

@@ -1134,6 +1134,7 @@ static struct cdp_pdev *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc,
pdev->osif_pdev = ctrl_pdev;
pdev->pdev_id = pdev_id;
soc->pdev_list[pdev_id] = pdev;
soc->pdev_count++;
TAILQ_INIT(&pdev->vdev_list);
pdev->vdev_count = 0;
@@ -1325,7 +1326,7 @@ static void dp_pdev_detach_wifi3(struct cdp_pdev *txrx_pdev, int force)
RXDMA_MONITOR_DESC, 0);
soc->pdev_list[pdev->pdev_id] = NULL;
soc->pdev_count--;
qdf_mem_free(pdev);
}
@@ -3094,6 +3095,180 @@ static int dp_txrx_stats(struct cdp_vdev *vdev,
return 0;
}
/*
* dp_txrx_path_stats() - Function to display dump stats
* @soc - soc handle
*
* return: none
*/
static void dp_txrx_path_stats(struct dp_soc *soc)
{
uint8_t error_code;
uint8_t loop_pdev;
struct dp_pdev *pdev;
for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) {
pdev = soc->pdev_list[loop_pdev];
dp_aggregate_pdev_stats(pdev);
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
"Tx path Statistics:");
DP_TRACE(NONE, "from stack: %u msdus (%u bytes)",
pdev->stats.tx_i.rcvd.num,
pdev->stats.tx_i.rcvd.bytes);
DP_TRACE(NONE, "processed from host: %u msdus (%u bytes)",
pdev->stats.tx_i.processed.num,
pdev->stats.tx_i.processed.bytes);
DP_TRACE(NONE, "successfully transmitted: %u msdus (%u bytes)",
pdev->stats.tx.tx_success.num,
pdev->stats.tx.tx_success.bytes);
DP_TRACE(NONE, "Dropped in host:");
DP_TRACE(NONE, "Total packets dropped: %u,",
pdev->stats.tx_i.dropped.dropped_pkt.num);
DP_TRACE(NONE, "Descriptor not available: %u",
pdev->stats.tx_i.dropped.desc_na);
DP_TRACE(NONE, "Ring full: %u",
pdev->stats.tx_i.dropped.ring_full);
DP_TRACE(NONE, "Enqueue fail: %u",
pdev->stats.tx_i.dropped.enqueue_fail);
DP_TRACE(NONE, "DMA Error: %u",
pdev->stats.tx_i.dropped.dma_error);
DP_TRACE(NONE, "Dropped in hardware:");
DP_TRACE(NONE, "total packets dropped: %u",
pdev->stats.tx.tx_failed);
DP_TRACE(NONE, "mpdu age out: %u",
pdev->stats.tx.dropped.mpdu_age_out);
DP_TRACE(NONE, "firmware discard reason1: %u",
pdev->stats.tx.dropped.fw_discard_reason1);
DP_TRACE(NONE, "firmware discard reason2: %u",
pdev->stats.tx.dropped.fw_discard_reason2);
DP_TRACE(NONE, "firmware discard reason3: %u",
pdev->stats.tx.dropped.fw_discard_reason3);
DP_TRACE(NONE, "peer_invalid: %u",
pdev->soc->stats.tx.tx_invalid_peer.num);
DP_TRACE(NONE, "Tx packets sent per interrupt:");
DP_TRACE(NONE, "Single Packet: %u",
pdev->stats.tx_comp_histogram.pkts_1);
DP_TRACE(NONE, "2-20 Packets: %u",
pdev->stats.tx_comp_histogram.pkts_2_20);
DP_TRACE(NONE, "21-40 Packets: %u",
pdev->stats.tx_comp_histogram.pkts_21_40);
DP_TRACE(NONE, "41-60 Packets: %u",
pdev->stats.tx_comp_histogram.pkts_41_60);
DP_TRACE(NONE, "61-80 Packets: %u",
pdev->stats.tx_comp_histogram.pkts_61_80);
DP_TRACE(NONE, "81-100 Packets: %u",
pdev->stats.tx_comp_histogram.pkts_81_100);
DP_TRACE(NONE, "101-200 Packets: %u",
pdev->stats.tx_comp_histogram.pkts_101_200);
DP_TRACE(NONE, " 201+ Packets: %u",
pdev->stats.tx_comp_histogram.pkts_201_plus);
DP_TRACE(NONE, "Rx path statistics");
DP_TRACE(NONE, "delivered %u msdus ( %u bytes),",
pdev->stats.rx.to_stack.num,
pdev->stats.rx.to_stack.bytes);
DP_TRACE(NONE, "received on reo %u msdus ( %u bytes),",
pdev->stats.rx.rcvd_reo.num,
pdev->stats.rx.rcvd_reo.bytes);
DP_TRACE(NONE, "intra-bss packets %u msdus ( %u bytes),",
pdev->stats.rx.intra_bss.num,
pdev->stats.rx.intra_bss.bytes);
DP_TRACE(NONE, "raw packets %u msdus ( %u bytes),",
pdev->stats.rx.raw.num,
pdev->stats.rx.raw.bytes);
DP_TRACE(NONE, "dropped: error %u msdus",
pdev->stats.rx.err.mic_err);
DP_TRACE(NONE, "peer invalid %u",
pdev->soc->stats.rx.err.rx_invalid_peer.num);
DP_TRACE(NONE, "Reo Statistics");
DP_TRACE(NONE, "rbm error: %u msdus",
pdev->soc->stats.rx.err.invalid_rbm);
DP_TRACE(NONE, "hal ring access fail: %u msdus",
pdev->soc->stats.rx.err.hal_ring_access_fail);
DP_TRACE(NONE, "Reo errors");
for (error_code = 0; error_code < REO_ERROR_TYPE_MAX;
error_code++) {
DP_TRACE(NONE, "Reo error number (%u): %u msdus",
error_code,
pdev->soc->stats.rx.err.reo_error[error_code]);
}
for (error_code = 0; error_code < MAX_RXDMA_ERRORS;
error_code++) {
DP_TRACE(NONE, "Rxdma error number (%u): %u msdus",
error_code,
pdev->soc->stats.rx.err
.rxdma_error[error_code]);
}
DP_TRACE(NONE, "Rx packets reaped per interrupt:");
DP_TRACE(NONE, "Single Packet: %u",
pdev->stats.rx_ind_histogram.pkts_1);
DP_TRACE(NONE, "2-20 Packets: %u",
pdev->stats.rx_ind_histogram.pkts_2_20);
DP_TRACE(NONE, "21-40 Packets: %u",
pdev->stats.rx_ind_histogram.pkts_21_40);
DP_TRACE(NONE, "41-60 Packets: %u",
pdev->stats.rx_ind_histogram.pkts_41_60);
DP_TRACE(NONE, "61-80 Packets: %u",
pdev->stats.rx_ind_histogram.pkts_61_80);
DP_TRACE(NONE, "81-100 Packets: %u",
pdev->stats.rx_ind_histogram.pkts_81_100);
DP_TRACE(NONE, "101-200 Packets: %u",
pdev->stats.rx_ind_histogram.pkts_101_200);
DP_TRACE(NONE, " 201+ Packets: %u",
pdev->stats.rx_ind_histogram.pkts_201_plus);
}
}
/*
* dp_txrx_dump_stats() - Dump statistics
* @value - Statistics option
*/
static QDF_STATUS dp_txrx_dump_stats(void *psoc, uint16_t value)
{
struct dp_soc *soc =
(struct dp_soc *)psoc;
QDF_STATUS status = QDF_STATUS_SUCCESS;
if (!soc) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
"%s: soc is NULL", __func__);
return QDF_STATUS_E_INVAL;
}
switch (value) {
case CDP_TXRX_PATH_STATS:
dp_txrx_path_stats(soc);
break;
case CDP_TXRX_TSO_STATS:
/* TODO: NOT IMPLEMENTED */
break;
case CDP_DUMP_TX_FLOW_POOL_INFO:
/* TODO: NOT IMPLEMENTED */
break;
case CDP_TXRX_DESC_STATS:
/* TODO: NOT IMPLEMENTED */
break;
default:
status = QDF_STATUS_E_INVAL;
break;
}
return status;
}
static struct cdp_cmn_ops dp_ops_cmn = {
.txrx_soc_attach_target = dp_soc_attach_target_wifi3,
.txrx_vdev_attach = dp_vdev_attach_wifi3,
@@ -3119,6 +3294,7 @@ static struct cdp_cmn_ops dp_ops_cmn = {
.set_pdev_dscp_tid_map = dp_set_pdev_dscp_tid_map_wifi3,
.txrx_stats = dp_txrx_stats,
.txrx_set_monitor_mode = dp_vdev_set_monitor_mode,
.display_stats = dp_txrx_dump_stats,
/* TODO: Add other functions */
};
@@ -3230,6 +3406,7 @@ static struct cdp_throttle_ops dp_ops_throttle = {
};
static struct cdp_mob_stats_ops dp_ops_mob_stats = {
/* WIFI 3.0 DP NOT IMPLEMENTED YET */
};
static struct cdp_cfg_ops dp_ops_cfg = {

View File

@@ -611,6 +611,7 @@ dp_rx_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
struct dp_srng *dp_rxdma_srng;
struct rx_desc_pool *rx_desc_pool;
DP_HIST_INIT();
/* Debug -- Remove later */
qdf_assert(soc && hal_ring);
@@ -625,6 +626,7 @@ dp_rx_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
* Need API to convert from hal_ring pointer to
* Ring Type / Ring Id combo
*/
DP_STATS_INC(soc, rx.err.hal_ring_access_fail, 1);
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
FL("HAL RING Access Failed -- %p"), hal_ring);
hal_srng_access_end(hal_soc, hal_ring);
@@ -709,6 +711,7 @@ dp_rx_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
ampdu_flag = (mpdu_desc_info.mpdu_flags &
HAL_MPDU_F_AMPDU_FLAG);
DP_STATS_INCC(peer, rx.ampdu_cnt, 1, ampdu_flag);
DP_STATS_INCC(peer, rx.non_ampdu_cnt, 1, !(ampdu_flag));
@@ -723,6 +726,7 @@ dp_rx_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
DP_STATS_INCC(peer, rx.amsdu_cnt, 1,
!(amsdu_flag));
DP_HIST_PACKET_COUNT_INC(vdev->pdev->pdev_id);
qdf_nbuf_queue_add(&vdev->rxq, rx_desc->nbuf);
fail:
dp_rx_add_to_free_desc_list(&head[rx_desc->pool_id],
@@ -732,6 +736,9 @@ fail:
done:
hal_srng_access_end(hal_soc, hal_ring);
/* Update histogram statistics by looping through pdev's */
DP_RX_HIST_STATS_PER_PDEV();
for (mac_id = 0; mac_id < MAX_PDEV_CNT; mac_id++) {
/*
* continue with next mac_id if no pkts were reaped

View File

@@ -464,6 +464,7 @@ dp_rx_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
* Need API to convert from hal_ring pointer to
* Ring Type / Ring Id combo
*/
DP_STATS_INC(soc, rx.err.hal_ring_access_fail, 1);
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
FL("HAL RING Access Failed -- %p"), hal_ring);
goto done;
@@ -485,7 +486,6 @@ dp_rx_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
if (qdf_unlikely(rbm != HAL_RX_BUF_RBM_SW3_BM)) {
/* TODO */
/* Call appropriate handler */
DP_STATS_INC(soc, rx.err.invalid_rbm, 1);
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
FL("Invalid RBM %d"), rbm);
@@ -505,6 +505,8 @@ dp_rx_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
if (mpdu_desc_info.mpdu_flags & HAL_MPDU_F_FRAGMENT) {
/* TODO */
DP_STATS_INC(soc,
rx.err.reo_error[HAL_MPDU_F_FRAGMENT], 1);
rx_bufs_used += dp_rx_frag_handle(soc,
ring_desc, &mpdu_desc_info,
&head, &tail, quota);
@@ -513,6 +515,10 @@ dp_rx_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
if (hal_rx_reo_is_pn_error(ring_desc)) {
/* TOD0 */
DP_STATS_INC(soc,
rx.err.
reo_error[HAL_REO_ERR_PN_CHECK_FAILED],
1);
rx_bufs_used += dp_rx_pn_error_handle(soc,
ring_desc, &mpdu_desc_info,
&head, &tail, quota);
@@ -521,6 +527,10 @@ dp_rx_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
if (hal_rx_reo_is_2k_jump(ring_desc)) {
/* TOD0 */
DP_STATS_INC(soc,
rx.err.
reo_error[HAL_REO_ERR_REGULAR_FRAME_2K_JUMP],
1);
rx_bufs_used += dp_rx_2k_jump_handle(soc,
ring_desc, &mpdu_desc_info,
&head, &tail, quota);

View File

@@ -1743,6 +1743,7 @@ static void dp_tx_comp_process_desc(struct dp_soc *soc,
uint32_t length;
struct dp_peer *peer;
DP_HIST_INIT();
desc = comp_head;
while (desc) {
@@ -1786,10 +1787,13 @@ static void dp_tx_comp_process_desc(struct dp_soc *soc,
DP_TX_FREE_DMA_TO_DEVICE(soc, desc->vdev, desc->nbuf);
}
DP_HIST_PACKET_COUNT_INC(desc->pdev->pdev_id);
DP_TRACE(NONE, "pdev_id: %u", desc->pdev->pdev_id);
next = desc->next;
dp_tx_desc_release(desc, desc->pool_id);
desc = next;
}
DP_TX_HIST_STATS_PER_PDEV();
}
/**