}\r
#endif\r
\r
-/*\r
- * Request a read of a block from MemIf
- */\r
-static Std_ReturnType ReadBlock(const NvM_BlockDescriptorType *blockDescriptor,\r
- AdministrativeBlockType *adminBlock,\r
- uint8 setNumber,\r
- uint16 blockOffset,\r
- uint8 *destAddress,\r
- uint16 length )\r
-{\r
- Std_ReturnType returnCode;\r
-\r
- if (setNumber < blockDescriptor->NvBlockNum) {\r
- SetMemifJobBusy();\r
- MemIfJobAdmin.BlockAdmin = adminBlock;\r
- MemIfJobAdmin.BlockDescriptor = blockDescriptor;\r
- returnCode = MemIf_Read(blockDescriptor->NvramDeviceId, BLOCK_BASE_AND_SET_TO_BLOCKNR(blockDescriptor->NvBlockBaseNumber, setNumber), blockOffset, destAddress, length );\r
- if (returnCode != E_OK) {\r
- AbortMemIfJob(MEMIF_JOB_FAILED);\r
- }\r
- } else if (setNumber < blockDescriptor->NvBlockNum + blockDescriptor->RomBlockNum) {\r
- // TODO: Read from ROM\r
- } else {\r
- // Error: setNumber out of range\r
- returnCode = E_NOT_OK;\r
- DET_REPORTERROR(MODULE_ID_NVM, 0, NVM_LOC_READ_BLOCK_ID, NVM_PARAM_OUT_OF_RANGE);\r
- }\r
-\r
- return returnCode;\r
-}\r
-\r
-\r
/*\r
* Initiate the read all job
*/\r
blockDone = 1;\r
break; /* Do NOT advance to next state */\r
} else {\r
+ uint8 setNumber = admPtr->DataIndex;\r
+ uint16 length = bPtr->NvBlockLength+crcLen;\r
+ Std_ReturnType rv;\r
+ boolean fail = FALSE;\r
+\r
+ /*\r
+ * Read the Block\r
+ */\r
+\r
+ if (setNumber < bPtr->NvBlockNum) {\r
+ SetMemifJobBusy();\r
+ MemIfJobAdmin.BlockAdmin = admPtr;\r
+ MemIfJobAdmin.BlockDescriptor = bPtr;\r
+ imask_t state;\r
+\r
+ /* First reading the MemIf block and then checking MemIf_GetStatus() to determine\r
+ * if the device BUSY in anyway...is not threadsafe. The way Autosar have defined\r
+ * it you would have to lock over the MemIf_Read() to be sure.\r
+ */\r
+ Irq_Save(state);\r
\r
- if( ReadBlock(bPtr, admPtr, admPtr->DataIndex, 0, Nvm_WorkBuffer, bPtr->NvBlockLength+crcLen) != E_OK ) {\r
+ /* We want to read from MemIf, but the device may be busy.\r
+ */\r
+ rv = MemIf_Read(bPtr->NvramDeviceId,\r
+ BLOCK_BASE_AND_SET_TO_BLOCKNR(bPtr->NvBlockBaseNumber, setNumber),\r
+ 0,\r
+ Nvm_WorkBuffer,\r
+ length );\r
+ if (rv != E_OK) {\r
+ if ( MemIf_GetStatus(FIXME) == MEMIF_IDLE ) {\r
+ AbortMemIfJob(MEMIF_JOB_FAILED);\r
+ fail = TRUE;\r
+ } else {\r
+ /* Do nothing. For MEMIF_UNINIT, MEMIF_BUSY and MEMIF_BUSY_INTERNAL we just stay in the\r
+ * same state. Better in the next run */\r
+ Irq_Restore(state);\r
+ break; /* Do NOT advance to next state */\r
+ }\r
+ }\r
+ Irq_Restore(state);\r
+\r
+ } else if (setNumber < bPtr->NvBlockNum + bPtr->RomBlockNum) {\r
+ // TODO: Read from ROM\r
+ } else {\r
+ // Error: setNumber out of range\r
+ DET_REPORTERROR(MODULE_ID_NVM, 0, NVM_LOC_READ_BLOCK_ID, NVM_PARAM_OUT_OF_RANGE);\r
+ fail = TRUE;\r
+ }\r
+\r
+ if( fail ) {\r
/* Fail the job */\r
admPtr->ErrorStatus = NVM_REQ_NOT_OK;\r
blockDone = 1;\r
/* Keep on waiting */\r
} else if( MEMIF_JOB_OK == jobResult ) {\r
/* We are done */\r
-\r
-#if 0\r
- if( BLOCK_STATE_MEMIF_CRC_PROCESS == admPtr->BlockState ) {\r
- /* @req 3.1.5/NVM362 NvM_ReadAll*/\r
- DEBUG_CHECKSUM("RAM CRC", (bPtr->BlockCRCType == NVM_CRC16) ? admPtr->RamCrc.crc16 : admPtr->RamCrc.crc32);\r
- admPtr->BlockState = BLOCK_STATE_CALC_CRC_READ;\r
- break;\r
- }\r
-#endif\r
-\r
if( write ) {\r
admPtr->BlockState = BLOCK_STATE_MEMIF_REQ;\r
admPtr->ErrorStatus = NVM_REQ_OK;\r
blockDone = 1;\r
-\r
-#if 0\r
- if( bPtr->BlockUseCrc ) {\r
- /* Explicit CRC calc (not dependent on NvmCalcRamBlockCrc) */\r
- /* @req 3.1.5/NVM212 NvM_WriteBlock */\r
- /* @req 3.1.5/NVM253 NvM_WriteAll */\r
- admPtr->BlockState = BLOCK_STATE_CALC_CRC_WRITE;\r
- } else {\r
- /* Done */\r
- admPtr->BlockState = BLOCK_STATE_MEMIF_REQ;\r
- admPtr->ErrorStatus = NVM_REQ_OK;\r
- blockDone = 1;\r
- }\r
-#endif\r
} else {\r
/* read */\r
uint8 crcLen = 0;\r
* Procedure: NvM_GetErrorStatus\r
* Reentrant: Yes\r
*/\r
-Std_ReturnType NvM_GetErrorStatus(NvM_BlockIdType blockId, uint8 *requestResultPtr)\r
+Std_ReturnType NvM_GetErrorStatus(NvM_BlockIdType blockId, NvM_RequestResultType *requestResultPtr)\r
{\r
VALIDATE_RV(nvmState != NVM_UNINITIALIZED, NVM_GET_ERROR_STATUS_ID, NVM_E_NOT_INITIALIZED, E_NOT_OK );\r
VALIDATE_RV(blockId < NVM_NUM_OF_NVRAM_BLOCKS+1, NVM_GET_ERROR_STATUS_ID, NVM_E_PARAM_BLOCK_ID, E_NOT_OK );\r