Loading drivers/mmc/core/block.c +17 −1 Original line number Diff line number Diff line Loading @@ -120,6 +120,7 @@ struct mmc_blk_data { #define MMC_BLK_DISCARD BIT(2) #define MMC_BLK_SECDISCARD BIT(3) #define MMC_BLK_CQE_RECOVERY BIT(4) #define MMC_BLK_PARTSWITCH BIT(5) /* * Only set in main mmc_blk_data associated Loading Loading @@ -889,6 +890,9 @@ static inline int mmc_blk_part_switch(struct mmc_card *card, EXT_CSD_PART_CONFIG, part_config, card->ext_csd.part_time); if (ret) { pr_err("%s: %s: switch failure, %d -> %d\n", mmc_hostname(card->host), __func__, main_md->part_curr, part_type); mmc_blk_part_switch_post(card, part_type); return ret; } Loading Loading @@ -2263,10 +2267,22 @@ enum mmc_issued mmc_blk_mq_issue_rq(struct mmc_queue *mq, struct request *req) struct mmc_card *card = md->queue.card; struct mmc_host *host = card->host; int ret; int err; ret = mmc_blk_part_switch(card, md->part_type); if (ret) if (ret) { err = mmc_blk_reset(md, card->host, MMC_BLK_PARTSWITCH); if (!err) { pr_err("%s: mmc_blk_reset(MMC_BLK_PARTSWITCH) succeeded.\n", mmc_hostname(card->host)); mmc_blk_reset_success(md, MMC_BLK_PARTSWITCH); } else { pr_err("%s: mmc_blk_reset(MMC_BLK_PARTSWITCH) failed.\n", mmc_hostname(card->host)); } return MMC_REQ_FAILED_TO_START; } switch (mmc_issue_type(mq, req)) { case MMC_ISSUE_SYNC: Loading drivers/mmc/core/bus.c +1 −0 Original line number Diff line number Diff line Loading @@ -387,6 +387,7 @@ int mmc_add_card(struct mmc_card *card) return ret; mmc_card_set_present(card); device_enable_async_suspend(&card->dev); return 0; } Loading drivers/mmc/core/mmc.c +12 −0 Original line number Diff line number Diff line Loading @@ -2748,6 +2748,13 @@ static int _mmc_hw_reset(struct mmc_host *host) mmc_pwrseq_reset(host); } /* Suspend clk scaling to avoid switching frequencies intermittently */ ret = mmc_suspend_clk_scaling(host); if (ret) { pr_err("%s: %s: fail to suspend clock scaling (%d)\n", mmc_hostname(host), __func__, ret); return ret; } ret = mmc_init_card(host, host->card->ocr, host->card); if (ret) { pr_err("%s: %s: mmc_init_card failed (%d)\n", Loading @@ -2755,6 +2762,11 @@ static int _mmc_hw_reset(struct mmc_host *host) return ret; } ret = mmc_suspend_clk_scaling(host); if (ret) { pr_err("%s: %s: fail to suspend clock scaling (%d)\n", mmc_hostname(host), __func__, ret); } return ret; } Loading drivers/mmc/core/mmc_ops.c +8 −2 Original line number Diff line number Diff line Loading @@ -937,8 +937,14 @@ static int mmc_read_bkops_status(struct mmc_card *card) if (err) return err; card->ext_csd.raw_bkops_status = ext_csd[EXT_CSD_BKOPS_STATUS]; card->ext_csd.raw_exception_status = ext_csd[EXT_CSD_EXP_EVENTS_STATUS]; card->ext_csd.raw_bkops_status = ext_csd[EXT_CSD_BKOPS_STATUS] & MMC_BKOPS_URGENCY_MASK; card->ext_csd.raw_exception_status = ext_csd[EXT_CSD_EXP_EVENTS_STATUS] & (EXT_CSD_URGENT_BKOPS | EXT_CSD_DYNCAP_NEEDED | EXT_CSD_SYSPOOL_EXHAUSTED | EXT_CSD_PACKED_FAILURE); kfree(ext_csd); return 0; } Loading Loading
drivers/mmc/core/block.c +17 −1 Original line number Diff line number Diff line Loading @@ -120,6 +120,7 @@ struct mmc_blk_data { #define MMC_BLK_DISCARD BIT(2) #define MMC_BLK_SECDISCARD BIT(3) #define MMC_BLK_CQE_RECOVERY BIT(4) #define MMC_BLK_PARTSWITCH BIT(5) /* * Only set in main mmc_blk_data associated Loading Loading @@ -889,6 +890,9 @@ static inline int mmc_blk_part_switch(struct mmc_card *card, EXT_CSD_PART_CONFIG, part_config, card->ext_csd.part_time); if (ret) { pr_err("%s: %s: switch failure, %d -> %d\n", mmc_hostname(card->host), __func__, main_md->part_curr, part_type); mmc_blk_part_switch_post(card, part_type); return ret; } Loading Loading @@ -2263,10 +2267,22 @@ enum mmc_issued mmc_blk_mq_issue_rq(struct mmc_queue *mq, struct request *req) struct mmc_card *card = md->queue.card; struct mmc_host *host = card->host; int ret; int err; ret = mmc_blk_part_switch(card, md->part_type); if (ret) if (ret) { err = mmc_blk_reset(md, card->host, MMC_BLK_PARTSWITCH); if (!err) { pr_err("%s: mmc_blk_reset(MMC_BLK_PARTSWITCH) succeeded.\n", mmc_hostname(card->host)); mmc_blk_reset_success(md, MMC_BLK_PARTSWITCH); } else { pr_err("%s: mmc_blk_reset(MMC_BLK_PARTSWITCH) failed.\n", mmc_hostname(card->host)); } return MMC_REQ_FAILED_TO_START; } switch (mmc_issue_type(mq, req)) { case MMC_ISSUE_SYNC: Loading
drivers/mmc/core/bus.c +1 −0 Original line number Diff line number Diff line Loading @@ -387,6 +387,7 @@ int mmc_add_card(struct mmc_card *card) return ret; mmc_card_set_present(card); device_enable_async_suspend(&card->dev); return 0; } Loading
drivers/mmc/core/mmc.c +12 −0 Original line number Diff line number Diff line Loading @@ -2748,6 +2748,13 @@ static int _mmc_hw_reset(struct mmc_host *host) mmc_pwrseq_reset(host); } /* Suspend clk scaling to avoid switching frequencies intermittently */ ret = mmc_suspend_clk_scaling(host); if (ret) { pr_err("%s: %s: fail to suspend clock scaling (%d)\n", mmc_hostname(host), __func__, ret); return ret; } ret = mmc_init_card(host, host->card->ocr, host->card); if (ret) { pr_err("%s: %s: mmc_init_card failed (%d)\n", Loading @@ -2755,6 +2762,11 @@ static int _mmc_hw_reset(struct mmc_host *host) return ret; } ret = mmc_suspend_clk_scaling(host); if (ret) { pr_err("%s: %s: fail to suspend clock scaling (%d)\n", mmc_hostname(host), __func__, ret); } return ret; } Loading
drivers/mmc/core/mmc_ops.c +8 −2 Original line number Diff line number Diff line Loading @@ -937,8 +937,14 @@ static int mmc_read_bkops_status(struct mmc_card *card) if (err) return err; card->ext_csd.raw_bkops_status = ext_csd[EXT_CSD_BKOPS_STATUS]; card->ext_csd.raw_exception_status = ext_csd[EXT_CSD_EXP_EVENTS_STATUS]; card->ext_csd.raw_bkops_status = ext_csd[EXT_CSD_BKOPS_STATUS] & MMC_BKOPS_URGENCY_MASK; card->ext_csd.raw_exception_status = ext_csd[EXT_CSD_EXP_EVENTS_STATUS] & (EXT_CSD_URGENT_BKOPS | EXT_CSD_DYNCAP_NEEDED | EXT_CSD_SYSPOOL_EXHAUSTED | EXT_CSD_PACKED_FAILURE); kfree(ext_csd); return 0; } Loading