aboutsummaryrefslogtreecommitdiff
path: root/drivers/mmc/core/mmc.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mmc/core/mmc.c')
-rw-r--r--drivers/mmc/core/mmc.c32
1 files changed, 21 insertions, 11 deletions
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
index 13ff8330..630fc6c1 100644
--- a/drivers/mmc/core/mmc.c
+++ b/drivers/mmc/core/mmc.c
@@ -697,6 +697,12 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd)
card->ext_csd.enhanced_rpmb_supported =
(card->ext_csd.rel_param &
EXT_CSD_WR_REL_PARAM_EN_RPMB_REL_WR);
+
+ card->ext_csd.ffu_capable =
+ ((ext_csd[EXT_CSD_SUPPORTED_MODE] & 0x1) == 0x1) &&
+ ((ext_csd[EXT_CSD_FW_CONFIG] & 0x1) == 0x0);
+ card->ext_csd.ffu_mode_op = ext_csd[EXT_CSD_FFU_FEATURES];
+
} else {
card->ext_csd.cmdq_support = 0;
card->ext_csd.cmdq_depth = 0;
@@ -812,6 +818,7 @@ MMC_DEV_ATTR(raw_rpmb_size_mult, "%#x\n", card->ext_csd.raw_rpmb_size_mult);
MMC_DEV_ATTR(enhanced_rpmb_supported, "%#x\n",
card->ext_csd.enhanced_rpmb_supported);
MMC_DEV_ATTR(rel_sectors, "%#x\n", card->ext_csd.rel_sectors);
+MMC_DEV_ATTR(firmware_version, "0x%08x\n", card->ext_csd.fw_version);
static struct attribute *mmc_std_attrs[] = {
&dev_attr_cid.attr,
@@ -831,6 +838,7 @@ static struct attribute *mmc_std_attrs[] = {
&dev_attr_raw_rpmb_size_mult.attr,
&dev_attr_enhanced_rpmb_supported.attr,
&dev_attr_rel_sectors.attr,
+ &dev_attr_firmware_version.attr,
NULL,
};
ATTRIBUTE_GROUPS(mmc_std);
@@ -1616,10 +1624,11 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
struct mmc_card *oldcard)
{
struct mmc_card *card;
- int err;
+ int err = 0;
u32 cid[4];
u32 rocr;
u8 *ext_csd = NULL;
+ bool scan = (oldcard == NULL);
BUG_ON(!host);
WARN_ON(!host->claimed);
@@ -1672,6 +1681,15 @@ reinit:
}
if (oldcard) {
+ if (oldcard->raw_cid[0] == 0 && oldcard->raw_cid[1] == 0 &&
+ oldcard->raw_cid[2] == 0 && oldcard->raw_cid[3] == 0) {
+ scan = true;
+ pr_info("%s: updating card identification\n", mmc_hostname(host));
+ memcpy(oldcard->raw_cid, cid, sizeof(oldcard->raw_cid));
+ err = mmc_decode_cid(oldcard);
+ if (err)
+ goto err;
+ }
if (memcmp(cid, oldcard->raw_cid, sizeof(cid)) != 0) {
err = -ENOENT;
pr_err("%s: %s: CID memcmp failed %d\n",
@@ -1714,7 +1732,7 @@ reinit:
mmc_set_bus_mode(host, MMC_BUSMODE_PUSHPULL);
}
- if (!oldcard) {
+ if (scan) {
/*
* Fetch CSD from card.
*/
@@ -1758,7 +1776,7 @@ reinit:
}
}
- if (!oldcard) {
+ if (scan) {
/*
* Fetch and process extended CSD.
*/
@@ -2378,11 +2396,6 @@ static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
goto out;
}
- if (mmc_card_doing_auto_bkops(host->card)) {
- err = mmc_set_auto_bkops(host->card, false);
- if (err)
- goto out;
- }
err = mmc_flush_cache(host->card);
if (err)
@@ -2463,9 +2476,6 @@ static int mmc_partial_init(struct mmc_host *host)
pr_debug("%s: %s: reading and comparing ext_csd successful\n",
mmc_hostname(host), __func__);
- if (mmc_card_support_auto_bkops(host->card))
- (void)mmc_set_auto_bkops(host->card, true);
-
if (card->ext_csd.cmdq_support && (card->host->caps2 &
MMC_CAP2_CMD_QUEUE)) {
err = mmc_select_cmdq(card);