Add 'removable' option to the mmc module. (Closes: #504391)
svn path=/dists/trunk/linux-2.6/; revision=14703
This commit is contained in:
parent
bdcbcf2861
commit
3e4966ed53
|
@ -23,6 +23,9 @@ linux-2.6 (2.6.32~rc8-1~experimental.2) UNRELEASED; urgency=low
|
||||||
- TI wl12xx wireless drivers (wl1251_spi, wl1251_sdio and wl1271
|
- TI wl12xx wireless drivers (wl1251_spi, wl1251_sdio and wl1271
|
||||||
replace wl12xx)
|
replace wl12xx)
|
||||||
- Silicon Labs Si470x FM Radio Receiver driver (radio-usb-si470x)
|
- Silicon Labs Si470x FM Radio Receiver driver (radio-usb-si470x)
|
||||||
|
* Add 'removable' option to the mmc module. Setting this to 0 causes
|
||||||
|
MMC/SD cards to be assumed non-removable, and filesystems on them
|
||||||
|
will remain mounted over a suspend/resume cycle. (Closes: #504391)
|
||||||
|
|
||||||
-- Martin Michlmayr <tbm@cyrius.com> Sun, 22 Nov 2009 13:56:12 +0000
|
-- Martin Michlmayr <tbm@cyrius.com> Sun, 22 Nov 2009 13:56:12 +0000
|
||||||
|
|
||||||
|
|
190
debian/patches/features/all/mmc-parameter-set-whether-cards-are-assumed-removable.patch
vendored
Normal file
190
debian/patches/features/all/mmc-parameter-set-whether-cards-are-assumed-removable.patch
vendored
Normal file
|
@ -0,0 +1,190 @@
|
||||||
|
Subject: mmc: add module parameter to set whether cards are assumed removable
|
||||||
|
From: Ben Hutchings <ben@decadent.org.uk>
|
||||||
|
|
||||||
|
Some people run general-purpose distribution kernels on netbooks with
|
||||||
|
a card that is physically non-removable or logically non-removable
|
||||||
|
(e.g. used for /home) and cannot be cleanly unmounted during suspend.
|
||||||
|
Add a module parameter to set whether cards are assumed removable or
|
||||||
|
non-removable, with the default set by CONFIG_MMC_UNSAFE_RESUME.
|
||||||
|
|
||||||
|
In general, it is not possible to tell whether a card present in an MMC
|
||||||
|
slot after resume is the same that was there before suspend. So there are
|
||||||
|
two possible behaviours, each of which will cause data loss in some cases:
|
||||||
|
|
||||||
|
CONFIG_MMC_UNSAFE_RESUME=n (default): Cards are assumed to be removed
|
||||||
|
during suspend. Any filesystem on them must be unmounted before suspend;
|
||||||
|
otherwise, buffered writes will be lost.
|
||||||
|
|
||||||
|
CONFIG_MMC_UNSAFE_RESUME=y: Cards are assumed to remain present during
|
||||||
|
suspend. They must not be swapped during suspend; otherwise, buffered
|
||||||
|
writes will be flushed to the wrong card.
|
||||||
|
|
||||||
|
Currently the choice is made at compile time and this allows that to be
|
||||||
|
overridden at module load time.
|
||||||
|
|
||||||
|
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||||
|
Cc: <linux-mmc@vger.kernel.org>
|
||||||
|
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||||
|
---
|
||||||
|
drivers/mmc/core/Kconfig | 4 +++-
|
||||||
|
drivers/mmc/core/core.c | 16 ++++++++++++++++
|
||||||
|
drivers/mmc/core/core.h | 2 ++
|
||||||
|
drivers/mmc/core/mmc.c | 23 +----------------------
|
||||||
|
drivers/mmc/core/sd.c | 21 +--------------------
|
||||||
|
5 files changed, 23 insertions(+), 43 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/mmc/core/Kconfig b/drivers/mmc/core/Kconfig
|
||||||
|
index ab37a6d..bb22ffd 100644
|
||||||
|
--- a/drivers/mmc/core/Kconfig
|
||||||
|
+++ b/drivers/mmc/core/Kconfig
|
||||||
|
@@ -3,7 +3,7 @@
|
||||||
|
#
|
||||||
|
|
||||||
|
config MMC_UNSAFE_RESUME
|
||||||
|
- bool "Allow unsafe resume (DANGEROUS)"
|
||||||
|
+ bool "Assume MMC/SD cards are non-removable (DANGEROUS)"
|
||||||
|
help
|
||||||
|
If you say Y here, the MMC layer will assume that all cards
|
||||||
|
stayed in their respective slots during the suspend. The
|
||||||
|
@@ -14,3 +14,5 @@ config MMC_UNSAFE_RESUME
|
||||||
|
This option is usually just for embedded systems which use
|
||||||
|
a MMC/SD card for rootfs. Most people should say N here.
|
||||||
|
|
||||||
|
+ This option sets a default which can be overridden by the
|
||||||
|
+ module parameter "removable=0" or "removable=1".
|
||||||
|
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
|
||||||
|
index d98b0e2..010c964 100644
|
||||||
|
--- a/drivers/mmc/core/core.c
|
||||||
|
+++ b/drivers/mmc/core/core.c
|
||||||
|
@@ -48,6 +48,22 @@ int use_spi_crc = 1;
|
||||||
|
module_param(use_spi_crc, bool, 0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
+ * We normally treat cards as removed during suspend if they are not
|
||||||
|
+ * known to be on a non-removable bus, to avoid the risk of writing
|
||||||
|
+ * back data to a different card after resume. Allow this to be
|
||||||
|
+ * overridden if necessary.
|
||||||
|
+ */
|
||||||
|
+#ifdef CONFIG_MMC_UNSAFE_RESUME
|
||||||
|
+int mmc_assume_removable;
|
||||||
|
+#else
|
||||||
|
+int mmc_assume_removable = 1;
|
||||||
|
+#endif
|
||||||
|
+module_param_named(removable, mmc_assume_removable, bool, 0644);
|
||||||
|
+MODULE_PARM_DESC(
|
||||||
|
+ removable,
|
||||||
|
+ "MMC/SD cards are removable and may be removed during suspend");
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
* Internal function. Schedule delayed work in the MMC work queue.
|
||||||
|
*/
|
||||||
|
static int mmc_schedule_delayed_work(struct delayed_work *work,
|
||||||
|
diff --git a/drivers/mmc/core/core.h b/drivers/mmc/core/core.h
|
||||||
|
index 1c68783..d20b7bc 100644
|
||||||
|
--- a/drivers/mmc/core/core.h
|
||||||
|
+++ b/drivers/mmc/core/core.h
|
||||||
|
@@ -64,7 +64,9 @@ int mmc_attach_mmc(struct mmc_host *host, u32 ocr);
|
||||||
|
int mmc_attach_sd(struct mmc_host *host, u32 ocr);
|
||||||
|
int mmc_attach_sdio(struct mmc_host *host, u32 ocr);
|
||||||
|
|
||||||
|
+/* Module parameters */
|
||||||
|
extern int use_spi_crc;
|
||||||
|
+extern int mmc_assume_removable;
|
||||||
|
|
||||||
|
/* Debugfs information for hosts and cards */
|
||||||
|
void mmc_add_host_debugfs(struct mmc_host *host);
|
||||||
|
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
|
||||||
|
index bfefce3..c111894 100644
|
||||||
|
--- a/drivers/mmc/core/mmc.c
|
||||||
|
+++ b/drivers/mmc/core/mmc.c
|
||||||
|
@@ -602,25 +602,6 @@ static int mmc_awake(struct mmc_host *host)
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
-#ifdef CONFIG_MMC_UNSAFE_RESUME
|
||||||
|
-
|
||||||
|
-static const struct mmc_bus_ops mmc_ops = {
|
||||||
|
- .awake = mmc_awake,
|
||||||
|
- .sleep = mmc_sleep,
|
||||||
|
- .remove = mmc_remove,
|
||||||
|
- .detect = mmc_detect,
|
||||||
|
- .suspend = mmc_suspend,
|
||||||
|
- .resume = mmc_resume,
|
||||||
|
- .power_restore = mmc_power_restore,
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
-static void mmc_attach_bus_ops(struct mmc_host *host)
|
||||||
|
-{
|
||||||
|
- mmc_attach_bus(host, &mmc_ops);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-#else
|
||||||
|
-
|
||||||
|
static const struct mmc_bus_ops mmc_ops = {
|
||||||
|
.awake = mmc_awake,
|
||||||
|
.sleep = mmc_sleep,
|
||||||
|
@@ -645,15 +626,13 @@ static void mmc_attach_bus_ops(struct mmc_host *host)
|
||||||
|
{
|
||||||
|
const struct mmc_bus_ops *bus_ops;
|
||||||
|
|
||||||
|
- if (host->caps & MMC_CAP_NONREMOVABLE)
|
||||||
|
+ if (host->caps & MMC_CAP_NONREMOVABLE || !mmc_assume_removable)
|
||||||
|
bus_ops = &mmc_ops_unsafe;
|
||||||
|
else
|
||||||
|
bus_ops = &mmc_ops;
|
||||||
|
mmc_attach_bus(host, bus_ops);
|
||||||
|
}
|
||||||
|
|
||||||
|
-#endif
|
||||||
|
-
|
||||||
|
/*
|
||||||
|
* Starting point for MMC card init.
|
||||||
|
*/
|
||||||
|
diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c
|
||||||
|
index 10b2a4d..fdd414e 100644
|
||||||
|
--- a/drivers/mmc/core/sd.c
|
||||||
|
+++ b/drivers/mmc/core/sd.c
|
||||||
|
@@ -606,23 +606,6 @@ static void mmc_sd_power_restore(struct mmc_host *host)
|
||||||
|
mmc_release_host(host);
|
||||||
|
}
|
||||||
|
|
||||||
|
-#ifdef CONFIG_MMC_UNSAFE_RESUME
|
||||||
|
-
|
||||||
|
-static const struct mmc_bus_ops mmc_sd_ops = {
|
||||||
|
- .remove = mmc_sd_remove,
|
||||||
|
- .detect = mmc_sd_detect,
|
||||||
|
- .suspend = mmc_sd_suspend,
|
||||||
|
- .resume = mmc_sd_resume,
|
||||||
|
- .power_restore = mmc_sd_power_restore,
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
-static void mmc_sd_attach_bus_ops(struct mmc_host *host)
|
||||||
|
-{
|
||||||
|
- mmc_attach_bus(host, &mmc_sd_ops);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-#else
|
||||||
|
-
|
||||||
|
static const struct mmc_bus_ops mmc_sd_ops = {
|
||||||
|
.remove = mmc_sd_remove,
|
||||||
|
.detect = mmc_sd_detect,
|
||||||
|
@@ -643,15 +626,13 @@ static void mmc_sd_attach_bus_ops(struct mmc_host *host)
|
||||||
|
{
|
||||||
|
const struct mmc_bus_ops *bus_ops;
|
||||||
|
|
||||||
|
- if (host->caps & MMC_CAP_NONREMOVABLE)
|
||||||
|
+ if (host->caps & MMC_CAP_NONREMOVABLE || !mmc_assume_removable)
|
||||||
|
bus_ops = &mmc_sd_ops_unsafe;
|
||||||
|
else
|
||||||
|
bus_ops = &mmc_sd_ops;
|
||||||
|
mmc_attach_bus(host, bus_ops);
|
||||||
|
}
|
||||||
|
|
||||||
|
-#endif
|
||||||
|
-
|
||||||
|
/*
|
||||||
|
* Starting point for SD card init.
|
||||||
|
*/
|
||||||
|
--
|
||||||
|
1.6.5.3
|
||||||
|
|
|
@ -53,3 +53,4 @@
|
||||||
+ bugfix/mips/drm-ttm-build-fix.patch
|
+ bugfix/mips/drm-ttm-build-fix.patch
|
||||||
+ bugfix/all/DocBook-media-copy-images-after-building-HTML.patch
|
+ bugfix/all/DocBook-media-copy-images-after-building-HTML.patch
|
||||||
+ bugfix/all/DocBook-media-create-links-for-included-sources.patch
|
+ bugfix/all/DocBook-media-create-links-for-included-sources.patch
|
||||||
|
+ features/all/mmc-parameter-set-whether-cards-are-assumed-removable.patch
|
||||||
|
|
Loading…
Reference in New Issue