aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mmc/core
diff options
context:
space:
mode:
authorUlf Hansson <ulf.hansson@linaro.org>2018-12-10 11:52:40 -0500
committerUlf Hansson <ulf.hansson@linaro.org>2018-12-17 03:01:15 -0500
commit0c204979c691f05666ecfb74501e7adfdde8fbf9 (patch)
tree3eac91da57011564921b9af18c4a709e64dfba32 /drivers/mmc/core
parent1217e61544922ab649fe4df94e2f272c01c159ea (diff)
mmc: core: Cleanup BKOPS support
It's been ~6 years ago since we introduced the BKOPS support for eMMC cards. The current code is a bit messy and primarily that's because it prepares to support running BKOPS in an asynchronous mode. However, that mode has never been fully implemented/enabled. Instead BKOPS is always executed in synchronously, when the card has reported an urgent BKOPS level. For these reasons, let's make the code more readable by dropping the unused parts. Let's also rename mmc_start_bkops() to mmc_run_bkops(), as to make it more descriptive. Cc: Jaehoon Chung <jh80.chung@samsung.com> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Diffstat (limited to 'drivers/mmc/core')
-rw-r--r--drivers/mmc/core/block.c2
-rw-r--r--drivers/mmc/core/card.h6
-rw-r--r--drivers/mmc/core/mmc.c6
-rw-r--r--drivers/mmc/core/mmc_ops.c87
-rw-r--r--drivers/mmc/core/mmc_ops.h3
5 files changed, 21 insertions, 83 deletions
diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
index 111934838da2..48386473dcd7 100644
--- a/drivers/mmc/core/block.c
+++ b/drivers/mmc/core/block.c
@@ -1961,7 +1961,7 @@ static void mmc_blk_urgent_bkops(struct mmc_queue *mq,
1961 struct mmc_queue_req *mqrq) 1961 struct mmc_queue_req *mqrq)
1962{ 1962{
1963 if (mmc_blk_urgent_bkops_needed(mq, mqrq)) 1963 if (mmc_blk_urgent_bkops_needed(mq, mqrq))
1964 mmc_start_bkops(mq->card, true); 1964 mmc_run_bkops(mq->card);
1965} 1965}
1966 1966
1967void mmc_blk_mq_complete(struct request *req) 1967void mmc_blk_mq_complete(struct request *req)
diff --git a/drivers/mmc/core/card.h b/drivers/mmc/core/card.h
index 1170feb8f969..eef301452406 100644
--- a/drivers/mmc/core/card.h
+++ b/drivers/mmc/core/card.h
@@ -23,15 +23,13 @@
23#define MMC_STATE_BLOCKADDR (1<<2) /* card uses block-addressing */ 23#define MMC_STATE_BLOCKADDR (1<<2) /* card uses block-addressing */
24#define MMC_CARD_SDXC (1<<3) /* card is SDXC */ 24#define MMC_CARD_SDXC (1<<3) /* card is SDXC */
25#define MMC_CARD_REMOVED (1<<4) /* card has been removed */ 25#define MMC_CARD_REMOVED (1<<4) /* card has been removed */
26#define MMC_STATE_DOING_BKOPS (1<<5) /* card is doing BKOPS */ 26#define MMC_STATE_SUSPENDED (1<<5) /* card is suspended */
27#define MMC_STATE_SUSPENDED (1<<6) /* card is suspended */
28 27
29#define mmc_card_present(c) ((c)->state & MMC_STATE_PRESENT) 28#define mmc_card_present(c) ((c)->state & MMC_STATE_PRESENT)
30#define mmc_card_readonly(c) ((c)->state & MMC_STATE_READONLY) 29#define mmc_card_readonly(c) ((c)->state & MMC_STATE_READONLY)
31#define mmc_card_blockaddr(c) ((c)->state & MMC_STATE_BLOCKADDR) 30#define mmc_card_blockaddr(c) ((c)->state & MMC_STATE_BLOCKADDR)
32#define mmc_card_ext_capacity(c) ((c)->state & MMC_CARD_SDXC) 31#define mmc_card_ext_capacity(c) ((c)->state & MMC_CARD_SDXC)
33#define mmc_card_removed(c) ((c) && ((c)->state & MMC_CARD_REMOVED)) 32#define mmc_card_removed(c) ((c) && ((c)->state & MMC_CARD_REMOVED))
34#define mmc_card_doing_bkops(c) ((c)->state & MMC_STATE_DOING_BKOPS)
35#define mmc_card_suspended(c) ((c)->state & MMC_STATE_SUSPENDED) 33#define mmc_card_suspended(c) ((c)->state & MMC_STATE_SUSPENDED)
36 34
37#define mmc_card_set_present(c) ((c)->state |= MMC_STATE_PRESENT) 35#define mmc_card_set_present(c) ((c)->state |= MMC_STATE_PRESENT)
@@ -39,8 +37,6 @@
39#define mmc_card_set_blockaddr(c) ((c)->state |= MMC_STATE_BLOCKADDR) 37#define mmc_card_set_blockaddr(c) ((c)->state |= MMC_STATE_BLOCKADDR)
40#define mmc_card_set_ext_capacity(c) ((c)->state |= MMC_CARD_SDXC) 38#define mmc_card_set_ext_capacity(c) ((c)->state |= MMC_CARD_SDXC)
41#define mmc_card_set_removed(c) ((c)->state |= MMC_CARD_REMOVED) 39#define mmc_card_set_removed(c) ((c)->state |= MMC_CARD_REMOVED)
42#define mmc_card_set_doing_bkops(c) ((c)->state |= MMC_STATE_DOING_BKOPS)
43#define mmc_card_clr_doing_bkops(c) ((c)->state &= ~MMC_STATE_DOING_BKOPS)
44#define mmc_card_set_suspended(c) ((c)->state |= MMC_STATE_SUSPENDED) 40#define mmc_card_set_suspended(c) ((c)->state |= MMC_STATE_SUSPENDED)
45#define mmc_card_clr_suspended(c) ((c)->state &= ~MMC_STATE_SUSPENDED) 41#define mmc_card_clr_suspended(c) ((c)->state &= ~MMC_STATE_SUSPENDED)
46 42
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
index 2510cebd670f..da892a599524 100644
--- a/drivers/mmc/core/mmc.c
+++ b/drivers/mmc/core/mmc.c
@@ -2014,12 +2014,6 @@ static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
2014 if (mmc_card_suspended(host->card)) 2014 if (mmc_card_suspended(host->card))
2015 goto out; 2015 goto out;
2016 2016
2017 if (mmc_card_doing_bkops(host->card)) {
2018 err = mmc_stop_bkops(host->card);
2019 if (err)
2020 goto out;
2021 }
2022
2023 err = mmc_flush_cache(host->card); 2017 err = mmc_flush_cache(host->card);
2024 if (err) 2018 if (err)
2025 goto out; 2019 goto out;
diff --git a/drivers/mmc/core/mmc_ops.c b/drivers/mmc/core/mmc_ops.c
index ffc74d44ee67..9054329fe903 100644
--- a/drivers/mmc/core/mmc_ops.c
+++ b/drivers/mmc/core/mmc_ops.c
@@ -891,34 +891,6 @@ int mmc_can_ext_csd(struct mmc_card *card)
891 return (card && card->csd.mmca_vsn > CSD_SPEC_VER_3); 891 return (card && card->csd.mmca_vsn > CSD_SPEC_VER_3);
892} 892}
893 893
894/**
895 * mmc_stop_bkops - stop ongoing BKOPS
896 * @card: MMC card to check BKOPS
897 *
898 * Send HPI command to stop ongoing background operations to
899 * allow rapid servicing of foreground operations, e.g. read/
900 * writes. Wait until the card comes out of the programming state
901 * to avoid errors in servicing read/write requests.
902 */
903int mmc_stop_bkops(struct mmc_card *card)
904{
905 int err = 0;
906
907 err = mmc_interrupt_hpi(card);
908
909 /*
910 * If err is EINVAL, we can't issue an HPI.
911 * It should complete the BKOPS.
912 */
913 if (!err || (err == -EINVAL)) {
914 mmc_card_clr_doing_bkops(card);
915 mmc_retune_release(card->host);
916 err = 0;
917 }
918
919 return err;
920}
921
922static int mmc_read_bkops_status(struct mmc_card *card) 894static int mmc_read_bkops_status(struct mmc_card *card)
923{ 895{
924 int err; 896 int err;
@@ -935,22 +907,17 @@ static int mmc_read_bkops_status(struct mmc_card *card)
935} 907}
936 908
937/** 909/**
938 * mmc_start_bkops - start BKOPS for supported cards 910 * mmc_run_bkops - Run BKOPS for supported cards
939 * @card: MMC card to start BKOPS 911 * @card: MMC card to run BKOPS for
940 * @from_exception: A flag to indicate if this function was
941 * called due to an exception raised by the card
942 * 912 *
943 * Start background operations whenever requested. 913 * Run background operations synchronously for cards having manual BKOPS
944 * When the urgent BKOPS bit is set in a R1 command response 914 * enabled and in case it reports urgent BKOPS level.
945 * then background operations should be started immediately.
946*/ 915*/
947void mmc_start_bkops(struct mmc_card *card, bool from_exception) 916void mmc_run_bkops(struct mmc_card *card)
948{ 917{
949 int err; 918 int err;
950 int timeout;
951 bool use_busy_signal;
952 919
953 if (!card->ext_csd.man_bkops_en || mmc_card_doing_bkops(card)) 920 if (!card->ext_csd.man_bkops_en)
954 return; 921 return;
955 922
956 err = mmc_read_bkops_status(card); 923 err = mmc_read_bkops_status(card);
@@ -960,44 +927,26 @@ void mmc_start_bkops(struct mmc_card *card, bool from_exception)
960 return; 927 return;
961 } 928 }
962 929
963 if (!card->ext_csd.raw_bkops_status) 930 if (!card->ext_csd.raw_bkops_status ||
931 card->ext_csd.raw_bkops_status < EXT_CSD_BKOPS_LEVEL_2)
964 return; 932 return;
965 933
966 if (card->ext_csd.raw_bkops_status < EXT_CSD_BKOPS_LEVEL_2 &&
967 from_exception)
968 return;
969
970 if (card->ext_csd.raw_bkops_status >= EXT_CSD_BKOPS_LEVEL_2) {
971 timeout = MMC_OPS_TIMEOUT_MS;
972 use_busy_signal = true;
973 } else {
974 timeout = 0;
975 use_busy_signal = false;
976 }
977
978 mmc_retune_hold(card->host); 934 mmc_retune_hold(card->host);
979 935
980 err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, 936 /*
981 EXT_CSD_BKOPS_START, 1, timeout, 0, 937 * For urgent BKOPS status, LEVEL_2 and higher, let's execute
982 use_busy_signal, true, false); 938 * synchronously. Future wise, we may consider to start BKOPS, for less
983 if (err) { 939 * urgent levels by using an asynchronous background task, when idle.
940 */
941 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
942 EXT_CSD_BKOPS_START, 1, MMC_OPS_TIMEOUT_MS);
943 if (err)
984 pr_warn("%s: Error %d starting bkops\n", 944 pr_warn("%s: Error %d starting bkops\n",
985 mmc_hostname(card->host), err); 945 mmc_hostname(card->host), err);
986 mmc_retune_release(card->host);
987 return;
988 }
989 946
990 /* 947 mmc_retune_release(card->host);
991 * For urgent bkops status (LEVEL_2 and more)
992 * bkops executed synchronously, otherwise
993 * the operation is in progress
994 */
995 if (!use_busy_signal)
996 mmc_card_set_doing_bkops(card);
997 else
998 mmc_retune_release(card->host);
999} 948}
1000EXPORT_SYMBOL(mmc_start_bkops); 949EXPORT_SYMBOL(mmc_run_bkops);
1001 950
1002/* 951/*
1003 * Flush the cache to the non-volatile storage. 952 * Flush the cache to the non-volatile storage.
diff --git a/drivers/mmc/core/mmc_ops.h b/drivers/mmc/core/mmc_ops.h
index a1390d486381..018a5e3f66d6 100644
--- a/drivers/mmc/core/mmc_ops.h
+++ b/drivers/mmc/core/mmc_ops.h
@@ -40,8 +40,7 @@ int __mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value,
40 bool use_busy_signal, bool send_status, bool retry_crc_err); 40 bool use_busy_signal, bool send_status, bool retry_crc_err);
41int mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value, 41int mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value,
42 unsigned int timeout_ms); 42 unsigned int timeout_ms);
43int mmc_stop_bkops(struct mmc_card *card); 43void mmc_run_bkops(struct mmc_card *card);
44void mmc_start_bkops(struct mmc_card *card, bool from_exception);
45int mmc_flush_cache(struct mmc_card *card); 44int mmc_flush_cache(struct mmc_card *card);
46int mmc_cmdq_enable(struct mmc_card *card); 45int mmc_cmdq_enable(struct mmc_card *card);
47int mmc_cmdq_disable(struct mmc_card *card); 46int mmc_cmdq_disable(struct mmc_card *card);