DBG("tsac %d ms nsac %d clk\n",
                data->timeout_ns / 1000000, data->timeout_clks);
 
+       /* Sanity checks */
+       BUG_ON(data->blksz * data->blocks > 524288);
+
        /* timeout in us */
        target_timeout = data->timeout_ns / 1000 +
                data->timeout_clks / host->clock;
                host->remain = host->cur_sg->length;
        }
 
-       writew(data->blksz, host->ioaddr + SDHCI_BLOCK_SIZE);
+       /* We do not handle DMA boundaries, so set it to max (512 KiB) */
+       writew(SDHCI_MAKE_BLKSZ(7, data->blksz),
+               host->ioaddr + SDHCI_BLOCK_SIZE);
        writew(data->blocks, host->ioaddr + SDHCI_BLOCK_COUNT);
 }
 
        mmc->max_phys_segs = 16;
 
        /*
-        * Maximum number of sectors in one transfer. Limited by sector
-        * count register.
+        * Maximum number of sectors in one transfer. Limited by DMA boundary
+        * size (512KiB), which means (512 KiB/512=) 1024 entries.
         */
-       mmc->max_sectors = 0x3FFF;
+       mmc->max_sectors = 1024;
 
        /*
         * Maximum segment size. Could be one segment with the maximum number
 
 #define SDHCI_DMA_ADDRESS      0x00
 
 #define SDHCI_BLOCK_SIZE       0x04
+#define  SDHCI_MAKE_BLKSZ(dma, blksz) (((dma & 0x7) << 12) | (blksz & 0xFFF))
 
 #define SDHCI_BLOCK_COUNT      0x06