From 218243389f6f46420e3bac18e73b08919498b542 Mon Sep 17 00:00:00 2001 From: lintao Date: Wed, 22 Oct 2014 14:59:23 +0800 Subject: [PATCH] mmc: Hynix 4.41 iNAND no trim quirk patch from mediatek --- drivers/mmc/card/block.c | 5 +++++ drivers/mmc/core/core.c | 3 ++- include/linux/mmc/card.h | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index 8d4d8837fb00..a5eb95bc4717 100755 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -2318,6 +2318,7 @@ force_ro_fail: #define CID_MANFID_TOSHIBA 0x11 #define CID_MANFID_MICRON 0x13 #define CID_MANFID_SAMSUNG 0x15 +#define CID_MANFID_HYNIX 0x90 static const struct mmc_fixup blk_fixups[] = { @@ -2376,6 +2377,10 @@ static const struct mmc_fixup blk_fixups[] = MMC_FIXUP("VZL00M", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc, MMC_QUIRK_SEC_ERASE_TRIM_BROKEN), + /* Hynix 4.41 iNAND execute trim will lead boot up failed. */ + MMC_FIXUP(CID_NAME_ANY, CID_MANFID_HYNIX, CID_OEMID_ANY, add_quirk_mmc, + MMC_QUIRK_TRIM_UNSTABLE), + END_FIXUP }; diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index efc26a00665c..307fae48fd37 100755 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -2109,7 +2109,8 @@ EXPORT_SYMBOL(mmc_can_erase); int mmc_can_trim(struct mmc_card *card) { - if (card->ext_csd.sec_feature_support & EXT_CSD_SEC_GB_CL_EN) + if ((card->ext_csd.sec_feature_support & EXT_CSD_SEC_GB_CL_EN) && + !(card->quirks & MMC_QUIRK_TRIM_UNSTABLE)) return 1; return 0; } diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index cfa28593de91..cf89531adb59 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h @@ -276,6 +276,7 @@ struct mmc_card { #define MMC_QUIRK_LONG_READ_TIME (1<<9) /* Data read time > CSD says */ #define MMC_QUIRK_SEC_ERASE_TRIM_BROKEN (1<<10) /* Skip secure for erase/trim */ #define MMC_QUIRK_BROKEN_IRQ_POLLING (1<<11) /* Polling SDIO_CCCR_INTx could create a fake interrupt */ +#define MMC_QUIRK_TRIM_UNSTABLE (1<<28) /* Skip trim */ unsigned int erase_size; /* erase size in sectors */ unsigned int erase_shift; /* if erase unit is power 2 */ -- 2.34.1