diff options
Diffstat (limited to 'drivers/mmc/mmc_block.c')
| -rw-r--r-- | drivers/mmc/mmc_block.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/mmc/mmc_block.c b/drivers/mmc/mmc_block.c index 87713572293f..05ba8ace70e7 100644 --- a/drivers/mmc/mmc_block.c +++ b/drivers/mmc/mmc_block.c | |||
| @@ -237,13 +237,17 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) | |||
| 237 | brq.mrq.cmd = &brq.cmd; | 237 | brq.mrq.cmd = &brq.cmd; |
| 238 | brq.mrq.data = &brq.data; | 238 | brq.mrq.data = &brq.data; |
| 239 | 239 | ||
| 240 | brq.cmd.arg = req->sector << 9; | 240 | brq.cmd.arg = req->sector; |
| 241 | if (!mmc_card_blockaddr(card)) | ||
| 242 | brq.cmd.arg <<= 9; | ||
| 241 | brq.cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC; | 243 | brq.cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC; |
| 242 | brq.data.blksz = 1 << md->block_bits; | 244 | brq.data.blksz = 1 << md->block_bits; |
| 243 | brq.data.blocks = req->nr_sectors >> (md->block_bits - 9); | ||
| 244 | brq.stop.opcode = MMC_STOP_TRANSMISSION; | 245 | brq.stop.opcode = MMC_STOP_TRANSMISSION; |
| 245 | brq.stop.arg = 0; | 246 | brq.stop.arg = 0; |
| 246 | brq.stop.flags = MMC_RSP_R1B | MMC_CMD_AC; | 247 | brq.stop.flags = MMC_RSP_R1B | MMC_CMD_AC; |
| 248 | brq.data.blocks = req->nr_sectors >> (md->block_bits - 9); | ||
| 249 | if (brq.data.blocks > card->host->max_blk_count) | ||
| 250 | brq.data.blocks = card->host->max_blk_count; | ||
| 247 | 251 | ||
| 248 | mmc_set_data_timeout(&brq.data, card, rq_data_dir(req) != READ); | 252 | mmc_set_data_timeout(&brq.data, card, rq_data_dir(req) != READ); |
| 249 | 253 | ||
| @@ -375,9 +379,10 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) | |||
| 375 | spin_unlock_irq(&md->lock); | 379 | spin_unlock_irq(&md->lock); |
| 376 | } | 380 | } |
| 377 | 381 | ||
| 382 | flush_queue: | ||
| 383 | |||
| 378 | mmc_card_release_host(card); | 384 | mmc_card_release_host(card); |
| 379 | 385 | ||
| 380 | flush_queue: | ||
| 381 | spin_lock_irq(&md->lock); | 386 | spin_lock_irq(&md->lock); |
| 382 | while (ret) { | 387 | while (ret) { |
| 383 | ret = end_that_request_chunk(req, 0, | 388 | ret = end_that_request_chunk(req, 0, |
| @@ -494,6 +499,10 @@ mmc_blk_set_blksize(struct mmc_blk_data *md, struct mmc_card *card) | |||
| 494 | struct mmc_command cmd; | 499 | struct mmc_command cmd; |
| 495 | int err; | 500 | int err; |
| 496 | 501 | ||
| 502 | /* Block-addressed cards ignore MMC_SET_BLOCKLEN. */ | ||
| 503 | if (mmc_card_blockaddr(card)) | ||
| 504 | return 0; | ||
| 505 | |||
| 497 | mmc_card_claim_host(card); | 506 | mmc_card_claim_host(card); |
| 498 | cmd.opcode = MMC_SET_BLOCKLEN; | 507 | cmd.opcode = MMC_SET_BLOCKLEN; |
| 499 | cmd.arg = 1 << md->block_bits; | 508 | cmd.arg = 1 << md->block_bits; |
