Message ID | 1423240906-12951-1-git-send-email-patila@marvell.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Kalle Valo |
Headers | show |
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
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.
> -----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 --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;