Hi Kalle,

> -----Original Message-----
> From: Avinash Patil [mailto:pat...@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 <s...@marvell.com>
> Signed-off-by: Avinash Patil <pat...@marvell.com>
> Signed-off-by: Amitkumar Karwar <akar...@marvell.com>
> Signed-off-by: Cathy Luo <c...@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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to