use HPI to interrupt background operations
PATCH 4/4 use HPI to interrupt background operations
Quoted 1 line
From
8d2cf8e4b890a3ef0c7b63da57b8b184ab64725dMon Sep 17 00:00:00 2001
From: Chuanxiao Dong <[email protected]>
Date: Tue, 23 Nov 2010 12:01:58 +0800
Subject: [PATCH 4/4] mmc: Add HPI operation to interrupt BKOPS
Before start a new user request, driver need to wait until the BKOPS finished, or use HPI to interrupt the BKOPS since user request has a higher priority than BKOPS.
This patch implemented using HPI to interrupt BKOPS if eMMC card supports HPI.
--- drivers/mmc/core/core.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 50 insertions(+), 1 deletions(-)
drivers/mmc/core/core.c +50 -1
@@ -202,6 +202,50 @@ static void mmc_wait_done(struct mmc_request *mrq) }/** +* mmc_issue_hpi_cmd - start a hpi to interrupt background +* operations +* @card: MMC card need to interrupt +* +* start MMC_SEND_STATUS/MMC_STOP_TRANSMISSION to stop the +* background operations. +* +* return value: +* 0: successfully interrupt BKOPS +* -EINVAL: HPI command invalid +* -EIO: failed when interrupt BKOPS +*/ +static int mmc_issue_hpi_cmd (struct mmc_card *card) +{ +struct mmc_command cmd; +unsigned int opcode; +unsigned int flags; +int err; + + opcode = card->ext_csd.hpi_cmd; +if (opcode ==MMC_STOP_TRANSMISSION ) + flags =MMC_RSP_R1B |MMC_CMD_AC ; +else if (opcode ==MMC_SEND_STATUS ) + flags =MMC_RSP_R1 |MMC_CMD_AC ; +else +return -EINVAL ; + +memset (&cmd,0 ,sizeof (struct mmc_command )); + cmd.opcode = opcode; + cmd.arg = card->rca <<16 |1 ; + err =mmc_wait_for_cmd (card->host, &cmd,0 ); +if (err || (cmd.resp[0 ] &0xFDF92000 )) { +printk (KERN_ERR "error %d requesting status %#x\n" , + err, cmd.resp[0 ]); +/* +* abandon this BKOPS, let block layer handle +* this +*/ +return -EIO ; + } +return 0 ; +} + +/** * mmc_wait_for_bkops- start a bkops check and wait for * completion * @card: MMC card need to check
@@ -224,9 +268,14 @@ retry:if (card->ext_csd.hpi_en) {/* -* TODO * HPI to interrupt BKOPS if supported */ + err =mmc_issue_hpi_cmd (card); +if (err == -EINVAL ) { +/* disable HPI feature */ + card->ext_csd.hpi_en =0 ; + goto retry; + } }else {memset (&cmd,0 ,sizeof (struct mmc_command ));
Signature · 1 line
1.6.6.1
Quoted 45 lines · Chuanxiao Dong
From
8d2cf8e4b890a3ef0c7b63da57b8b184ab64725dMon Sep 17 00:00:00 2001
From: Chuanxiao Dong <[email protected]>
Date: Tue, 23 Nov 2010 12:01:58 +0800
Subject: [PATCH 4/4] mmc: Add HPI operation to interrupt BKOPSBefore start a new user request, driver need to wait until the BKOPS finished, or use HPI to interrupt the BKOPS since user request has a higher priority than BKOPS.
This patch implemented using HPI to interrupt BKOPS if eMMC card supports HPI.
Signed-off-by Chuanxiao Dong <[email protected]>---
drivers/mmc/core/core.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++-1 files changed, 50 insertions(+), 1 deletions(-)drivers/mmc/core/core.c +20
-0@@ -202,6 +202,50 @@ static void mmc_wait_done(struct mmc_request *mrq) } /** +* mmc_issue_hpi_cmd - start a hpi to interrupt background +* operations +* @card: MMC card need to interrupt +* +* start MMC_SEND_STATUS/MMC_STOP_TRANSMISSION to stop the +* background operations. +* +* return value: +* 0: successfully interrupt BKOPS +* -EINVAL: HPI command invalid +* -EIO: failed when interrupt BKOPS +*/ +static int mmc_issue_hpi_cmd (struct mmc_card *card) +{ + struct mmc_command cmd; + unsigned int opcode; + unsigned int flags; + int err; + + opcode = card->ext_csd.hpi_cmd;
drivers/mmc/core/core.c static void mmc_wait_done(struct mmc_request *mrq) · line 234
Quoted 10 lines
drivers/mmc/core/core.c +10
-0+ if (opcode == MMC_STOP_TRANSMISSION) + flags = MMC_RSP_R1B | MMC_CMD_AC; + else if (opcode == MMC_SEND_STATUS) + flags = MMC_RSP_R1 | MMC_CMD_AC; + else + return -EINVAL; + + memset(&cmd, 0, sizeof(struct mmc_command)); + cmd.opcode = opcode; + cmd.arg = card->rca << 16 | 1;
Maybe missing set the flags;
cmd.flags = flags;
Thank you,
Kyungmin Park
Quoted 42 lines
drivers/mmc/core/core.c +20
-2+ err = mmc_wait_for_cmd(card->host, &cmd, 0); + if (err || (cmd.resp[0] & 0xFDF92000)) { + printk(KERN_ERR "error %d requesting status %#x\n", + err, cmd.resp[0]); + /* + * abandon this BKOPS, let block layer handle + * this + */ + return -EIO; + } + return 0; +} + +/** * mmc_wait_for_bkops- start a bkops check and wait for * completion * @card: MMC card need to check @@ -224,9 +268,14 @@ retry: if (card->ext_csd.hpi_en) { /* - * TODO * HPI to interrupt BKOPS if supported */ + err = mmc_issue_hpi_cmd(card); + if (err == -EINVAL) { + /* disable HPI feature */ + card->ext_csd.hpi_en = 0; + goto retry; + } } else { memset(&cmd, 0, sizeof(struct mmc_command)); --1.6.6.1
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Quoted 11 lines
Quoted 11 lines
+ opcode =
card->ext_csd.hpi_cmd;
+ if (opcode ==MMC_STOP_TRANSMISSION)
+ flags =MMC_RSP_R1B|MMC_CMD_AC;
+ else if (opcode ==MMC_SEND_STATUS)
+ flags =MMC_RSP_R1|MMC_CMD_AC;
+ else
+ return-EINVAL;
+
+memset(&cmd, 0, sizeof(struct mmc_command));
+ cmd.opcode = opcode;
+ cmd.arg =card->rca<< 16 | 1;
Quoted 5 lines
Maybe missing set the flags;
cmd.flags = flags;Thank you,
Kyungmin Park
Thank you Park, will fix these bad mistake in the next version submission.