From: Douglas Anderson <dianders@chromium.org> To: Ulf Hansson <ulf.hansson@linaro.org>, Kalle Valo <kvalo@codeaurora.org>, Adrian Hunter <adrian.hunter@intel.com> Cc: Ganapathi Bhat <gbhat@marvell.com>, linux-wireless@vger.kernel.org, Andreas Fenkart <afenkart@gmail.com>, Brian Norris <briannorris@chromium.org>, Amitkumar Karwar <amitkarwar@gmail.com>, linux-rockchip@lists.infradead.org, Wolfram Sang <wsa+renesas@sang-engineering.com>, Nishant Sarmukadam <nishants@marvell.com>, netdev@vger.kernel.org, Avri Altman <avri.altman@wdc.com>, linux-mmc@vger.kernel.org, davem@davemloft.net, Xinming Hu <huxinming820@gmail.com>, Douglas Anderson <dianders@chromium.org>, linux-kernel@vger.kernel.org, Thomas Gleixner <tglx@linutronix.de>, Kate Stewart <kstewart@linuxfoundation.org> Subject: [PATCH v2 0/2] mmc: core: Fix Marvell WiFi reset by adding SDIO API to replug card Date: Mon, 22 Jul 2019 12:39:37 -0700 [thread overview] Message-ID: <20190722193939.125578-1-dianders@chromium.org> (raw) As talked about in the thread at: http://lkml.kernel.org/r/CAD=FV=X7P2F1k_zwHc0mbtfk55-rucTz_GoDH=PL6zWqKYcpuw@mail.gmail.com ...when the Marvell WiFi card tries to reset itself it kills Bluetooth. It was observed that we could re-init the card properly by unbinding / rebinding the host controller. It was also observed that in the downstream Chrome OS codebase the solution used was mmc_remove_host() / mmc_add_host(), which is similar to the solution in this series. So far I've only done testing of this series using the reset test source that can be simulated via sysfs. Specifically I ran this test: for i in $(seq 1000); do echo "LOOP $i --------" echo 1 > /sys/kernel/debug/mwifiex/mlan0/reset while true; do if ! ping -w15 -c1 "${GW}" >/dev/null 2>&1; then fail=$(( fail + 1 )) echo "Fail WiFi ${fail}" if [[ ${fail} == 3 ]]; then exit 1 fi else fail=0 break fi done hciconfig hci0 down sleep 1 if ! hciconfig hci0 up; then echo "Fail BT" exit 1 fi done I ran this several times and got several hundred iterations each before a failure. When I saw failures: * Once I saw a "Fail BT"; manually resetting the card again fixed it. I didn't give it time to see if it would have detected this automatically. * Once I saw the ping fail because (for some reason) my device only got an IPv6 address from my router and the IPv4 ping failed. I changed my script to use 'ping6' to see if that would help. * Once I saw the ping fail because the higher level network stack ("shill" in my case) seemed to crash. A few minutes later the system recovered itself automatically. https://crbug.com/984593 if you want more details. * Sometimes while I was testing I saw "Fail WiFi 1" indicating a transitory failure. Usually this was an association failure, but in one case I saw the device do "Firmware wakeup failed" after I triggered the reset. This caused the driver to trigger a re-reset of itself which eventually recovered things. This was good because it was an actual test of the normal reset flow (not the one triggered via sysfs). Changes in v2: - s/routnine/routine (Brian Norris, Matthias Kaehlcke). - s/contining/containing (Matthias Kaehlcke). - Add Matthias Reviewed-by tag. - Removed clear_bit() calls and old comment (Brian Norris). - Explicit CC of Andreas Fenkart. - Explicit CC of Brian Norris. - Add "Fixes" pointing at the commit Brian talked about. - Add Brian's Reviewed-by tag. Douglas Anderson (2): mmc: core: Add sdio_trigger_replug() API mwifiex: Make use of the new sdio_trigger_replug() API to reset drivers/mmc/core/core.c | 28 +++++++++++++++++++-- drivers/mmc/core/sdio_io.c | 20 +++++++++++++++ drivers/net/wireless/marvell/mwifiex/sdio.c | 16 +----------- include/linux/mmc/host.h | 15 ++++++++++- include/linux/mmc/sdio_func.h | 2 ++ 5 files changed, 63 insertions(+), 18 deletions(-) -- 2.22.0.657.g960e92d24f-goog
WARNING: multiple messages have this Message-ID (diff)
From: Douglas Anderson <dianders-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org> To: Ulf Hansson <ulf.hansson-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>, Kalle Valo <kvalo-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>, Adrian Hunter <adrian.hunter-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org> Cc: Ganapathi Bhat <gbhat-eYqpPyKDWXRBDgjK7y7TUQ@public.gmane.org>, linux-wireless-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Andreas Fenkart <afenkart-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>, Brian Norris <briannorris-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>, Amitkumar Karwar <amitkarwar-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>, linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, Wolfram Sang <wsa+renesas-jBu1N2QxHDJrcw3mvpCnnVaTQe2KTcn/@public.gmane.org>, Nishant Sarmukadam <nishants-eYqpPyKDWXRBDgjK7y7TUQ@public.gmane.org>, netdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Avri Altman <avri.altman-Sjgp3cTcYWE@public.gmane.org>, linux-mmc-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org, Xinming Hu <huxinming820-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>, Douglas Anderson <dianders-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Thomas Gleixner <tglx-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>, Kate Stewart <kstewart-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org> Subject: [PATCH v2 0/2] mmc: core: Fix Marvell WiFi reset by adding SDIO API to replug card Date: Mon, 22 Jul 2019 12:39:37 -0700 [thread overview] Message-ID: <20190722193939.125578-1-dianders@chromium.org> (raw) As talked about in the thread at: http://lkml.kernel.org/r/CAD=FV=X7P2F1k_zwHc0mbtfk55-rucTz_GoDH=PL6zWqKYcpuw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org ...when the Marvell WiFi card tries to reset itself it kills Bluetooth. It was observed that we could re-init the card properly by unbinding / rebinding the host controller. It was also observed that in the downstream Chrome OS codebase the solution used was mmc_remove_host() / mmc_add_host(), which is similar to the solution in this series. So far I've only done testing of this series using the reset test source that can be simulated via sysfs. Specifically I ran this test: for i in $(seq 1000); do echo "LOOP $i --------" echo 1 > /sys/kernel/debug/mwifiex/mlan0/reset while true; do if ! ping -w15 -c1 "${GW}" >/dev/null 2>&1; then fail=$(( fail + 1 )) echo "Fail WiFi ${fail}" if [[ ${fail} == 3 ]]; then exit 1 fi else fail=0 break fi done hciconfig hci0 down sleep 1 if ! hciconfig hci0 up; then echo "Fail BT" exit 1 fi done I ran this several times and got several hundred iterations each before a failure. When I saw failures: * Once I saw a "Fail BT"; manually resetting the card again fixed it. I didn't give it time to see if it would have detected this automatically. * Once I saw the ping fail because (for some reason) my device only got an IPv6 address from my router and the IPv4 ping failed. I changed my script to use 'ping6' to see if that would help. * Once I saw the ping fail because the higher level network stack ("shill" in my case) seemed to crash. A few minutes later the system recovered itself automatically. https://crbug.com/984593 if you want more details. * Sometimes while I was testing I saw "Fail WiFi 1" indicating a transitory failure. Usually this was an association failure, but in one case I saw the device do "Firmware wakeup failed" after I triggered the reset. This caused the driver to trigger a re-reset of itself which eventually recovered things. This was good because it was an actual test of the normal reset flow (not the one triggered via sysfs). Changes in v2: - s/routnine/routine (Brian Norris, Matthias Kaehlcke). - s/contining/containing (Matthias Kaehlcke). - Add Matthias Reviewed-by tag. - Removed clear_bit() calls and old comment (Brian Norris). - Explicit CC of Andreas Fenkart. - Explicit CC of Brian Norris. - Add "Fixes" pointing at the commit Brian talked about. - Add Brian's Reviewed-by tag. Douglas Anderson (2): mmc: core: Add sdio_trigger_replug() API mwifiex: Make use of the new sdio_trigger_replug() API to reset drivers/mmc/core/core.c | 28 +++++++++++++++++++-- drivers/mmc/core/sdio_io.c | 20 +++++++++++++++ drivers/net/wireless/marvell/mwifiex/sdio.c | 16 +----------- include/linux/mmc/host.h | 15 ++++++++++- include/linux/mmc/sdio_func.h | 2 ++ 5 files changed, 63 insertions(+), 18 deletions(-) -- 2.22.0.657.g960e92d24f-goog
next reply other threads:[~2019-07-22 19:41 UTC|newest] Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-07-22 19:39 Douglas Anderson [this message] 2019-07-22 19:39 ` [PATCH v2 0/2] mmc: core: Fix Marvell WiFi reset by adding SDIO API to replug card Douglas Anderson 2019-07-22 19:39 ` [PATCH v2 1/2] mmc: core: Add sdio_trigger_replug() API Douglas Anderson 2019-10-10 14:10 ` Ulf Hansson 2019-10-10 14:10 ` Ulf Hansson 2019-10-17 0:22 ` Doug Anderson 2019-10-17 0:22 ` Doug Anderson 2019-10-17 9:10 ` Ulf Hansson 2019-10-17 9:10 ` Ulf Hansson 2019-07-22 19:39 ` [PATCH v2 2/2] mwifiex: Make use of the new sdio_trigger_replug() API to reset Douglas Anderson 2019-07-22 19:39 ` Douglas Anderson 2019-07-24 11:35 ` Kalle Valo 2019-07-24 11:35 ` Kalle Valo [not found] ` <20190722193939.125578-3-dianders-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org> 2019-07-24 11:35 ` Kalle Valo [not found] ` <20190724113508.47A356021C@smtp.codeaurora.org> 2019-07-24 20:22 ` Doug Anderson 2019-07-24 20:22 ` Doug Anderson 2019-07-25 5:56 ` Kalle Valo 2019-07-25 5:56 ` Kalle Valo 2019-07-25 13:28 ` [PATCH v2 0/2] mmc: core: Fix Marvell WiFi reset by adding SDIO API to replug card Ulf Hansson 2019-07-25 13:28 ` Ulf Hansson 2019-09-11 21:26 ` Doug Anderson 2019-09-11 21:26 ` Doug Anderson 2019-09-16 9:25 ` Ulf Hansson 2019-09-16 9:25 ` Ulf Hansson 2019-10-07 23:39 ` Doug Anderson 2019-10-07 23:39 ` Doug Anderson 2019-10-08 11:49 ` Ulf Hansson 2019-10-08 11:49 ` Ulf Hansson 2019-07-30 8:46 ` Andreas Fenkart 2019-07-30 16:59 ` Doug Anderson
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20190722193939.125578-1-dianders@chromium.org \ --to=dianders@chromium.org \ --cc=adrian.hunter@intel.com \ --cc=afenkart@gmail.com \ --cc=amitkarwar@gmail.com \ --cc=avri.altman@wdc.com \ --cc=briannorris@chromium.org \ --cc=davem@davemloft.net \ --cc=gbhat@marvell.com \ --cc=huxinming820@gmail.com \ --cc=kstewart@linuxfoundation.org \ --cc=kvalo@codeaurora.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mmc@vger.kernel.org \ --cc=linux-rockchip@lists.infradead.org \ --cc=linux-wireless@vger.kernel.org \ --cc=netdev@vger.kernel.org \ --cc=nishants@marvell.com \ --cc=tglx@linutronix.de \ --cc=ulf.hansson@linaro.org \ --cc=wsa+renesas@sang-engineering.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.