Commit 6333ed8f authored by Haren Myneni's avatar Haren Myneni Committed by Herbert Xu

crypto: nx-842 - Mask XERS0 bit in return value

NX842 coprocessor sets 3rd bit in CR register with XER[S0] which is
nothing to do with NX request. Since this bit can be set with other
valuable return status, mast this bit.

One of other bits (INITIATED, BUSY or REJECTED) will be returned for
any given NX request.
Signed-off-by: default avatarHaren Myneni <haren@us.ibm.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 81b312f1
...@@ -164,6 +164,7 @@ struct coprocessor_request_block { ...@@ -164,6 +164,7 @@ struct coprocessor_request_block {
#define ICSWX_INITIATED (0x8) #define ICSWX_INITIATED (0x8)
#define ICSWX_BUSY (0x4) #define ICSWX_BUSY (0x4)
#define ICSWX_REJECTED (0x2) #define ICSWX_REJECTED (0x2)
#define ICSWX_XERS0 (0x1) /* undefined or set from XERSO. */
static inline int icswx(__be32 ccw, struct coprocessor_request_block *crb) static inline int icswx(__be32 ccw, struct coprocessor_request_block *crb)
{ {
......
...@@ -442,6 +442,14 @@ static int nx842_powernv_function(const unsigned char *in, unsigned int inlen, ...@@ -442,6 +442,14 @@ static int nx842_powernv_function(const unsigned char *in, unsigned int inlen,
(unsigned int)ccw, (unsigned int)ccw,
(unsigned int)be32_to_cpu(crb->ccw)); (unsigned int)be32_to_cpu(crb->ccw));
/*
* NX842 coprocessor sets 3rd bit in CR register with XER[S0].
* XER[S0] is the integer summary overflow bit which is nothing
* to do NX. Since this bit can be set with other return values,
* mask this bit.
*/
ret &= ~ICSWX_XERS0;
switch (ret) { switch (ret) {
case ICSWX_INITIATED: case ICSWX_INITIATED:
ret = wait_for_csb(wmem, csb); ret = wait_for_csb(wmem, csb);
...@@ -454,10 +462,6 @@ static int nx842_powernv_function(const unsigned char *in, unsigned int inlen, ...@@ -454,10 +462,6 @@ static int nx842_powernv_function(const unsigned char *in, unsigned int inlen,
pr_err_ratelimited("ICSWX rejected\n"); pr_err_ratelimited("ICSWX rejected\n");
ret = -EPROTO; ret = -EPROTO;
break; break;
default:
pr_err_ratelimited("Invalid ICSWX return code %x\n", ret);
ret = -EPROTO;
break;
} }
if (!ret) if (!ret)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment