summaryrefslogtreecommitdiff
path: root/drivers/crypto/tegra-aes.c
diff options
context:
space:
mode:
authorVarun Wadekar <vwadekar@nvidia.com>2012-01-19 11:15:17 +0530
committerVarun Colbert <vcolbert@nvidia.com>2012-01-20 13:43:48 -0800
commitc374aa6b1516cd760729328b1035db8869c4bab9 (patch)
tree32cb458ec7f3f05d98927adbaa898e530a0c0815 /drivers/crypto/tegra-aes.c
parent5bb220e06c656e04393c9a1af7641b50e5969cdc (diff)
crypto: tegra-aes: get hardware ownership before copying key
Bug 917607 Change-Id: I049ca03efe7953dc6a6c03eaa4acce85e15662d1 Signed-off-by: Varun Wadekar <vwadekar@nvidia.com> Reviewed-on: http://git-master/r/76154 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Sanjay Singh Rawat <srawat@nvidia.com>
Diffstat (limited to 'drivers/crypto/tegra-aes.c')
-rw-r--r--drivers/crypto/tegra-aes.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/drivers/crypto/tegra-aes.c b/drivers/crypto/tegra-aes.c
index c042e52348fc..45f3ccb881a6 100644
--- a/drivers/crypto/tegra-aes.c
+++ b/drivers/crypto/tegra-aes.c
@@ -709,6 +709,18 @@ static int tegra_aes_setkey(struct crypto_ablkcipher *tfm, const u8 *key,
return -EINVAL;
}
+ /* take the hardware semaphore */
+ if (tegra_arb_mutex_lock_timeout(dd->bsev.res_id, ARB_SEMA_TIMEOUT) < 0) {
+ dev_err(dd->dev, "aes hardware (%d) not available\n", dd->bsev.res_id);
+ return -EBUSY;
+ }
+
+ if (tegra_arb_mutex_lock_timeout(dd->bsea.res_id, ARB_SEMA_TIMEOUT) < 0) {
+ dev_err(dd->dev, "aes hardware (%d) not available\n", dd->bsea.res_id);
+ tegra_arb_mutex_unlock(dd->bsev.res_id);
+ return -EBUSY;
+ }
+
dev_dbg(dd->dev, "keylen: %d\n", keylen);
ctx->dd = dd;
@@ -718,7 +730,7 @@ static int tegra_aes_setkey(struct crypto_ablkcipher *tfm, const u8 *key,
key_slot = aes_find_key_slot(dd);
if (!key_slot) {
dev_err(dd->dev, "no empty slot\n");
- return -ENOMEM;
+ goto out;
}
ctx->slot = key_slot;
}
@@ -735,6 +747,10 @@ static int tegra_aes_setkey(struct crypto_ablkcipher *tfm, const u8 *key,
dd->bsev.new_key = true;
dd->bsea.new_key = true;
+
+out:
+ tegra_arb_mutex_unlock(dd->bsev.res_id);
+ tegra_arb_mutex_unlock(dd->bsea.res_id);
dev_dbg(dd->dev, "done\n");
return 0;
}