diff mbox

[1/5] mwifiex: more_task flag for main_process

Message ID 1423240906-12951-1-git-send-email-patila@marvell.com (mailing list archive)
State Changes Requested
Delegated to: Kalle Valo
Headers show

Commit Message

Avinash Patil Feb. 6, 2015, 4:41 p.m. UTC
This patch handles a corner case where TX packet would remain in
driver queue till next packet comes in.
Here is sequence:
1. TX packet is queued via hard_start_xmit and main_work is queued
2. SDIO interrupt comes in which directly call mwifiex_main_process.
This starts executing main superloop.
3. Now work from step1 is scheduled but at first check itself it sees
mwifiex_processing is set and exits.
4. Now if superloop from step2 has passed TX processing part of superloop
this packet would remain in queue until next packet/command/SDIO interrupt
arrives and queues main_work.

This patch fixes this corner case by defining more_task flag which is set when
mwifiex_processing is found to be true. At end of superloop we again check if
more_task flag is set and if set, execute superloop again.

Signed-off-by: Shengzhen Li <szli@marvell.com>
Signed-off-by: Avinash Patil <patila@marvell.com>
Signed-off-by: Amitkumar Karwar <akarwar@marvell.com>
Signed-off-by: Cathy Luo <cluo@marvell.com>
---
 drivers/net/wireless/mwifiex/main.c | 16 +++++++++-------
 drivers/net/wireless/mwifiex/main.h |  1 +
 2 files changed, 10 insertions(+), 7 deletions(-)

Comments

Avinash Patil Feb. 9, 2015, 1:25 p.m. UTC | #1
Hi Kalle,

> -----Original Message-----
> From: Avinash Patil [mailto:patila@marvell.com]
> Sent: Friday, February 06, 2015 10:12 PM
> To: linux-wireless@vger.kernel.org
> Cc: Amitkumar Karwar; Cathy Luo; Marc Yang; Shengzhen Li; Avinash Patil
> Subject: [PATCH 1/5] mwifiex: more_task flag for main_process
> 
> This patch handles a corner case where TX packet would remain in driver queue
> till next packet comes in.
> Here is sequence:
> 1. TX packet is queued via hard_start_xmit and main_work is queued 2. SDIO
> interrupt comes in which directly call mwifiex_main_process.
> This starts executing main superloop.
> 3. Now work from step1 is scheduled but at first check itself it sees
> mwifiex_processing is set and exits.
> 4. Now if superloop from step2 has passed TX processing part of superloop this
> packet would remain in queue until next packet/command/SDIO interrupt arrives
> and queues main_work.
> 
> This patch fixes this corner case by defining more_task flag which is set when
> mwifiex_processing is found to be true. At end of superloop we again check if
> more_task flag is set and if set, execute superloop again.
> 
> Signed-off-by: Shengzhen Li <szli@marvell.com>
> Signed-off-by: Avinash Patil <patila@marvell.com>
> Signed-off-by: Amitkumar Karwar <akarwar@marvell.com>
> Signed-off-by: Cathy Luo <cluo@marvell.com>
> ---
>  drivers/net/wireless/mwifiex/main.c | 16 +++++++++-------
> drivers/net/wireless/mwifiex/main.h |  1 +
>  2 files changed, 10 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/net/wireless/mwifiex/main.c
> b/drivers/net/wireless/mwifiex/main.c
> index 7e74b4f..74488ab 100644
> --- a/drivers/net/wireless/mwifiex/main.c
> +++ b/drivers/net/wireless/mwifiex/main.c
> @@ -190,14 +190,16 @@ int mwifiex_main_process(struct mwifiex_adapter
> *adapter)
> 
>  	/* Check if already processing */
>  	if (adapter->mwifiex_processing) {
> +		adapter->more_task_flag = true;
>  		spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
>  		goto exit_main_proc;
>  	} else {
>  		adapter->mwifiex_processing = true;
> -		spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
>  	}
>  process_start:
>  	do {
> +		adapter->more_task_flag = false;
> +		spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
>  		if ((adapter->hw_status == MWIFIEX_HW_STATUS_CLOSING) ||
>  		    (adapter->hw_status == MWIFIEX_HW_STATUS_NOT_READY))
>  			break;
> @@ -238,6 +240,7 @@ process_start:
>  			adapter->pm_wakeup_fw_try = true;
>  			mod_timer(&adapter->wakeup_timer, jiffies + (HZ*3));
>  			adapter->if_ops.wakeup(adapter);
> +			spin_lock_irqsave(&adapter->main_proc_lock, flags);
>  			continue;
>  		}
> 
> @@ -295,8 +298,10 @@ process_start:
>  		if ((adapter->ps_state == PS_STATE_SLEEP) ||
>  		    (adapter->ps_state == PS_STATE_PRE_SLEEP) ||
>  		    (adapter->ps_state == PS_STATE_SLEEP_CFM) ||
> -		    adapter->tx_lock_flag)
> +		    adapter->tx_lock_flag){
> +			spin_lock_irqsave(&adapter->main_proc_lock, flags);
>  			continue;
> +		}
> 
>  		if (!adapter->cmd_sent && !adapter->curr_cmd) {
>  			if (mwifiex_exec_next_cmd(adapter) == -1) { @@ -330,15
> +335,12 @@ process_start:
>  			}
>  			break;
>  		}
> +		spin_lock_irqsave(&adapter->main_proc_lock, flags);
>  	} while (true);
> 
>  	spin_lock_irqsave(&adapter->main_proc_lock, flags);
> -	if (!adapter->delay_main_work &&
> -	    (adapter->int_status || IS_CARD_RX_RCVD(adapter))) {
> -		spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
> +	if (adapter->more_task_flag)
>  		goto process_start;
> -	}
> -
>  	adapter->mwifiex_processing = false;
>  	spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
> 
> diff --git a/drivers/net/wireless/mwifiex/main.h
> b/drivers/net/wireless/mwifiex/main.h
> index f0a6af1..2089a30 100644
> --- a/drivers/net/wireless/mwifiex/main.h
> +++ b/drivers/net/wireless/mwifiex/main.h
> @@ -774,6 +774,7 @@ struct mwifiex_adapter {
>  	/* spin lock for main process */
>  	spinlock_t main_proc_lock;
>  	u32 mwifiex_processing;
> +	u8 more_task_flag;
>  	u16 tx_buf_size;
>  	u16 curr_tx_buf_size;
>  	u32 ioport;
> --
> 1.8.1.4

Please drop this series as we are seeing issue with DMA alignment patch.
I will resend v2 after fixing this.

Thanks,
Avinash
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Kalle Valo Feb. 10, 2015, 2:17 p.m. UTC | #2
Avinash Patil <patila@marvell.com> writes:

> Please drop this series as we are seeing issue with DMA alignment patch.
> I will resend v2 after fixing this.

Ok, dropped.
Avinash Patil Feb. 11, 2015, 5:57 p.m. UTC | #3
> -----Original Message-----
> From: Kalle Valo [mailto:kvalo@codeaurora.org]
> Sent: Tuesday, February 10, 2015 7:48 PM
> To: Avinash Patil
> Cc: linux-wireless@vger.kernel.org; Amitkumar Karwar; Cathy Luo; Marc Yang;
> Shengzhen Li
> Subject: Re: [PATCH 1/5] mwifiex: more_task flag for main_process
> 
> Avinash Patil <patila@marvell.com> writes:
> 
> > Please drop this series as we are seeing issue with DMA alignment patch.
> > I will resend v2 after fixing this.
> 
> Ok, dropped.
>
> --
> Kalle Valo
Hi Kalle,

I have sent v2 by omitting DMA alignment patch. I will send this patch separately after fixing issue.
-Avinash.
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/net/wireless/mwifiex/main.c b/drivers/net/wireless/mwifiex/main.c
index 7e74b4f..74488ab 100644
--- a/drivers/net/wireless/mwifiex/main.c
+++ b/drivers/net/wireless/mwifiex/main.c
@@ -190,14 +190,16 @@  int mwifiex_main_process(struct mwifiex_adapter *adapter)
 
 	/* Check if already processing */
 	if (adapter->mwifiex_processing) {
+		adapter->more_task_flag = true;
 		spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
 		goto exit_main_proc;
 	} else {
 		adapter->mwifiex_processing = true;
-		spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
 	}
 process_start:
 	do {
+		adapter->more_task_flag = false;
+		spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
 		if ((adapter->hw_status == MWIFIEX_HW_STATUS_CLOSING) ||
 		    (adapter->hw_status == MWIFIEX_HW_STATUS_NOT_READY))
 			break;
@@ -238,6 +240,7 @@  process_start:
 			adapter->pm_wakeup_fw_try = true;
 			mod_timer(&adapter->wakeup_timer, jiffies + (HZ*3));
 			adapter->if_ops.wakeup(adapter);
+			spin_lock_irqsave(&adapter->main_proc_lock, flags);
 			continue;
 		}
 
@@ -295,8 +298,10 @@  process_start:
 		if ((adapter->ps_state == PS_STATE_SLEEP) ||
 		    (adapter->ps_state == PS_STATE_PRE_SLEEP) ||
 		    (adapter->ps_state == PS_STATE_SLEEP_CFM) ||
-		    adapter->tx_lock_flag)
+		    adapter->tx_lock_flag){
+			spin_lock_irqsave(&adapter->main_proc_lock, flags);
 			continue;
+		}
 
 		if (!adapter->cmd_sent && !adapter->curr_cmd) {
 			if (mwifiex_exec_next_cmd(adapter) == -1) {
@@ -330,15 +335,12 @@  process_start:
 			}
 			break;
 		}
+		spin_lock_irqsave(&adapter->main_proc_lock, flags);
 	} while (true);
 
 	spin_lock_irqsave(&adapter->main_proc_lock, flags);
-	if (!adapter->delay_main_work &&
-	    (adapter->int_status || IS_CARD_RX_RCVD(adapter))) {
-		spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
+	if (adapter->more_task_flag)
 		goto process_start;
-	}
-
 	adapter->mwifiex_processing = false;
 	spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
 
diff --git a/drivers/net/wireless/mwifiex/main.h b/drivers/net/wireless/mwifiex/main.h
index f0a6af1..2089a30 100644
--- a/drivers/net/wireless/mwifiex/main.h
+++ b/drivers/net/wireless/mwifiex/main.h
@@ -774,6 +774,7 @@  struct mwifiex_adapter {
 	/* spin lock for main process */
 	spinlock_t main_proc_lock;
 	u32 mwifiex_processing;
+	u8 more_task_flag;
 	u16 tx_buf_size;
 	u16 curr_tx_buf_size;
 	u32 ioport;