aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mmc
diff options
context:
space:
mode:
authorLukas Czerner <lczerner@redhat.com>2014-06-18 07:18:07 -0400
committerUlf Hansson <ulf.hansson@linaro.org>2014-07-26 05:13:39 -0400
commit5204d00f06ac9af4ef9c469cce7f9bbe179739b1 (patch)
treeca75ded1e602effb1e55174ef6b908a2504dc6a8 /drivers/mmc
parent6096d7a8c185f9267d6873ba770feb4948899e79 (diff)
mmc: Do not advertise secure discard if it is blacklisted
Currently when the device secure discard implementation is blacklisted (MMC_QUIRK_SEC_ERASE_TRIM_BROKEN quirk is set) instead of secure discard we're going to do normal discard, which is wrong. When the secure discard is known to be broken we should just disallow it entirely and not advertise this functionality to the user. Fix it. Also move mmc_fixup_device() in from of mmc_blk_alloc() so we can get quirks set before we attempt to set queue information. Signed-off-by: Lukas Czerner <lczerner@redhat.com> Acked-by: Jaehoon Chung <jh80.chung@samsung.com> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Diffstat (limited to 'drivers/mmc')
-rw-r--r--drivers/mmc/card/block.c6
-rw-r--r--drivers/mmc/core/core.c3
2 files changed, 5 insertions, 4 deletions
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
index 452782bffebc..ede41f05c392 100644
--- a/drivers/mmc/card/block.c
+++ b/drivers/mmc/card/block.c
@@ -2028,8 +2028,7 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
2028 /* complete ongoing async transfer before issuing discard */ 2028 /* complete ongoing async transfer before issuing discard */
2029 if (card->host->areq) 2029 if (card->host->areq)
2030 mmc_blk_issue_rw_rq(mq, NULL); 2030 mmc_blk_issue_rw_rq(mq, NULL);
2031 if (req->cmd_flags & REQ_SECURE && 2031 if (req->cmd_flags & REQ_SECURE)
2032 !(card->quirks & MMC_QUIRK_SEC_ERASE_TRIM_BROKEN))
2033 ret = mmc_blk_issue_secdiscard_rq(mq, req); 2032 ret = mmc_blk_issue_secdiscard_rq(mq, req);
2034 else 2033 else
2035 ret = mmc_blk_issue_discard_rq(mq, req); 2034 ret = mmc_blk_issue_discard_rq(mq, req);
@@ -2432,6 +2431,8 @@ static int mmc_blk_probe(struct mmc_card *card)
2432 if (!(card->csd.cmdclass & CCC_BLOCK_READ)) 2431 if (!(card->csd.cmdclass & CCC_BLOCK_READ))
2433 return -ENODEV; 2432 return -ENODEV;
2434 2433
2434 mmc_fixup_device(card, blk_fixups);
2435
2435 md = mmc_blk_alloc(card); 2436 md = mmc_blk_alloc(card);
2436 if (IS_ERR(md)) 2437 if (IS_ERR(md))
2437 return PTR_ERR(md); 2438 return PTR_ERR(md);
@@ -2446,7 +2447,6 @@ static int mmc_blk_probe(struct mmc_card *card)
2446 goto out; 2447 goto out;
2447 2448
2448 mmc_set_drvdata(card, md); 2449 mmc_set_drvdata(card, md);
2449 mmc_fixup_device(card, blk_fixups);
2450 2450
2451 if (mmc_add_disk(md)) 2451 if (mmc_add_disk(md))
2452 goto out; 2452 goto out;
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
index 7dc0c85fdb60..d03a080fb9cd 100644
--- a/drivers/mmc/core/core.c
+++ b/drivers/mmc/core/core.c
@@ -2102,7 +2102,8 @@ EXPORT_SYMBOL(mmc_can_sanitize);
2102 2102
2103int mmc_can_secure_erase_trim(struct mmc_card *card) 2103int mmc_can_secure_erase_trim(struct mmc_card *card)
2104{ 2104{
2105 if (card->ext_csd.sec_feature_support & EXT_CSD_SEC_ER_EN) 2105 if ((card->ext_csd.sec_feature_support & EXT_CSD_SEC_ER_EN) &&
2106 !(card->quirks & MMC_QUIRK_SEC_ERASE_TRIM_BROKEN))
2106 return 1; 2107 return 1;
2107 return 0; 2108 return 0;
2108} 2109}