diff options
Diffstat (limited to 'drivers/mmc/card/block.c')
-rw-r--r-- | drivers/mmc/card/block.c | 31 |
1 files changed, 13 insertions, 18 deletions
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index 91a676773608..3e9082b729ff 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c | |||
@@ -273,8 +273,6 @@ static int mmc_blk_issue_discard_rq(struct mmc_queue *mq, struct request *req) | |||
273 | unsigned int from, nr, arg; | 273 | unsigned int from, nr, arg; |
274 | int err = 0; | 274 | int err = 0; |
275 | 275 | ||
276 | mmc_claim_host(card->host); | ||
277 | |||
278 | if (!mmc_can_erase(card)) { | 276 | if (!mmc_can_erase(card)) { |
279 | err = -EOPNOTSUPP; | 277 | err = -EOPNOTSUPP; |
280 | goto out; | 278 | goto out; |
@@ -294,8 +292,6 @@ out: | |||
294 | __blk_end_request(req, err, blk_rq_bytes(req)); | 292 | __blk_end_request(req, err, blk_rq_bytes(req)); |
295 | spin_unlock_irq(&md->lock); | 293 | spin_unlock_irq(&md->lock); |
296 | 294 | ||
297 | mmc_release_host(card->host); | ||
298 | |||
299 | return err ? 0 : 1; | 295 | return err ? 0 : 1; |
300 | } | 296 | } |
301 | 297 | ||
@@ -307,8 +303,6 @@ static int mmc_blk_issue_secdiscard_rq(struct mmc_queue *mq, | |||
307 | unsigned int from, nr, arg; | 303 | unsigned int from, nr, arg; |
308 | int err = 0; | 304 | int err = 0; |
309 | 305 | ||
310 | mmc_claim_host(card->host); | ||
311 | |||
312 | if (!mmc_can_secure_erase_trim(card)) { | 306 | if (!mmc_can_secure_erase_trim(card)) { |
313 | err = -EOPNOTSUPP; | 307 | err = -EOPNOTSUPP; |
314 | goto out; | 308 | goto out; |
@@ -330,8 +324,6 @@ out: | |||
330 | __blk_end_request(req, err, blk_rq_bytes(req)); | 324 | __blk_end_request(req, err, blk_rq_bytes(req)); |
331 | spin_unlock_irq(&md->lock); | 325 | spin_unlock_irq(&md->lock); |
332 | 326 | ||
333 | mmc_release_host(card->host); | ||
334 | |||
335 | return err ? 0 : 1; | 327 | return err ? 0 : 1; |
336 | } | 328 | } |
337 | 329 | ||
@@ -402,8 +394,6 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *req) | |||
402 | (rq_data_dir(req) == WRITE) && | 394 | (rq_data_dir(req) == WRITE) && |
403 | REL_WRITES_SUPPORTED(card); | 395 | REL_WRITES_SUPPORTED(card); |
404 | 396 | ||
405 | mmc_claim_host(card->host); | ||
406 | |||
407 | do { | 397 | do { |
408 | struct mmc_command cmd; | 398 | struct mmc_command cmd; |
409 | u32 readcmd, writecmd, status = 0; | 399 | u32 readcmd, writecmd, status = 0; |
@@ -589,8 +579,6 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *req) | |||
589 | spin_unlock_irq(&md->lock); | 579 | spin_unlock_irq(&md->lock); |
590 | } while (ret); | 580 | } while (ret); |
591 | 581 | ||
592 | mmc_release_host(card->host); | ||
593 | |||
594 | return 1; | 582 | return 1; |
595 | 583 | ||
596 | cmd_err: | 584 | cmd_err: |
@@ -617,8 +605,6 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *req) | |||
617 | spin_unlock_irq(&md->lock); | 605 | spin_unlock_irq(&md->lock); |
618 | } | 606 | } |
619 | 607 | ||
620 | mmc_release_host(card->host); | ||
621 | |||
622 | spin_lock_irq(&md->lock); | 608 | spin_lock_irq(&md->lock); |
623 | while (ret) | 609 | while (ret) |
624 | ret = __blk_end_request(req, -EIO, blk_rq_cur_bytes(req)); | 610 | ret = __blk_end_request(req, -EIO, blk_rq_cur_bytes(req)); |
@@ -629,16 +615,25 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *req) | |||
629 | 615 | ||
630 | static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) | 616 | static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) |
631 | { | 617 | { |
618 | int ret; | ||
619 | struct mmc_blk_data *md = mq->data; | ||
620 | struct mmc_card *card = md->queue.card; | ||
621 | |||
622 | mmc_claim_host(card->host); | ||
623 | |||
632 | if (req->cmd_flags & REQ_DISCARD) { | 624 | if (req->cmd_flags & REQ_DISCARD) { |
633 | if (req->cmd_flags & REQ_SECURE) | 625 | if (req->cmd_flags & REQ_SECURE) |
634 | return mmc_blk_issue_secdiscard_rq(mq, req); | 626 | ret = mmc_blk_issue_secdiscard_rq(mq, req); |
635 | else | 627 | else |
636 | return mmc_blk_issue_discard_rq(mq, req); | 628 | ret = mmc_blk_issue_discard_rq(mq, req); |
637 | } else if (req->cmd_flags & REQ_FLUSH) { | 629 | } else if (req->cmd_flags & REQ_FLUSH) { |
638 | return mmc_blk_issue_flush(mq, req); | 630 | ret = mmc_blk_issue_flush(mq, req); |
639 | } else { | 631 | } else { |
640 | return mmc_blk_issue_rw_rq(mq, req); | 632 | ret = mmc_blk_issue_rw_rq(mq, req); |
641 | } | 633 | } |
634 | |||
635 | mmc_release_host(card->host); | ||
636 | return ret; | ||
642 | } | 637 | } |
643 | 638 | ||
644 | static inline int mmc_blk_readonly(struct mmc_card *card) | 639 | static inline int mmc_blk_readonly(struct mmc_card *card) |