Index: sbin/camcontrol/camcontrol.c =================================================================== --- sbin/camcontrol/camcontrol.c +++ sbin/camcontrol/camcontrol.c @@ -7791,6 +7791,8 @@ mmc_d.len = mmc_data_len; mmc_d.data = mmc_data; mmc_d.flags = MMC_DATA_READ; + mmc_d.block_size = 0; + mmc_d.block_count = 0; } else flags |= CAM_DIR_NONE; cam_fill_mmcio(&ccb->mmcio, Index: sys/cam/mmc/mmc_da.c =================================================================== --- sys/cam/mmc/mmc_da.c +++ sys/cam/mmc/mmc_da.c @@ -889,6 +889,7 @@ struct mmc_data d; KASSERT(buf_len == 512, ("Buffer for ext csd must be 512 bytes")); + memset(&d, 0, sizeof(d)); d.data = rawextcsd; d.len = buf_len; d.flags = MMC_DATA_READ; @@ -1013,6 +1014,7 @@ int err; memset(res, 0, 64); + memset(&mmc_d, 0, sizeof(mmc_d)); mmc_d.len = 64; mmc_d.data = res; mmc_d.flags = MMC_DATA_READ; @@ -1807,6 +1809,7 @@ mmcio->cmd.data->data = bp->bio_data; mmcio->cmd.data->len = 512 * count; mmcio->cmd.data->flags = (bp->bio_cmd == BIO_READ ? MMC_DATA_READ : MMC_DATA_WRITE); + mmcio->cmd.data->block_count = mmcio->cmd.data->block_size = 0; /* Direct h/w to issue CMD12 upon completion */ if (count > 1) { mmcio->cmd.data->flags |= MMC_DATA_MULTI; Index: sys/dev/mmc/mmcreg.h =================================================================== --- sys/dev/mmc/mmcreg.h +++ sys/dev/mmc/mmcreg.h @@ -190,6 +190,8 @@ struct mmc_data { size_t len; /* size of the data */ + size_t block_size; /* block size for CMD53 */ + size_t block_count; /* block count for CMD53 */ size_t xfer_len; void *data; /* data buffer */ uint32_t flags; @@ -546,7 +548,11 @@ #define SD_IO_RW_LEN(x) (((x) & 0xFF) << 0) #define SD_IOE_RW_LEN(x) (((x) & 0x1FF) << 0) +#define SD_IOE_RW_ADR(x) (((x) & 0x1FFFF) << 9) +#define SD_IOE_RW_INCR (1u << 26) #define SD_IOE_RW_BLK (1u << 27) +#define SD_IOE_RW_FUNC(x) (((x) & 0x7) << 28) +#define SD_IOE_RW_WR (1u << 31) /* Card Common Control Registers (CCCR) */ #define SD_IO_CCCR_START 0x00000 @@ -561,11 +567,15 @@ #define CCCR_BUS_WIDTH_4 (1 << 1) #define CCCR_BUS_WIDTH_1 (1 << 0) #define SD_IO_CCCR_CARDCAP 0x08 -#define SD_IO_CCCR_CISPTR 0x09 /* XXX 9-10, 10-11, or 9-12 */ - +#define CCCR_CC_SMB (1 << 1) +#define SD_IO_CCCR_CISPTR 0x09 /* 0x09 - 0x0B */ +#define SD_IO_CCCR_FN0_BLKSZ 0x10 /* 0x10 - 0x11 */ /* Function Basic Registers (FBR) */ #define SD_IO_FBR_START 0x00100 #define SD_IO_FBR_SIZE 0x00700 +#define SD_IO_FBR_START_F(n) (SD_IO_FBR_START + (n-1) * 0x00100) +#define SD_IO_FBR_CIS_OFFSET 0x9 +#define SD_IO_FBR_IOBLKSZ 0x10 /* Card Information Structure (CIS) */ #define SD_IO_CIS_START 0x01000