From 9863774e0882ead76e48dc657d3d7820b94980d9 Mon Sep 17 00:00:00 2001 From: save Date: Thu, 6 May 2010 15:31:45 +0000 Subject: cleo/u-boot/spidupd: add a VS_UPDATE_END.IND message management, closes #1463 git-svn-id: svn+ssh://pessac/svn/cesar/trunk@6997 017c9cb6-072f-447c-8318-d5b54f68fe89 --- cleopatre/u-boot-1.1.6/net/spidupd.c | 35 +++++++++++++++++++++++++++++++++++ cleopatre/u-boot-1.1.6/net/spidupd.h | 2 +- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/cleopatre/u-boot-1.1.6/net/spidupd.c b/cleopatre/u-boot-1.1.6/net/spidupd.c index 16d77f89d5..ac616b70c2 100644 --- a/cleopatre/u-boot-1.1.6/net/spidupd.c +++ b/cleopatre/u-boot-1.1.6/net/spidupd.c @@ -71,9 +71,11 @@ #define STATE_UPD_START 1 #define STATE_UPD_TRANSFER 2 #define STATE_UPD_END 3 +#define STATE_UPD_IND 4 #define UPD_START STATE_UPD_START #define UPD_TRANSFER STATE_UPD_TRANSFER #define UPD_END STATE_UPD_END +#define UPD_IND STATE_UPD_IND /** Informations about place to update image */ struct update_place { @@ -106,6 +108,7 @@ struct update_process { VsUpdStartCnf_t start_cnf; VsUpdTransfCnf_t transfer_cnf; VsUpdEndCnf_t end_cnf; + VsUpdEndInd_t end_ind; }; /** Global processus structure */ @@ -582,6 +585,7 @@ static void SpidupdSend(int rsp_type) VsUpdStartCnf_t *vs_update_start_cnf; VsUpdTransfCnf_t *vs_update_transfer_cnf; VsUpdEndCnf_t *vs_update_end_cnf; + VsUpdEndCnf_t *vs_update_end_ind; /* Set structures pointers */ pkt = NetTxPacket; @@ -589,6 +593,7 @@ static void SpidupdSend(int rsp_type) vs_update_start_cnf = (VsUpdStartCnf_t *)(mme+1); vs_update_transfer_cnf = (VsUpdTransfCnf_t *)(mme+1); vs_update_end_cnf = (VsUpdEndCnf_t *)(mme+1); + vs_update_end_ind = (VsUpdEndInd_t *)(mme+1); /* Set the MME version, FMI and OUI */ mme->mmv = MME_MMV; @@ -639,6 +644,17 @@ static void SpidupdSend(int rsp_type) transfer_end = 1; break; + case UPD_IND: + /* Set mmtype to VS_UPDATE_END_IND */ + mme->mmtype = htommes(VS_UPDATE_END_IND); + + /* Append the message */ + vs_update_end_ind->result = ctx.end_ind.result; + + /* This is the end of packet, determine length */ + len = ((ulong)vs_update_end_ind - (ulong)pkt) + sizeof(VsUpdEndInd_t); + break; + default : /* WOW - How the hell did we get here ? */ printf("Error (Unknown State).\n"); @@ -735,6 +751,9 @@ static void SpidupdHandler(uchar *pkt, unsigned dest, unsigned src, unsigned len ctx.modem_busy = 0; ctx.start_cnf.start_update = SPIDUPD_BAD_ARCH; ctx.state = STATE_UPD_START; + + /* Abort the update */ + NetState = NETLOOP_FAIL; break; } if(place->correct_type != vs_update_start_req->upd_type) @@ -744,6 +763,9 @@ static void SpidupdHandler(uchar *pkt, unsigned dest, unsigned src, unsigned len ctx.modem_busy = 0; ctx.start_cnf.start_update = SPIDUPD_BAD_UPD_TYPE; ctx.state = STATE_UPD_START; + + /* Abort the update */ + NetState = NETLOOP_FAIL; break; } @@ -753,6 +775,9 @@ static void SpidupdHandler(uchar *pkt, unsigned dest, unsigned src, unsigned len ctx.modem_busy = 0; ctx.start_cnf.start_update = SPIDUPD_BAD_VERSION; ctx.state = STATE_UPD_START; + + /* Abort the update */ + NetState = NETLOOP_FAIL; break; } @@ -770,6 +795,9 @@ static void SpidupdHandler(uchar *pkt, unsigned dest, unsigned src, unsigned len ctx.modem_busy = 0; ctx.start_cnf.start_update = SPIDUPD_BAD_VERSION; ctx.state = STATE_UPD_START; + + /* update is finished */ + NetState = NETLOOP_SUCCESS; break; } } @@ -928,6 +956,13 @@ static void SpidupdTimeout(void) printf("Timeout.\n"); /* TIMEOUT occurred. */ + /* Send to client an error message */ + if(ctx.state != STATE_UPD_START) + { + ctx.end_ind.result = SPIDUPD_TOUT; + SpidupdSend(UPD_IND); + } + /* Stop eth driver */ eth_halt(); /* Go out of NETLOOP and notify the caller about failure */ diff --git a/cleopatre/u-boot-1.1.6/net/spidupd.h b/cleopatre/u-boot-1.1.6/net/spidupd.h index 433ce94f98..b97b0015e9 100644 --- a/cleopatre/u-boot-1.1.6/net/spidupd.h +++ b/cleopatre/u-boot-1.1.6/net/spidupd.h @@ -116,7 +116,7 @@ typedef struct #define SPIDUPD_FLASH_WRITE_ERROR 0x02 /* end_ind */ -#define SPIDUPD_FLASH_WRITE_TOUT 0x03 +#define SPIDUPD_TOUT 0x03 -- cgit v1.2.3