diff options
Diffstat (limited to 'drivers/mmc/core/sdio_io.c')
| -rw-r--r-- | drivers/mmc/core/sdio_io.c | 19 | 
1 files changed, 10 insertions, 9 deletions
diff --git a/drivers/mmc/core/sdio_io.c b/drivers/mmc/core/sdio_io.c index 0f687cdeb06..78cb4d5d9d5 100644 --- a/drivers/mmc/core/sdio_io.c +++ b/drivers/mmc/core/sdio_io.c @@ -9,6 +9,7 @@   * your option) any later version.   */ +#include <linux/export.h>  #include <linux/mmc/host.h>  #include <linux/mmc/card.h>  #include <linux/mmc/sdio.h> @@ -187,14 +188,16 @@ EXPORT_SYMBOL_GPL(sdio_set_block_size);   */  static inline unsigned int sdio_max_byte_size(struct sdio_func *func)  { -	unsigned mval =	min(func->card->host->max_seg_size, -			    func->card->host->max_blk_size); +	unsigned mval =	func->card->host->max_blk_size;  	if (mmc_blksz_for_byte_mode(func->card))  		mval = min(mval, func->cur_blksize);  	else  		mval = min(mval, func->max_blksize); +	if (mmc_card_broken_byte_mode_512(func->card)) +		return min(mval, 511u); +  	return min(mval, 512u); /* maximum size for byte mode */  } @@ -307,13 +310,10 @@ static int sdio_io_rw_ext_helper(struct sdio_func *func, int write,  	/* Do the bulk of the transfer using block mode (if supported). */  	if (func->card->cccr.multi_block && (size > sdio_max_byte_size(func))) {  		/* Blocks per command is limited by host count, host transfer -		 * size (we only use a single sg entry) and the maximum for -		 * IO_RW_EXTENDED of 511 blocks. */ -		max_blocks = min(func->card->host->max_blk_count, -			func->card->host->max_seg_size / func->cur_blksize); -		max_blocks = min(max_blocks, 511u); +		 * size and the maximum for IO_RW_EXTENDED of 511 blocks. */ +		max_blocks = min(func->card->host->max_blk_count, 511u); -		while (remainder > func->cur_blksize) { +		while (remainder >= func->cur_blksize) {  			unsigned blocks;  			blocks = remainder / func->cur_blksize; @@ -338,8 +338,9 @@ static int sdio_io_rw_ext_helper(struct sdio_func *func, int write,  	while (remainder > 0) {  		size = min(remainder, sdio_max_byte_size(func)); +		/* Indicate byte mode by setting "blocks" = 0 */  		ret = mmc_io_rw_extended(func->card, write, func->num, addr, -			 incr_addr, buf, 1, size); +			 incr_addr, buf, 0, size);  		if (ret)  			return ret;  | 
