Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Avri Altman and committed by
Ulf Hansson
01904ff7 a2b760a6

+21 -11
+3 -9
drivers/mmc/core/block.c
··· 1124 1124 { 1125 1125 struct mmc_blk_data *md = mq->blkdata; 1126 1126 struct mmc_card *card = md->queue.card; 1127 - unsigned int from, nr, arg; 1127 + unsigned int from, nr; 1128 1128 int err = 0, type = MMC_BLK_DISCARD; 1129 1129 blk_status_t status = BLK_STS_OK; 1130 1130 ··· 1136 1136 from = blk_rq_pos(req); 1137 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 1139 do { 1146 1140 err = 0; 1147 1141 if (card->quirks & MMC_QUIRK_INAND_CMD38) { 1148 1142 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, 1149 1143 INAND_CMD38_ARG_EXT_CSD, 1150 - arg == MMC_TRIM_ARG ? 1144 + card->erase_arg == MMC_TRIM_ARG ? 1151 1145 INAND_CMD38_ARG_TRIM : 1152 1146 INAND_CMD38_ARG_ERASE, 1153 1147 0); 1154 1148 } 1155 1149 if (!err) 1156 - err = mmc_erase(card, from, nr, arg); 1150 + err = mmc_erase(card, from, nr, card->erase_arg); 1157 1151 } while (err == -EIO && !mmc_blk_reset(md, card->host, type)); 1158 1152 if (err) 1159 1153 status = BLK_STS_IOERR;
+2 -2
drivers/mmc/core/core.c
··· 2164 2164 * @card: card to erase 2165 2165 * @from: first sector to erase 2166 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 2169 * Caller must claim host before calling this function. 2170 2170 */ ··· 2181 2181 if (!card->erase_size) 2182 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 2185 return -EOPNOTSUPP; 2186 2186 2187 2187 if ((arg & MMC_SECURE_ARGS) &&
+8
drivers/mmc/core/mmc.c
··· 1743 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 1755 * Select timing interface 1748 1756 */
+2
drivers/mmc/core/sd.c
··· 271 271 } 272 272 } 273 273 274 + card->erase_arg = SD_ERASE_ARG; 275 + 274 276 return 0; 275 277 } 276 278
+1
include/linux/mmc/card.h
··· 277 277 unsigned int erase_shift; /* if erase unit is power 2 */ 278 278 unsigned int pref_erase; /* in sectors */ 279 279 unsigned int eg_boundary; /* don't cross erase-group boundaries */ 280 + unsigned int erase_arg; /* erase / trim / discard */ 280 281 u8 erased_byte; /* value of erased bytes */ 281 282 282 283 u32 raw_cid[4]; /* raw card CID */
+5
include/linux/mmc/sd.h
··· 91 91 #define SD_SWITCH_ACCESS_DEF 0 92 92 #define SD_SWITCH_ACCESS_HS 1 93 93 94 + /* 95 + * Erase/discard 96 + */ 97 + #define SD_ERASE_ARG 0x00000000 98 + 94 99 #endif /* LINUX_MMC_SD_H */