]> rtime.felk.cvut.cz Git - arc.git/blobdiff - memory/NvM/NvM.c
Nvm: Clarified DET macro use. Removed WriteBlock()
[arc.git] / memory / NvM / NvM.c
index c6482fed6bb4679687b574eb96d2fa65656c1d81..201bc28f75dfecdd085bfecb7cda953514f29184 100644 (file)
  */\r
 \r
 //lint -esym(522,CalcCrc) // 522 PC-Lint exception for empty functions\r
-//lint -emacro(904,VALIDATE_RV,VALIDATE_NO_RV) //904 PC-Lint exception to MISRA 14.7 (validate macros).\r
+//lint -emacro(904,DET_VALIDATE_RV,DET_VALIDATE_NO_RV) //904 PC-Lint exception to MISRA 14.7 (validate macros).\r
 \r
 // Exception made as a result of that NVM_DATASET_SELECTION_BITS can be zero\r
 //lint -emacro(835, BLOCK_BASE_AND_SET_TO_BLOCKNR) // 835 PC-lint: A zero has been given as right argument to operator '<<' or '>>'\r
 \r
 #if  ( NVM_DEV_ERROR_DETECT == STD_ON )\r
 #include "Det.h"\r
-#define VALIDATE(_exp,_api,_err ) \\r
+#define DET_VALIDATE(_exp,_api,_err ) \\r
         if( !(_exp) ) { \\r
           Det_ReportError(MODULE_ID_NVM, 0, _api, _err); \\r
         }\r
 \r
 \r
-#define VALIDATE_RV(_exp,_api,_err,_rv ) \\r
+#define DET_VALIDATE_RV(_exp,_api,_err,_rv ) \\r
         if( !(_exp) ) { \\r
           Det_ReportError(MODULE_ID_NVM, 0, _api, _err); \\r
           return _rv; \\r
         }\r
 \r
-#define VALIDATE_NO_RV(_exp,_api,_err ) \\r
+#define DET_VALIDATE_NO_RV(_exp,_api,_err ) \\r
         if( !(_exp) ) { \\r
           Det_ReportError(MODULE_ID_NVM, 0, _api, _err); \\r
           return; \\r
 #define DET_REPORTERROR(_module,_instance,_api,_err) Det_ReportError(_module,_instance,_api,_err)\r
 \r
 #else\r
-#define VALIDATE(_exp,_api,_err )\r
-#define VALIDATE_RV(_exp,_api,_err,_rv )\r
-#define VALIDATE_NO_RV(_exp,_api,_err )\r
+#define DET_VALIDATE(_exp,_api,_err )\r
+#define DET_VALIDATE_RV(_exp,_api,_err,_rv )\r
+#define DET_VALIDATE_NO_RV(_exp,_api,_err )\r
 #define DET_REPORTERROR(_module,_instance,_api,_err)\r
 #endif\r
 \r
@@ -479,10 +479,6 @@ CirqBufferType nvmQueue;
 \r
 /* ----------------------------[private functions]---------------------------*/\r
 \r
-static void WriteBlock(        const NvM_BlockDescriptorType *blockDescriptor,\r
-                                               AdministrativeBlockType *adminBlock,\r
-                                               uint8 setNumber,\r
-                                               uint8 *sourceAddress);\r
 \r
 static void setRamBlockStatus( const NvM_BlockDescriptorType   *bPtr,\r
                                                                AdministrativeBlockType *admPtr,\r
@@ -621,10 +617,10 @@ static boolean ReadAllInit(void)
 #endif\r
                                ) {\r
                        NVM_ASSERT(BlockDescriptorList->RamBlockDataAddress != NULL);\r
-                       VALIDATE_RV(BlockDescriptorList->RamBlockDataAddress != NULL, NVM_READ_ALL_ID, NVM_E_WRONG_CONFIG, FALSE );\r
+                       DET_VALIDATE_RV(BlockDescriptorList->RamBlockDataAddress != NULL, NVM_READ_ALL_ID, NVM_E_WRONG_CONFIG, FALSE );\r
                        /* 3.1.5/NVM245 */\r
                        NVM_ASSERT(BlockDescriptorList->BlockManagementType != NVM_BLOCK_DATASET);\r
-                       VALIDATE_RV(BlockDescriptorList->BlockManagementType != NVM_BLOCK_DATASET, NVM_READ_ALL_ID, NVM_E_WRONG_CONFIG, FALSE );\r
+                       DET_VALIDATE_RV(BlockDescriptorList->BlockManagementType != NVM_BLOCK_DATASET, NVM_READ_ALL_ID, NVM_E_WRONG_CONFIG, FALSE );\r
 \r
                        AdminBlockTable->ErrorStatus = NVM_REQ_PENDING;\r
                        AdminBlockTable->BlockState = BLOCK_STATE_MEMIF_REQ;\r
@@ -705,6 +701,8 @@ static void DriveBlock( const NvM_BlockDescriptorType       *bPtr,
        switch (admPtr->BlockState) {\r
        case BLOCK_STATE_MEMIF_REQ:\r
        {\r
+               boolean fail = FALSE;\r
+               Std_ReturnType rv;\r
                void *ramData = (dataPtr != NULL) ?  dataPtr : bPtr->RamBlockDataAddress;\r
 \r
                admPtr->savedDataPtr = ramData;\r
@@ -717,7 +715,45 @@ static void DriveBlock( const NvM_BlockDescriptorType      *bPtr,
                        memcpy( Nvm_WorkBuffer, ramData, bPtr->NvBlockLength );\r
                        /* Add the CRC to write */\r
                        writeCrcToBuffer(Nvm_WorkBuffer, bPtr, admPtr );\r
-                       WriteBlock(bPtr, admPtr, admPtr->DataIndex, Nvm_WorkBuffer);\r
+\r
+                       /*\r
+                        * Write the block\r
+                        */\r
+                       if (admPtr->DataIndex < bPtr->NvBlockNum) {\r
+                               imask_t state;\r
+                               SetMemifJobBusy();\r
+                               MemIfJobAdmin.BlockAdmin = admPtr;\r
+                               MemIfJobAdmin.BlockDescriptor = bPtr;\r
+\r
+                               Irq_Save(state);\r
+\r
+                               rv = MemIf_Write(bPtr->NvramDeviceId, BLOCK_BASE_AND_SET_TO_BLOCKNR(bPtr->NvBlockBaseNumber, admPtr->DataIndex), Nvm_WorkBuffer);\r
+\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
+                       } else {\r
+                               // Error: setNumber out of range\r
+                               DET_REPORTERROR(MODULE_ID_NVM, 0, NVM_LOC_WRITE_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
+                               break; /* Do NOT advance to next state */\r
+                       }\r
+\r
                } else {\r
                        uint8 crcLen = 0;\r
                        /* Read to workbuffer */\r
@@ -736,8 +772,6 @@ static void DriveBlock( const NvM_BlockDescriptorType       *bPtr,
                        } 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
@@ -968,7 +1002,7 @@ static void DriveBlock( const NvM_BlockDescriptorType      *bPtr,
                        ramData = bPtr->RamBlockDataAddress;\r
                }\r
 \r
-               admPtr->savedDataPtr = ramData;\r
+//             admPtr->savedDataPtr = ramData;\r
 \r
                /* Calculate RAM CRC checksum */\r
                if( bPtr->BlockCRCType == NVM_CRC16 ) {\r
@@ -1172,31 +1206,6 @@ static void ReadAllMain(void)
        }\r
 }\r
 \r
-/*\r
- * Request writing of a block to MemIf
- */\r
-static void WriteBlock(        const NvM_BlockDescriptorType *blockDescriptor,\r
-                                               AdministrativeBlockType *adminBlock,\r
-                                               uint8 setNumber,\r
-                                               uint8 *sourceAddress)\r
-{\r
-       Std_ReturnType returnCode;\r
-\r
-       if (setNumber < blockDescriptor->NvBlockNum) {\r
-               SetMemifJobBusy();\r
-               MemIfJobAdmin.BlockAdmin = adminBlock;\r
-               MemIfJobAdmin.BlockDescriptor = blockDescriptor;\r
-               returnCode = MemIf_Write(blockDescriptor->NvramDeviceId, BLOCK_BASE_AND_SET_TO_BLOCKNR(blockDescriptor->NvBlockBaseNumber, setNumber), sourceAddress);\r
-               if (returnCode != E_OK) {\r
-                       AbortMemIfJob(MEMIF_JOB_FAILED);\r
-               }\r
-       } else {\r
-               // Error: setNumber out of range\r
-               DET_REPORTERROR(MODULE_ID_NVM, 0, NVM_LOC_WRITE_BLOCK_ID, NVM_PARAM_OUT_OF_RANGE);\r
-       }\r
-}\r
-\r
-\r
 \r
 /*\r
  * Initiate the write all job\r
@@ -1352,7 +1361,7 @@ void NvM_Init(void)
 void NvM_ReadAll(void)\r
 {\r
     imask_t state;\r
-       VALIDATE_NO_RV(nvmState != NVM_UNINITIALIZED, NVM_READ_ALL_ID, NVM_E_NOT_INITIALIZED);\r
+       DET_VALIDATE_NO_RV(nvmState != NVM_UNINITIALIZED, NVM_READ_ALL_ID, NVM_E_NOT_INITIALIZED);\r
 \r
        NVM_ASSERT(nvmState == NVM_IDLE);\r
 \r
@@ -1372,7 +1381,7 @@ void NvM_ReadAll(void)
 void NvM_WriteAll(void)\r
 {\r
     imask_t state;\r
-       VALIDATE_NO_RV(nvmState != NVM_UNINITIALIZED, NVM_READ_ALL_ID, NVM_E_NOT_INITIALIZED);\r
+       DET_VALIDATE_NO_RV(nvmState != NVM_UNINITIALIZED, NVM_READ_ALL_ID, NVM_E_NOT_INITIALIZED);\r
 \r
        NVM_ASSERT(nvmState == NVM_IDLE);\r
 \r
@@ -1400,8 +1409,8 @@ void NvM_CancelWriteAll(void)
  */\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
+       DET_VALIDATE_RV(nvmState != NVM_UNINITIALIZED, NVM_GET_ERROR_STATUS_ID, NVM_E_NOT_INITIALIZED, E_NOT_OK );\r
+       DET_VALIDATE_RV(blockId < NVM_NUM_OF_NVRAM_BLOCKS+1, NVM_GET_ERROR_STATUS_ID, NVM_E_PARAM_BLOCK_ID, E_NOT_OK );\r
 \r
        if (blockId == 0) {\r
                // Multiblock ID\r
@@ -1427,13 +1436,13 @@ Std_ReturnType NvM_SetRamBlockStatus(NvM_BlockIdType blockId, boolean blockChang
        Nvm_QueueType qEntry;\r
        int rv;\r
 \r
-       VALIDATE_RV(blockId < NVM_NUM_OF_NVRAM_BLOCKS+1, NVM_SET_RAM_BLOCK_STATUS_ID, NVM_E_PARAM_BLOCK_ID, E_NOT_OK);\r
+       DET_VALIDATE_RV(blockId < NVM_NUM_OF_NVRAM_BLOCKS+1, NVM_SET_RAM_BLOCK_STATUS_ID, NVM_E_PARAM_BLOCK_ID, E_NOT_OK);\r
 \r
        admPtr = &AdminBlock[blockId-1];\r
 \r
-       VALIDATE_RV(nvmState != NVM_UNINITIALIZED, NVM_SET_RAM_BLOCK_STATUS_ID, NVM_E_NOT_INITIALIZED, E_NOT_OK);       /** @req NVM497 */\r
-       VALIDATE_RV(blockId > 1, NVM_SET_RAM_BLOCK_STATUS_ID, NVM_E_PARAM_BLOCK_ID, E_NOT_OK );\r
-       VALIDATE_RV( (admPtr->ErrorStatus != NVM_REQ_PENDING), 0, NVM_E_BLOCK_PENDING , E_NOT_OK );\r
+       DET_VALIDATE_RV(nvmState != NVM_UNINITIALIZED, NVM_SET_RAM_BLOCK_STATUS_ID, NVM_E_NOT_INITIALIZED, E_NOT_OK);   /** @req NVM497 */\r
+       DET_VALIDATE_RV(blockId > 1, NVM_SET_RAM_BLOCK_STATUS_ID, NVM_E_PARAM_BLOCK_ID, E_NOT_OK );\r
+       DET_VALIDATE_RV( (admPtr->ErrorStatus != NVM_REQ_PENDING), 0, NVM_E_BLOCK_PENDING , E_NOT_OK );\r
 \r
        qEntry.blockId = blockId;\r
        qEntry.op = NVM_SETRAMBLOCKSTATUS;\r
@@ -1492,7 +1501,7 @@ Std_ReturnType NvM_RestoreBlockDefaults( NvM_BlockIdType blockId, uint8* NvM_Des
        NVM_ASSERT( blockId >= 2 );     /* No support for lower numbers, yet */\r
 \r
        /* @req 3.1.5/NVM618 */\r
-       VALIDATE_RV(    blockId <= NVM_NUM_OF_NVRAM_BLOCKS,\r
+       DET_VALIDATE_RV(        blockId <= NVM_NUM_OF_NVRAM_BLOCKS,\r
                                        NVM_WRITE_BLOCK_ID,NVM_E_PARAM_BLOCK_ID,E_NOT_OK );\r
 \r
        bPtr = &NvM_Config.BlockDescriptor[blockId-1];\r
@@ -1500,10 +1509,10 @@ Std_ReturnType NvM_RestoreBlockDefaults( NvM_BlockIdType blockId, uint8* NvM_Des
 \r
        /** @req 3.1.5/NVM196 */ /** @req 3.1.5/NVM278 */ /** @req 3.1.5/NVM210 */\r
        /* It must be a permanent RAM block but no RamBlockDataAddress -> error */\r
-       VALIDATE_RV( !((NvM_DestPtr == NULL) &&  ( bPtr->RamBlockDataAddress == NULL )),\r
+       DET_VALIDATE_RV( !((NvM_DestPtr == NULL) &&  ( bPtr->RamBlockDataAddress == NULL )),\r
                                                NVM_WRITE_BLOCK_ID,NVM_E_PARAM_BLOCK_ID,E_NOT_OK );\r
 \r
-       VALIDATE_RV( (admPtr->ErrorStatus != NVM_REQ_PENDING), 0, NVM_E_BLOCK_PENDING , E_NOT_OK );\r
+       DET_VALIDATE_RV( (admPtr->ErrorStatus != NVM_REQ_PENDING), 0, NVM_E_BLOCK_PENDING , E_NOT_OK );\r
 \r
        /* @req 3.1.5/NVM195 */\r
        qEntry.blockId = blockId;\r
@@ -1590,10 +1599,10 @@ Std_ReturnType NvM_ReadBlock( NvM_BlockIdType blockId, uint8* NvM_DstPtr )
        int rv;\r
 \r
        /** @req 3.1.5/NVM196 */ /** @req 3.1.5/NVM278 */\r
-    VALIDATE_RV( !(( NvM_DstPtr == NULL) &&\r
+    DET_VALIDATE_RV( !(( NvM_DstPtr == NULL) &&\r
                        ( NvM_Config.BlockDescriptor[blockId-1].RamBlockDataAddress == NULL )),\r
                        0, NVM_E_PARAM_ADDRESS  , E_NOT_OK );\r
-       VALIDATE_RV( (AdminBlock[blockId-1].ErrorStatus != NVM_REQ_PENDING), 0, NVM_E_BLOCK_PENDING , E_NOT_OK );\r
+       DET_VALIDATE_RV( (AdminBlock[blockId-1].ErrorStatus != NVM_REQ_PENDING), 0, NVM_E_BLOCK_PENDING , E_NOT_OK );\r
 \r
        /* @req 3.1.5/NVM195 */\r
        qEntry.blockId = blockId;\r
@@ -1629,16 +1638,16 @@ Std_ReturnType NvM_WriteBlock( NvM_BlockIdType blockId, const uint8* NvM_SrcPtr
        NVM_ASSERT( blockId >= 2 );     /* No support for lower numbers, yet */\r
 \r
        /* @req 3.1.5/NVM618 */\r
-       VALIDATE_RV(    blockId <= NVM_NUM_OF_NVRAM_BLOCKS,\r
+       DET_VALIDATE_RV(        blockId <= NVM_NUM_OF_NVRAM_BLOCKS,\r
                                        NVM_WRITE_BLOCK_ID,NVM_E_PARAM_BLOCK_ID,E_NOT_OK );\r
 \r
        bPtr = &NvM_Config.BlockDescriptor[blockId-1];\r
        admPtr = &AdminBlock[blockId-1];\r
 \r
        /** @req 3.1.5/NVM196 */ /** @req 3.1.5/NVM278 */\r
-       VALIDATE_RV( !((NvM_SrcPtr == NULL) && ( bPtr->RamBlockDataAddress == NULL )),\r
+       DET_VALIDATE_RV( !((NvM_SrcPtr == NULL) && ( bPtr->RamBlockDataAddress == NULL )),\r
                                0, NVM_E_PARAM_ADDRESS, E_NOT_OK );\r
-       VALIDATE_RV( (admPtr->ErrorStatus != NVM_REQ_PENDING), 0, NVM_E_BLOCK_PENDING , E_NOT_OK );\r
+       DET_VALIDATE_RV( (admPtr->ErrorStatus != NVM_REQ_PENDING), 0, NVM_E_BLOCK_PENDING , E_NOT_OK );\r
 \r
        /* @req 3.1.5/NVM195 */\r
        qEntry.blockId = blockId;\r
@@ -1692,11 +1701,11 @@ Std_ReturnType NvM_SetDataIndex( NvM_BlockIdType blockId, uint8 dataIndex ) {
 \r
        NVM_ASSERT( blockId >= 2 );     /* No support for lower numbers, yet */\r
 \r
-       VALIDATE_RV(nvmState != NVM_UNINITIALIZED, NVM_SET_DATA_INDEX_ID, NVM_E_NOT_INITIALIZED, E_NOT_OK);\r
-       VALIDATE_RV(blockId < NVM_NUM_OF_NVRAM_BLOCKS+1, NVM_SET_DATA_INDEX_ID, NVM_E_PARAM_BLOCK_ID, E_NOT_OK);\r
-       VALIDATE_RV(bPtr->BlockManagementType != NVM_BLOCK_NATIVE ,  NVM_SET_DATA_INDEX_ID, NVM_E_PARAM_BLOCK_TYPE , E_NOT_OK);\r
-       VALIDATE_RV(dataIndex < bPtr->NvBlockNum + bPtr->RomBlockNum , NVM_SET_DATA_INDEX_ID, NVM_E_PARAM_BLOCK_DATA_IDX ,E_NOT_OK);\r
-       VALIDATE_RV( (admPtr->ErrorStatus != NVM_REQ_PENDING), NVM_SET_DATA_INDEX_ID, NVM_E_BLOCK_PENDING , E_NOT_OK);\r
+       DET_VALIDATE_RV(nvmState != NVM_UNINITIALIZED, NVM_SET_DATA_INDEX_ID, NVM_E_NOT_INITIALIZED, E_NOT_OK);\r
+       DET_VALIDATE_RV(blockId < NVM_NUM_OF_NVRAM_BLOCKS+1, NVM_SET_DATA_INDEX_ID, NVM_E_PARAM_BLOCK_ID, E_NOT_OK);\r
+       DET_VALIDATE_RV(bPtr->BlockManagementType != NVM_BLOCK_NATIVE ,  NVM_SET_DATA_INDEX_ID, NVM_E_PARAM_BLOCK_TYPE , E_NOT_OK);\r
+       DET_VALIDATE_RV(dataIndex < bPtr->NvBlockNum + bPtr->RomBlockNum , NVM_SET_DATA_INDEX_ID, NVM_E_PARAM_BLOCK_DATA_IDX ,E_NOT_OK);\r
+       DET_VALIDATE_RV( (admPtr->ErrorStatus != NVM_REQ_PENDING), NVM_SET_DATA_INDEX_ID, NVM_E_BLOCK_PENDING , E_NOT_OK);\r
 \r
        qEntry.blockId = blockId;\r
        qEntry.op = NVM_SETDATAINDEX;\r
@@ -1722,11 +1731,11 @@ Std_ReturnType NvM_GetDataIndex( NvM_BlockIdType blockId, uint8 *dataIndexPtr )
 \r
        NVM_ASSERT( blockId >= 2 );     /* No support for lower numbers, yet */\r
 \r
-       VALIDATE_RV(nvmState != NVM_UNINITIALIZED, NVM_GET_DATA_INDEX_ID, NVM_E_NOT_INITIALIZED, E_NOT_OK);\r
-       VALIDATE_RV(blockId < NVM_NUM_OF_NVRAM_BLOCKS+1, NVM_GET_DATA_INDEX_ID, NVM_E_PARAM_BLOCK_ID, E_NOT_OK);\r
-       VALIDATE_RV(bPtr->BlockManagementType != NVM_BLOCK_NATIVE ,  NVM_GET_DATA_INDEX_ID, NVM_E_PARAM_BLOCK_TYPE , E_NOT_OK);\r
-       VALIDATE_RV( (dataIndexPtr != NULL) , NVM_GET_DATA_INDEX_ID, NVM_E_PARAM_DATA  ,E_NOT_OK);\r
-       VALIDATE_RV( (admPtr->ErrorStatus != NVM_REQ_PENDING), NVM_GET_DATA_INDEX_ID, NVM_E_BLOCK_PENDING , E_NOT_OK);\r
+       DET_VALIDATE_RV(nvmState != NVM_UNINITIALIZED, NVM_GET_DATA_INDEX_ID, NVM_E_NOT_INITIALIZED, E_NOT_OK);\r
+       DET_VALIDATE_RV(blockId < NVM_NUM_OF_NVRAM_BLOCKS+1, NVM_GET_DATA_INDEX_ID, NVM_E_PARAM_BLOCK_ID, E_NOT_OK);\r
+       DET_VALIDATE_RV(bPtr->BlockManagementType != NVM_BLOCK_NATIVE ,  NVM_GET_DATA_INDEX_ID, NVM_E_PARAM_BLOCK_TYPE , E_NOT_OK);\r
+       DET_VALIDATE_RV( (dataIndexPtr != NULL) , NVM_GET_DATA_INDEX_ID, NVM_E_PARAM_DATA  ,E_NOT_OK);\r
+       DET_VALIDATE_RV( (admPtr->ErrorStatus != NVM_REQ_PENDING), NVM_GET_DATA_INDEX_ID, NVM_E_BLOCK_PENDING , E_NOT_OK);\r
 \r
        qEntry.blockId = blockId;\r
        qEntry.op = NVM_GETDATAINDEX;\r