Merge "mmc: core: abort rescan if suspend is triggered"
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
index dbc7d5c..28012ab 100644
--- a/drivers/mmc/core/core.c
+++ b/drivers/mmc/core/core.c
@@ -3234,7 +3234,8 @@
mmc_release_host(host);
mmc_rpm_release(host, &host->class_dev);
out:
- if (extend_wakelock)
+ /* only extend the wakelock, if suspend has not started yet */
+ if (extend_wakelock && !host->rescan_disable)
wake_lock_timeout(&host->detect_wake_lock, HZ / 2);
if (host->caps & MMC_CAP_NEEDS_POLL)
@@ -3619,16 +3620,15 @@
spin_unlock_irqrestore(&host->lock, flags);
break;
}
+
+ /* since its suspending anyway, disable rescan */
+ host->rescan_disable = 1;
spin_unlock_irqrestore(&host->lock, flags);
/* Wait for pending detect work to be completed */
if (!(host->caps & MMC_CAP_NEEDS_POLL))
flush_work(&host->detect.work);
- spin_lock_irqsave(&host->lock, flags);
- host->rescan_disable = 1;
- spin_unlock_irqrestore(&host->lock, flags);
-
/*
* In some cases, the detect work might be scheduled
* just before rescan_disable is set to true.
@@ -3636,6 +3636,13 @@
*/
cancel_delayed_work_sync(&host->detect);
+ /*
+ * It is possible that the wake-lock has been acquired, since
+ * its being suspended, release the wakelock
+ */
+ if (wake_lock_active(&host->detect_wake_lock))
+ wake_unlock(&host->detect_wake_lock);
+
if (!host->bus_ops || host->bus_ops->suspend)
break;
diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c
index 179632c..783f512 100644
--- a/drivers/mmc/core/sd.c
+++ b/drivers/mmc/core/sd.c
@@ -1399,7 +1399,11 @@
*/
#ifdef CONFIG_MMC_PARANOID_SD_INIT
retries = 5;
- while (retries) {
+ /*
+ * Some bad cards may take a long time to init, give preference to
+ * suspend in those cases.
+ */
+ while (retries && !host->rescan_disable) {
err = mmc_sd_init_card(host, host->ocr, NULL);
if (err) {
retries--;
@@ -1417,6 +1421,9 @@
mmc_hostname(host), err);
goto err;
}
+
+ if (host->rescan_disable)
+ goto err;
#else
err = mmc_sd_init_card(host, host->ocr, NULL);
if (err)
@@ -1440,9 +1447,9 @@
mmc_claim_host(host);
err:
mmc_detach_bus(host);
-
- pr_err("%s: error %d whilst initialising SD card\n",
- mmc_hostname(host), err);
+ if (err)
+ pr_err("%s: error %d whilst initialising SD card: rescan: %d\n",
+ mmc_hostname(host), err, host->rescan_disable);
return err;
}