diff options
Diffstat (limited to 'drivers/mmc/core/sdio_ops.c')
| -rw-r--r-- | drivers/mmc/core/sdio_ops.c | 19 | 
1 files changed, 12 insertions, 7 deletions
diff --git a/drivers/mmc/core/sdio_ops.c b/drivers/mmc/core/sdio_ops.c index 4f2c7713947..98e20532452 100644 --- a/drivers/mmc/core/sdio_ops.c +++ b/drivers/mmc/core/sdio_ops.c @@ -88,7 +88,7 @@ int mmc_io_rw_direct(struct mmc_card *card, int write, unsigned fn,  }  int mmc_io_rw_extended(struct mmc_card *card, int write, unsigned fn, -	unsigned addr, int bang, u8 *buf, unsigned size) +	unsigned addr, int incr_addr, u8 *buf, unsigned blocks, unsigned blksz)  {  	struct mmc_request mrq;  	struct mmc_command cmd; @@ -97,7 +97,9 @@ int mmc_io_rw_extended(struct mmc_card *card, int write, unsigned fn,  	BUG_ON(!card);  	BUG_ON(fn > 7); -	BUG_ON(size > 512); +	BUG_ON(blocks == 1 && blksz > 512); +	WARN_ON(blocks == 0); +	WARN_ON(blksz == 0);  	memset(&mrq, 0, sizeof(struct mmc_request));  	memset(&cmd, 0, sizeof(struct mmc_command)); @@ -109,18 +111,21 @@ int mmc_io_rw_extended(struct mmc_card *card, int write, unsigned fn,  	cmd.opcode = SD_IO_RW_EXTENDED;  	cmd.arg = write ? 0x80000000 : 0x00000000;  	cmd.arg |= fn << 28; -	cmd.arg |= bang ? 0x00000000 : 0x04000000; +	cmd.arg |= incr_addr ? 0x04000000 : 0x00000000;  	cmd.arg |= addr << 9; -	cmd.arg |= (size == 512) ? 0 : size; +	if (blocks == 1 && blksz <= 512) +		cmd.arg |= (blksz == 512) ? 0 : blksz;	/* byte mode */ +	else +		cmd.arg |= 0x08000000 | blocks;		/* block mode */  	cmd.flags = MMC_RSP_R5 | MMC_CMD_ADTC; -	data.blksz = size; -	data.blocks = 1; +	data.blksz = blksz; +	data.blocks = blocks;  	data.flags = write ? MMC_DATA_WRITE : MMC_DATA_READ;  	data.sg = &sg;  	data.sg_len = 1; -	sg_init_one(&sg, buf, size); +	sg_init_one(&sg, buf, blksz * blocks);  	mmc_set_data_timeout(&data, card);  |