qcacmn: Add time_latency check for tx_completion

This patch adds support to measure latency  for tx completions

Change-Id: Ifda1c2f7ffaf8276f012e7a458f6f167ad931356
This commit is contained in:
Ankit Kumar
2019-02-28 18:17:15 +05:30
committed by nshrivas
parent c9681754d0
commit 8dc0e2a679
5 changed files with 31 additions and 5 deletions

View File

@@ -819,6 +819,7 @@ struct cdp_soc_t {
* @CDP_CONFIG_IGMPMLD_OVERRIDE: Override IGMP/MLD * @CDP_CONFIG_IGMPMLD_OVERRIDE: Override IGMP/MLD
* @CDP_CONFIG_IGMPMLD_TID: Configurable TID value when igmmld_override is set * @CDP_CONFIG_IGMPMLD_TID: Configurable TID value when igmmld_override is set
* @CDP_CONFIG_ARP_DBG_CONF: Enable ARP debug * @CDP_CONFIG_ARP_DBG_CONF: Enable ARP debug
* @CDP_CONFIG_CAPTURE_LATENCY: Capture time latency
*/ */
enum cdp_pdev_param_type { enum cdp_pdev_param_type {
CDP_CONFIG_DEBUG_SNIFFER, CDP_CONFIG_DEBUG_SNIFFER,
@@ -828,6 +829,7 @@ enum cdp_pdev_param_type {
CDP_CONFIG_IGMPMLD_OVERRIDE, CDP_CONFIG_IGMPMLD_OVERRIDE,
CDP_CONFIG_IGMPMLD_TID, CDP_CONFIG_IGMPMLD_TID,
CDP_CONFIG_ARP_DBG_CONF, CDP_CONFIG_ARP_DBG_CONF,
CDP_CONFIG_CAPTURE_LATENCY,
}; };
/* /*

View File

@@ -7978,6 +7978,12 @@ static QDF_STATUS dp_set_pdev_param(struct cdp_pdev *pdev_handle,
case CDP_CONFIG_PRIMARY_RADIO: case CDP_CONFIG_PRIMARY_RADIO:
pdev->is_primary = val; pdev->is_primary = val;
break; break;
case CDP_CONFIG_CAPTURE_LATENCY:
if (val == 1)
pdev->latency_capture_enable = true;
else
pdev->latency_capture_enable = false;
break;
default: default:
return QDF_STATUS_E_INVAL; return QDF_STATUS_E_INVAL;
} }

View File

@@ -2407,7 +2407,8 @@ dp_get_completion_indication_for_stack(struct dp_soc *soc,
struct dp_pdev *pdev, struct dp_pdev *pdev,
struct dp_peer *peer, struct dp_peer *peer,
struct hal_tx_completion_status *ts, struct hal_tx_completion_status *ts,
qdf_nbuf_t netbuf) qdf_nbuf_t netbuf,
uint64_t time_latency)
{ {
struct tx_capture_hdr *ppdu_hdr; struct tx_capture_hdr *ppdu_hdr;
uint16_t peer_id = ts->peer_id; uint16_t peer_id = ts->peer_id;
@@ -2415,7 +2416,8 @@ dp_get_completion_indication_for_stack(struct dp_soc *soc,
uint8_t first_msdu = ts->first_msdu; uint8_t first_msdu = ts->first_msdu;
uint8_t last_msdu = ts->last_msdu; uint8_t last_msdu = ts->last_msdu;
if (qdf_unlikely(!pdev->tx_sniffer_enable && !pdev->mcopy_mode)) if (qdf_unlikely(!pdev->tx_sniffer_enable && !pdev->mcopy_mode &&
!pdev->latency_capture_enable))
return QDF_STATUS_E_NOSUPPORT; return QDF_STATUS_E_NOSUPPORT;
if (!peer) { if (!peer) {
@@ -2449,6 +2451,10 @@ dp_get_completion_indication_for_stack(struct dp_soc *soc,
ppdu_hdr->peer_id = peer_id; ppdu_hdr->peer_id = peer_id;
ppdu_hdr->first_msdu = first_msdu; ppdu_hdr->first_msdu = first_msdu;
ppdu_hdr->last_msdu = last_msdu; ppdu_hdr->last_msdu = last_msdu;
if (qdf_unlikely(pdev->latency_capture_enable)) {
ppdu_hdr->tsf = ts->tsf;
ppdu_hdr->time_latency = time_latency;
}
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
@@ -2479,7 +2485,8 @@ dp_get_completion_indication_for_stack(struct dp_soc *soc,
struct dp_pdev *pdev, struct dp_pdev *pdev,
struct dp_peer *peer, struct dp_peer *peer,
struct hal_tx_completion_status *ts, struct hal_tx_completion_status *ts,
qdf_nbuf_t netbuf) qdf_nbuf_t netbuf,
uint64_t time_latency)
{ {
return QDF_STATUS_E_NOSUPPORT; return QDF_STATUS_E_NOSUPPORT;
} }
@@ -2893,13 +2900,19 @@ dp_tx_comp_process_desc(struct dp_soc *soc,
struct hal_tx_completion_status *ts, struct hal_tx_completion_status *ts,
struct dp_peer *peer) struct dp_peer *peer)
{ {
uint64_t time_latency = 0;
/* /*
* m_copy/tx_capture modes are not supported for * m_copy/tx_capture modes are not supported for
* scatter gather packets * scatter gather packets
*/ */
if (qdf_unlikely(!!desc->pdev->latency_capture_enable)) {
time_latency = (qdf_ktime_to_ms(qdf_ktime_get()) -
desc->timestamp);
}
if (!(desc->msdu_ext_desc) && if (!(desc->msdu_ext_desc) &&
(dp_get_completion_indication_for_stack(soc, desc->pdev, (dp_get_completion_indication_for_stack(soc, desc->pdev,
peer, ts, desc->nbuf) peer, ts, desc->nbuf,
time_latency)
== QDF_STATUS_SUCCESS)) { == QDF_STATUS_SUCCESS)) {
qdf_nbuf_unmap(soc->osdev, desc->nbuf, qdf_nbuf_unmap(soc->osdev, desc->nbuf,
QDF_DMA_TO_DEVICE); QDF_DMA_TO_DEVICE);

View File

@@ -206,7 +206,8 @@ dp_get_completion_indication_for_stack(struct dp_soc *soc,
struct dp_pdev *pdev, struct dp_pdev *pdev,
struct dp_peer *peer, struct dp_peer *peer,
struct hal_tx_completion_status *ts, struct hal_tx_completion_status *ts,
qdf_nbuf_t netbuf); qdf_nbuf_t netbuf,
uint64_t time_latency);
void dp_send_completion_to_stack(struct dp_soc *soc, struct dp_pdev *pdev, void dp_send_completion_to_stack(struct dp_soc *soc, struct dp_pdev *pdev,
uint16_t peer_id, uint32_t ppdu_id, uint16_t peer_id, uint32_t ppdu_id,

View File

@@ -1327,6 +1327,10 @@ struct dp_pdev {
/* mirror copy mode */ /* mirror copy mode */
bool mcopy_mode; bool mcopy_mode;
bool bpr_enable; bool bpr_enable;
/* enable time latency check for tx completion */
bool latency_capture_enable;
struct { struct {
uint16_t tx_ppdu_id; uint16_t tx_ppdu_id;
uint16_t tx_peer_id; uint16_t tx_peer_id;