mmc: mmc_test: Disable Command Queue while mmc_test is used
authorAdrian Hunter <adrian.hunter@intel.com>
Mon, 13 Mar 2017 12:36:38 +0000 (14:36 +0200)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 24 Apr 2017 19:42:02 +0000 (21:42 +0200)
Normal read and write commands may not be used while the command queue is
enabled. Disable the Command Queue when mmc_test is probed and re-enable it
when it is removed.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Reviewed-by: Harjani Ritesh <riteshh@codeaurora.org>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/core/mmc.c
drivers/mmc/core/mmc_test.c
include/linux/mmc/card.h

index 35b2d0f767cac68df2a12ef7620355c8e7ae57b6..2c87dede584110919e2191a32e0b838c0c8cfc59 100644 (file)
@@ -1789,6 +1789,13 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
                }
        }
 
+       /*
+        * In some cases (e.g. RPMB or mmc_test), the Command Queue must be
+        * disabled for a time, so a flag is needed to indicate to re-enable the
+        * Command Queue.
+        */
+       card->reenable_cmdq = card->ext_csd.cmdq_en;
+
        /*
         * The mandatory minimum values are defined for packed command.
         * read: 5, write: 3
index f99ac3123fd26dc68fb0a03be8babe7637a39d62..fd1b4b8510b9bc46e402b4ebe7f978860175e1d8 100644 (file)
@@ -26,6 +26,7 @@
 #include "card.h"
 #include "host.h"
 #include "bus.h"
+#include "mmc_ops.h"
 
 #define RESULT_OK              0
 #define RESULT_FAIL            1
@@ -3264,6 +3265,14 @@ static int mmc_test_probe(struct mmc_card *card)
        if (ret)
                return ret;
 
+       if (card->ext_csd.cmdq_en) {
+               mmc_claim_host(card->host);
+               ret = mmc_cmdq_disable(card);
+               mmc_release_host(card->host);
+               if (ret)
+                       return ret;
+       }
+
        dev_info(&card->dev, "Card claimed for testing.\n");
 
        return 0;
@@ -3271,6 +3280,11 @@ static int mmc_test_probe(struct mmc_card *card)
 
 static void mmc_test_remove(struct mmc_card *card)
 {
+       if (card->reenable_cmdq) {
+               mmc_claim_host(card->host);
+               mmc_cmdq_enable(card);
+               mmc_release_host(card->host);
+       }
        mmc_test_free_result(card);
        mmc_test_free_dbgfs_file(card);
 }
index 94637796b99c2eed1438328c2eda3220ed67e6ec..85b5f2bc8bb9e3ae4bb3000d171e365f1c9e55e4 100644 (file)
@@ -269,6 +269,8 @@ struct mmc_card {
 #define MMC_QUIRK_TRIM_BROKEN  (1<<12)         /* Skip trim */
 #define MMC_QUIRK_BROKEN_HPI   (1<<13)         /* Disable broken HPI support */
 
+       bool                    reenable_cmdq;  /* Re-enable Command Queue */
+
        unsigned int            erase_size;     /* erase size in sectors */
        unsigned int            erase_shift;    /* if erase unit is power 2 */
        unsigned int            pref_erase;     /* in sectors */