diff options
author | XVSALGE <xvsalge@ubuntu.(none)> | 2011-11-02 13:33:50 +0100 |
---|---|---|
committer | Viktor Mladenovski <viktor.mladenovski@seavus.com> | 2012-05-25 14:37:00 +0200 |
commit | c60e5c40802a7f14e9005eb9f462c6f741b1e839 (patch) | |
tree | a14c31bdd639e696a8844592b3b57a975d8a1f06 /source | |
parent | 637740b7d9a5b9788e50e926b6cb459489cffa0c (diff) |
LCD\LCM crash when flashing 7 USB devices
Back changes from R1U/R1S LCD/LCM
release.
Bug fixing for retransmission.
ST-Ericsson ID: 369904
ST-Ericsson FOSS-OUT ID: NA
Change-Id: I0498cbaecea78651418d11ea2643fcafa3ac4880
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/35975
Reviewed-by: QATOOLS
Tested-by: Vlatko PISTOLOV <vlatko.pistolov@seavus.com>
Reviewed-by: QABUILD
Tested-by: Vlatko STENKOSKI
Tested-by: Aleksandar GASOSKI <aleksandar.gasoski@seavus.com>
Reviewed-by: Vlatko PISTOLOV <vlatko.pistolov@seavus.com>
Diffstat (limited to 'source')
-rwxr-xr-x | source/LCDriver.rc | 6 | ||||
-rw-r--r-- | source/LCDriverMethods.cpp | 14 | ||||
-rw-r--r-- | source/LCDriverMethods.h | 9 | ||||
-rw-r--r-- | source/LCM/include/t_bulk_protocol.h | 91 |
4 files changed, 68 insertions, 52 deletions
diff --git a/source/LCDriver.rc b/source/LCDriver.rc index 6ddbfde..7fe379e 100755 --- a/source/LCDriver.rc +++ b/source/LCDriver.rc @@ -81,15 +81,15 @@ BEGIN BEGIN
BLOCK "000904b0"
BEGIN
- VALUE "Comments", "Build date: 2011-11-01"
+ VALUE "Comments", "Build date: 2011-10-19"
VALUE "CompanyName", "STEricsson AB"
VALUE "FileDescription", "LCDriver Dynamic Link Library"
VALUE "FileVersion", "1, 0, 0, 1"
VALUE "InternalName", "Loader Communication Driver"
VALUE "LegalCopyright", "Copyright (C) STEricsson AB 2011"
- VALUE "PrivateBuild", "Change-Id: Id4e7569ebe5f41806ceb9d57915acd434c27ef93"
+ VALUE "PrivateBuild", "Change-Id: I0498cbaecea78651418d11ea2643fcafa3ac4880"
VALUE "ProductName", "CXC 173 0865, LCDriver DLL"
- VALUE "ProductVersion", "PT7"
+ VALUE "ProductVersion", "PT8"
END
END
BLOCK "VarFileInfo"
diff --git a/source/LCDriverMethods.cpp b/source/LCDriverMethods.cpp index ca44754..a24e5b9 100644 --- a/source/LCDriverMethods.cpp +++ b/source/LCDriverMethods.cpp @@ -92,6 +92,7 @@ CLCDriverMethods::CLCDriverMethods(const char *pchInterfaceId): CLCDriverMethods::~CLCDriverMethods() { m_EventQueue.SignalEvent(); + CLockCS lock(LCDMethodsCS); OS::Sleep(200); if (0 != m_pMainThread) { @@ -330,16 +331,16 @@ ErrorCode_e CLCDriverMethods::CEH_A2_CallbackFunction(void *pObject, CommandData //---------------------------------------- -void CLCDriverMethods::BulkCommandReqCallback(void *pObject, uint16 *puiSession, uint32 *puiChunkSize, uint64 *puiOffset, uint32 *puiLength, boolean bAckRead) +void CLCDriverMethods::BulkCommandReqCallback(void *pObject, uint16 uiSession, uint32 uiChunkSize, uint64 uiOffset, uint32 uiLength, boolean bAckRead) { CLCDriverMethods *pLcdMethods = static_cast<CLCDriverMethods *>(pObject); - return pLcdMethods->m_pBulkHandler->HandleCommandRequest(*puiSession, *puiChunkSize, *puiOffset, *puiLength, bAckRead ? true : false); + return pLcdMethods->m_pBulkHandler->HandleCommandRequest(uiSession, uiChunkSize, uiOffset, uiLength, bAckRead ? true : false); } -void CLCDriverMethods::BulkDataReqCallback(void *pObject, uint16 *puiSession, uint32 *puiChunkSize, uint64 *puiOffset, uint32 *puiLength, uint64 *puiTotalLength, uint32 *puiTransferedLength) +void CLCDriverMethods::BulkDataReqCallback(void *pObject, uint16 uiSession, uint32 uiChunkSize, uint64 uiOffset, uint32 uiLength, uint64 uiTotalLength, uint32 uiTransferedLength) { CLCDriverMethods *pLcdMethods = static_cast<CLCDriverMethods *>(pObject); - return pLcdMethods->Do_BulkDataReqCallback(puiSession, puiChunkSize, puiOffset, puiLength, puiTotalLength, puiTransferedLength); + return pLcdMethods->Do_BulkDataReqCallback(uiSession, uiChunkSize, uiOffset, uiLength, uiTotalLength, uiTransferedLength); } void CLCDriverMethods::BulkDataEndOfDumpCallback(void *pObject) @@ -907,6 +908,7 @@ int CLCDriverMethods::Do_Flash_ProcessFile(const char *pchPath, const char *pchT #endif if (iUseBulk) { + CLockCS lock(LCDMethodsCS); m_pLcmInterface->BulkSetCallbacks((void *)BulkCommandReqCallback, (void *)BulkDataReqCallback, (void *)BulkDataEndOfDumpCallback); VERIFY_SUCCESS(m_pBuffers->AllocateBulkFile(pchPath)); uint64 uiLength = m_pBuffers->GetBulkFileLength(); @@ -2618,9 +2620,9 @@ int CLCDriverMethods::WaitForPROTROMResponseOrCancelOrTimeout(int iReceivePdu) return iResult; } -void CLCDriverMethods::Do_BulkDataReqCallback(uint16 *Session_p, uint32 *ChunkSize_p, uint64 *Offset_p, uint32 *Length_p, uint64 *TotalLength_p, uint32 *TransferredLength_p) +void CLCDriverMethods::Do_BulkDataReqCallback(uint16 Session, uint32 ChunkSize, uint64 Offset, uint32 Length, uint64 TotalLength, uint32 TransferredLength) { - m_uiBulkTransferred += *ChunkSize_p; + m_uiBulkTransferred += ChunkSize; } void CLCDriverMethods::UpdateBulkProgress() diff --git a/source/LCDriverMethods.h b/source/LCDriverMethods.h index fdc66f3..203b0e5 100644 --- a/source/LCDriverMethods.h +++ b/source/LCDriverMethods.h @@ -156,6 +156,7 @@ private: LoaderRpcInterfaceImpl *m_pLoaderRpcFunctions; A2LoaderRpcInterfaceImpl *m_pA2LoaderRpcFunctions; CLCDriverThread *m_pMainThread; + CCriticalSectionObject LCDMethodsCS; //------------------------------------------ // Static methods for support modules: timers, hash, buffers and queue @@ -205,11 +206,11 @@ public: //----------------------------------------- // Bulk Transfer Protocol callbacks //----------------------------------------- - static void BulkCommandReqCallback(void *pObject, uint16 *puiSession, uint32 *puiChunkSize, uint64 *puiOffset, uint32 *puiLength, boolean bAckRead); - void Do_BulkCommandReqCallback(uint16 *puiSession, uint32 *puiChunkSize, uint64 *puiOffset, uint32 *puiLength); + static void BulkCommandReqCallback(void *pObject, uint16 uiSession, uint32 uiChunkSize, uint64 uiOffset, uint32 uiLength, boolean bAckRead); + void Do_BulkCommandReqCallback(uint16 uiSession, uint32 uiChunkSize, uint64 uiOffset, uint32 uiLength); - static void BulkDataReqCallback(void *pObject, uint16 *puiSession, uint32 *puiChunkSize, uint64 *puiOffset, uint32 *puiLength, uint64 *puiTotalLength, uint32 *puiTransferedLength); - void Do_BulkDataReqCallback(uint16 *puiSession, uint32 *puiChunkSize, uint64 *puiOffset, uint32 *puiLength, uint64 *puiTotalLength, uint32 *puiTransferedLength); + static void BulkDataReqCallback(void *pObject, uint16 uiSession, uint32 uiChunkSize, uint64 uiOffset, uint32 uiLength, uint64 uiTotalLength, uint32 uiTransferedLength); + void Do_BulkDataReqCallback(uint16 uiSession, uint32 uiChunkSize, uint64 uiOffset, uint32 uiLength, uint64 uiTotalLength, uint32 uiTransferedLength); static void BulkDataEndOfDumpCallback(void *pObject); void Do_BulkDataEndOfDumpCallback(); diff --git a/source/LCM/include/t_bulk_protocol.h b/source/LCM/include/t_bulk_protocol.h index fabc1a4..99109e6 100644 --- a/source/LCM/include/t_bulk_protocol.h +++ b/source/LCM/include/t_bulk_protocol.h @@ -18,6 +18,7 @@ ******************************************************************************/ #include "t_basicdefinitions.h" #include "t_r15_network_layer.h" +#include "t_critical_section.h" /******************************************************************************* * Types, constants @@ -34,11 +35,12 @@ /** Defined bulk error in 64 bits format. */ #define BULK_ERROR_64 0xffffffffffffffff +#ifndef CFG_ENABLE_LOADER_TYPE /** Defined Callback functions used for bulk transfer in the LCM on PC side. */ -typedef void (*BulkCommandReqCallback_t)(void *Object_p, uint16 *Session_p, uint32 *ChunkSize_p, uint64 *Offset_p, uint32 *Length_p, boolean ACK_Read); -typedef void(*BulkDataReqCallback_t)(void *Object_p, uint16 *Session_p, uint32 *ChunkSize_p, uint64 *Offset_p, uint32 *Length_p, uint64 *TotalLength_p, uint32 *TransferedLength_p); -typedef void(*BulkDataEndOfDump_t)(void *Object_p); - +typedef void (*BulkCommandReqCallback_t)(void *Object_p, uint16 Session, uint32 ChunkSize, uint64 Offset, uint32 Length, boolean ACK_Read); +typedef void (*BulkDataReqCallback_t)(void *Object_p, uint16 Session, uint32 ChunkSize, uint64 Offset, uint32 Length, uint64 TotalLength, uint32 TransferedLength); +typedef void (*BulkDataEndOfDump_t)(void *Object_p); +#endif // CFG_ENABLE_LOADER_TYPE /** Defined bulk commands. */ typedef enum { @@ -57,19 +59,19 @@ typedef enum { /** States of bulk protocol. */ TYPEDEF_ENUM { - BULK_IDLE_STATE = 0, /**< Idle state. */ - SEND_READ_REQUEST = 1, /**< Send read request command to PC. */ - WAIT_CHUNKS = 2, /**< Wait to receive all expected chunks. */ - SEND_BULK_ACK = 3, /**< Send bulk acknowledge to PC. */ - WAIT_BULK_ACK_TIMEOUT = 4, /**< Wait timeout for confirmation of bulk - ack command. */ - SEND_WRITE_REQUEST = 5, /**< Send write request command. */ - WAIT_READ_REQUEST = 6, /**< Wait read request from PC. */ - SENDING_CHUNKS = 7, /**< Send chunks to PC. */ - WAIT_BULK_ACK = 8, /**< Wait bulk acknowledge to PC. */ - WRITE_BULK_FINISH = 9, /**< Bulk acknowledge has been received, - finish the write bulk process. */ - WAIT_WRITE_REQUEST = 10 /**< Wait bulk request command. */ + BULK_IDLE_STATE = 0, /**< Idle state. */ + SEND_READ_REQUEST = 1, /**< Send read request command to PC. */ + WAIT_CHUNKS = 2, /**< Wait to receive all expected chunks. */ + SEND_WRITE_REQUEST = 3, /**< Send write request command. */ + WAIT_READ_REQUEST = 4, /**< Wait read request from PC. */ + PROCESSING_CHUNKS = 5, /**< Calculate CRC and get chunks ready for sending. */ + WAIT_CHUNK_SENT = 6, /**< Wait for chunk to be sent. */ + SENDING_CHUNKS = 7, /**< Send chunks to PC. */ + WAIT_BULK_ACK = 8, /**< Wait bulk acknowledge to PC. */ + WAIT_TX_DONE = 9, /**< Wait all chunks to be sent. */ + WRITE_BULK_FINISH = 10, /**< Bulk acknowledge has been received, + finish the write bulk process. */ + WAIT_WRITE_REQUEST = 11 /**< Wait bulk request command. */ } ENUM8(TL_BulkProtocolState_t); /** Defined bulk process states. */ @@ -104,49 +106,60 @@ typedef enum { * Bulk Vector Entry parameters */ typedef struct { - PacketMeta_t *Buffer_p; /**< Pointer to reserved buffer meta info. */ - uint8 *Payload_p; /**< Pointer to payload data in reserved - buffer. */ - uint8 *Hash_p; /**< Pointer to calculated payload hash. */ + PacketMeta_t *Buffer_p; /**< Pointer to reserved buffer meta info. */ + uint8 *Payload_p; /**< Pointer to payload data in reserved + buffer. */ + uint8 *Hash_p; /**< Pointer to calculated payload hash. */ + boolean RetransmissionRequested; /**< Determines if retransmission for the packet + was requested earlier to avoid sending requests + for the same packet multiple times. */ } TL_BulkVectorEntry_t; /** * This type defines Bulk Vector parameters */ typedef struct { - /**< Bulk session status. */ + /** Bulk session status. */ TL_BulkSessionState_t Status; - /**< Requested bulk process(Read or Write). */ + /** Requested bulk process(Read or Write). */ TL_SessionMode_t Mode; - /**< State of bulk protocol state machine. */ + /** State of bulk protocol state machine. */ TL_BulkProtocolState_t State; - /**< Current bulk session ID. */ + /** Current bulk session ID. */ uint16 SessionId; - /**< Length of the file transfered with bulk transfer. */ + /** Length of the file transfered with bulk transfer. */ uint64 TotalLength; - /**< Length of payload data transfered with bulk transfer. */ + /** Length of payload data transfered with bulk transfer. */ uint32 Length; - /**< Number of used buffers for bulk transfer. */ + /** Number of used buffers for bulk transfer. */ uint32 Buffers; - /**< requested size of payload. */ + /** requested size of payload. */ uint32 ChunkSize; - /**< Offset in the cuurent opened file.*/ + /** Offset in the current opened file.*/ uint64 Offset; - /**< Length of payload data transfered with bulk transfer. */ + /** Length of payload data transfered with bulk transfer. */ uint32 TransferedLength; - /**< Callback function pointer for bulk command handling.*/ - void *BulkCommandCallback_p; - /**< Callback function pointer for bulk data command handling.*/ - void *BulkDataCallback_p; - /**< Array with information for used buffers. */ + /** ID of the chunk that currently being sent. */ + uint32 SendingChunkId; + /** Callback function pointer for bulk command handling.*/ + void *BulkCommandCallback_p; + /** Callback function pointer for bulk data command handling.*/ + void *BulkDataCallback_p; + /** Array with information for used buffers. */ TL_BulkVectorEntry_t Entries[MAX_BULK_TL_PROCESSES]; } TL_BulkVectorList_t; /** Structure for current bulk transfer handling. */ typedef struct { - uint32 TimerKey; /**< Timer Id for current used timer. */ - TL_BulkVectorList_t *BulkVector_p; /**< Current used bulk vector for bulk - transfer.*/ + uint32 TimerKey; /**< Timer Id for current used timer. */ + TL_BulkVectorList_t *BulkVector_p; /**< Current used bulk vector for bulk + transfer.*/ + CriticalSection_t BulkTransferCS; /**< Synchronization object used to avoid + parallel access in bulk transmitter + function. */ + BulkExtendedHeader_t *PendingBulkHeader_p; /**< Pending Read Request data. Needed for + opening new session, received while + current session is in process of sending. */ } BulkHandle_t; /** @} */ |