mmc: add erase, secure erase, trim and secure trim operations
[linux-2.6-block.git] / include / linux / mmc / card.h
index d02d2c6e0cfe474253a3c183d59219efa3b3af47..6b7525099e56a943f014c9fbfcc0c6bc45b62579 100644 (file)
@@ -24,12 +24,14 @@ struct mmc_cid {
 };
 
 struct mmc_csd {
+       unsigned char           structure;
        unsigned char           mmca_vsn;
        unsigned short          cmdclass;
        unsigned short          tacc_clks;
        unsigned int            tacc_ns;
        unsigned int            r2w_factor;
        unsigned int            max_dtr;
+       unsigned int            erase_size;             /* In sectors */
        unsigned int            read_blkbits;
        unsigned int            write_blkbits;
        unsigned int            capacity;
@@ -41,9 +43,16 @@ struct mmc_csd {
 
 struct mmc_ext_csd {
        u8                      rev;
+       u8                      erase_group_def;
+       u8                      sec_feature_support;
        unsigned int            sa_timeout;             /* Units: 100ns */
        unsigned int            hs_max_dtr;
        unsigned int            sectors;
+       unsigned int            hc_erase_size;          /* In sectors */
+       unsigned int            hc_erase_timeout;       /* In milliseconds */
+       unsigned int            sec_trim_mult;  /* Secure trim multiplier  */
+       unsigned int            sec_erase_mult; /* Secure erase multiplier */
+       unsigned int            trim_timeout;           /* In milliseconds */
 };
 
 struct sd_scr {
@@ -53,6 +62,12 @@ struct sd_scr {
 #define SD_SCR_BUS_WIDTH_4     (1<<2)
 };
 
+struct sd_ssr {
+       unsigned int            au;                     /* In sectors */
+       unsigned int            erase_timeout;          /* In milliseconds */
+       unsigned int            erase_offset;           /* In milliseconds */
+};
+
 struct sd_switch_caps {
        unsigned int            hs_max_dtr;
 };
@@ -92,6 +107,7 @@ struct mmc_card {
 #define MMC_TYPE_MMC           0               /* MMC card */
 #define MMC_TYPE_SD            1               /* SD card */
 #define MMC_TYPE_SDIO          2               /* SDIO card */
+#define MMC_TYPE_SD_COMBO      3               /* SD combo (IO+mem) card */
        unsigned int            state;          /* (our) card state */
 #define MMC_STATE_PRESENT      (1<<0)          /* present in sysfs */
 #define MMC_STATE_READONLY     (1<<1)          /* card is read-only */
@@ -101,6 +117,13 @@ struct mmc_card {
 #define MMC_QUIRK_LENIENT_FN0  (1<<0)          /* allow SDIO FN0 writes outside of the VS CCCR range */
 #define MMC_QUIRK_BLKSZ_FOR_BYTE_MODE (1<<1)   /* use func->cur_blksize */
                                                /* for byte mode */
+#define MMC_QUIRK_NONSTD_SDIO  (1<<2)          /* non-standard SDIO card attached */
+                                               /* (missing CIA registers) */
+
+       unsigned int            erase_size;     /* erase size in sectors */
+       unsigned int            erase_shift;    /* if erase unit is power 2 */
+       unsigned int            pref_erase;     /* in sectors */
+       u8                      erased_byte;    /* value of erased bytes */
 
        u32                     raw_cid[4];     /* raw card CID */
        u32                     raw_csd[4];     /* raw card CSD */
@@ -109,6 +132,7 @@ struct mmc_card {
        struct mmc_csd          csd;            /* card specific */
        struct mmc_ext_csd      ext_csd;        /* mmc v4 extended card specific */
        struct sd_scr           scr;            /* extra SD information */
+       struct sd_ssr           ssr;            /* yet more SD information */
        struct sd_switch_caps   sw_caps;        /* switch (CMD6) caps */
 
        unsigned int            sdio_funcs;     /* number of SDIO functions */