Loading drivers/mmc/card/block.c +5 −4 Original line number Original line Diff line number Diff line Loading @@ -1352,7 +1352,7 @@ static int mmc_blk_issue_discard_rq(struct mmc_queue *mq, struct request *req) from = blk_rq_pos(req); from = blk_rq_pos(req); nr = blk_rq_sectors(req); nr = blk_rq_sectors(req); if (card->ext_csd.bkops_en) if (mmc_card_get_bkops_en_manual(card)) card->bkops_info.sectors_changed += blk_rq_sectors(req); card->bkops_info.sectors_changed += blk_rq_sectors(req); if (mmc_can_discard(card)) if (mmc_can_discard(card)) Loading Loading @@ -2296,7 +2296,7 @@ static u8 mmc_blk_prep_packed_list(struct mmc_queue *mq, struct request *req) if (rq_data_dir(next) == WRITE) { if (rq_data_dir(next) == WRITE) { mq->num_of_potential_packed_wr_reqs++; mq->num_of_potential_packed_wr_reqs++; if (card->ext_csd.bkops_en) if (mmc_card_get_bkops_en_manual(card)) card->bkops_info.sectors_changed += card->bkops_info.sectors_changed += blk_rq_sectors(next); blk_rq_sectors(next); } } Loading Loading @@ -2553,7 +2553,8 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *rqc) return 0; return 0; if (rqc) { if (rqc) { if ((card->ext_csd.bkops_en) && (rq_data_dir(rqc) == WRITE)) if (mmc_card_get_bkops_en_manual(card) && (rq_data_dir(rqc) == WRITE)) card->bkops_info.sectors_changed += blk_rq_sectors(rqc); card->bkops_info.sectors_changed += blk_rq_sectors(rqc); reqs = mmc_blk_prep_packed_list(mq, rqc); reqs = mmc_blk_prep_packed_list(mq, rqc); } } Loading Loading @@ -2768,7 +2769,7 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) if (mmc_bus_needs_resume(card->host)) if (mmc_bus_needs_resume(card->host)) mmc_resume_bus(card->host); mmc_resume_bus(card->host); #endif #endif if (card->ext_csd.bkops_en) if (mmc_card_get_bkops_en_manual(card)) mmc_stop_bkops(card); mmc_stop_bkops(card); } } Loading drivers/mmc/card/mmc_block_test.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -1788,7 +1788,7 @@ static int prepare_bkops(struct test_data *td) bkops_stat = &card->bkops_info.bkops_stats; bkops_stat = &card->bkops_info.bkops_stats; if (!card->ext_csd.bkops_en) { if (!(mmc_card_get_bkops_en_manual(card))) { pr_err("%s: BKOPS is not enabled by card or host)", pr_err("%s: BKOPS is not enabled by card or host)", __func__); __func__); return -ENOTSUPP; return -ENOTSUPP; Loading drivers/mmc/core/core.c +4 −2 Original line number Original line Diff line number Diff line Loading @@ -400,7 +400,9 @@ EXPORT_SYMBOL(mmc_blk_init_bkops_statistics); */ */ void mmc_start_delayed_bkops(struct mmc_card *card) void mmc_start_delayed_bkops(struct mmc_card *card) { { if (!card || !card->ext_csd.bkops_en || mmc_card_doing_bkops(card)) if (!card || !(mmc_card_get_bkops_en_manual(card)) || mmc_card_doing_bkops(card)) return; return; if (card->bkops_info.sectors_changed < if (card->bkops_info.sectors_changed < Loading Loading @@ -437,7 +439,7 @@ void mmc_start_bkops(struct mmc_card *card, bool from_exception) int err; int err; BUG_ON(!card); BUG_ON(!card); if (!card->ext_csd.bkops_en) if (!(mmc_card_get_bkops_en_manual(card))) return; return; if ((card->bkops_info.cancel_delayed_work) && !from_exception) { if ((card->bkops_info.cancel_delayed_work) && !from_exception) { Loading drivers/mmc/core/debugfs.c +2 −1 Original line number Original line Diff line number Diff line Loading @@ -19,6 +19,7 @@ #include <linux/mmc/card.h> #include <linux/mmc/card.h> #include <linux/mmc/host.h> #include <linux/mmc/host.h> #include <linux/mmc/mmc.h> #include "core.h" #include "core.h" #include "mmc_ops.h" #include "mmc_ops.h" Loading Loading @@ -725,7 +726,7 @@ void mmc_add_card_debugfs(struct mmc_card *card) goto err; goto err; if (mmc_card_mmc(card) && (card->ext_csd.rev >= 5) && if (mmc_card_mmc(card) && (card->ext_csd.rev >= 5) && card->ext_csd.bkops_en) (mmc_card_get_bkops_en_manual(card))) if (!debugfs_create_file("bkops_stats", S_IRUSR, root, card, if (!debugfs_create_file("bkops_stats", S_IRUSR, root, card, &mmc_dbg_bkops_stats_fops)) &mmc_dbg_bkops_stats_fops)) goto err; goto err; Loading drivers/mmc/core/mmc.c +12 −8 Original line number Original line Diff line number Diff line Loading @@ -10,6 +10,7 @@ * published by the Free Software Foundation. * published by the Free Software Foundation. */ */ #include <linux/bitops.h> #include <linux/err.h> #include <linux/err.h> #include <linux/slab.h> #include <linux/slab.h> #include <linux/stat.h> #include <linux/stat.h> Loading Loading @@ -530,15 +531,19 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) card->ext_csd.bkops_en = ext_csd[EXT_CSD_BKOPS_EN]; card->ext_csd.bkops_en = ext_csd[EXT_CSD_BKOPS_EN]; card->ext_csd.raw_bkops_status = card->ext_csd.raw_bkops_status = ext_csd[EXT_CSD_BKOPS_STATUS]; ext_csd[EXT_CSD_BKOPS_STATUS]; if (!card->ext_csd.bkops_en && if (!(mmc_card_get_bkops_en_manual(card)) && card->host->caps2 & MMC_CAP2_INIT_BKOPS) { card->host->caps2 & MMC_CAP2_INIT_BKOPS) { err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, mmc_card_set_bkops_en_manual(card); EXT_CSD_BKOPS_EN, 1, 0); err = mmc_switch(card, if (err) EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BKOPS_EN, card->ext_csd.bkops_en , 0); if (err) { pr_warn("%s: Enabling BKOPS failed\n", pr_warn("%s: Enabling BKOPS failed\n", mmc_hostname(card->host)); mmc_hostname(card->host)); else mmc_card_clr_bkops_en_manual(card); card->ext_csd.bkops_en = 1; } } } } } Loading Loading @@ -1686,8 +1691,7 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, goto free_card; goto free_card; } } } } if (mmc_card_get_bkops_en_manual(card)) { if (card->ext_csd.bkops_en) { INIT_DELAYED_WORK(&card->bkops_info.dw, INIT_DELAYED_WORK(&card->bkops_info.dw, mmc_start_idle_time_bkops); mmc_start_idle_time_bkops); Loading Loading
drivers/mmc/card/block.c +5 −4 Original line number Original line Diff line number Diff line Loading @@ -1352,7 +1352,7 @@ static int mmc_blk_issue_discard_rq(struct mmc_queue *mq, struct request *req) from = blk_rq_pos(req); from = blk_rq_pos(req); nr = blk_rq_sectors(req); nr = blk_rq_sectors(req); if (card->ext_csd.bkops_en) if (mmc_card_get_bkops_en_manual(card)) card->bkops_info.sectors_changed += blk_rq_sectors(req); card->bkops_info.sectors_changed += blk_rq_sectors(req); if (mmc_can_discard(card)) if (mmc_can_discard(card)) Loading Loading @@ -2296,7 +2296,7 @@ static u8 mmc_blk_prep_packed_list(struct mmc_queue *mq, struct request *req) if (rq_data_dir(next) == WRITE) { if (rq_data_dir(next) == WRITE) { mq->num_of_potential_packed_wr_reqs++; mq->num_of_potential_packed_wr_reqs++; if (card->ext_csd.bkops_en) if (mmc_card_get_bkops_en_manual(card)) card->bkops_info.sectors_changed += card->bkops_info.sectors_changed += blk_rq_sectors(next); blk_rq_sectors(next); } } Loading Loading @@ -2553,7 +2553,8 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *rqc) return 0; return 0; if (rqc) { if (rqc) { if ((card->ext_csd.bkops_en) && (rq_data_dir(rqc) == WRITE)) if (mmc_card_get_bkops_en_manual(card) && (rq_data_dir(rqc) == WRITE)) card->bkops_info.sectors_changed += blk_rq_sectors(rqc); card->bkops_info.sectors_changed += blk_rq_sectors(rqc); reqs = mmc_blk_prep_packed_list(mq, rqc); reqs = mmc_blk_prep_packed_list(mq, rqc); } } Loading Loading @@ -2768,7 +2769,7 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) if (mmc_bus_needs_resume(card->host)) if (mmc_bus_needs_resume(card->host)) mmc_resume_bus(card->host); mmc_resume_bus(card->host); #endif #endif if (card->ext_csd.bkops_en) if (mmc_card_get_bkops_en_manual(card)) mmc_stop_bkops(card); mmc_stop_bkops(card); } } Loading
drivers/mmc/card/mmc_block_test.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -1788,7 +1788,7 @@ static int prepare_bkops(struct test_data *td) bkops_stat = &card->bkops_info.bkops_stats; bkops_stat = &card->bkops_info.bkops_stats; if (!card->ext_csd.bkops_en) { if (!(mmc_card_get_bkops_en_manual(card))) { pr_err("%s: BKOPS is not enabled by card or host)", pr_err("%s: BKOPS is not enabled by card or host)", __func__); __func__); return -ENOTSUPP; return -ENOTSUPP; Loading
drivers/mmc/core/core.c +4 −2 Original line number Original line Diff line number Diff line Loading @@ -400,7 +400,9 @@ EXPORT_SYMBOL(mmc_blk_init_bkops_statistics); */ */ void mmc_start_delayed_bkops(struct mmc_card *card) void mmc_start_delayed_bkops(struct mmc_card *card) { { if (!card || !card->ext_csd.bkops_en || mmc_card_doing_bkops(card)) if (!card || !(mmc_card_get_bkops_en_manual(card)) || mmc_card_doing_bkops(card)) return; return; if (card->bkops_info.sectors_changed < if (card->bkops_info.sectors_changed < Loading Loading @@ -437,7 +439,7 @@ void mmc_start_bkops(struct mmc_card *card, bool from_exception) int err; int err; BUG_ON(!card); BUG_ON(!card); if (!card->ext_csd.bkops_en) if (!(mmc_card_get_bkops_en_manual(card))) return; return; if ((card->bkops_info.cancel_delayed_work) && !from_exception) { if ((card->bkops_info.cancel_delayed_work) && !from_exception) { Loading
drivers/mmc/core/debugfs.c +2 −1 Original line number Original line Diff line number Diff line Loading @@ -19,6 +19,7 @@ #include <linux/mmc/card.h> #include <linux/mmc/card.h> #include <linux/mmc/host.h> #include <linux/mmc/host.h> #include <linux/mmc/mmc.h> #include "core.h" #include "core.h" #include "mmc_ops.h" #include "mmc_ops.h" Loading Loading @@ -725,7 +726,7 @@ void mmc_add_card_debugfs(struct mmc_card *card) goto err; goto err; if (mmc_card_mmc(card) && (card->ext_csd.rev >= 5) && if (mmc_card_mmc(card) && (card->ext_csd.rev >= 5) && card->ext_csd.bkops_en) (mmc_card_get_bkops_en_manual(card))) if (!debugfs_create_file("bkops_stats", S_IRUSR, root, card, if (!debugfs_create_file("bkops_stats", S_IRUSR, root, card, &mmc_dbg_bkops_stats_fops)) &mmc_dbg_bkops_stats_fops)) goto err; goto err; Loading
drivers/mmc/core/mmc.c +12 −8 Original line number Original line Diff line number Diff line Loading @@ -10,6 +10,7 @@ * published by the Free Software Foundation. * published by the Free Software Foundation. */ */ #include <linux/bitops.h> #include <linux/err.h> #include <linux/err.h> #include <linux/slab.h> #include <linux/slab.h> #include <linux/stat.h> #include <linux/stat.h> Loading Loading @@ -530,15 +531,19 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) card->ext_csd.bkops_en = ext_csd[EXT_CSD_BKOPS_EN]; card->ext_csd.bkops_en = ext_csd[EXT_CSD_BKOPS_EN]; card->ext_csd.raw_bkops_status = card->ext_csd.raw_bkops_status = ext_csd[EXT_CSD_BKOPS_STATUS]; ext_csd[EXT_CSD_BKOPS_STATUS]; if (!card->ext_csd.bkops_en && if (!(mmc_card_get_bkops_en_manual(card)) && card->host->caps2 & MMC_CAP2_INIT_BKOPS) { card->host->caps2 & MMC_CAP2_INIT_BKOPS) { err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, mmc_card_set_bkops_en_manual(card); EXT_CSD_BKOPS_EN, 1, 0); err = mmc_switch(card, if (err) EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BKOPS_EN, card->ext_csd.bkops_en , 0); if (err) { pr_warn("%s: Enabling BKOPS failed\n", pr_warn("%s: Enabling BKOPS failed\n", mmc_hostname(card->host)); mmc_hostname(card->host)); else mmc_card_clr_bkops_en_manual(card); card->ext_csd.bkops_en = 1; } } } } } Loading Loading @@ -1686,8 +1691,7 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, goto free_card; goto free_card; } } } } if (mmc_card_get_bkops_en_manual(card)) { if (card->ext_csd.bkops_en) { INIT_DELAYED_WORK(&card->bkops_info.dw, INIT_DELAYED_WORK(&card->bkops_info.dw, mmc_start_idle_time_bkops); mmc_start_idle_time_bkops); Loading