Update some patch for uadk from mainline. To get more information, please visit the homepage: https://github.comp/Linaro/uadk Signed-off-by: Yang Shen <shenyang39@huawei.com>
476 lines
11 KiB
Diff
476 lines
11 KiB
Diff
From 746d250131c3727e658f11f37fbb0a8cb18d1b18 Mon Sep 17 00:00:00 2001
|
|
From: Wenkai Lin <linwenkai6@hisilicon.com>
|
|
Date: Sat, 23 Jul 2022 16:50:22 +0800
|
|
Subject: [PATCH 155/183] uadk: v1: fix goto warning
|
|
|
|
1. The goto statement can only jump down.
|
|
2. Fix wd_recv return value check.
|
|
|
|
Signed-off-by: Wenkai Lin <linwenkai6@hisilicon.com>
|
|
---
|
|
v1/drv/hisi_rng_udrv.c | 4 +--
|
|
v1/wd.c | 33 ++++++++++---------
|
|
v1/wd_comp.c | 25 ++++++++-------
|
|
v1/wd_dh.c | 72 ++++++++++++++++++++++++++----------------
|
|
v1/wd_ecc.c | 15 ++++++---
|
|
v1/wd_rng.c | 54 +++++++++++++++++--------------
|
|
v1/wd_rsa.c | 71 +++++++++++++++++++++++++----------------
|
|
7 files changed, 164 insertions(+), 110 deletions(-)
|
|
|
|
diff --git a/v1/drv/hisi_rng_udrv.c b/v1/drv/hisi_rng_udrv.c
|
|
index a66bca5..b86a948 100644
|
|
--- a/v1/drv/hisi_rng_udrv.c
|
|
+++ b/v1/drv/hisi_rng_udrv.c
|
|
@@ -97,7 +97,6 @@ static int rng_read(struct rng_queue_info *info, struct wcrypto_rng_msg *msg)
|
|
int val;
|
|
|
|
do {
|
|
-recv_again:
|
|
val = wd_reg_read((void *)((uintptr_t)info->mmio_base +
|
|
RNG_NUM_OFFSET));
|
|
if (!val) {
|
|
@@ -105,8 +104,9 @@ recv_again:
|
|
WD_ERR("read random data timeout\n");
|
|
break;
|
|
}
|
|
+
|
|
usleep(1);
|
|
- goto recv_again;
|
|
+ continue;
|
|
}
|
|
|
|
recv_count = 0;
|
|
diff --git a/v1/wd.c b/v1/wd.c
|
|
index 8ef83c6..2c435ba 100644
|
|
--- a/v1/wd.c
|
|
+++ b/v1/wd.c
|
|
@@ -524,7 +524,7 @@ static int get_queue_from_dev(struct wd_queue *q, const struct dev_info *dev)
|
|
qinfo->fd = open(q_path, O_RDWR | O_CLOEXEC);
|
|
if (qinfo->fd == -1) {
|
|
WD_ERR("open %s failed, errno = %d!\n", q_path, errno);
|
|
- return -ENODEV;
|
|
+ return -WD_ENODEV;
|
|
}
|
|
|
|
qinfo->hw_type = dev->api;
|
|
@@ -575,23 +575,26 @@ int wd_request_queue(struct wd_queue *q)
|
|
return -WD_ENOMEM;
|
|
};
|
|
q->qinfo = dinfop + 1;
|
|
-try_again:
|
|
- ret = find_available_res(q, dinfop, NULL);
|
|
- if (ret) {
|
|
- WD_ERR("cannot find available device\n");
|
|
- goto err_with_dev;
|
|
- }
|
|
|
|
- ret = get_queue_from_dev(q, (const struct dev_info *)dinfop);
|
|
- if (ret == -WD_ENODEV) {
|
|
- try_cnt++;
|
|
- if (try_cnt < _TRY_REQUEST_TIMES) {
|
|
+ do {
|
|
+ ret = find_available_res(q, dinfop, NULL);
|
|
+ if (ret) {
|
|
+ WD_ERR("cannot find available device\n");
|
|
+ goto err_with_dev;
|
|
+ }
|
|
+
|
|
+ ret = get_queue_from_dev(q, (const struct dev_info *)dinfop);
|
|
+ if (!ret) {
|
|
+ break;
|
|
+ } else {
|
|
+ if (try_cnt++ > _TRY_REQUEST_TIMES) {
|
|
+ WD_ERR("fail to get queue!\n");
|
|
+ goto err_with_dev;
|
|
+ }
|
|
+
|
|
memset(dinfop, 0, sizeof(*dinfop));
|
|
- goto try_again;
|
|
}
|
|
- WD_ERR("fail to get queue!\n");
|
|
- goto err_with_dev;
|
|
- }
|
|
+ } while (true);
|
|
|
|
ret = drv_open(q);
|
|
if (ret) {
|
|
diff --git a/v1/wd_comp.c b/v1/wd_comp.c
|
|
index 33546d4..2f1b8bd 100644
|
|
--- a/v1/wd_comp.c
|
|
+++ b/v1/wd_comp.c
|
|
@@ -243,19 +243,22 @@ int wcrypto_do_comp(void *ctx, struct wcrypto_comp_op_data *opdata, void *tag)
|
|
return ret;
|
|
|
|
resp = (void *)(uintptr_t)cctx->ctx_id;
|
|
-recv_again:
|
|
- ret = wd_recv(cctx->q, (void **)&resp);
|
|
- if (ret == -WD_HW_EACCESS) {
|
|
- WD_ERR("wd_recv hw err!\n");
|
|
- goto err_put_cookie;
|
|
- } else if (ret == 0) {
|
|
- if (++recv_count > MAX_RETRY_COUNTS) {
|
|
- WD_ERR("wd_recv timeout fail!\n");
|
|
- ret = -ETIMEDOUT;
|
|
+
|
|
+ do {
|
|
+ ret = wd_recv(cctx->q, (void **)&resp);
|
|
+ if (ret > 0) {
|
|
+ break;
|
|
+ } else if (!ret) {
|
|
+ if (++recv_count > MAX_RETRY_COUNTS) {
|
|
+ WD_ERR("wd_recv timeout fail!\n");
|
|
+ ret = -ETIMEDOUT;
|
|
+ goto err_put_cookie;
|
|
+ }
|
|
+ } else {
|
|
+ WD_ERR("failed to recv msg: ret = %d!\n", ret);
|
|
goto err_put_cookie;
|
|
}
|
|
- goto recv_again;
|
|
- }
|
|
+ } while (true);
|
|
|
|
opdata->consumed = resp->in_cons;
|
|
opdata->produced = resp->produced;
|
|
diff --git a/v1/wd_dh.c b/v1/wd_dh.c
|
|
index 49f52d9..1164f2c 100644
|
|
--- a/v1/wd_dh.c
|
|
+++ b/v1/wd_dh.c
|
|
@@ -307,6 +307,31 @@ static int do_dh_prepare(struct wcrypto_dh_op_data *opdata,
|
|
return 0;
|
|
}
|
|
|
|
+static int dh_send(struct wcrypto_dh_ctx *ctx, struct wcrypto_dh_msg *req)
|
|
+{
|
|
+ uint32_t tx_cnt = 0;
|
|
+ int ret;
|
|
+
|
|
+ do {
|
|
+ ret = wd_send(ctx->q, req);
|
|
+ if (!ret) {
|
|
+ break;
|
|
+ } else if (ret == -WD_EBUSY) {
|
|
+ if (tx_cnt++ > DH_RESEND_CNT) {
|
|
+ WD_ERR("do dh send cnt %u, exit!\n", tx_cnt);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ usleep(1);
|
|
+ } else {
|
|
+ WD_ERR("do dh wd_send err!\n");
|
|
+ break;
|
|
+ }
|
|
+ } while (true);
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
int wcrypto_do_dh(void *ctx, struct wcrypto_dh_op_data *opdata, void *tag)
|
|
{
|
|
struct wcrypto_dh_msg *resp = NULL;
|
|
@@ -314,46 +339,39 @@ int wcrypto_do_dh(void *ctx, struct wcrypto_dh_op_data *opdata, void *tag)
|
|
struct wcrypto_dh_cookie *cookie;
|
|
struct wcrypto_dh_msg *req;
|
|
uint32_t rx_cnt = 0;
|
|
- uint32_t tx_cnt = 0;
|
|
int ret;
|
|
|
|
ret = do_dh_prepare(opdata, &cookie, ctxt, &req, tag);
|
|
if (unlikely(ret))
|
|
return ret;
|
|
|
|
-send_again:
|
|
- ret = wd_send(ctxt->q, req);
|
|
- if (ret == -WD_EBUSY) {
|
|
- usleep(1);
|
|
- if (tx_cnt++ < DH_RESEND_CNT)
|
|
- goto send_again;
|
|
- else {
|
|
- WD_ERR("do dh send cnt %u, exit!\n", tx_cnt);
|
|
- goto fail_with_cookie;
|
|
- }
|
|
- } else if (unlikely(ret)) {
|
|
- WD_ERR("do dh wd_send err!\n");
|
|
+ ret = dh_send(ctxt, req);
|
|
+ if (unlikely(ret))
|
|
goto fail_with_cookie;
|
|
- }
|
|
|
|
if (tag)
|
|
return ret;
|
|
|
|
resp = (void *)(uintptr_t)ctxt->ctx_id;
|
|
-recv_again:
|
|
- ret = wd_recv(ctxt->q, (void **)&resp);
|
|
- if (!ret) {
|
|
- if (unlikely(rx_cnt++ >= DH_RECV_MAX_CNT)) {
|
|
- WD_ERR("failed to receive: timeout!\n");
|
|
- return -WD_ETIMEDOUT;
|
|
- } else if (balance > DH_BALANCE_THRHD) {
|
|
- usleep(1);
|
|
+
|
|
+ do {
|
|
+ ret = wd_recv(ctxt->q, (void **)&resp);
|
|
+ if (ret > 0) {
|
|
+ break;
|
|
+ } else if (!ret) {
|
|
+ if (unlikely(rx_cnt++ >= DH_RECV_MAX_CNT)) {
|
|
+ WD_ERR("failed to receive: timeout!\n");
|
|
+ ret = -WD_ETIMEDOUT;
|
|
+ goto fail_with_cookie;
|
|
+ }
|
|
+
|
|
+ if (balance > DH_BALANCE_THRHD)
|
|
+ usleep(1);
|
|
+ } else {
|
|
+ WD_ERR("do dh wd_recv err!\n");
|
|
+ goto fail_with_cookie;
|
|
}
|
|
- goto recv_again;
|
|
- } else if (unlikely(ret < 0)) {
|
|
- WD_ERR("do dh wd_recv err!\n");
|
|
- goto fail_with_cookie;
|
|
- }
|
|
+ } while (true);
|
|
|
|
balance = rx_cnt;
|
|
opdata->pri = (void *)resp->out;
|
|
diff --git a/v1/wd_ecc.c b/v1/wd_ecc.c
|
|
index 58dabfc..4f9ec53 100644
|
|
--- a/v1/wd_ecc.c
|
|
+++ b/v1/wd_ecc.c
|
|
@@ -1523,17 +1523,20 @@ static int ecc_send(struct wcrypto_ecc_ctx *ctx, struct wcrypto_ecc_msg *req)
|
|
|
|
do {
|
|
ret = wd_send(ctx->q, req);
|
|
- if (ret == -WD_EBUSY) {
|
|
+ if (!ret) {
|
|
+ break;
|
|
+ } else if (ret == -WD_EBUSY) {
|
|
if (tx_cnt++ >= ECC_RESEND_CNT) {
|
|
WD_ERR("failed to send: retry exit!\n");
|
|
break;
|
|
}
|
|
+
|
|
usleep(1);
|
|
} else if (unlikely(ret)) {
|
|
WD_ERR("failed to send: send error = %d!\n", ret);
|
|
break;
|
|
}
|
|
- } while (ret);
|
|
+ } while (true);
|
|
|
|
return ret;
|
|
}
|
|
@@ -1549,7 +1552,9 @@ static int ecc_sync_recv(struct wcrypto_ecc_ctx *ctx,
|
|
|
|
do {
|
|
ret = wd_recv(ctx->q, (void **)&resp);
|
|
- if (!ret) {
|
|
+ if (ret > 0) {
|
|
+ break;
|
|
+ } else if (!ret) {
|
|
if (rx_cnt++ >= ECC_RECV_MAX_CNT) {
|
|
WD_ERR("failed to recv: timeout!\n");
|
|
return -WD_ETIMEDOUT;
|
|
@@ -1557,11 +1562,11 @@ static int ecc_sync_recv(struct wcrypto_ecc_ctx *ctx,
|
|
|
|
if (balance > ECC_BALANCE_THRHD)
|
|
usleep(1);
|
|
- } else if (unlikely(ret < 0)) {
|
|
+ } else {
|
|
WD_ERR("failed to recv: error = %d!\n", ret);
|
|
return ret;
|
|
}
|
|
- } while (!ret);
|
|
+ } while (true);
|
|
|
|
balance = rx_cnt;
|
|
opdata->out = resp->out;
|
|
diff --git a/v1/wd_rng.c b/v1/wd_rng.c
|
|
index 7b3bda3..2077578 100644
|
|
--- a/v1/wd_rng.c
|
|
+++ b/v1/wd_rng.c
|
|
@@ -174,7 +174,7 @@ int wcrypto_rng_poll(struct wd_queue *q, unsigned int num)
|
|
if (!ret)
|
|
break;
|
|
|
|
- if (ret == -WD_EINVAL) {
|
|
+ if (ret < 0) {
|
|
WD_ERR("recv err at trng poll!\n");
|
|
return ret;
|
|
}
|
|
@@ -241,37 +241,45 @@ int wcrypto_do_rng(void *ctx, struct wcrypto_rng_op_data *opdata, void *tag)
|
|
if (ret)
|
|
return ret;
|
|
|
|
-send_again:
|
|
- ret = wd_send(ctxt->q, req);
|
|
- if (ret) {
|
|
- if (++tx_cnt > RNG_RESEND_CNT) {
|
|
- WD_ERR("do trng send cnt %u, exit!\n", tx_cnt);
|
|
+ do {
|
|
+ ret = wd_send(ctxt->q, req);
|
|
+ if (!ret) {
|
|
+ break;
|
|
+ } else if (ret == -WD_EBUSY) {
|
|
+ if (++tx_cnt > RNG_RESEND_CNT) {
|
|
+ WD_ERR("do trng send cnt %u, exit!\n", tx_cnt);
|
|
+ goto fail_with_cookie;
|
|
+ }
|
|
+
|
|
+ usleep(1);
|
|
+ } else {
|
|
+ WD_ERR("do rng wd_send err!\n");
|
|
goto fail_with_cookie;
|
|
}
|
|
- usleep(1);
|
|
- goto send_again;
|
|
- }
|
|
+ } while (true);
|
|
|
|
if (tag)
|
|
return ret;
|
|
|
|
resp = (void *)(uintptr_t)ctxt->ctx_id;
|
|
-recv_again:
|
|
- ret = wd_recv(ctxt->q, (void **)&resp);
|
|
- if (!ret) {
|
|
- if (++rx_cnt > RNG_RECV_CNT) {
|
|
- WD_ERR("do trng recv cnt %u, exit!\n", rx_cnt);
|
|
- ret = -WD_ETIMEDOUT;
|
|
+
|
|
+ do {
|
|
+ ret = wd_recv(ctxt->q, (void **)&resp);
|
|
+ if (ret > 0) {
|
|
+ break;
|
|
+ } else if (!ret) {
|
|
+ if (++rx_cnt > RNG_RECV_CNT) {
|
|
+ WD_ERR("do trng recv cnt %u, exit!\n", rx_cnt);
|
|
+ ret = -WD_ETIMEDOUT;
|
|
+ goto fail_with_cookie;
|
|
+ }
|
|
+
|
|
+ usleep(1);
|
|
+ } else {
|
|
+ WD_ERR("do trng recv err!\n");
|
|
goto fail_with_cookie;
|
|
}
|
|
- usleep(1);
|
|
- goto recv_again;
|
|
- }
|
|
-
|
|
- if (ret < 0) {
|
|
- WD_ERR("do trng recv err!\n");
|
|
- goto fail_with_cookie;
|
|
- }
|
|
+ } while (true);
|
|
|
|
opdata->out_bytes = resp->out_bytes;
|
|
ret = WD_SUCCESS;
|
|
diff --git a/v1/wd_rsa.c b/v1/wd_rsa.c
|
|
index 6ba29d7..f0cdda7 100644
|
|
--- a/v1/wd_rsa.c
|
|
+++ b/v1/wd_rsa.c
|
|
@@ -970,6 +970,31 @@ static int do_rsa_prepare(struct wcrypto_rsa_ctx *ctxt,
|
|
return 0;
|
|
}
|
|
|
|
+static int rsa_send(struct wcrypto_rsa_ctx *ctx, struct wcrypto_rsa_msg *req)
|
|
+{
|
|
+ uint32_t tx_cnt = 0;
|
|
+ int ret;
|
|
+
|
|
+ do {
|
|
+ ret = wd_send(ctx->q, req);
|
|
+ if (!ret) {
|
|
+ break;
|
|
+ } else if (ret == -WD_EBUSY) {
|
|
+ if (tx_cnt++ > RSA_RESEND_CNT) {
|
|
+ WD_ERR("do rsa send cnt %u, exit!\n", tx_cnt);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ usleep(1);
|
|
+ } else {
|
|
+ WD_ERR("do rsa wd_send err!\n");
|
|
+ break;
|
|
+ }
|
|
+ } while (true);
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
int wcrypto_do_rsa(void *ctx, struct wcrypto_rsa_op_data *opdata, void *tag)
|
|
{
|
|
struct wcrypto_rsa_msg *resp = NULL;
|
|
@@ -977,46 +1002,38 @@ int wcrypto_do_rsa(void *ctx, struct wcrypto_rsa_op_data *opdata, void *tag)
|
|
struct wcrypto_rsa_cookie *cookie;
|
|
struct wcrypto_rsa_msg *req;
|
|
uint32_t rx_cnt = 0;
|
|
- uint32_t tx_cnt = 0;
|
|
int ret;
|
|
|
|
ret = do_rsa_prepare(ctxt, opdata, &cookie, &req, tag);
|
|
if (unlikely(ret))
|
|
return ret;
|
|
|
|
-send_again:
|
|
- ret = wd_send(ctxt->q, req);
|
|
- if (ret == -WD_EBUSY) {
|
|
- usleep(1);
|
|
- if (tx_cnt++ < RSA_RESEND_CNT)
|
|
- goto send_again;
|
|
- else {
|
|
- WD_ERR("do rsa send cnt %u, exit!\n", tx_cnt);
|
|
- goto fail_with_cookie;
|
|
- }
|
|
- } else if (unlikely(ret)) {
|
|
- WD_ERR("do rsa wd_send err!\n");
|
|
+ ret = rsa_send(ctxt, req);
|
|
+ if (unlikely(ret))
|
|
goto fail_with_cookie;
|
|
- }
|
|
|
|
if (tag)
|
|
return ret;
|
|
|
|
resp = (void *)(uintptr_t)ctxt->ctx_id;
|
|
-recv_again:
|
|
- ret = wd_recv(ctxt->q, (void **)&resp);
|
|
- if (!ret) {
|
|
- if (unlikely(rx_cnt++ >= RSA_RECV_MAX_CNT)) {
|
|
- WD_ERR("failed to recv: timeout!\n");
|
|
- return -WD_ETIMEDOUT;
|
|
- } else if (balance > RSA_BALANCE_THRHD) {
|
|
- usleep(1);
|
|
+ do {
|
|
+ ret = wd_recv(ctxt->q, (void **)&resp);
|
|
+ if (ret > 0) {
|
|
+ break;
|
|
+ } else if (!ret) {
|
|
+ if (unlikely(rx_cnt++ >= RSA_RECV_MAX_CNT)) {
|
|
+ WD_ERR("failed to recv: timeout!\n");
|
|
+ ret = -WD_ETIMEDOUT;
|
|
+ goto fail_with_cookie;
|
|
+ }
|
|
+
|
|
+ if (balance > RSA_BALANCE_THRHD)
|
|
+ usleep(1);
|
|
+ } else {
|
|
+ WD_ERR("do rsa wd_recv err!\n");
|
|
+ goto fail_with_cookie;
|
|
}
|
|
- goto recv_again;
|
|
- } else if (unlikely(ret < 0)) {
|
|
- WD_ERR("do rsa wd_recv err!\n");
|
|
- goto fail_with_cookie;
|
|
- }
|
|
+ } while (true);
|
|
|
|
balance = rx_cnt;
|
|
opdata->out = (void *)resp->out;
|
|
--
|
|
2.27.0
|
|
|