OSDN Git Service

mmc: cmdq_hci: Remove runtime PM vote if request issuing fails
authorVeerabhadrarao Badiganti <vbadigan@codeaurora.org>
Mon, 9 Oct 2017 14:21:46 +0000 (19:51 +0530)
committerVeerabhadrarao Badiganti <vbadigan@codeaurora.org>
Fri, 24 Nov 2017 13:33:47 +0000 (19:03 +0530)
Remove the runtime PM vote if command-queue request processing fails.
Otherwise, in case command-queue request preparation fails,
the runtime PM votes go out of sync and sdhc platform device suspend
might get blocked.

Change-Id: Ibe95e1653f7558a7994b606922a1625b429d57f6
Signed-off-by: Veerabhadrarao Badiganti <vbadigan@codeaurora.org>
drivers/mmc/host/cmdq_hci.c

index 3f741f8..83d24fc 100644 (file)
@@ -805,7 +805,7 @@ static int cmdq_request(struct mmc_host *mmc, struct mmc_request *mrq)
                if (err) {
                        pr_err("%s: failed to configure crypto: err %d tag %d\n",
                                        mmc_hostname(mmc), err, tag);
-                       goto out;
+                       goto ice_err;
                }
        }
 
@@ -823,7 +823,7 @@ static int cmdq_request(struct mmc_host *mmc, struct mmc_request *mrq)
        if (err) {
                pr_err("%s: %s: failed to setup tx desc: %d\n",
                       mmc_hostname(mmc), __func__, err);
-               goto out;
+               goto desc_err;
        }
 
        cq_host->mrq_slot[tag] = mrq;
@@ -843,6 +843,22 @@ ring_doorbell:
        /* Commit the doorbell write immediately */
        wmb();
 
+       return err;
+
+desc_err:
+       if (cq_host->ops->crypto_cfg_end) {
+               err = cq_host->ops->crypto_cfg_end(mmc, mrq);
+               if (err) {
+                       pr_err("%s: failed to end ice config: err %d tag %d\n",
+                                       mmc_hostname(mmc), err, tag);
+               }
+       }
+       if (!(cq_host->caps & CMDQ_CAP_CRYPTO_SUPPORT) &&
+                       cq_host->ops->crypto_cfg_reset)
+               cq_host->ops->crypto_cfg_reset(mmc, tag);
+ice_err:
+       if (err)
+               cmdq_runtime_pm_put(cq_host);
 out:
        return err;
 }