Commit 9abcb937 authored by Govind Singh's avatar Govind Singh Committed by Kalle Valo

ath10k: introduce CE_ATTR_POLL attribute for polling pipe

Existing copy engine interrupt enable logic assumes that last
CE is using polling mode and due to this interrupt for last copy engine
are always disabled. WCN3990 uses last CE for pktlog and
interrupt remains disabled with existing logic.

To mitigate this issue, introduce CE_ATTR_POLL flag and control
the interrupt based on the flag which can be set in ce_attr.

Testing:
    Tested on WCN3990 and QCA6174 HW.
    Tested FW: WLAN.HL.2.0-01192-QCAHLSWMTPLZ-1,
               WLAN.RM.4.4.1-00109-QCARMSWPZ-1
Signed-off-by: default avatarGovind Singh <govinds@codeaurora.org>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 31324d17
...@@ -1280,10 +1280,17 @@ static void ath10k_ce_per_engine_handler_adjust(struct ath10k_ce_pipe *ce_state) ...@@ -1280,10 +1280,17 @@ static void ath10k_ce_per_engine_handler_adjust(struct ath10k_ce_pipe *ce_state)
int ath10k_ce_disable_interrupts(struct ath10k *ar) int ath10k_ce_disable_interrupts(struct ath10k *ar)
{ {
struct ath10k_ce *ce = ath10k_ce_priv(ar);
struct ath10k_ce_pipe *ce_state;
u32 ctrl_addr;
int ce_id; int ce_id;
for (ce_id = 0; ce_id < CE_COUNT; ce_id++) { for (ce_id = 0; ce_id < CE_COUNT; ce_id++) {
u32 ctrl_addr = ath10k_ce_base_address(ar, ce_id); ce_state = &ce->ce_states[ce_id];
if (ce_state->attr_flags & CE_ATTR_POLL)
continue;
ctrl_addr = ath10k_ce_base_address(ar, ce_id);
ath10k_ce_copy_complete_intr_disable(ar, ctrl_addr); ath10k_ce_copy_complete_intr_disable(ar, ctrl_addr);
ath10k_ce_error_intr_disable(ar, ctrl_addr); ath10k_ce_error_intr_disable(ar, ctrl_addr);
...@@ -1300,11 +1307,14 @@ void ath10k_ce_enable_interrupts(struct ath10k *ar) ...@@ -1300,11 +1307,14 @@ void ath10k_ce_enable_interrupts(struct ath10k *ar)
int ce_id; int ce_id;
struct ath10k_ce_pipe *ce_state; struct ath10k_ce_pipe *ce_state;
/* Skip the last copy engine, CE7 the diagnostic window, as that /* Enable interrupts for copy engine that
* uses polling and isn't initialized for interrupts. * are not using polling mode.
*/ */
for (ce_id = 0; ce_id < CE_COUNT - 1; ce_id++) { for (ce_id = 0; ce_id < CE_COUNT; ce_id++) {
ce_state = &ce->ce_states[ce_id]; ce_state = &ce->ce_states[ce_id];
if (ce_state->attr_flags & CE_ATTR_POLL)
continue;
ath10k_ce_per_engine_handler_adjust(ce_state); ath10k_ce_per_engine_handler_adjust(ce_state);
} }
} }
......
...@@ -275,16 +275,19 @@ void ath10k_ce_free_rri(struct ath10k *ar); ...@@ -275,16 +275,19 @@ void ath10k_ce_free_rri(struct ath10k *ar);
/* ce_attr.flags values */ /* ce_attr.flags values */
/* Use NonSnooping PCIe accesses? */ /* Use NonSnooping PCIe accesses? */
#define CE_ATTR_NO_SNOOP 1 #define CE_ATTR_NO_SNOOP BIT(0)
/* Byte swap data words */ /* Byte swap data words */
#define CE_ATTR_BYTE_SWAP_DATA 2 #define CE_ATTR_BYTE_SWAP_DATA BIT(1)
/* Swizzle descriptors? */ /* Swizzle descriptors? */
#define CE_ATTR_SWIZZLE_DESCRIPTORS 4 #define CE_ATTR_SWIZZLE_DESCRIPTORS BIT(2)
/* no interrupt on copy completion */ /* no interrupt on copy completion */
#define CE_ATTR_DIS_INTR 8 #define CE_ATTR_DIS_INTR BIT(3)
/* no interrupt, only polling */
#define CE_ATTR_POLL BIT(4)
/* Attributes of an instance of a Copy Engine */ /* Attributes of an instance of a Copy Engine */
struct ce_attr { struct ce_attr {
......
...@@ -192,7 +192,7 @@ static struct ce_attr host_ce_config_wlan[] = { ...@@ -192,7 +192,7 @@ static struct ce_attr host_ce_config_wlan[] = {
/* CE7: ce_diag, the Diagnostic Window */ /* CE7: ce_diag, the Diagnostic Window */
{ {
.flags = CE_ATTR_FLAGS, .flags = CE_ATTR_FLAGS | CE_ATTR_POLL,
.src_nentries = 2, .src_nentries = 2,
.src_sz_max = DIAG_TRANSFER_LIMIT, .src_sz_max = DIAG_TRANSFER_LIMIT,
.dest_nentries = 2, .dest_nentries = 2,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment