[Pdbg] [PATCH] libpdbg/adu: always release the adu lock before returning from an error

Rashmica Gupta rashmica.g at gmail.com
Fri Oct 5 13:47:42 AEST 2018


Signed-off-by: Rashmica Gupta <rashmica.g at gmail.com>
---
 libpdbg/adu.c        | 29 ++++++++++++++++-------------
 libpdbg/operations.h |  2 +-
 2 files changed, 17 insertions(+), 14 deletions(-)

diff --git a/libpdbg/adu.c b/libpdbg/adu.c
index 27049b7..375deda 100644
--- a/libpdbg/adu.c
+++ b/libpdbg/adu.c
@@ -237,6 +237,7 @@ static int adu_reset(struct adu *adu)
 static int p8_adu_getmem(struct adu *adu, uint64_t addr, uint64_t *data, int ci)
 {
 	uint64_t ctrl_reg, cmd_reg, val;
+	int rc = 0;
 
 	CHECK_ERR(adu_lock(adu));
 
@@ -248,25 +249,25 @@ static int p8_adu_getmem(struct adu *adu, uint64_t addr, uint64_t *data, int ci)
 		ctrl_reg = SETFIELD(P8_FBC_ALTD_TTYPE, ctrl_reg, P8_TTYPE_DMA_PARTIAL_READ);
 	ctrl_reg = SETFIELD(P8_FBC_ALTD_TSIZE, ctrl_reg, 8);
 
-	CHECK_ERR(pib_read(&adu->target, P8_ALTD_CMD_REG, &cmd_reg));
+	CHECK_ERR_GOTO(out, rc = pib_read(&adu->target, P8_ALTD_CMD_REG, &cmd_reg));
 	cmd_reg |= FBC_ALTD_START_OP;
 	cmd_reg = SETFIELD(FBC_ALTD_SCOPE, cmd_reg, SCOPE_SYSTEM);
 	cmd_reg = SETFIELD(FBC_ALTD_DROP_PRIORITY, cmd_reg, DROP_PRIORITY_MEDIUM);
 
 retry:
 	/* Clear status bits */
-	CHECK_ERR(adu_reset(adu));
+	CHECK_ERR_GOTO(out, rc = adu_reset(adu));
 
 	/* Set the address */
 	ctrl_reg = SETFIELD(P8_FBC_ALTD_ADDRESS, ctrl_reg, addr);
-	CHECK_ERR(pib_write(&adu->target, P8_ALTD_CONTROL_REG, ctrl_reg));
+	CHECK_ERR_GOTO(out, rc = pib_write(&adu->target, P8_ALTD_CONTROL_REG, ctrl_reg));
 
 	/* Start the command */
-	CHECK_ERR(pib_write(&adu->target, P8_ALTD_CMD_REG, cmd_reg));
+	CHECK_ERR_GOTO(out, rc = pib_write(&adu->target, P8_ALTD_CMD_REG, cmd_reg));
 
 	/* Wait for completion */
 	do {
-		CHECK_ERR(pib_read(&adu->target, P8_ALTD_STATUS_REG, &val));
+		CHECK_ERR_GOTO(out, rc = pib_read(&adu->target, P8_ALTD_STATUS_REG, &val));
 	} while (!val);
 
 	if( !(val & FBC_ALTD_ADDR_DONE) ||
@@ -283,11 +284,12 @@ retry:
 	}
 
 	/* Read data */
-	CHECK_ERR(pib_read(&adu->target, P8_ALTD_DATA_REG, data));
+	CHECK_ERR_GOTO(out, rc = pib_read(&adu->target, P8_ALTD_DATA_REG, data));
 
+out:
 	adu_unlock(adu);
+	return rc;
 
-	return 0;
 }
 
 int p8_adu_putmem(struct adu *adu, uint64_t addr, uint64_t data, int size, int ci)
@@ -304,29 +306,29 @@ int p8_adu_putmem(struct adu *adu, uint64_t addr, uint64_t data, int size, int c
 		ctrl_reg = SETFIELD(P8_FBC_ALTD_TTYPE, ctrl_reg, P8_TTYPE_DMA_PARTIAL_WRITE);
 	ctrl_reg = SETFIELD(P8_FBC_ALTD_TSIZE, ctrl_reg, size);
 
-	CHECK_ERR(pib_read(&adu->target, P8_ALTD_CMD_REG, &cmd_reg));
+	CHECK_ERR_GOTO(out, rc = pib_read(&adu->target, P8_ALTD_CMD_REG, &cmd_reg));
 	cmd_reg |= FBC_ALTD_START_OP;
 	cmd_reg = SETFIELD(FBC_ALTD_SCOPE, cmd_reg, SCOPE_SYSTEM);
 	cmd_reg = SETFIELD(FBC_ALTD_DROP_PRIORITY, cmd_reg, DROP_PRIORITY_MEDIUM);
 
 	/* Clear status bits */
-	CHECK_ERR(adu_reset(adu));
+	CHECK_ERR_GOTO(out, rc = adu_reset(adu));
 
 	/* Set the address */
 	ctrl_reg = SETFIELD(P8_FBC_ALTD_ADDRESS, ctrl_reg, addr);
 
 retry:
-	CHECK_ERR(pib_write(&adu->target, P8_ALTD_CONTROL_REG, ctrl_reg));
+	CHECK_ERR_GOTO(out, rc = pib_write(&adu->target, P8_ALTD_CONTROL_REG, ctrl_reg));
 
 	/* Write the data */
-	CHECK_ERR(pib_write(&adu->target, P8_ALTD_DATA_REG, data));
+	CHECK_ERR_GOTO(out, rc = pib_write(&adu->target, P8_ALTD_DATA_REG, data));
 
 	/* Start the command */
-	CHECK_ERR(pib_write(&adu->target, P8_ALTD_CMD_REG, cmd_reg));
+	CHECK_ERR_GOTO(out, rc = pib_write(&adu->target, P8_ALTD_CMD_REG, cmd_reg));
 
 	/* Wait for completion */
 	do {
-		CHECK_ERR(pib_read(&adu->target, P8_ALTD_STATUS_REG, &val));
+		CHECK_ERR_GOTO(out, rc = pib_read(&adu->target, P8_ALTD_STATUS_REG, &val));
 	} while (!val);
 
 	if( !(val & FBC_ALTD_ADDR_DONE) ||
@@ -341,6 +343,7 @@ retry:
 		}
 	}
 
+out:
 	adu_unlock(adu);
 
 	return rc;
diff --git a/libpdbg/operations.h b/libpdbg/operations.h
index 96a7c01..dc5042a 100644
--- a/libpdbg/operations.h
+++ b/libpdbg/operations.h
@@ -29,7 +29,7 @@
 	} while(0)
 
 #define CHECK_ERR_GOTO(label, x) do {				\
-	if (x) {	       					\
+	if ((x)) {	       					\
 		PRINT_ERR;					\
 		goto label;					\
 	}							\
-- 
2.14.4



More information about the Pdbg mailing list