diff options
| author | Adrian Hunter <adrian.hunter@intel.com> | 2011-11-28 09:22:00 -0500 |
|---|---|---|
| committer | Chris Ball <cjb@laptop.org> | 2012-01-11 23:58:43 -0500 |
| commit | d30495048892980e5d453328d1cc9343b3f7e917 (patch) | |
| tree | eff2ac501e38bad357c837eb6bf2835f7e83eba8 /include/linux/mmc | |
| parent | 482fce997e143a8d5429406fe066d31aa76ef70a (diff) | |
mmc: allow upper layers to know immediately if card has been removed
Add a function mmc_detect_card_removed() which upper layers can use to
determine immediately if a card has been removed. This function should
be called after an I/O request fails so that all queued I/O requests
can be errored out immediately instead of waiting for the card device
to be removed.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Acked-by: Sujit Reddy Thumma <sthumma@codeaurora.org>
Signed-off-by: Chris Ball <cjb@laptop.org>
Diffstat (limited to 'include/linux/mmc')
| -rw-r--r-- | include/linux/mmc/card.h | 3 | ||||
| -rw-r--r-- | include/linux/mmc/core.h | 2 | ||||
| -rw-r--r-- | include/linux/mmc/host.h | 1 |
3 files changed, 6 insertions, 0 deletions
diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index 534974c3ef0c..6402d9224d6a 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h | |||
| @@ -209,6 +209,7 @@ struct mmc_card { | |||
| 209 | #define MMC_STATE_HIGHSPEED_DDR (1<<4) /* card is in high speed mode */ | 209 | #define MMC_STATE_HIGHSPEED_DDR (1<<4) /* card is in high speed mode */ |
| 210 | #define MMC_STATE_ULTRAHIGHSPEED (1<<5) /* card is in ultra high speed mode */ | 210 | #define MMC_STATE_ULTRAHIGHSPEED (1<<5) /* card is in ultra high speed mode */ |
| 211 | #define MMC_CARD_SDXC (1<<6) /* card is SDXC */ | 211 | #define MMC_CARD_SDXC (1<<6) /* card is SDXC */ |
| 212 | #define MMC_CARD_REMOVED (1<<7) /* card has been removed */ | ||
| 212 | unsigned int quirks; /* card quirks */ | 213 | unsigned int quirks; /* card quirks */ |
| 213 | #define MMC_QUIRK_LENIENT_FN0 (1<<0) /* allow SDIO FN0 writes outside of the VS CCCR range */ | 214 | #define MMC_QUIRK_LENIENT_FN0 (1<<0) /* allow SDIO FN0 writes outside of the VS CCCR range */ |
| 214 | #define MMC_QUIRK_BLKSZ_FOR_BYTE_MODE (1<<1) /* use func->cur_blksize */ | 215 | #define MMC_QUIRK_BLKSZ_FOR_BYTE_MODE (1<<1) /* use func->cur_blksize */ |
| @@ -370,6 +371,7 @@ static inline void __maybe_unused remove_quirk(struct mmc_card *card, int data) | |||
| 370 | #define mmc_card_uhs(c) ((c)->state & MMC_STATE_ULTRAHIGHSPEED) | 371 | #define mmc_card_uhs(c) ((c)->state & MMC_STATE_ULTRAHIGHSPEED) |
| 371 | #define mmc_sd_card_uhs(c) ((c)->state & MMC_STATE_ULTRAHIGHSPEED) | 372 | #define mmc_sd_card_uhs(c) ((c)->state & MMC_STATE_ULTRAHIGHSPEED) |
| 372 | #define mmc_card_ext_capacity(c) ((c)->state & MMC_CARD_SDXC) | 373 | #define mmc_card_ext_capacity(c) ((c)->state & MMC_CARD_SDXC) |
| 374 | #define mmc_card_removed(c) ((c) && ((c)->state & MMC_CARD_REMOVED)) | ||
| 373 | 375 | ||
| 374 | #define mmc_card_set_present(c) ((c)->state |= MMC_STATE_PRESENT) | 376 | #define mmc_card_set_present(c) ((c)->state |= MMC_STATE_PRESENT) |
| 375 | #define mmc_card_set_readonly(c) ((c)->state |= MMC_STATE_READONLY) | 377 | #define mmc_card_set_readonly(c) ((c)->state |= MMC_STATE_READONLY) |
| @@ -379,6 +381,7 @@ static inline void __maybe_unused remove_quirk(struct mmc_card *card, int data) | |||
| 379 | #define mmc_card_set_uhs(c) ((c)->state |= MMC_STATE_ULTRAHIGHSPEED) | 381 | #define mmc_card_set_uhs(c) ((c)->state |= MMC_STATE_ULTRAHIGHSPEED) |
| 380 | #define mmc_sd_card_set_uhs(c) ((c)->state |= MMC_STATE_ULTRAHIGHSPEED) | 382 | #define mmc_sd_card_set_uhs(c) ((c)->state |= MMC_STATE_ULTRAHIGHSPEED) |
| 381 | #define mmc_card_set_ext_capacity(c) ((c)->state |= MMC_CARD_SDXC) | 383 | #define mmc_card_set_ext_capacity(c) ((c)->state |= MMC_CARD_SDXC) |
| 384 | #define mmc_card_set_removed(c) ((c)->state |= MMC_CARD_REMOVED) | ||
| 382 | 385 | ||
| 383 | /* | 386 | /* |
| 384 | * Quirk add/remove for MMC products. | 387 | * Quirk add/remove for MMC products. |
diff --git a/include/linux/mmc/core.h b/include/linux/mmc/core.h index 174a844a5dda..87a976cc5654 100644 --- a/include/linux/mmc/core.h +++ b/include/linux/mmc/core.h | |||
| @@ -180,6 +180,8 @@ extern int mmc_try_claim_host(struct mmc_host *host); | |||
| 180 | 180 | ||
| 181 | extern int mmc_flush_cache(struct mmc_card *); | 181 | extern int mmc_flush_cache(struct mmc_card *); |
| 182 | 182 | ||
| 183 | extern int mmc_detect_card_removed(struct mmc_host *host); | ||
| 184 | |||
| 183 | /** | 185 | /** |
| 184 | * mmc_claim_host - exclusively claim a host | 186 | * mmc_claim_host - exclusively claim a host |
| 185 | * @host: mmc host to claim | 187 | * @host: mmc host to claim |
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index 706f72279a17..9a03d0335745 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h | |||
| @@ -299,6 +299,7 @@ struct mmc_host { | |||
| 299 | int claim_cnt; /* "claim" nesting count */ | 299 | int claim_cnt; /* "claim" nesting count */ |
| 300 | 300 | ||
| 301 | struct delayed_work detect; | 301 | struct delayed_work detect; |
| 302 | int detect_change; /* card detect flag */ | ||
| 302 | 303 | ||
| 303 | const struct mmc_bus_ops *bus_ops; /* current bus driver */ | 304 | const struct mmc_bus_ops *bus_ops; /* current bus driver */ |
| 304 | unsigned int bus_refs; /* reference counter */ | 305 | unsigned int bus_refs; /* reference counter */ |
