mmc: Fix erase_grp_size for partitioned card
authorOliver Metz <oliver@freetz.org>
Tue, 1 Oct 2013 18:32:07 +0000 (20:32 +0200)
committerPantelis Antoniou <panto@antoniou-consulting.com>
Thu, 31 Oct 2013 07:55:33 +0000 (09:55 +0200)
EXT_CSD_ERASE_GROUP_DEF is lost every time after a reset or
 power off. Set it if device has enhanced partitions.

Signed-off-by: Oliver Metz <oliver@freetz.org>
Acked-by: Pantelis Antoniou <panto@antoniou-consulting.com>
drivers/mmc/mmc.c
include/mmc.h

index 84dae4d8bd8055d9f5cd78a6b421d7413a61f24c..e1461a98dd96e875558ee9713d735235d072711a 100644 (file)
@@ -960,15 +960,24 @@ static int mmc_startup(struct mmc *mmc)
                }
 
                /*
-                * Check whether GROUP_DEF is set, if yes, read out
-                * group size from ext_csd directly, or calculate
-                * the group size from the csd value.
+                * Host needs to enable ERASE_GRP_DEF bit if device is
+                * partitioned. This bit will be lost every time after a reset
+                * or power off. This will affect erase size.
                 */
-               if (ext_csd[EXT_CSD_ERASE_GROUP_DEF]) {
+               if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) &&
+                   (ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE] & PART_ENH_ATTRIB)) {
+                       err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
+                               EXT_CSD_ERASE_GROUP_DEF, 1);
+
+                       if (err)
+                               return err;
+
+                       /* Read out group size from ext_csd */
                        mmc->erase_grp_size =
                                ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] *
                                        MMC_MAX_BLOCK_LEN * 1024;
                } else {
+                       /* Calculate the group size from the csd value. */
                        int erase_gsz, erase_gmul;
                        erase_gsz = (mmc->csd[2] & 0x00007c00) >> 10;
                        erase_gmul = (mmc->csd[2] & 0x000003e0) >> 5;
index 214b9edc8d22144b009178af3e13829ccc92ebe5..cb558da63d8307024d88002de8daecb28cddd834 100644 (file)
  * EXT_CSD fields
  */
 #define EXT_CSD_GP_SIZE_MULT           143     /* R/W */
+#define EXT_CSD_PARTITIONS_ATTRIBUTE   156     /* R/W */
 #define EXT_CSD_PARTITIONING_SUPPORT   160     /* RO */
 #define EXT_CSD_RPMB_MULT              168     /* RO */
 #define EXT_CSD_ERASE_GROUP_DEF                175     /* R/W */
 #define MMCPART_NOAVAILABLE    (0xff)
 #define PART_ACCESS_MASK       (0x7)
 #define PART_SUPPORT           (0x1)
+#define PART_ENH_ATTRIB                (0x1f)
 
 /* Maximum block size for MMC */
 #define MMC_MAX_BLOCK_LEN      512