crypto: nx-842 - Mask XERS0 bit in return value
authorHaren Myneni <haren@linux.vnet.ibm.com>
Sun, 13 Dec 2015 11:30:41 +0000 (03:30 -0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Thu, 17 Dec 2015 08:42:12 +0000 (16:42 +0800)
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: Haren Myneni <haren@us.ibm.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
arch/powerpc/include/asm/icswx.h
drivers/crypto/nx/nx-842-powernv.c

index 9f8402b351157d6bb5d5ab9ff7d9326cc5229298..27e588f6c72eec75b1a4f2644272ac16ebd4d7dd 100644 (file)
@@ -164,6 +164,7 @@ struct coprocessor_request_block {
 #define ICSWX_INITIATED                (0x8)
 #define ICSWX_BUSY             (0x4)
 #define ICSWX_REJECTED         (0x2)
+#define ICSWX_XERS0            (0x1)   /* undefined or set from XERSO. */
 
 static inline int icswx(__be32 ccw, struct coprocessor_request_block *crb)
 {
index 87f7a0f1a3ecc03ae7df87773bd71dc3a222c4b2..1710f80a09ec3b3227af8e2d04e9d3196dea031c 100644 (file)
@@ -442,6 +442,14 @@ static int nx842_powernv_function(const unsigned char *in, unsigned int inlen,
                             (unsigned int)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) {
        case ICSWX_INITIATED:
                ret = wait_for_csb(wmem, csb);
@@ -454,10 +462,6 @@ static int nx842_powernv_function(const unsigned char *in, unsigned int inlen,
                pr_err_ratelimited("ICSWX rejected\n");
                ret = -EPROTO;
                break;
-       default:
-               pr_err_ratelimited("Invalid ICSWX return code %x\n", ret);
-               ret = -EPROTO;
-               break;
        }
 
        if (!ret)