MMC 4.4 Spec JEDEC Standard No. 84-A44 says CMD1 response from card
has bit 30 set if card is high capacity.  (page 111 - Section 8.1)

Toshiba flash <= 2GB has EXT_CSD sectors but does not support
High Capacity but because of bad test -- card was put into sector mode
causing failure.

Signed-off-by: Philip Rakity <prak...@marvell.com>

diff -ru linux-2.6.32.8/drivers/mmc/core/mmc.c linux-2.6.32.8 
copy/drivers/mmc/core/mmc.c
--- linux-2.6.32.8/drivers/mmc/core/mmc.c       2010-02-09 04:57:19.000000000 
-0800
+++ linux-2.6.32.8 copy/drivers/mmc/core/mmc.c  2010-03-11 14:15:03.000000000 
-0800
@@ -221,8 +221,6 @@
                        ext_csd[EXT_CSD_SEC_CNT + 1] << 8 |
                        ext_csd[EXT_CSD_SEC_CNT + 2] << 16 |
                        ext_csd[EXT_CSD_SEC_CNT + 3] << 24;
-               if (card->ext_csd.sectors)
-                       mmc_card_set_blockaddr(card);
        }
 
        switch (ext_csd[EXT_CSD_CARD_TYPE]) {
@@ -306,6 +304,7 @@
        int err;
        u32 cid[4];
        unsigned int max_dtr;
+       u32 rocr;
 
        BUG_ON(!host);
        WARN_ON(!host->claimed);
@@ -319,7 +318,7 @@
        mmc_go_idle(host);
 
        /* The extra bit indicates that we support high capacity */
-       err = mmc_send_op_cond(host, ocr | (1 << 30), NULL);
+       err = mmc_send_op_cond(host, ocr | MMC_CARD_SECTOR_ADDR, &rocr);
        if (err)
                goto err;
 
@@ -407,6 +406,9 @@
                err = mmc_read_ext_csd(card);
                if (err)
                        goto free_card;
+
+               if(rocr & MMC_CARD_SECTOR_ADDR)
+                 mmc_card_set_blockaddr(card);
        }
 
        /*
diff -ru linux-2.6.32.8/include/linux/mmc/mmc.h linux-2.6.32.8 
copy/include/linux/mmc/mmc.h
--- linux-2.6.32.8/include/linux/mmc/mmc.h      2010-02-09 04:57:19.000000000 
-0800
+++ linux-2.6.32.8 copy/include/linux/mmc/mmc.h 2010-03-11 13:47:00.000000000 
-0800
@@ -202,6 +202,7 @@
  * OCR bits are mostly in host.h
  */
 #define MMC_CARD_BUSY  0x80000000      /* Card Power up status bit */
+#define MMC_CARD_SECTOR_ADDR   0x40000000      /* Card supports sectors */
 
 /*
  * Card Command Classes (CCC)

Attachment: eMMCHighCapacity.patch
Description: eMMCHighCapacity.patch

Reply via email to