diff options
author | Avri Altman <avri.altman@wdc.com> | 2019-02-06 06:28:05 -0500 |
---|---|---|
committer | Ulf Hansson <ulf.hansson@linaro.org> | 2019-02-25 02:40:58 -0500 |
commit | 01904ff77676ca6c88e972906ed204a2dfbabab6 (patch) | |
tree | 713125d74fbb619d07ef3271a24a22688cbf80d6 | |
parent | a2b760a60194aaa754dc78dd037d81ee6c3508a1 (diff) |
mmc: core: Calculate the discard arg only once
In MMC, the discard arg is a read-only ext_csd parameter - set it once
on card init. To be consistent, do that for SD as well even though its
discard arg is always 0x0.
Signed-off-by: Avri Altman <avri.altman@wdc.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
-rw-r--r-- | drivers/mmc/core/block.c | 12 | ||||
-rw-r--r-- | drivers/mmc/core/core.c | 4 | ||||
-rw-r--r-- | drivers/mmc/core/mmc.c | 8 | ||||
-rw-r--r-- | drivers/mmc/core/sd.c | 2 | ||||
-rw-r--r-- | include/linux/mmc/card.h | 1 | ||||
-rw-r--r-- | include/linux/mmc/sd.h | 5 |
6 files changed, 21 insertions, 11 deletions
diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c index dc55bdfede92..54a7b7410441 100644 --- a/drivers/mmc/core/block.c +++ b/drivers/mmc/core/block.c | |||
@@ -1124,7 +1124,7 @@ static void mmc_blk_issue_discard_rq(struct mmc_queue *mq, struct request *req) | |||
1124 | { | 1124 | { |
1125 | struct mmc_blk_data *md = mq->blkdata; | 1125 | struct mmc_blk_data *md = mq->blkdata; |
1126 | struct mmc_card *card = md->queue.card; | 1126 | struct mmc_card *card = md->queue.card; |
1127 | unsigned int from, nr, arg; | 1127 | unsigned int from, nr; |
1128 | int err = 0, type = MMC_BLK_DISCARD; | 1128 | int err = 0, type = MMC_BLK_DISCARD; |
1129 | blk_status_t status = BLK_STS_OK; | 1129 | blk_status_t status = BLK_STS_OK; |
1130 | 1130 | ||
@@ -1136,24 +1136,18 @@ static void mmc_blk_issue_discard_rq(struct mmc_queue *mq, struct request *req) | |||
1136 | from = blk_rq_pos(req); | 1136 | from = blk_rq_pos(req); |
1137 | nr = blk_rq_sectors(req); | 1137 | nr = blk_rq_sectors(req); |
1138 | 1138 | ||
1139 | if (mmc_can_discard(card)) | ||
1140 | arg = MMC_DISCARD_ARG; | ||
1141 | else if (mmc_can_trim(card)) | ||
1142 | arg = MMC_TRIM_ARG; | ||
1143 | else | ||
1144 | arg = MMC_ERASE_ARG; | ||
1145 | do { | 1139 | do { |
1146 | err = 0; | 1140 | err = 0; |
1147 | if (card->quirks & MMC_QUIRK_INAND_CMD38) { | 1141 | if (card->quirks & MMC_QUIRK_INAND_CMD38) { |
1148 | err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, | 1142 | err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, |
1149 | INAND_CMD38_ARG_EXT_CSD, | 1143 | INAND_CMD38_ARG_EXT_CSD, |
1150 | arg == MMC_TRIM_ARG ? | 1144 | card->erase_arg == MMC_TRIM_ARG ? |
1151 | INAND_CMD38_ARG_TRIM : | 1145 | INAND_CMD38_ARG_TRIM : |
1152 | INAND_CMD38_ARG_ERASE, | 1146 | INAND_CMD38_ARG_ERASE, |
1153 | 0); | 1147 | 0); |
1154 | } | 1148 | } |
1155 | if (!err) | 1149 | if (!err) |
1156 | err = mmc_erase(card, from, nr, arg); | 1150 | err = mmc_erase(card, from, nr, card->erase_arg); |
1157 | } while (err == -EIO && !mmc_blk_reset(md, card->host, type)); | 1151 | } while (err == -EIO && !mmc_blk_reset(md, card->host, type)); |
1158 | if (err) | 1152 | if (err) |
1159 | status = BLK_STS_IOERR; | 1153 | status = BLK_STS_IOERR; |
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 5bd58b95d318..de0f1a1f0a63 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c | |||
@@ -2164,7 +2164,7 @@ static unsigned int mmc_align_erase_size(struct mmc_card *card, | |||
2164 | * @card: card to erase | 2164 | * @card: card to erase |
2165 | * @from: first sector to erase | 2165 | * @from: first sector to erase |
2166 | * @nr: number of sectors to erase | 2166 | * @nr: number of sectors to erase |
2167 | * @arg: erase command argument (SD supports only %MMC_ERASE_ARG) | 2167 | * @arg: erase command argument (SD supports only %SD_ERASE_ARG) |
2168 | * | 2168 | * |
2169 | * Caller must claim host before calling this function. | 2169 | * Caller must claim host before calling this function. |
2170 | */ | 2170 | */ |
@@ -2181,7 +2181,7 @@ int mmc_erase(struct mmc_card *card, unsigned int from, unsigned int nr, | |||
2181 | if (!card->erase_size) | 2181 | if (!card->erase_size) |
2182 | return -EOPNOTSUPP; | 2182 | return -EOPNOTSUPP; |
2183 | 2183 | ||
2184 | if (mmc_card_sd(card) && arg != MMC_ERASE_ARG) | 2184 | if (mmc_card_sd(card) && arg != SD_ERASE_ARG) |
2185 | return -EOPNOTSUPP; | 2185 | return -EOPNOTSUPP; |
2186 | 2186 | ||
2187 | if ((arg & MMC_SECURE_ARGS) && | 2187 | if ((arg & MMC_SECURE_ARGS) && |
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index da892a599524..09c688f5ff65 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c | |||
@@ -1743,6 +1743,14 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, | |||
1743 | card->ext_csd.power_off_notification = EXT_CSD_POWER_ON; | 1743 | card->ext_csd.power_off_notification = EXT_CSD_POWER_ON; |
1744 | } | 1744 | } |
1745 | 1745 | ||
1746 | /* set erase_arg */ | ||
1747 | if (mmc_can_discard(card)) | ||
1748 | card->erase_arg = MMC_DISCARD_ARG; | ||
1749 | else if (mmc_can_trim(card)) | ||
1750 | card->erase_arg = MMC_TRIM_ARG; | ||
1751 | else | ||
1752 | card->erase_arg = MMC_ERASE_ARG; | ||
1753 | |||
1746 | /* | 1754 | /* |
1747 | * Select timing interface | 1755 | * Select timing interface |
1748 | */ | 1756 | */ |
diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c index d0d9f90e7cdf..bd48b28d641b 100644 --- a/drivers/mmc/core/sd.c +++ b/drivers/mmc/core/sd.c | |||
@@ -271,6 +271,8 @@ static int mmc_read_ssr(struct mmc_card *card) | |||
271 | } | 271 | } |
272 | } | 272 | } |
273 | 273 | ||
274 | card->erase_arg = SD_ERASE_ARG; | ||
275 | |||
274 | return 0; | 276 | return 0; |
275 | } | 277 | } |
276 | 278 | ||
diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index 8ef330027b13..e2bbceb80725 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h | |||
@@ -277,6 +277,7 @@ struct mmc_card { | |||
277 | unsigned int erase_shift; /* if erase unit is power 2 */ | 277 | unsigned int erase_shift; /* if erase unit is power 2 */ |
278 | unsigned int pref_erase; /* in sectors */ | 278 | unsigned int pref_erase; /* in sectors */ |
279 | unsigned int eg_boundary; /* don't cross erase-group boundaries */ | 279 | unsigned int eg_boundary; /* don't cross erase-group boundaries */ |
280 | unsigned int erase_arg; /* erase / trim / discard */ | ||
280 | u8 erased_byte; /* value of erased bytes */ | 281 | u8 erased_byte; /* value of erased bytes */ |
281 | 282 | ||
282 | u32 raw_cid[4]; /* raw card CID */ | 283 | u32 raw_cid[4]; /* raw card CID */ |
diff --git a/include/linux/mmc/sd.h b/include/linux/mmc/sd.h index 1ebcf9ba1256..1a6d10fdf682 100644 --- a/include/linux/mmc/sd.h +++ b/include/linux/mmc/sd.h | |||
@@ -91,4 +91,9 @@ | |||
91 | #define SD_SWITCH_ACCESS_DEF 0 | 91 | #define SD_SWITCH_ACCESS_DEF 0 |
92 | #define SD_SWITCH_ACCESS_HS 1 | 92 | #define SD_SWITCH_ACCESS_HS 1 |
93 | 93 | ||
94 | /* | ||
95 | * Erase/discard | ||
96 | */ | ||
97 | #define SD_ERASE_ARG 0x00000000 | ||
98 | |||
94 | #endif /* LINUX_MMC_SD_H */ | 99 | #endif /* LINUX_MMC_SD_H */ |