Improve glamo-mmc so that it uses MMC_READ_MULTIPLE_BLOCK and copes with
64 blocks in one command (and STOP sent after each set), instead of sending
a new command per-block

Signed-off-by: Andy Green <[EMAIL PROTECTED]>
---

 src/drivers/glamo-mmc.c |   33 +++++++++++++++++++++++++--------
 1 files changed, 25 insertions(+), 8 deletions(-)

diff --git a/src/drivers/glamo-mmc.c b/src/drivers/glamo-mmc.c
index 4df2ec6..be6b6e2 100644
--- a/src/drivers/glamo-mmc.c
+++ b/src/drivers/glamo-mmc.c
@@ -47,6 +47,9 @@ static int mmc_ready = 0;
 //static int wide = 0;
 static enum card_type card_type = CARDTYPE_NONE;
 
+
+#define MULTI_READ_BLOCKS_PER_COMMAND 64
+
 int mmc_read(unsigned long src, u8 *dst, int size);
 
 #define UNSTUFF_BITS(resp,start,size)                                   \
@@ -422,6 +425,7 @@ int mmc_read(unsigned long src, u8 *dst, int size)
        int resp;
        u8 response[16];
        int size_original = size;
+       int lump;
 
        if (((int)dst) & 1) {
                puts("Bad align on dst\n");
@@ -435,18 +439,23 @@ int mmc_read(unsigned long src, u8 *dst, int size)
                return resp;
 
        while (size) {
+               /* glamo mmc times out as this increases too much */
+               lump = MULTI_READ_BLOCKS_PER_COMMAND;
+               if (lump > size)
+                       lump = size;
+
                switch (card_type) {
                case CARDTYPE_SDHC: /* block addressing */
-                       resp = mmc_cmd(MMC_READ_SINGLE_BLOCK,
+                       resp = mmc_cmd(MMC_READ_MULTIPLE_BLOCK,
                                       src,
                                       MMC_CMD_ADTC | MMC_RSP_R1 |
-                                      MMC_DATA_READ, MMC_BLOCK_SIZE, 1, 0,
+                                      MMC_DATA_READ, MMC_BLOCK_SIZE, lump, 1,
                                       (u16 *)&response[0]);
                        break;
                default: /* byte addressing */
-                       resp = mmc_cmd(MMC_READ_SINGLE_BLOCK, src * 
MMC_BLOCK_SIZE,
+                       resp = mmc_cmd(MMC_READ_MULTIPLE_BLOCK, src * 
MMC_BLOCK_SIZE,
                                MMC_CMD_ADTC | MMC_RSP_R1 | MMC_DATA_READ,
-                               MMC_BLOCK_SIZE, 1, 0,
+                               MMC_BLOCK_SIZE, lump, 1,
                                (u16 *)&response[0]);
                        break;
                }
@@ -459,14 +468,22 @@ int mmc_read(unsigned long src, u8 *dst, int size)
                                             0xff00) | 2, GLAMO_REG_CLOCK_GEN8);
 
 
-               do_pio_read((u16 *)dst, MMC_BLOCK_SIZE >> 1);
+               do_pio_read((u16 *)dst, lump * MMC_BLOCK_SIZE >> 1);
 
                if (size)
-                       size--;
+                       size -= lump;
+
+               dst += lump * MMC_BLOCK_SIZE;
+               src += lump;
+
+               resp = mmc_cmd(MMC_STOP_TRANSMISSION, 0,
+                       MMC_CMD_AC | MMC_RSP_R1B, 0, 0, 0,
+                       (u16 *)&response[0]);
+               if (resp)
+                       return resp;
 
-               dst += MMC_BLOCK_SIZE;
-               src++;
        }
+
        return size_original;
 }
 


Reply via email to