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

Commit 67600580 authored by Karthik Kantamneni's avatar Karthik Kantamneni Committed by Madan Koyyalamudi
Browse files

qcacmn: Add support configure EP vote feature based on pm states

Add support to configure EP vote feature based on pm states

Change-Id: Ia424d364248283da8e978f924fd421c1b5f4b888
CRs-Fixed: 2939884
parent 8a1d36cd
Loading
Loading
Loading
Loading
+57 −0
Original line number Diff line number Diff line
@@ -45,6 +45,10 @@ extern "C" {
typedef void __iomem *A_target_id_t;
typedef void *hif_handle_t;

#if defined(HIF_IPCI) && defined(FEATURE_HAL_DELAYED_REG_WRITE)
#define HIF_WORK_DRAIN_WAIT_CNT 10
#endif

#define HIF_TYPE_AR6002   2
#define HIF_TYPE_AR6003   3
#define HIF_TYPE_AR6004   5
@@ -1058,6 +1062,26 @@ static inline char *rtpm_string_from_dbgid(wlan_rtpm_dbgid id)
	return (char *)strings[id];
}

/**
 * enum hif_ep_vote_type - hif ep vote type
 * HIF_EP_VOTE_DP_ACCESS: vote type is specific DP
 * HIF_EP_VOTE_NONDP_ACCESS: ep vote for over all access
 */
enum hif_ep_vote_type {
	HIF_EP_VOTE_DP_ACCESS,
	HIF_EP_VOTE_NONDP_ACCESS
};

/**
 * enum hif_ep_vote_access - hif ep vote access
 * HIF_EP_VOTE_ACCESS_ENABLE: Enable ep voting
 * HIF_EP_VOTE_ACCESS_DISABLE: disable ep voting
 */
enum hif_ep_vote_access {
	HIF_EP_VOTE_ACCESS_ENABLE,
	HIF_EP_VOTE_ACCESS_DISABLE
};

/**
 * enum hif_pm_link_state - hif link state
 * HIF_PM_LINK_STATE_DOWN: hif link state is down
@@ -1671,6 +1695,39 @@ hif_softc_to_hif_opaque_softc(struct hif_softc *hif_handle)
	return (struct hif_opaque_softc *)hif_handle;
}

#if defined(HIF_IPCI) && defined(FEATURE_HAL_DELAYED_REG_WRITE)
QDF_STATUS hif_try_prevent_ep_vote_access(struct hif_opaque_softc *hif_ctx);
void hif_allow_ep_vote_access(struct hif_opaque_softc *hif_ctx);
void hif_set_ep_vote_access(struct hif_opaque_softc *hif_ctx,
			    uint8_t type, uint8_t access);
uint8_t hif_get_ep_vote_access(struct hif_opaque_softc *hif_ctx,
			       uint8_t type);
#else
static inline QDF_STATUS
hif_try_prevent_ep_vote_access(struct hif_opaque_softc *hif_ctx)
{
	return QDF_STATUS_SUCCESS;
}

static inline void
hif_allow_ep_vote_access(struct hif_opaque_softc *hif_ctx)
{
}

static inline void
hif_set_ep_vote_access(struct hif_opaque_softc *hif_ctx,
		       uint8_t type, uint8_t access)
{
}

static inline uint8_t
hif_get_ep_vote_access(struct hif_opaque_softc *hif_ctx,
		       uint8_t type)
{
	return HIF_EP_VOTE_ACCESS_ENABLE;
}
#endif

#ifdef FORCE_WAKE
/**
 * hif_srng_init_phase(): Indicate srng initialization phase
+61 −0
Original line number Diff line number Diff line
@@ -895,6 +895,7 @@ struct hif_opaque_softc *hif_open(qdf_device_t qdf_ctx,
	scn->bus_type  = bus_type;

	hif_pm_set_link_state(GET_HIF_OPAQUE_HDL(scn), HIF_PM_LINK_STATE_DOWN);
	hif_allow_ep_vote_access(GET_HIF_OPAQUE_HDL(scn));
	hif_get_cfg_from_psoc(scn, psoc);

	hif_set_event_hist_mask(GET_HIF_OPAQUE_HDL(scn));
@@ -1038,6 +1039,66 @@ QDF_STATUS hif_try_complete_tasks(struct hif_softc *scn)
	return QDF_STATUS_SUCCESS;
}

#if defined(HIF_IPCI) && defined(FEATURE_HAL_DELAYED_REG_WRITE)
QDF_STATUS hif_try_prevent_ep_vote_access(struct hif_opaque_softc *hif_ctx)
{
	struct hif_softc *scn = HIF_GET_SOFTC(hif_ctx);
	uint32_t work_drain_wait_cnt = 0;
	int work = 0;

	qdf_atomic_set(&scn->dp_ep_vote_access,
		       HIF_EP_VOTE_ACCESS_DISABLE);
	qdf_atomic_set(&scn->ep_vote_access,
		       HIF_EP_VOTE_ACCESS_DISABLE);

	while ((work = hif_get_num_pending_work(scn))) {
		if (++work_drain_wait_cnt > HIF_WORK_DRAIN_WAIT_CNT) {
			qdf_atomic_set(&scn->dp_ep_vote_access,
				       HIF_EP_VOTE_ACCESS_ENABLE);
			qdf_atomic_set(&scn->ep_vote_access,
				       HIF_EP_VOTE_ACCESS_ENABLE);
			hif_err("timeout wait for pending work %d ", work);
			return QDF_STATUS_E_FAULT;
		}
		qdf_sleep(5);
	}

	return QDF_STATUS_SUCCESS;
}

void hif_allow_ep_vote_access(struct hif_opaque_softc *hif_ctx)
{
	struct hif_softc *scn = HIF_GET_SOFTC(hif_ctx);

	qdf_atomic_set(&scn->dp_ep_vote_access,
		       HIF_EP_VOTE_ACCESS_ENABLE);
	qdf_atomic_set(&scn->ep_vote_access,
		       HIF_EP_VOTE_ACCESS_ENABLE);
}

void hif_set_ep_vote_access(struct hif_opaque_softc *hif_ctx,
			    uint8_t type, uint8_t access)
{
	struct hif_softc *scn = HIF_GET_SOFTC(hif_ctx);

	if (type == HIF_EP_VOTE_DP_ACCESS)
		qdf_atomic_set(&scn->dp_ep_vote_access, access);
	else
		qdf_atomic_set(&scn->ep_vote_access, access);
}

uint8_t hif_get_ep_vote_access(struct hif_opaque_softc *hif_ctx,
			       uint8_t type)
{
	struct hif_softc *scn = HIF_GET_SOFTC(hif_ctx);

	if (type == HIF_EP_VOTE_DP_ACCESS)
		return qdf_atomic_read(&scn->dp_ep_vote_access);
	else
		return qdf_atomic_read(&scn->ep_vote_access);
}
#endif

#if (defined(QCA_WIFI_QCA8074) || defined(QCA_WIFI_QCA6018) || \
	defined(QCA_WIFI_QCA6290) || defined(QCA_WIFI_QCA6390) || \
	defined(QCA_WIFI_QCN9000) || defined(QCA_WIFI_QCA6490) || \
+4 −0
Original line number Diff line number Diff line
@@ -290,6 +290,10 @@ struct hif_softc {
#ifdef SYSTEM_PM_CHECK
	qdf_atomic_t sys_pm_state;
#endif
#if defined(HIF_IPCI) && defined(FEATURE_HAL_DELAYED_REG_WRITE)
	qdf_atomic_t dp_ep_vote_access;
	qdf_atomic_t ep_vote_access;
#endif
};

static inline