Re: mwifiex: fix interrupt processing corner case in MSI mode

2016-07-08 Thread Kalle Valo
Amitkumar Karwar <akar...@marvell.com> wrote:
> From: Shengzhen Li <s...@marvell.com>
> 
> As interrupt is read in interrupt handler as well as interrupt processing
> thread, we observed a corner case issue for MSI in which interrupt gets
> processed twice.
> 
> This patch moves interrupt reading code for MSI mode from
> mwifiex_interrupt_status() to mwifiex_pcie_process_int() to avoid the
> issue.
> 
> Signed-off-by: Shengzhen Li <s...@marvell.com>
> Signed-off-by: Amitkumar Karwar <akar...@marvell.com>

Thanks, 1 patch applied to wireless-drivers-next.git:

5781fc29dbbd mwifiex: fix interrupt processing corner case in MSI mode

-- 
Sent by pwcli
https://patchwork.kernel.org/patch/9209885/

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] mwifiex: fix interrupt processing corner case in MSI mode

2016-07-01 Thread Amitkumar Karwar
From: Shengzhen Li 

As interrupt is read in interrupt handler as well as interrupt processing
thread, we observed a corner case issue for MSI in which interrupt gets
processed twice.

This patch moves interrupt reading code for MSI mode from
mwifiex_interrupt_status() to mwifiex_pcie_process_int() to avoid the
issue.

Signed-off-by: Shengzhen Li 
Signed-off-by: Amitkumar Karwar 
---
 drivers/net/wireless/marvell/mwifiex/pcie.c | 50 ++---
 1 file changed, 46 insertions(+), 4 deletions(-)

diff --git a/drivers/net/wireless/marvell/mwifiex/pcie.c 
b/drivers/net/wireless/marvell/mwifiex/pcie.c
index 7b17389..2c64b99 100644
--- a/drivers/net/wireless/marvell/mwifiex/pcie.c
+++ b/drivers/net/wireless/marvell/mwifiex/pcie.c
@@ -2086,6 +2086,13 @@ static void mwifiex_interrupt_status(struct 
mwifiex_adapter *adapter,
unsigned long flags;
struct pcie_service_card *card = adapter->card;
 
+   if (card->msi_enable) {
+   spin_lock_irqsave(>int_lock, flags);
+   adapter->int_status = 1;
+   spin_unlock_irqrestore(>int_lock, flags);
+   return;
+   }
+
if (!mwifiex_pcie_ok_to_access_hw(adapter))
return;
 
@@ -2187,15 +2194,44 @@ exit:
 static int mwifiex_process_pcie_int(struct mwifiex_adapter *adapter)
 {
int ret;
-   u32 pcie_ireg;
+   u32 pcie_ireg = 0;
unsigned long flags;
+   struct pcie_service_card *card = adapter->card;
 
spin_lock_irqsave(>int_lock, flags);
-   /* Clear out unused interrupts */
-   pcie_ireg = adapter->int_status;
+   if (!card->msi_enable) {
+   /* Clear out unused interrupts */
+   pcie_ireg = adapter->int_status;
+   }
adapter->int_status = 0;
spin_unlock_irqrestore(>int_lock, flags);
 
+   if (card->msi_enable) {
+   if (mwifiex_pcie_ok_to_access_hw(adapter)) {
+   if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS,
+_ireg)) {
+   mwifiex_dbg(adapter, ERROR,
+   "Read register failed\n");
+   return -1;
+   }
+
+   if ((pcie_ireg != 0x) && (pcie_ireg)) {
+   if (mwifiex_write_reg(adapter,
+ PCIE_HOST_INT_STATUS,
+ ~pcie_ireg)) {
+   mwifiex_dbg(adapter, ERROR,
+   "Write register failed\n");
+   return -1;
+   }
+   if (!adapter->pps_uapsd_mode &&
+   adapter->ps_state == PS_STATE_SLEEP) {
+   adapter->ps_state = PS_STATE_AWAKE;
+   adapter->pm_wakeup_fw_try = false;
+   del_timer(>wakeup_timer);
+   }
+   }
+   }
+   }
while (pcie_ireg & HOST_INTR_MASK) {
if (pcie_ireg & HOST_INTR_DNLD_DONE) {
pcie_ireg &= ~HOST_INTR_DNLD_DONE;
@@ -2235,6 +2271,12 @@ static int mwifiex_process_pcie_int(struct 
mwifiex_adapter *adapter)
return ret;
}
 
+   if (card->msi_enable) {
+   spin_lock_irqsave(>int_lock, flags);
+   adapter->int_status = 0;
+   spin_unlock_irqrestore(>int_lock, flags);
+   }
+
if (mwifiex_pcie_ok_to_access_hw(adapter)) {
if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS,
 _ireg)) {
@@ -2258,7 +2300,7 @@ static int mwifiex_process_pcie_int(struct 
mwifiex_adapter *adapter)
mwifiex_dbg(adapter, INTR,
"info: cmd_sent=%d data_sent=%d\n",
adapter->cmd_sent, adapter->data_sent);
-   if (adapter->ps_state != PS_STATE_SLEEP)
+   if (!card->msi_enable && adapter->ps_state != PS_STATE_SLEEP)
mwifiex_pcie_enable_host_int(adapter);
 
return 0;
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html