From 794efce0c21613f12b67db9a7e52d162976d4d4a Mon Sep 17 00:00:00 2001 From: Matt Derksen Date: Fri, 16 Aug 2019 12:38:34 -0500 Subject: [PATCH] Fix retry failure in nvdimmWriteData() Need to create a local variable for i_dataLen, because deviceOp will alter the i_dataLen value on failure (ie NACK). Change-Id: If73efb77a1ba918fbc1bb7decd8fb46a5d2014b9 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/82344 Tested-by: Jenkins Server Tested-by: Jenkins OP Build CI Tested-by: Jenkins OP HW Tested-by: FSP CI Jenkins Reviewed-by: TSUNG K YEUNG Reviewed-by: Matthew Raybuck Reviewed-by: Daniel M Crowell --- src/usr/isteps/nvdimm/nvdimmdd.C | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/usr/isteps/nvdimm/nvdimmdd.C b/src/usr/isteps/nvdimm/nvdimmdd.C index ce6fa65d833..875c217d407 100755 --- a/src/usr/isteps/nvdimm/nvdimmdd.C +++ b/src/usr/isteps/nvdimm/nvdimmdd.C @@ -922,6 +922,7 @@ errlHndl_t nvdimmWriteData( TARGETING::Target * i_target, ENTER_MRK"nvdimmWriteData()"); errlHndl_t err = nullptr; errlHndl_t err_retryable = nullptr; + size_t data_length; do { /***********************************************************/ @@ -931,13 +932,15 @@ errlHndl_t nvdimmWriteData( TARGETING::Target * i_target, retry <= NVDIMM_MAX_RETRIES; retry++) { + data_length = i_dataLen; + // Do the actual data write if ( i_dataLen == sizeof(uint16_t) ) { err = deviceOp( DeviceFW::WRITE, i_target, i_dataToWrite, - i_dataLen, + data_length, DeviceFW::I2C, I2C_SMBUS_RW_W_CMD_PARAMS( DeviceFW::I2C_SMBUS_WORD_NO_PEC, @@ -954,7 +957,7 @@ errlHndl_t nvdimmWriteData( TARGETING::Target * i_target, err = deviceOp( DeviceFW::WRITE, i_target, i_dataToWrite, - i_dataLen, + data_length, DEVICE_I2C_ADDRESS_OFFSET( i_i2cInfo.port, i_i2cInfo.engine, @@ -978,7 +981,7 @@ errlHndl_t nvdimmWriteData( TARGETING::Target * i_target, "Write Non-Retryable fail %d/%d/0x%X, " "ldl=%d, offset=0x%X, aS=%d, retry=%d", i_i2cInfo.port, i_i2cInfo.engine, - i_i2cInfo.devAddr, i_dataLen, + i_i2cInfo.devAddr, data_length, i_i2cInfo.offset, i_i2cInfo.addrSize, retry); // Printing mux info separately, if combined, nothing is displayed