]> rtime.felk.cvut.cz Git - arc.git/commitdiff
NvM: Now handles when Fee/EA is busy
authormahi <devnull@localhost>
Fri, 3 Aug 2012 20:21:25 +0000 (22:21 +0200)
committermahi <devnull@localhost>
Fri, 3 Aug 2012 20:21:25 +0000 (22:21 +0200)
memory/NvM/NvM.c

index dde059f81b2aa3a32c9fb260dc5b605a0ff0d352..c6482fed6bb4679687b574eb96d2fa65656c1d81 100644 (file)
@@ -595,38 +595,6 @@ static boolean CheckJobFailed( void ) {
 }\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
@@ -766,8 +734,56 @@ static void DriveBlock( const NvM_BlockDescriptorType      *bPtr,
                                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
@@ -789,34 +805,10 @@ static void DriveBlock( const NvM_BlockDescriptorType     *bPtr,
                        /* 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
@@ -1406,7 +1398,7 @@ void NvM_CancelWriteAll(void)
  * 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