Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mmc: core: refactor asynchronous request finalization

mmc_wait_for_data_req_done() is called in exactly one place,
and having it spread out is making things hard to oversee.
Factor this function into mmc_finalize_areq().

Reviewed-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>

authored by

Linus Walleij and committed by
Ulf Hansson
0e72f95b 5744d50d

+33 -53
+33 -53
drivers/mmc/core/core.c
··· 506 506 return err; 507 507 } 508 508 509 - /* 510 - * mmc_wait_for_data_req_done() - wait for request completed 511 - * @host: MMC host to prepare the command. 512 - * @mrq: MMC request to wait for 513 - * 514 - * Blocks MMC context till host controller will ack end of data request 515 - * execution or new request notification arrives from the block layer. 516 - * Handles command retries. 517 - * 518 - * Returns enum mmc_blk_status after checking errors. 519 - */ 520 - static enum mmc_blk_status mmc_wait_for_data_req_done(struct mmc_host *host, 521 - struct mmc_request *mrq) 522 - { 523 - struct mmc_command *cmd; 524 - struct mmc_context_info *context_info = &host->context_info; 525 - enum mmc_blk_status status; 526 - 527 - while (1) { 528 - wait_event_interruptible(context_info->wait, 529 - (context_info->is_done_rcv || 530 - context_info->is_new_req)); 531 - 532 - if (context_info->is_done_rcv) { 533 - context_info->is_done_rcv = false; 534 - cmd = mrq->cmd; 535 - 536 - if (!cmd->error || !cmd->retries || 537 - mmc_card_removed(host->card)) { 538 - status = host->areq->err_check(host->card, 539 - host->areq); 540 - break; /* return status */ 541 - } else { 542 - mmc_retune_recheck(host); 543 - pr_info("%s: req failed (CMD%u): %d, retrying...\n", 544 - mmc_hostname(host), 545 - cmd->opcode, cmd->error); 546 - cmd->retries--; 547 - cmd->error = 0; 548 - __mmc_start_request(host, mrq); 549 - continue; /* wait for done/new event again */ 550 - } 551 - } 552 - 553 - return MMC_BLK_NEW_REQUEST; 554 - } 555 - mmc_retune_release(host); 556 - return status; 557 - } 558 - 559 509 void mmc_wait_for_req_done(struct mmc_host *host, struct mmc_request *mrq) 560 510 { 561 511 struct mmc_command *cmd; ··· 610 660 */ 611 661 static enum mmc_blk_status mmc_finalize_areq(struct mmc_host *host) 612 662 { 663 + struct mmc_context_info *context_info = &host->context_info; 613 664 enum mmc_blk_status status; 614 665 615 666 if (!host->areq) 616 667 return MMC_BLK_SUCCESS; 617 668 618 - status = mmc_wait_for_data_req_done(host, host->areq->mrq); 619 - if (status == MMC_BLK_NEW_REQUEST) 620 - return status; 669 + while (1) { 670 + wait_event_interruptible(context_info->wait, 671 + (context_info->is_done_rcv || 672 + context_info->is_new_req)); 673 + 674 + if (context_info->is_done_rcv) { 675 + struct mmc_command *cmd; 676 + 677 + context_info->is_done_rcv = false; 678 + cmd = host->areq->mrq->cmd; 679 + 680 + if (!cmd->error || !cmd->retries || 681 + mmc_card_removed(host->card)) { 682 + status = host->areq->err_check(host->card, 683 + host->areq); 684 + break; /* return status */ 685 + } else { 686 + mmc_retune_recheck(host); 687 + pr_info("%s: req failed (CMD%u): %d, retrying...\n", 688 + mmc_hostname(host), 689 + cmd->opcode, cmd->error); 690 + cmd->retries--; 691 + cmd->error = 0; 692 + __mmc_start_request(host, host->areq->mrq); 693 + continue; /* wait for done/new event again */ 694 + } 695 + } 696 + 697 + return MMC_BLK_NEW_REQUEST; 698 + } 699 + 700 + mmc_retune_release(host); 621 701 622 702 /* 623 703 * Check BKOPS urgency for each R1 response