Message ID | 20190722193939.125578-3-dianders@chromium.org (mailing list archive) |
---|---|
State | Not Applicable |
Delegated to: | Kalle Valo |
Headers | show |
Series | mmc: core: Fix Marvell WiFi reset by adding SDIO API to replug card | expand |
Douglas Anderson <dianders@chromium.org> wrote: > As described in the patch ("mmc: core: Add sdio_trigger_replug() > API"), the current mwifiex_sdio_card_reset() is broken in the cases > where we're running Bluetooth on a second SDIO func on the same card > as WiFi. The problem goes away if we just use the > sdio_trigger_replug() API call. > > NOTE: Even though with this new solution there is less of a reason to > do our work from a workqueue (the unplug / plug mechanism we're using > is possible for a human to perform at any time so the stack is > supposed to handle it without it needing to be called from a special > context), we still need a workqueue because the Marvell reset function > could called from a context where sleeping is invalid and thus we > can't claim the host. One example is Marvell's wakeup_timer_fn(). > > Cc: Andreas Fenkart <afenkart@gmail.com> > Cc: Brian Norris <briannorris@chromium.org> > Fixes: b4336a282db8 ("mwifiex: sdio: reset adapter using mmc_hw_reset") > Signed-off-by: Douglas Anderson <dianders@chromium.org> > Reviewed-by: Brian Norris <briannorris@chromium.org> I assume this is going via some other tree so I'm dropping this from my queue. If I should apply this please resend once the dependency is in wireless-drivers-next. Patch set to Not Applicable.
Hi, On Wed, Jul 24, 2019 at 4:35 AM Kalle Valo <kvalo@codeaurora.org> wrote: > > Douglas Anderson <dianders@chromium.org> wrote: > > > As described in the patch ("mmc: core: Add sdio_trigger_replug() > > API"), the current mwifiex_sdio_card_reset() is broken in the cases > > where we're running Bluetooth on a second SDIO func on the same card > > as WiFi. The problem goes away if we just use the > > sdio_trigger_replug() API call. > > > > NOTE: Even though with this new solution there is less of a reason to > > do our work from a workqueue (the unplug / plug mechanism we're using > > is possible for a human to perform at any time so the stack is > > supposed to handle it without it needing to be called from a special > > context), we still need a workqueue because the Marvell reset function > > could called from a context where sleeping is invalid and thus we > > can't claim the host. One example is Marvell's wakeup_timer_fn(). > > > > Cc: Andreas Fenkart <afenkart@gmail.com> > > Cc: Brian Norris <briannorris@chromium.org> > > Fixes: b4336a282db8 ("mwifiex: sdio: reset adapter using mmc_hw_reset") > > Signed-off-by: Douglas Anderson <dianders@chromium.org> > > Reviewed-by: Brian Norris <briannorris@chromium.org> > > I assume this is going via some other tree so I'm dropping this from my > queue. If I should apply this please resend once the dependency is in > wireless-drivers-next. > > Patch set to Not Applicable. Thanks. For now I'll assume that Ulf will pick it up if/when he is happy with patch #1 in this series. Would you be willing to provide your Ack on this patch to make it clear to Ulf you're OK with that? -Doug
Doug Anderson <dianders@chromium.org> writes: > Hi, > > On Wed, Jul 24, 2019 at 4:35 AM Kalle Valo <kvalo@codeaurora.org> wrote: >> >> Douglas Anderson <dianders@chromium.org> wrote: >> >> > As described in the patch ("mmc: core: Add sdio_trigger_replug() >> > API"), the current mwifiex_sdio_card_reset() is broken in the cases >> > where we're running Bluetooth on a second SDIO func on the same card >> > as WiFi. The problem goes away if we just use the >> > sdio_trigger_replug() API call. >> > >> > NOTE: Even though with this new solution there is less of a reason to >> > do our work from a workqueue (the unplug / plug mechanism we're using >> > is possible for a human to perform at any time so the stack is >> > supposed to handle it without it needing to be called from a special >> > context), we still need a workqueue because the Marvell reset function >> > could called from a context where sleeping is invalid and thus we >> > can't claim the host. One example is Marvell's wakeup_timer_fn(). >> > >> > Cc: Andreas Fenkart <afenkart@gmail.com> >> > Cc: Brian Norris <briannorris@chromium.org> >> > Fixes: b4336a282db8 ("mwifiex: sdio: reset adapter using mmc_hw_reset") >> > Signed-off-by: Douglas Anderson <dianders@chromium.org> >> > Reviewed-by: Brian Norris <briannorris@chromium.org> >> >> I assume this is going via some other tree so I'm dropping this from my >> queue. If I should apply this please resend once the dependency is in >> wireless-drivers-next. >> >> Patch set to Not Applicable. > > Thanks. For now I'll assume that Ulf will pick it up if/when he is > happy with patch #1 in this series. Would you be willing to provide > your Ack on this patch to make it clear to Ulf you're OK with that? Sure, I was planning to do that already in my previous email but forgot. Acked-by: Kalle Valo <kvalo@codeaurora.org>
diff --git a/drivers/net/wireless/marvell/mwifiex/sdio.c b/drivers/net/wireless/marvell/mwifiex/sdio.c index 24c041dad9f6..7ec5068f6ffd 100644 --- a/drivers/net/wireless/marvell/mwifiex/sdio.c +++ b/drivers/net/wireless/marvell/mwifiex/sdio.c @@ -2218,24 +2218,10 @@ static void mwifiex_sdio_card_reset_work(struct mwifiex_adapter *adapter) { struct sdio_mmc_card *card = adapter->card; struct sdio_func *func = card->func; - int ret; - - mwifiex_shutdown_sw(adapter); - /* power cycle the adapter */ sdio_claim_host(func); - mmc_hw_reset(func->card->host); + sdio_trigger_replug(func); sdio_release_host(func); - - /* Previous save_adapter won't be valid after this. We will cancel - * pending work requests. - */ - clear_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP, &card->work_flags); - clear_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &card->work_flags); - - ret = mwifiex_reinit_sw(adapter); - if (ret) - dev_err(&func->dev, "reinit failed: %d\n", ret); } /* This function read/write firmware */