Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 96ebf151 authored by Manikanta Pubbisetty's avatar Manikanta Pubbisetty Committed by Gerrit - the friendly Code Review server
Browse files

qcacmn: add runtime PM stats for HTC layer

Runtime PM for HTC layer has multiple cases of GET/PUT operations.
Adding runtime PM stats for HTC layer, this helps in debugging
RTPM GET/PUT out of sync issues.

Change-Id: Ib27efd73dce0bb5bd3ff030bd7ae1bc833f29610
CRs-Fixed: 2923250
parent 2b8d9d9b
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
@@ -1068,6 +1068,28 @@ enum hif_pm_link_state {
	HIF_PM_LINK_STATE_UP
};

/**
 * enum hif_pm_htc_stats - hif runtime PM stats for HTC layer
 * HIF_PM_HTC_STATS_GET_HTT_RESPONSE: PM stats for RTPM GET for HTT packets
				      with response
 * HIF_PM_HTC_STATS_GET_HTT_NO_RESPONSE: PM stats for RTPM GET for HTT packets
					 with no response
 * HIF_PM_HTC_STATS_PUT_HTT_RESPONSE: PM stats for RTPM PUT for HTT packets
				      with response
 * HIF_PM_HTC_STATS_PUT_HTT_NO_RESPONSE: PM stats for RTPM PUT for HTT packets
					 with no response
 * HIF_PM_HTC_STATS_PUT_HTT_ERROR: PM stats for RTPM PUT for failed HTT packets
 * HIF_PM_HTC_STATS_PUT_HTC_CLEANUP: PM stats for RTPM PUT during HTC cleanup
 */
enum hif_pm_htc_stats {
	HIF_PM_HTC_STATS_GET_HTT_RESPONSE,
	HIF_PM_HTC_STATS_GET_HTT_NO_RESPONSE,
	HIF_PM_HTC_STATS_PUT_HTT_RESPONSE,
	HIF_PM_HTC_STATS_PUT_HTT_NO_RESPONSE,
	HIF_PM_HTC_STATS_PUT_HTT_ERROR,
	HIF_PM_HTC_STATS_PUT_HTC_CLEANUP,
};

#ifdef FEATURE_RUNTIME_PM
struct hif_pm_runtime_lock;

@@ -1105,6 +1127,9 @@ void hif_pm_runtime_mark_dp_rx_busy(struct hif_opaque_softc *hif_ctx);
int hif_pm_runtime_is_dp_rx_busy(struct hif_opaque_softc *hif_ctx);
qdf_time_t hif_pm_runtime_get_dp_rx_busy_mark(struct hif_opaque_softc *hif_ctx);
int hif_pm_runtime_sync_resume(struct hif_opaque_softc *hif_ctx);
void hif_pm_runtime_update_stats(struct hif_opaque_softc *hif_ctx,
				 wlan_rtpm_dbgid rtpm_dbgid,
				 enum hif_pm_htc_stats stats);

/**
 * hif_pm_set_link_state() - set link state during RTPM
@@ -1199,6 +1224,11 @@ static inline
void hif_pm_set_link_state(struct hif_opaque_softc *hif_handle, uint8_t val)
{}

static inline
void hif_pm_runtime_update_stats(struct hif_opaque_softc *hif_ctx,
				 wlan_rtpm_dbgid rtpm_dbgid,
				 enum hif_pm_htc_stats stats)
{}
#endif

void hif_enable_power_management(struct hif_opaque_softc *hif_ctx,
+53 −0
Original line number Diff line number Diff line
@@ -1801,4 +1801,57 @@ uint8_t hif_pm_get_link_state(struct hif_opaque_softc *hif_handle)

	return qdf_atomic_read(&scn->pm_link_state);
}

/**
 * hif_pm_runtime_update_stats() - API to update RTPM stats for HTC layer
 * @scn: hif context
 * @rtpm_dbgid: RTPM dbg_id
 * @hif_pm_htc_stats: Stats category
 *
 * Return: void
 */
void hif_pm_runtime_update_stats(struct hif_opaque_softc *hif_ctx,
				 wlan_rtpm_dbgid rtpm_dbgid,
				 enum hif_pm_htc_stats stats)
{
	struct hif_softc *scn = HIF_GET_SOFTC(hif_ctx);
	struct hif_runtime_pm_ctx *rpm_ctx;

	if (rtpm_dbgid != RTPM_ID_HTC)
		return;

	if (!scn)
		return;

	if (!hif_pci_pm_runtime_enabled(scn))
		return;

	rpm_ctx = hif_bus_get_rpm_ctx(scn);
	if (!rpm_ctx)
		return;

	switch (stats) {
	case HIF_PM_HTC_STATS_GET_HTT_RESPONSE:
		rpm_ctx->pm_stats.pm_stats_htc.rtpm_get_htt_resp++;
		break;
	case HIF_PM_HTC_STATS_GET_HTT_NO_RESPONSE:
		rpm_ctx->pm_stats.pm_stats_htc.rtpm_get_htt_no_resp++;
		break;
	case HIF_PM_HTC_STATS_PUT_HTT_RESPONSE:
		rpm_ctx->pm_stats.pm_stats_htc.rtpm_put_htt_resp++;
		break;
	case HIF_PM_HTC_STATS_PUT_HTT_NO_RESPONSE:
		rpm_ctx->pm_stats.pm_stats_htc.rtpm_put_htt_no_resp++;
		break;
	case HIF_PM_HTC_STATS_PUT_HTT_ERROR:
		rpm_ctx->pm_stats.pm_stats_htc.rtpm_put_htt_error++;
		break;
	case HIF_PM_HTC_STATS_PUT_HTC_CLEANUP:
		rpm_ctx->pm_stats.pm_stats_htc.rtpm_put_htc_cleanup++;
		break;
	default:
		break;
	}
}

#endif /* FEATURE_RUNTIME_PM */
+12 −1
Original line number Diff line number Diff line
/*
 * Copyright (c) 2013-2020 The Linux Foundation. All rights reserved.
 * Copyright (c) 2013-2021 The Linux Foundation. All rights reserved.
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
@@ -48,6 +48,16 @@ struct hif_pm_runtime_lock {
	const char *name;
};

/* Debugging stats for RTPM for HTC layer */
struct hif_pm_runtime_htc_stats {
	uint32_t rtpm_get_htt_resp;
	uint32_t rtpm_get_htt_no_resp;
	uint32_t rtpm_put_htt_resp;
	uint32_t rtpm_put_htt_no_resp;
	uint32_t rtpm_put_htt_error;
	uint32_t rtpm_put_htc_cleanup;
};

/* Debugging stats for Runtime PM */
struct hif_pci_pm_stats {
	u32 suspended;
@@ -69,6 +79,7 @@ struct hif_pci_pm_stats {
	void *last_busy_marker;
	qdf_time_t last_busy_timestamp;
	unsigned long suspend_jiffies;
	struct hif_pm_runtime_htc_stats pm_stats_htc;
};

struct hif_runtime_pm_ctx {
+7 −3
Original line number Diff line number Diff line
@@ -154,8 +154,11 @@ static void htc_cleanup(HTC_TARGET *target)
	HTC_PACKET_QUEUE *pkt_queue;
	qdf_nbuf_t netbuf;

	while (htc_dec_return_runtime_cnt((void *)target) >= 0)
	while (htc_dec_return_runtime_cnt((void *)target) >= 0) {
		hif_pm_runtime_put(target->hif_dev, RTPM_ID_HTC);
		hif_pm_runtime_update_stats(target->hif_dev, RTPM_ID_HTC,
					    HIF_PM_HTC_STATS_PUT_HTC_CLEANUP);
	}

	if (target->hif_dev) {
		hif_detach_htc(target->hif_dev);
@@ -1181,8 +1184,9 @@ int htc_pm_runtime_put(HTC_HANDLE htc_handle)
{
	HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(htc_handle);

	return hif_pm_runtime_put(target->hif_dev,
				  RTPM_ID_HTC);
	hif_pm_runtime_update_stats(target->hif_dev, RTPM_ID_HTC,
				    HIF_PM_HTC_STATS_PUT_HTT_RESPONSE);
	return hif_pm_runtime_put(target->hif_dev, RTPM_ID_HTC);
}
#endif

+16 −3
Original line number Diff line number Diff line
@@ -862,12 +862,18 @@ static QDF_STATUS htc_issue_packets(HTC_TARGET *target,
		 *   do the runtime put here.
		 * otherwise runtime put will be done when the fw response comes
		 */
		if (pPacket->PktInfo.AsTx.Tag == HTC_TX_PACKET_TAG_RUNTIME_PUT)
		if (pPacket->PktInfo.AsTx.Tag == HTC_TX_PACKET_TAG_RUNTIME_PUT) {
			rt_put = true;
		else if (pPacket->PktInfo.AsTx.Tag ==
			hif_pm_runtime_update_stats(
					target->hif_dev, RTPM_ID_HTC,
					HIF_PM_HTC_STATS_GET_HTT_NO_RESPONSE);
		} else if (pPacket->PktInfo.AsTx.Tag ==
			 HTC_TX_PACKET_TAG_RTPM_PUT_RC) {
			rt_put_in_resp = true;
			htc_inc_runtime_cnt(target);
			hif_pm_runtime_update_stats(
					target->hif_dev, RTPM_ID_HTC,
					HIF_PM_HTC_STATS_GET_HTT_RESPONSE);
		}

#if DEBUG_BUNDLE
@@ -961,6 +967,9 @@ static QDF_STATUS htc_issue_packets(HTC_TARGET *target,
		if (rt_put) {
			hif_pm_runtime_put(target->hif_dev,
					   RTPM_ID_HTC);
			hif_pm_runtime_update_stats(
					target->hif_dev, RTPM_ID_HTC,
					HIF_PM_HTC_STATS_PUT_HTT_NO_RESPONSE);
			rt_put = false;
		}
	}
@@ -1692,9 +1701,13 @@ static enum HTC_SEND_QUEUE_RESULT htc_try_send(HTC_TARGET *target,
			rtpm_dbgid =
				htc_send_pkts_rtpm_dbgid_get(
					pEndpoint->service_id);
			for (i = HTC_PACKET_QUEUE_DEPTH(&sendQueue); i > 0; i--)
			for (i = HTC_PACKET_QUEUE_DEPTH(&sendQueue); i > 0; i--) {
				hif_pm_runtime_put(target->hif_dev,
						   rtpm_dbgid);
				hif_pm_runtime_update_stats(
					target->hif_dev, rtpm_dbgid,
					HIF_PM_HTC_STATS_PUT_HTT_ERROR);
			}

			if (!pEndpoint->async_update) {
				LOCK_HTC_TX(target);