aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAvri Altman <avri.altman@wdc.com>2019-02-06 06:28:05 -0500
committerUlf Hansson <ulf.hansson@linaro.org>2019-02-25 02:40:58 -0500
commit01904ff77676ca6c88e972906ed204a2dfbabab6 (patch)
tree713125d74fbb619d07ef3271a24a22688cbf80d6
parenta2b760a60194aaa754dc78dd037d81ee6c3508a1 (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.c12
-rw-r--r--drivers/mmc/core/core.c4
-rw-r--r--drivers/mmc/core/mmc.c8
-rw-r--r--drivers/mmc/core/sd.c2
-rw-r--r--include/linux/mmc/card.h1
-rw-r--r--include/linux/mmc/sd.h5
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 */