Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 32f83132 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "mmc: core: enable BKOPS by read-modify-write instead of override"

parents fa7ae132 18a5a61a
Loading
Loading
Loading
Loading
+5 −4
Original line number Original line Diff line number Diff line
@@ -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))
@@ -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);
		}
		}
@@ -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);
	}
	}
@@ -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);
	}
	}


+1 −1
Original line number Original line Diff line number Diff line
@@ -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;
+4 −2
Original line number Original line Diff line number Diff line
@@ -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 <
@@ -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) {
+2 −1
Original line number Original line Diff line number Diff line
@@ -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"
@@ -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;
+12 −8
Original line number Original line Diff line number Diff line
@@ -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>
@@ -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;
				}

			}
			}
		}
		}


@@ -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