crypto: caam - fix return code in completion callbacks
Modify drive to provide a valid errno (and not the HW error ID) to the user, via completion callbacks. A "valid errno" is currently not explicitly mentioned in the docs, however the error code is expected to match the one returned by the generic SW implementation. Note: in most error cases caam/qi and caam/qi2 returned -EIO; align all caam drivers to return -EINVAL. While here, ratelimit prints triggered by fuzz testing, such that console is not flooded. Signed-off-by: Horia Geantă <horia.geanta@nxp.com> Signed-off-by: Iuliana Prodan <iuliana.prodan@nxp.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:

committad av
Herbert Xu

förälder
51fab3d730
incheckning
1984aaeec3
@@ -930,19 +930,20 @@ static void aead_encrypt_done(struct device *jrdev, u32 *desc, u32 err,
|
||||
{
|
||||
struct aead_request *req = context;
|
||||
struct aead_edesc *edesc;
|
||||
int ecode = 0;
|
||||
|
||||
dev_dbg(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err);
|
||||
|
||||
edesc = container_of(desc, struct aead_edesc, hw_desc[0]);
|
||||
|
||||
if (err)
|
||||
caam_jr_strstatus(jrdev, err);
|
||||
ecode = caam_jr_strstatus(jrdev, err);
|
||||
|
||||
aead_unmap(jrdev, edesc, req);
|
||||
|
||||
kfree(edesc);
|
||||
|
||||
aead_request_complete(req, err);
|
||||
aead_request_complete(req, ecode);
|
||||
}
|
||||
|
||||
static void aead_decrypt_done(struct device *jrdev, u32 *desc, u32 err,
|
||||
@@ -950,25 +951,20 @@ static void aead_decrypt_done(struct device *jrdev, u32 *desc, u32 err,
|
||||
{
|
||||
struct aead_request *req = context;
|
||||
struct aead_edesc *edesc;
|
||||
int ecode = 0;
|
||||
|
||||
dev_dbg(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err);
|
||||
|
||||
edesc = container_of(desc, struct aead_edesc, hw_desc[0]);
|
||||
|
||||
if (err)
|
||||
caam_jr_strstatus(jrdev, err);
|
||||
ecode = caam_jr_strstatus(jrdev, err);
|
||||
|
||||
aead_unmap(jrdev, edesc, req);
|
||||
|
||||
/*
|
||||
* verify hw auth check passed else return -EBADMSG
|
||||
*/
|
||||
if ((err & JRSTA_CCBERR_ERRID_MASK) == JRSTA_CCBERR_ERRID_ICVCHK)
|
||||
err = -EBADMSG;
|
||||
|
||||
kfree(edesc);
|
||||
|
||||
aead_request_complete(req, err);
|
||||
aead_request_complete(req, ecode);
|
||||
}
|
||||
|
||||
static void skcipher_encrypt_done(struct device *jrdev, u32 *desc, u32 err,
|
||||
@@ -978,13 +974,14 @@ static void skcipher_encrypt_done(struct device *jrdev, u32 *desc, u32 err,
|
||||
struct skcipher_edesc *edesc;
|
||||
struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
|
||||
int ivsize = crypto_skcipher_ivsize(skcipher);
|
||||
int ecode = 0;
|
||||
|
||||
dev_dbg(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err);
|
||||
|
||||
edesc = container_of(desc, struct skcipher_edesc, hw_desc[0]);
|
||||
|
||||
if (err)
|
||||
caam_jr_strstatus(jrdev, err);
|
||||
ecode = caam_jr_strstatus(jrdev, err);
|
||||
|
||||
skcipher_unmap(jrdev, edesc, req);
|
||||
|
||||
@@ -1008,7 +1005,7 @@ static void skcipher_encrypt_done(struct device *jrdev, u32 *desc, u32 err,
|
||||
|
||||
kfree(edesc);
|
||||
|
||||
skcipher_request_complete(req, err);
|
||||
skcipher_request_complete(req, ecode);
|
||||
}
|
||||
|
||||
static void skcipher_decrypt_done(struct device *jrdev, u32 *desc, u32 err,
|
||||
@@ -1018,12 +1015,13 @@ static void skcipher_decrypt_done(struct device *jrdev, u32 *desc, u32 err,
|
||||
struct skcipher_edesc *edesc;
|
||||
struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
|
||||
int ivsize = crypto_skcipher_ivsize(skcipher);
|
||||
int ecode = 0;
|
||||
|
||||
dev_dbg(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err);
|
||||
|
||||
edesc = container_of(desc, struct skcipher_edesc, hw_desc[0]);
|
||||
if (err)
|
||||
caam_jr_strstatus(jrdev, err);
|
||||
ecode = caam_jr_strstatus(jrdev, err);
|
||||
|
||||
skcipher_unmap(jrdev, edesc, req);
|
||||
|
||||
@@ -1047,7 +1045,7 @@ static void skcipher_decrypt_done(struct device *jrdev, u32 *desc, u32 err,
|
||||
|
||||
kfree(edesc);
|
||||
|
||||
skcipher_request_complete(req, err);
|
||||
skcipher_request_complete(req, ecode);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Referens i nytt ärende
Block a user