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

Commit ea66b12e authored by Rakesh Pillai's avatar Rakesh Pillai Committed by Kalle Valo
Browse files

ath10k: check all CE for data if irq summary is not retained



WCN3990 has interrupts per CE and the interrupt summary
is not retained after the interrupt handler has finished
execution. We need to check if we received any
ce in rx and tx completion path.

Generate a interrupt summary with all CE interrupts if
the target does not retain interrupt summary after the
execution of interrupt handler.

Signed-off-by: default avatarRakesh Pillai <pillair@codeaurora.org>
Signed-off-by: default avatarGovind Singh <govinds@codeaurora.org>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 140d1214
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -355,14 +355,18 @@ static inline u32 ath10k_ce_base_address(struct ath10k *ar, unsigned int ce_id)
	(((x) & CE_WRAPPER_INTERRUPT_SUMMARY_HOST_MSI_MASK) >> \
		CE_WRAPPER_INTERRUPT_SUMMARY_HOST_MSI_LSB)
#define CE_WRAPPER_INTERRUPT_SUMMARY_ADDRESS			0x0000
#define CE_INTERRUPT_SUMMARY		(GENMASK(CE_COUNT_MAX - 1, 0))

static inline u32 ath10k_ce_interrupt_summary(struct ath10k *ar)
{
	struct ath10k_ce *ce = ath10k_ce_priv(ar);

	if (!ar->hw_params.per_ce_irq)
		return CE_WRAPPER_INTERRUPT_SUMMARY_HOST_MSI_GET(
			ce->bus_ops->read32((ar), CE_WRAPPER_BASE_ADDRESS +
			CE_WRAPPER_INTERRUPT_SUMMARY_ADDRESS));
	else
		return CE_INTERRUPT_SUMMARY;
}

#endif /* _CE_H_ */
+13 −0
Original line number Diff line number Diff line
@@ -119,6 +119,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
		.num_wds_entries = 0x20,
		.target_64bit = false,
		.rx_ring_fill_level = HTT_RX_RING_FILL_LEVEL,
		.per_ce_irq = false,
	},
	{
		.id = QCA9887_HW_1_0_VERSION,
@@ -148,6 +149,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
		.num_wds_entries = 0x20,
		.target_64bit = false,
		.rx_ring_fill_level = HTT_RX_RING_FILL_LEVEL,
		.per_ce_irq = false,
	},
	{
		.id = QCA6174_HW_2_1_VERSION,
@@ -176,6 +178,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
		.num_wds_entries = 0x20,
		.target_64bit = false,
		.rx_ring_fill_level = HTT_RX_RING_FILL_LEVEL,
		.per_ce_irq = false,
	},
	{
		.id = QCA6174_HW_2_1_VERSION,
@@ -204,6 +207,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
		.num_wds_entries = 0x20,
		.target_64bit = false,
		.rx_ring_fill_level = HTT_RX_RING_FILL_LEVEL,
		.per_ce_irq = false,
	},
	{
		.id = QCA6174_HW_3_0_VERSION,
@@ -232,6 +236,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
		.num_wds_entries = 0x20,
		.target_64bit = false,
		.rx_ring_fill_level = HTT_RX_RING_FILL_LEVEL,
		.per_ce_irq = false,
	},
	{
		.id = QCA6174_HW_3_2_VERSION,
@@ -263,6 +268,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
		.num_wds_entries = 0x20,
		.target_64bit = false,
		.rx_ring_fill_level = HTT_RX_RING_FILL_LEVEL,
		.per_ce_irq = false,
	},
	{
		.id = QCA99X0_HW_2_0_DEV_VERSION,
@@ -297,6 +303,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
		.num_wds_entries = 0x20,
		.target_64bit = false,
		.rx_ring_fill_level = HTT_RX_RING_FILL_LEVEL,
		.per_ce_irq = false,
	},
	{
		.id = QCA9984_HW_1_0_DEV_VERSION,
@@ -336,6 +343,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
		.num_wds_entries = 0x20,
		.target_64bit = false,
		.rx_ring_fill_level = HTT_RX_RING_FILL_LEVEL,
		.per_ce_irq = false,
	},
	{
		.id = QCA9888_HW_2_0_DEV_VERSION,
@@ -374,6 +382,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
		.num_wds_entries = 0x20,
		.target_64bit = false,
		.rx_ring_fill_level = HTT_RX_RING_FILL_LEVEL,
		.per_ce_irq = false,
	},
	{
		.id = QCA9377_HW_1_0_DEV_VERSION,
@@ -402,6 +411,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
		.num_wds_entries = 0x20,
		.target_64bit = false,
		.rx_ring_fill_level = HTT_RX_RING_FILL_LEVEL,
		.per_ce_irq = false,
	},
	{
		.id = QCA9377_HW_1_1_DEV_VERSION,
@@ -432,6 +442,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
		.num_wds_entries = 0x20,
		.target_64bit = false,
		.rx_ring_fill_level = HTT_RX_RING_FILL_LEVEL,
		.per_ce_irq = false,
	},
	{
		.id = QCA4019_HW_1_0_DEV_VERSION,
@@ -467,6 +478,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
		.num_wds_entries = 0x20,
		.target_64bit = false,
		.rx_ring_fill_level = HTT_RX_RING_FILL_LEVEL,
		.per_ce_irq = false,
	},
	{
		.id = WCN3990_HW_1_0_DEV_VERSION,
@@ -487,6 +499,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
		.num_wds_entries = TARGET_HL_10_TLV_NUM_WDS_ENTRIES,
		.target_64bit = true,
		.rx_ring_fill_level = HTT_RX_RING_FILL_LEVEL_DUAL_MAC,
		.per_ce_irq = true,
	},
};

+3 −0
Original line number Diff line number Diff line
@@ -568,6 +568,9 @@ struct ath10k_hw_params {

	/* Target rx ring fill level */
	u32 rx_ring_fill_level;

	/* target supporting per ce IRQ */
	bool per_ce_irq;
};

struct htt_rx_desc;