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 35b2d0f..2c87ded 100644 (file)
@@ -1790,6 +1790,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 f99ac31..fd1b4b8 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 9463779..85b5f2b 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 */