summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorXVSALGE <xvsalge@ubuntu.(none)>2011-11-02 13:33:50 +0100
committerViktor Mladenovski <viktor.mladenovski@seavus.com>2012-05-25 14:37:00 +0200
commitc60e5c40802a7f14e9005eb9f462c6f741b1e839 (patch)
treea14c31bdd639e696a8844592b3b57a975d8a1f06 /source
parent637740b7d9a5b9788e50e926b6cb459489cffa0c (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-xsource/LCDriver.rc6
-rw-r--r--source/LCDriverMethods.cpp14
-rw-r--r--source/LCDriverMethods.h9
-rw-r--r--source/LCM/include/t_bulk_protocol.h91
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;
/** @} */