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:

committed by
Sandeep Puligilla

parent
5adc058835
commit
a405eb741b
@@ -474,4 +474,17 @@ int cdp_txrx_stats(ol_txrx_soc_handle soc, struct cdp_vdev *vdev,
|
|||||||
return 0;
|
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_ */
|
#endif /* _CDP_TXRX_CMN_H_ */
|
||||||
|
@@ -51,6 +51,22 @@
|
|||||||
#define SUPPORTED_BW 4
|
#define SUPPORTED_BW 4
|
||||||
#define SUPPORTED_RECEPTION_TYPES 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 */
|
/* WME stream classes */
|
||||||
#define WME_AC_BE 0 /* best effort */
|
#define WME_AC_BE 0 /* best effort */
|
||||||
#define WME_AC_BK 1 /* background */
|
#define WME_AC_BK 1 /* background */
|
||||||
@@ -701,6 +717,31 @@ struct cdp_peer_stats {
|
|||||||
struct cdp_rx_stats rx;
|
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 {
|
struct cdp_pdev_stats {
|
||||||
/* packets dropped on rx */
|
/* packets dropped on rx */
|
||||||
struct {
|
struct {
|
||||||
@@ -724,5 +765,9 @@ struct cdp_pdev_stats {
|
|||||||
struct cdp_tx_stats tx;
|
struct cdp_tx_stats tx;
|
||||||
/* CDP Rx Stats */
|
/* CDP Rx Stats */
|
||||||
struct cdp_rx_stats rx;
|
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
|
#endif
|
||||||
|
@@ -29,22 +29,6 @@
|
|||||||
#define OL_TXQ_PAUSE_REASON_VDEV_STOP (1 << 3)
|
#define OL_TXQ_PAUSE_REASON_VDEV_STOP (1 << 3)
|
||||||
#define OL_TXQ_PAUSE_REASON_THERMAL_MITIGATION (1 << 4)
|
#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_INVALID_NUM_PEERS (-1)
|
||||||
|
|
||||||
#define OL_TXRX_MAC_ADDR_LEN 6
|
#define OL_TXRX_MAC_ADDR_LEN 6
|
||||||
|
@@ -199,6 +199,8 @@ struct cdp_cmn_ops {
|
|||||||
|
|
||||||
A_STATUS(*txrx_stats)(struct cdp_vdev *vdev,
|
A_STATUS(*txrx_stats)(struct cdp_vdev *vdev,
|
||||||
struct ol_txrx_stats_req *req, enum cdp_stats stats);
|
struct ol_txrx_stats_req *req, enum cdp_stats stats);
|
||||||
|
|
||||||
|
QDF_STATUS (*display_stats)(void *psoc, uint16_t value);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct cdp_ctrl_ops {
|
struct cdp_ctrl_ops {
|
||||||
@@ -849,12 +851,10 @@ struct cdp_throttle_ops {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* struct cdp_ocb_ops - mcl ocb ops
|
* struct cdp_ocb_ops - mcl ocb ops
|
||||||
* @display_stats:
|
|
||||||
* @clear_stats:
|
* @clear_stats:
|
||||||
* @stats:
|
* @stats:
|
||||||
*/
|
*/
|
||||||
struct cdp_mob_stats_ops {
|
struct cdp_mob_stats_ops {
|
||||||
QDF_STATUS (*display_stats)(uint16_t bitmap);
|
|
||||||
void (*clear_stats)(uint16_t bitmap);
|
void (*clear_stats)(uint16_t bitmap);
|
||||||
int (*stats)(uint8_t vdev_id, char *buffer, unsigned buf_len);
|
int (*stats)(uint8_t vdev_id, char *buffer, unsigned buf_len);
|
||||||
};
|
};
|
||||||
|
@@ -33,14 +33,6 @@
|
|||||||
#define _CDP_TXRX_STATS_H_
|
#define _CDP_TXRX_STATS_H_
|
||||||
#include <cdp_txrx_ops.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
|
static inline void
|
||||||
cdp_clear_stats(ol_txrx_soc_handle soc, uint16_t bitmap)
|
cdp_clear_stats(ol_txrx_soc_handle soc, uint16_t bitmap)
|
||||||
{
|
{
|
||||||
|
@@ -108,6 +108,96 @@ while (0)
|
|||||||
DP_STATS_AGGR(_handle_a, _handle_b, _field.num); \
|
DP_STATS_AGGR(_handle_a, _handle_b, _field.num); \
|
||||||
DP_STATS_AGGR(_handle_a, _handle_b, _field.bytes);\
|
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
|
#else
|
||||||
#define DP_STATS_INC(_handle, _field, _delta)
|
#define DP_STATS_INC(_handle, _field, _delta)
|
||||||
#define DP_STATS_INCC(_handle, _field, _delta, _cond)
|
#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_INCC_PKT(_handle, _field, _count, _bytes)
|
||||||
#define DP_STATS_AGGR(_handle_a, _handle_b, _field)
|
#define DP_STATS_AGGR(_handle_a, _handle_b, _field)
|
||||||
#define DP_STATS_AGGR_PKT(_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
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
@@ -1134,6 +1134,7 @@ static struct cdp_pdev *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc,
|
|||||||
pdev->osif_pdev = ctrl_pdev;
|
pdev->osif_pdev = ctrl_pdev;
|
||||||
pdev->pdev_id = pdev_id;
|
pdev->pdev_id = pdev_id;
|
||||||
soc->pdev_list[pdev_id] = pdev;
|
soc->pdev_list[pdev_id] = pdev;
|
||||||
|
soc->pdev_count++;
|
||||||
|
|
||||||
TAILQ_INIT(&pdev->vdev_list);
|
TAILQ_INIT(&pdev->vdev_list);
|
||||||
pdev->vdev_count = 0;
|
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);
|
RXDMA_MONITOR_DESC, 0);
|
||||||
|
|
||||||
soc->pdev_list[pdev->pdev_id] = NULL;
|
soc->pdev_list[pdev->pdev_id] = NULL;
|
||||||
|
soc->pdev_count--;
|
||||||
qdf_mem_free(pdev);
|
qdf_mem_free(pdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3094,6 +3095,180 @@ static int dp_txrx_stats(struct cdp_vdev *vdev,
|
|||||||
return 0;
|
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 = {
|
static struct cdp_cmn_ops dp_ops_cmn = {
|
||||||
.txrx_soc_attach_target = dp_soc_attach_target_wifi3,
|
.txrx_soc_attach_target = dp_soc_attach_target_wifi3,
|
||||||
.txrx_vdev_attach = dp_vdev_attach_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,
|
.set_pdev_dscp_tid_map = dp_set_pdev_dscp_tid_map_wifi3,
|
||||||
.txrx_stats = dp_txrx_stats,
|
.txrx_stats = dp_txrx_stats,
|
||||||
.txrx_set_monitor_mode = dp_vdev_set_monitor_mode,
|
.txrx_set_monitor_mode = dp_vdev_set_monitor_mode,
|
||||||
|
.display_stats = dp_txrx_dump_stats,
|
||||||
/* TODO: Add other functions */
|
/* 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 = {
|
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 = {
|
static struct cdp_cfg_ops dp_ops_cfg = {
|
||||||
|
@@ -611,6 +611,7 @@ dp_rx_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
|
|||||||
struct dp_srng *dp_rxdma_srng;
|
struct dp_srng *dp_rxdma_srng;
|
||||||
struct rx_desc_pool *rx_desc_pool;
|
struct rx_desc_pool *rx_desc_pool;
|
||||||
|
|
||||||
|
DP_HIST_INIT();
|
||||||
/* Debug -- Remove later */
|
/* Debug -- Remove later */
|
||||||
qdf_assert(soc && hal_ring);
|
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
|
* Need API to convert from hal_ring pointer to
|
||||||
* Ring Type / Ring Id combo
|
* 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,
|
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
|
||||||
FL("HAL RING Access Failed -- %p"), hal_ring);
|
FL("HAL RING Access Failed -- %p"), hal_ring);
|
||||||
hal_srng_access_end(hal_soc, 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 &
|
ampdu_flag = (mpdu_desc_info.mpdu_flags &
|
||||||
HAL_MPDU_F_AMPDU_FLAG);
|
HAL_MPDU_F_AMPDU_FLAG);
|
||||||
|
|
||||||
DP_STATS_INCC(peer, rx.ampdu_cnt, 1, ampdu_flag);
|
DP_STATS_INCC(peer, rx.ampdu_cnt, 1, ampdu_flag);
|
||||||
DP_STATS_INCC(peer, rx.non_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,
|
DP_STATS_INCC(peer, rx.amsdu_cnt, 1,
|
||||||
!(amsdu_flag));
|
!(amsdu_flag));
|
||||||
|
|
||||||
|
DP_HIST_PACKET_COUNT_INC(vdev->pdev->pdev_id);
|
||||||
qdf_nbuf_queue_add(&vdev->rxq, rx_desc->nbuf);
|
qdf_nbuf_queue_add(&vdev->rxq, rx_desc->nbuf);
|
||||||
fail:
|
fail:
|
||||||
dp_rx_add_to_free_desc_list(&head[rx_desc->pool_id],
|
dp_rx_add_to_free_desc_list(&head[rx_desc->pool_id],
|
||||||
@@ -732,6 +736,9 @@ fail:
|
|||||||
done:
|
done:
|
||||||
hal_srng_access_end(hal_soc, hal_ring);
|
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++) {
|
for (mac_id = 0; mac_id < MAX_PDEV_CNT; mac_id++) {
|
||||||
/*
|
/*
|
||||||
* continue with next mac_id if no pkts were reaped
|
* continue with next mac_id if no pkts were reaped
|
||||||
|
@@ -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
|
* Need API to convert from hal_ring pointer to
|
||||||
* Ring Type / Ring Id combo
|
* 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,
|
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
|
||||||
FL("HAL RING Access Failed -- %p"), hal_ring);
|
FL("HAL RING Access Failed -- %p"), hal_ring);
|
||||||
goto done;
|
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)) {
|
if (qdf_unlikely(rbm != HAL_RX_BUF_RBM_SW3_BM)) {
|
||||||
/* TODO */
|
/* TODO */
|
||||||
/* Call appropriate handler */
|
/* Call appropriate handler */
|
||||||
|
|
||||||
DP_STATS_INC(soc, rx.err.invalid_rbm, 1);
|
DP_STATS_INC(soc, rx.err.invalid_rbm, 1);
|
||||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
|
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
|
||||||
FL("Invalid RBM %d"), rbm);
|
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) {
|
if (mpdu_desc_info.mpdu_flags & HAL_MPDU_F_FRAGMENT) {
|
||||||
/* TODO */
|
/* TODO */
|
||||||
|
DP_STATS_INC(soc,
|
||||||
|
rx.err.reo_error[HAL_MPDU_F_FRAGMENT], 1);
|
||||||
rx_bufs_used += dp_rx_frag_handle(soc,
|
rx_bufs_used += dp_rx_frag_handle(soc,
|
||||||
ring_desc, &mpdu_desc_info,
|
ring_desc, &mpdu_desc_info,
|
||||||
&head, &tail, quota);
|
&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)) {
|
if (hal_rx_reo_is_pn_error(ring_desc)) {
|
||||||
/* TOD0 */
|
/* 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,
|
rx_bufs_used += dp_rx_pn_error_handle(soc,
|
||||||
ring_desc, &mpdu_desc_info,
|
ring_desc, &mpdu_desc_info,
|
||||||
&head, &tail, quota);
|
&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)) {
|
if (hal_rx_reo_is_2k_jump(ring_desc)) {
|
||||||
/* TOD0 */
|
/* 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,
|
rx_bufs_used += dp_rx_2k_jump_handle(soc,
|
||||||
ring_desc, &mpdu_desc_info,
|
ring_desc, &mpdu_desc_info,
|
||||||
&head, &tail, quota);
|
&head, &tail, quota);
|
||||||
|
@@ -1743,6 +1743,7 @@ static void dp_tx_comp_process_desc(struct dp_soc *soc,
|
|||||||
uint32_t length;
|
uint32_t length;
|
||||||
struct dp_peer *peer;
|
struct dp_peer *peer;
|
||||||
|
|
||||||
|
DP_HIST_INIT();
|
||||||
desc = comp_head;
|
desc = comp_head;
|
||||||
|
|
||||||
while (desc) {
|
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_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;
|
next = desc->next;
|
||||||
dp_tx_desc_release(desc, desc->pool_id);
|
dp_tx_desc_release(desc, desc->pool_id);
|
||||||
desc = next;
|
desc = next;
|
||||||
}
|
}
|
||||||
|
DP_TX_HIST_STATS_PER_PDEV();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user