} else {
                        card->ext_csd.data_tag_unit_size = 0;
                }
+
+               card->ext_csd.max_packed_writes =
+                       ext_csd[EXT_CSD_MAX_PACKED_WRITES];
+               card->ext_csd.max_packed_reads =
+                       ext_csd[EXT_CSD_MAX_PACKED_READS];
        } else {
                card->ext_csd.data_sector_size = 512;
        }
                }
        }
 
+       /*
+        * The mandatory minimum values are defined for packed command.
+        * read: 5, write: 3
+        */
+       if (card->ext_csd.max_packed_writes >= 3 &&
+           card->ext_csd.max_packed_reads >= 5 &&
+           host->caps2 & MMC_CAP2_PACKED_CMD) {
+               err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
+                               EXT_CSD_EXP_EVENTS_CTRL,
+                               EXT_CSD_PACKED_EVENT_EN,
+                               card->ext_csd.generic_cmd6_time);
+               if (err && err != -EBADMSG)
+                       goto free_card;
+               if (err) {
+                       pr_warn("%s: Enabling packed event failed\n",
+                               mmc_hostname(card->host));
+                       card->ext_csd.packed_event_en = 0;
+                       err = 0;
+               } else {
+                       card->ext_csd.packed_event_en = 1;
+               }
+       }
+
        if (!oldcard)
                host->card = card;
 
 
 #define MMC_CAP2_HC_ERASE_SZ   (1 << 9)        /* High-capacity erase size */
 #define MMC_CAP2_CD_ACTIVE_HIGH        (1 << 10)       /* Card-detect signal active high */
 #define MMC_CAP2_RO_ACTIVE_HIGH        (1 << 11)       /* Write-protect signal active high */
+#define MMC_CAP2_PACKED_RD     (1 << 12)       /* Allow packed read */
+#define MMC_CAP2_PACKED_WR     (1 << 13)       /* Allow packed write */
+#define MMC_CAP2_PACKED_CMD    (MMC_CAP2_PACKED_RD | \
+                                MMC_CAP2_PACKED_WR)
 
        mmc_pm_flag_t           pm_caps;        /* supported pm features */
 
 
 #define R1_CURRENT_STATE(x)    ((x & 0x00001E00) >> 9) /* sx, b (4 bits) */
 #define R1_READY_FOR_DATA      (1 << 8)        /* sx, a */
 #define R1_SWITCH_ERROR                (1 << 7)        /* sx, c */
-#define R1_EXCEPTION_EVENT     (1 << 6)        /* sx, a */
+#define R1_EXCEPTION_EVENT     (1 << 6)        /* sr, a */
 #define R1_APP_CMD             (1 << 5)        /* sr, c */
 
 #define R1_STATE_IDLE  0
 #define EXT_CSD_FLUSH_CACHE            32      /* W */
 #define EXT_CSD_CACHE_CTRL             33      /* R/W */
 #define EXT_CSD_POWER_OFF_NOTIFICATION 34      /* R/W */
-#define EXT_CSD_EXP_EVENTS_STATUS      54      /* RO */
+#define EXT_CSD_PACKED_FAILURE_INDEX   35      /* RO */
+#define EXT_CSD_PACKED_CMD_STATUS      36      /* RO */
+#define EXT_CSD_EXP_EVENTS_STATUS      54      /* RO, 2 bytes */
+#define EXT_CSD_EXP_EVENTS_CTRL                56      /* R/W, 2 bytes */
 #define EXT_CSD_DATA_SECTOR_SIZE       61      /* R */
 #define EXT_CSD_GP_SIZE_MULT           143     /* R/W */
 #define EXT_CSD_PARTITION_ATTRIBUTE    156     /* R/W */
 #define EXT_CSD_CACHE_SIZE             249     /* RO, 4 bytes */
 #define EXT_CSD_TAG_UNIT_SIZE          498     /* RO */
 #define EXT_CSD_DATA_TAG_SUPPORT       499     /* RO */
+#define EXT_CSD_MAX_PACKED_WRITES      500     /* RO */
+#define EXT_CSD_MAX_PACKED_READS       501     /* RO */
 #define EXT_CSD_BKOPS_SUPPORT          502     /* RO */
 #define EXT_CSD_HPI_FEATURES           503     /* RO */
 
 #define EXT_CSD_PWR_CL_4BIT_MASK       0x0F    /* 8 bit PWR CLS */
 #define EXT_CSD_PWR_CL_8BIT_SHIFT      4
 #define EXT_CSD_PWR_CL_4BIT_SHIFT      0
+
+#define EXT_CSD_PACKED_EVENT_EN        BIT(3)
+
 /*
  * EXCEPTION_EVENT_STATUS field
  */
 #define EXT_CSD_SYSPOOL_EXHAUSTED      BIT(2)
 #define EXT_CSD_PACKED_FAILURE         BIT(3)
 
+#define EXT_CSD_PACKED_GENERIC_ERROR   BIT(0)
+#define EXT_CSD_PACKED_INDEXED_ERROR   BIT(1)
+
 /*
  * BKOPS status level
  */