diff options
author | Nishanth Menon <nm@ti.com> | 2013-12-03 20:43:13 -0500 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2013-12-05 08:28:43 -0500 |
commit | f7b2b5dd6a62a47e871627c71ed01aa3482154d9 (patch) | |
tree | 4de401a7a20a39b801b5d2e672e7c3e9b5afc125 /drivers/crypto/omap-aes.c | |
parent | c0e656b7a6e1ac03b2921d49211a735893efd544 (diff) |
crypto: omap-aes - add error check for pm_runtime_get_sync
The AES driver currently assumes that pm_runtime_get_sync will always
succeed, which may not always be true, so add error handling for the
same.
This scenario was reported in the following bug:
place. https://bugzilla.kernel.org/show_bug.cgi?id=66441
Reported-by: Tobias Jakobi <tjakobi@math.uni-bielefeld.de>
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'drivers/crypto/omap-aes.c')
-rw-r--r-- | drivers/crypto/omap-aes.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/drivers/crypto/omap-aes.c b/drivers/crypto/omap-aes.c index a9ccbf14096e..dde41f1df608 100644 --- a/drivers/crypto/omap-aes.c +++ b/drivers/crypto/omap-aes.c | |||
@@ -784,6 +784,7 @@ static int omap_aes_ctr_decrypt(struct ablkcipher_request *req) | |||
784 | static int omap_aes_cra_init(struct crypto_tfm *tfm) | 784 | static int omap_aes_cra_init(struct crypto_tfm *tfm) |
785 | { | 785 | { |
786 | struct omap_aes_dev *dd = NULL; | 786 | struct omap_aes_dev *dd = NULL; |
787 | int err; | ||
787 | 788 | ||
788 | /* Find AES device, currently picks the first device */ | 789 | /* Find AES device, currently picks the first device */ |
789 | spin_lock_bh(&list_lock); | 790 | spin_lock_bh(&list_lock); |
@@ -792,7 +793,13 @@ static int omap_aes_cra_init(struct crypto_tfm *tfm) | |||
792 | } | 793 | } |
793 | spin_unlock_bh(&list_lock); | 794 | spin_unlock_bh(&list_lock); |
794 | 795 | ||
795 | pm_runtime_get_sync(dd->dev); | 796 | err = pm_runtime_get_sync(dd->dev); |
797 | if (err < 0) { | ||
798 | dev_err(dd->dev, "%s: failed to get_sync(%d)\n", | ||
799 | __func__, err); | ||
800 | return err; | ||
801 | } | ||
802 | |||
796 | tfm->crt_ablkcipher.reqsize = sizeof(struct omap_aes_reqctx); | 803 | tfm->crt_ablkcipher.reqsize = sizeof(struct omap_aes_reqctx); |
797 | 804 | ||
798 | return 0; | 805 | return 0; |
@@ -1182,7 +1189,12 @@ static int omap_aes_probe(struct platform_device *pdev) | |||
1182 | dd->phys_base = res.start; | 1189 | dd->phys_base = res.start; |
1183 | 1190 | ||
1184 | pm_runtime_enable(dev); | 1191 | pm_runtime_enable(dev); |
1185 | pm_runtime_get_sync(dev); | 1192 | err = pm_runtime_get_sync(dev); |
1193 | if (err < 0) { | ||
1194 | dev_err(dev, "%s: failed to get_sync(%d)\n", | ||
1195 | __func__, err); | ||
1196 | goto err_res; | ||
1197 | } | ||
1186 | 1198 | ||
1187 | omap_aes_dma_stop(dd); | 1199 | omap_aes_dma_stop(dd); |
1188 | 1200 | ||