Message ID | 1477062948-8558-1-git-send-email-akarwar@marvell.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Kalle Valo |
Headers | show |
Hi, On Fri, Oct 21, 2016 at 08:45:47PM +0530, Amitkumar Karwar wrote: > We may get SLEEP event from firmware even if TXDone for last Tx packet > is still pending. In this case, we may end up accessing PCIe memory for > handling TXDone after power save handshake is completed. This causes > kernel crash with external abort. > > We will delay sending SLEEP confirm to firmware in > this case to resolve the problem. > > Signed-off-by: Amitkumar Karwar <akarwar@marvell.com> > --- > drivers/net/wireless/marvell/mwifiex/cmdevt.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/net/wireless/marvell/mwifiex/cmdevt.c b/drivers/net/wireless/marvell/mwifiex/cmdevt.c > index 5347728..f582f61 100644 > --- a/drivers/net/wireless/marvell/mwifiex/cmdevt.c > +++ b/drivers/net/wireless/marvell/mwifiex/cmdevt.c > @@ -1118,7 +1118,7 @@ mwifiex_cancel_pending_ioctl(struct mwifiex_adapter *adapter) > void > mwifiex_check_ps_cond(struct mwifiex_adapter *adapter) > { > - if (!adapter->cmd_sent && > + if (!adapter->cmd_sent && !adapter->data_sent && > !adapter->curr_cmd && !IS_CARD_RX_RCVD(adapter)) > mwifiex_dnld_sleep_confirm_cmd(adapter); > else Looks good to me, and tests out on my systems: Tested-by: Brian Norris <briannorris@chromium.org> Reviewed-by: Brian Norris <briannorris@chromium.org>
Hi Kalle, > From: Amitkumar Karwar [mailto:akarwar@marvell.com] > Sent: Friday, October 21, 2016 8:46 PM > To: linux-wireless@vger.kernel.org > Cc: Cathy Luo; Nishant Sarmukadam; Amitkumar Karwar > Subject: [PATCH 1/2] mwifiex: fix corner case power save issue > > We may get SLEEP event from firmware even if TXDone for last Tx packet > is still pending. In this case, we may end up accessing PCIe memory for > handling TXDone after power save handshake is completed. This causes > kernel crash with external abort. > > We will delay sending SLEEP confirm to firmware in this case to resolve > the problem. > > Signed-off-by: Amitkumar Karwar <akarwar@marvell.com> > --- > drivers/net/wireless/marvell/mwifiex/cmdevt.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > Please drop this patch. Xinming Hu has better and complete solution for this issue as discussed at https://patchwork.kernel.org/patch/9405119/ Regards, Amitkumar
Amitkumar Karwar <akarwar@marvell.com> wrote: > We may get SLEEP event from firmware even if TXDone for last Tx packet > is still pending. In this case, we may end up accessing PCIe memory for > handling TXDone after power save handshake is completed. This causes > kernel crash with external abort. > > We will delay sending SLEEP confirm to firmware in > this case to resolve the problem. > > Signed-off-by: Amitkumar Karwar <akarwar@marvell.com> > Tested-by: Brian Norris <briannorris@chromium.org> > Reviewed-by: Brian Norris <briannorris@chromium.org> Dropped per request from Amitkumar. Patch set to Changes Requested.
diff --git a/drivers/net/wireless/marvell/mwifiex/cmdevt.c b/drivers/net/wireless/marvell/mwifiex/cmdevt.c index 5347728..f582f61 100644 --- a/drivers/net/wireless/marvell/mwifiex/cmdevt.c +++ b/drivers/net/wireless/marvell/mwifiex/cmdevt.c @@ -1118,7 +1118,7 @@ mwifiex_cancel_pending_ioctl(struct mwifiex_adapter *adapter) void mwifiex_check_ps_cond(struct mwifiex_adapter *adapter) { - if (!adapter->cmd_sent && + if (!adapter->cmd_sent && !adapter->data_sent && !adapter->curr_cmd && !IS_CARD_RX_RCVD(adapter)) mwifiex_dnld_sleep_confirm_cmd(adapter); else
We may get SLEEP event from firmware even if TXDone for last Tx packet is still pending. In this case, we may end up accessing PCIe memory for handling TXDone after power save handshake is completed. This causes kernel crash with external abort. We will delay sending SLEEP confirm to firmware in this case to resolve the problem. Signed-off-by: Amitkumar Karwar <akarwar@marvell.com> --- drivers/net/wireless/marvell/mwifiex/cmdevt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)