summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Elder <elder@linaro.org>2020-11-19 16:49:28 -0600
committerJakub Kicinski <kuba@kernel.org>2020-11-20 18:45:52 -0800
commit7c80e83829dbc86c1e564017867a48805e459de0 (patch)
tree0dcdabd7153913579ab566e0cd43d8f781fcc91f
parent1136145660f3116cb92794c1a7571bf49e4a1938 (diff)
downloadlinux-stable-7c80e83829dbc86c1e564017867a48805e459de0.tar.gz
linux-stable-7c80e83829dbc86c1e564017867a48805e459de0.tar.bz2
linux-stable-7c80e83829dbc86c1e564017867a48805e459de0.zip
net: ipa: retry modem stop if busy
The IPA driver remove callback, ipa_remove(), calls ipa_modem_stop() if the setup stage of initialization is complete. If a concurrent call to ipa_modem_start() or ipa_modem_stop() has begin but not completed, ipa_modem_stop() can return an error (-EBUSY). The next patch adds a driver shutdown callback, which will simply call ipa_remove(). We really want our shutdown callback to clean things up. So add a single retry to the ipa_modem_stop() call in ipa_remove() after a short (millisecond) delay. This offers no guarantee the shutdown will complete successfully, but we'll at least try a little harder before giving up. Signed-off-by: Alex Elder <elder@linaro.org> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-rw-r--r--drivers/net/ipa/ipa_main.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/net/ipa/ipa_main.c b/drivers/net/ipa/ipa_main.c
index 468ab1acc20e..4f4a7ca01d45 100644
--- a/drivers/net/ipa/ipa_main.c
+++ b/drivers/net/ipa/ipa_main.c
@@ -863,6 +863,11 @@ static int ipa_remove(struct platform_device *pdev)
if (ipa->setup_complete) {
ret = ipa_modem_stop(ipa);
+ /* If starting or stopping is in progress, try once more */
+ if (ret == -EBUSY) {
+ usleep_range(USEC_PER_MSEC, 2 * USEC_PER_MSEC);
+ ret = ipa_modem_stop(ipa);
+ }
if (ret)
return ret;