Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F136921375
D19783.id55697.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D19783.id55697.diff
View Options
Index: sys/arm/allwinner/aw_mmc.c
===================================================================
--- sys/arm/allwinner/aw_mmc.c
+++ sys/arm/allwinner/aw_mmc.c
@@ -1104,10 +1104,17 @@
}
if (cmd->data->flags & MMC_DATA_WRITE)
cmdreg |= AW_MMC_CMDR_DIR_WRITE;
-
blksz = min(cmd->data->len, MMC_SECTOR_SIZE);
- AW_MMC_WRITE_4(sc, AW_MMC_BKSR, blksz);
- AW_MMC_WRITE_4(sc, AW_MMC_BYCR, cmd->data->len);
+#ifdef MMCCAM
+ if (cmd->data->block_count > 0) {
+ AW_MMC_WRITE_4(sc, AW_MMC_BKSR, cmd->data->block_size);
+ AW_MMC_WRITE_4(sc, AW_MMC_BYCR, cmd->data->len);
+ } else
+#endif
+ {
+ AW_MMC_WRITE_4(sc, AW_MMC_BKSR, blksz);
+ AW_MMC_WRITE_4(sc, AW_MMC_BYCR, cmd->data->len);
+ }
} else {
imask |= AW_MMC_INT_CMD_DONE;
}
Index: sys/dev/sdhci/sdhci.c
===================================================================
--- sys/dev/sdhci/sdhci.c
+++ sys/dev/sdhci/sdhci.c
@@ -496,7 +496,13 @@
buffer = slot->curcmd->data->data;
buffer += slot->offset;
/* Transfer one block at a time. */
- left = min(512, slot->curcmd->data->len - slot->offset);
+#ifdef MMCCAM
+ if (slot->curcmd->data->block_count > 0)
+ left = min(slot->curcmd->data->block_size,
+ slot->curcmd->data->len - slot->offset);
+ else
+#endif
+ left = min(512, slot->curcmd->data->len - slot->offset);
slot->offset += left;
/* If we are too fast, broken controllers return zeroes. */
@@ -539,7 +545,13 @@
buffer = slot->curcmd->data->data;
buffer += slot->offset;
/* Transfer one block at a time. */
- left = min(512, slot->curcmd->data->len - slot->offset);
+#ifdef MMCCAM
+ if (slot->curcmd->data->block_count > 0) {
+ left = min(slot->curcmd->data->block_size,
+ slot->curcmd->data->len - slot->offset);
+ } else
+#endif
+ left = min(512, slot->curcmd->data->len - slot->offset);
slot->offset += left;
/* Handle unaligned and aligned buffer cases. */
@@ -1623,9 +1635,9 @@
return;
mode = SDHCI_TRNS_BLK_CNT_EN;
- if (data->len > 512) {
+ if (data->len > 512 || data->block_count > 1) {
mode |= SDHCI_TRNS_MULTI;
- if (__predict_true(
+ if (data->block_count == 0 && __predict_true(
#ifdef MMCCAM
slot->ccb->mmcio.stop.opcode == MMC_STOP_TRANSMISSION &&
#else
@@ -1888,11 +1900,23 @@
}
/* Current data offset for both PIO and DMA. */
slot->offset = 0;
- /* Set block size and request border interrupts on the SDMA boundary. */
- blksz = SDHCI_MAKE_BLKSZ(slot->sdma_boundary, ulmin(data->len, 512));
+#ifdef MMCCAM
+ if (data->block_count > 0) {
+ /* Set block size and request border interrupts on the SDMA boundary. */
+ blksz = SDHCI_MAKE_BLKSZ(slot->sdma_boundary, data->block_size);
+ blkcnt = data->block_count;
+ if (__predict_false(sdhci_debug > 0))
+ slot_printf(slot, "SDIO Custom block params: blksz: "
+ "%#10x, blk cnt: %#10x\n", blksz, blkcnt);
+ } else
+#endif
+ {
+ /* Set block size and request border interrupts on the SDMA boundary. */
+ blksz = SDHCI_MAKE_BLKSZ(slot->sdma_boundary, ulmin(data->len, 512));
+ blkcnt = howmany(data->len, 512);
+ }
+
WR2(slot, SDHCI_BLOCK_SIZE, blksz);
- /* Set block count. */
- blkcnt = howmany(data->len, 512);
WR2(slot, SDHCI_BLOCK_COUNT, blkcnt);
if (__predict_false(sdhci_debug > 1))
slot_printf(slot, "Blk size: 0x%08x | Blk cnt: 0x%08x\n",
@@ -2781,10 +2805,13 @@
}
*/
if (__predict_false(sdhci_debug > 1)) {
- slot_printf(slot, "CMD%u arg %#x flags %#x dlen %u dflags %#x\n",
- mmcio->cmd.opcode, mmcio->cmd.arg, mmcio->cmd.flags,
- mmcio->cmd.data != NULL ? (unsigned int) mmcio->cmd.data->len : 0,
- mmcio->cmd.data != NULL ? mmcio->cmd.data->flags: 0);
+ slot_printf(slot, "CMD%u arg %#x flags %#x dlen %u dflags %#x "
+ "blksz=%zu blkcnt=%zu\n",
+ mmcio->cmd.opcode, mmcio->cmd.arg, mmcio->cmd.flags,
+ mmcio->cmd.data != NULL ? (unsigned int) mmcio->cmd.data->len : 0,
+ mmcio->cmd.data != NULL ? mmcio->cmd.data->flags: 0,
+ mmcio->cmd.data != NULL ? mmcio->cmd.data->block_size: 0,
+ mmcio->cmd.data != NULL ? mmcio->cmd.data->block_count: 0);
}
if (mmcio->cmd.data != NULL) {
if (mmcio->cmd.data->len == 0 || mmcio->cmd.data->flags == 0)
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Nov 21, 4:25 PM (2 h, 38 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
25777031
Default Alt Text
D19783.id55697.diff (4 KB)
Attached To
Mode
D19783: Implement CMD53 block mode support for SDHCI and AllWinner-based boards
Attached
Detach File
Event Timeline
Log In to Comment