This patch makes it possible to load e.g. kernels located above 4 GiB on
SDHC cards. The block number is no longer converted to a byte offset on SDHC
cards.

Signed-off-by: Rask Ingemann Lambertsen <[email protected]>

---

diff --git a/board/neo1973/gta02/glamo-mmc.c b/board/neo1973/gta02/glamo-mmc.c
index 33dc6bb..adb0d8f 100644
--- a/board/neo1973/gta02/glamo-mmc.c
+++ b/board/neo1973/gta02/glamo-mmc.c
@@ -89,18 +89,6 @@ unsigned char CRC7(u8 * pu8, int cnt)
        return (crc << 1) | 1;
 }
 
-ulong mmc_bread(int dev_num, ulong blknr, ulong blkcnt, void *dst)
-{
-       ulong src = blknr * MMC_BLOCK_SIZE;
-
-       if (!blkcnt)
-               return 0;
-
-/*     printf("mmc_bread(%d, %ld, %ld, %p)\n", dev_num, blknr, blkcnt, dst); */
-       mmc_read(src, dst, blkcnt * MMC_BLOCK_SIZE);
-       return blkcnt;
-}
-
 /* MMC_DEFAULT_RCA should probably be just 1, but this may break other code
    that expects it to be shifted. */
 static u_int16_t rca = MMC_DEFAULT_RCA >> 16;
@@ -406,7 +394,8 @@ static u_int8_t ldo_voltage(unsigned int millivolts)
        return millivolts / 100;
 }
 
-int mmc_read(ulong src, uchar *dst, int size)
+static
+int glamo_mmc_read(ulong src, uint blksize, uchar *dst, int size)
 {
        int resp;
        u8 response[16];
@@ -429,17 +418,23 @@ int mmc_read(ulong src, uchar *dst, int size)
        while (size) {
                switch (card_type) {
                case CARDTYPE_SDHC: /* block addressing */
+                       if (blksize != MMC_BLOCK_SIZE) {
+                               printf("Bad align on src\n");
+                               return 0;
+                       }
                        resp = mmc_cmd(MMC_READ_SINGLE_BLOCK,
-                                      src >> MMC_BLOCK_SIZE_BITS,
+                                      src,
                                       MMC_CMD_ADTC | MMC_RSP_R1 |
                                       MMC_DATA_READ, MMC_BLOCK_SIZE, 1, 0,
                                       (u16 *)&response[0]);
+                       src += 1;
                        break;
                default: /* byte addressing */
-                       resp = mmc_cmd(MMC_READ_SINGLE_BLOCK, src,
+                       resp = mmc_cmd(MMC_READ_SINGLE_BLOCK, src * blksize,
                                MMC_CMD_ADTC | MMC_RSP_R1 | MMC_DATA_READ,
                                MMC_BLOCK_SIZE, 1, 0,
                                (u16 *)&response[0]);
+                       src += MMC_BLOCK_SIZE / blksize;
                        break;
                }
                do_pio_read((u16 *)dst, MMC_BLOCK_SIZE >> 1);
@@ -449,11 +444,31 @@ int mmc_read(ulong src, uchar *dst, int size)
                else
                        size = 0;
                dst += MMC_BLOCK_SIZE;
-               src += MMC_BLOCK_SIZE;
        }
        return size_original;
 }
 
+ulong mmc_bread(int dev_num, ulong blknr, ulong blkcnt, void *dst)
+{
+       ulong size = blkcnt * MMC_BLOCK_SIZE;
+
+       if (!blkcnt)
+               return 0;
+
+/*     printf("mmc_bread(%d, %ld, %ld, %p)\n", dev_num, blknr, blkcnt, dst); */
+       glamo_mmc_read(blknr, MMC_BLOCK_SIZE, dst, size);
+       return blkcnt;
+}
+
+int mmc_read(ulong src, uchar *dst, int size)
+{
+        if (src & (MMC_BLOCK_SIZE - 1))
+                return (glamo_mmc_read (src, 1, dst, size));
+        else
+                return (glamo_mmc_read (src >> MMC_BLOCK_SIZE_BITS,
+                                        MMC_BLOCK_SIZE, dst, size));
+}
+
 int mmc_write(uchar *src, ulong dst, int size)
 {
        int resp;


-- 
Rask Ingemann Lambertsen
Danish law requires addresses in e-mail to be logged and stored for a year

Reply via email to